@agimon-ai/po-workflow 0.0.0-alpha.78 → 0.0.0-alpha.79
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/extensions/native.mjs +1 -1
- package/dist/extensions/native.mjs.map +1 -1
- package/dist/extensions/server.cjs +62 -12
- package/dist/extensions/server.cjs.map +1 -1
- package/dist/extensions/server.mjs +62 -12
- package/dist/extensions/server.mjs.map +1 -1
- package/dist/extensions/web.mjs +262 -355
- package/dist/extensions/web.mjs.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/{workflowLaunchCommand-7WRoiOKJ.mjs → workflowLaunchCommand-CRLvhQre.mjs} +5 -1
- package/dist/workflowLaunchCommand-CRLvhQre.mjs.map +1 -0
- package/dist/{workflowLaunchCommand-C7anFsDH.cjs → workflowLaunchCommand-Yf3Zq0VR.cjs} +5 -1
- package/dist/workflowLaunchCommand-Yf3Zq0VR.cjs.map +1 -0
- package/package.json +8 -8
- package/dist/workflowLaunchCommand-7WRoiOKJ.mjs.map +0 -1
- package/dist/workflowLaunchCommand-C7anFsDH.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native.mjs","names":["isRecord","isRecord","LiveDuration","useCallback","StyleProp","TextStyle","formatRunDuration","workflowDuration","WorkflowDuration","startedAt","endedAt","now","seconds","running","style","start","Date","parse","end","clock","clockNow","at","undefined","Number","isFinite","text","Math","max","live","nextMs","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","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","styles","WebPluginSlotProps","ChevronDownIcon","ChevronRightIcon","fontOf","PoNativeTheme","useCallback","useState","useSyncExternalStore","StyleSheet","dynamicWorkflows","stepRunsSummary","DynamicWorkflowView","useStepRuns","stepSessionId","subscribe","listener","subscription","store","unsubscribe","select","state","runs","StepDynamicRunsNote","undefined","length","summary","styles","text","failed","StepDynamicRuns","openSession","Pick","open","setOpen","section","expanded","toggle","title","create","theme","flex","flexShrink","borderTopWidth","borderTopColor","colors","border","uni__dependencies","flexDirection","alignItems","gap","spacing","paddingHorizontal","paddingVertical","fontFamily","sans","fontSize","base","lineHeight","fontWeight","semibold","color","hi","sm","dim","red","styles","Button","ChevronDownIcon","ChevronRightIcon","Dot","EmptyState","FileIcon","FolderIcon","Input","ListRow","SheetList","StatusBadge","fontOf","PoNativeTheme","ReactNode","useState","StyleSheet","WorkflowJobView","WorkflowRunView","WorkflowArtifactsResponse","WorkflowArtifactView","StepDynamicRunsNote","WorkflowDuration","formatRunDuration","activeSteps","attentionFor","runState","runFilterOf","runSearchText","WorkflowRunAction","ViewMode","FILTER","all","running","failed","done","const","Status","state","tone","Heading","title","count","styles","section","heading","meta","Duration","start","end","now","undefined","Math","max","Date","parse","Job","job","onOpen","step","open","setOpen","steps","filter","status","length","name","expanded","startedAt","endedAt","reason","map","group","Boolean","join","ref","kind","id","WorkflowArtifactList","listing","error","loading","onParent","artifact","artifacts","String","path","description","WorkflowDockViewProps","run","runs","sheet","dockHeader","busy","canAct","initialMode","onSelectRun","onOpenStep","onStop","onDelete","onLaunch","WorkflowDockView","mode","setMode","search","setSearch","setFilter","visibleRuns","item","includes","trim","toLowerCase","active","attention","attentionText","errorMessage","staleReason","text","List","FlatList","header","row","displayName","flexMeta","position","stage","workflowPath","finishedAt","ask","failure","body","jobs","details","picker","filters","Object","values","value","selected","workspace","routeKey","runKey","frame","embedded","list","actions","create","theme","fontFamily","sans","fontSize","base","lineHeight","color","colors","flex","backgroundColor","rail","uni__dependencies","red","gap","spacing","padding","borderBottomWidth","hairlineWidth","borderBottomColor","border","flexDirection","alignItems","xl","fontWeight","semibold","hi","lg","sm","dim","justifyContent","paddingHorizontal","paddingTop","paddingBottom","paddingVertical","minHeight","paddingLeft","margin","borderWidth","borderRadius","md","borderColor","borderTopWidth","borderTopColor","flexWrap","notice","styles","Button","fontOf","memo","useMemo","useState","StyleSheet","DELIMITED_COLUMN_STEP","DELIMITED_ROW_STEP","indexDelimited","readDelimitedWindow","DelimitedArtifact","text","delimiter","initialRows","document","window","setWindow","rows","columns","current","rowCount","rowStarts","length","Math","min","cells","styles","body","meta","copy","preview","tableRow","Array","from","_","column","cell","map","values","row","create","theme","flex","padding","spacing","gap","uni__dependencies","fontFamily","sans","fontSize","lg","lineHeight","color","colors","sm","dim","borderWidth","borderColor","borderRadius","md","flexDirection","width","borderRightWidth","borderBottomWidth","mono","styles","WebPluginSlotProps","Badge","Button","CodeBlock","Input","ListRow","Markdown","Sheet","SheetBody","SheetContent","SheetHeader","SheetTitle","Textarea","useCallback","useEffect","useMemo","useRef","useState","useSyncExternalStore","StyleSheet","STEP_ACTIVITY_SCOPE","WorkflowCatalogEntryView","WorkflowRunView","WorkflowArtifactContentResponse","WorkflowArtifactsResponse","WorkflowTerminalCapabilitiesView","catalog","closeCatalog","filterCatalog","openCatalog","initialChoice","initialCommand","initialInputs","initialRunner","launchProblems","workflowLaunchLine","deleteWorkflowRun","fetchArtifact","fetchArtifactMedia","prepareArtifactSave","finiteScreenReader","fetchArtifacts","readScreen","releaseControl","resizeRun","sendKeys","takeControl","stopWorkflowRun","workflowRunIdentity","runPriority","focusRun","removeRun","requestLaunch","workflows","WorkflowDockView","WorkflowArtifactList","WorkflowRunAction","DelimitedArtifact","StepDynamicRuns","useWorkflows","sessionId","subscribe","listener","sub","store","unsubscribe","select","state","workflowTab","run","Parameters","identity","id","workspace","routeKey","runKey","replace","label","displayName","retainComposer","panel","props","workflowsTab","WorkflowPanel","WorkflowLauncher","filter","setFilter","selected","setSelected","open","workflow","find","item","path","undefined","name","prompt","styles","body","warning","error","map","relativePath","description","jobs","job","join","length","meta","Choice","options","value","onChange","option","WorkflowLaunch","initialPrompt","sendSessionFrame","onClose","setPrompt","inputs","setInputs","runner","setRunner","command","setCommand","choice","setChoice","setError","request","trim","problems","line","input","type","required","current","runners","commands","choices","problem","cause","Error","message","String","focusedRun","runs","JSON","stringify","openTransientTab","WorkflowRunPanel","sheet","onSelectRun","busy","setBusy","operation","kind","mounted","stage","sort","left","right","act","action","Promise","token","dockHeader","step","target","steps","status","stepTab","result","closeTransientTab","ownerSessionId","at","session","ref","live","tabId","targetSessionId","activityScope","WorkflowStep","renderSessionTranscript","renderRunnerTerminal","setTransientTabSession","openSession","screen","title","WorkflowTerminal","pane","Pick","capabilities","setCapabilities","setToken","notice","setNotice","columns","setColumns","rows","setRows","lifetime","AbortController","abort","catch","key","read","signal","frame","aborted","write","text","arm","grant","held","reason","transcript","writable","resizable","Number","isInteger","WorkflowArtifacts","directory","setDirectory","requestKey","loaded","setLoaded","listing","active","then","artifacts","includes","slice","lastIndexOf","panelProps","ArtifactPreview","renderFilePreview","renderMediaPreview","nativeSaveFile","content","setContent","raw","setRaw","artifact","downloadController","saving","setSaving","saveNote","setSaveNote","download","controller","delimited","test","preview","html","prettyJson","truncated","BinaryArtifactPreview","media","data","mimeType","parse","create","theme","flex","backgroundColor","colors","bg","padding","spacing","uni__dependencies","gap","color","hi","fontSize","base","fontWeight","dim","sm","red","styles","WebPluginSlotProps","ArrowRightIcon","Button","Dot","fontOf","ListRow","PoNativeTheme","useState","StyleSheet","dynamicWorkflowTab","useDynamicWorkflows","DynamicWorkflowActivity","WorkflowDuration","useWorkflows","workflowTab","openCatalog","workflowActivityGroups","workflowActivityRows","WorkflowActivityGroupName","focusRun","WorkflowsActivitySection","sessionId","openSession","openTransientTab","state","dynamicRuns","runs","openedAt","Date","now","folded","setFolded","Partial","Record","groups","map","group","open","name","openByDefault","expanded","current","rows","length","row","identity","tone","runKey","ownerSessionId","run","find","item","workspace","routeKey","flexDirection","alignItems","styles","status","detail","startedAt","finishedAt","heading","idle","disabled","action","actionText","create","theme","flexWrap","gap","spacing","uni__dependencies","fontFamily","sans","fontSize","sm","lineHeight","fontWeight","semibold","color","colors","hi","paddingVertical","dim","base","medium","green","styles","asRecord","readString","readNumber","plural","Badge","fontOf","PoNativeTheme","StyleSheet","LineTone","ToolLine","WorkflowFact","WorkflowRow","WorkflowLines","lines","styles","map","entry","index","String","text","sans","TONE_STYLE","tone","bold","indent","WorkflowHeadline","chip","headline","length","hi","headlineText","undefined","label","WorkflowFacts","facts","fact","mono","value","WorkflowRows","title","rows","section","row","key","rowLine","rowTitle","detail","small","faint","WorkflowNote","children","WorkflowReason","error","create","theme","fontFamily","fontSize","base","lineHeight","uni__dependencies","sm","gap","spacing","flexDirection","alignItems","minWidth","flexShrink","flexWrap","columnGap","rowGap","maxWidth","xs","fontWeight","semibold","textTransform","color","colors","dim","paddingLeft","red","success","green","warning","yellow","accent","blue","Readonly","Record","muted","styles","ToolMessageRenderProps","fontOf","MessageItem","MessageItemBody","MessageItemHeader","MessageItemStatus","toolTone","PoNativeTheme","StyleSheet","workflowChildRunningLabel","workflowChildSummary","workflowChildView","workflowFailureReason","WorkflowFacts","WorkflowHeadline","WorkflowLines","WorkflowNote","WorkflowReason","WorkflowRows","WorkflowChildToolMessage","toolName","args","result","output","running","isError","summary","view","undefined","expandable","facts","length","sections","error","note","text","expanded","styles","primary","sans","detail","join","slice","map","tone","stack","headline","chip","section","title","rows","create","theme","flex","flexDirection","alignItems","gap","spacing","minWidth","uni__dependencies","fontFamily","fontSize","base","lineHeight","flexShrink","fontWeight","semibold","color","colors","hi","faint","styles","ToolMessageRenderProps","fontOf","MessageItem","MessageItemBody","MessageItemHeader","toolTone","PoNativeTheme","StyleSheet","workflowCallSummary","workflowFailureReason","workflowResultLines","workflowStructuredView","workflowToolName","WorkflowFacts","WorkflowHeadline","WorkflowLines","WorkflowNote","WorkflowReason","WorkflowRows","WorkflowToolMessage","toolName","args","result","output","running","isError","name","summary","detail","target","metadata","filter","value","undefined","structured","collapsed","expanded","isPartial","full","expandable","facts","length","rows","note","styles","sans","primary","action","join","stack","headline","create","theme","flex","flexDirection","alignItems","gap","spacing","minWidth","uni__dependencies","fontFamily","fontSize","base","lineHeight","flexShrink","maxWidth","fontWeight","semibold","color","colors","hi","faint","fillWorkflows","activityGroupWorkflows","channelDynamicWorkflowRuns","channelWorkflowCatalog","channelWorkflowRuns","dockWorkflow","fillWorkflowLauncher","fillWorkflows2","toolWorkflowChild","toolWorkflow"],"sources":["../../src/extensions/workspaces/(frontend)/fill/Workflows.home.native.ts","../../src/types/webWorkflows.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/catalogStore.native.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/launchLine.ts","../../src/types/apiRoutes.ts","../../generated/client.native.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/terminalApi.native.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/runDuration.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/workflowActivity.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/workflowRunPresentation.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/workflowsStore.native.ts","../../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/WorkflowDuration.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/_components/DynamicWorkflowView.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/_components/StepDynamicRuns.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/dock/_components/WorkflowDockView.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/_lib/delimitedPreview.ts","../../src/extensions/workspaces/sessions/(frontend)/_components/DelimitedArtifact.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/_components/WorkflowPanel.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/activity-group/workflows.native.ts","../../src/extensions/workspaces/sessions/(frontend)/channel/dynamic-workflow-runs.native.ts","../../src/extensions/workspaces/sessions/(frontend)/channel/workflow-catalog.native.ts","../../src/extensions/workspaces/sessions/(frontend)/channel/workflow-runs.native.ts","../../src/extensions/workspaces/sessions/(frontend)/dock/_components/WorkflowDockPanel.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/dock/workflow.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/fill/WorkflowLauncher.overlay.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/_components/DynamicWorkflowPanel.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/fill/_components/WorkflowsActivitySection.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/fill/Workflows.activity.workflows.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/_lib/workflowToolRender.ts","../../src/extensions/workspaces/sessions/(frontend)/tool/_lib/workflowChildToolView.ts","../../src/extensions/workspaces/sessions/(frontend)/tool/_components/WorkflowResultParts.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/_components/WorkflowChildToolMessage.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/workflow-child.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/_components/WorkflowToolMessage.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/workflow.native.tsx","../../generated/native.ts"],"sourcesContent":["import { defineFill } from '@agimon-ai/po-core/native';\n\nexport default defineFill({\n data: { version: 1, label: 'Workflows', source: 'workflow_runs', destination: 'workflows' },\n});\n","/**\n * Workflow run view types shared by this package's hub channel and its web\n * plugin. The shapes mirror what the embedded workflow-mcp engine records;\n * the cockpit renders them as 'workflow_runs' channel payloads.\n */\n\nimport type { PoHubSessionUsage } from '@agimon-ai/po-core/hubChannel';\nimport type { PoWorkflowChildrenStatus } from '@agimon-ai/po-core/workflow';\n\n/** Usage coverage is explicit: an absent total is not a measured zero. */\nexport interface WorkflowChildUsageSummary {\n /** False when a journal or any invocation metric is unavailable. */\n complete: boolean;\n invocationCount: number;\n tokensKnown: number;\n costKnown: number;\n toolCountKnown: number;\n tokens?: PoHubSessionUsage['tokens'];\n costUsd?: number;\n toolCount?: number;\n}\n\nexport interface WorkflowChildStatusError {\n lead?: string;\n message: string;\n}\n\n/** workflow-mcp's own stage vocabulary; the registry bucket a run record sits in. */\nexport type WorkflowStage = 'running' | 'completed' | 'error';\n\n/** workflow-mcp's terminal outcome for a finished run. */\nexport type WorkflowOutcome = 'success' | 'skipped' | 'failed' | 'interrupted';\n\n/** Recorded job/step states, plus pending entries from the workflow definition. */\nexport type WorkflowProgressState =\n | 'pending'\n | 'running'\n | 'completed'\n | 'skipped'\n | 'failed'\n | 'pause_requested'\n | 'paused'\n | 'resumed';\n\n/** A customRun step ran as this child session. */\nexport const STEP_SESSION_REF_KIND = 'session';\n/** A command step ran in this terminal pane. */\nexport const STEP_PANE_REF_KIND = 'pane';\n/** The activity panel's scope line while a step tab is open. */\nexport const STEP_ACTIVITY_SCOPE = 'diagnose step';\n\n/** Where a host executor ran a step: `session` for a customRun agent, `pane` for a command. */\nexport interface WorkflowStepRefView {\n kind: string;\n id: string;\n label?: string;\n}\n\nexport interface WorkflowStepView {\n name: string;\n status: WorkflowProgressState;\n /** Kept after the step ends, so a finished agent step still opens its conversation. */\n ref?: WorkflowStepRefView;\n /** Why the step is in its state, when the engine recorded one (e.g. a skip condition). */\n reason?: string;\n /** The parallel group the step ran in, beside the group's other steps. */\n group?: string;\n /** ISO 8601 of the step's first running event. */\n startedAt?: string;\n /** ISO 8601 of the step's terminal event. */\n endedAt?: string;\n}\n\n/** 'pre' and 'post' are the engine's pseudo-jobs for its pre:/post: blocks. */\nexport type WorkflowJobPhase = 'pre' | 'job' | 'post';\n\nexport interface WorkflowJobView {\n name: string;\n phase: WorkflowJobPhase;\n status: WorkflowProgressState;\n reason?: string;\n /** Position among the run's jobs, when the engine recorded one. */\n index?: number;\n total?: number;\n startedAt?: string;\n endedAt?: string;\n steps: WorkflowStepView[];\n}\n\n/** The job and step a run is on right now; drives the NOW breadcrumb. */\nexport interface WorkflowPosition {\n job: string;\n step?: string;\n index?: number;\n total?: number;\n}\n\n/**\n * One workflow run of a session, read from workflow-mcp's registry: the\n * run.json record plus the folded progress.ndjson job tree.\n */\nexport interface WorkflowRunView {\n /** Opaque owner-qualified API/cache key. The displayed engine runKey stays unchanged. */\n routeKey?: string;\n /** Engine generation identity, distinct from a reused run key. */\n runId?: string;\n /** Registry identity within its workspace; unique per workspace+stage. */\n runKey: string;\n workspace: string;\n displayName: string;\n workflowName?: string;\n workflowPath: string;\n stage: WorkflowStage;\n outcome?: WorkflowOutcome;\n /** Present while the engine is pausing or paused; absent for plain running. */\n executionState?: 'running' | 'pause_requested' | 'paused' | 'resume_requested';\n /** The prompt the run was launched with, when one was recorded. */\n prompt?: string;\n /** ISO 8601, from the run record. */\n startedAt: string;\n finishedAt?: string;\n /** Failure cause with ANSI escapes stripped, present when the run errored. */\n errorMessage?: string;\n /** The job the engine blamed for the failure, when it recorded one. */\n failedJob?: string;\n /** True when reconciliation decided the recorded pid is no longer alive. */\n stale?: boolean;\n staleReason?: string;\n worktreeBranch?: string;\n /** The session that owns the run (its PO_SESSION_ID); absent on records that carry none. */\n ownerSessionId?: string;\n /** The session that launched the run into its own workflow session, when it was handed off. */\n launcherSessionId?: string;\n position?: WorkflowPosition;\n jobs: WorkflowJobView[];\n /** Latest durable child state, including readable agent-session references. */\n children?: readonly PoWorkflowChildrenStatus[];\n childUsage?: WorkflowChildUsageSummary;\n /** Missing or corrupt child evidence is visible, never represented as successful empty work. */\n childStatusErrors?: WorkflowChildStatusError[];\n}\n\n/** What the workflow runs channel publishes for one session. */\nexport interface WorkflowRunsPayload {\n runs: WorkflowRunView[];\n}\n\nexport const WORKFLOW_RUNS_TYPE = 'workflow_runs';\n\n/**\n * One workflow the session's directory can launch, as the catalog drawer\n * lists it: the engine's own catalog entry plus the parsed detail the drawer\n * unfolds and the launch dialog turns into fields.\n */\nexport interface WorkflowCatalogEntryView {\n /** Absolute path, the row's stable identity. */\n path: string;\n relativePath: string;\n name: string;\n description: string;\n tags: string[];\n /** The trigger names the file declares, such as workflow_dispatch. */\n triggers: string[];\n inputs: WorkflowCatalogInputView[];\n jobs: WorkflowCatalogJobView[];\n artifacts: WorkflowCatalogArtifactView[];\n /** Absent when the workflow names no runner map, which means any runner will do. */\n runners?: string[];\n /** Commands every templated step offers; absent when no step is templated. */\n commands?: string[];\n /** Declared model choices; `default` is used when a launch names none. */\n choices?: string[];\n /** Set when the file could not be parsed; the row shows this instead of guessing. */\n error?: string;\n}\n\nexport interface WorkflowCatalogInputView {\n name: string;\n description?: string;\n required?: boolean;\n default?: string;\n type?: string;\n options?: string[];\n}\n\nexport interface WorkflowCatalogJobView {\n name: string;\n steps: string[];\n}\n\nexport interface WorkflowCatalogArtifactView {\n path: string;\n kind: 'file' | 'directory';\n description: string;\n producedBy: string[];\n}\n\n/** What the catalog channel publishes for one session. */\nexport interface WorkflowCatalogPayload {\n /** The directory the catalog was read from, which is the session's own. */\n cwd: string;\n workflows: WorkflowCatalogEntryView[];\n /** Present when the directory could not be read at all. */\n warning?: string;\n}\n\nexport const WORKFLOW_CATALOG_TYPE = 'workflow_catalog';\n\nexport interface WorkflowInputSummary {\n name: string;\n description?: string;\n required?: boolean;\n default?: string;\n options?: readonly string[];\n}\n\nexport interface WorkflowJobSummary {\n name: string;\n steps: readonly string[];\n}\n\n/**\n * What the detail pane shows for one workflow. `runners` is undefined when the\n * workflow names no runner map at all, which is not the same as naming an empty\n * one - see `compatibleRunners`.\n */\nexport interface WorkflowCatalogDetail {\n triggers: readonly string[];\n inputs: readonly WorkflowInputSummary[];\n jobs: readonly WorkflowJobSummary[];\n runners?: readonly string[];\n /** Commands every templated step offers; absent when no step is templated. */\n commands?: readonly string[];\n /** Declared model choices. */\n choices?: readonly string[];\n /** Set when the file could not be parsed; the pane shows this instead of guessing. */\n error?: string;\n}\n","import { defineSessionStore } from '@agimon-ai/po-core/native';\n\nimport {\n WORKFLOW_CATALOG_TYPE,\n type WorkflowCatalogEntryView,\n type WorkflowCatalogPayload,\n} from '../../../../../types/webWorkflows';\n\n/** One session's catalog: what the hub last reported plus what the drawer is doing with it. */\nexport interface CatalogSession {\n cwd: string;\n workflows: WorkflowCatalogEntryView[];\n warning: string | undefined;\n /** True while the catalog drawer is shown in the workflows tab. */\n open: boolean;\n filter: string;\n /** Prompt carried from the surface that opened the catalog. */\n prompt: string;\n /** The highlighted row, by workflow path. */\n selected: string | undefined;\n /** The row whose parsed detail is unfolded. */\n inspected: string | undefined;\n /** The workflow the launch dialog is open for. */\n launch: string | undefined;\n}\n\nexport const catalog = defineSessionStore<CatalogSession>({\n cwd: '',\n workflows: [],\n warning: undefined,\n open: false,\n filter: '',\n prompt: '',\n selected: undefined,\n inspected: undefined,\n launch: undefined,\n});\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function openCatalog(sessionId: string, prompt = ''): void {\n catalog.update(sessionId, (current) => ({ ...current, open: true, prompt }));\n}\n\nexport function closeCatalog(sessionId: string): void {\n catalog.update(sessionId, (current) => ({ ...current, open: false, prompt: '', launch: undefined }));\n}\n\nexport function setCatalogFilter(sessionId: string, filter: string): void {\n catalog.update(sessionId, (current) => ({ ...current, filter }));\n}\n\nexport function selectWorkflow(sessionId: string, path: string | undefined): void {\n catalog.update(sessionId, (current) => ({ ...current, selected: path }));\n}\n\nexport function toggleInspect(sessionId: string, path: string): void {\n catalog.update(sessionId, (current) => ({ ...current, inspected: current.inspected === path ? undefined : path }));\n}\n\nexport function openLaunch(sessionId: string, path: string): void {\n catalog.update(sessionId, (current) => ({ ...current, selected: path, launch: path }));\n}\n\nexport function closeLaunch(sessionId: string): void {\n catalog.update(sessionId, (current) => ({ ...current, launch: undefined }));\n}\n\n/** Rows whose name, path, tag or job matches the filter, case-insensitively. */\nexport function filterCatalog(\n workflows: readonly WorkflowCatalogEntryView[],\n filter: string,\n): WorkflowCatalogEntryView[] {\n const needle = filter.trim().toLowerCase();\n if (needle === '') return [...workflows];\n return workflows.filter((workflow) =>\n [\n workflow.name,\n workflow.relativePath,\n workflow.description,\n ...workflow.tags,\n ...workflow.jobs.map((job) => job.name),\n ]\n .join('\\n')\n .toLowerCase()\n .includes(needle),\n );\n}\n\n/** The plugin's catalog channel: 'workflow_catalog' payloads into the store. */\nexport const workflowCatalogChannel = catalog.channel<WorkflowCatalogPayload>({\n channel: WORKFLOW_CATALOG_TYPE,\n parse(input) {\n if (!isRecord(input) || typeof input.cwd !== 'string' || !Array.isArray(input.workflows)) return null;\n return {\n cwd: input.cwd,\n workflows: input.workflows.filter(isRecord) as unknown as WorkflowCatalogEntryView[],\n ...(typeof input.warning === 'string' ? { warning: input.warning } : {}),\n };\n },\n reduce(current, payload) {\n const paths = new Set(payload.workflows.map((workflow) => workflow.path));\n return {\n ...current,\n cwd: payload.cwd,\n workflows: payload.workflows,\n warning: payload.warning,\n // A row that is gone cannot stay selected, inspected, or half-launched.\n selected: current.selected !== undefined && paths.has(current.selected) ? current.selected : undefined,\n inspected: current.inspected !== undefined && paths.has(current.inspected) ? current.inspected : undefined,\n launch: current.launch !== undefined && paths.has(current.launch) ? current.launch : undefined,\n };\n },\n});\n","import type { WorkflowCatalogEntryView } from '../../../../../types/webWorkflows';\n\n/**\n * The `/workflow-launch` line the dialog sends.\n *\n * WHY THE BUILDER LIVES HERE AND THE PARSER DOES NOT:\n * Cockpit code is compiled into the host bundle and may import only this\n * package's own web and type modules, so it cannot share the session's parser.\n * The two are pinned together by a test that parses what this writes, which is\n * the only guarantee that matters: the line has to survive the trip.\n */\n\nexport const WORKFLOW_LAUNCH_VERB = '/workflow-launch';\n/** Reserved keys; every other pair is one of the workflow's own inputs. */\nexport const RUNNER_KEY = 'runner';\nexport const COMMAND_KEY = 'command';\nexport const CHOICE_KEY = 'choice';\nexport const PROFILE_KEY = 'profile';\n\nexport interface WorkflowLaunchRequest {\n workflow: string;\n runner?: string;\n command?: string;\n choice?: string;\n profile?: string;\n inputs: Record<string, string>;\n prompt?: string;\n}\n\n/** Quotes a value that carries whitespace, which is how a value survives tokenizing. */\nfunction quote(value: string): string {\n return /\\s/.test(value) ? `\"${value}\"` : value;\n}\n\nfunction reservedPair(key: string, value: string | undefined): string[] {\n return value === undefined || value === '' ? [] : [`${key}=${quote(value)}`];\n}\n\nexport function workflowLaunchLine(request: WorkflowLaunchRequest): string {\n const pairs = [\n ...reservedPair(RUNNER_KEY, request.runner),\n ...reservedPair(COMMAND_KEY, request.command),\n ...reservedPair(CHOICE_KEY, request.choice),\n ...reservedPair(PROFILE_KEY, request.profile),\n ...Object.entries(request.inputs)\n .filter(([, value]) => value !== '')\n .map(([key, value]) => `${key}=${quote(value)}`),\n ];\n const prompt = request.prompt?.trim();\n return [WORKFLOW_LAUNCH_VERB, quote(request.workflow), ...pairs, ...(prompt ? [prompt] : [])].join(' ');\n}\n\n/** The trigger that makes a prompt mandatory. */\nconst USER_PROMPT_TRIGGER = 'user_prompt';\n\n/** What the dialog will not let a reader send, worded the way the session would answer. */\nexport function launchProblems(workflow: WorkflowCatalogEntryView, request: WorkflowLaunchRequest): string[] {\n const problems: string[] = [];\n if (workflow.triggers.includes(USER_PROMPT_TRIGGER) && (request.prompt ?? '').trim() === '') {\n problems.push('This workflow is triggered by a prompt, so it needs one.');\n }\n const missing = workflow.inputs\n .filter((input) => input.required === true && (request.inputs[input.name] ?? '') === '')\n .map((input) => input.name);\n if (missing.length > 0) {\n problems.push(`Missing required input${missing.length > 1 ? 's' : ''}: ${missing.join(', ')}.`);\n }\n return problems;\n}\n\n/** The default a field starts with: what the workflow declared, or empty. */\nexport function initialInputs(workflow: WorkflowCatalogEntryView): Record<string, string> {\n return Object.fromEntries(workflow.inputs.map((input) => [input.name, input.default ?? '']));\n}\n\n/** The runner a launch starts on: the workflow's first declared one, when it declares any. */\nexport function initialRunner(workflow: WorkflowCatalogEntryView): string | undefined {\n return workflow.runners?.[0];\n}\n\n/** The command templated steps start on: the one their steps list first. */\nexport function initialCommand(workflow: WorkflowCatalogEntryView): string | undefined {\n return workflow.commands?.[0];\n}\n\n/** The choice a launch starts on: `default` when declared, else the first. */\nexport function initialChoice(workflow: WorkflowCatalogEntryView): string | undefined {\n const choices = workflow.choices ?? [];\n return choices.includes('default') ? 'default' : choices[0];\n}\n","import type { ApiResponseOf, ApiRoutes } from '@agimon-ai/po-core/web';\n\nimport type {\n WorkflowArtifactContentResponse,\n WorkflowArtifactsResponse,\n WorkflowControlResponse,\n WorkflowDeleteResponse,\n WorkflowLaunchResponse,\n WorkflowOpenRunDirectoryResponse,\n WorkflowSteerResponse,\n WorkflowStopResponse,\n WorkflowScreenEvent,\n} from './webWorkflowTerminal';\n\n/**\n * This package's routes, as data.\n *\n * No scope and no base path. The build reads both off\n * `src/extensions/(backend)/api/workflow/`, so the mount is stated once, by the\n * folder that creates it. The same API answers at all three scopes, because a\n * global contribution cascades into workspace and session; the folder under\n * `workspaces/sessions/` only re-mounts it for a session's own server.\n *\n * This is the one file the routes, the Hono app and the browser all read, so a\n * path cannot move on one side alone. The page used to build the hub's own\n * absolute URL and then rewrite its plugin prefix with String.replace to reach\n * a session, which is exactly the kind of copy that can move by one character\n * without anything noticing.\n *\n * `:workspace` and `:runKey` are Hono's own parameter syntax, because the app\n * registers `path` verbatim.\n */\n\n/** One run, which every route below addresses. */\nconst RUN = '/runs/:workspace/:runKey';\n\n/**\n * The artifact route's parameter, as Hono spells a multi-segment match.\n *\n * An artifact is named by its path inside the run directory, so `reports/a.md`\n * is one parameter across two segments. The client's `params` substitution\n * fills a single segment and percent-encodes the slash with it, so the page\n * substitutes this one itself; see the page's `_lib/terminalApi.ts`.\n */\nexport const ARTIFACT_NAME_PARAM = ':name{.+}';\n\n/**\n * The step whose pane a terminal route reads: a step ref's id. Absent, the\n * route follows the run's current step, which is one of a parallel group's.\n */\nexport const STEP_TARGET_PARAM = 'step';\n\n/** Query parameters the artifact route reads, spelled once for both halves. */\nexport const ARTIFACT_RAW_PARAM = 'raw';\nexport const ARTIFACT_DOWNLOAD_PARAM = 'download';\n\nconst routes = {\n /**\n * The terminal, as server-sent events.\n *\n * `stream: true` gets a URL and no call method: the consumer is the browser's\n * own `EventSource`, and a relayed call would buffer a stream that never ends.\n */\n snapshot: {\n method: 'GET',\n path: `${RUN}/screen`,\n query: [STEP_TARGET_PARAM],\n response: undefined as unknown as ApiResponseOf<WorkflowScreenEvent>,\n },\n screen: {\n method: 'GET',\n path: `${RUN}/screen/stream`,\n query: [STEP_TARGET_PARAM],\n stream: true,\n },\n control: {\n method: 'POST',\n path: `${RUN}/control`,\n response: undefined as unknown as ApiResponseOf<WorkflowControlResponse>,\n },\n keys: {\n method: 'POST',\n path: `${RUN}/keys`,\n },\n resize: {\n method: 'POST',\n path: `${RUN}/resize`,\n response: undefined as unknown as ApiResponseOf<{ resized: boolean }>,\n },\n remove: {\n method: 'DELETE',\n path: RUN,\n response: undefined as unknown as ApiResponseOf<WorkflowDeleteResponse>,\n },\n stop: {\n method: 'POST',\n path: `${RUN}/stop`,\n response: undefined as unknown as ApiResponseOf<WorkflowStopResponse>,\n },\n /** Guidance for the agent session the running step is in, like steering a Team sub-agent. */\n steer: {\n method: 'POST',\n path: `${RUN}/steer`,\n response: undefined as unknown as ApiResponseOf<WorkflowSteerResponse>,\n },\n /**\n * Launch a workflow into the mounting session's own runtime, which then owns\n * the run. A dispatcher session reaches its root's session mount through this.\n */\n launch: {\n method: 'POST',\n path: '/launch',\n response: undefined as unknown as ApiResponseOf<WorkflowLaunchResponse>,\n },\n openRunDirectory: {\n method: 'POST',\n path: `${RUN}/open-directory`,\n response: undefined as unknown as ApiResponseOf<WorkflowOpenRunDirectoryResponse>,\n },\n artifacts: {\n method: 'GET',\n path: `${RUN}/artifacts`,\n query: ['directory'],\n response: undefined as unknown as ApiResponseOf<WorkflowArtifactsResponse>,\n },\n /** One artifact: its metadata and text, or its raw bytes under `raw=1`. */\n artifact: {\n method: 'GET',\n path: `${RUN}/artifacts/${ARTIFACT_NAME_PARAM}`,\n query: [ARTIFACT_RAW_PARAM, ARTIFACT_DOWNLOAD_PARAM],\n response: undefined as unknown as ApiResponseOf<WorkflowArtifactContentResponse>,\n },\n} as const satisfies ApiRoutes;\n\nexport default routes;\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { createApiClient, nativeApiTransport, sessionApiAddress } from '@agimon-ai/po-core/native';\n\nimport routes from '../src/types/apiRoutes';\n\n/** Scopes the tree mounts 'workflow' at. */\nexport const apiScopes = ['global', 'workspace', 'session'] as const;\n\nexport const api = createApiClient(routes, {\n scopes: apiScopes,\n basePath: 'workflow',\n transport: nativeApiTransport,\n sessionAddress: sessionApiAddress,\n});\n","import { encodeBase64 } from '@agimon-ai/po-core/native';\nimport type { WebPluginSlotProps } from '@agimon-ai/po-core/native';\nimport { nativeApiTransport } from '@agimon-ai/po-core/native';\n\nimport { api } from '../../../../../../generated/client.native';\nimport {\n ARTIFACT_DOWNLOAD_PARAM,\n ARTIFACT_NAME_PARAM,\n ARTIFACT_RAW_PARAM,\n STEP_TARGET_PARAM,\n} from '../../../../../types/apiRoutes';\nimport {\n type WorkflowArtifactContentResponse,\n type WorkflowArtifactsResponse,\n type WorkflowControlResponse,\n type WorkflowDeleteResponse,\n type WorkflowScreenEvent,\n type WorkflowSteerResponse,\n type WorkflowStopResponse,\n} from '../../../../../types/webWorkflowTerminal';\n\n/**\n * The page's half of this package's hub API: one run's terminal and the files\n * its run directory holds.\n *\n * These are adapters now, not a transport. The generated client owns the URL\n * and the sealed transport with it, so nothing here spells a mount. What stays\n * is this package's own vocabulary: which refusals the reader is shown, and the\n * shapes the terminal expects back.\n *\n * A run belongs to its multiplexer rather than to a session, so the same API\n * answers at the hub and inside a session's own server. Passing a session id\n * addresses that session's copy and passing none addresses the hub. The deleted\n * builder made that branch the other way round: it always built the hub's\n * absolute URL, then rewrote the plugin prefix into the session's with\n * String.replace, so a session's URL was a hub URL with its head swapped.\n */\n\nconst UNREACHABLE = 'The cockpit hub is unreachable.';\n\n/** One of the scopes this API mounts at; every route is the same on all of them. */\ntype WorkflowScope = typeof api.global;\n\n/** The hub, or one session's own copy of it; a null session id is the hub. */\nfunction scoped(sessionId?: string | null): WorkflowScope {\n return sessionId == null ? api.global : api.session(sessionId);\n}\n\n/** The run every route addresses, as the route table's two path parameters. */\nfunction runParams(workspace: string, runKey: string): { workspace: string; runKey: string } {\n return { workspace, runKey };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/**\n * The message a reader is shown: the route's own words, or why there were none.\n *\n * `error` is optional because an answered call that simply carried the wrong\n * shape reaches here too, and that result has no error field at all.\n */\nfunction messageOf(result: { status: number; error?: string }, fallback: string): string {\n if (result.status === 0) return UNREACHABLE;\n return result.error === undefined || result.error === '' ? fallback : result.error;\n}\n\n/**\n * One artifact's URL, with its path filled in.\n *\n * An artifact is named by its path inside the run directory, which Hono matches\n * as the one multi-segment parameter `:name{.+}`. The client's own `params`\n * substitution fills a single segment and percent-encodes the separating slash\n * with it, which would move every nested artifact's URL, so that one segment is\n * substituted here instead: each segment encoded, the slashes between them\n * kept. Everything left of it still comes from the client.\n */\nfunction artifactUrl(\n scope: WorkflowScope,\n workspace: string,\n runKey: string,\n artifactPath: string,\n query?: Record<string, number>,\n): string {\n return scope.artifact\n .url({ params: runParams(workspace, runKey), ...(query === undefined ? {} : { query }) })\n .replace(ARTIFACT_NAME_PARAM, artifactPath.split('/').map(encodeURIComponent).join('/'));\n}\n\n/** The pane a terminal call names, when it reads one step's rather than the run's current one. */\nfunction stepBody(step: string | undefined): { step?: string } {\n return step === undefined ? {} : { step };\n}\n\n/** One finite screen read over the session-bound sealed transport. */\nexport async function readScreen(\n workspace: string,\n runKey: string,\n sessionId: string | null,\n step: string | undefined,\n signal: AbortSignal,\n): Promise<WorkflowScreenEvent> {\n const response = await nativeApiTransport(\n scoped(sessionId).snapshot.url({\n params: runParams(workspace, runKey),\n query: { [STEP_TARGET_PARAM]: step },\n }),\n { signal },\n );\n const body: unknown = await response.json();\n if (!response.ok)\n throw new Error(isRecord(body) && typeof body.error === 'string' ? body.error : 'The screen could not be read.');\n if (\n !isRecord(body) ||\n !Array.isArray(body.lines) ||\n body.lines.length > 48 ||\n !body.lines.every((line) => typeof line === 'string' && line.length <= 4096) ||\n !isRecord(body.capabilities) ||\n typeof body.capabilities.readable !== 'boolean' ||\n typeof body.capabilities.writable !== 'boolean' ||\n typeof body.capabilities.resizable !== 'boolean'\n ) {\n throw new Error('The workflow hub returned an invalid screen.');\n }\n return body as unknown as WorkflowScreenEvent;\n}\n\n/** Takes the keyboard for one run, renewing when this page already holds it. */\nexport async function takeControl(\n workspace: string,\n runKey: string,\n token?: string,\n sessionId?: string | null,\n step?: string,\n): Promise<WorkflowControlResponse> {\n const result = await scoped(sessionId).control({\n params: runParams(workspace, runKey),\n body: { token, ...stepBody(step) },\n });\n if (result.status === 0) return { held: false, reason: UNREACHABLE };\n // A refusal carries the same shape as a grant, so the body is read before the\n // status: a 409 says who holds the keyboard and why, which is the answer.\n if (isRecord(result.data) && typeof result.data.held === 'boolean') {\n return result.data as unknown as WorkflowControlResponse;\n }\n return { held: false, reason: messageOf(result, 'The run refused the keyboard.') };\n}\n\nexport async function releaseControl(\n workspace: string,\n runKey: string,\n token: string,\n sessionId?: string | null,\n step?: string,\n): Promise<void> {\n await scoped(sessionId).control({\n params: runParams(workspace, runKey),\n body: { token, release: true, ...stepBody(step) },\n });\n}\n\n/** Sends literal keystrokes; the reason comes back when the lease has moved on. */\nexport async function sendKeys(\n workspace: string,\n runKey: string,\n token: string,\n data: string,\n sessionId?: string | null,\n step?: string,\n): Promise<{ error?: string }> {\n const result = await scoped(sessionId).keys({\n params: runParams(workspace, runKey),\n body: { token, data, ...stepBody(step) },\n });\n if (result.ok) return {};\n return { error: messageOf(result, 'The run would not take those keys.') };\n}\n\n/** Matches the run's terminal to the viewport of whoever holds the keyboard. */\nexport async function resizeRun(\n workspace: string,\n runKey: string,\n token: string,\n columns: number,\n rows: number,\n sessionId?: string | null,\n step?: string,\n): Promise<void> {\n await scoped(sessionId).resize({\n params: runParams(workspace, runKey),\n body: { token, columns, rows, ...stepBody(step) },\n });\n}\n\nexport type DeleteWorkflowResult = { result: WorkflowDeleteResponse } | { error: string };\n\n/** Permanently removes one settled run and its run directory. */\nexport async function deleteWorkflowRun(\n workspace: string,\n runKey: string,\n sessionId?: string | null,\n): Promise<DeleteWorkflowResult> {\n const result = await scoped(sessionId).remove({ params: runParams(workspace, runKey) });\n if (!result.ok) return { error: messageOf(result, 'The workflow could not be deleted.') };\n if (result.data.deleted === true) return { result: { deleted: true } };\n return { error: 'The workflow hub returned an invalid deletion response.' };\n}\n\nexport type StopWorkflowResult = { result: WorkflowStopResponse } | { error: string };\n\n/** Asks the engine running a workflow to stop it; the run settles on its own shortly after. */\nexport async function stopWorkflowRun(\n workspace: string,\n runKey: string,\n sessionId?: string | null,\n): Promise<StopWorkflowResult> {\n const result = await scoped(sessionId).stop({ params: runParams(workspace, runKey) });\n if (!result.ok) return { error: messageOf(result, 'The workflow could not be stopped.') };\n if (result.data.requested === true) return { result: { requested: true } };\n return { error: 'The workflow hub returned an invalid stop response.' };\n}\n\nexport type SteerStepResult = { result: WorkflowSteerResponse } | { error: string };\n\n/**\n * Sends guidance to the agent session a running step is in: the run's current\n * step, or `step`, the session of one step of a parallel group.\n */\nexport async function steerStep(\n workspace: string,\n runKey: string,\n message: string,\n sessionId?: string | null,\n step?: string,\n): Promise<SteerStepResult> {\n const result = await scoped(sessionId).steer({\n params: runParams(workspace, runKey),\n body: step === undefined ? { message } : { message, step },\n });\n if (!result.ok) return { error: messageOf(result, 'The step would not take that guidance.') };\n if (result.data.delivered === true) return { result: { delivered: true } };\n return { error: 'The workflow hub returned an invalid steer response.' };\n}\n\n/** Opens the current registry folder, never a browser-supplied path. */\nexport async function openRunDirectory(\n workspace: string,\n runKey: string,\n sessionId?: string | null,\n): Promise<{ error?: string }> {\n const result = await scoped(sessionId).openRunDirectory({ params: runParams(workspace, runKey) });\n if (!result.ok) return { error: messageOf(result, 'The run folder could not be opened in Finder.') };\n return result.data.opened === true ? {} : { error: 'The workflow hub returned an invalid folder response.' };\n}\n\nexport type ArtifactsResult = { artifacts: WorkflowArtifactsResponse } | { error: string };\n\nexport async function fetchArtifacts(\n workspace: string,\n runKey: string,\n sessionId?: string | null,\n directory?: string,\n): Promise<ArtifactsResult> {\n const result = await scoped(sessionId).artifacts({ params: runParams(workspace, runKey), query: { directory } });\n if (!result.ok) return { error: messageOf(result, 'This run has no directory to read.') };\n return { artifacts: result.data };\n}\n\nexport type ArtifactResult = { artifact: WorkflowArtifactContentResponse } | { error: string };\n\n/** Trusted same-origin URL for browser-native media previews and downloads. */\nexport function artifactContentUrl(\n workspace: string,\n runKey: string,\n path: string,\n download = false,\n sessionId?: string | null,\n): string {\n return artifactUrl(scoped(sessionId), workspace, runKey, path, {\n [ARTIFACT_RAW_PARAM]: 1,\n ...(download ? { [ARTIFACT_DOWNLOAD_PARAM]: 1 } : {}),\n });\n}\n\n/**\n * One artifact's metadata and text.\n *\n * The only route here that addresses itself rather than being called: its path\n * parameter spans segments, so the URL comes from `artifactUrl` and the request\n * goes over the same sealed transport the client is built on.\n */\nexport async function fetchArtifact(\n workspace: string,\n runKey: string,\n path: string,\n sessionId?: string | null,\n): Promise<ArtifactResult> {\n try {\n const response = await nativeApiTransport(artifactUrl(scoped(sessionId), workspace, runKey, path));\n const body = (await response.json()) as unknown;\n if (!response.ok) {\n const error = isRecord(body) && typeof body.error === 'string' && body.error !== '' ? body.error : '';\n return { error: error === '' ? 'That file has not been written.' : error };\n }\n return { artifact: body as WorkflowArtifactContentResponse };\n } catch {\n return { error: UNREACHABLE };\n }\n}\n\nconst MAX_MEDIA_BYTES = 5 * 1024 * 1024;\nconst MAX_FRAME_BYTES = 64 * 1024;\n\n/** Drain each UTF-8 snapshot before asking the server for another screen. */\nexport function finiteScreenReader(load: (signal: AbortSignal) => Promise<WorkflowScreenEvent>) {\n let bytes: Uint8Array = new Uint8Array(0);\n let cursor = 0;\n let generation = 0;\n let frame: WorkflowScreenEvent | undefined;\n return async (from: number, previous: string | undefined, signal: AbortSignal) => {\n if (signal.aborted) throw new Error('Preview cancelled.');\n let reset = previous !== String(generation) || from !== cursor;\n if (!frame || cursor >= bytes.length || reset) {\n const next = await load(signal);\n if (signal.aborted) throw new Error('Preview cancelled.');\n frame = next;\n bytes = utf8(next.lines.join('\\r\\n'));\n cursor = 0;\n generation += 1;\n reset = true;\n }\n const chunk = bytes.subarray(cursor, cursor + MAX_FRAME_BYTES);\n cursor += chunk.length;\n return {\n chunk: encodeBase64(chunk),\n offset: cursor,\n reset,\n generation: String(generation),\n exists: frame.capabilities.readable,\n hasMore: cursor < bytes.length,\n ended: frame.ended === true,\n };\n };\n}\n\n/** Raw media uses the same scoped sealed route as artifact metadata. */\nexport async function fetchArtifactMedia(\n workspace: string,\n runKey: string,\n path: string,\n sessionId: string | null,\n signal: AbortSignal,\n): Promise<{ data: string; mimeType: string }> {\n if (signal.aborted) throw new Error('Preview cancelled.');\n const response = await nativeApiTransport(artifactContentUrl(workspace, runKey, path, false, sessionId), { signal });\n if (signal.aborted) throw new Error('Preview cancelled.');\n if (!response.ok) throw new Error('That artifact could not be read.');\n const mimeType = (response.headers.get('content-type') ?? '').split(';')[0]!.trim().toLowerCase();\n if (\n !/^(application\\/pdf|image\\/(png|jpeg|gif|webp|bmp)|audio\\/(mpeg|mp4|wav|x-wav|ogg|webm|aac|flac)|video\\/(mp4|webm|quicktime|ogg))$/.test(\n mimeType,\n )\n )\n throw new Error('This artifact type cannot be previewed.');\n if (Number(response.headers.get('content-length')) > MAX_MEDIA_BYTES)\n throw new Error('This artifact exceeds the 5 MiB preview limit.');\n const bytes = await response.arrayBuffer();\n if (signal.aborted) throw new Error('Preview cancelled.');\n if (bytes.byteLength > MAX_MEDIA_BYTES) throw new Error('This artifact exceeds the 5 MiB preview limit.');\n return { data: encodeBase64(new Uint8Array(bytes)), mimeType };\n}\n\nfunction utf8(text: string): Uint8Array {\n const bytes: number[] = [];\n for (const character of text) {\n let code = character.codePointAt(0)!;\n if (code >= 0xd800 && code <= 0xdfff) code = 0xfffd;\n if (code < 0x80) bytes.push(code);\n else if (code < 0x800) bytes.push(0xc0 | (code >> 6), 0x80 | (code & 63));\n else if (code < 0x10000) bytes.push(0xe0 | (code >> 12), 0x80 | ((code >> 6) & 63), 0x80 | (code & 63));\n else bytes.push(0xf0 | (code >> 18), 0x80 | ((code >> 12) & 63), 0x80 | ((code >> 6) & 63), 0x80 | (code & 63));\n }\n return Uint8Array.from(bytes);\n}\n\n/** Binds a save to this package's guarded sealed route and one file version. */\nexport async function prepareArtifactSave(\n workspace: string,\n runKey: string,\n path: string,\n sessionId: string | null,\n signal: AbortSignal,\n): Promise<Parameters<NonNullable<WebPluginSlotProps['nativeSaveFile']>>[0]> {\n const load = async (headers: Record<string, string>, signal: AbortSignal): Promise<Response> => {\n if (signal.aborted) throw new Error('Download cancelled.');\n return nativeApiTransport(artifactContentUrl(workspace, runKey, path, true, sessionId), { headers, signal });\n };\n const probe = await load({ Range: 'bytes=0-0' }, signal);\n if (signal.aborted) throw new Error('Download cancelled.');\n const range = /^bytes 0-0\\/(\\d+)$/u.exec(probe.headers.get('content-range') ?? '');\n const empty =\n (probe.status === 416 && probe.headers.get('content-range') === 'bytes */0') ||\n (probe.status === 200 && probe.headers.get('content-length') === '0');\n if (!empty && (probe.status !== 206 || !range)) throw new Error('The file does not support bounded downloads.');\n const size = empty ? 0 : Number(range![1]);\n if (!Number.isSafeInteger(size) || size < 0) throw new Error('Invalid file size.');\n const probeBytes = await probe.arrayBuffer();\n if (probeBytes.byteLength !== (empty ? 0 : 1)) throw new Error('Invalid file response.');\n const version = probe.headers.get('etag');\n if (!version) throw new Error('The file has no version validator.');\n return {\n name: path.split(/[\\\\/]/u).at(-1) ?? '',\n mimeType: probe.headers.get('content-type')?.split(';')[0]?.trim() || 'application/octet-stream',\n size,\n signal,\n read: async (offset, count, signal) => {\n if (\n !Number.isSafeInteger(offset) ||\n !Number.isSafeInteger(count) ||\n offset < 0 ||\n count < 1 ||\n count > 1024 * 1024 ||\n offset + count > size\n )\n throw new Error('Invalid download range.');\n const end = offset + count - 1;\n const response = await load({ Range: `bytes=${offset}-${end}`, 'If-Match': version }, signal);\n if (signal.aborted) throw new Error('Download cancelled.');\n if (\n response.status !== 206 ||\n response.headers.get('etag') !== version ||\n response.headers.get('content-range') !== `bytes ${offset}-${end}/${size}`\n )\n throw new Error('The file changed or its range response is invalid.');\n const bytes = new Uint8Array(await response.arrayBuffer());\n if (signal.aborted) throw new Error('Download cancelled.');\n if (bytes.byteLength !== count) throw new Error('The file response is incomplete.');\n return bytes;\n },\n };\n}\n","/**\n * Local copy of the host's formatRunDuration (src/web/lib/sessionSummary.ts):\n * this plugin keeps zero host-lib imports so its later move into the owning\n * package is a file relocation.\n */\nconst MINUTE_MS = 60 * 1000;\nconst HOUR_MS = 60 * MINUTE_MS;\n\nexport function formatRunDuration(elapsedMs: number): string {\n if (elapsedMs < MINUTE_MS) return '<1m';\n if (elapsedMs < HOUR_MS) return `${Math.floor(elapsedMs / MINUTE_MS)}m`;\n const hours = Math.floor(elapsedMs / HOUR_MS);\n const minutes = Math.floor((elapsedMs % HOUR_MS) / MINUTE_MS);\n return `${hours}h ${String(minutes).padStart(2, '0')}m`;\n}\n","import type { WorkflowRunView } from '../../../../../types/webWorkflows';\nimport { formatRunDuration } from './runDuration';\n\nexport type WorkflowActivityTone = 'running' | 'paused' | 'failed' | 'done' | 'skipped';\n\n/** One run as the activity dock lists it: identity, a tone, and a one-liner. */\nexport interface WorkflowActivityRow {\n /** Registry identity: workspace/runKey, unique across the session's runs. */\n identity: string;\n runKey: string;\n name: string;\n tone: WorkflowActivityTone;\n elapsed: string;\n startedAt: string;\n finishedAt?: string;\n /** Where the run is right now, or how it ended. */\n detail: string;\n /** The workflow session that owns the run, when it is not the session listing it. */\n ownerSessionId?: string;\n}\n\nconst PAUSED_STATES: ReadonlySet<NonNullable<WorkflowRunView['executionState']>> = new Set([\n 'paused',\n 'pause_requested',\n]);\n\nexport function workflowRunIdentity(run: Pick<WorkflowRunView, 'workspace' | 'runKey' | 'routeKey'>): string {\n return `${run.workspace}/${run.routeKey ?? run.runKey}`;\n}\n\n/** Whether the session runs this workflow itself; a record from an older hub names no owner and means the viewer. */\nexport function ownsRun(run: Pick<WorkflowRunView, 'ownerSessionId'>, sessionId: string | null): boolean {\n return sessionId !== null && (run.ownerSessionId ?? sessionId) === sessionId;\n}\n\nfunction toneOf(run: WorkflowRunView): WorkflowActivityTone {\n if (run.stage === 'running') {\n return run.executionState !== undefined && PAUSED_STATES.has(run.executionState) ? 'paused' : 'running';\n }\n if (run.stage === 'error') return 'failed';\n if (run.outcome !== undefined && run.outcome !== 'success') return run.outcome === 'failed' ? 'failed' : 'skipped';\n return 'done';\n}\n\nfunction detailOf(run: WorkflowRunView, tone: WorkflowActivityTone): string {\n if (tone === 'paused') return 'paused; resume it from the owning session';\n if (tone === 'failed')\n return run.errorMessage ?? (run.failedJob === undefined ? 'failed' : `job '${run.failedJob}' failed`);\n if (tone === 'running') {\n if (run.position === undefined) return 'starting';\n return run.position.step === undefined ? run.position.job : `${run.position.job} · ${run.position.step}`;\n }\n return run.outcome ?? 'done';\n}\n\nfunction elapsedOf(run: WorkflowRunView, now: number): string {\n const start = Date.parse(run.startedAt);\n if (!Number.isFinite(start)) return '';\n const end = run.finishedAt === undefined ? now : Date.parse(run.finishedAt);\n return formatRunDuration(Math.max(0, (Number.isFinite(end) ? end : now) - start));\n}\n\n/** The hub's presented order is kept: it already puts live runs first. */\nexport function workflowActivityRows(\n runs: readonly WorkflowRunView[],\n now: number,\n sessionId: string | null = null,\n): WorkflowActivityRow[] {\n return runs.map((run) => {\n const tone = toneOf(run);\n return {\n identity: workflowRunIdentity(run),\n runKey: run.runKey,\n name: run.displayName,\n tone,\n elapsed: elapsedOf(run, now),\n startedAt: run.startedAt,\n finishedAt: run.finishedAt,\n detail: detailOf(run, tone),\n ...(run.ownerSessionId === undefined || run.ownerSessionId === sessionId\n ? {}\n : { ownerSessionId: run.ownerSessionId }),\n };\n });\n}\n\n/** The three answers a reader wants from the dock: what is live, what broke, what is done. */\nexport type WorkflowActivityGroupName = 'running' | 'failed' | 'successful';\n\nexport interface WorkflowActivityGroup {\n name: WorkflowActivityGroupName;\n rows: WorkflowActivityRow[];\n /**\n * Whether the group is open when the dock first draws it.\n *\n * Failures open because they are the only ones that need an answer, and a\n * folded failure is one nobody sees. Everything else stays folded so a\n * session's whole history does not push the other groups off the dock.\n */\n openByDefault: boolean;\n}\n\nconst GROUP_OF: Readonly<Record<WorkflowActivityTone, WorkflowActivityGroupName>> = {\n running: 'running',\n paused: 'running',\n failed: 'failed',\n done: 'successful',\n skipped: 'successful',\n};\n\nconst GROUP_ORDER: readonly WorkflowActivityGroupName[] = ['running', 'failed', 'successful'];\n\n/** Rows split by outcome, in the order the dock shows them; empty groups are dropped. */\nexport function workflowActivityGroups(rows: readonly WorkflowActivityRow[]): WorkflowActivityGroup[] {\n return GROUP_ORDER.map((name) => ({\n name,\n rows: rows.filter((row) => GROUP_OF[row.tone] === name),\n openByDefault: name !== 'successful',\n })).filter((group) => group.rows.length > 0);\n}\n","import type { WorkflowJobView, WorkflowProgressState, WorkflowRunView } from '../../../../../types/webWorkflows';\n\nexport const STATE_GLYPH: Readonly<Record<WorkflowProgressState, string>> = {\n pending: '○',\n running: '●',\n resumed: '●',\n completed: '✓',\n failed: '✕',\n skipped: '↷',\n pause_requested: '!',\n paused: '!',\n};\n\nexport const ACTIVE_STATES: ReadonlySet<WorkflowProgressState> = new Set([\n 'running',\n 'resumed',\n 'pause_requested',\n 'paused',\n]);\n\nexport interface RunAttention {\n kind: 'error' | 'paused' | 'stale';\n text: string;\n}\n\nexport function attentionFor(run: WorkflowRunView): RunAttention | undefined {\n if (run.stage === 'error') {\n const cause = run.errorMessage ?? 'the run ended in the error stage';\n return { kind: 'error', text: run.failedJob === undefined ? cause : `job '${run.failedJob}' failed: ${cause}` };\n }\n if (run.stale === true) {\n return { kind: 'stale', text: run.staleReason ?? 'the process that ran this workflow is gone' };\n }\n if (run.executionState === 'paused' || run.executionState === 'pause_requested') {\n return { kind: 'paused', text: 'the run is paused and will not move until it is resumed' };\n }\n return undefined;\n}\n\nexport function runState(run: WorkflowRunView): string {\n if (run.stage === 'error') return 'failed';\n if (run.executionState === 'paused' || run.executionState === 'pause_requested') return 'paused';\n if (run.stage === 'running') return 'running';\n return run.outcome ?? run.stage;\n}\n\n/** The steps moving right now, across every job, so a parallel group reads as one list. */\nexport function activeSteps(run: WorkflowRunView): { job: string; step: WorkflowJobView['steps'][number] }[] {\n return run.jobs.flatMap((job) =>\n job.steps.filter((step) => ACTIVE_STATES.has(step.status)).map((step) => ({ job: job.name, step })),\n );\n}\n\n/** The statuses the picker filters by, in the order its status row lists them. */\nexport const RUN_FILTERS = ['all', 'running', 'paused', 'failed', 'done'] as const;\nexport type RunFilter = (typeof RUN_FILTERS)[number];\n\nexport function runFilterOf(run: WorkflowRunView): Exclude<RunFilter, 'all'> {\n if (run.stage === 'error' || run.outcome === 'failed') return 'failed';\n if (run.executionState === 'paused' || run.executionState === 'pause_requested') return 'paused';\n if (run.stage === 'running') return 'running';\n return 'done';\n}\n\nexport function runPriority(run: WorkflowRunView): number {\n if (attentionFor(run) !== undefined) return 0;\n if (run.stage === 'running') return 1;\n return 2;\n}\n\nexport function runSearchText(run: WorkflowRunView): string {\n return [\n run.displayName,\n run.workflowName,\n run.stage,\n run.outcome,\n run.executionState,\n run.position?.job,\n run.position?.step,\n ]\n .filter((part): part is string => typeof part === 'string')\n .join(' ')\n .toLowerCase();\n}\n\n/** A run worth recovering: it failed, was interrupted, or its process is gone. */\nexport function canRecover(run: WorkflowRunView): boolean {\n return run.stage === 'error' || run.stale === true || run.outcome === 'failed' || run.outcome === 'interrupted';\n}\n\n/**\n * What the cockpit asks the agent when the person picks recover. Recovery takes\n * judgement (a transient cause recovers, a broken workflow does not), so it goes\n * through the agent rather than straight to the engine.\n */\nexport function recoverPrompt(run: WorkflowRunView): string {\n const call = JSON.stringify({ action: 'recover', runKey: run.runKey, workspace: run.workspace });\n return `Recover the workflow run \"${run.displayName}\" (${run.runKey}). Check why it stopped first; if the cause is transient or fixed, call workflow_run ${call}, otherwise tell me what needs fixing.`;\n}\n","import type { SessionFrameSender } from '@agimon-ai/po-core/native';\nimport { defineSessionStore } from '@agimon-ai/po-core/native';\n\nimport { WORKFLOW_RUNS_TYPE, type WorkflowRunView } from '../../../../../types/webWorkflows';\nimport { workflowRunIdentity } from './workflowActivity';\n\n/** One session's record: the hub's last report plus the run this page is looking at. */\nexport interface WorkflowsSession {\n /** The workflow runs the hub last reported; presented order preserved. */\n runs: WorkflowRunView[];\n /** The run (workspace/runKey) the workflows tab shows; the first run until someone picks. */\n focusedRun: string | undefined;\n /**\n * A launch that was sent and has not shown up yet.\n *\n * The line goes to the session, the run appears on the registry channel some\n * seconds later, and nothing connects the two but timing: the first run this\n * session did not already have is the one that was just asked for.\n */\n pendingLaunch: { workflowPath: string; knownRuns: string[] } | undefined;\n}\n\nexport const workflows = defineSessionStore<WorkflowsSession>({\n runs: [],\n focusedRun: undefined,\n pendingLaunch: undefined,\n});\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/** Points the workflows tab at one run; the activity dock uses this before opening the tab. */\nexport function focusRun(sessionId: string, identity: string | undefined): void {\n workflows.update(sessionId, (current) => ({ ...current, focusedRun: identity }));\n}\n\n/** Removes a deleted run immediately while the registry channel catches up. */\nexport function removeRun(sessionId: string, identity: string): void {\n workflows.update(sessionId, (current) => {\n const runs = current.runs.filter((run) => workflowRunIdentity(run) !== identity);\n return {\n ...current,\n runs,\n focusedRun:\n current.focusedRun === identity\n ? runs[0] === undefined\n ? undefined\n : workflowRunIdentity(runs[0])\n : current.focusedRun,\n };\n });\n}\n\n/**\n * Sends a launch line to the session and remembers what was already running.\n *\n * The cockpit's only channel to a session is a prompt frame, so a launch is\n * the verb the extension registers for exactly this; see web/launchLine.ts.\n */\nexport function requestLaunch(send: SessionFrameSender, sessionId: string, line: string, workflowPath: string): void {\n send(sessionId, { type: 'prompt', message: line });\n workflows.update(sessionId, (current) => ({\n ...current,\n pendingLaunch: { workflowPath, knownRuns: current.runs.map(workflowRunIdentity) },\n }));\n}\n\nexport interface WorkflowRunsPayload {\n runs: WorkflowRunView[];\n}\n\nconst HOST_ID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/iu;\n\n/**\n * The phone keys a session `<hostId>/<id>` while the hub names a run's owner by its bare id;\n * the owner joins the viewing session's host so ownership checks and navigation line up.\n */\nfunction onSessionHost(run: WorkflowRunView, sessionId: string): WorkflowRunView {\n const separator = sessionId.indexOf('/');\n const host = sessionId.slice(0, Math.max(0, separator));\n if (run.ownerSessionId === undefined || !HOST_ID.test(host) || run.ownerSessionId.startsWith(`${host}/`)) return run;\n return { ...run, ownerSessionId: `${host}/${run.ownerSessionId}` };\n}\n\n/** The plugin's session data channel: 'workflow_runs' payloads into the store. */\nexport const workflowRunsChannel = workflows.channel<WorkflowRunsPayload>({\n channel: WORKFLOW_RUNS_TYPE,\n parse(input) {\n if (!isRecord(input) || !Array.isArray(input.runs)) return null;\n return { runs: input.runs.filter(isRecord) as unknown as WorkflowRunView[] };\n },\n reduce: (current, payload, sessionId) => {\n const runs = payload.runs.map((run) => onSessionHost(run, sessionId));\n const pending = current.pendingLaunch;\n if (pending === undefined) return { ...current, runs };\n const known = new Set(pending.knownRuns);\n const arrived = runs.find((run) => !known.has(workflowRunIdentity(run)));\n // Until one arrives the launch stays pending: a workflow can take a while\n // to reach the registry, and forgetting it would leave the board wherever\n // the reader last was.\n if (arrived === undefined) return { ...current, runs };\n return { ...current, runs, focusedRun: workflowRunIdentity(arrived), pendingLaunch: undefined };\n },\n});\n","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 dynamicWorkflows = defineSessionStore<DynamicWorkflowSnapshot | null>(null);\n\nexport const dynamicWorkflowRunsChannel = defineSessionChannel<DynamicWorkflowSnapshot>({\n channel: DYNAMIC_WORKFLOW_CHANNEL,\n parse: parseWorkflowSnapshot,\n apply(sessionId, snapshot) {\n if (snapshot.sessionId !== sessionId) return;\n dynamicWorkflows.update(sessionId, (current) => nextWorkflowSnapshot(current, snapshot));\n },\n drop(sessionId) {\n dynamicWorkflows.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\n/** One line for the dynamic workflows a workflow step's agent started, e.g. `2 dynamic runs · 1 failed`. */\nexport function stepRunsSummary(runs: readonly DynamicWorkflowRun[]): { text: string; failed: number } {\n const running = runs.filter((run) => run.status === 'running').length;\n const failed = runs.filter((run) => run.status === 'failed').length;\n const parts = [`${runs.length} dynamic ${runs.length === 1 ? 'run' : 'runs'}`];\n if (running) parts.push(`${running} running`);\n return { text: parts.join(' · '), failed };\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 { LiveDuration } from '@agimon-ai/po-native-components';\nimport { useCallback } from 'react';\nimport type { StyleProp, TextStyle } from 'react-native';\n\nimport { formatRunDuration } from '../_lib/runDuration';\nimport { workflowDuration } from './dynamicWorkflowPresentation';\n\n/** Bare workflow durations, updated without reconciling even the text leaf. */\nexport function WorkflowDuration({\n startedAt,\n endedAt,\n now,\n seconds = false,\n running = true,\n style,\n}: {\n startedAt?: string | number;\n endedAt?: string | number;\n now?: number;\n seconds?: boolean;\n running?: boolean;\n style?: StyleProp<TextStyle>;\n}) {\n const start = typeof startedAt === 'string' ? Date.parse(startedAt) : startedAt;\n const end = typeof endedAt === 'string' ? Date.parse(endedAt) : endedAt;\n const clock = useCallback(\n (clockNow: number) => {\n const at = now ?? clockNow;\n if (start === undefined || !Number.isFinite(start)) return { text: seconds ? 'Not started' : '' };\n if (end !== undefined && !Number.isFinite(end)) return { text: '' };\n const text = seconds ? workflowDuration(start, end, at) : formatRunDuration(Math.max(0, (end ?? at) - start));\n // A pinned clock, a stopped run and a finished run all stay frozen.\n const live = now === undefined && running && end === undefined;\n return live ? { text, nextMs: seconds ? 1000 : 10_000 } : { text };\n },\n [start, end, now, seconds, running],\n );\n return <LiveDuration clock={clock} style={style} />;\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} from './dynamicWorkflowPresentation';\nimport { WorkflowDuration } from './WorkflowDuration.native';\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 <WorkflowDuration\n seconds\n style={styles.dim}\n startedAt={phase.startedAt}\n endedAt={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 <View style={styles.inline}>\n <WorkflowDuration\n seconds\n style={styles.dim}\n startedAt={run.startedAt}\n endedAt={run.finishedAt}\n running={run.status === 'running'}\n now={now}\n />\n <Text style={styles.dim}>\n {run.executionStatus !== run.status\n ? ` · Workflow execution: ${WORKFLOW_STATUS[run.executionStatus].label}`\n : ''}\n </Text>\n </View>\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 { ChevronDownIcon, ChevronRightIcon, fontOf } from '@agimon-ai/po-native-components';\nimport type { PoNativeTheme } from '@agimon-ai/po-web-components/nativeTheme';\nimport { useCallback, useState, useSyncExternalStore } from 'react';\nimport { Pressable, ScrollView, Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport { dynamicWorkflows } from '../_lib/dynamicWorkflowStore.native';\nimport { stepRunsSummary } from './dynamicWorkflowPresentation';\nimport { DynamicWorkflowView } from './DynamicWorkflowView.native';\n\nfunction useStepRuns(stepSessionId: string) {\n const subscribe = useCallback((listener: () => void) => {\n const subscription = dynamicWorkflows.store.subscribe(listener);\n return () => subscription.unsubscribe();\n }, []);\n return useSyncExternalStore(\n subscribe,\n () => dynamicWorkflows.select(dynamicWorkflows.store.state, stepSessionId)?.runs,\n );\n}\n\n/**\n * The step row's note in the native run view. Native plugins cannot hold another session's\n * channels, so it shows once the step session's frames have arrived, e.g. after opening the step.\n */\nexport function StepDynamicRunsNote({ stepSessionId }: { stepSessionId: string }) {\n const runs = useStepRuns(stepSessionId);\n if (runs === undefined || runs.length === 0) return null;\n const summary = stepRunsSummary(runs);\n return (\n <Text testID={`step-dynamic-note-${stepSessionId}`} style={styles.summary}>\n {summary.text}\n {summary.failed > 0 ? <Text style={styles.failed}> · {summary.failed} failed</Text> : null}\n </Text>\n );\n}\n\n/**\n * The dynamic workflows a customRun step's agent started, under that step's transcript. It folds\n * to one summary row; the transcript beside it already holds the step session's channels.\n */\nexport function StepDynamicRuns({\n stepSessionId,\n openSession,\n}: Pick<WebPluginSlotProps, 'openSession'> & { stepSessionId: string }) {\n const runs = useStepRuns(stepSessionId);\n const [open, setOpen] = useState(false);\n if (runs === undefined || runs.length === 0) return null;\n const summary = stepRunsSummary(runs);\n return (\n <View testID=\"step-dynamic-runs\" style={styles.section(open)}>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityState={{ expanded: open }}\n testID=\"step-dynamic-runs-toggle\"\n onPress={() => setOpen(!open)}\n style={styles.toggle}\n >\n {open ? <ChevronDownIcon size={12} color=\"faint\" /> : <ChevronRightIcon size={12} color=\"faint\" />}\n <Text style={styles.title}>Dynamic workflows</Text>\n <Text numberOfLines={1} style={styles.summary}>\n {summary.text}\n {summary.failed > 0 ? <Text style={styles.failed}> · {summary.failed} failed</Text> : null}\n </Text>\n </Pressable>\n {open ? (\n <ScrollView style={styles.runs}>\n {/* ponytail: agents live in the step session and plugins can only render the tab owner's threads,\n so this opens that session; add a cross-session thread view to open one agent. */}\n <DynamicWorkflowView runs={runs} onOpenAgent={() => openSession?.(stepSessionId)} />\n </ScrollView>\n ) : null}\n </View>\n );\n}\n\nconst styles = StyleSheet.create((theme: PoNativeTheme) => ({\n section: (open: boolean) => ({\n flex: open ? 2 : 0,\n flexShrink: open ? 1 : 0,\n borderTopWidth: 1,\n borderTopColor: theme.colors.border,\n }),\n toggle: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: theme.spacing(2),\n paddingHorizontal: theme.spacing(3),\n paddingVertical: theme.spacing(2),\n },\n title: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n fontWeight: theme.fontWeight.semibold,\n color: theme.colors.hi,\n },\n summary: {\n flexShrink: 1,\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n color: theme.colors.dim,\n },\n failed: { color: theme.colors.red },\n runs: { flex: 1 },\n}));\n","import {\n Button,\n ChevronDownIcon,\n ChevronRightIcon,\n Dot,\n EmptyState,\n FileIcon,\n FolderIcon,\n Input,\n ListRow,\n SheetList,\n StatusBadge,\n fontOf,\n} from '@agimon-ai/po-native-components';\nimport type { PoNativeTheme } from '@agimon-ai/po-web-components/nativeTheme';\nimport { type ReactNode, useState } from 'react';\nimport { FlatList, Pressable, ScrollView, Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport type { WorkflowJobView, WorkflowRunView } from '../../../../../../types/webWorkflows';\nimport type { WorkflowArtifactsResponse, WorkflowArtifactView } from '../../../../../../types/webWorkflowTerminal';\nimport { StepDynamicRunsNote } from '../../_components/StepDynamicRuns.native';\nimport { WorkflowDuration } from '../../_components/WorkflowDuration.native';\nimport { formatRunDuration } from '../../_lib/runDuration';\nimport { activeSteps, attentionFor, runState, runFilterOf, runSearchText } from '../../_lib/workflowRunPresentation';\n\nexport type WorkflowRunAction = 'stopping' | 'deleting';\ntype ViewMode = 'overview' | 'picker' | 'delete';\nconst FILTER = { all: 'All', running: 'Running', failed: 'Failed', done: 'Finished' } as const;\n\nfunction Status({ state }: { state: string }) {\n const tone =\n state === 'failed' || state === 'error'\n ? 'error'\n : state === 'completed' || state === 'success'\n ? 'ok'\n : state === 'paused' || state === 'pause_requested'\n ? 'accent'\n : state === 'running' || state === 'resumed'\n ? 'running'\n : 'neutral';\n return <StatusBadge tone={tone}>{state}</StatusBadge>;\n}\nfunction Heading({ title, count }: { title: string; count?: string }) {\n return (\n <View style={styles.section}>\n <Text accessibilityRole=\"header\" style={styles.heading}>\n {title}\n </Text>\n <Text style={styles.meta}>{count}</Text>\n </View>\n );\n}\nfunction Duration({ start, end, now }: { start?: string; end?: string; now?: number }) {\n // A pinned story clock needs no animated native clock, and keeps browser previews deterministic.\n return now === undefined ? (\n <WorkflowDuration startedAt={start} endedAt={end} style={styles.meta} />\n ) : (\n <Text style={styles.meta}>\n {start === undefined\n ? ''\n : formatRunDuration(Math.max(0, (end === undefined ? now : Date.parse(end)) - Date.parse(start)))}\n </Text>\n );\n}\nfunction Job({\n job,\n now,\n onOpen,\n}: {\n job: WorkflowJobView;\n now?: number;\n onOpen: (job: string, step: string) => void;\n}) {\n const [open, setOpen] = useState(true);\n const done = job.steps.filter((step) => step.status === 'completed' || step.status === 'skipped').length;\n return (\n <View>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={`${job.name}, ${job.status}`}\n accessibilityState={{ expanded: open }}\n onPress={() => setOpen(!open)}\n style={styles.job}\n >\n {open ? <ChevronDownIcon size={16} color=\"dim\" /> : <ChevronRightIcon size={16} color=\"dim\" />}\n <Text style={styles.name}>{job.name}</Text>\n <Text style={styles.meta}>\n {done}/{job.steps.length}\n </Text>\n <Duration start={job.startedAt} end={job.endedAt} now={now} />\n <Status state={job.status} />\n </Pressable>\n {job.reason ? <Text style={styles.reason}>{job.reason}</Text> : null}\n {open\n ? job.steps.map((step) => (\n <ListRow\n key={step.name}\n style={styles.step}\n title={step.name}\n leading={\n <Dot\n tone={\n step.status === 'failed'\n ? 'red'\n : step.status === 'running' || step.status === 'resumed'\n ? 'yellow'\n : step.status === 'completed'\n ? 'green'\n : 'muted'\n }\n />\n }\n description={\n <View>\n <Text style={styles.meta}>\n {[step.status, step.group ? `∥ ${step.group}` : undefined, step.reason].filter(Boolean).join(' · ')}\n </Text>\n {step.ref?.kind === 'session' ? <StepDynamicRunsNote stepSessionId={step.ref.id} /> : null}\n </View>\n }\n trailing={<Duration start={step.startedAt} end={step.endedAt} now={now} />}\n disabled={step.status === 'pending'}\n onPress={step.status === 'pending' ? undefined : () => onOpen(job.name, step.name)}\n />\n ))\n : null}\n </View>\n );\n}\n\n/** Shared presentation for the run's existing native artifact browser and deterministic stories. */\nexport function WorkflowArtifactList({\n listing,\n error,\n loading = false,\n onOpen,\n onParent,\n}: {\n listing?: WorkflowArtifactsResponse;\n error?: string;\n loading?: boolean;\n onOpen: (artifact: WorkflowArtifactView) => void;\n onParent?: () => void;\n}) {\n const artifacts = listing?.artifacts ?? [];\n return (\n <View style={styles.artifacts}>\n <Heading title=\"Artifacts\" count={String(artifacts.length)} />\n {onParent ? (\n <Button variant=\"ghost\" onPress={onParent}>\n Parent directory\n </Button>\n ) : null}\n {error ? (\n <Text accessibilityRole=\"alert\" style={styles.error}>\n {error}\n </Text>\n ) : null}\n {loading ? <Text style={styles.reason}>Loading artifacts…</Text> : null}\n {artifacts.map((artifact) => (\n <ListRow\n key={artifact.path}\n title={artifact.path}\n description={\n artifact.state === 'pending'\n ? 'Not written yet'\n : artifact.state === 'unreadable'\n ? 'Cannot read this output'\n : artifact.description || 'Run output'\n }\n leading={\n artifact.kind === 'directory' ? <FolderIcon size={18} color=\"dim\" /> : <FileIcon size={18} color=\"dim\" />\n }\n disabled={artifact.state === 'pending' || artifact.state === 'unreadable'}\n onPress={artifact.state === 'pending' || artifact.state === 'unreadable' ? undefined : () => onOpen(artifact)}\n />\n ))}\n {!artifacts.length && !loading && !error ? <Text style={styles.reason}>No artifacts yet.</Text> : null}\n </View>\n );\n}\n\nexport interface WorkflowDockViewProps {\n run?: WorkflowRunView;\n runs: WorkflowRunView[];\n now?: number;\n sheet?: boolean;\n dockHeader?: ReactNode;\n artifacts?: ReactNode;\n busy?: WorkflowRunAction;\n error?: string;\n canAct?: boolean;\n initialMode?: ViewMode;\n onSelectRun: (run: WorkflowRunView) => void;\n onOpenStep: (job: string, step: string) => void;\n onStop: () => void;\n onDelete: () => void;\n onLaunch: () => void;\n}\n\n/** Data and callbacks only. The host owns the sheet, navigation and API transport. */\nexport function WorkflowDockView({\n run,\n runs,\n now,\n sheet = false,\n dockHeader,\n artifacts,\n busy,\n error,\n canAct = true,\n initialMode = 'overview',\n onSelectRun,\n onOpenStep,\n onStop,\n onDelete,\n onLaunch,\n}: WorkflowDockViewProps) {\n const [mode, setMode] = useState<ViewMode>(initialMode);\n const [search, setSearch] = useState('');\n const [filter, setFilter] = useState<string>(FILTER.all);\n const visibleRuns = runs.filter(\n (item) =>\n runSearchText(item).includes(search.trim().toLowerCase()) &&\n (filter === FILTER.all ||\n (filter === FILTER.running && ['running', 'paused'].includes(runFilterOf(item))) ||\n (filter === FILTER.failed && runFilterOf(item) === 'failed') ||\n (filter === FILTER.done && runFilterOf(item) === 'done')),\n );\n const active = run ? activeSteps(run) : [];\n const attention = run ? attentionFor(run) : undefined;\n const attentionText =\n attention?.kind === 'paused'\n ? 'Waiting to be resumed.'\n : (run?.errorMessage ??\n run?.staleReason ??\n (attention?.kind === 'stale' ? 'This run is no longer reporting progress.' : attention?.text));\n const List = sheet ? SheetList<WorkflowJobView> : FlatList<WorkflowJobView>;\n const header = (\n <>\n {dockHeader}\n {run ? (\n <View style={styles.header}>\n <View style={styles.row}>\n <Text accessibilityRole=\"header\" style={styles.title}>\n {run.displayName}\n </Text>\n <Status state={runState(run)} />\n </View>\n <View style={styles.row}>\n <Text style={styles.flexMeta}>\n {[run.position?.job, run.position?.step].filter(Boolean).join(' › ') ||\n (run.stage === 'running' ? 'Starting' : run.workflowPath)}\n </Text>\n <Duration start={run.startedAt} end={run.finishedAt} now={now} />\n </View>\n {runs.length > 1 ? (\n <Button variant=\"outline\" onPress={() => setMode('picker')}>\n Switch run <ChevronDownIcon size={16} />\n </Button>\n ) : null}\n </View>\n ) : null}\n {attention ? (\n <View style={[styles.attention, attention.kind === 'paused' ? styles.ask : styles.failure]}>\n <Text style={styles.heading}>\n {attention.kind === 'error' ? 'Run failed' : attention.kind === 'stale' ? 'Progress stopped' : 'Paused'}\n </Text>\n <Text style={styles.body}>{attentionText}</Text>\n <Text style={styles.meta}>\n {attention.kind === 'paused'\n ? 'Ask the agent in this conversation to resume it.'\n : 'Ask the agent in this conversation to diagnose or recover it.'}\n </Text>\n </View>\n ) : null}\n {active.length ? (\n <>\n <Heading title=\"Active now\" count={String(active.length)} />\n {active.map(({ job, step }) => (\n <ListRow\n key={`${job}/${step.name}`}\n title={step.name}\n description={[job, step.group ? `∥ ${step.group}` : undefined].filter(Boolean).join(' · ')}\n leading={<Dot tone={step.status === 'running' || step.status === 'resumed' ? 'yellow' : 'magenta'} />}\n trailing={<Duration start={step.startedAt} end={step.endedAt} now={now} />}\n onPress={() => onOpenStep(job, step.name)}\n />\n ))}\n </>\n ) : null}\n {run ? (\n <Heading\n title=\"Jobs\"\n count={`${run.jobs.filter((job) => ['completed', 'skipped'].includes(job.status)).length}/${run.jobs.length}`}\n />\n ) : null}\n </>\n );\n const details =\n mode === 'picker' ? (\n <View style={styles.picker}>\n <View style={styles.row}>\n <Text accessibilityRole=\"header\" style={styles.title}>\n Switch run\n </Text>\n <Button variant=\"ghost\" onPress={() => setMode('overview')}>\n Done\n </Button>\n </View>\n <Input accessibilityLabel=\"Find a run\" placeholder=\"Find a run\" value={search} onChangeText={setSearch} />\n <View style={styles.filters}>\n {Object.values(FILTER).map((value) => (\n <Button\n key={value}\n variant={filter === value ? 'secondary' : 'ghost'}\n accessibilityState={{ selected: filter === value }}\n onPress={() => setFilter(value)}\n >\n {value}\n </Button>\n ))}\n </View>\n {visibleRuns.length === 0 ? (\n <EmptyState title=\"No matching runs\" description=\"Try another name or status.\" />\n ) : null}\n {visibleRuns.map((item) => (\n <ListRow\n key={`${item.workspace}/${item.routeKey ?? item.runKey}`}\n title={item.displayName}\n description={item.runKey}\n trailing={<Status state={runState(item)} />}\n selected={\n run?.workspace === item.workspace && (run.routeKey ?? run.runKey) === (item.routeKey ?? item.runKey)\n }\n onPress={() => {\n onSelectRun(item);\n setMode('overview');\n }}\n />\n ))}\n </View>\n ) : mode === 'delete' ? (\n <View style={styles.picker}>\n <Text accessibilityRole=\"header\" style={styles.title}>\n Delete this run?\n </Text>\n <Text style={styles.body}>\n This permanently removes the settled run and its directory, including logs and artifacts.\n </Text>\n <Text style={styles.meta}>{run?.displayName}</Text>\n {error ? (\n <Text accessibilityRole=\"alert\" style={styles.error}>\n {error}\n </Text>\n ) : null}\n <Button\n variant=\"danger-outline\"\n disabled={!canAct || busy !== undefined || !run || run.stage === 'running'}\n onPress={onDelete}\n >\n {busy === 'deleting' ? 'Deleting…' : 'Delete run'}\n </Button>\n <Button variant=\"ghost\" disabled={busy !== undefined} onPress={() => setMode('overview')}>\n Cancel\n </Button>\n </View>\n ) : null;\n return (\n <View style={styles.frame}>\n {details ? (\n sheet ? (\n <SheetList<never>\n embedded\n data={[]}\n renderItem={() => null}\n ListHeaderComponent={details}\n keyboardShouldPersistTaps=\"handled\"\n />\n ) : (\n <ScrollView keyboardShouldPersistTaps=\"handled\">{details}</ScrollView>\n )\n ) : (\n <>\n <List\n {...(sheet ? { embedded: true } : {})}\n style={styles.list}\n data={run?.jobs ?? []}\n keyExtractor={(job) => job.name}\n keyboardShouldPersistTaps=\"handled\"\n ListHeaderComponent={header}\n renderItem={({ item }) => (\n <Job\n key={`${run?.workspace}/${run?.routeKey ?? run?.runKey}/${item.name}`}\n job={item}\n now={now}\n onOpen={onOpenStep}\n />\n )}\n ListFooterComponent={artifacts === undefined ? undefined : <>{artifacts}</>}\n ListEmptyComponent={\n !run ? (\n <EmptyState title=\"No workflow runs\" description=\"Launch a workflow to see its progress here.\">\n <Button variant=\"primary\" disabled={!canAct} onPress={onLaunch}>\n Launch a workflow\n </Button>\n </EmptyState>\n ) : undefined\n }\n />\n {run ? (\n <View style={styles.actions}>\n {error ? (\n <Text accessibilityRole=\"alert\" style={styles.error}>\n {error}\n </Text>\n ) : null}\n <Button\n variant=\"danger-outline\"\n disabled={!canAct || busy !== undefined}\n onPress={run.stage === 'running' ? onStop : () => setMode('delete')}\n >\n {busy === 'stopping' ? 'Stopping…' : run.stage === 'running' ? 'Stop workflow' : 'Delete run…'}\n </Button>\n </View>\n ) : null}\n </>\n )}\n </View>\n );\n}\n\nconst styles = StyleSheet.create((theme: PoNativeTheme) => {\n const text = {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n color: theme.colors.text,\n };\n return {\n frame: { flex: 1, backgroundColor: theme.colors.rail },\n list: { flex: 1 },\n error: { ...text, color: theme.colors.red },\n header: {\n gap: theme.spacing(3),\n padding: theme.spacing(4),\n borderBottomWidth: StyleSheet.hairlineWidth,\n borderBottomColor: theme.colors.border,\n },\n row: { flexDirection: 'row', alignItems: 'center', gap: theme.spacing(2) },\n title: {\n ...text,\n flex: 1,\n fontSize: theme.fontSize.xl,\n lineHeight: theme.lineHeight.xl,\n fontWeight: theme.fontWeight.semibold,\n color: theme.colors.hi,\n },\n heading: {\n ...text,\n fontSize: theme.fontSize.lg,\n lineHeight: theme.lineHeight.lg,\n fontWeight: theme.fontWeight.semibold,\n color: theme.colors.hi,\n },\n name: { ...text, flex: 1, fontWeight: theme.fontWeight.semibold, color: theme.colors.hi },\n body: text,\n meta: { ...text, fontSize: theme.fontSize.sm, lineHeight: theme.lineHeight.sm, color: theme.colors.dim },\n flexMeta: { ...text, flex: 1, fontSize: theme.fontSize.sm, color: theme.colors.dim },\n section: {\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n paddingHorizontal: theme.spacing(4),\n paddingTop: theme.spacing(4),\n paddingBottom: theme.spacing(2),\n },\n job: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: theme.spacing(2),\n paddingHorizontal: theme.spacing(4),\n paddingVertical: theme.spacing(2),\n minHeight: 44,\n },\n step: { paddingLeft: theme.spacing(9) },\n reason: { ...text, color: theme.colors.dim, paddingHorizontal: theme.spacing(4), paddingBottom: theme.spacing(2) },\n attention: {\n margin: theme.spacing(3),\n padding: theme.spacing(3),\n gap: theme.spacing(2),\n borderWidth: 1,\n borderRadius: theme.borderRadius.md,\n },\n failure: { backgroundColor: theme.colors['tint-red'], borderColor: theme.colors['edge-red'] },\n ask: { backgroundColor: theme.colors['tint-magenta'], borderColor: theme.colors['edge-magenta'] },\n artifacts: { paddingBottom: theme.spacing(4) },\n actions: {\n padding: theme.spacing(4),\n borderTopWidth: StyleSheet.hairlineWidth,\n borderTopColor: theme.colors.border,\n },\n picker: { padding: theme.spacing(4), gap: theme.spacing(3) },\n filters: { flexDirection: 'row', flexWrap: 'wrap' },\n notice: { ...text, color: theme.colors.dim, padding: theme.spacing(3) },\n };\n});\n","export const DELIMITED_ROW_STEP = 20;\nexport const DELIMITED_COLUMN_STEP = 8;\n\n/** Index record boundaries and widths without allocating hidden cell strings. */\nexport function indexDelimited(text: string, delimiter: ',' | '\\t') {\n const rowStarts: number[] = text.length === 0 ? [] : [0];\n let columns = text.length === 0 ? 0 : 1;\n let width = columns;\n let quoted = false;\n let atCellStart = true;\n for (let index = 0; index < text.length; index += 1) {\n const character = text[index];\n if (quoted) {\n if (character === '\"' && text[index + 1] === '\"') index += 1;\n else if (character === '\"') quoted = false;\n } else if (character === '\"' && atCellStart) {\n quoted = true;\n atCellStart = false;\n } else if (character === delimiter) {\n width += 1;\n atCellStart = true;\n } else if (character === '\\n' || character === '\\r') {\n columns = Math.max(columns, width);\n width = 1;\n atCellStart = true;\n if (character === '\\r' && text[index + 1] === '\\n') index += 1;\n if (index + 1 < text.length) rowStarts.push(index + 1);\n } else atCellStart = false;\n }\n return { rowStarts, columns: Math.max(columns, width) };\n}\n\n/** Decode only requested records and columns. Every source record remains indexed. */\nexport function readDelimitedWindow(\n text: string,\n delimiter: ',' | '\\t',\n document: ReturnType<typeof indexDelimited>,\n rowLimit: number,\n columnLimit: number,\n): string[][] {\n return document.rowStarts.slice(0, rowLimit).map((start) => {\n const cells: string[] = [];\n let cell = '';\n let quoted = false;\n let atCellStart = true;\n for (let index = start; index < text.length; index += 1) {\n const character = text[index];\n if (quoted) {\n if (character === '\"' && text[index + 1] === '\"') {\n cell += '\"';\n index += 1;\n } else if (character === '\"') quoted = false;\n else cell += character;\n } else if (character === '\"' && atCellStart) {\n quoted = true;\n atCellStart = false;\n } else if (character === delimiter) {\n cells.push(cell);\n if (cells.length === columnLimit) return cells;\n cell = '';\n atCellStart = true;\n } else if (character === '\\n' || character === '\\r') {\n break;\n } else {\n cell += character;\n atCellStart = false;\n }\n }\n if (cells.length < columnLimit) cells.push(cell);\n return cells;\n });\n}\n","import { Button, fontOf } from '@agimon-ai/po-native-components';\nimport { memo, useMemo, useState } from 'react';\nimport { ScrollView, Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport {\n DELIMITED_COLUMN_STEP,\n DELIMITED_ROW_STEP,\n indexDelimited,\n readDelimitedWindow,\n} from '../_lib/delimitedPreview';\n\n/** Pure CSV/TSV preview shared with its design target. Labels never consume a source record. */\nexport const DelimitedArtifact = memo(function DelimitedArtifact({\n text,\n delimiter,\n initialRows = DELIMITED_ROW_STEP,\n}: {\n text: string;\n delimiter: ',' | '\\t';\n initialRows?: number;\n}) {\n const document = useMemo(() => indexDelimited(text, delimiter), [text, delimiter]);\n const [window, setWindow] = useState({ document, rows: initialRows, columns: DELIMITED_COLUMN_STEP });\n const current =\n window.document === document ? window : { document, rows: initialRows, columns: DELIMITED_COLUMN_STEP };\n // Reset before committing a changed document, rather than briefly rendering its expanded predecessor.\n if (current !== window) setWindow(current);\n const rowCount = document.rowStarts.length;\n const rows = Math.min(rowCount, current.rows);\n const columns = Math.min(document.columns, current.columns);\n const cells = useMemo(\n () => readDelimitedWindow(text, delimiter, document, rows, columns),\n [text, delimiter, document, rows, columns],\n );\n return (\n <View style={styles.body}>\n <Text style={styles.meta} accessibilityLiveRegion=\"polite\">\n Rows {rows === 0 ? 0 : 1}–{rows} of {rowCount} · Columns {columns === 0 ? 0 : 1}–{columns} of {document.columns}\n </Text>\n <Text style={styles.copy}>Scroll within the preview. Load more rows or columns when you need them.</Text>\n <ScrollView style={styles.preview} nestedScrollEnabled>\n <ScrollView horizontal>\n <View>\n <View style={styles.tableRow}>\n {Array.from({ length: columns }, (_, column) => (\n <Text key={column} selectable style={styles.cell}>\n Column {column + 1}\n </Text>\n ))}\n </View>\n {cells.map((values, row) => (\n <View key={row} style={styles.tableRow}>\n {Array.from({ length: columns }, (_, column) => (\n <Text key={column} selectable style={styles.cell}>\n {values[column] ?? ''}\n </Text>\n ))}\n </View>\n ))}\n </View>\n </ScrollView>\n </ScrollView>\n <Button\n variant=\"outline\"\n size=\"card\"\n disabled={rows === rowCount}\n onPress={() => setWindow({ ...current, rows: rows + DELIMITED_ROW_STEP })}\n >\n {rows === rowCount ? 'All rows shown' : `Show ${Math.min(DELIMITED_ROW_STEP, rowCount - rows)} more rows`}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"card\"\n disabled={columns === document.columns}\n onPress={() => setWindow({ ...current, columns: columns + DELIMITED_COLUMN_STEP })}\n >\n {columns === document.columns\n ? 'All columns shown'\n : `Show ${Math.min(DELIMITED_COLUMN_STEP, document.columns - columns)} more columns`}\n </Button>\n </View>\n );\n});\n\nconst styles = StyleSheet.create((theme) => ({\n body: { flex: 1, padding: theme.spacing(4), gap: theme.spacing(4) },\n copy: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.lg,\n lineHeight: theme.spacing(6),\n color: theme.colors.text,\n },\n meta: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.spacing(4.5),\n color: theme.colors.dim,\n },\n preview: {\n flex: 1,\n borderWidth: 1,\n borderColor: theme.colors['border-soft'],\n borderRadius: theme.borderRadius.md,\n },\n tableRow: { flexDirection: 'row' },\n cell: {\n width: theme.spacing(36),\n padding: theme.spacing(2),\n borderRightWidth: 1,\n borderBottomWidth: 1,\n borderColor: theme.colors['border-soft'],\n fontFamily: fontOf(theme.fontFamily.mono),\n fontSize: theme.fontSize.sm,\n color: theme.colors.text,\n },\n}));\n","import type { WebPluginSlotProps } from '@agimon-ai/po-core/native';\nimport {\n Badge,\n Button,\n CodeBlock,\n Input,\n ListRow,\n Markdown,\n Sheet,\n SheetBody,\n SheetContent,\n SheetHeader,\n SheetTitle,\n Textarea,\n} from '@agimon-ai/po-native-components';\nimport { useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react';\nimport { ScrollView, Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport {\n STEP_ACTIVITY_SCOPE,\n type WorkflowCatalogEntryView,\n type WorkflowRunView,\n} from '../../../../../types/webWorkflows';\nimport type {\n WorkflowArtifactContentResponse,\n WorkflowArtifactsResponse,\n WorkflowTerminalCapabilitiesView,\n} from '../../../../../types/webWorkflowTerminal';\nimport { catalog, closeCatalog, filterCatalog, openCatalog } from '../_lib/catalogStore.native';\nimport {\n initialChoice,\n initialCommand,\n initialInputs,\n initialRunner,\n launchProblems,\n workflowLaunchLine,\n} from '../_lib/launchLine';\nimport {\n deleteWorkflowRun,\n fetchArtifact,\n fetchArtifactMedia,\n prepareArtifactSave,\n finiteScreenReader,\n fetchArtifacts,\n readScreen,\n releaseControl,\n resizeRun,\n sendKeys,\n takeControl,\n stopWorkflowRun,\n} from '../_lib/terminalApi.native';\nimport { workflowRunIdentity } from '../_lib/workflowActivity';\nimport { runPriority } from '../_lib/workflowRunPresentation';\nimport { focusRun, removeRun, requestLaunch, workflows } from '../_lib/workflowsStore.native';\nimport {\n WorkflowDockView,\n WorkflowArtifactList,\n type WorkflowRunAction,\n} from '../dock/_components/WorkflowDockView.native';\nimport { DelimitedArtifact } from './DelimitedArtifact.native';\nimport { StepDynamicRuns } from './StepDynamicRuns.native';\n\nexport function useWorkflows(sessionId: string | null) {\n const subscribe = useCallback((listener: () => void) => {\n const sub = workflows.store.subscribe(listener);\n return () => sub.unsubscribe();\n }, []);\n return useSyncExternalStore(subscribe, () => workflows.select(workflows.store.state, sessionId));\n}\nexport function workflowTab(run: WorkflowRunView): Parameters<WebPluginSlotProps['openTransientTab']>[0] {\n const identity = workflowRunIdentity(run);\n return {\n id: `workflows-run-${run.workspace}-${run.routeKey ?? run.runKey}`.replace(/[^\\w-]+/g, '-'),\n label: run.displayName,\n retainComposer: true,\n panel: (props) => <WorkflowPanel {...props} identity={identity} />,\n };\n}\n/** The Workflows card's screen: the focused run, else the newest one. */\nexport function workflowsTab(): Parameters<WebPluginSlotProps['openTransientTab']>[0] {\n return { id: 'workflows-runs', label: 'Workflows', retainComposer: true, panel: WorkflowPanel };\n}\nexport function WorkflowLauncher(props: WebPluginSlotProps) {\n const subscribe = useCallback((listener: () => void) => {\n const sub = catalog.store.subscribe(listener);\n return () => sub.unsubscribe();\n }, []);\n const state = useSyncExternalStore(subscribe, () => catalog.select(catalog.store.state, props.sessionId));\n const [filter, setFilter] = useState('');\n const [selected, setSelected] = useState<string>();\n if (props.sessionId === null || !state.open) return null;\n const workflow = state.workflows.find((item) => item.path === selected);\n return (\n <Sheet\n open\n onOpenChange={(open) => {\n if (!open) {\n closeCatalog(props.sessionId!);\n setSelected(undefined);\n }\n }}\n >\n <SheetContent>\n <SheetHeader>\n <SheetTitle>{workflow ? `Launch ${workflow.name}` : 'Launch a workflow'}</SheetTitle>\n </SheetHeader>\n <SheetBody>\n {workflow ? (\n <WorkflowLaunch\n key={workflow.path}\n {...props}\n sessionId={props.sessionId}\n workflow={workflow}\n initialPrompt={state.prompt}\n onClose={() => {\n closeCatalog(props.sessionId!);\n setSelected(undefined);\n }}\n />\n ) : (\n <View style={styles.body}>\n <Input\n accessibilityLabel=\"Find a workflow\"\n value={filter}\n onChangeText={setFilter}\n placeholder=\"Find a workflow\"\n />\n {state.warning ? <Text style={styles.error}>{state.warning}</Text> : null}\n {filterCatalog(state.workflows, filter).map((item) => (\n <ListRow\n key={item.path}\n title={item.name || item.relativePath}\n // ListRow shows two lines; the tags and jobs line never fit under a real description.\n description={\n item.error !== undefined ? (\n <Text style={styles.error}>{item.error}</Text>\n ) : (\n item.description || item.jobs.map((job) => job.name).join(', ')\n )\n }\n disabled={item.error !== undefined}\n onPress={() => {\n if (item.error === undefined) setSelected(item.path);\n }}\n />\n ))}\n {state.workflows.length === 0 ? <Text style={styles.meta}>No workflows reported yet.</Text> : null}\n </View>\n )}\n </SheetBody>\n </SheetContent>\n </Sheet>\n );\n}\nfunction Choice({\n label,\n options,\n value,\n onChange,\n}: {\n label: string;\n options: readonly string[];\n value: string | undefined;\n onChange: (value: string) => void;\n}) {\n return (\n <View>\n <Text style={styles.meta}>{label}</Text>\n {options.map((option) => (\n <Button\n key={option}\n variant=\"outline\"\n accessibilityState={{ selected: value === option }}\n onPress={() => onChange(option)}\n >\n {option}\n </Button>\n ))}\n </View>\n );\n}\nfunction WorkflowLaunch({\n sessionId,\n workflow,\n initialPrompt,\n sendSessionFrame,\n onClose,\n}: WebPluginSlotProps & {\n sessionId: string;\n workflow: WorkflowCatalogEntryView;\n initialPrompt: string;\n onClose: () => void;\n}) {\n const [prompt, setPrompt] = useState(initialPrompt);\n const [inputs, setInputs] = useState(() => initialInputs(workflow));\n const [runner, setRunner] = useState(() => initialRunner(workflow));\n const [command, setCommand] = useState(() => initialCommand(workflow));\n const [choice, setChoice] = useState(() => initialChoice(workflow));\n const [error, setError] = useState<string>();\n const request = {\n workflow: workflow.name || workflow.relativePath,\n inputs,\n runner,\n command,\n choice,\n ...(prompt.trim() === '' ? {} : { prompt: prompt.trim() }),\n };\n const problems = [...launchProblems(workflow, request), ...(workflow.error === undefined ? [] : [workflow.error])];\n const line = workflowLaunchLine(request);\n return (\n <View style={styles.body}>\n <Text style={styles.meta}>{workflow.description}</Text>\n <Textarea\n accessibilityLabel=\"Workflow prompt\"\n placeholder=\"What should this workflow do?\"\n value={prompt}\n onChangeText={setPrompt}\n />\n {workflow.inputs.map((input) => {\n const options = input.options ?? (input.type === 'boolean' ? ['true', 'false'] : undefined);\n return (\n <View key={input.name}>\n <Text style={styles.meta}>\n {input.name}\n {input.required ? ' (required)' : ''} · {input.description}\n </Text>\n {options ? (\n <Choice\n label={input.name}\n options={options}\n value={inputs[input.name]}\n onChange={(value) => setInputs((current) => ({ ...current, [input.name]: value }))}\n />\n ) : (\n <Input\n accessibilityLabel={input.name}\n value={inputs[input.name] ?? ''}\n onChangeText={(value) => setInputs((current) => ({ ...current, [input.name]: value }))}\n />\n )}\n </View>\n );\n })}\n {workflow.runners?.length ? (\n <Choice label=\"Runner\" options={workflow.runners} value={runner} onChange={setRunner} />\n ) : null}\n {workflow.commands?.length ? (\n <Choice label=\"Command\" options={workflow.commands} value={command} onChange={setCommand} />\n ) : null}\n {workflow.choices?.length ? (\n <Choice label=\"Choice\" options={workflow.choices} value={choice} onChange={setChoice} />\n ) : null}\n <CodeBlock text={line} />\n {problems.map((problem) => (\n <Text key={problem} style={styles.meta}>\n {problem}\n </Text>\n ))}\n {error ? <Text style={styles.error}>{error}</Text> : null}\n <Button\n testID=\"launch-workflow-submit\"\n disabled={problems.length > 0}\n onPress={() => {\n if (problems.length > 0) return;\n try {\n requestLaunch(sendSessionFrame, sessionId, line, workflow.path);\n onClose();\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : String(cause));\n }\n }}\n >\n Launch\n </Button>\n </View>\n );\n}\n\nexport function WorkflowPanel(props: WebPluginSlotProps & { identity?: string }) {\n const state = useWorkflows(props.sessionId);\n const identity = props.identity ?? state.focusedRun;\n const run =\n state.runs.find((item) => workflowRunIdentity(item) === identity) ??\n (props.identity === undefined ? state.runs[0] : undefined);\n if (props.identity !== undefined && !run) return <Text style={styles.meta}>This run is no longer listed.</Text>;\n return (\n <WorkflowRunPanel\n key={JSON.stringify([props.sessionId, run && workflowRunIdentity(run)])}\n {...props}\n run={run}\n runs={state.runs}\n onSelectRun={(item) => {\n if (props.sessionId !== null) focusRun(props.sessionId, workflowRunIdentity(item));\n props.openTransientTab(workflowTab(item));\n }}\n />\n );\n}\n\n/** One action/navigation controller, shared by transient run screens and the Workflow dock. */\nexport function WorkflowRunPanel(\n props: WebPluginSlotProps & {\n run?: WorkflowRunView;\n runs: WorkflowRunView[];\n sheet?: boolean;\n onSelectRun: (run: WorkflowRunView) => void;\n },\n) {\n const { run, sessionId } = props;\n const [busy, setBusy] = useState<WorkflowRunAction>();\n const [error, setError] = useState<string>();\n const operation = useRef<{ kind: WorkflowRunAction } | undefined>(undefined);\n const mounted = useRef(true);\n useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n };\n }, []);\n useEffect(() => {\n if (run?.stage !== 'running' && operation.current?.kind === 'stopping') {\n operation.current = undefined;\n setBusy(undefined);\n }\n }, [run?.stage]);\n const runs = useMemo(\n () => [...props.runs].sort((left, right) => runPriority(left) - runPriority(right)),\n [props.runs],\n );\n const act = async (kind: WorkflowRunAction, action: () => Promise<void>) => {\n if (operation.current || !run || sessionId === null) return;\n const token = { kind };\n operation.current = token;\n setBusy(kind);\n setError(undefined);\n try {\n await action();\n if (kind === 'deleting' && mounted.current && operation.current === token) {\n operation.current = undefined;\n setBusy(undefined);\n }\n // An accepted stop stays pending until the registry channel settles the run.\n } catch (cause) {\n if (mounted.current && operation.current === token) {\n operation.current = undefined;\n setBusy(undefined);\n setError(cause instanceof Error ? cause.message : String(cause));\n }\n }\n };\n return (\n <WorkflowDockView\n run={run}\n runs={runs}\n sheet={props.sheet}\n dockHeader={props.dockHeader}\n busy={busy}\n error={error}\n canAct={sessionId !== null}\n onSelectRun={props.onSelectRun}\n onLaunch={() => {\n if (sessionId !== null) openCatalog(sessionId);\n }}\n onOpenStep={(job, step) => {\n const target = run?.jobs.find((item) => item.name === job)?.steps.find((item) => item.name === step);\n if (!run || !target || target.status === 'pending') return;\n props.openTransientTab(stepTab(run, job, step, sessionId));\n }}\n artifacts={\n run ? (\n <WorkflowArtifacts key={JSON.stringify([sessionId, workflowRunIdentity(run)])} {...props} run={run} />\n ) : undefined\n }\n onStop={() => {\n if (!run || run.stage !== 'running') return;\n void act('stopping', async () => {\n const result = await stopWorkflowRun(run.workspace, run.routeKey ?? run.runKey, sessionId);\n if ('error' in result) throw new Error(result.error);\n });\n }}\n onDelete={() => {\n if (!run || run.stage === 'running') return;\n void act('deleting', async () => {\n const result = await deleteWorkflowRun(run.workspace, run.routeKey ?? run.runKey, sessionId);\n if ('error' in result) throw new Error(result.error);\n if (sessionId !== null) removeRun(sessionId, workflowRunIdentity(run));\n props.closeTransientTab(workflowTab(run).id);\n });\n }}\n />\n );\n}\nfunction stepTab(\n run: WorkflowRunView,\n job: string,\n step?: string,\n ownerSessionId: string | null = null,\n): Parameters<WebPluginSlotProps['openTransientTab']>[0] {\n const workspace = run.workspace;\n const runKey = run.routeKey ?? run.runKey;\n const steps = run.jobs.find((item) => item.name === job)?.steps;\n const target = step === undefined ? steps?.at(-1) : steps?.find((item) => item.name === step);\n const session = target?.ref?.kind === 'session' ? target.ref.id : undefined;\n const live = session !== undefined && run.stage === 'running' && target?.status === 'running';\n const tabId = `workflows-step-${workspace}-${runKey}-${job}${step === undefined ? '' : `-${step}`}`.replace(\n /[^\\w-]+/g,\n '-',\n );\n return {\n targetSessionId: session,\n activityScope: STEP_ACTIVITY_SCOPE,\n retainComposer: live,\n id: tabId,\n label: `${run.displayName} › ${step ?? job}`,\n panel: (props) => (\n <WorkflowStep\n {...props}\n tabId={tabId}\n sessionId={ownerSessionId}\n workspace={workspace}\n runKey={runKey}\n job={job}\n step={step}\n />\n ),\n };\n}\nfunction WorkflowStep({\n sessionId,\n workspace,\n runKey,\n job,\n step,\n renderSessionTranscript,\n renderRunnerTerminal,\n setTransientTabSession,\n openSession,\n tabId,\n}: WebPluginSlotProps & { workspace: string; runKey: string; job: string; step?: string; tabId: string }) {\n const state = useWorkflows(sessionId);\n const run = state.runs.find((item) => item.workspace === workspace && (item.routeKey ?? item.runKey) === runKey);\n const steps = run?.jobs.find((item) => item.name === job)?.steps;\n const target = step === undefined ? steps?.at(-1) : steps?.find((item) => item.name === step);\n const ref = target?.ref;\n const session = ref?.kind === 'session' ? ref.id : undefined;\n const live = session !== undefined && run?.stage === 'running' && target?.status === 'running';\n useEffect(() => {\n setTransientTabSession?.(tabId, session, live);\n }, [setTransientTabSession, tabId, live, session]);\n return (\n <View style={styles.screen}>\n <Text style={styles.title}>\n {job}\n {step === undefined ? '' : ` › ${step}`} · {target?.status}\n </Text>\n {session ? (\n <>\n {renderSessionTranscript?.(session)}\n <StepDynamicRuns stepSessionId={session} openSession={openSession} />\n </>\n ) : (\n <WorkflowTerminal\n key={`${sessionId}:${workspace}:${runKey}:${ref?.id ?? ''}`}\n sessionId={sessionId}\n workspace={workspace}\n runKey={runKey}\n pane={ref?.kind === 'pane' ? ref.id : undefined}\n renderRunnerTerminal={renderRunnerTerminal}\n />\n )}\n </View>\n );\n}\nfunction WorkflowTerminal({\n sessionId,\n workspace,\n runKey,\n pane,\n renderRunnerTerminal,\n}: Pick<WebPluginSlotProps, 'sessionId' | 'renderRunnerTerminal'> & {\n workspace: string;\n runKey: string;\n pane?: string;\n}) {\n const [capabilities, setCapabilities] = useState<WorkflowTerminalCapabilitiesView>();\n const [token, setToken] = useState<string>();\n const [notice, setNotice] = useState<string>();\n const [columns, setColumns] = useState('80');\n const [rows, setRows] = useState('24');\n const [busy, setBusy] = useState(false);\n const [lifetime] = useState(() => new AbortController());\n useEffect(() => () => lifetime.abort(), [lifetime]);\n useEffect(() => {\n if (token === undefined) return;\n return () => {\n // Best effort on unmount: the panel is gone, so there is nobody to tell. The server-side\n // control lease expires on its own (workflowTerminal leaseMs), which frees the terminal anyway.\n void releaseControl(workspace, runKey, token, sessionId, pane).catch(() => undefined);\n };\n }, [workspace, runKey, token, sessionId, pane]);\n const request = useMemo(\n () => ({\n key: `${sessionId}:${workspace}:${runKey}:${pane ?? ''}`,\n read: finiteScreenReader(async (signal) => {\n const frame = await readScreen(workspace, runKey, sessionId, pane, signal);\n if (!signal.aborted && !lifetime.signal.aborted) setCapabilities(frame.capabilities);\n return frame;\n }),\n write: async (text: string) => {\n if (token === undefined) throw new Error('Take control before typing into this run.');\n const result = await sendKeys(workspace, runKey, token, text, sessionId, pane);\n if (result.error) {\n if (!lifetime.signal.aborted) {\n setNotice(result.error);\n setToken(undefined);\n }\n throw new Error(result.error);\n }\n },\n }),\n [sessionId, workspace, runKey, pane, token, lifetime],\n );\n const arm = async () => {\n setBusy(true);\n try {\n const grant = await takeControl(workspace, runKey, undefined, sessionId, pane);\n if (lifetime.signal.aborted) {\n if (grant.held && grant.token) await releaseControl(workspace, runKey, grant.token, sessionId, pane);\n return;\n }\n if (grant.held && grant.token) {\n setToken(grant.token);\n setNotice(undefined);\n } else setNotice(grant.reason ?? 'The keyboard is not available for this run.');\n } catch (cause) {\n if (!lifetime.signal.aborted) setNotice(cause instanceof Error ? cause.message : String(cause));\n } finally {\n if (!lifetime.signal.aborted) setBusy(false);\n }\n };\n return (\n <View style={styles.transcript}>\n <Badge>{token ? 'keyboard yours' : 'watching'}</Badge>\n {capabilities?.writable ? (\n <Button\n variant=\"outline\"\n disabled={busy}\n onPress={() => {\n if (token) setToken(undefined);\n else void arm();\n }}\n >\n {token ? 'Release keyboard' : 'Take control'}\n </Button>\n ) : null}\n <View style={styles.transcript}>{renderRunnerTerminal?.(request)}</View>\n {capabilities?.reason ? <Text style={styles.meta}>{capabilities.reason}</Text> : null}\n {token && capabilities?.resizable ? (\n <View>\n <Input\n accessibilityLabel=\"Terminal columns\"\n keyboardType=\"number-pad\"\n value={columns}\n onChangeText={setColumns}\n />\n <Input accessibilityLabel=\"Terminal rows\" keyboardType=\"number-pad\" value={rows} onChangeText={setRows} />\n <Button\n variant=\"outline\"\n disabled={\n !Number.isInteger(Number(columns)) ||\n !Number.isInteger(Number(rows)) ||\n Number(columns) < 1 ||\n Number(rows) < 1\n }\n onPress={() => {\n void resizeRun(workspace, runKey, token, Number(columns), Number(rows), sessionId, pane).catch(\n (cause: unknown) => {\n if (!lifetime.signal.aborted) setNotice(cause instanceof Error ? cause.message : String(cause));\n },\n );\n }}\n >\n Resize terminal\n </Button>\n </View>\n ) : null}\n {notice ? <Text style={styles.meta}>{notice}</Text> : null}\n </View>\n );\n}\nfunction WorkflowArtifacts(props: WebPluginSlotProps & { run: WorkflowRunView }) {\n const { run, sessionId, openTransientTab } = props;\n const [directory, setDirectory] = useState<string>();\n const requestKey = JSON.stringify([sessionId, run.workspace, run.routeKey ?? run.runKey, directory, run.stage]);\n const [loaded, setLoaded] = useState<{ key: string; listing?: WorkflowArtifactsResponse; error?: string }>();\n const current = loaded?.key === requestKey ? loaded : undefined;\n const listing = current?.listing;\n const error = current?.error;\n useEffect(() => {\n let active = true;\n void fetchArtifacts(run.workspace, run.routeKey ?? run.runKey, sessionId, directory)\n .then((result) => {\n if (active) {\n setLoaded(\n 'error' in result\n ? { key: requestKey, error: result.error }\n : { key: requestKey, listing: result.artifacts },\n );\n }\n })\n .catch((cause: unknown) => {\n if (active) setLoaded({ key: requestKey, error: cause instanceof Error ? cause.message : String(cause) });\n });\n return () => {\n active = false;\n };\n }, [run.workspace, run.runKey, run.routeKey, sessionId, directory, run.stage, requestKey]);\n return (\n <WorkflowArtifactList\n listing={listing}\n error={error}\n loading={listing === undefined && error === undefined}\n onParent={\n directory === undefined\n ? undefined\n : () => setDirectory(directory.includes('/') ? directory.slice(0, directory.lastIndexOf('/')) : undefined)\n }\n onOpen={(item) => {\n if (item.state === 'pending' || item.state === 'unreadable') return;\n if (item.kind === 'directory') setDirectory(item.path);\n else {\n const workspace = run.workspace;\n const runKey = run.routeKey ?? run.runKey;\n const path = item.path;\n openTransientTab({\n id: `workflows-artifact-${workspace}-${runKey}-${path}`.replace(/[^\\w-]+/g, '-'),\n label: path,\n panel: (panelProps) => (\n <ArtifactPreview {...panelProps} workspace={workspace} runKey={runKey} path={path} />\n ),\n });\n }\n }}\n />\n );\n}\nexport function ArtifactPreview({\n sessionId,\n workspace,\n runKey,\n path,\n renderFilePreview,\n renderMediaPreview,\n nativeSaveFile,\n}: WebPluginSlotProps & { workspace: string; runKey: string; path: string }) {\n const [content, setContent] = useState<WorkflowArtifactContentResponse>();\n const [error, setError] = useState<string>();\n const [raw, setRaw] = useState(false);\n useEffect(() => {\n let active = true;\n void fetchArtifact(workspace, runKey, path, sessionId)\n .then((result) => {\n if (active) {\n if ('error' in result) setError(result.error);\n else setContent(result.artifact);\n }\n })\n .catch((cause: unknown) => {\n if (active) setError(cause instanceof Error ? cause.message : String(cause));\n });\n return () => {\n active = false;\n };\n }, [workspace, runKey, path, sessionId]);\n const downloadController = useRef<AbortController | undefined>(undefined);\n const [saving, setSaving] = useState(false);\n const [saveNote, setSaveNote] = useState<string>();\n useEffect(() => () => downloadController.current?.abort(), [workspace, runKey, path, sessionId]);\n const download = async () => {\n if (!nativeSaveFile || saving) return;\n const controller = new AbortController();\n downloadController.current = controller;\n setSaving(true);\n try {\n await nativeSaveFile(await prepareArtifactSave(workspace, runKey, path, sessionId, controller.signal));\n if (!controller.signal.aborted) setSaveNote('Saved.');\n } catch (error: unknown) {\n if (!controller.signal.aborted) setSaveNote(error instanceof Error ? error.message : String(error));\n } finally {\n setSaving(false);\n }\n };\n const delimited = !raw && content?.text !== undefined && /\\.(csv|tsv)$/i.test(path);\n const preview = (\n <>\n <Text style={styles.title}>{path}</Text>\n <Button variant=\"outline\" disabled={!nativeSaveFile || saving} onPress={() => void download()}>\n Download\n </Button>\n {saving ? (\n <Button variant=\"ghost\" onPress={() => downloadController.current?.abort()}>\n Cancel download\n </Button>\n ) : null}\n {saveNote ? <Text style={styles.meta}>{saveNote}</Text> : null}\n {error ? <Text style={styles.error}>{error}</Text> : null}\n {content?.text !== undefined ? (\n <>\n <Button variant=\"outline\" onPress={() => setRaw((value) => !value)}>\n {raw ? 'Preview' : 'Raw source'}\n </Button>\n {!raw && /\\.(md|markdown)$/i.test(path) ? (\n <Markdown text={content.text} />\n ) : !raw && /\\.(html|htm)$/i.test(path) ? (\n renderFilePreview?.({ key: `${sessionId}:${workspace}:${runKey}:${path}`, html: content.text, title: path })\n ) : !raw && /\\.(csv|tsv)$/i.test(path) ? (\n <DelimitedArtifact text={content.text} delimiter={/\\.csv$/i.test(path) ? ',' : '\\t'} />\n ) : (\n <CodeBlock text={!raw && /\\.json$/i.test(path) ? prettyJson(content.text) : content.text} />\n )}\n {content.truncated ? <Text style={styles.meta}>This preview was truncated.</Text> : null}\n </>\n ) : content ? (\n <BinaryArtifactPreview\n sessionId={sessionId}\n workspace={workspace}\n runKey={runKey}\n path={path}\n renderMediaPreview={renderMediaPreview}\n />\n ) : (\n <Text style={styles.meta}>Loading preview…</Text>\n )}\n </>\n );\n return delimited ? (\n <View style={[styles.body, styles.transcript]}>{preview}</View>\n ) : (\n <ScrollView contentContainerStyle={styles.body}>{preview}</ScrollView>\n );\n}\nfunction BinaryArtifactPreview({\n sessionId,\n workspace,\n runKey,\n path,\n renderMediaPreview,\n}: Pick<WebPluginSlotProps, 'sessionId' | 'renderMediaPreview'> & { workspace: string; runKey: string; path: string }) {\n const requestKey = JSON.stringify([sessionId, workspace, runKey, path]);\n const [loaded, setLoaded] = useState<{ key: string; media?: { data: string; mimeType: string }; error?: string }>();\n const media = loaded?.key === requestKey ? loaded.media : undefined;\n const error = loaded?.key === requestKey ? loaded.error : undefined;\n useEffect(() => {\n const controller = new AbortController();\n void fetchArtifactMedia(workspace, runKey, path, sessionId, controller.signal)\n .then((value) => {\n if (!controller.signal.aborted) setLoaded({ key: requestKey, media: value });\n })\n .catch((cause: unknown) => {\n if (!controller.signal.aborted)\n setLoaded({ key: requestKey, error: cause instanceof Error ? cause.message : String(cause) });\n });\n return () => controller.abort();\n }, [workspace, runKey, path, sessionId, requestKey]);\n return media ? (\n renderMediaPreview?.({ key: `${sessionId}:${workspace}:${runKey}:${path}`, ...media, title: path, path })\n ) : (\n <Text style={styles.meta}>{error ?? 'Loading preview…'}</Text>\n );\n}\nfunction prettyJson(text: string): string {\n try {\n return JSON.stringify(JSON.parse(text) as unknown, null, 2);\n } catch {\n return text;\n }\n}\nconst styles = StyleSheet.create((theme) => ({\n screen: { flex: 1, backgroundColor: theme.colors.bg, padding: theme.spacing(3) },\n transcript: { flex: 1 },\n body: { padding: theme.spacing(3), gap: theme.spacing(2) },\n title: { color: theme.colors.hi, fontSize: theme.fontSize.base, fontWeight: '600' },\n meta: { color: theme.colors.dim, fontSize: theme.fontSize.sm },\n error: { color: theme.colors.red, fontSize: theme.fontSize.sm },\n}));\n","import { defineActivityGroup } from '@agimon-ai/po-core/native';\nimport { WorkflowIcon } from '@agimon-ai/po-native-components';\nimport { createElement } from 'react';\n\nimport { workflowsTab } from '../_components/WorkflowPanel.native';\nimport { dynamicWorkflows } from '../_lib/dynamicWorkflowStore.native';\nimport { workflows } from '../_lib/workflowsStore.native';\nexport default defineActivityGroup({\n keys: 'w r',\n icon: () => createElement(WorkflowIcon),\n widgetKeys: ['workflow-mcp-progress', 'workflow-mcp-follow'],\n order: 30,\n transientTab: workflowsTab,\n // Lit while a YAML run or a dynamic workflow of this session is running.\n activeSource: {\n subscribe(listener) {\n const runs = workflows.store.subscribe(listener);\n const dynamic = dynamicWorkflows.store.subscribe(listener);\n return () => {\n runs.unsubscribe();\n dynamic.unsubscribe();\n };\n },\n isActive(sessionId) {\n return (\n workflows.select(workflows.store.state, sessionId).runs.some((run) => run.stage === 'running') ||\n (dynamicWorkflows\n .select(dynamicWorkflows.store.state, sessionId)\n ?.runs.some((run) => run.status === 'running') ??\n false)\n );\n },\n },\n});\n","import { defineChannelFile } from '@agimon-ai/po-core/native';\n\nimport { dynamicWorkflowRunsChannel } from '../_lib/dynamicWorkflowStore.native';\n\nexport default defineChannelFile(dynamicWorkflowRunsChannel);\n","import { defineChannelFile } from '@agimon-ai/po-core/native';\n\nimport { workflowCatalogChannel } from '../_lib/catalogStore.native';\nexport default defineChannelFile(workflowCatalogChannel);\n","import { defineChannelFile } from '@agimon-ai/po-core/native';\n\nimport { workflowRunsChannel } from '../_lib/workflowsStore.native';\nexport default defineChannelFile(workflowRunsChannel);\n","import type { WebPluginSlotProps } from '@agimon-ai/po-core/native';\n\nimport { useWorkflows, WorkflowRunPanel } from '../../_components/WorkflowPanel.native';\nimport { ownsRun, workflowRunIdentity } from '../../_lib/workflowActivity';\nimport { focusRun } from '../../_lib/workflowsStore.native';\n\nexport function WorkflowDockPanel(props: WebPluginSlotProps) {\n const state = useWorkflows(props.sessionId);\n const runs = state.runs.filter((run) => ownsRun(run, props.sessionId));\n const run = runs.find((item) => workflowRunIdentity(item) === state.focusedRun) ?? runs[0];\n return (\n <WorkflowRunPanel\n key={JSON.stringify([props.sessionId, run && workflowRunIdentity(run)])}\n {...props}\n run={run}\n runs={runs}\n sheet\n onSelectRun={(item) => {\n if (props.sessionId !== null && ownsRun(item, props.sessionId))\n focusRun(props.sessionId, workflowRunIdentity(item));\n }}\n />\n );\n}\n","import { defineDockFace } from '@agimon-ai/po-core/native';\n\nimport { ownsRun } from '../_lib/workflowActivity';\nimport { workflows } from '../_lib/workflowsStore.native';\nimport { WorkflowDockPanel } from './_components/WorkflowDockPanel.native';\n\nexport default defineDockFace({\n id: 'workflow',\n label: 'Workflow',\n order: 20,\n ownsScroll: true,\n panel: WorkflowDockPanel,\n visibility: {\n subscribe(listener: () => void) {\n const subscription = workflows.store.subscribe(listener);\n return () => subscription.unsubscribe();\n },\n isVisible(sessionId: string | null) {\n return workflows.select(workflows.store.state, sessionId).runs.some((run) => ownsRun(run, sessionId));\n },\n },\n});\n","import { defineFill } from '@agimon-ai/po-core/native';\n\nimport { WorkflowLauncher } from '../_components/WorkflowPanel.native';\nexport default defineFill({ component: WorkflowLauncher });\n","import type { WebPluginSlotProps } from '@agimon-ai/po-core/native';\nimport { useCallback, useSyncExternalStore } from 'react';\n\nimport type { DynamicWorkflowRun } from '../../../../../types/dynamicWorkflow';\nimport { dynamicWorkflows } from '../_lib/dynamicWorkflowStore.native';\nimport { 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\nexport function useDynamicWorkflows(sessionId: string | null) {\n const subscribe = useCallback((listener: () => void) => {\n const subscription = dynamicWorkflows.store.subscribe(listener);\n return () => subscription.unsubscribe();\n }, []);\n return useSyncExternalStore(subscribe, () => dynamicWorkflows.select(dynamicWorkflows.store.state, sessionId));\n}\n\nexport function DynamicWorkflowPanel({ sessionId, openTransientTab }: WebPluginSlotProps) {\n const snapshot = useDynamicWorkflows(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 type { WebPluginSlotProps } from '@agimon-ai/po-core/native';\nimport { ArrowRightIcon, Button, Dot, fontOf, ListRow } from '@agimon-ai/po-native-components';\nimport type { PoNativeTheme } from '@agimon-ai/po-web-components/nativeTheme';\nimport { useState } from 'react';\nimport { Pressable, Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport { dynamicWorkflowTab, useDynamicWorkflows } from '../../_components/DynamicWorkflowPanel.native';\nimport { DynamicWorkflowActivity } from '../../_components/DynamicWorkflowView.native';\nimport { WorkflowDuration } from '../../_components/WorkflowDuration.native';\nimport { useWorkflows, workflowTab } from '../../_components/WorkflowPanel.native';\nimport { openCatalog } from '../../_lib/catalogStore.native';\nimport {\n workflowActivityGroups,\n workflowActivityRows,\n type WorkflowActivityGroupName,\n} from '../../_lib/workflowActivity';\nimport { focusRun } from '../../_lib/workflowsStore.native';\n\nexport function WorkflowsActivitySection({ sessionId, openSession, openTransientTab }: WebPluginSlotProps) {\n const state = useWorkflows(sessionId);\n const dynamicRuns = useDynamicWorkflows(sessionId)?.runs ?? [];\n const [openedAt] = useState(Date.now);\n const [folded, setFolded] = useState<Partial<Record<WorkflowActivityGroupName, boolean>>>({});\n\n const groups = workflowActivityGroups(workflowActivityRows(state.runs, openedAt, sessionId));\n return (\n <View>\n {groups.map((group) => {\n const open = folded[group.name] ?? group.openByDefault;\n return (\n <View key={group.name}>\n <Button\n variant=\"ghost\"\n accessibilityState={{ expanded: open }}\n onPress={() => setFolded((current) => ({ ...current, [group.name]: !open }))}\n >\n {group.name} · {group.rows.length}\n </Button>\n {open\n ? group.rows.map((row) => (\n <ListRow\n key={row.identity}\n leading={\n <Dot\n tone={\n row.tone === 'failed'\n ? 'red'\n : row.tone === 'running' || row.tone === 'paused'\n ? 'yellow'\n : row.tone === 'done'\n ? 'green'\n : 'muted'\n }\n />\n }\n title={\n <Button\n variant=\"ghost\"\n testID={`activity-workflow-${row.runKey}`}\n onPress={() => {\n if (row.ownerSessionId && openSession) {\n openSession(row.ownerSessionId);\n return;\n }\n const run = state.runs.find(\n (item) => `${item.workspace}/${item.routeKey ?? item.runKey}` === row.identity,\n );\n if (sessionId !== null) focusRun(sessionId, row.identity);\n if (run) openTransientTab(workflowTab(run));\n }}\n >\n {row.name}\n </Button>\n }\n description={\n <View style={{ flexDirection: 'row', alignItems: 'center' }}>\n <Text style={styles.status}>{row.detail} · </Text>\n <WorkflowDuration startedAt={row.startedAt} endedAt={row.finishedAt} style={styles.status} />\n </View>\n }\n />\n ))\n : null}\n </View>\n );\n })}\n {/* Runs the agent started with the dynamicWorkflow namespace; the tab shows their graphs. */}\n {dynamicRuns.length > 0 ? (\n <View testID=\"activity-dynamic-workflows\">\n <Text style={styles.heading}>Dynamic</Text>\n <DynamicWorkflowActivity runs={dynamicRuns} onOpen={() => openTransientTab(dynamicWorkflowTab())} />\n </View>\n ) : null}\n {/* The cockpit's idle line: the status, then the one jade action beside it. With runs, the action alone stays below them. */}\n <View style={styles.idle}>\n {groups.length === 0 && dynamicRuns.length === 0 ? <Text style={styles.status}>Idle</Text> : null}\n <Pressable\n accessibilityRole=\"button\"\n accessibilityState={{ disabled: sessionId === null }}\n testID=\"activity-workflow-launch\"\n disabled={sessionId === null}\n hitSlop={10}\n onPress={() => {\n if (sessionId !== null) openCatalog(sessionId);\n }}\n style={styles.action}\n >\n <Text style={styles.actionText(sessionId === null)}>Launch a workflow</Text>\n <ArrowRightIcon size={14} color={sessionId === null ? 'dim' : 'green'} />\n </Pressable>\n </View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create((theme: PoNativeTheme) => ({\n idle: { flexDirection: 'row', alignItems: 'center', flexWrap: 'wrap', gap: theme.spacing(4) },\n heading: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n fontWeight: theme.fontWeight.semibold,\n color: theme.colors.hi,\n paddingVertical: theme.spacing(1),\n },\n status: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n color: theme.colors.dim,\n },\n action: { flexDirection: 'row', alignItems: 'center', gap: theme.spacing(1) },\n actionText: (disabled: boolean) => ({\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n fontWeight: theme.fontWeight.medium,\n color: disabled ? theme.colors.dim : theme.colors.green,\n }),\n}));\n","import { defineFill } from '@agimon-ai/po-core/native';\n\nimport { WorkflowsActivitySection } from './_components/WorkflowsActivitySection.native';\nexport default defineFill({ component: WorkflowsActivitySection });\n","import type { ToolResultView } from '@agimon-ai/po-core/web';\nimport type { MessageLine, MessageLineTone } from '@agimon-ai/po-web-components';\n\n/**\n * The cockpit half of src/tui/workflow/workflowToolRender.ts: the same\n * result shapes reduced to a list of toned lines, so the React cards stay a\n * thin mapping and the parsing is testable without a DOM. Kept in step with\n * the TUI by hand; the two share no code because web/ may not import src/tui.\n */\n\nexport type WorkflowToolName =\n | 'launch_workflow'\n | 'list_workflows'\n | 'workflow_run'\n | 'workflow_tools'\n | 'scaffold_workflow';\n\n/** The toned lines the shared MessageLines draws; the vocabulary is the components package's. */\nexport type LineTone = MessageLineTone;\nexport type ToolLine = MessageLine;\n\nexport interface WorkflowCallSummary {\n action: string;\n target?: string;\n metadata: string[];\n}\n\nexport interface WorkflowRenderOptions {\n expanded: boolean;\n isError: boolean;\n isPartial: boolean;\n}\n\ntype JsonRecord = Record<string, unknown>;\n\ninterface WorkflowState {\n tone: LineTone;\n glyph: string;\n label: string;\n}\n\ninterface WorkflowCatalogItem {\n description: string;\n name: string;\n path: string;\n tags: string[];\n}\n\ninterface WorkflowCatalog {\n directory?: string;\n page: number;\n pageSize: number;\n tags: Array<{ count: number; tag: string }>;\n total: number;\n totalPages: number;\n workflows: WorkflowCatalogItem[];\n}\n\ninterface EvidenceSection {\n body: string[];\n name: string;\n}\n\nconst COLLAPSED_CATALOG_ROWS = 6;\nconst COLLAPSED_DETAIL_LINES = 8;\nconst PARTIAL_DETAIL_LINES = 4;\n\nexport const WORKFLOW_TOOL_NAMES: readonly WorkflowToolName[] = [\n 'list_workflows',\n 'launch_workflow',\n 'workflow_run',\n 'workflow_tools',\n 'scaffold_workflow',\n];\n\n/** The card's tool, with any other name read as workflow_run, as the web card always has. */\nexport function workflowToolName(name: string): WorkflowToolName {\n return WORKFLOW_TOOL_NAMES.includes(name as WorkflowToolName) ? (name as WorkflowToolName) : 'workflow_run';\n}\n\nfunction asRecord(value: unknown): JsonRecord | undefined {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return undefined;\n return value as JsonRecord;\n}\n\nfunction inlineText(value: string): string {\n let normalized = '';\n for (const character of value) {\n const code = character.codePointAt(0) ?? 0;\n normalized += code <= 31 || code === 127 ? ' ' : character;\n }\n return normalized.replace(/\\s+/gu, ' ').trim();\n}\n\nfunction readString(record: JsonRecord | undefined, key: string): string | undefined {\n const value = record?.[key];\n if (typeof value !== 'string') return undefined;\n return inlineText(value) || undefined;\n}\n\nfunction readNumber(record: JsonRecord | undefined, key: string): number | undefined {\n const value = record?.[key];\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined;\n}\n\nfunction readBoolean(record: JsonRecord | undefined, key: string): boolean | undefined {\n const value = record?.[key];\n return typeof value === 'boolean' ? value : undefined;\n}\n\nfunction readStringArray(record: JsonRecord | undefined, key: string): string[] {\n const value = record?.[key];\n if (!Array.isArray(value)) return [];\n return value.filter((item): item is string => typeof item === 'string');\n}\n\nfunction parseJsonRecord(text: string | undefined): JsonRecord | undefined {\n if (!text) return undefined;\n try {\n return asRecord(JSON.parse(text));\n } catch {\n // Not every workflow result is JSON; the plain-text shapes fall through.\n return undefined;\n }\n}\n\nfunction textBlocks(result: ToolResultView | null): string[] {\n if (!result) return [];\n return result.content.flatMap((item) => {\n const record = asRecord(item);\n return record?.type === 'text' && typeof record.text === 'string' ? [record.text] : [];\n });\n}\n\nfunction detailLines(result: ToolResultView | null): string[] {\n return textBlocks(result)\n .flatMap((block) => block.split('\\n'))\n .map((entry) => entry.trimEnd())\n .filter((entry) => entry.length > 0);\n}\n\nfunction firstPayload(result: ToolResultView | null): JsonRecord | undefined {\n return parseJsonRecord(textBlocks(result)[0]);\n}\n\nfunction plural(count: number, singular: string, pluralForm = `${singular}s`): string {\n return count === 1 ? singular : pluralForm;\n}\n\nfunction line(text: string, tone: LineTone, extra: Omit<ToolLine, 'text' | 'tone'> = {}): ToolLine {\n return { text, tone, ...extra };\n}\n\nfunction labelValue(label: string, value: string): ToolLine {\n return line(`${label} ${value}`, 'text');\n}\n\nfunction hiddenLine(hidden: number): ToolLine {\n return line(`… ${hidden} more`, 'dim');\n}\n\nfunction targetScope(args: JsonRecord): string | undefined {\n const runKey = readString(args, 'runKey');\n if (!runKey) return undefined;\n const workspace = readString(args, 'workspace');\n return workspace ? `${workspace}/${runKey}` : runKey;\n}\n\nfunction toolAction(toolName: WorkflowToolName, args: JsonRecord): string {\n if (toolName === 'list_workflows') return 'list';\n if (toolName === 'launch_workflow') return 'launch';\n if (toolName === 'scaffold_workflow') return 'scaffold';\n return readString(args, 'action') ?? 'run';\n}\n\nfunction toolTarget(toolName: WorkflowToolName, args: JsonRecord): string | undefined {\n if (toolName === 'list_workflows') return readString(args, 'directory');\n if (toolName === 'launch_workflow') return readString(args, 'workflowPath');\n if (toolName === 'scaffold_workflow') return readString(args, 'path');\n return targetScope(args);\n}\n\nfunction statusTimestamp(value: string): string {\n return value.replace('T', ' ').replace(/\\.\\d{3}Z$/, 'Z');\n}\n\nfunction workflowNameFromPath(path: string | undefined): string {\n if (!path) return 'workflow';\n const filename = path.split('/').at(-1) ?? path;\n return filename.replace(/\\.workflow\\.ya?ml$/u, '') || filename;\n}\n\nfunction callMetadata(toolName: WorkflowToolName, args: JsonRecord): string[] {\n const values: string[] = [];\n\n if (toolName === 'list_workflows') {\n const page = readNumber(args, 'page');\n const pageSize = readNumber(args, 'pageSize');\n if (page !== undefined) values.push(`page ${page}`);\n if (pageSize !== undefined) values.push(`${pageSize}/page`);\n if (readString(args, 'filter')) values.push('filtered');\n const tags = readStringArray(args, 'tags');\n if (tags.length > 0) values.push(`${tags.length} ${plural(tags.length, 'tag')}`);\n } else if (toolName === 'launch_workflow') {\n const job = readString(args, 'job');\n const runner = readString(args, 'runner');\n const workspace = readString(args, 'workspace');\n const inputCount = Object.keys(asRecord(args.inputs) ?? {}).length;\n const environmentCount = Object.keys(asRecord(args.env) ?? {}).length;\n if (workspace) values.push(`workspace ${workspace}`);\n if (job) values.push(`job ${job}`);\n if (runner) values.push(`runner ${runner}`);\n if (readBoolean(args, 'dryRun')) values.push('dry run');\n if (readString(args, 'prompt')) values.push('with prompt');\n if (inputCount > 0) values.push(`${inputCount} ${plural(inputCount, 'input')}`);\n if (environmentCount > 0) values.push(`${environmentCount} env`);\n } else if (toolName === 'scaffold_workflow') {\n if (readBoolean(args, 'force')) values.push('overwrite allowed');\n } else {\n if (readString(args, 'expectedRunId')) values.push('generation checked');\n if (readString(args, 'reason')) values.push('with reason');\n if (readBoolean(args, 'dryRun')) values.push('dry run');\n if (readString(args, 'job')) values.push('job override');\n if (readString(args, 'runner')) values.push('runner override');\n }\n\n return values;\n}\n\n/** The header beside the tool name: action, target, and the call's flags. */\nexport function workflowCallSummary(toolName: WorkflowToolName, args: JsonRecord): WorkflowCallSummary {\n const target = toolTarget(toolName, args);\n return {\n action: toolAction(toolName, args),\n ...(target === undefined ? {} : { target }),\n metadata: callMetadata(toolName, args),\n };\n}\n\nfunction parseCatalog(payload: JsonRecord | undefined): WorkflowCatalog | undefined {\n if (!Array.isArray(payload?.workflows)) return undefined;\n\n const workflows = payload.workflows.flatMap((value) => {\n const record = asRecord(value);\n const path = readString(record, 'path');\n if (!record || !path) return [];\n return [\n {\n description: readString(record, 'description') ?? '',\n name: readString(record, 'name') ?? '',\n path,\n tags: readStringArray(record, 'tags'),\n },\n ];\n });\n const tags = Array.isArray(payload.tags)\n ? payload.tags.flatMap((value) => {\n const record = asRecord(value);\n const tag = readString(record, 'tag');\n const count = readNumber(record, 'count');\n return tag && count !== undefined ? [{ count, tag }] : [];\n })\n : [];\n\n const directory = readString(payload, 'directory');\n return {\n ...(directory === undefined ? {} : { directory }),\n page: readNumber(payload, 'page') ?? 1,\n pageSize: readNumber(payload, 'pageSize') ?? workflows.length,\n tags,\n total: readNumber(payload, 'total') ?? workflows.length,\n totalPages: readNumber(payload, 'totalPages') ?? (workflows.length > 0 ? 1 : 0),\n workflows,\n };\n}\n\nfunction catalogItemLines(item: WorkflowCatalogItem, expanded: boolean): ToolLine[] {\n const name = item.name || workflowNameFromPath(item.path);\n const lines = [line(`› ${name} · ${item.path}`, 'text')];\n if (!expanded) return lines;\n if (item.description) lines.push(line(item.description, 'muted', { indent: true }));\n if (item.tags.length > 0) lines.push(line(`tags ${item.tags.join(', ')}`, 'dim', { indent: true }));\n return lines;\n}\n\nfunction catalogLines(result: ToolResultView | null, options: WorkflowRenderOptions): ToolLine[] | undefined {\n const catalog = parseCatalog(firstPayload(result));\n if (!catalog) return undefined;\n\n const pageLabel = `page ${catalog.page}/${catalog.totalPages}`;\n const glyph = catalog.total > 0 ? '✓' : '○';\n const summary = line(`${glyph} ${catalog.total} ${plural(catalog.total, 'workflow')} · ${pageLabel}`, 'hi', {\n bold: true,\n });\n const shown = options.expanded ? catalog.workflows : catalog.workflows.slice(0, COLLAPSED_CATALOG_ROWS);\n const lines = [summary, ...shown.flatMap((item) => catalogItemLines(item, options.expanded))];\n const hidden = catalog.workflows.length - shown.length;\n if (hidden > 0) lines.push(hiddenLine(hidden));\n\n if (options.expanded) {\n if (catalog.tags.length > 0) {\n const tags = catalog.tags.map(({ count, tag }) => `${tag} (${count})`).join(', ');\n lines.push(labelValue('available tags', tags));\n }\n if (catalog.directory) lines.push(labelValue('directory', catalog.directory));\n lines.push(labelValue('page size', String(catalog.pageSize)));\n }\n return lines;\n}\n\nfunction readWorkflowState(record: JsonRecord): WorkflowState {\n const stage = readString(record, 'effectiveStage') ?? readString(record, 'stage') ?? 'unknown';\n const outcome = readString(record, 'effectiveOutcome') ?? readString(record, 'outcome');\n const executionState = readString(record, 'executionState');\n\n if (outcome === 'interrupted') return { tone: 'warning', glyph: '!', label: 'interrupted' };\n if (stage === 'error' || outcome === 'failed') return { tone: 'error', glyph: '✗', label: 'failed' };\n if (stage === 'completed' && outcome === 'skipped') return { tone: 'muted', glyph: '○', label: 'skipped' };\n if (stage === 'completed') return { tone: 'success', glyph: '✓', label: 'completed' };\n if (executionState === 'paused') return { tone: 'warning', glyph: 'Ⅱ', label: 'paused' };\n if (executionState === 'pause_requested') return { tone: 'warning', glyph: '◐', label: 'pause requested' };\n if (executionState === 'resume_requested') return { tone: 'warning', glyph: '◐', label: 'resume requested' };\n if (stage === 'running') return { tone: 'accent', glyph: '◐', label: 'running' };\n return { tone: 'muted', glyph: '○', label: stage };\n}\n\nfunction currentActivity(record: JsonRecord): ToolLine | undefined {\n const position = asRecord(record.position);\n const cursor = asRecord(record.executionCursor);\n const job = readString(position, 'job') ?? readString(cursor, 'job') ?? readString(record, 'job');\n const step = readString(position, 'step') ?? readString(cursor, 'stepName');\n const phase = readString(cursor, 'phase');\n if (!job && !step && !phase) return undefined;\n const context = job ?? phase ?? 'workflow';\n return line(`[${context}] ${step ?? phase ?? 'current job'}`, 'text', { indent: true });\n}\n\nfunction launcherLabel(record: JsonRecord): string | undefined {\n const launcher = asRecord(record.launcher);\n const type = readString(launcher, 'type');\n if (!type) return undefined;\n const identity = readString(launcher, 'sessionName') ?? readString(launcher, 'workspaceId');\n return identity ? `${type} ${identity}` : type;\n}\n\nfunction workflowRecordLines(record: JsonRecord, expanded: boolean): ToolLine[] | undefined {\n const runKey = readString(record, 'runKey');\n const stage = readString(record, 'stage');\n if (!runKey || !stage) return undefined;\n\n const state = readWorkflowState(record);\n const displayName = readString(record, 'displayName') ?? runKey;\n const lines = [\n line(`Status retrieved · ${displayName} · workflow: ${state.label}`, state.tone, { bold: true }),\n labelValue('workspace', readString(record, 'workspace') ?? 'unknown'),\n labelValue('runKey', runKey),\n ];\n const activity = currentActivity(record);\n if (activity) lines.push(activity);\n\n const failure = readString(record, 'errorMessage') ?? readString(record, 'failureReason');\n if (failure) lines.push(line(`error ${failure}`, 'error'));\n const staleReason = readString(record, 'staleReason');\n if (staleReason) lines.push(line(`stale ${staleReason}`, 'warning'));\n\n const startedAt = readString(record, 'startedAt');\n const exitCode = readNumber(record, 'exitCode');\n const conciseMetadata = [\n readString(record, 'runner') ? `runner ${readString(record, 'runner')}` : undefined,\n readBoolean(record, 'dryRun') ? 'dry run' : undefined,\n exitCode !== undefined ? `exit ${exitCode}` : undefined,\n startedAt ? `started ${statusTimestamp(startedAt)}` : undefined,\n ].filter((value): value is string => !!value);\n if (conciseMetadata.length > 0) lines.push(line(conciseMetadata.join(' · '), 'dim'));\n\n if (!expanded) return lines;\n\n const finishedAt = readString(record, 'finishedAt');\n const repairId = readString(record, 'activeRepairId');\n const detailedValues: Array<[string, string | undefined]> = [\n ['workflow', readString(record, 'workflowPath')],\n ['workflow id', readString(record, 'workflowId')],\n ['run id', readString(record, 'runId')],\n ['launcher', launcherLabel(record)],\n ['job', readString(record, 'job')],\n ['outcome', readString(record, 'effectiveOutcome') ?? readString(record, 'outcome')],\n ['finished', finishedAt ? statusTimestamp(finishedAt) : undefined],\n ['pid', readNumber(record, 'pid')?.toString()],\n ['repair', repairId ? `#${repairId}` : undefined],\n ['worktree', readString(record, 'worktreeBranch') ?? readString(record, 'worktreePath')],\n ];\n for (const [label, value] of detailedValues) {\n if (value) lines.push(labelValue(label, value));\n }\n const jobs = record.jobs;\n if (Array.isArray(jobs)) {\n for (const value of jobs) {\n const job = asRecord(value);\n const name = readString(job, 'name');\n const status = readString(job, 'status');\n if (!name || !status) continue;\n lines.push(labelValue('job', `${name} · ${status}`));\n if (!Array.isArray(job?.steps)) continue;\n for (const value of job.steps) {\n const step = asRecord(value);\n const stepName = readString(step, 'name');\n const stepStatus = readString(step, 'status');\n if (stepName && stepStatus) lines.push(line(`step ${stepName} · ${stepStatus}`, 'text', { indent: true }));\n }\n }\n }\n return lines;\n}\n\nfunction statusLines(result: ToolResultView | null, options: WorkflowRenderOptions): ToolLine[] | undefined {\n const payload = firstPayload(result);\n if (!payload) return undefined;\n return workflowRecordLines(payload, options.expanded);\n}\n\nfunction nestedRequestedAt(payload: JsonRecord | undefined): string | undefined {\n return readString(asRecord(payload?.request), 'requestedAt') ?? readString(payload, 'requestedAt');\n}\n\nfunction controlLines(\n action: string,\n args: JsonRecord,\n result: ToolResultView | null,\n options: WorkflowRenderOptions,\n): ToolLine[] {\n const payload = firstPayload(result);\n const scope = targetScope(args) ?? readString(payload, 'runKey') ?? 'workflow';\n const payloadWorkspace = readString(payload, 'workspace');\n const resolvedScope = payloadWorkspace && !scope.includes('/') ? `${payloadWorkspace}/${scope}` : scope;\n const lines = [line(`◐ ${action} requested · ${resolvedScope}`, 'warning', { bold: true })];\n const requestedAt = nestedRequestedAt(payload);\n if (requestedAt) lines.push(labelValue('requested', statusTimestamp(requestedAt)));\n if (options.expanded) lines.push(line('verify the transition with workflow_run status', 'dim'));\n return lines;\n}\n\nfunction matchLine(text: string, pattern: RegExp): string | undefined {\n return text.match(pattern)?.[1]?.trim();\n}\n\nfunction launchSummary(text: string, args: JsonRecord): { name: string; scope: string; state: WorkflowState } {\n const startedName = matchLine(text, /^Started (.+) in workspace .+\\.$/mu);\n const workspace = matchLine(text, /^Started .+ in workspace (.+)\\.$/mu) ?? readString(args, 'workspace');\n const runKey = matchLine(text, /^Run key:\\s*(.+)$/mu);\n const path = readString(args, 'workflowPath');\n const name = startedName ?? workflowNameFromPath(path);\n const scope = runKey ? (workspace ? `${workspace}/${runKey}` : runKey) : (workspace ?? path ?? 'workflow');\n\n if (/Workflow completed successfully/iu.test(text)) {\n return { name, scope, state: { tone: 'success', glyph: '✓', label: 'completed' } };\n }\n if (/Workflow skipped/iu.test(text)) {\n return { name, scope, state: { tone: 'muted', glyph: '○', label: 'skipped' } };\n }\n if (/no run was registered/iu.test(text)) {\n return { name, scope, state: { tone: 'warning', glyph: '◐', label: 'starting · run key pending' } };\n }\n return { name, scope, state: { tone: 'accent', glyph: '◐', label: runKey ? 'started' : 'launch accepted' } };\n}\n\nfunction launchLines(args: JsonRecord, result: ToolResultView | null, options: WorkflowRenderOptions): ToolLine[] {\n const text = textBlocks(result).join('\\n');\n const summary = launchSummary(text, args);\n const lines = [\n line(`${summary.state.glyph} ${summary.name} · ${summary.scope} · ${summary.state.label}`, summary.state.tone, {\n bold: true,\n }),\n ];\n const metadata = [\n readString(args, 'job') ? `job ${readString(args, 'job')}` : undefined,\n readString(args, 'runner') ? `runner ${readString(args, 'runner')}` : undefined,\n readBoolean(args, 'dryRun') ? 'dry run' : undefined,\n ].filter((value): value is string => !!value);\n if (metadata.length > 0) lines.push(line(metadata.join(' · '), 'dim'));\n if (options.expanded) {\n const details = detailLines(result).filter((entry) => !entry.startsWith('Next steps for the agent:'));\n lines.push(...details.map((entry) => line(entry, 'text')));\n }\n return lines;\n}\n\nfunction splitEvidence(text: string): EvidenceSection[] {\n const sections: EvidenceSection[] = [];\n let current: EvidenceSection | undefined;\n for (const entry of text.split('\\n')) {\n const match = entry.match(/^--- (.+) ---$/u);\n if (match?.[1]) {\n current = { body: [], name: match[1] };\n sections.push(current);\n continue;\n }\n current?.body.push(entry);\n }\n return sections;\n}\n\nfunction recoveryEvidenceLines(\n args: JsonRecord,\n result: ToolResultView | null,\n options: WorkflowRenderOptions,\n): ToolLine[] {\n const sections = splitEvidence(textBlocks(result).join('\\n'));\n const runSection = sections.find((section) => section.name === 'run.json');\n const record = parseJsonRecord(runSection?.body.join('\\n'));\n const recordLines = record ? workflowRecordLines(record, options.expanded) : undefined;\n const evidenceSections = sections.filter((section) => section.name !== 'run.json');\n const scope = targetScope(args) ?? 'workflow';\n const lines = recordLines ?? [line(`✓ recovery evidence · ${scope}`, 'success', { bold: true })];\n const names = evidenceSections.map((section) => section.name);\n lines.push(\n names.length > 0 ? labelValue('evidence', names.join(', ')) : line('no durable evidence files recorded', 'muted'),\n );\n if (options.expanded) {\n for (const section of evidenceSections) {\n lines.push(line(section.name, 'hi', { bold: true }));\n lines.push(...section.body.filter((entry) => entry.length > 0).map((entry) => line(entry, 'text')));\n }\n }\n return lines;\n}\n\nfunction simpleActionLines(\n action: string,\n args: JsonRecord,\n result: ToolResultView | null,\n options: WorkflowRenderOptions,\n): ToolLine[] {\n const scope = targetScope(args) ?? 'workflow';\n const actionLabel: Record<string, string> = {\n follow: 'following output',\n open: 'launcher opened',\n recover: readBoolean(args, 'dryRun') ? 'recovery dry run finished' : 'recovery accepted',\n tail: 'launcher output checked',\n };\n const state: WorkflowState =\n action === 'recover'\n ? { tone: 'accent', glyph: '◐', label: actionLabel[action] ?? action }\n : { tone: 'success', glyph: '✓', label: actionLabel[action] ?? action };\n const lines = [line(`${state.glyph} ${state.label} · ${scope}`, state.tone, { bold: true })];\n const details = detailLines(result);\n if (action === 'tail') {\n const workflowLine = details.find((entry) => entry.startsWith('Workflow:'));\n const stageLine = details.find((entry) => entry.startsWith('Stage:'));\n if (workflowLine) lines.push(line(workflowLine, 'text'));\n if (stageLine) lines.push(line(stageLine, 'text'));\n }\n if (options.expanded) lines.push(...details.map((entry) => line(entry, 'text')));\n return lines;\n}\n\nfunction failureLines(\n toolName: WorkflowToolName,\n args: JsonRecord,\n result: ToolResultView | null,\n options: WorkflowRenderOptions,\n): ToolLine[] {\n const action = toolAction(toolName, args);\n const target = toolTarget(toolName, args);\n const details = detailLines(result);\n const shown = options.expanded ? details : details.slice(0, COLLAPSED_DETAIL_LINES);\n const lines = [\n line(\n toolName === 'workflow_run' && action === 'status'\n ? `✗ Status lookup failed${target ? ` · ${target}` : ''}`\n : `✗ ${action} failed${target ? ` · ${target}` : ''}`,\n 'error',\n { bold: true },\n ),\n ...(shown.length > 0 ? shown.map((entry) => line(entry, 'text')) : [line('Unknown workflow error', 'error')]),\n ];\n const hidden = details.length - shown.length;\n if (hidden > 0) lines.push(hiddenLine(hidden));\n return lines;\n}\n\nfunction partialLines(toolName: WorkflowToolName, args: JsonRecord, result: ToolResultView | null): ToolLine[] {\n const details = detailLines(result);\n const shown = details.slice(-PARTIAL_DETAIL_LINES);\n const action = toolAction(toolName, args);\n const target = toolTarget(toolName, args);\n const hidden = details.length - shown.length;\n const lines = [line(`◐ ${action}${target ? ` · ${target}` : ''}`, 'accent', { bold: true })];\n if (hidden > 0) lines.push(line(`… ${hidden} earlier`, 'dim'));\n lines.push(...shown.map((entry) => line(entry, 'text')));\n return lines;\n}\n\nfunction fallbackLines(result: ToolResultView | null, options: WorkflowRenderOptions): ToolLine[] {\n const details = detailLines(result);\n if (details.length === 0) return [line('No workflow output.', 'muted')];\n const shown = options.expanded ? details : details.slice(0, COLLAPSED_DETAIL_LINES);\n const lines = shown.map((entry) => line(entry, 'text'));\n const hidden = details.length - shown.length;\n if (hidden > 0) lines.push(hiddenLine(hidden));\n return lines;\n}\n\n/** The body of a workflow tool card, chosen by tool, action, and result shape. */\nexport function workflowResultLines(\n toolName: WorkflowToolName,\n args: JsonRecord,\n result: ToolResultView | null,\n options: WorkflowRenderOptions,\n): ToolLine[] {\n if (options.isPartial) return partialLines(toolName, args, result);\n if (options.isError) return failureLines(toolName, args, result, options);\n\n if (toolName === 'list_workflows') return catalogLines(result, options) ?? fallbackLines(result, options);\n if (toolName === 'launch_workflow') return launchLines(args, result, options);\n\n const action = readString(args, 'action');\n if (action === 'status') return statusLines(result, options) ?? fallbackLines(result, options);\n if (action === 'pause' || action === 'resume' || action === 'stop')\n return controlLines(action, args, result, options);\n if (action === 'recovery-evidence') return recoveryEvidenceLines(args, result, options);\n if (action === 'follow' || action === 'open' || action === 'recover' || action === 'tail') {\n return simpleActionLines(action, args, result, options);\n }\n return fallbackLines(result, options);\n}\n\n/**\n * The reason a failed call gives, for a card that shows only the reason: the\n * `{ error }` payload the runtime answers a failed operation with, or the plain\n * text a launch failure carries.\n */\nexport function workflowFailureReason(result: ToolResultView | null, output = ''): string {\n const text = (textBlocks(result).join('\\n') || output).trim();\n const error = readString(parseJsonRecord(text), 'error');\n if (error) return error;\n return text || 'Unknown workflow error';\n}\n\n/** One labelled figure of a structured result. */\nexport interface WorkflowFact {\n label: string;\n value: string;\n}\n\n/** One row of a compact list: a title, a quiet detail, and an optional status chip. */\nexport interface WorkflowRow {\n key: string;\n title: string;\n detail?: string;\n chip?: { label: string; tone: 'blue' | 'green' | 'yellow' | 'red' | 'neutral' };\n}\n\n/**\n * A JSON result the toned lines have no dedicated shape for, laid out instead\n * of printed: the failed-run summaries `workflow_tools list-failed` answers\n * with, or any other record as its scalar figures and list counts.\n */\nexport interface WorkflowStructuredView {\n headline: string;\n facts: WorkflowFact[];\n rows: WorkflowRow[];\n note?: string;\n}\n\nfunction parseJsonValue(text: string): unknown {\n try {\n return JSON.parse(text);\n } catch {\n // Plain text is not a structured result; the lines draw it.\n return undefined;\n }\n}\n\nfunction failedRunsView(payload: unknown): WorkflowStructuredView | undefined {\n if (!Array.isArray(payload)) return undefined;\n const rows = payload.flatMap((value): WorkflowRow[] => {\n const record = asRecord(value);\n const runKey = readString(record, 'runKey');\n if (!runKey) return [];\n const workspace = readString(record, 'workspace');\n const failedJob = readString(record, 'failedJob');\n const updatedAt = readString(record, 'updatedAt');\n const outcome = readString(record, 'outcome') ?? 'failed';\n const detail = [\n workspace ? `${workspace}/${runKey}` : runKey,\n failedJob ? `job ${failedJob}` : undefined,\n updatedAt ? statusTimestamp(updatedAt) : undefined,\n ].filter((entry): entry is string => !!entry);\n return [\n {\n key: `${workspace ?? ''}/${runKey}`,\n title: readString(record, 'displayName') ?? runKey,\n detail: detail.join(' · '),\n chip: { label: outcome, tone: outcome === 'interrupted' ? 'yellow' : 'red' },\n },\n ];\n });\n if (rows.length !== payload.length) return undefined;\n return {\n headline: rows.length === 0 ? 'No failed runs' : `${rows.length} failed ${plural(rows.length, 'run')}`,\n facts: [],\n rows,\n ...(rows.length > 0 ? { note: 'Read recovery-evidence before recover.' } : {}),\n };\n}\n\nfunction scalarText(value: unknown): string | undefined {\n if (typeof value === 'string') return inlineText(value) || undefined;\n if (typeof value === 'number' && Number.isFinite(value)) return String(value);\n if (typeof value === 'boolean') return value ? 'yes' : 'no';\n return undefined;\n}\n\n/** Any JSON result as its scalar figures and list counts, or a list of rows for an array. */\nexport function workflowGenericView(payload: unknown): WorkflowStructuredView {\n if (Array.isArray(payload)) {\n const rows = payload.map((value, index): WorkflowRow => {\n const record = asRecord(value);\n const scalars = Object.values(record ?? {}).flatMap((entry) => scalarText(entry) ?? []);\n const title = scalarText(value) ?? scalars[0] ?? `item ${index + 1}`;\n const rest = scalars.slice(1).join(' · ');\n return { key: String(index), title, ...(rest ? { detail: rest } : {}) };\n });\n return { headline: `${rows.length} ${plural(rows.length, 'item')}`, facts: [], rows };\n }\n const record = asRecord(payload) ?? {};\n const facts = Object.entries(record).flatMap(([label, value]): WorkflowFact[] => {\n const scalar = scalarText(value);\n if (scalar !== undefined) return [{ label, value: scalar }];\n if (Array.isArray(value)) return [{ label, value: `${value.length} ${plural(value.length, 'item')}` }];\n const nested = asRecord(value);\n if (nested) {\n const count = Object.keys(nested).length;\n return [{ label, value: `${count} ${plural(count, 'field')}` }];\n }\n return [];\n });\n return { headline: facts.length === 0 ? 'No details returned' : 'Result', facts, rows: [] };\n}\n\n/**\n * The laid-out form of a JSON result the toned lines would otherwise print\n * as raw text, or undefined when the lines already parse it (the catalog, a\n * run record, a control request) or the result is plain text.\n */\nexport function workflowStructuredView(\n toolName: WorkflowToolName,\n args: JsonRecord,\n result: ToolResultView | null,\n): WorkflowStructuredView | undefined {\n const text = textBlocks(result).join('\\n').trim();\n if (!text.startsWith('{') && !text.startsWith('[')) return undefined;\n const payload = parseJsonValue(text);\n if (payload === undefined) return undefined;\n const action = readString(args, 'action');\n if (toolName === 'workflow_tools' && action === 'list-failed')\n return failedRunsView(payload) ?? workflowGenericView(payload);\n const record = asRecord(payload);\n if (toolName === 'list_workflows' && parseCatalog(record)) return undefined;\n if (toolName === 'launch_workflow') return undefined;\n if (action === 'status' && record && workflowRecordLines(record, false)) return undefined;\n if (action === 'pause' || action === 'resume' || action === 'stop') return undefined;\n return workflowGenericView(payload);\n}\n","import type { ToolResultView } from '@agimon-ai/po-core/web';\n\nimport { type WorkflowFact, type WorkflowRow, workflowGenericView } from './workflowToolRender';\n\n/**\n * The view model of the workflow child tools, the lead's spawnChild,\n * childStatus and children and the child's reportCriteria and\n * reviewArtifacts, registered under the names in\n * src/services/workflowNamespace (CHILD_TOOL_NAMES). The runtime picks which\n * of them a session gets by its role, so the renderers claim them by name\n * through `matches`. Results arrive as JSON text; they are parsed and\n * validated here into figures, chips, and compact lists, and only text that\n * does not parse falls back to plain lines. As the namespace's call cards do,\n * the view leaves out the assignment prompt, input values, criteria\n * feedback, and reviewed artifact bodies.\n */\n\nexport const WORKFLOW_CHILD_TOOL_NAMES = [\n 'workflow_spawn_child',\n 'workflow_child_status',\n 'workflow_children',\n 'workflow_report_criteria',\n 'workflow_review_artifacts',\n] as const;\n\nexport type WorkflowChildToolName = (typeof WORKFLOW_CHILD_TOOL_NAMES)[number];\n\nexport type WorkflowChipTone = NonNullable<WorkflowRow['chip']>['tone'];\n\nexport interface WorkflowChildChip {\n label: string;\n tone: WorkflowChipTone;\n}\n\nexport interface WorkflowChildSection {\n title: string;\n rows: WorkflowRow[];\n}\n\n/** A parsed child-tool result: one key figure, its facts, compact lists, and a quiet note. */\nexport interface WorkflowChildView {\n headline: string;\n chip?: WorkflowChildChip;\n facts: WorkflowFact[];\n sections: WorkflowChildSection[];\n /** A failure the result itself reports, such as a child that ended failed. */\n error?: string;\n note?: string;\n /** Plain text that did not parse, shown as it came. */\n text?: string[];\n}\n\n/** The header beside the tool name: the one piece that stays whole and the detail that may truncate. */\nexport interface WorkflowChildSummary {\n primary?: string;\n detail: string[];\n}\n\ntype JsonRecord = Record<string, unknown>;\n\nexport function matchesWorkflowChildTool(toolName: string): boolean {\n return (WORKFLOW_CHILD_TOOL_NAMES as readonly string[]).includes(toolName);\n}\n\nfunction asRecord(value: unknown): JsonRecord | undefined {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return undefined;\n return value as JsonRecord;\n}\n\nfunction readString(record: JsonRecord | undefined, key: string): string | undefined {\n const value = record?.[key];\n if (typeof value !== 'string') return undefined;\n return value.replace(/\\s+/gu, ' ').trim() || undefined;\n}\n\nfunction readNumber(record: JsonRecord | undefined, key: string): number | undefined {\n const value = record?.[key];\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined;\n}\n\nfunction plural(count: number, singular: string, pluralForm = `${singular}s`): string {\n return count === 1 ? singular : pluralForm;\n}\n\nfunction timestamp(value: string): string {\n return value.replace('T', ' ').replace(/\\.\\d{3}Z$/u, 'Z');\n}\n\nfunction resultText(result: ToolResultView | null): string {\n if (!result) return '';\n return result.content\n .flatMap((item) => {\n const record = asRecord(item);\n return record?.type === 'text' && typeof record.text === 'string' ? [record.text] : [];\n })\n .join('\\n')\n .trim();\n}\n\ntype Parsed = { ok: true; value: unknown } | { ok: false };\n\nfunction parseResult(result: ToolResultView | null): Parsed {\n const text = resultText(result);\n if (text) {\n try {\n return { ok: true, value: JSON.parse(text) };\n } catch {\n // Not JSON: the caller shows the text as it came.\n return { ok: false };\n }\n }\n return result && result.details !== undefined ? { ok: true, value: result.details } : { ok: false };\n}\n\nfunction criteriaResults(args: JsonRecord): Array<{ key: string; status: string }> {\n const results = asRecord(args.results);\n if (!results) return [];\n return Object.entries(results).flatMap(([key, value]) => {\n const status = readString(asRecord(value), 'status');\n return status ? [{ key, status }] : [];\n });\n}\n\nexport function workflowChildSummary(toolName: string, args: JsonRecord): WorkflowChildSummary {\n if (toolName === 'workflow_spawn_child') {\n const inputs = Object.keys(asRecord(args.inputs) ?? {}).length;\n const job = readString(args, 'job');\n return {\n ...(job === undefined ? {} : { primary: job }),\n detail: inputs > 0 ? [`${inputs} ${plural(inputs, 'input')}`] : [],\n };\n }\n if (toolName === 'workflow_child_status') {\n const id = readString(args, 'invocationId');\n return { ...(id === undefined ? {} : { primary: id }), detail: [] };\n }\n if (toolName === 'workflow_report_criteria') {\n const results = criteriaResults(args);\n if (results.length === 0) return { detail: [] };\n const notMet = results.filter((entry) => entry.status === 'not-met').length;\n return {\n primary: `${results.length} ${plural(results.length, 'criterion', 'criteria')}`,\n detail: notMet > 0 ? [`${notMet} not met`] : [],\n };\n }\n return { detail: [] };\n}\n\n/** What the card says while the call runs. */\nexport function workflowChildRunningLabel(toolName: string): string {\n if (toolName === 'workflow_spawn_child') return 'Starting the child';\n if (toolName === 'workflow_child_status') return 'Reading the child';\n if (toolName === 'workflow_children') return 'Reading the children';\n if (toolName === 'workflow_report_criteria') return 'Reporting criteria';\n if (toolName === 'workflow_review_artifacts') return 'Reading the artifacts';\n return 'Running';\n}\n\nconst INVOCATION_CHIPS: Readonly<Record<string, WorkflowChildChip>> = {\n running: { label: 'running', tone: 'blue' },\n completed: { label: 'completed', tone: 'green' },\n failed: { label: 'failed', tone: 'red' },\n interrupted: { label: 'interrupted', tone: 'yellow' },\n};\n\nconst CRITERION_CHIPS: Readonly<Record<string, WorkflowChildChip>> = {\n checked: { label: 'checked', tone: 'green' },\n 'not-met': { label: 'not met', tone: 'yellow' },\n unchecked: { label: 'unchecked', tone: 'neutral' },\n};\n\nfunction invocationChip(state: string): WorkflowChildChip {\n return INVOCATION_CHIPS[state] ?? { label: state, tone: 'neutral' };\n}\n\nfunction invocationView(value: unknown): WorkflowChildView | undefined {\n const record = asRecord(value);\n const invocationId = readString(record, 'invocationId');\n const job = readString(record, 'job');\n const state = readString(record, 'state');\n if (!record || !invocationId || !job || !state) return undefined;\n const sessions = Array.isArray(record.sessionIds) ? record.sessionIds.filter((id) => typeof id === 'string') : [];\n const startedAt = readString(record, 'startedAt');\n const endedAt = readString(record, 'endedAt');\n const facts: WorkflowFact[] = [{ label: 'invocation', value: invocationId }];\n if (startedAt) facts.push({ label: 'started', value: timestamp(startedAt) });\n if (endedAt) facts.push({ label: 'ended', value: timestamp(endedAt) });\n if (sessions.length > 0) facts.push({ label: 'sessions', value: String(sessions.length) });\n const error = readString(record, 'error');\n return {\n headline: job,\n chip: invocationChip(state),\n facts,\n sections: [],\n ...(error === undefined ? {} : { error }),\n ...(state === 'running' ? { note: 'Check back with childStatus; a started child is not a finished one.' } : {}),\n };\n}\n\nfunction criterionRow(value: unknown): WorkflowRow | undefined {\n const record = asRecord(value);\n const key = readString(record, 'key');\n const status = readString(record, 'status');\n if (!key || !status) return undefined;\n const verifiedBy = readString(record, 'verifiedBy');\n return {\n key,\n title: key,\n ...(verifiedBy === undefined ? {} : { detail: `verified by ${verifiedBy}` }),\n chip: CRITERION_CHIPS[status] ?? { label: status, tone: 'neutral' },\n };\n}\n\nfunction invocationRow(value: unknown): WorkflowRow | undefined {\n const record = asRecord(value);\n const id = readString(record, 'invocationId');\n const job = readString(record, 'job');\n const state = readString(record, 'state');\n if (!id || !job || !state) return undefined;\n return { key: id, title: job, detail: id, chip: invocationChip(state) };\n}\n\nfunction childrenView(value: unknown): WorkflowChildView | undefined {\n const record = asRecord(value);\n const lead = readString(record, 'lead');\n if (!record || !lead || !Array.isArray(record.criteria) || !Array.isArray(record.invocations)) return undefined;\n const criteria = record.criteria.flatMap((entry) => criterionRow(entry) ?? []);\n const invocations = record.invocations.flatMap((entry) => invocationRow(entry) ?? []);\n const checked = criteria.filter((row) => row.chip?.label === 'checked').length;\n const continuations = readNumber(record, 'continuations');\n const maxContinuations = readNumber(record, 'maxContinuations');\n const facts: WorkflowFact[] = [{ label: 'lead', value: lead }];\n if (continuations !== undefined && maxContinuations !== undefined) {\n facts.push({ label: 'continuations', value: `${continuations}/${maxContinuations}` });\n }\n const sections: WorkflowChildSection[] = [];\n if (criteria.length > 0) sections.push({ title: 'Criteria', rows: criteria });\n if (invocations.length > 0) sections.push({ title: 'Children', rows: invocations });\n return {\n headline:\n criteria.length > 0\n ? `${checked}/${criteria.length} ${plural(criteria.length, 'criterion', 'criteria')} checked`\n : `${invocations.length} ${plural(invocations.length, 'child', 'children')}`,\n facts,\n sections,\n ...(sections.length === 0 ? { note: 'No children spawned yet.' } : {}),\n };\n}\n\nfunction reportView(args: JsonRecord): WorkflowChildView {\n const results = criteriaResults(args);\n const rows = results.map((entry): WorkflowRow => ({\n key: entry.key,\n title: entry.key,\n chip: CRITERION_CHIPS[entry.status] ?? { label: entry.status, tone: 'neutral' },\n }));\n return {\n headline: `${rows.length} ${plural(rows.length, 'criterion', 'criteria')} reported`,\n facts: [],\n sections: rows.length > 0 ? [{ title: 'Criteria', rows }] : [],\n note: 'The lead reads these on its next look at the children.',\n };\n}\n\nfunction artifactsView(value: unknown): WorkflowChildView | undefined {\n const record = asRecord(value);\n const revision = readString(record, 'revision');\n const artifacts = asRecord(record?.artifacts);\n if (!revision || !artifacts) return undefined;\n const rows = Object.entries(artifacts).map(([name, body]): WorkflowRow => {\n const lines = typeof body === 'string' && body.length > 0 ? body.split('\\n').length : 0;\n return { key: name, title: name, detail: `${lines} ${plural(lines, 'line')}` };\n });\n return {\n headline: `${rows.length} ${plural(rows.length, 'artifact')}`,\n facts: [{ label: 'revision', value: revision }],\n sections: rows.length > 0 ? [{ title: 'Artifacts', rows }] : [],\n ...(rows.length === 0 ? { note: 'No artifacts recorded for review.' } : {}),\n };\n}\n\nfunction textView(result: ToolResultView | null): WorkflowChildView {\n const lines = resultText(result)\n .split('\\n')\n .map((entry) => entry.trimEnd())\n .filter((entry) => entry.length > 0);\n return { headline: '', facts: [], sections: [], text: lines.length > 0 ? lines : ['No output.'] };\n}\n\n/** The settled result of a child tool, parsed by tool; raw text only when it does not parse. */\nexport function workflowChildView(\n toolName: string,\n args: JsonRecord,\n result: ToolResultView | null,\n): WorkflowChildView {\n if (toolName === 'workflow_report_criteria') return reportView(args);\n const parsed = parseResult(result);\n if (!parsed.ok) return textView(result);\n const view =\n toolName === 'workflow_spawn_child' || toolName === 'workflow_child_status'\n ? invocationView(parsed.value)\n : toolName === 'workflow_children'\n ? childrenView(parsed.value)\n : toolName === 'workflow_review_artifacts'\n ? artifactsView(parsed.value)\n : undefined;\n if (view) return view;\n // JSON of a shape this card does not know is still laid out, never printed.\n const generic = workflowGenericView(parsed.value);\n return {\n headline: generic.headline,\n facts: generic.facts,\n sections: generic.rows.length > 0 ? [{ title: 'Items', rows: generic.rows }] : [],\n };\n}\n","import { Badge, fontOf } from '@agimon-ai/po-native-components';\nimport type { PoNativeTheme } from '@agimon-ai/po-web-components/nativeTheme';\nimport { Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport type { LineTone, ToolLine, WorkflowFact, WorkflowRow } from '../_lib/workflowToolRender';\n\n/*\n * The pieces the workflow tool cards lay a parsed result out with on the\n * phone: the toned lines the web's MessageLines draws, and for a structured\n * result its key figure, labelled facts, compact rows with a status chip,\n * and a quiet note.\n */\n\nexport function WorkflowLines({ lines }: { lines: readonly ToolLine[] }) {\n return (\n <View style={styles.lines}>\n {lines.map((entry, index) => (\n <Text\n key={`${String(index)}-${entry.text}`}\n selectable\n style={[\n styles.sans,\n TONE_STYLE[entry.tone],\n entry.bold === true ? styles.bold : null,\n entry.indent === true ? styles.indent : null,\n ]}\n >\n {entry.text}\n </Text>\n ))}\n </View>\n );\n}\n\n/** The key figure of a result, with its status chip beside it when it has one. */\nexport function WorkflowHeadline({ text, chip }: { text: string; chip?: WorkflowRow['chip'] }) {\n return (\n <View style={styles.headline}>\n {text.length > 0 ? (\n <Text numberOfLines={1} style={[styles.sans, styles.bold, styles.hi, styles.headlineText]}>\n {text}\n </Text>\n ) : null}\n {chip !== undefined ? (\n <Badge tone={chip.tone} size=\"xs\">\n {chip.label}\n </Badge>\n ) : null}\n </View>\n );\n}\n\n/** Labelled figures, each label over its value, wrapping across the row. */\nexport function WorkflowFacts({ facts }: { facts: readonly WorkflowFact[] }) {\n if (facts.length === 0) return null;\n return (\n <View style={styles.facts}>\n {facts.map((fact) => (\n <View key={fact.label} style={styles.fact}>\n <Text style={styles.label}>{fact.label}</Text>\n <Text selectable numberOfLines={1} ellipsizeMode=\"middle\" style={[styles.mono, styles.text]}>\n {fact.value}\n </Text>\n </View>\n ))}\n </View>\n );\n}\n\n/** A titled compact list: one row per item, the title and chip on a line, the detail quiet below. */\nexport function WorkflowRows({ title, rows }: { title?: string; rows: readonly WorkflowRow[] }) {\n if (rows.length === 0) return null;\n return (\n <View style={styles.section}>\n {title !== undefined ? <Text style={styles.label}>{title}</Text> : null}\n {rows.map((row) => (\n <View key={row.key} style={styles.row}>\n <View style={styles.rowLine}>\n <Text numberOfLines={1} style={[styles.sans, styles.text, styles.rowTitle]}>\n {row.title}\n </Text>\n {row.chip !== undefined ? (\n <Badge tone={row.chip.tone} size=\"xs\">\n {row.chip.label}\n </Badge>\n ) : null}\n </View>\n {row.detail !== undefined ? (\n <Text numberOfLines={1} ellipsizeMode=\"middle\" style={[styles.small, styles.faint]}>\n {row.detail}\n </Text>\n ) : null}\n </View>\n ))}\n </View>\n );\n}\n\nexport function WorkflowNote({ children }: { children: string }) {\n return <Text style={[styles.small, styles.faint]}>{children}</Text>;\n}\n\n/** A failure reason, alone in red: the card's edge and icon already say it failed. */\nexport function WorkflowReason({ children }: { children: string }) {\n return (\n <Text selectable style={[styles.sans, styles.error]}>\n {children}\n </Text>\n );\n}\n\nconst styles = StyleSheet.create((theme: PoNativeTheme) => ({\n sans: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n },\n small: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n },\n mono: {\n fontFamily: fontOf(theme.fontFamily.mono),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n },\n lines: { gap: theme.spacing(0.5) },\n headline: { flexDirection: 'row', alignItems: 'center', gap: theme.spacing(2), minWidth: 0 },\n headlineText: { flexShrink: 1 },\n facts: { flexDirection: 'row', flexWrap: 'wrap', columnGap: theme.spacing(5), rowGap: theme.spacing(2) },\n fact: { gap: theme.spacing(0.5), maxWidth: '100%' },\n section: { gap: theme.spacing(2) },\n row: { gap: theme.spacing(0.5) },\n rowLine: { flexDirection: 'row', alignItems: 'center', gap: theme.spacing(2), minWidth: 0 },\n rowTitle: { flexShrink: 1 },\n label: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.xs,\n lineHeight: theme.lineHeight.xs,\n fontWeight: theme.fontWeight.semibold,\n textTransform: 'uppercase',\n color: theme.colors.dim,\n },\n bold: { fontWeight: theme.fontWeight.semibold },\n indent: { paddingLeft: theme.spacing(4) },\n error: { color: theme.colors.red },\n hi: { color: theme.colors.hi },\n text: { color: theme.colors.text },\n dim: { color: theme.colors.dim },\n faint: { color: theme.colors.faint },\n success: { color: theme.colors.green },\n warning: { color: theme.colors.yellow },\n accent: { color: theme.colors.blue },\n}));\n\n/** The line tones of the web's MessageLines, drawn with the same theme tokens. */\nconst TONE_STYLE: Readonly<Record<LineTone, object>> = {\n hi: styles.hi,\n text: styles.text,\n dim: styles.dim,\n muted: styles.faint,\n success: styles.success,\n error: styles.error,\n warning: styles.warning,\n accent: styles.accent,\n};\n","import type { ToolMessageRenderProps } from '@agimon-ai/po-core/native';\nimport {\n fontOf,\n MessageItem,\n MessageItemBody,\n MessageItemHeader,\n MessageItemStatus,\n toolTone,\n} from '@agimon-ai/po-native-components';\nimport type { PoNativeTheme } from '@agimon-ai/po-web-components/nativeTheme';\nimport { Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport { workflowChildRunningLabel, workflowChildSummary, workflowChildView } from '../_lib/workflowChildToolView';\nimport { workflowFailureReason } from '../_lib/workflowToolRender';\nimport {\n WorkflowFacts,\n WorkflowHeadline,\n WorkflowLines,\n WorkflowNote,\n WorkflowReason,\n WorkflowRows,\n} from './WorkflowResultParts.native';\n\n/**\n * The workflow child tools' timeline item on native, as the web's: the job,\n * invocation or criteria count whole beside the tool name, the key figure\n * and its chip as the collapsed preview, and the facts and compact lists\n * once expanded. A failure shows only its reason.\n */\nexport function WorkflowChildToolMessage({ toolName, args, result, output, running, isError }: ToolMessageRenderProps) {\n const summary = workflowChildSummary(toolName, args);\n const view = running || isError ? undefined : workflowChildView(toolName, args, result);\n const expandable =\n view !== undefined &&\n (view.facts.length > 0 ||\n view.sections.length > 0 ||\n view.error !== undefined ||\n view.note !== undefined ||\n (view.text?.length ?? 0) > 1);\n return (\n <MessageItem tone={toolTone({ running, isError })} expandable={expandable}>\n {({ expanded }) => (\n <>\n <MessageItemHeader title={toolName}>\n <View testID={`tool-call-${toolName}`} style={styles.summary}>\n {summary.primary !== undefined ? (\n <Text numberOfLines={1} style={[styles.sans, styles.primary]}>\n {summary.primary}\n </Text>\n ) : null}\n {/* Beside a main piece the detail only ever fit as a stub, so it shows when it is the summary. */}\n {summary.primary === undefined && summary.detail.length > 0 ? (\n <Text numberOfLines={1} style={[styles.sans, styles.detail]}>\n {summary.detail.join(' · ')}\n </Text>\n ) : null}\n </View>\n </MessageItemHeader>\n {isError ? (\n <MessageItemBody testID={`tool-result-${toolName}`}>\n <WorkflowReason>{workflowFailureReason(result, output)}</WorkflowReason>\n </MessageItemBody>\n ) : running ? (\n <MessageItemBody testID={`tool-result-${toolName}`}>\n <MessageItemStatus tone=\"running\">{workflowChildRunningLabel(toolName)}</MessageItemStatus>\n </MessageItemBody>\n ) : view === undefined ? null : view.text !== undefined ? (\n <MessageItemBody testID={`tool-result-${toolName}`}>\n <WorkflowLines\n lines={(expanded ? view.text : view.text.slice(0, 1)).map((text) => ({ text, tone: 'text' }))}\n />\n </MessageItemBody>\n ) : (\n <MessageItemBody testID={`tool-result-${toolName}`}>\n <View style={styles.stack}>\n <WorkflowHeadline text={view.headline} {...(view.chip === undefined ? {} : { chip: view.chip })} />\n {expanded ? (\n <>\n {view.error !== undefined ? <WorkflowReason>{view.error}</WorkflowReason> : null}\n <WorkflowFacts facts={view.facts} />\n {view.sections.map((section) => (\n <WorkflowRows key={section.title} title={section.title} rows={section.rows} />\n ))}\n {view.note !== undefined ? <WorkflowNote>{view.note}</WorkflowNote> : null}\n </>\n ) : null}\n </View>\n </MessageItemBody>\n )}\n </>\n )}\n </MessageItem>\n );\n}\n\nconst styles = StyleSheet.create((theme: PoNativeTheme) => ({\n // One line on the title's row beside the long tool name: the job, id or count, or the detail\n // when there is no main piece.\n summary: { flex: 1, flexDirection: 'row', alignItems: 'center', gap: theme.spacing(2), minWidth: 0 },\n sans: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n },\n primary: { flexShrink: 1, fontWeight: theme.fontWeight.semibold, color: theme.colors.hi },\n detail: { flexShrink: 1, color: theme.colors.faint },\n stack: { gap: theme.spacing(3) },\n}));\n","import { defineToolRenderer } from '@agimon-ai/po-core/native';\n\nimport { WorkflowChildToolMessage } from './_components/WorkflowChildToolMessage.native';\nimport { matchesWorkflowChildTool, WORKFLOW_CHILD_TOOL_NAMES } from './_lib/workflowChildToolView';\n\n/** The runtime registers only the child tools a session's role allows, so the names are matched, not just listed. */\nexport default defineToolRenderer({\n tools: [...WORKFLOW_CHILD_TOOL_NAMES],\n matches: matchesWorkflowChildTool,\n message: WorkflowChildToolMessage,\n});\n","import type { ToolMessageRenderProps } from '@agimon-ai/po-core/native';\nimport { fontOf, MessageItem, MessageItemBody, MessageItemHeader, toolTone } from '@agimon-ai/po-native-components';\nimport type { PoNativeTheme } from '@agimon-ai/po-web-components/nativeTheme';\nimport { Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport {\n workflowCallSummary,\n workflowFailureReason,\n workflowResultLines,\n workflowStructuredView,\n workflowToolName,\n} from '../_lib/workflowToolRender';\nimport {\n WorkflowFacts,\n WorkflowHeadline,\n WorkflowLines,\n WorkflowNote,\n WorkflowReason,\n WorkflowRows,\n} from './WorkflowResultParts.native';\n\n/**\n * The workflow tools' timeline item on native, as the web's: the action\n * whole beside the tool name with the target and flags truncating after it,\n * and the shape-specific summary lines in the body (a preview collapsed, as\n * the web shows). A JSON result the lines have no shape for, such as\n * list-failed, is laid out as figures and rows rather than printed. A failure\n * shows only its reason; the edge and icon say it failed.\n */\nexport function WorkflowToolMessage({ toolName, args, result, output, running, isError }: ToolMessageRenderProps) {\n const name = workflowToolName(toolName);\n const summary = workflowCallSummary(name, args);\n const detail = [summary.target, ...summary.metadata].filter((value): value is string => value !== undefined);\n const structured = running || isError ? undefined : workflowStructuredView(name, args, result);\n const collapsed = workflowResultLines(name, args, result, { expanded: false, isError, isPartial: running });\n const full = workflowResultLines(name, args, result, { expanded: true, isError, isPartial: running });\n const expandable =\n !isError &&\n (structured !== undefined\n ? structured.facts.length + structured.rows.length > 0 || structured.note !== undefined\n : full.length > collapsed.length);\n return (\n <MessageItem tone={toolTone({ running, isError })} expandable={expandable}>\n {({ expanded }) => (\n <>\n <MessageItemHeader title={toolName}>\n <View testID={`tool-call-${toolName}`} style={styles.summary}>\n <Text numberOfLines={1} style={[styles.sans, styles.primary]}>\n {summary.action}\n </Text>\n {detail.length > 0 ? (\n <Text numberOfLines={1} ellipsizeMode=\"middle\" style={[styles.sans, styles.detail]}>\n · {detail.join(' · ')}\n </Text>\n ) : null}\n </View>\n </MessageItemHeader>\n {isError ? (\n <MessageItemBody testID={`tool-result-${toolName}`}>\n <WorkflowReason>{workflowFailureReason(result, output)}</WorkflowReason>\n </MessageItemBody>\n ) : structured !== undefined ? (\n <MessageItemBody testID={`tool-result-${toolName}`}>\n <View style={styles.stack}>\n <WorkflowHeadline text={structured.headline} />\n {expanded ? (\n <>\n <WorkflowFacts facts={structured.facts} />\n <WorkflowRows rows={structured.rows} />\n {structured.note !== undefined ? <WorkflowNote>{structured.note}</WorkflowNote> : null}\n </>\n ) : null}\n </View>\n </MessageItemBody>\n ) : (expanded ? full : collapsed).length > 0 ? (\n <MessageItemBody testID={`tool-result-${toolName}`}>\n <WorkflowLines lines={expanded ? full : collapsed} />\n </MessageItemBody>\n ) : null}\n </>\n )}\n </MessageItem>\n );\n}\n\nconst styles = StyleSheet.create((theme: PoNativeTheme) => ({\n // One line on the title's row: the action stays whole, the target and flags truncate in the middle.\n summary: { flex: 1, flexDirection: 'row', alignItems: 'center', gap: theme.spacing(2), minWidth: 0 },\n sans: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n },\n primary: { flexShrink: 0, maxWidth: '50%', fontWeight: theme.fontWeight.semibold, color: theme.colors.hi },\n detail: { flexShrink: 1, color: theme.colors.faint },\n stack: { gap: theme.spacing(3) },\n}));\n","import { defineToolRenderer } from '@agimon-ai/po-core/native';\n\nimport { WorkflowToolMessage } from './_components/WorkflowToolMessage.native';\n\nexport default defineToolRenderer({\n tools: ['list_workflows', 'launch_workflow', 'workflow_run', 'workflow_tools', 'scaffold_workflow'],\n message: WorkflowToolMessage,\n});\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineNativePlugin, type WebPluginContributions } from '@agimon-ai/po-core/native';\n\nimport fillWorkflows from '../src/extensions/workspaces/(frontend)/fill/Workflows.home.native';\nimport activityGroupWorkflows from '../src/extensions/workspaces/sessions/(frontend)/activity-group/workflows.native';\nimport channelDynamicWorkflowRuns from '../src/extensions/workspaces/sessions/(frontend)/channel/dynamic-workflow-runs.native';\nimport channelWorkflowCatalog from '../src/extensions/workspaces/sessions/(frontend)/channel/workflow-catalog.native';\nimport channelWorkflowRuns from '../src/extensions/workspaces/sessions/(frontend)/channel/workflow-runs.native';\nimport dockWorkflow from '../src/extensions/workspaces/sessions/(frontend)/dock/workflow.native';\nimport fillWorkflowLauncher from '../src/extensions/workspaces/sessions/(frontend)/fill/WorkflowLauncher.overlay.native';\nimport fillWorkflows2 from '../src/extensions/workspaces/sessions/(frontend)/fill/Workflows.activity.workflows.native';\nimport toolWorkflowChild from '../src/extensions/workspaces/sessions/(frontend)/tool/workflow-child.native';\nimport toolWorkflow from '../src/extensions/workspaces/sessions/(frontend)/tool/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: 'workflows',\n workspace: {\n get fills(): WebPluginContributions['fills'] { return [via({ slot: 'home', id: 'workflows' }, fillWorkflows)]; },\n },\n session: {\n get activityGroups(): WebPluginContributions['activityGroups'] { return [via({ name: 'workflows' }, activityGroupWorkflows)]; },\n get channels(): WebPluginContributions['channels'] { return [via({ channel: 'dynamic_workflow_runs' }, channelDynamicWorkflowRuns), via({ channel: 'workflow_catalog' }, channelWorkflowCatalog), via({ channel: 'workflow_runs' }, channelWorkflowRuns)]; },\n get dockFaces(): WebPluginContributions['dockFaces'] { return [via({ id: 'workflow' }, dockWorkflow)]; },\n get fills(): WebPluginContributions['fills'] { return [via({ slot: 'overlay', id: 'workflow-launcher' }, fillWorkflowLauncher), via({ slot: 'activity.workflows', id: 'workflows' }, fillWorkflows2)]; },\n get toolRenderers(): WebPluginContributions['toolRenderers'] { return [via({ tools: ['workflow_child'] }, toolWorkflowChild), via({ tools: ['workflow'] }, toolWorkflow)]; },\n },\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"native.mjs","names":["isRecord","isRecord","LiveDuration","useCallback","StyleProp","TextStyle","formatRunDuration","workflowDuration","WorkflowDuration","startedAt","endedAt","now","seconds","running","style","start","Date","parse","end","clock","clockNow","at","undefined","Number","isFinite","text","Math","max","live","nextMs","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","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","styles","WebPluginSlotProps","ChevronDownIcon","ChevronRightIcon","fontOf","PoNativeTheme","useCallback","useState","useSyncExternalStore","StyleSheet","dynamicWorkflows","stepRunsSummary","DynamicWorkflowView","useStepRuns","stepSessionId","subscribe","listener","subscription","store","unsubscribe","select","state","runs","StepDynamicRunsNote","undefined","length","summary","styles","text","failed","StepDynamicRuns","openSession","Pick","open","setOpen","section","expanded","toggle","title","create","theme","flex","flexShrink","borderTopWidth","borderTopColor","colors","border","uni__dependencies","flexDirection","alignItems","gap","spacing","paddingHorizontal","paddingVertical","fontFamily","sans","fontSize","base","lineHeight","fontWeight","semibold","color","hi","sm","dim","red","styles","Button","ChevronDownIcon","ChevronRightIcon","Dot","EmptyState","FileIcon","FolderIcon","Input","ListRow","SheetList","StatusBadge","fontOf","PoNativeTheme","ReactNode","useState","StyleSheet","WorkflowJobView","WorkflowRunView","WorkflowArtifactsResponse","WorkflowArtifactView","StepDynamicRunsNote","WorkflowDuration","formatRunDuration","activeSteps","attentionFor","runState","runFilterOf","runSearchText","WorkflowRunAction","ViewMode","FILTER","all","running","failed","done","const","Status","state","tone","Heading","title","count","styles","section","heading","meta","Duration","start","end","now","undefined","Math","max","Date","parse","Job","job","onOpen","step","open","setOpen","steps","filter","status","length","name","expanded","startedAt","endedAt","reason","map","group","Boolean","join","ref","kind","id","WorkflowArtifactList","listing","error","loading","onParent","artifact","artifacts","String","path","description","WorkflowDockViewProps","run","runs","sheet","dockHeader","busy","canAct","initialMode","onSelectRun","onOpenStep","onStop","onDelete","onLaunch","WorkflowDockView","mode","setMode","search","setSearch","setFilter","visibleRuns","item","includes","trim","toLowerCase","active","attention","attentionText","errorMessage","staleReason","text","List","FlatList","header","row","displayName","flexMeta","position","stage","workflowPath","finishedAt","ask","failure","body","jobs","details","picker","filters","Object","values","value","selected","workspace","routeKey","runKey","frame","embedded","list","actions","create","theme","fontFamily","sans","fontSize","base","lineHeight","color","colors","flex","backgroundColor","rail","uni__dependencies","red","gap","spacing","padding","borderBottomWidth","hairlineWidth","borderBottomColor","border","flexDirection","alignItems","xl","fontWeight","semibold","hi","lg","sm","dim","justifyContent","paddingHorizontal","paddingTop","paddingBottom","paddingVertical","minHeight","paddingLeft","margin","borderWidth","borderRadius","md","borderColor","borderTopWidth","borderTopColor","flexWrap","notice","styles","Button","fontOf","memo","useMemo","useState","StyleSheet","DELIMITED_COLUMN_STEP","DELIMITED_ROW_STEP","indexDelimited","readDelimitedWindow","DelimitedArtifact","text","delimiter","initialRows","document","window","setWindow","rows","columns","current","rowCount","rowStarts","length","Math","min","cells","styles","body","meta","copy","preview","tableRow","Array","from","_","column","cell","map","values","row","create","theme","flex","padding","spacing","gap","uni__dependencies","fontFamily","sans","fontSize","lg","lineHeight","color","colors","sm","dim","borderWidth","borderColor","borderRadius","md","flexDirection","width","borderRightWidth","borderBottomWidth","mono","styles","WebPluginSlotProps","Badge","Button","CodeBlock","Input","ListRow","Markdown","Sheet","SheetBody","SheetContent","SheetHeader","SheetTitle","Textarea","useCallback","useEffect","useMemo","useRef","useState","useSyncExternalStore","StyleSheet","STEP_ACTIVITY_SCOPE","WorkflowCatalogEntryView","WorkflowRunView","WorkflowArtifactContentResponse","WorkflowArtifactsResponse","WorkflowTerminalCapabilitiesView","catalog","closeCatalog","filterCatalog","openCatalog","initialChoice","initialCommand","initialInputs","initialRunner","launchProblems","workflowLaunchLine","deleteWorkflowRun","fetchArtifact","fetchArtifactMedia","prepareArtifactSave","finiteScreenReader","fetchArtifacts","readScreen","releaseControl","resizeRun","sendKeys","takeControl","stopWorkflowRun","workflowRunIdentity","runPriority","focusRun","removeRun","requestLaunch","workflows","WorkflowDockView","WorkflowArtifactList","WorkflowRunAction","DelimitedArtifact","StepDynamicRuns","useWorkflows","sessionId","subscribe","listener","sub","store","unsubscribe","select","state","workflowTab","run","Parameters","identity","id","workspace","routeKey","runKey","replace","label","displayName","retainComposer","panel","props","workflowsTab","WorkflowPanel","WorkflowLauncher","filter","setFilter","selected","setSelected","open","workflow","find","item","path","undefined","name","prompt","styles","body","warning","error","map","relativePath","description","jobs","job","join","length","meta","Choice","options","value","onChange","option","WorkflowLaunch","initialPrompt","sendSessionFrame","onClose","setPrompt","inputs","setInputs","runner","setRunner","command","setCommand","choice","setChoice","setError","request","trim","problems","line","input","type","required","current","runners","commands","choices","problem","cause","Error","message","String","focusedRun","runs","JSON","stringify","openTransientTab","WorkflowRunPanel","sheet","onSelectRun","busy","setBusy","operation","kind","mounted","stage","sort","left","right","act","action","Promise","token","dockHeader","step","target","steps","status","stepTab","result","closeTransientTab","ownerSessionId","at","session","ref","live","tabId","targetSessionId","activityScope","WorkflowStep","renderSessionTranscript","renderRunnerTerminal","setTransientTabSession","openSession","screen","title","WorkflowTerminal","pane","Pick","capabilities","setCapabilities","setToken","notice","setNotice","columns","setColumns","rows","setRows","lifetime","AbortController","abort","catch","key","read","signal","frame","aborted","write","text","arm","grant","held","reason","transcript","writable","resizable","Number","isInteger","WorkflowArtifacts","directory","setDirectory","requestKey","loaded","setLoaded","listing","active","then","artifacts","includes","slice","lastIndexOf","panelProps","ArtifactPreview","renderFilePreview","renderMediaPreview","nativeSaveFile","content","setContent","raw","setRaw","artifact","downloadController","saving","setSaving","saveNote","setSaveNote","download","controller","delimited","test","preview","html","prettyJson","truncated","BinaryArtifactPreview","media","data","mimeType","parse","create","theme","flex","backgroundColor","colors","bg","padding","spacing","uni__dependencies","gap","color","hi","fontSize","base","fontWeight","dim","sm","red","styles","WebPluginSlotProps","ArrowRightIcon","Button","Dot","fontOf","ListRow","PoNativeTheme","useState","StyleSheet","dynamicWorkflowTab","useDynamicWorkflows","DynamicWorkflowActivity","WorkflowDuration","useWorkflows","workflowTab","openCatalog","workflowActivityGroups","workflowActivityRows","WorkflowActivityGroupName","focusRun","WorkflowsActivitySection","sessionId","openSession","openTransientTab","state","dynamicRuns","runs","openedAt","Date","now","folded","setFolded","Partial","Record","groups","map","group","open","name","openByDefault","expanded","current","rows","length","row","identity","tone","runKey","ownerSessionId","run","find","item","workspace","routeKey","flexDirection","alignItems","styles","status","detail","startedAt","finishedAt","heading","idle","disabled","action","actionText","create","theme","flexWrap","gap","spacing","uni__dependencies","fontFamily","sans","fontSize","sm","lineHeight","fontWeight","semibold","color","colors","hi","paddingVertical","dim","base","medium","green","styles","asRecord","readString","readNumber","plural","Badge","fontOf","PoNativeTheme","StyleSheet","LineTone","ToolLine","WorkflowFact","WorkflowRow","WorkflowLines","lines","styles","map","entry","index","String","text","sans","TONE_STYLE","tone","bold","indent","WorkflowHeadline","chip","headline","length","hi","headlineText","undefined","label","WorkflowFacts","facts","fact","mono","value","WorkflowRows","title","rows","section","row","key","rowLine","rowTitle","detail","small","faint","WorkflowNote","children","WorkflowReason","error","create","theme","fontFamily","fontSize","base","lineHeight","uni__dependencies","sm","gap","spacing","flexDirection","alignItems","minWidth","flexShrink","flexWrap","columnGap","rowGap","maxWidth","xs","fontWeight","semibold","textTransform","color","colors","dim","paddingLeft","red","success","green","warning","yellow","accent","blue","Readonly","Record","muted","styles","ToolMessageRenderProps","fontOf","MessageItem","MessageItemBody","MessageItemHeader","MessageItemStatus","toolTone","PoNativeTheme","StyleSheet","workflowChildRunningLabel","workflowChildSummary","workflowChildView","workflowFailureReason","WorkflowFacts","WorkflowHeadline","WorkflowLines","WorkflowNote","WorkflowReason","WorkflowRows","WorkflowChildToolMessage","toolName","args","result","output","running","isError","summary","view","undefined","expandable","facts","length","sections","error","note","text","expanded","styles","primary","sans","detail","join","slice","map","tone","stack","headline","chip","section","title","rows","create","theme","flex","flexDirection","alignItems","gap","spacing","minWidth","uni__dependencies","fontFamily","fontSize","base","lineHeight","flexShrink","fontWeight","semibold","color","colors","hi","faint","styles","ToolMessageRenderProps","fontOf","MessageItem","MessageItemBody","MessageItemHeader","toolTone","PoNativeTheme","StyleSheet","workflowCallSummary","workflowFailureReason","workflowResultLines","workflowStructuredView","workflowToolName","WorkflowFacts","WorkflowHeadline","WorkflowLines","WorkflowNote","WorkflowReason","WorkflowRows","WorkflowToolMessage","toolName","args","result","output","running","isError","name","summary","detail","target","metadata","filter","value","undefined","structured","collapsed","expanded","isPartial","full","expandable","facts","length","rows","note","styles","sans","primary","action","join","stack","headline","create","theme","flex","flexDirection","alignItems","gap","spacing","minWidth","uni__dependencies","fontFamily","fontSize","base","lineHeight","flexShrink","maxWidth","fontWeight","semibold","color","colors","hi","faint","fillWorkflows","activityGroupWorkflows","channelDynamicWorkflowRuns","channelWorkflowCatalog","channelWorkflowRuns","dockWorkflow","fillWorkflowLauncher","fillWorkflows2","toolWorkflowChild","toolWorkflow"],"sources":["../../src/extensions/workspaces/(frontend)/fill/Workflows.home.native.ts","../../src/types/webWorkflows.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/catalogStore.native.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/launchLine.ts","../../src/types/apiRoutes.ts","../../generated/client.native.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/terminalApi.native.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/runDuration.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/workflowActivity.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/workflowRunPresentation.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/workflowsStore.native.ts","../../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/WorkflowDuration.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/_components/DynamicWorkflowView.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/_components/StepDynamicRuns.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/dock/_components/WorkflowDockView.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/_lib/delimitedPreview.ts","../../src/extensions/workspaces/sessions/(frontend)/_components/DelimitedArtifact.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/_components/WorkflowPanel.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/activity-group/workflows.native.ts","../../src/extensions/workspaces/sessions/(frontend)/channel/dynamic-workflow-runs.native.ts","../../src/extensions/workspaces/sessions/(frontend)/channel/workflow-catalog.native.ts","../../src/extensions/workspaces/sessions/(frontend)/channel/workflow-runs.native.ts","../../src/extensions/workspaces/sessions/(frontend)/dock/_components/WorkflowDockPanel.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/dock/workflow.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/fill/WorkflowLauncher.overlay.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/_components/DynamicWorkflowPanel.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/fill/_components/WorkflowsActivitySection.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/fill/Workflows.activity.workflows.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/_lib/workflowToolRender.ts","../../src/extensions/workspaces/sessions/(frontend)/tool/_lib/workflowChildToolView.ts","../../src/extensions/workspaces/sessions/(frontend)/tool/_components/WorkflowResultParts.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/_components/WorkflowChildToolMessage.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/workflow-child.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/_components/WorkflowToolMessage.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/workflow.native.tsx","../../generated/native.ts"],"sourcesContent":["import { defineFill } from '@agimon-ai/po-core/native';\n\nexport default defineFill({\n data: { version: 1, label: 'Workflows', source: 'workflow_runs', destination: 'workflows' },\n});\n","/**\n * Workflow run view types shared by this package's hub channel and its web\n * plugin. The shapes mirror what the embedded workflow-mcp engine records;\n * the cockpit renders them as 'workflow_runs' channel payloads.\n */\n\nimport type { PoHubSessionUsage } from '@agimon-ai/po-core/hubChannel';\nimport type { PoWorkflowChildrenStatus } from '@agimon-ai/po-core/workflow';\n\n/** Usage coverage is explicit: an absent total is not a measured zero. */\nexport interface WorkflowChildUsageSummary {\n /** False when a journal or any invocation metric is unavailable. */\n complete: boolean;\n invocationCount: number;\n tokensKnown: number;\n costKnown: number;\n toolCountKnown: number;\n tokens?: PoHubSessionUsage['tokens'];\n costUsd?: number;\n toolCount?: number;\n}\n\nexport interface WorkflowChildStatusError {\n lead?: string;\n message: string;\n}\n\n/** workflow-mcp's own stage vocabulary; the registry bucket a run record sits in. */\nexport type WorkflowStage = 'running' | 'completed' | 'error';\n\n/** workflow-mcp's terminal outcome for a finished run. */\nexport type WorkflowOutcome = 'success' | 'skipped' | 'failed' | 'interrupted';\n\n/** Recorded job/step states, plus pending entries from the workflow definition. */\nexport type WorkflowProgressState =\n | 'pending'\n | 'running'\n | 'completed'\n | 'skipped'\n | 'failed'\n | 'pause_requested'\n | 'paused'\n | 'resumed';\n\n/** A customRun step ran as this child session. */\nexport const STEP_SESSION_REF_KIND = 'session';\n/** A command step ran in this terminal pane. */\nexport const STEP_PANE_REF_KIND = 'pane';\n/** The activity panel's scope line while a step tab is open. */\nexport const STEP_ACTIVITY_SCOPE = 'diagnose step';\n\n/** Where a host executor ran a step: `session` for a customRun agent, `pane` for a command. */\nexport interface WorkflowStepRefView {\n kind: string;\n id: string;\n label?: string;\n}\n\nexport interface WorkflowStepView {\n name: string;\n status: WorkflowProgressState;\n /** Kept after the step ends, so a finished agent step still opens its conversation. */\n ref?: WorkflowStepRefView;\n /** Why the step is in its state, when the engine recorded one (e.g. a skip condition). */\n reason?: string;\n /** The parallel group the step ran in, beside the group's other steps. */\n group?: string;\n /** ISO 8601 of the step's first running event. */\n startedAt?: string;\n /** ISO 8601 of the step's terminal event. */\n endedAt?: string;\n}\n\n/** 'pre' and 'post' are the engine's pseudo-jobs for its pre:/post: blocks. */\nexport type WorkflowJobPhase = 'pre' | 'job' | 'post';\n\nexport interface WorkflowJobView {\n name: string;\n phase: WorkflowJobPhase;\n status: WorkflowProgressState;\n reason?: string;\n /** Position among the run's jobs, when the engine recorded one. */\n index?: number;\n total?: number;\n startedAt?: string;\n endedAt?: string;\n steps: WorkflowStepView[];\n}\n\n/** The job and step a run is on right now; drives the NOW breadcrumb. */\nexport interface WorkflowPosition {\n job: string;\n step?: string;\n index?: number;\n total?: number;\n}\n\n/**\n * One workflow run of a session, read from workflow-mcp's registry: the\n * run.json record plus the folded progress.ndjson job tree.\n */\nexport interface WorkflowRunView {\n /** Opaque owner-qualified API/cache key. The displayed engine runKey stays unchanged. */\n routeKey?: string;\n /** Engine generation identity, distinct from a reused run key. */\n runId?: string;\n /** Registry identity within its workspace; unique per workspace+stage. */\n runKey: string;\n workspace: string;\n displayName: string;\n workflowName?: string;\n workflowPath: string;\n stage: WorkflowStage;\n outcome?: WorkflowOutcome;\n /** Present while the engine is pausing or paused; absent for plain running. */\n executionState?: 'running' | 'pause_requested' | 'paused' | 'resume_requested';\n /** The prompt the run was launched with, when one was recorded. */\n prompt?: string;\n /** ISO 8601, from the run record. */\n startedAt: string;\n finishedAt?: string;\n /** Failure cause with ANSI escapes stripped, present when the run errored. */\n errorMessage?: string;\n /** The job the engine blamed for the failure, when it recorded one. */\n failedJob?: string;\n /** True when reconciliation decided the recorded pid is no longer alive. */\n stale?: boolean;\n staleReason?: string;\n worktreeBranch?: string;\n /** The session that owns the run (its PO_SESSION_ID); absent on records that carry none. */\n ownerSessionId?: string;\n /** The session that launched the run into its own workflow session, when it was handed off. */\n launcherSessionId?: string;\n position?: WorkflowPosition;\n jobs: WorkflowJobView[];\n /** Latest durable child state, including readable agent-session references. */\n children?: readonly PoWorkflowChildrenStatus[];\n childUsage?: WorkflowChildUsageSummary;\n /** Missing or corrupt child evidence is visible, never represented as successful empty work. */\n childStatusErrors?: WorkflowChildStatusError[];\n}\n\n/** What the workflow runs channel publishes for one session. */\nexport interface WorkflowRunsPayload {\n runs: WorkflowRunView[];\n}\n\nexport const WORKFLOW_RUNS_TYPE = 'workflow_runs';\n\n/**\n * One workflow the session's directory can launch, as the catalog drawer\n * lists it: the engine's own catalog entry plus the parsed detail the drawer\n * unfolds and the launch dialog turns into fields.\n */\nexport interface WorkflowCatalogEntryView {\n /** Absolute path, the row's stable identity. */\n path: string;\n relativePath: string;\n name: string;\n description: string;\n tags: string[];\n /** The trigger names the file declares, such as workflow_dispatch. */\n triggers: string[];\n inputs: WorkflowCatalogInputView[];\n jobs: WorkflowCatalogJobView[];\n artifacts: WorkflowCatalogArtifactView[];\n /** Absent when the workflow names no runner map, which means any runner will do. */\n runners?: string[];\n /** Commands every templated step offers; absent when no step is templated. */\n commands?: string[];\n /** Declared model choices; `default` is used when a launch names none. */\n choices?: string[];\n /** Set when the file could not be parsed; the row shows this instead of guessing. */\n error?: string;\n}\n\nexport interface WorkflowCatalogInputView {\n name: string;\n description?: string;\n required?: boolean;\n default?: string;\n type?: string;\n options?: string[];\n}\n\nexport interface WorkflowCatalogJobView {\n name: string;\n steps: string[];\n}\n\nexport interface WorkflowCatalogArtifactView {\n path: string;\n kind: 'file' | 'directory';\n description: string;\n producedBy: string[];\n}\n\n/** What the catalog channel publishes for one session. */\nexport interface WorkflowCatalogPayload {\n /** The directory the catalog was read from, which is the session's own. */\n cwd: string;\n workflows: WorkflowCatalogEntryView[];\n /** Present when the directory could not be read at all. */\n warning?: string;\n}\n\nexport const WORKFLOW_CATALOG_TYPE = 'workflow_catalog';\n\nexport interface WorkflowInputSummary {\n name: string;\n description?: string;\n required?: boolean;\n default?: string;\n options?: readonly string[];\n}\n\nexport interface WorkflowJobSummary {\n name: string;\n steps: readonly string[];\n}\n\n/**\n * What the detail pane shows for one workflow. `runners` is undefined when the\n * workflow names no runner map at all, which is not the same as naming an empty\n * one - see `compatibleRunners`.\n */\nexport interface WorkflowCatalogDetail {\n triggers: readonly string[];\n inputs: readonly WorkflowInputSummary[];\n jobs: readonly WorkflowJobSummary[];\n runners?: readonly string[];\n /** Commands every templated step offers; absent when no step is templated. */\n commands?: readonly string[];\n /** Declared model choices. */\n choices?: readonly string[];\n /** Set when the file could not be parsed; the pane shows this instead of guessing. */\n error?: string;\n}\n","import { defineSessionStore } from '@agimon-ai/po-core/native';\n\nimport {\n WORKFLOW_CATALOG_TYPE,\n type WorkflowCatalogEntryView,\n type WorkflowCatalogPayload,\n} from '../../../../../types/webWorkflows';\n\n/** One session's catalog: what the hub last reported plus what the drawer is doing with it. */\nexport interface CatalogSession {\n cwd: string;\n workflows: WorkflowCatalogEntryView[];\n warning: string | undefined;\n /** True while the catalog drawer is shown in the workflows tab. */\n open: boolean;\n filter: string;\n /** Prompt carried from the surface that opened the catalog. */\n prompt: string;\n /** The highlighted row, by workflow path. */\n selected: string | undefined;\n /** The row whose parsed detail is unfolded. */\n inspected: string | undefined;\n /** The workflow the launch dialog is open for. */\n launch: string | undefined;\n}\n\nexport const catalog = defineSessionStore<CatalogSession>({\n cwd: '',\n workflows: [],\n warning: undefined,\n open: false,\n filter: '',\n prompt: '',\n selected: undefined,\n inspected: undefined,\n launch: undefined,\n});\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function openCatalog(sessionId: string, prompt = ''): void {\n catalog.update(sessionId, (current) => ({ ...current, open: true, prompt }));\n}\n\nexport function closeCatalog(sessionId: string): void {\n catalog.update(sessionId, (current) => ({ ...current, open: false, prompt: '', launch: undefined }));\n}\n\nexport function setCatalogFilter(sessionId: string, filter: string): void {\n catalog.update(sessionId, (current) => ({ ...current, filter }));\n}\n\nexport function selectWorkflow(sessionId: string, path: string | undefined): void {\n catalog.update(sessionId, (current) => ({ ...current, selected: path }));\n}\n\nexport function toggleInspect(sessionId: string, path: string): void {\n catalog.update(sessionId, (current) => ({ ...current, inspected: current.inspected === path ? undefined : path }));\n}\n\nexport function openLaunch(sessionId: string, path: string): void {\n catalog.update(sessionId, (current) => ({ ...current, selected: path, launch: path }));\n}\n\nexport function closeLaunch(sessionId: string): void {\n catalog.update(sessionId, (current) => ({ ...current, launch: undefined }));\n}\n\n/** Rows whose name, path, tag or job matches the filter, case-insensitively. */\nexport function filterCatalog(\n workflows: readonly WorkflowCatalogEntryView[],\n filter: string,\n): WorkflowCatalogEntryView[] {\n const needle = filter.trim().toLowerCase();\n if (needle === '') return [...workflows];\n return workflows.filter((workflow) =>\n [\n workflow.name,\n workflow.relativePath,\n workflow.description,\n ...workflow.tags,\n ...workflow.jobs.map((job) => job.name),\n ]\n .join('\\n')\n .toLowerCase()\n .includes(needle),\n );\n}\n\n/** The plugin's catalog channel: 'workflow_catalog' payloads into the store. */\nexport const workflowCatalogChannel = catalog.channel<WorkflowCatalogPayload>({\n channel: WORKFLOW_CATALOG_TYPE,\n parse(input) {\n if (!isRecord(input) || typeof input.cwd !== 'string' || !Array.isArray(input.workflows)) return null;\n return {\n cwd: input.cwd,\n workflows: input.workflows.filter(isRecord) as unknown as WorkflowCatalogEntryView[],\n ...(typeof input.warning === 'string' ? { warning: input.warning } : {}),\n };\n },\n reduce(current, payload) {\n const paths = new Set(payload.workflows.map((workflow) => workflow.path));\n return {\n ...current,\n cwd: payload.cwd,\n workflows: payload.workflows,\n warning: payload.warning,\n // A row that is gone cannot stay selected, inspected, or half-launched.\n selected: current.selected !== undefined && paths.has(current.selected) ? current.selected : undefined,\n inspected: current.inspected !== undefined && paths.has(current.inspected) ? current.inspected : undefined,\n launch: current.launch !== undefined && paths.has(current.launch) ? current.launch : undefined,\n };\n },\n});\n","import type { WorkflowCatalogEntryView } from '../../../../../types/webWorkflows';\n\n/**\n * The `/workflow-launch` line the dialog sends.\n *\n * WHY THE BUILDER LIVES HERE AND THE PARSER DOES NOT:\n * Cockpit code is compiled into the host bundle and may import only this\n * package's own web and type modules, so it cannot share the session's parser.\n * The two are pinned together by a test that parses what this writes, which is\n * the only guarantee that matters: the line has to survive the trip.\n */\n\nexport const WORKFLOW_LAUNCH_VERB = '/workflow-launch';\n/** Reserved keys; every other pair is one of the workflow's own inputs. */\nexport const RUNNER_KEY = 'runner';\nexport const COMMAND_KEY = 'command';\nexport const CHOICE_KEY = 'choice';\nexport const PROFILE_KEY = 'profile';\n\nexport interface WorkflowLaunchRequest {\n workflow: string;\n runner?: string;\n command?: string;\n choice?: string;\n profile?: string;\n inputs: Record<string, string>;\n prompt?: string;\n}\n\n/** Quotes a value that carries whitespace, which is how a value survives tokenizing. */\nfunction quote(value: string): string {\n return /\\s/.test(value) ? `\"${value}\"` : value;\n}\n\nfunction reservedPair(key: string, value: string | undefined): string[] {\n return value === undefined || value === '' ? [] : [`${key}=${quote(value)}`];\n}\n\nexport function workflowLaunchLine(request: WorkflowLaunchRequest): string {\n const pairs = [\n ...reservedPair(RUNNER_KEY, request.runner),\n ...reservedPair(COMMAND_KEY, request.command),\n ...reservedPair(CHOICE_KEY, request.choice),\n ...reservedPair(PROFILE_KEY, request.profile),\n ...Object.entries(request.inputs)\n .filter(([, value]) => value !== '')\n .map(([key, value]) => `${key}=${quote(value)}`),\n ];\n const prompt = request.prompt?.trim();\n return [WORKFLOW_LAUNCH_VERB, quote(request.workflow), ...pairs, ...(prompt ? ['--', prompt] : [])].join(' ');\n}\n\n/** The trigger that makes a prompt mandatory. */\nconst USER_PROMPT_TRIGGER = 'user_prompt';\n\n/** What the dialog will not let a reader send, worded the way the session would answer. */\nexport function launchProblems(workflow: WorkflowCatalogEntryView, request: WorkflowLaunchRequest): string[] {\n const problems: string[] = [];\n if (workflow.triggers.includes(USER_PROMPT_TRIGGER) && (request.prompt ?? '').trim() === '') {\n problems.push('This workflow is triggered by a prompt, so it needs one.');\n }\n const missing = workflow.inputs\n .filter((input) => input.required === true && (request.inputs[input.name] ?? '') === '')\n .map((input) => input.name);\n if (missing.length > 0) {\n problems.push(`Missing required input${missing.length > 1 ? 's' : ''}: ${missing.join(', ')}.`);\n }\n return problems;\n}\n\n/** The default a field starts with: what the workflow declared, or empty. */\nexport function initialInputs(workflow: WorkflowCatalogEntryView): Record<string, string> {\n return Object.fromEntries(workflow.inputs.map((input) => [input.name, input.default ?? '']));\n}\n\n/** The runner a launch starts on: the workflow's first declared one, when it declares any. */\nexport function initialRunner(workflow: WorkflowCatalogEntryView): string | undefined {\n return workflow.runners?.[0];\n}\n\n/** The command templated steps start on: the one their steps list first. */\nexport function initialCommand(workflow: WorkflowCatalogEntryView): string | undefined {\n return workflow.commands?.[0];\n}\n\n/** The choice a launch starts on: `default` when declared, else the first. */\nexport function initialChoice(workflow: WorkflowCatalogEntryView): string | undefined {\n const choices = workflow.choices ?? [];\n return choices.includes('default') ? 'default' : choices[0];\n}\n","import type { ApiResponseOf, ApiRoutes } from '@agimon-ai/po-core/web';\n\nimport type {\n WorkflowArtifactContentResponse,\n WorkflowArtifactsResponse,\n WorkflowControlResponse,\n WorkflowDeleteResponse,\n WorkflowLaunchResponse,\n WorkflowOpenRunDirectoryResponse,\n WorkflowSteerResponse,\n WorkflowStopResponse,\n WorkflowScreenEvent,\n} from './webWorkflowTerminal';\n\n/**\n * This package's routes, as data.\n *\n * No scope and no base path. The build reads both off\n * `src/extensions/(backend)/api/workflow/`, so the mount is stated once, by the\n * folder that creates it. The same API answers at all three scopes, because a\n * global contribution cascades into workspace and session; the folder under\n * `workspaces/sessions/` only re-mounts it for a session's own server.\n *\n * This is the one file the routes, the Hono app and the browser all read, so a\n * path cannot move on one side alone. The page used to build the hub's own\n * absolute URL and then rewrite its plugin prefix with String.replace to reach\n * a session, which is exactly the kind of copy that can move by one character\n * without anything noticing.\n *\n * `:workspace` and `:runKey` are Hono's own parameter syntax, because the app\n * registers `path` verbatim.\n */\n\n/** One run, which every route below addresses. */\nconst RUN = '/runs/:workspace/:runKey';\n\n/**\n * The artifact route's parameter, as Hono spells a multi-segment match.\n *\n * An artifact is named by its path inside the run directory, so `reports/a.md`\n * is one parameter across two segments. The client's `params` substitution\n * fills a single segment and percent-encodes the slash with it, so the page\n * substitutes this one itself; see the page's `_lib/terminalApi.ts`.\n */\nexport const ARTIFACT_NAME_PARAM = ':name{.+}';\n\n/**\n * The step whose pane a terminal route reads: a step ref's id. Absent, the\n * route follows the run's current step, which is one of a parallel group's.\n */\nexport const STEP_TARGET_PARAM = 'step';\n\n/** Query parameters the artifact route reads, spelled once for both halves. */\nexport const ARTIFACT_RAW_PARAM = 'raw';\nexport const ARTIFACT_DOWNLOAD_PARAM = 'download';\n\nconst routes = {\n /**\n * The terminal, as server-sent events.\n *\n * `stream: true` gets a URL and no call method: the consumer is the browser's\n * own `EventSource`, and a relayed call would buffer a stream that never ends.\n */\n snapshot: {\n method: 'GET',\n path: `${RUN}/screen`,\n query: [STEP_TARGET_PARAM],\n response: undefined as unknown as ApiResponseOf<WorkflowScreenEvent>,\n },\n screen: {\n method: 'GET',\n path: `${RUN}/screen/stream`,\n query: [STEP_TARGET_PARAM],\n stream: true,\n },\n control: {\n method: 'POST',\n path: `${RUN}/control`,\n response: undefined as unknown as ApiResponseOf<WorkflowControlResponse>,\n },\n keys: {\n method: 'POST',\n path: `${RUN}/keys`,\n },\n resize: {\n method: 'POST',\n path: `${RUN}/resize`,\n response: undefined as unknown as ApiResponseOf<{ resized: boolean }>,\n },\n remove: {\n method: 'DELETE',\n path: RUN,\n response: undefined as unknown as ApiResponseOf<WorkflowDeleteResponse>,\n },\n stop: {\n method: 'POST',\n path: `${RUN}/stop`,\n response: undefined as unknown as ApiResponseOf<WorkflowStopResponse>,\n },\n /** Guidance for the agent session the running step is in, like steering a Team sub-agent. */\n steer: {\n method: 'POST',\n path: `${RUN}/steer`,\n response: undefined as unknown as ApiResponseOf<WorkflowSteerResponse>,\n },\n /**\n * Launch a workflow into the mounting session's own runtime, which then owns\n * the run. A dispatcher session reaches its root's session mount through this.\n */\n launch: {\n method: 'POST',\n path: '/launch',\n response: undefined as unknown as ApiResponseOf<WorkflowLaunchResponse>,\n },\n openRunDirectory: {\n method: 'POST',\n path: `${RUN}/open-directory`,\n response: undefined as unknown as ApiResponseOf<WorkflowOpenRunDirectoryResponse>,\n },\n artifacts: {\n method: 'GET',\n path: `${RUN}/artifacts`,\n query: ['directory'],\n response: undefined as unknown as ApiResponseOf<WorkflowArtifactsResponse>,\n },\n /** One artifact: its metadata and text, or its raw bytes under `raw=1`. */\n artifact: {\n method: 'GET',\n path: `${RUN}/artifacts/${ARTIFACT_NAME_PARAM}`,\n query: [ARTIFACT_RAW_PARAM, ARTIFACT_DOWNLOAD_PARAM],\n response: undefined as unknown as ApiResponseOf<WorkflowArtifactContentResponse>,\n },\n} as const satisfies ApiRoutes;\n\nexport default routes;\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { createApiClient, nativeApiTransport, sessionApiAddress } from '@agimon-ai/po-core/native';\n\nimport routes from '../src/types/apiRoutes';\n\n/** Scopes the tree mounts 'workflow' at. */\nexport const apiScopes = ['global', 'workspace', 'session'] as const;\n\nexport const api = createApiClient(routes, {\n scopes: apiScopes,\n basePath: 'workflow',\n transport: nativeApiTransport,\n sessionAddress: sessionApiAddress,\n});\n","import { encodeBase64 } from '@agimon-ai/po-core/native';\nimport type { WebPluginSlotProps } from '@agimon-ai/po-core/native';\nimport { nativeApiTransport } from '@agimon-ai/po-core/native';\n\nimport { api } from '../../../../../../generated/client.native';\nimport {\n ARTIFACT_DOWNLOAD_PARAM,\n ARTIFACT_NAME_PARAM,\n ARTIFACT_RAW_PARAM,\n STEP_TARGET_PARAM,\n} from '../../../../../types/apiRoutes';\nimport {\n type WorkflowArtifactContentResponse,\n type WorkflowArtifactsResponse,\n type WorkflowControlResponse,\n type WorkflowDeleteResponse,\n type WorkflowScreenEvent,\n type WorkflowSteerResponse,\n type WorkflowStopResponse,\n} from '../../../../../types/webWorkflowTerminal';\n\n/**\n * The page's half of this package's hub API: one run's terminal and the files\n * its run directory holds.\n *\n * These are adapters now, not a transport. The generated client owns the URL\n * and the sealed transport with it, so nothing here spells a mount. What stays\n * is this package's own vocabulary: which refusals the reader is shown, and the\n * shapes the terminal expects back.\n *\n * A run belongs to its multiplexer rather than to a session, so the same API\n * answers at the hub and inside a session's own server. Passing a session id\n * addresses that session's copy and passing none addresses the hub. The deleted\n * builder made that branch the other way round: it always built the hub's\n * absolute URL, then rewrote the plugin prefix into the session's with\n * String.replace, so a session's URL was a hub URL with its head swapped.\n */\n\nconst UNREACHABLE = 'The cockpit hub is unreachable.';\n\n/** One of the scopes this API mounts at; every route is the same on all of them. */\ntype WorkflowScope = typeof api.global;\n\n/** The hub, or one session's own copy of it; a null session id is the hub. */\nfunction scoped(sessionId?: string | null): WorkflowScope {\n return sessionId == null ? api.global : api.session(sessionId);\n}\n\n/** The run every route addresses, as the route table's two path parameters. */\nfunction runParams(workspace: string, runKey: string): { workspace: string; runKey: string } {\n return { workspace, runKey };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/**\n * The message a reader is shown: the route's own words, or why there were none.\n *\n * `error` is optional because an answered call that simply carried the wrong\n * shape reaches here too, and that result has no error field at all.\n */\nfunction messageOf(result: { status: number; error?: string }, fallback: string): string {\n if (result.status === 0) return UNREACHABLE;\n return result.error === undefined || result.error === '' ? fallback : result.error;\n}\n\n/**\n * One artifact's URL, with its path filled in.\n *\n * An artifact is named by its path inside the run directory, which Hono matches\n * as the one multi-segment parameter `:name{.+}`. The client's own `params`\n * substitution fills a single segment and percent-encodes the separating slash\n * with it, which would move every nested artifact's URL, so that one segment is\n * substituted here instead: each segment encoded, the slashes between them\n * kept. Everything left of it still comes from the client.\n */\nfunction artifactUrl(\n scope: WorkflowScope,\n workspace: string,\n runKey: string,\n artifactPath: string,\n query?: Record<string, number>,\n): string {\n return scope.artifact\n .url({ params: runParams(workspace, runKey), ...(query === undefined ? {} : { query }) })\n .replace(ARTIFACT_NAME_PARAM, artifactPath.split('/').map(encodeURIComponent).join('/'));\n}\n\n/** The pane a terminal call names, when it reads one step's rather than the run's current one. */\nfunction stepBody(step: string | undefined): { step?: string } {\n return step === undefined ? {} : { step };\n}\n\n/** One finite screen read over the session-bound sealed transport. */\nexport async function readScreen(\n workspace: string,\n runKey: string,\n sessionId: string | null,\n step: string | undefined,\n signal: AbortSignal,\n): Promise<WorkflowScreenEvent> {\n const response = await nativeApiTransport(\n scoped(sessionId).snapshot.url({\n params: runParams(workspace, runKey),\n query: { [STEP_TARGET_PARAM]: step },\n }),\n { signal },\n );\n const body: unknown = await response.json();\n if (!response.ok)\n throw new Error(isRecord(body) && typeof body.error === 'string' ? body.error : 'The screen could not be read.');\n if (\n !isRecord(body) ||\n !Array.isArray(body.lines) ||\n body.lines.length > 48 ||\n !body.lines.every((line) => typeof line === 'string' && line.length <= 4096) ||\n !isRecord(body.capabilities) ||\n typeof body.capabilities.readable !== 'boolean' ||\n typeof body.capabilities.writable !== 'boolean' ||\n typeof body.capabilities.resizable !== 'boolean'\n ) {\n throw new Error('The workflow hub returned an invalid screen.');\n }\n return body as unknown as WorkflowScreenEvent;\n}\n\n/** Takes the keyboard for one run, renewing when this page already holds it. */\nexport async function takeControl(\n workspace: string,\n runKey: string,\n token?: string,\n sessionId?: string | null,\n step?: string,\n): Promise<WorkflowControlResponse> {\n const result = await scoped(sessionId).control({\n params: runParams(workspace, runKey),\n body: { token, ...stepBody(step) },\n });\n if (result.status === 0) return { held: false, reason: UNREACHABLE };\n // A refusal carries the same shape as a grant, so the body is read before the\n // status: a 409 says who holds the keyboard and why, which is the answer.\n if (isRecord(result.data) && typeof result.data.held === 'boolean') {\n return result.data as unknown as WorkflowControlResponse;\n }\n return { held: false, reason: messageOf(result, 'The run refused the keyboard.') };\n}\n\nexport async function releaseControl(\n workspace: string,\n runKey: string,\n token: string,\n sessionId?: string | null,\n step?: string,\n): Promise<void> {\n await scoped(sessionId).control({\n params: runParams(workspace, runKey),\n body: { token, release: true, ...stepBody(step) },\n });\n}\n\n/** Sends literal keystrokes; the reason comes back when the lease has moved on. */\nexport async function sendKeys(\n workspace: string,\n runKey: string,\n token: string,\n data: string,\n sessionId?: string | null,\n step?: string,\n): Promise<{ error?: string }> {\n const result = await scoped(sessionId).keys({\n params: runParams(workspace, runKey),\n body: { token, data, ...stepBody(step) },\n });\n if (result.ok) return {};\n return { error: messageOf(result, 'The run would not take those keys.') };\n}\n\n/** Matches the run's terminal to the viewport of whoever holds the keyboard. */\nexport async function resizeRun(\n workspace: string,\n runKey: string,\n token: string,\n columns: number,\n rows: number,\n sessionId?: string | null,\n step?: string,\n): Promise<void> {\n await scoped(sessionId).resize({\n params: runParams(workspace, runKey),\n body: { token, columns, rows, ...stepBody(step) },\n });\n}\n\nexport type DeleteWorkflowResult = { result: WorkflowDeleteResponse } | { error: string };\n\n/** Permanently removes one settled run and its run directory. */\nexport async function deleteWorkflowRun(\n workspace: string,\n runKey: string,\n sessionId?: string | null,\n): Promise<DeleteWorkflowResult> {\n const result = await scoped(sessionId).remove({ params: runParams(workspace, runKey) });\n if (!result.ok) return { error: messageOf(result, 'The workflow could not be deleted.') };\n if (result.data.deleted === true) return { result: { deleted: true } };\n return { error: 'The workflow hub returned an invalid deletion response.' };\n}\n\nexport type StopWorkflowResult = { result: WorkflowStopResponse } | { error: string };\n\n/** Asks the engine running a workflow to stop it; the run settles on its own shortly after. */\nexport async function stopWorkflowRun(\n workspace: string,\n runKey: string,\n sessionId?: string | null,\n): Promise<StopWorkflowResult> {\n const result = await scoped(sessionId).stop({ params: runParams(workspace, runKey) });\n if (!result.ok) return { error: messageOf(result, 'The workflow could not be stopped.') };\n if (result.data.requested === true) return { result: { requested: true } };\n return { error: 'The workflow hub returned an invalid stop response.' };\n}\n\nexport type SteerStepResult = { result: WorkflowSteerResponse } | { error: string };\n\n/**\n * Sends guidance to the agent session a running step is in: the run's current\n * step, or `step`, the session of one step of a parallel group.\n */\nexport async function steerStep(\n workspace: string,\n runKey: string,\n message: string,\n sessionId?: string | null,\n step?: string,\n): Promise<SteerStepResult> {\n const result = await scoped(sessionId).steer({\n params: runParams(workspace, runKey),\n body: step === undefined ? { message } : { message, step },\n });\n if (!result.ok) return { error: messageOf(result, 'The step would not take that guidance.') };\n if (result.data.delivered === true) return { result: { delivered: true } };\n return { error: 'The workflow hub returned an invalid steer response.' };\n}\n\n/** Opens the current registry folder, never a browser-supplied path. */\nexport async function openRunDirectory(\n workspace: string,\n runKey: string,\n sessionId?: string | null,\n): Promise<{ error?: string }> {\n const result = await scoped(sessionId).openRunDirectory({ params: runParams(workspace, runKey) });\n if (!result.ok) return { error: messageOf(result, 'The run folder could not be opened in Finder.') };\n return result.data.opened === true ? {} : { error: 'The workflow hub returned an invalid folder response.' };\n}\n\nexport type ArtifactsResult = { artifacts: WorkflowArtifactsResponse } | { error: string };\n\nexport async function fetchArtifacts(\n workspace: string,\n runKey: string,\n sessionId?: string | null,\n directory?: string,\n): Promise<ArtifactsResult> {\n const result = await scoped(sessionId).artifacts({ params: runParams(workspace, runKey), query: { directory } });\n if (!result.ok) return { error: messageOf(result, 'This run has no directory to read.') };\n return { artifacts: result.data };\n}\n\nexport type ArtifactResult = { artifact: WorkflowArtifactContentResponse } | { error: string };\n\n/** Trusted same-origin URL for browser-native media previews and downloads. */\nexport function artifactContentUrl(\n workspace: string,\n runKey: string,\n path: string,\n download = false,\n sessionId?: string | null,\n): string {\n return artifactUrl(scoped(sessionId), workspace, runKey, path, {\n [ARTIFACT_RAW_PARAM]: 1,\n ...(download ? { [ARTIFACT_DOWNLOAD_PARAM]: 1 } : {}),\n });\n}\n\n/**\n * One artifact's metadata and text.\n *\n * The only route here that addresses itself rather than being called: its path\n * parameter spans segments, so the URL comes from `artifactUrl` and the request\n * goes over the same sealed transport the client is built on.\n */\nexport async function fetchArtifact(\n workspace: string,\n runKey: string,\n path: string,\n sessionId?: string | null,\n): Promise<ArtifactResult> {\n try {\n const response = await nativeApiTransport(artifactUrl(scoped(sessionId), workspace, runKey, path));\n const body = (await response.json()) as unknown;\n if (!response.ok) {\n const error = isRecord(body) && typeof body.error === 'string' && body.error !== '' ? body.error : '';\n return { error: error === '' ? 'That file has not been written.' : error };\n }\n return { artifact: body as WorkflowArtifactContentResponse };\n } catch {\n return { error: UNREACHABLE };\n }\n}\n\nconst MAX_MEDIA_BYTES = 5 * 1024 * 1024;\nconst MAX_FRAME_BYTES = 64 * 1024;\n\n/** Drain each UTF-8 snapshot before asking the server for another screen. */\nexport function finiteScreenReader(load: (signal: AbortSignal) => Promise<WorkflowScreenEvent>) {\n let bytes: Uint8Array = new Uint8Array(0);\n let cursor = 0;\n let generation = 0;\n let frame: WorkflowScreenEvent | undefined;\n return async (from: number, previous: string | undefined, signal: AbortSignal) => {\n if (signal.aborted) throw new Error('Preview cancelled.');\n let reset = previous !== String(generation) || from !== cursor;\n if (!frame || cursor >= bytes.length || reset) {\n const next = await load(signal);\n if (signal.aborted) throw new Error('Preview cancelled.');\n frame = next;\n bytes = utf8(next.lines.join('\\r\\n'));\n cursor = 0;\n generation += 1;\n reset = true;\n }\n const chunk = bytes.subarray(cursor, cursor + MAX_FRAME_BYTES);\n cursor += chunk.length;\n return {\n chunk: encodeBase64(chunk),\n offset: cursor,\n reset,\n generation: String(generation),\n exists: frame.capabilities.readable,\n hasMore: cursor < bytes.length,\n ended: frame.ended === true,\n };\n };\n}\n\n/** Raw media uses the same scoped sealed route as artifact metadata. */\nexport async function fetchArtifactMedia(\n workspace: string,\n runKey: string,\n path: string,\n sessionId: string | null,\n signal: AbortSignal,\n): Promise<{ data: string; mimeType: string }> {\n if (signal.aborted) throw new Error('Preview cancelled.');\n const response = await nativeApiTransport(artifactContentUrl(workspace, runKey, path, false, sessionId), { signal });\n if (signal.aborted) throw new Error('Preview cancelled.');\n if (!response.ok) throw new Error('That artifact could not be read.');\n const mimeType = (response.headers.get('content-type') ?? '').split(';')[0]!.trim().toLowerCase();\n if (\n !/^(application\\/pdf|image\\/(png|jpeg|gif|webp|bmp)|audio\\/(mpeg|mp4|wav|x-wav|ogg|webm|aac|flac)|video\\/(mp4|webm|quicktime|ogg))$/.test(\n mimeType,\n )\n )\n throw new Error('This artifact type cannot be previewed.');\n if (Number(response.headers.get('content-length')) > MAX_MEDIA_BYTES)\n throw new Error('This artifact exceeds the 5 MiB preview limit.');\n const bytes = await response.arrayBuffer();\n if (signal.aborted) throw new Error('Preview cancelled.');\n if (bytes.byteLength > MAX_MEDIA_BYTES) throw new Error('This artifact exceeds the 5 MiB preview limit.');\n return { data: encodeBase64(new Uint8Array(bytes)), mimeType };\n}\n\nfunction utf8(text: string): Uint8Array {\n const bytes: number[] = [];\n for (const character of text) {\n let code = character.codePointAt(0)!;\n if (code >= 0xd800 && code <= 0xdfff) code = 0xfffd;\n if (code < 0x80) bytes.push(code);\n else if (code < 0x800) bytes.push(0xc0 | (code >> 6), 0x80 | (code & 63));\n else if (code < 0x10000) bytes.push(0xe0 | (code >> 12), 0x80 | ((code >> 6) & 63), 0x80 | (code & 63));\n else bytes.push(0xf0 | (code >> 18), 0x80 | ((code >> 12) & 63), 0x80 | ((code >> 6) & 63), 0x80 | (code & 63));\n }\n return Uint8Array.from(bytes);\n}\n\n/** Binds a save to this package's guarded sealed route and one file version. */\nexport async function prepareArtifactSave(\n workspace: string,\n runKey: string,\n path: string,\n sessionId: string | null,\n signal: AbortSignal,\n): Promise<Parameters<NonNullable<WebPluginSlotProps['nativeSaveFile']>>[0]> {\n const load = async (headers: Record<string, string>, signal: AbortSignal): Promise<Response> => {\n if (signal.aborted) throw new Error('Download cancelled.');\n return nativeApiTransport(artifactContentUrl(workspace, runKey, path, true, sessionId), { headers, signal });\n };\n const probe = await load({ Range: 'bytes=0-0' }, signal);\n if (signal.aborted) throw new Error('Download cancelled.');\n const range = /^bytes 0-0\\/(\\d+)$/u.exec(probe.headers.get('content-range') ?? '');\n const empty =\n (probe.status === 416 && probe.headers.get('content-range') === 'bytes */0') ||\n (probe.status === 200 && probe.headers.get('content-length') === '0');\n if (!empty && (probe.status !== 206 || !range)) throw new Error('The file does not support bounded downloads.');\n const size = empty ? 0 : Number(range![1]);\n if (!Number.isSafeInteger(size) || size < 0) throw new Error('Invalid file size.');\n const probeBytes = await probe.arrayBuffer();\n if (probeBytes.byteLength !== (empty ? 0 : 1)) throw new Error('Invalid file response.');\n const version = probe.headers.get('etag');\n if (!version) throw new Error('The file has no version validator.');\n return {\n name: path.split(/[\\\\/]/u).at(-1) ?? '',\n mimeType: probe.headers.get('content-type')?.split(';')[0]?.trim() || 'application/octet-stream',\n size,\n signal,\n read: async (offset, count, signal) => {\n if (\n !Number.isSafeInteger(offset) ||\n !Number.isSafeInteger(count) ||\n offset < 0 ||\n count < 1 ||\n count > 1024 * 1024 ||\n offset + count > size\n )\n throw new Error('Invalid download range.');\n const end = offset + count - 1;\n const response = await load({ Range: `bytes=${offset}-${end}`, 'If-Match': version }, signal);\n if (signal.aborted) throw new Error('Download cancelled.');\n if (\n response.status !== 206 ||\n response.headers.get('etag') !== version ||\n response.headers.get('content-range') !== `bytes ${offset}-${end}/${size}`\n )\n throw new Error('The file changed or its range response is invalid.');\n const bytes = new Uint8Array(await response.arrayBuffer());\n if (signal.aborted) throw new Error('Download cancelled.');\n if (bytes.byteLength !== count) throw new Error('The file response is incomplete.');\n return bytes;\n },\n };\n}\n","/**\n * Local copy of the host's formatRunDuration (src/web/lib/sessionSummary.ts):\n * this plugin keeps zero host-lib imports so its later move into the owning\n * package is a file relocation.\n */\nconst MINUTE_MS = 60 * 1000;\nconst HOUR_MS = 60 * MINUTE_MS;\n\nexport function formatRunDuration(elapsedMs: number): string {\n if (elapsedMs < MINUTE_MS) return '<1m';\n if (elapsedMs < HOUR_MS) return `${Math.floor(elapsedMs / MINUTE_MS)}m`;\n const hours = Math.floor(elapsedMs / HOUR_MS);\n const minutes = Math.floor((elapsedMs % HOUR_MS) / MINUTE_MS);\n return `${hours}h ${String(minutes).padStart(2, '0')}m`;\n}\n","import type { WorkflowRunView } from '../../../../../types/webWorkflows';\nimport { formatRunDuration } from './runDuration';\n\nexport type WorkflowActivityTone = 'running' | 'paused' | 'failed' | 'done' | 'skipped';\n\n/** One run as the activity dock lists it: identity, a tone, and a one-liner. */\nexport interface WorkflowActivityRow {\n /** Registry identity: workspace/runKey, unique across the session's runs. */\n identity: string;\n runKey: string;\n name: string;\n tone: WorkflowActivityTone;\n elapsed: string;\n startedAt: string;\n finishedAt?: string;\n /** Where the run is right now, or how it ended. */\n detail: string;\n /** The workflow session that owns the run, when it is not the session listing it. */\n ownerSessionId?: string;\n}\n\nconst PAUSED_STATES: ReadonlySet<NonNullable<WorkflowRunView['executionState']>> = new Set([\n 'paused',\n 'pause_requested',\n]);\n\nexport function workflowRunIdentity(run: Pick<WorkflowRunView, 'workspace' | 'runKey' | 'routeKey'>): string {\n return `${run.workspace}/${run.routeKey ?? run.runKey}`;\n}\n\n/** Whether the session runs this workflow itself; a record from an older hub names no owner and means the viewer. */\nexport function ownsRun(run: Pick<WorkflowRunView, 'ownerSessionId'>, sessionId: string | null): boolean {\n return sessionId !== null && (run.ownerSessionId ?? sessionId) === sessionId;\n}\n\nfunction toneOf(run: WorkflowRunView): WorkflowActivityTone {\n if (run.stage === 'running') {\n return run.executionState !== undefined && PAUSED_STATES.has(run.executionState) ? 'paused' : 'running';\n }\n if (run.stage === 'error') return 'failed';\n if (run.outcome !== undefined && run.outcome !== 'success') return run.outcome === 'failed' ? 'failed' : 'skipped';\n return 'done';\n}\n\nfunction detailOf(run: WorkflowRunView, tone: WorkflowActivityTone): string {\n if (tone === 'paused') return 'paused; resume it from the owning session';\n if (tone === 'failed')\n return run.errorMessage ?? (run.failedJob === undefined ? 'failed' : `job '${run.failedJob}' failed`);\n if (tone === 'running') {\n if (run.position === undefined) return 'starting';\n return run.position.step === undefined ? run.position.job : `${run.position.job} · ${run.position.step}`;\n }\n return run.outcome ?? 'done';\n}\n\nfunction elapsedOf(run: WorkflowRunView, now: number): string {\n const start = Date.parse(run.startedAt);\n if (!Number.isFinite(start)) return '';\n const end = run.finishedAt === undefined ? now : Date.parse(run.finishedAt);\n return formatRunDuration(Math.max(0, (Number.isFinite(end) ? end : now) - start));\n}\n\n/** The hub's presented order is kept: it already puts live runs first. */\nexport function workflowActivityRows(\n runs: readonly WorkflowRunView[],\n now: number,\n sessionId: string | null = null,\n): WorkflowActivityRow[] {\n return runs.map((run) => {\n const tone = toneOf(run);\n return {\n identity: workflowRunIdentity(run),\n runKey: run.runKey,\n name: run.displayName,\n tone,\n elapsed: elapsedOf(run, now),\n startedAt: run.startedAt,\n finishedAt: run.finishedAt,\n detail: detailOf(run, tone),\n ...(run.ownerSessionId === undefined || run.ownerSessionId === sessionId\n ? {}\n : { ownerSessionId: run.ownerSessionId }),\n };\n });\n}\n\n/** The three answers a reader wants from the dock: what is live, what broke, what is done. */\nexport type WorkflowActivityGroupName = 'running' | 'failed' | 'successful';\n\nexport interface WorkflowActivityGroup {\n name: WorkflowActivityGroupName;\n rows: WorkflowActivityRow[];\n /**\n * Whether the group is open when the dock first draws it.\n *\n * Failures open because they are the only ones that need an answer, and a\n * folded failure is one nobody sees. Everything else stays folded so a\n * session's whole history does not push the other groups off the dock.\n */\n openByDefault: boolean;\n}\n\nconst GROUP_OF: Readonly<Record<WorkflowActivityTone, WorkflowActivityGroupName>> = {\n running: 'running',\n paused: 'running',\n failed: 'failed',\n done: 'successful',\n skipped: 'successful',\n};\n\nconst GROUP_ORDER: readonly WorkflowActivityGroupName[] = ['running', 'failed', 'successful'];\n\n/** Rows split by outcome, in the order the dock shows them; empty groups are dropped. */\nexport function workflowActivityGroups(rows: readonly WorkflowActivityRow[]): WorkflowActivityGroup[] {\n return GROUP_ORDER.map((name) => ({\n name,\n rows: rows.filter((row) => GROUP_OF[row.tone] === name),\n openByDefault: name !== 'successful',\n })).filter((group) => group.rows.length > 0);\n}\n","import type { WorkflowJobView, WorkflowProgressState, WorkflowRunView } from '../../../../../types/webWorkflows';\n\nexport const STATE_GLYPH: Readonly<Record<WorkflowProgressState, string>> = {\n pending: '○',\n running: '●',\n resumed: '●',\n completed: '✓',\n failed: '✕',\n skipped: '↷',\n pause_requested: '!',\n paused: '!',\n};\n\nexport const ACTIVE_STATES: ReadonlySet<WorkflowProgressState> = new Set([\n 'running',\n 'resumed',\n 'pause_requested',\n 'paused',\n]);\n\nexport interface RunAttention {\n kind: 'error' | 'paused' | 'stale';\n text: string;\n}\n\nexport function attentionFor(run: WorkflowRunView): RunAttention | undefined {\n if (run.stage === 'error') {\n const cause = run.errorMessage ?? 'the run ended in the error stage';\n return { kind: 'error', text: run.failedJob === undefined ? cause : `job '${run.failedJob}' failed: ${cause}` };\n }\n if (run.stale === true) {\n return { kind: 'stale', text: run.staleReason ?? 'the process that ran this workflow is gone' };\n }\n if (run.executionState === 'paused' || run.executionState === 'pause_requested') {\n return { kind: 'paused', text: 'the run is paused and will not move until it is resumed' };\n }\n return undefined;\n}\n\nexport function runState(run: WorkflowRunView): string {\n if (run.stage === 'error') return 'failed';\n if (run.executionState === 'paused' || run.executionState === 'pause_requested') return 'paused';\n if (run.stage === 'running') return 'running';\n return run.outcome ?? run.stage;\n}\n\n/** The steps moving right now, across every job, so a parallel group reads as one list. */\nexport function activeSteps(run: WorkflowRunView): { job: string; step: WorkflowJobView['steps'][number] }[] {\n return run.jobs.flatMap((job) =>\n job.steps.filter((step) => ACTIVE_STATES.has(step.status)).map((step) => ({ job: job.name, step })),\n );\n}\n\n/** The statuses the picker filters by, in the order its status row lists them. */\nexport const RUN_FILTERS = ['all', 'running', 'paused', 'failed', 'done'] as const;\nexport type RunFilter = (typeof RUN_FILTERS)[number];\n\nexport function runFilterOf(run: WorkflowRunView): Exclude<RunFilter, 'all'> {\n if (run.stage === 'error' || run.outcome === 'failed') return 'failed';\n if (run.executionState === 'paused' || run.executionState === 'pause_requested') return 'paused';\n if (run.stage === 'running') return 'running';\n return 'done';\n}\n\nexport function runPriority(run: WorkflowRunView): number {\n if (attentionFor(run) !== undefined) return 0;\n if (run.stage === 'running') return 1;\n return 2;\n}\n\nexport function runSearchText(run: WorkflowRunView): string {\n return [\n run.displayName,\n run.workflowName,\n run.stage,\n run.outcome,\n run.executionState,\n run.position?.job,\n run.position?.step,\n ]\n .filter((part): part is string => typeof part === 'string')\n .join(' ')\n .toLowerCase();\n}\n\n/** A run worth recovering: it failed, was interrupted, or its process is gone. */\nexport function canRecover(run: WorkflowRunView): boolean {\n return run.stage === 'error' || run.stale === true || run.outcome === 'failed' || run.outcome === 'interrupted';\n}\n\n/**\n * What the cockpit asks the agent when the person picks recover. Recovery takes\n * judgement (a transient cause recovers, a broken workflow does not), so it goes\n * through the agent rather than straight to the engine.\n */\nexport function recoverPrompt(run: WorkflowRunView): string {\n const call = JSON.stringify({ action: 'recover', runKey: run.runKey, workspace: run.workspace });\n return `Recover the workflow run \"${run.displayName}\" (${run.runKey}). Check why it stopped first; if the cause is transient or fixed, call workflow_run ${call}, otherwise tell me what needs fixing.`;\n}\n","import type { SessionFrameSender } from '@agimon-ai/po-core/native';\nimport { defineSessionStore } from '@agimon-ai/po-core/native';\n\nimport { WORKFLOW_RUNS_TYPE, type WorkflowRunView } from '../../../../../types/webWorkflows';\nimport { workflowRunIdentity } from './workflowActivity';\n\n/** One session's record: the hub's last report plus the run this page is looking at. */\nexport interface WorkflowsSession {\n /** The workflow runs the hub last reported; presented order preserved. */\n runs: WorkflowRunView[];\n /** The run (workspace/runKey) the workflows tab shows; the first run until someone picks. */\n focusedRun: string | undefined;\n /**\n * A launch that was sent and has not shown up yet.\n *\n * The line goes to the session, the run appears on the registry channel some\n * seconds later, and nothing connects the two but timing: the first run this\n * session did not already have is the one that was just asked for.\n */\n pendingLaunch: { workflowPath: string; knownRuns: string[] } | undefined;\n}\n\nexport const workflows = defineSessionStore<WorkflowsSession>({\n runs: [],\n focusedRun: undefined,\n pendingLaunch: undefined,\n});\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/** Points the workflows tab at one run; the activity dock uses this before opening the tab. */\nexport function focusRun(sessionId: string, identity: string | undefined): void {\n workflows.update(sessionId, (current) => ({ ...current, focusedRun: identity }));\n}\n\n/** Removes a deleted run immediately while the registry channel catches up. */\nexport function removeRun(sessionId: string, identity: string): void {\n workflows.update(sessionId, (current) => {\n const runs = current.runs.filter((run) => workflowRunIdentity(run) !== identity);\n return {\n ...current,\n runs,\n focusedRun:\n current.focusedRun === identity\n ? runs[0] === undefined\n ? undefined\n : workflowRunIdentity(runs[0])\n : current.focusedRun,\n };\n });\n}\n\n/**\n * Sends a launch line to the session and remembers what was already running.\n *\n * The cockpit's only channel to a session is a prompt frame, so a launch is\n * the verb the extension registers for exactly this; see web/launchLine.ts.\n */\nexport function requestLaunch(send: SessionFrameSender, sessionId: string, line: string, workflowPath: string): void {\n send(sessionId, { type: 'prompt', message: line });\n workflows.update(sessionId, (current) => ({\n ...current,\n pendingLaunch: { workflowPath, knownRuns: current.runs.map(workflowRunIdentity) },\n }));\n}\n\nexport interface WorkflowRunsPayload {\n runs: WorkflowRunView[];\n}\n\nconst HOST_ID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/iu;\n\n/**\n * The phone keys a session `<hostId>/<id>` while the hub names a run's owner by its bare id;\n * the owner joins the viewing session's host so ownership checks and navigation line up.\n */\nfunction onSessionHost(run: WorkflowRunView, sessionId: string): WorkflowRunView {\n const separator = sessionId.indexOf('/');\n const host = sessionId.slice(0, Math.max(0, separator));\n if (run.ownerSessionId === undefined || !HOST_ID.test(host) || run.ownerSessionId.startsWith(`${host}/`)) return run;\n return { ...run, ownerSessionId: `${host}/${run.ownerSessionId}` };\n}\n\n/** The plugin's session data channel: 'workflow_runs' payloads into the store. */\nexport const workflowRunsChannel = workflows.channel<WorkflowRunsPayload>({\n channel: WORKFLOW_RUNS_TYPE,\n parse(input) {\n if (!isRecord(input) || !Array.isArray(input.runs)) return null;\n return { runs: input.runs.filter(isRecord) as unknown as WorkflowRunView[] };\n },\n reduce: (current, payload, sessionId) => {\n const runs = payload.runs.map((run) => onSessionHost(run, sessionId));\n const pending = current.pendingLaunch;\n if (pending === undefined) return { ...current, runs };\n const known = new Set(pending.knownRuns);\n const arrived = runs.find((run) => !known.has(workflowRunIdentity(run)));\n // Until one arrives the launch stays pending: a workflow can take a while\n // to reach the registry, and forgetting it would leave the board wherever\n // the reader last was.\n if (arrived === undefined) return { ...current, runs };\n return { ...current, runs, focusedRun: workflowRunIdentity(arrived), pendingLaunch: undefined };\n },\n});\n","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 dynamicWorkflows = defineSessionStore<DynamicWorkflowSnapshot | null>(null);\n\nexport const dynamicWorkflowRunsChannel = defineSessionChannel<DynamicWorkflowSnapshot>({\n channel: DYNAMIC_WORKFLOW_CHANNEL,\n parse: parseWorkflowSnapshot,\n apply(sessionId, snapshot) {\n if (snapshot.sessionId !== sessionId) return;\n dynamicWorkflows.update(sessionId, (current) => nextWorkflowSnapshot(current, snapshot));\n },\n drop(sessionId) {\n dynamicWorkflows.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\n/** One line for the dynamic workflows a workflow step's agent started, e.g. `2 dynamic runs · 1 failed`. */\nexport function stepRunsSummary(runs: readonly DynamicWorkflowRun[]): { text: string; failed: number } {\n const running = runs.filter((run) => run.status === 'running').length;\n const failed = runs.filter((run) => run.status === 'failed').length;\n const parts = [`${runs.length} dynamic ${runs.length === 1 ? 'run' : 'runs'}`];\n if (running) parts.push(`${running} running`);\n return { text: parts.join(' · '), failed };\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 { LiveDuration } from '@agimon-ai/po-native-components';\nimport { useCallback } from 'react';\nimport type { StyleProp, TextStyle } from 'react-native';\n\nimport { formatRunDuration } from '../_lib/runDuration';\nimport { workflowDuration } from './dynamicWorkflowPresentation';\n\n/** Bare workflow durations, updated without reconciling even the text leaf. */\nexport function WorkflowDuration({\n startedAt,\n endedAt,\n now,\n seconds = false,\n running = true,\n style,\n}: {\n startedAt?: string | number;\n endedAt?: string | number;\n now?: number;\n seconds?: boolean;\n running?: boolean;\n style?: StyleProp<TextStyle>;\n}) {\n const start = typeof startedAt === 'string' ? Date.parse(startedAt) : startedAt;\n const end = typeof endedAt === 'string' ? Date.parse(endedAt) : endedAt;\n const clock = useCallback(\n (clockNow: number) => {\n const at = now ?? clockNow;\n if (start === undefined || !Number.isFinite(start)) return { text: seconds ? 'Not started' : '' };\n if (end !== undefined && !Number.isFinite(end)) return { text: '' };\n const text = seconds ? workflowDuration(start, end, at) : formatRunDuration(Math.max(0, (end ?? at) - start));\n // A pinned clock, a stopped run and a finished run all stay frozen.\n const live = now === undefined && running && end === undefined;\n return live ? { text, nextMs: seconds ? 1000 : 10_000 } : { text };\n },\n [start, end, now, seconds, running],\n );\n return <LiveDuration clock={clock} style={style} />;\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} from './dynamicWorkflowPresentation';\nimport { WorkflowDuration } from './WorkflowDuration.native';\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 <WorkflowDuration\n seconds\n style={styles.dim}\n startedAt={phase.startedAt}\n endedAt={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 <View style={styles.inline}>\n <WorkflowDuration\n seconds\n style={styles.dim}\n startedAt={run.startedAt}\n endedAt={run.finishedAt}\n running={run.status === 'running'}\n now={now}\n />\n <Text style={styles.dim}>\n {run.executionStatus !== run.status\n ? ` · Workflow execution: ${WORKFLOW_STATUS[run.executionStatus].label}`\n : ''}\n </Text>\n </View>\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 { ChevronDownIcon, ChevronRightIcon, fontOf } from '@agimon-ai/po-native-components';\nimport type { PoNativeTheme } from '@agimon-ai/po-web-components/nativeTheme';\nimport { useCallback, useState, useSyncExternalStore } from 'react';\nimport { Pressable, ScrollView, Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport { dynamicWorkflows } from '../_lib/dynamicWorkflowStore.native';\nimport { stepRunsSummary } from './dynamicWorkflowPresentation';\nimport { DynamicWorkflowView } from './DynamicWorkflowView.native';\n\nfunction useStepRuns(stepSessionId: string) {\n const subscribe = useCallback((listener: () => void) => {\n const subscription = dynamicWorkflows.store.subscribe(listener);\n return () => subscription.unsubscribe();\n }, []);\n return useSyncExternalStore(\n subscribe,\n () => dynamicWorkflows.select(dynamicWorkflows.store.state, stepSessionId)?.runs,\n );\n}\n\n/**\n * The step row's note in the native run view. Native plugins cannot hold another session's\n * channels, so it shows once the step session's frames have arrived, e.g. after opening the step.\n */\nexport function StepDynamicRunsNote({ stepSessionId }: { stepSessionId: string }) {\n const runs = useStepRuns(stepSessionId);\n if (runs === undefined || runs.length === 0) return null;\n const summary = stepRunsSummary(runs);\n return (\n <Text testID={`step-dynamic-note-${stepSessionId}`} style={styles.summary}>\n {summary.text}\n {summary.failed > 0 ? <Text style={styles.failed}> · {summary.failed} failed</Text> : null}\n </Text>\n );\n}\n\n/**\n * The dynamic workflows a customRun step's agent started, under that step's transcript. It folds\n * to one summary row; the transcript beside it already holds the step session's channels.\n */\nexport function StepDynamicRuns({\n stepSessionId,\n openSession,\n}: Pick<WebPluginSlotProps, 'openSession'> & { stepSessionId: string }) {\n const runs = useStepRuns(stepSessionId);\n const [open, setOpen] = useState(false);\n if (runs === undefined || runs.length === 0) return null;\n const summary = stepRunsSummary(runs);\n return (\n <View testID=\"step-dynamic-runs\" style={styles.section(open)}>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityState={{ expanded: open }}\n testID=\"step-dynamic-runs-toggle\"\n onPress={() => setOpen(!open)}\n style={styles.toggle}\n >\n {open ? <ChevronDownIcon size={12} color=\"faint\" /> : <ChevronRightIcon size={12} color=\"faint\" />}\n <Text style={styles.title}>Dynamic workflows</Text>\n <Text numberOfLines={1} style={styles.summary}>\n {summary.text}\n {summary.failed > 0 ? <Text style={styles.failed}> · {summary.failed} failed</Text> : null}\n </Text>\n </Pressable>\n {open ? (\n <ScrollView style={styles.runs}>\n {/* ponytail: agents live in the step session and plugins can only render the tab owner's threads,\n so this opens that session; add a cross-session thread view to open one agent. */}\n <DynamicWorkflowView runs={runs} onOpenAgent={() => openSession?.(stepSessionId)} />\n </ScrollView>\n ) : null}\n </View>\n );\n}\n\nconst styles = StyleSheet.create((theme: PoNativeTheme) => ({\n section: (open: boolean) => ({\n flex: open ? 2 : 0,\n flexShrink: open ? 1 : 0,\n borderTopWidth: 1,\n borderTopColor: theme.colors.border,\n }),\n toggle: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: theme.spacing(2),\n paddingHorizontal: theme.spacing(3),\n paddingVertical: theme.spacing(2),\n },\n title: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n fontWeight: theme.fontWeight.semibold,\n color: theme.colors.hi,\n },\n summary: {\n flexShrink: 1,\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n color: theme.colors.dim,\n },\n failed: { color: theme.colors.red },\n runs: { flex: 1 },\n}));\n","import {\n Button,\n ChevronDownIcon,\n ChevronRightIcon,\n Dot,\n EmptyState,\n FileIcon,\n FolderIcon,\n Input,\n ListRow,\n SheetList,\n StatusBadge,\n fontOf,\n} from '@agimon-ai/po-native-components';\nimport type { PoNativeTheme } from '@agimon-ai/po-web-components/nativeTheme';\nimport { type ReactNode, useState } from 'react';\nimport { FlatList, Pressable, ScrollView, Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport type { WorkflowJobView, WorkflowRunView } from '../../../../../../types/webWorkflows';\nimport type { WorkflowArtifactsResponse, WorkflowArtifactView } from '../../../../../../types/webWorkflowTerminal';\nimport { StepDynamicRunsNote } from '../../_components/StepDynamicRuns.native';\nimport { WorkflowDuration } from '../../_components/WorkflowDuration.native';\nimport { formatRunDuration } from '../../_lib/runDuration';\nimport { activeSteps, attentionFor, runState, runFilterOf, runSearchText } from '../../_lib/workflowRunPresentation';\n\nexport type WorkflowRunAction = 'stopping' | 'deleting';\ntype ViewMode = 'overview' | 'picker' | 'delete';\nconst FILTER = { all: 'All', running: 'Running', failed: 'Failed', done: 'Finished' } as const;\n\nfunction Status({ state }: { state: string }) {\n const tone =\n state === 'failed' || state === 'error'\n ? 'error'\n : state === 'completed' || state === 'success'\n ? 'ok'\n : state === 'paused' || state === 'pause_requested'\n ? 'accent'\n : state === 'running' || state === 'resumed'\n ? 'running'\n : 'neutral';\n return <StatusBadge tone={tone}>{state}</StatusBadge>;\n}\nfunction Heading({ title, count }: { title: string; count?: string }) {\n return (\n <View style={styles.section}>\n <Text accessibilityRole=\"header\" style={styles.heading}>\n {title}\n </Text>\n <Text style={styles.meta}>{count}</Text>\n </View>\n );\n}\nfunction Duration({ start, end, now }: { start?: string; end?: string; now?: number }) {\n // A pinned story clock needs no animated native clock, and keeps browser previews deterministic.\n return now === undefined ? (\n <WorkflowDuration startedAt={start} endedAt={end} style={styles.meta} />\n ) : (\n <Text style={styles.meta}>\n {start === undefined\n ? ''\n : formatRunDuration(Math.max(0, (end === undefined ? now : Date.parse(end)) - Date.parse(start)))}\n </Text>\n );\n}\nfunction Job({\n job,\n now,\n onOpen,\n}: {\n job: WorkflowJobView;\n now?: number;\n onOpen: (job: string, step: string) => void;\n}) {\n const [open, setOpen] = useState(true);\n const done = job.steps.filter((step) => step.status === 'completed' || step.status === 'skipped').length;\n return (\n <View>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={`${job.name}, ${job.status}`}\n accessibilityState={{ expanded: open }}\n onPress={() => setOpen(!open)}\n style={styles.job}\n >\n {open ? <ChevronDownIcon size={16} color=\"dim\" /> : <ChevronRightIcon size={16} color=\"dim\" />}\n <Text style={styles.name}>{job.name}</Text>\n <Text style={styles.meta}>\n {done}/{job.steps.length}\n </Text>\n <Duration start={job.startedAt} end={job.endedAt} now={now} />\n <Status state={job.status} />\n </Pressable>\n {job.reason ? <Text style={styles.reason}>{job.reason}</Text> : null}\n {open\n ? job.steps.map((step) => (\n <ListRow\n key={step.name}\n style={styles.step}\n title={step.name}\n leading={\n <Dot\n tone={\n step.status === 'failed'\n ? 'red'\n : step.status === 'running' || step.status === 'resumed'\n ? 'yellow'\n : step.status === 'completed'\n ? 'green'\n : 'muted'\n }\n />\n }\n description={\n <View>\n <Text style={styles.meta}>\n {[step.status, step.group ? `∥ ${step.group}` : undefined, step.reason].filter(Boolean).join(' · ')}\n </Text>\n {step.ref?.kind === 'session' ? <StepDynamicRunsNote stepSessionId={step.ref.id} /> : null}\n </View>\n }\n trailing={<Duration start={step.startedAt} end={step.endedAt} now={now} />}\n disabled={step.status === 'pending'}\n onPress={step.status === 'pending' ? undefined : () => onOpen(job.name, step.name)}\n />\n ))\n : null}\n </View>\n );\n}\n\n/** Shared presentation for the run's existing native artifact browser and deterministic stories. */\nexport function WorkflowArtifactList({\n listing,\n error,\n loading = false,\n onOpen,\n onParent,\n}: {\n listing?: WorkflowArtifactsResponse;\n error?: string;\n loading?: boolean;\n onOpen: (artifact: WorkflowArtifactView) => void;\n onParent?: () => void;\n}) {\n const artifacts = listing?.artifacts ?? [];\n return (\n <View style={styles.artifacts}>\n <Heading title=\"Artifacts\" count={String(artifacts.length)} />\n {onParent ? (\n <Button variant=\"ghost\" onPress={onParent}>\n Parent directory\n </Button>\n ) : null}\n {error ? (\n <Text accessibilityRole=\"alert\" style={styles.error}>\n {error}\n </Text>\n ) : null}\n {loading ? <Text style={styles.reason}>Loading artifacts…</Text> : null}\n {artifacts.map((artifact) => (\n <ListRow\n key={artifact.path}\n title={artifact.path}\n description={\n artifact.state === 'pending'\n ? 'Not written yet'\n : artifact.state === 'unreadable'\n ? 'Cannot read this output'\n : artifact.description || 'Run output'\n }\n leading={\n artifact.kind === 'directory' ? <FolderIcon size={18} color=\"dim\" /> : <FileIcon size={18} color=\"dim\" />\n }\n disabled={artifact.state === 'pending' || artifact.state === 'unreadable'}\n onPress={artifact.state === 'pending' || artifact.state === 'unreadable' ? undefined : () => onOpen(artifact)}\n />\n ))}\n {!artifacts.length && !loading && !error ? <Text style={styles.reason}>No artifacts yet.</Text> : null}\n </View>\n );\n}\n\nexport interface WorkflowDockViewProps {\n run?: WorkflowRunView;\n runs: WorkflowRunView[];\n now?: number;\n sheet?: boolean;\n dockHeader?: ReactNode;\n artifacts?: ReactNode;\n busy?: WorkflowRunAction;\n error?: string;\n canAct?: boolean;\n initialMode?: ViewMode;\n onSelectRun: (run: WorkflowRunView) => void;\n onOpenStep: (job: string, step: string) => void;\n onStop: () => void;\n onDelete: () => void;\n onLaunch: () => void;\n}\n\n/** Data and callbacks only. The host owns the sheet, navigation and API transport. */\nexport function WorkflowDockView({\n run,\n runs,\n now,\n sheet = false,\n dockHeader,\n artifacts,\n busy,\n error,\n canAct = true,\n initialMode = 'overview',\n onSelectRun,\n onOpenStep,\n onStop,\n onDelete,\n onLaunch,\n}: WorkflowDockViewProps) {\n const [mode, setMode] = useState<ViewMode>(initialMode);\n const [search, setSearch] = useState('');\n const [filter, setFilter] = useState<string>(FILTER.all);\n const visibleRuns = runs.filter(\n (item) =>\n runSearchText(item).includes(search.trim().toLowerCase()) &&\n (filter === FILTER.all ||\n (filter === FILTER.running && ['running', 'paused'].includes(runFilterOf(item))) ||\n (filter === FILTER.failed && runFilterOf(item) === 'failed') ||\n (filter === FILTER.done && runFilterOf(item) === 'done')),\n );\n const active = run ? activeSteps(run) : [];\n const attention = run ? attentionFor(run) : undefined;\n const attentionText =\n attention?.kind === 'paused'\n ? 'Waiting to be resumed.'\n : (run?.errorMessage ??\n run?.staleReason ??\n (attention?.kind === 'stale' ? 'This run is no longer reporting progress.' : attention?.text));\n const List = sheet ? SheetList<WorkflowJobView> : FlatList<WorkflowJobView>;\n const header = (\n <>\n {dockHeader}\n {run ? (\n <View style={styles.header}>\n <View style={styles.row}>\n <Text accessibilityRole=\"header\" style={styles.title}>\n {run.displayName}\n </Text>\n <Status state={runState(run)} />\n </View>\n <View style={styles.row}>\n <Text style={styles.flexMeta}>\n {[run.position?.job, run.position?.step].filter(Boolean).join(' › ') ||\n (run.stage === 'running' ? 'Starting' : run.workflowPath)}\n </Text>\n <Duration start={run.startedAt} end={run.finishedAt} now={now} />\n </View>\n {runs.length > 1 ? (\n <Button variant=\"outline\" onPress={() => setMode('picker')}>\n Switch run <ChevronDownIcon size={16} />\n </Button>\n ) : null}\n </View>\n ) : null}\n {attention ? (\n <View style={[styles.attention, attention.kind === 'paused' ? styles.ask : styles.failure]}>\n <Text style={styles.heading}>\n {attention.kind === 'error' ? 'Run failed' : attention.kind === 'stale' ? 'Progress stopped' : 'Paused'}\n </Text>\n <Text style={styles.body}>{attentionText}</Text>\n <Text style={styles.meta}>\n {attention.kind === 'paused'\n ? 'Ask the agent in this conversation to resume it.'\n : 'Ask the agent in this conversation to diagnose or recover it.'}\n </Text>\n </View>\n ) : null}\n {active.length ? (\n <>\n <Heading title=\"Active now\" count={String(active.length)} />\n {active.map(({ job, step }) => (\n <ListRow\n key={`${job}/${step.name}`}\n title={step.name}\n description={[job, step.group ? `∥ ${step.group}` : undefined].filter(Boolean).join(' · ')}\n leading={<Dot tone={step.status === 'running' || step.status === 'resumed' ? 'yellow' : 'magenta'} />}\n trailing={<Duration start={step.startedAt} end={step.endedAt} now={now} />}\n onPress={() => onOpenStep(job, step.name)}\n />\n ))}\n </>\n ) : null}\n {run ? (\n <Heading\n title=\"Jobs\"\n count={`${run.jobs.filter((job) => ['completed', 'skipped'].includes(job.status)).length}/${run.jobs.length}`}\n />\n ) : null}\n </>\n );\n const details =\n mode === 'picker' ? (\n <View style={styles.picker}>\n <View style={styles.row}>\n <Text accessibilityRole=\"header\" style={styles.title}>\n Switch run\n </Text>\n <Button variant=\"ghost\" onPress={() => setMode('overview')}>\n Done\n </Button>\n </View>\n <Input accessibilityLabel=\"Find a run\" placeholder=\"Find a run\" value={search} onChangeText={setSearch} />\n <View style={styles.filters}>\n {Object.values(FILTER).map((value) => (\n <Button\n key={value}\n variant={filter === value ? 'secondary' : 'ghost'}\n accessibilityState={{ selected: filter === value }}\n onPress={() => setFilter(value)}\n >\n {value}\n </Button>\n ))}\n </View>\n {visibleRuns.length === 0 ? (\n <EmptyState title=\"No matching runs\" description=\"Try another name or status.\" />\n ) : null}\n {visibleRuns.map((item) => (\n <ListRow\n key={`${item.workspace}/${item.routeKey ?? item.runKey}`}\n title={item.displayName}\n description={item.runKey}\n trailing={<Status state={runState(item)} />}\n selected={\n run?.workspace === item.workspace && (run.routeKey ?? run.runKey) === (item.routeKey ?? item.runKey)\n }\n onPress={() => {\n onSelectRun(item);\n setMode('overview');\n }}\n />\n ))}\n </View>\n ) : mode === 'delete' ? (\n <View style={styles.picker}>\n <Text accessibilityRole=\"header\" style={styles.title}>\n Delete this run?\n </Text>\n <Text style={styles.body}>\n This permanently removes the settled run and its directory, including logs and artifacts.\n </Text>\n <Text style={styles.meta}>{run?.displayName}</Text>\n {error ? (\n <Text accessibilityRole=\"alert\" style={styles.error}>\n {error}\n </Text>\n ) : null}\n <Button\n variant=\"danger-outline\"\n disabled={!canAct || busy !== undefined || !run || run.stage === 'running'}\n onPress={onDelete}\n >\n {busy === 'deleting' ? 'Deleting…' : 'Delete run'}\n </Button>\n <Button variant=\"ghost\" disabled={busy !== undefined} onPress={() => setMode('overview')}>\n Cancel\n </Button>\n </View>\n ) : null;\n return (\n <View style={styles.frame}>\n {details ? (\n sheet ? (\n <SheetList<never>\n embedded\n data={[]}\n renderItem={() => null}\n ListHeaderComponent={details}\n keyboardShouldPersistTaps=\"handled\"\n />\n ) : (\n <ScrollView keyboardShouldPersistTaps=\"handled\">{details}</ScrollView>\n )\n ) : (\n <>\n <List\n {...(sheet ? { embedded: true } : {})}\n style={styles.list}\n data={run?.jobs ?? []}\n keyExtractor={(job) => job.name}\n keyboardShouldPersistTaps=\"handled\"\n ListHeaderComponent={header}\n renderItem={({ item }) => (\n <Job\n key={`${run?.workspace}/${run?.routeKey ?? run?.runKey}/${item.name}`}\n job={item}\n now={now}\n onOpen={onOpenStep}\n />\n )}\n ListFooterComponent={artifacts === undefined ? undefined : <>{artifacts}</>}\n ListEmptyComponent={\n !run ? (\n <EmptyState title=\"No workflow runs\" description=\"Launch a workflow to see its progress here.\">\n <Button variant=\"primary\" disabled={!canAct} onPress={onLaunch}>\n Launch a workflow\n </Button>\n </EmptyState>\n ) : undefined\n }\n />\n {run ? (\n <View style={styles.actions}>\n {error ? (\n <Text accessibilityRole=\"alert\" style={styles.error}>\n {error}\n </Text>\n ) : null}\n <Button\n variant=\"danger-outline\"\n disabled={!canAct || busy !== undefined}\n onPress={run.stage === 'running' ? onStop : () => setMode('delete')}\n >\n {busy === 'stopping' ? 'Stopping…' : run.stage === 'running' ? 'Stop workflow' : 'Delete run…'}\n </Button>\n </View>\n ) : null}\n </>\n )}\n </View>\n );\n}\n\nconst styles = StyleSheet.create((theme: PoNativeTheme) => {\n const text = {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n color: theme.colors.text,\n };\n return {\n frame: { flex: 1, backgroundColor: theme.colors.rail },\n list: { flex: 1 },\n error: { ...text, color: theme.colors.red },\n header: {\n gap: theme.spacing(3),\n padding: theme.spacing(4),\n borderBottomWidth: StyleSheet.hairlineWidth,\n borderBottomColor: theme.colors.border,\n },\n row: { flexDirection: 'row', alignItems: 'center', gap: theme.spacing(2) },\n title: {\n ...text,\n flex: 1,\n fontSize: theme.fontSize.xl,\n lineHeight: theme.lineHeight.xl,\n fontWeight: theme.fontWeight.semibold,\n color: theme.colors.hi,\n },\n heading: {\n ...text,\n fontSize: theme.fontSize.lg,\n lineHeight: theme.lineHeight.lg,\n fontWeight: theme.fontWeight.semibold,\n color: theme.colors.hi,\n },\n name: { ...text, flex: 1, fontWeight: theme.fontWeight.semibold, color: theme.colors.hi },\n body: text,\n meta: { ...text, fontSize: theme.fontSize.sm, lineHeight: theme.lineHeight.sm, color: theme.colors.dim },\n flexMeta: { ...text, flex: 1, fontSize: theme.fontSize.sm, color: theme.colors.dim },\n section: {\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n paddingHorizontal: theme.spacing(4),\n paddingTop: theme.spacing(4),\n paddingBottom: theme.spacing(2),\n },\n job: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: theme.spacing(2),\n paddingHorizontal: theme.spacing(4),\n paddingVertical: theme.spacing(2),\n minHeight: 44,\n },\n step: { paddingLeft: theme.spacing(9) },\n reason: { ...text, color: theme.colors.dim, paddingHorizontal: theme.spacing(4), paddingBottom: theme.spacing(2) },\n attention: {\n margin: theme.spacing(3),\n padding: theme.spacing(3),\n gap: theme.spacing(2),\n borderWidth: 1,\n borderRadius: theme.borderRadius.md,\n },\n failure: { backgroundColor: theme.colors['tint-red'], borderColor: theme.colors['edge-red'] },\n ask: { backgroundColor: theme.colors['tint-magenta'], borderColor: theme.colors['edge-magenta'] },\n artifacts: { paddingBottom: theme.spacing(4) },\n actions: {\n padding: theme.spacing(4),\n borderTopWidth: StyleSheet.hairlineWidth,\n borderTopColor: theme.colors.border,\n },\n picker: { padding: theme.spacing(4), gap: theme.spacing(3) },\n filters: { flexDirection: 'row', flexWrap: 'wrap' },\n notice: { ...text, color: theme.colors.dim, padding: theme.spacing(3) },\n };\n});\n","export const DELIMITED_ROW_STEP = 20;\nexport const DELIMITED_COLUMN_STEP = 8;\n\n/** Index record boundaries and widths without allocating hidden cell strings. */\nexport function indexDelimited(text: string, delimiter: ',' | '\\t') {\n const rowStarts: number[] = text.length === 0 ? [] : [0];\n let columns = text.length === 0 ? 0 : 1;\n let width = columns;\n let quoted = false;\n let atCellStart = true;\n for (let index = 0; index < text.length; index += 1) {\n const character = text[index];\n if (quoted) {\n if (character === '\"' && text[index + 1] === '\"') index += 1;\n else if (character === '\"') quoted = false;\n } else if (character === '\"' && atCellStart) {\n quoted = true;\n atCellStart = false;\n } else if (character === delimiter) {\n width += 1;\n atCellStart = true;\n } else if (character === '\\n' || character === '\\r') {\n columns = Math.max(columns, width);\n width = 1;\n atCellStart = true;\n if (character === '\\r' && text[index + 1] === '\\n') index += 1;\n if (index + 1 < text.length) rowStarts.push(index + 1);\n } else atCellStart = false;\n }\n return { rowStarts, columns: Math.max(columns, width) };\n}\n\n/** Decode only requested records and columns. Every source record remains indexed. */\nexport function readDelimitedWindow(\n text: string,\n delimiter: ',' | '\\t',\n document: ReturnType<typeof indexDelimited>,\n rowLimit: number,\n columnLimit: number,\n): string[][] {\n return document.rowStarts.slice(0, rowLimit).map((start) => {\n const cells: string[] = [];\n let cell = '';\n let quoted = false;\n let atCellStart = true;\n for (let index = start; index < text.length; index += 1) {\n const character = text[index];\n if (quoted) {\n if (character === '\"' && text[index + 1] === '\"') {\n cell += '\"';\n index += 1;\n } else if (character === '\"') quoted = false;\n else cell += character;\n } else if (character === '\"' && atCellStart) {\n quoted = true;\n atCellStart = false;\n } else if (character === delimiter) {\n cells.push(cell);\n if (cells.length === columnLimit) return cells;\n cell = '';\n atCellStart = true;\n } else if (character === '\\n' || character === '\\r') {\n break;\n } else {\n cell += character;\n atCellStart = false;\n }\n }\n if (cells.length < columnLimit) cells.push(cell);\n return cells;\n });\n}\n","import { Button, fontOf } from '@agimon-ai/po-native-components';\nimport { memo, useMemo, useState } from 'react';\nimport { ScrollView, Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport {\n DELIMITED_COLUMN_STEP,\n DELIMITED_ROW_STEP,\n indexDelimited,\n readDelimitedWindow,\n} from '../_lib/delimitedPreview';\n\n/** Pure CSV/TSV preview shared with its design target. Labels never consume a source record. */\nexport const DelimitedArtifact = memo(function DelimitedArtifact({\n text,\n delimiter,\n initialRows = DELIMITED_ROW_STEP,\n}: {\n text: string;\n delimiter: ',' | '\\t';\n initialRows?: number;\n}) {\n const document = useMemo(() => indexDelimited(text, delimiter), [text, delimiter]);\n const [window, setWindow] = useState({ document, rows: initialRows, columns: DELIMITED_COLUMN_STEP });\n const current =\n window.document === document ? window : { document, rows: initialRows, columns: DELIMITED_COLUMN_STEP };\n // Reset before committing a changed document, rather than briefly rendering its expanded predecessor.\n if (current !== window) setWindow(current);\n const rowCount = document.rowStarts.length;\n const rows = Math.min(rowCount, current.rows);\n const columns = Math.min(document.columns, current.columns);\n const cells = useMemo(\n () => readDelimitedWindow(text, delimiter, document, rows, columns),\n [text, delimiter, document, rows, columns],\n );\n return (\n <View style={styles.body}>\n <Text style={styles.meta} accessibilityLiveRegion=\"polite\">\n Rows {rows === 0 ? 0 : 1}–{rows} of {rowCount} · Columns {columns === 0 ? 0 : 1}–{columns} of {document.columns}\n </Text>\n <Text style={styles.copy}>Scroll within the preview. Load more rows or columns when you need them.</Text>\n <ScrollView style={styles.preview} nestedScrollEnabled>\n <ScrollView horizontal>\n <View>\n <View style={styles.tableRow}>\n {Array.from({ length: columns }, (_, column) => (\n <Text key={column} selectable style={styles.cell}>\n Column {column + 1}\n </Text>\n ))}\n </View>\n {cells.map((values, row) => (\n <View key={row} style={styles.tableRow}>\n {Array.from({ length: columns }, (_, column) => (\n <Text key={column} selectable style={styles.cell}>\n {values[column] ?? ''}\n </Text>\n ))}\n </View>\n ))}\n </View>\n </ScrollView>\n </ScrollView>\n <Button\n variant=\"outline\"\n size=\"card\"\n disabled={rows === rowCount}\n onPress={() => setWindow({ ...current, rows: rows + DELIMITED_ROW_STEP })}\n >\n {rows === rowCount ? 'All rows shown' : `Show ${Math.min(DELIMITED_ROW_STEP, rowCount - rows)} more rows`}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"card\"\n disabled={columns === document.columns}\n onPress={() => setWindow({ ...current, columns: columns + DELIMITED_COLUMN_STEP })}\n >\n {columns === document.columns\n ? 'All columns shown'\n : `Show ${Math.min(DELIMITED_COLUMN_STEP, document.columns - columns)} more columns`}\n </Button>\n </View>\n );\n});\n\nconst styles = StyleSheet.create((theme) => ({\n body: { flex: 1, padding: theme.spacing(4), gap: theme.spacing(4) },\n copy: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.lg,\n lineHeight: theme.spacing(6),\n color: theme.colors.text,\n },\n meta: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.spacing(4.5),\n color: theme.colors.dim,\n },\n preview: {\n flex: 1,\n borderWidth: 1,\n borderColor: theme.colors['border-soft'],\n borderRadius: theme.borderRadius.md,\n },\n tableRow: { flexDirection: 'row' },\n cell: {\n width: theme.spacing(36),\n padding: theme.spacing(2),\n borderRightWidth: 1,\n borderBottomWidth: 1,\n borderColor: theme.colors['border-soft'],\n fontFamily: fontOf(theme.fontFamily.mono),\n fontSize: theme.fontSize.sm,\n color: theme.colors.text,\n },\n}));\n","import type { WebPluginSlotProps } from '@agimon-ai/po-core/native';\nimport {\n Badge,\n Button,\n CodeBlock,\n Input,\n ListRow,\n Markdown,\n Sheet,\n SheetBody,\n SheetContent,\n SheetHeader,\n SheetTitle,\n Textarea,\n} from '@agimon-ai/po-native-components';\nimport { useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react';\nimport { ScrollView, Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport {\n STEP_ACTIVITY_SCOPE,\n type WorkflowCatalogEntryView,\n type WorkflowRunView,\n} from '../../../../../types/webWorkflows';\nimport type {\n WorkflowArtifactContentResponse,\n WorkflowArtifactsResponse,\n WorkflowTerminalCapabilitiesView,\n} from '../../../../../types/webWorkflowTerminal';\nimport { catalog, closeCatalog, filterCatalog, openCatalog } from '../_lib/catalogStore.native';\nimport {\n initialChoice,\n initialCommand,\n initialInputs,\n initialRunner,\n launchProblems,\n workflowLaunchLine,\n} from '../_lib/launchLine';\nimport {\n deleteWorkflowRun,\n fetchArtifact,\n fetchArtifactMedia,\n prepareArtifactSave,\n finiteScreenReader,\n fetchArtifacts,\n readScreen,\n releaseControl,\n resizeRun,\n sendKeys,\n takeControl,\n stopWorkflowRun,\n} from '../_lib/terminalApi.native';\nimport { workflowRunIdentity } from '../_lib/workflowActivity';\nimport { runPriority } from '../_lib/workflowRunPresentation';\nimport { focusRun, removeRun, requestLaunch, workflows } from '../_lib/workflowsStore.native';\nimport {\n WorkflowDockView,\n WorkflowArtifactList,\n type WorkflowRunAction,\n} from '../dock/_components/WorkflowDockView.native';\nimport { DelimitedArtifact } from './DelimitedArtifact.native';\nimport { StepDynamicRuns } from './StepDynamicRuns.native';\n\nexport function useWorkflows(sessionId: string | null) {\n const subscribe = useCallback((listener: () => void) => {\n const sub = workflows.store.subscribe(listener);\n return () => sub.unsubscribe();\n }, []);\n return useSyncExternalStore(subscribe, () => workflows.select(workflows.store.state, sessionId));\n}\nexport function workflowTab(run: WorkflowRunView): Parameters<WebPluginSlotProps['openTransientTab']>[0] {\n const identity = workflowRunIdentity(run);\n return {\n id: `workflows-run-${run.workspace}-${run.routeKey ?? run.runKey}`.replace(/[^\\w-]+/g, '-'),\n label: run.displayName,\n retainComposer: true,\n panel: (props) => <WorkflowPanel {...props} identity={identity} />,\n };\n}\n/** The Workflows card's screen: the focused run, else the newest one. */\nexport function workflowsTab(): Parameters<WebPluginSlotProps['openTransientTab']>[0] {\n return { id: 'workflows-runs', label: 'Workflows', retainComposer: true, panel: WorkflowPanel };\n}\nexport function WorkflowLauncher(props: WebPluginSlotProps) {\n const subscribe = useCallback((listener: () => void) => {\n const sub = catalog.store.subscribe(listener);\n return () => sub.unsubscribe();\n }, []);\n const state = useSyncExternalStore(subscribe, () => catalog.select(catalog.store.state, props.sessionId));\n const [filter, setFilter] = useState('');\n const [selected, setSelected] = useState<string>();\n if (props.sessionId === null || !state.open) return null;\n const workflow = state.workflows.find((item) => item.path === selected);\n return (\n <Sheet\n open\n onOpenChange={(open) => {\n if (!open) {\n closeCatalog(props.sessionId!);\n setSelected(undefined);\n }\n }}\n >\n <SheetContent>\n <SheetHeader>\n <SheetTitle>{workflow ? `Launch ${workflow.name}` : 'Launch a workflow'}</SheetTitle>\n </SheetHeader>\n <SheetBody>\n {workflow ? (\n <WorkflowLaunch\n key={workflow.path}\n {...props}\n sessionId={props.sessionId}\n workflow={workflow}\n initialPrompt={state.prompt}\n onClose={() => {\n closeCatalog(props.sessionId!);\n setSelected(undefined);\n }}\n />\n ) : (\n <View style={styles.body}>\n <Input\n accessibilityLabel=\"Find a workflow\"\n value={filter}\n onChangeText={setFilter}\n placeholder=\"Find a workflow\"\n />\n {state.warning ? <Text style={styles.error}>{state.warning}</Text> : null}\n {filterCatalog(state.workflows, filter).map((item) => (\n <ListRow\n key={item.path}\n title={item.name || item.relativePath}\n // ListRow shows two lines; the tags and jobs line never fit under a real description.\n description={\n item.error !== undefined ? (\n <Text style={styles.error}>{item.error}</Text>\n ) : (\n item.description || item.jobs.map((job) => job.name).join(', ')\n )\n }\n disabled={item.error !== undefined}\n onPress={() => {\n if (item.error === undefined) setSelected(item.path);\n }}\n />\n ))}\n {state.workflows.length === 0 ? <Text style={styles.meta}>No workflows reported yet.</Text> : null}\n </View>\n )}\n </SheetBody>\n </SheetContent>\n </Sheet>\n );\n}\nfunction Choice({\n label,\n options,\n value,\n onChange,\n}: {\n label: string;\n options: readonly string[];\n value: string | undefined;\n onChange: (value: string) => void;\n}) {\n return (\n <View>\n <Text style={styles.meta}>{label}</Text>\n {options.map((option) => (\n <Button\n key={option}\n variant=\"outline\"\n accessibilityState={{ selected: value === option }}\n onPress={() => onChange(option)}\n >\n {option}\n </Button>\n ))}\n </View>\n );\n}\nfunction WorkflowLaunch({\n sessionId,\n workflow,\n initialPrompt,\n sendSessionFrame,\n onClose,\n}: WebPluginSlotProps & {\n sessionId: string;\n workflow: WorkflowCatalogEntryView;\n initialPrompt: string;\n onClose: () => void;\n}) {\n const [prompt, setPrompt] = useState(initialPrompt);\n const [inputs, setInputs] = useState(() => initialInputs(workflow));\n const [runner, setRunner] = useState(() => initialRunner(workflow));\n const [command, setCommand] = useState(() => initialCommand(workflow));\n const [choice, setChoice] = useState(() => initialChoice(workflow));\n const [error, setError] = useState<string>();\n const request = {\n workflow: workflow.name || workflow.relativePath,\n inputs,\n runner,\n command,\n choice,\n ...(prompt.trim() === '' ? {} : { prompt: prompt.trim() }),\n };\n const problems = [...launchProblems(workflow, request), ...(workflow.error === undefined ? [] : [workflow.error])];\n const line = workflowLaunchLine(request);\n return (\n <View style={styles.body}>\n <Text style={styles.meta}>{workflow.description}</Text>\n <Textarea\n accessibilityLabel=\"Workflow prompt\"\n placeholder=\"What should this workflow do?\"\n value={prompt}\n onChangeText={setPrompt}\n />\n {workflow.inputs.map((input) => {\n const options = input.options ?? (input.type === 'boolean' ? ['true', 'false'] : undefined);\n return (\n <View key={input.name}>\n <Text style={styles.meta}>\n {input.name}\n {input.required ? ' (required)' : ''} · {input.description}\n </Text>\n {options ? (\n <Choice\n label={input.name}\n options={options}\n value={inputs[input.name]}\n onChange={(value) => setInputs((current) => ({ ...current, [input.name]: value }))}\n />\n ) : (\n <Input\n accessibilityLabel={input.name}\n value={inputs[input.name] ?? ''}\n onChangeText={(value) => setInputs((current) => ({ ...current, [input.name]: value }))}\n />\n )}\n </View>\n );\n })}\n {workflow.runners?.length ? (\n <Choice label=\"Runner\" options={workflow.runners} value={runner} onChange={setRunner} />\n ) : null}\n {workflow.commands?.length ? (\n <Choice label=\"Command\" options={workflow.commands} value={command} onChange={setCommand} />\n ) : null}\n {workflow.choices?.length ? (\n <Choice label=\"Choice\" options={workflow.choices} value={choice} onChange={setChoice} />\n ) : null}\n <CodeBlock text={line} />\n {problems.map((problem) => (\n <Text key={problem} style={styles.meta}>\n {problem}\n </Text>\n ))}\n {error ? <Text style={styles.error}>{error}</Text> : null}\n <Button\n testID=\"launch-workflow-submit\"\n disabled={problems.length > 0}\n onPress={() => {\n if (problems.length > 0) return;\n try {\n requestLaunch(sendSessionFrame, sessionId, line, workflow.path);\n onClose();\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : String(cause));\n }\n }}\n >\n Launch\n </Button>\n </View>\n );\n}\n\nexport function WorkflowPanel(props: WebPluginSlotProps & { identity?: string }) {\n const state = useWorkflows(props.sessionId);\n const identity = props.identity ?? state.focusedRun;\n const run =\n state.runs.find((item) => workflowRunIdentity(item) === identity) ??\n (props.identity === undefined ? state.runs[0] : undefined);\n if (props.identity !== undefined && !run) return <Text style={styles.meta}>This run is no longer listed.</Text>;\n return (\n <WorkflowRunPanel\n key={JSON.stringify([props.sessionId, run && workflowRunIdentity(run)])}\n {...props}\n run={run}\n runs={state.runs}\n onSelectRun={(item) => {\n if (props.sessionId !== null) focusRun(props.sessionId, workflowRunIdentity(item));\n props.openTransientTab(workflowTab(item));\n }}\n />\n );\n}\n\n/** One action/navigation controller, shared by transient run screens and the Workflow dock. */\nexport function WorkflowRunPanel(\n props: WebPluginSlotProps & {\n run?: WorkflowRunView;\n runs: WorkflowRunView[];\n sheet?: boolean;\n onSelectRun: (run: WorkflowRunView) => void;\n },\n) {\n const { run, sessionId } = props;\n const [busy, setBusy] = useState<WorkflowRunAction>();\n const [error, setError] = useState<string>();\n const operation = useRef<{ kind: WorkflowRunAction } | undefined>(undefined);\n const mounted = useRef(true);\n useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n };\n }, []);\n useEffect(() => {\n if (run?.stage !== 'running' && operation.current?.kind === 'stopping') {\n operation.current = undefined;\n setBusy(undefined);\n }\n }, [run?.stage]);\n const runs = useMemo(\n () => [...props.runs].sort((left, right) => runPriority(left) - runPriority(right)),\n [props.runs],\n );\n const act = async (kind: WorkflowRunAction, action: () => Promise<void>) => {\n if (operation.current || !run || sessionId === null) return;\n const token = { kind };\n operation.current = token;\n setBusy(kind);\n setError(undefined);\n try {\n await action();\n if (kind === 'deleting' && mounted.current && operation.current === token) {\n operation.current = undefined;\n setBusy(undefined);\n }\n // An accepted stop stays pending until the registry channel settles the run.\n } catch (cause) {\n if (mounted.current && operation.current === token) {\n operation.current = undefined;\n setBusy(undefined);\n setError(cause instanceof Error ? cause.message : String(cause));\n }\n }\n };\n return (\n <WorkflowDockView\n run={run}\n runs={runs}\n sheet={props.sheet}\n dockHeader={props.dockHeader}\n busy={busy}\n error={error}\n canAct={sessionId !== null}\n onSelectRun={props.onSelectRun}\n onLaunch={() => {\n if (sessionId !== null) openCatalog(sessionId);\n }}\n onOpenStep={(job, step) => {\n const target = run?.jobs.find((item) => item.name === job)?.steps.find((item) => item.name === step);\n if (!run || !target || target.status === 'pending') return;\n props.openTransientTab(stepTab(run, job, step, sessionId));\n }}\n artifacts={\n run ? (\n <WorkflowArtifacts key={JSON.stringify([sessionId, workflowRunIdentity(run)])} {...props} run={run} />\n ) : undefined\n }\n onStop={() => {\n if (!run || run.stage !== 'running') return;\n void act('stopping', async () => {\n const result = await stopWorkflowRun(run.workspace, run.routeKey ?? run.runKey, sessionId);\n if ('error' in result) throw new Error(result.error);\n });\n }}\n onDelete={() => {\n if (!run || run.stage === 'running') return;\n void act('deleting', async () => {\n const result = await deleteWorkflowRun(run.workspace, run.routeKey ?? run.runKey, sessionId);\n if ('error' in result) throw new Error(result.error);\n if (sessionId !== null) removeRun(sessionId, workflowRunIdentity(run));\n props.closeTransientTab(workflowTab(run).id);\n });\n }}\n />\n );\n}\nfunction stepTab(\n run: WorkflowRunView,\n job: string,\n step?: string,\n ownerSessionId: string | null = null,\n): Parameters<WebPluginSlotProps['openTransientTab']>[0] {\n const workspace = run.workspace;\n const runKey = run.routeKey ?? run.runKey;\n const steps = run.jobs.find((item) => item.name === job)?.steps;\n const target = step === undefined ? steps?.at(-1) : steps?.find((item) => item.name === step);\n const session = target?.ref?.kind === 'session' ? target.ref.id : undefined;\n const live = session !== undefined && run.stage === 'running' && target?.status === 'running';\n const tabId = `workflows-step-${workspace}-${runKey}-${job}${step === undefined ? '' : `-${step}`}`.replace(\n /[^\\w-]+/g,\n '-',\n );\n return {\n targetSessionId: session,\n activityScope: STEP_ACTIVITY_SCOPE,\n retainComposer: live,\n id: tabId,\n label: `${run.displayName} › ${step ?? job}`,\n panel: (props) => (\n <WorkflowStep\n {...props}\n tabId={tabId}\n sessionId={ownerSessionId}\n workspace={workspace}\n runKey={runKey}\n job={job}\n step={step}\n />\n ),\n };\n}\nfunction WorkflowStep({\n sessionId,\n workspace,\n runKey,\n job,\n step,\n renderSessionTranscript,\n renderRunnerTerminal,\n setTransientTabSession,\n openSession,\n tabId,\n}: WebPluginSlotProps & { workspace: string; runKey: string; job: string; step?: string; tabId: string }) {\n const state = useWorkflows(sessionId);\n const run = state.runs.find((item) => item.workspace === workspace && (item.routeKey ?? item.runKey) === runKey);\n const steps = run?.jobs.find((item) => item.name === job)?.steps;\n const target = step === undefined ? steps?.at(-1) : steps?.find((item) => item.name === step);\n const ref = target?.ref;\n const session = ref?.kind === 'session' ? ref.id : undefined;\n const live = session !== undefined && run?.stage === 'running' && target?.status === 'running';\n useEffect(() => {\n setTransientTabSession?.(tabId, session, live);\n }, [setTransientTabSession, tabId, live, session]);\n return (\n <View style={styles.screen}>\n <Text style={styles.title}>\n {job}\n {step === undefined ? '' : ` › ${step}`} · {target?.status}\n </Text>\n {session ? (\n <>\n {renderSessionTranscript?.(session)}\n <StepDynamicRuns stepSessionId={session} openSession={openSession} />\n </>\n ) : (\n <WorkflowTerminal\n key={`${sessionId}:${workspace}:${runKey}:${ref?.id ?? ''}`}\n sessionId={sessionId}\n workspace={workspace}\n runKey={runKey}\n pane={ref?.kind === 'pane' ? ref.id : undefined}\n renderRunnerTerminal={renderRunnerTerminal}\n />\n )}\n </View>\n );\n}\nfunction WorkflowTerminal({\n sessionId,\n workspace,\n runKey,\n pane,\n renderRunnerTerminal,\n}: Pick<WebPluginSlotProps, 'sessionId' | 'renderRunnerTerminal'> & {\n workspace: string;\n runKey: string;\n pane?: string;\n}) {\n const [capabilities, setCapabilities] = useState<WorkflowTerminalCapabilitiesView>();\n const [token, setToken] = useState<string>();\n const [notice, setNotice] = useState<string>();\n const [columns, setColumns] = useState('80');\n const [rows, setRows] = useState('24');\n const [busy, setBusy] = useState(false);\n const [lifetime] = useState(() => new AbortController());\n useEffect(() => () => lifetime.abort(), [lifetime]);\n useEffect(() => {\n if (token === undefined) return;\n return () => {\n // Best effort on unmount: the panel is gone, so there is nobody to tell. The server-side\n // control lease expires on its own (workflowTerminal leaseMs), which frees the terminal anyway.\n void releaseControl(workspace, runKey, token, sessionId, pane).catch(() => undefined);\n };\n }, [workspace, runKey, token, sessionId, pane]);\n const request = useMemo(\n () => ({\n key: `${sessionId}:${workspace}:${runKey}:${pane ?? ''}`,\n read: finiteScreenReader(async (signal) => {\n const frame = await readScreen(workspace, runKey, sessionId, pane, signal);\n if (!signal.aborted && !lifetime.signal.aborted) setCapabilities(frame.capabilities);\n return frame;\n }),\n write: async (text: string) => {\n if (token === undefined) throw new Error('Take control before typing into this run.');\n const result = await sendKeys(workspace, runKey, token, text, sessionId, pane);\n if (result.error) {\n if (!lifetime.signal.aborted) {\n setNotice(result.error);\n setToken(undefined);\n }\n throw new Error(result.error);\n }\n },\n }),\n [sessionId, workspace, runKey, pane, token, lifetime],\n );\n const arm = async () => {\n setBusy(true);\n try {\n const grant = await takeControl(workspace, runKey, undefined, sessionId, pane);\n if (lifetime.signal.aborted) {\n if (grant.held && grant.token) await releaseControl(workspace, runKey, grant.token, sessionId, pane);\n return;\n }\n if (grant.held && grant.token) {\n setToken(grant.token);\n setNotice(undefined);\n } else setNotice(grant.reason ?? 'The keyboard is not available for this run.');\n } catch (cause) {\n if (!lifetime.signal.aborted) setNotice(cause instanceof Error ? cause.message : String(cause));\n } finally {\n if (!lifetime.signal.aborted) setBusy(false);\n }\n };\n return (\n <View style={styles.transcript}>\n <Badge>{token ? 'keyboard yours' : 'watching'}</Badge>\n {capabilities?.writable ? (\n <Button\n variant=\"outline\"\n disabled={busy}\n onPress={() => {\n if (token) setToken(undefined);\n else void arm();\n }}\n >\n {token ? 'Release keyboard' : 'Take control'}\n </Button>\n ) : null}\n <View style={styles.transcript}>{renderRunnerTerminal?.(request)}</View>\n {capabilities?.reason ? <Text style={styles.meta}>{capabilities.reason}</Text> : null}\n {token && capabilities?.resizable ? (\n <View>\n <Input\n accessibilityLabel=\"Terminal columns\"\n keyboardType=\"number-pad\"\n value={columns}\n onChangeText={setColumns}\n />\n <Input accessibilityLabel=\"Terminal rows\" keyboardType=\"number-pad\" value={rows} onChangeText={setRows} />\n <Button\n variant=\"outline\"\n disabled={\n !Number.isInteger(Number(columns)) ||\n !Number.isInteger(Number(rows)) ||\n Number(columns) < 1 ||\n Number(rows) < 1\n }\n onPress={() => {\n void resizeRun(workspace, runKey, token, Number(columns), Number(rows), sessionId, pane).catch(\n (cause: unknown) => {\n if (!lifetime.signal.aborted) setNotice(cause instanceof Error ? cause.message : String(cause));\n },\n );\n }}\n >\n Resize terminal\n </Button>\n </View>\n ) : null}\n {notice ? <Text style={styles.meta}>{notice}</Text> : null}\n </View>\n );\n}\nfunction WorkflowArtifacts(props: WebPluginSlotProps & { run: WorkflowRunView }) {\n const { run, sessionId, openTransientTab } = props;\n const [directory, setDirectory] = useState<string>();\n const requestKey = JSON.stringify([sessionId, run.workspace, run.routeKey ?? run.runKey, directory, run.stage]);\n const [loaded, setLoaded] = useState<{ key: string; listing?: WorkflowArtifactsResponse; error?: string }>();\n const current = loaded?.key === requestKey ? loaded : undefined;\n const listing = current?.listing;\n const error = current?.error;\n useEffect(() => {\n let active = true;\n void fetchArtifacts(run.workspace, run.routeKey ?? run.runKey, sessionId, directory)\n .then((result) => {\n if (active) {\n setLoaded(\n 'error' in result\n ? { key: requestKey, error: result.error }\n : { key: requestKey, listing: result.artifacts },\n );\n }\n })\n .catch((cause: unknown) => {\n if (active) setLoaded({ key: requestKey, error: cause instanceof Error ? cause.message : String(cause) });\n });\n return () => {\n active = false;\n };\n }, [run.workspace, run.runKey, run.routeKey, sessionId, directory, run.stage, requestKey]);\n return (\n <WorkflowArtifactList\n listing={listing}\n error={error}\n loading={listing === undefined && error === undefined}\n onParent={\n directory === undefined\n ? undefined\n : () => setDirectory(directory.includes('/') ? directory.slice(0, directory.lastIndexOf('/')) : undefined)\n }\n onOpen={(item) => {\n if (item.state === 'pending' || item.state === 'unreadable') return;\n if (item.kind === 'directory') setDirectory(item.path);\n else {\n const workspace = run.workspace;\n const runKey = run.routeKey ?? run.runKey;\n const path = item.path;\n openTransientTab({\n id: `workflows-artifact-${workspace}-${runKey}-${path}`.replace(/[^\\w-]+/g, '-'),\n label: path,\n panel: (panelProps) => (\n <ArtifactPreview {...panelProps} workspace={workspace} runKey={runKey} path={path} />\n ),\n });\n }\n }}\n />\n );\n}\nexport function ArtifactPreview({\n sessionId,\n workspace,\n runKey,\n path,\n renderFilePreview,\n renderMediaPreview,\n nativeSaveFile,\n}: WebPluginSlotProps & { workspace: string; runKey: string; path: string }) {\n const [content, setContent] = useState<WorkflowArtifactContentResponse>();\n const [error, setError] = useState<string>();\n const [raw, setRaw] = useState(false);\n useEffect(() => {\n let active = true;\n void fetchArtifact(workspace, runKey, path, sessionId)\n .then((result) => {\n if (active) {\n if ('error' in result) setError(result.error);\n else setContent(result.artifact);\n }\n })\n .catch((cause: unknown) => {\n if (active) setError(cause instanceof Error ? cause.message : String(cause));\n });\n return () => {\n active = false;\n };\n }, [workspace, runKey, path, sessionId]);\n const downloadController = useRef<AbortController | undefined>(undefined);\n const [saving, setSaving] = useState(false);\n const [saveNote, setSaveNote] = useState<string>();\n useEffect(() => () => downloadController.current?.abort(), [workspace, runKey, path, sessionId]);\n const download = async () => {\n if (!nativeSaveFile || saving) return;\n const controller = new AbortController();\n downloadController.current = controller;\n setSaving(true);\n try {\n await nativeSaveFile(await prepareArtifactSave(workspace, runKey, path, sessionId, controller.signal));\n if (!controller.signal.aborted) setSaveNote('Saved.');\n } catch (error: unknown) {\n if (!controller.signal.aborted) setSaveNote(error instanceof Error ? error.message : String(error));\n } finally {\n setSaving(false);\n }\n };\n const delimited = !raw && content?.text !== undefined && /\\.(csv|tsv)$/i.test(path);\n const preview = (\n <>\n <Text style={styles.title}>{path}</Text>\n <Button variant=\"outline\" disabled={!nativeSaveFile || saving} onPress={() => void download()}>\n Download\n </Button>\n {saving ? (\n <Button variant=\"ghost\" onPress={() => downloadController.current?.abort()}>\n Cancel download\n </Button>\n ) : null}\n {saveNote ? <Text style={styles.meta}>{saveNote}</Text> : null}\n {error ? <Text style={styles.error}>{error}</Text> : null}\n {content?.text !== undefined ? (\n <>\n <Button variant=\"outline\" onPress={() => setRaw((value) => !value)}>\n {raw ? 'Preview' : 'Raw source'}\n </Button>\n {!raw && /\\.(md|markdown)$/i.test(path) ? (\n <Markdown text={content.text} />\n ) : !raw && /\\.(html|htm)$/i.test(path) ? (\n renderFilePreview?.({ key: `${sessionId}:${workspace}:${runKey}:${path}`, html: content.text, title: path })\n ) : !raw && /\\.(csv|tsv)$/i.test(path) ? (\n <DelimitedArtifact text={content.text} delimiter={/\\.csv$/i.test(path) ? ',' : '\\t'} />\n ) : (\n <CodeBlock text={!raw && /\\.json$/i.test(path) ? prettyJson(content.text) : content.text} />\n )}\n {content.truncated ? <Text style={styles.meta}>This preview was truncated.</Text> : null}\n </>\n ) : content ? (\n <BinaryArtifactPreview\n sessionId={sessionId}\n workspace={workspace}\n runKey={runKey}\n path={path}\n renderMediaPreview={renderMediaPreview}\n />\n ) : (\n <Text style={styles.meta}>Loading preview…</Text>\n )}\n </>\n );\n return delimited ? (\n <View style={[styles.body, styles.transcript]}>{preview}</View>\n ) : (\n <ScrollView contentContainerStyle={styles.body}>{preview}</ScrollView>\n );\n}\nfunction BinaryArtifactPreview({\n sessionId,\n workspace,\n runKey,\n path,\n renderMediaPreview,\n}: Pick<WebPluginSlotProps, 'sessionId' | 'renderMediaPreview'> & { workspace: string; runKey: string; path: string }) {\n const requestKey = JSON.stringify([sessionId, workspace, runKey, path]);\n const [loaded, setLoaded] = useState<{ key: string; media?: { data: string; mimeType: string }; error?: string }>();\n const media = loaded?.key === requestKey ? loaded.media : undefined;\n const error = loaded?.key === requestKey ? loaded.error : undefined;\n useEffect(() => {\n const controller = new AbortController();\n void fetchArtifactMedia(workspace, runKey, path, sessionId, controller.signal)\n .then((value) => {\n if (!controller.signal.aborted) setLoaded({ key: requestKey, media: value });\n })\n .catch((cause: unknown) => {\n if (!controller.signal.aborted)\n setLoaded({ key: requestKey, error: cause instanceof Error ? cause.message : String(cause) });\n });\n return () => controller.abort();\n }, [workspace, runKey, path, sessionId, requestKey]);\n return media ? (\n renderMediaPreview?.({ key: `${sessionId}:${workspace}:${runKey}:${path}`, ...media, title: path, path })\n ) : (\n <Text style={styles.meta}>{error ?? 'Loading preview…'}</Text>\n );\n}\nfunction prettyJson(text: string): string {\n try {\n return JSON.stringify(JSON.parse(text) as unknown, null, 2);\n } catch {\n return text;\n }\n}\nconst styles = StyleSheet.create((theme) => ({\n screen: { flex: 1, backgroundColor: theme.colors.bg, padding: theme.spacing(3) },\n transcript: { flex: 1 },\n body: { padding: theme.spacing(3), gap: theme.spacing(2) },\n title: { color: theme.colors.hi, fontSize: theme.fontSize.base, fontWeight: '600' },\n meta: { color: theme.colors.dim, fontSize: theme.fontSize.sm },\n error: { color: theme.colors.red, fontSize: theme.fontSize.sm },\n}));\n","import { defineActivityGroup } from '@agimon-ai/po-core/native';\nimport { WorkflowIcon } from '@agimon-ai/po-native-components';\nimport { createElement } from 'react';\n\nimport { workflowsTab } from '../_components/WorkflowPanel.native';\nimport { dynamicWorkflows } from '../_lib/dynamicWorkflowStore.native';\nimport { workflows } from '../_lib/workflowsStore.native';\nexport default defineActivityGroup({\n keys: 'w r',\n icon: () => createElement(WorkflowIcon),\n widgetKeys: ['workflow-mcp-progress', 'workflow-mcp-follow'],\n order: 30,\n transientTab: workflowsTab,\n // Lit while a YAML run or a dynamic workflow of this session is running.\n activeSource: {\n subscribe(listener) {\n const runs = workflows.store.subscribe(listener);\n const dynamic = dynamicWorkflows.store.subscribe(listener);\n return () => {\n runs.unsubscribe();\n dynamic.unsubscribe();\n };\n },\n isActive(sessionId) {\n return (\n workflows.select(workflows.store.state, sessionId).runs.some((run) => run.stage === 'running') ||\n (dynamicWorkflows\n .select(dynamicWorkflows.store.state, sessionId)\n ?.runs.some((run) => run.status === 'running') ??\n false)\n );\n },\n },\n});\n","import { defineChannelFile } from '@agimon-ai/po-core/native';\n\nimport { dynamicWorkflowRunsChannel } from '../_lib/dynamicWorkflowStore.native';\n\nexport default defineChannelFile(dynamicWorkflowRunsChannel);\n","import { defineChannelFile } from '@agimon-ai/po-core/native';\n\nimport { workflowCatalogChannel } from '../_lib/catalogStore.native';\nexport default defineChannelFile(workflowCatalogChannel);\n","import { defineChannelFile } from '@agimon-ai/po-core/native';\n\nimport { workflowRunsChannel } from '../_lib/workflowsStore.native';\nexport default defineChannelFile(workflowRunsChannel);\n","import type { WebPluginSlotProps } from '@agimon-ai/po-core/native';\n\nimport { useWorkflows, WorkflowRunPanel } from '../../_components/WorkflowPanel.native';\nimport { ownsRun, workflowRunIdentity } from '../../_lib/workflowActivity';\nimport { focusRun } from '../../_lib/workflowsStore.native';\n\nexport function WorkflowDockPanel(props: WebPluginSlotProps) {\n const state = useWorkflows(props.sessionId);\n const runs = state.runs.filter((run) => ownsRun(run, props.sessionId));\n const run = runs.find((item) => workflowRunIdentity(item) === state.focusedRun) ?? runs[0];\n return (\n <WorkflowRunPanel\n key={JSON.stringify([props.sessionId, run && workflowRunIdentity(run)])}\n {...props}\n run={run}\n runs={runs}\n sheet\n onSelectRun={(item) => {\n if (props.sessionId !== null && ownsRun(item, props.sessionId))\n focusRun(props.sessionId, workflowRunIdentity(item));\n }}\n />\n );\n}\n","import { defineDockFace } from '@agimon-ai/po-core/native';\n\nimport { ownsRun } from '../_lib/workflowActivity';\nimport { workflows } from '../_lib/workflowsStore.native';\nimport { WorkflowDockPanel } from './_components/WorkflowDockPanel.native';\n\nexport default defineDockFace({\n id: 'workflow',\n label: 'Workflow',\n order: 20,\n ownsScroll: true,\n panel: WorkflowDockPanel,\n visibility: {\n subscribe(listener: () => void) {\n const subscription = workflows.store.subscribe(listener);\n return () => subscription.unsubscribe();\n },\n isVisible(sessionId: string | null) {\n return workflows.select(workflows.store.state, sessionId).runs.some((run) => ownsRun(run, sessionId));\n },\n },\n});\n","import { defineFill } from '@agimon-ai/po-core/native';\n\nimport { WorkflowLauncher } from '../_components/WorkflowPanel.native';\nexport default defineFill({ component: WorkflowLauncher });\n","import type { WebPluginSlotProps } from '@agimon-ai/po-core/native';\nimport { useCallback, useSyncExternalStore } from 'react';\n\nimport type { DynamicWorkflowRun } from '../../../../../types/dynamicWorkflow';\nimport { dynamicWorkflows } from '../_lib/dynamicWorkflowStore.native';\nimport { 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\nexport function useDynamicWorkflows(sessionId: string | null) {\n const subscribe = useCallback((listener: () => void) => {\n const subscription = dynamicWorkflows.store.subscribe(listener);\n return () => subscription.unsubscribe();\n }, []);\n return useSyncExternalStore(subscribe, () => dynamicWorkflows.select(dynamicWorkflows.store.state, sessionId));\n}\n\nexport function DynamicWorkflowPanel({ sessionId, openTransientTab }: WebPluginSlotProps) {\n const snapshot = useDynamicWorkflows(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 type { WebPluginSlotProps } from '@agimon-ai/po-core/native';\nimport { ArrowRightIcon, Button, Dot, fontOf, ListRow } from '@agimon-ai/po-native-components';\nimport type { PoNativeTheme } from '@agimon-ai/po-web-components/nativeTheme';\nimport { useState } from 'react';\nimport { Pressable, Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport { dynamicWorkflowTab, useDynamicWorkflows } from '../../_components/DynamicWorkflowPanel.native';\nimport { DynamicWorkflowActivity } from '../../_components/DynamicWorkflowView.native';\nimport { WorkflowDuration } from '../../_components/WorkflowDuration.native';\nimport { useWorkflows, workflowTab } from '../../_components/WorkflowPanel.native';\nimport { openCatalog } from '../../_lib/catalogStore.native';\nimport {\n workflowActivityGroups,\n workflowActivityRows,\n type WorkflowActivityGroupName,\n} from '../../_lib/workflowActivity';\nimport { focusRun } from '../../_lib/workflowsStore.native';\n\nexport function WorkflowsActivitySection({ sessionId, openSession, openTransientTab }: WebPluginSlotProps) {\n const state = useWorkflows(sessionId);\n const dynamicRuns = useDynamicWorkflows(sessionId)?.runs ?? [];\n const [openedAt] = useState(Date.now);\n const [folded, setFolded] = useState<Partial<Record<WorkflowActivityGroupName, boolean>>>({});\n\n const groups = workflowActivityGroups(workflowActivityRows(state.runs, openedAt, sessionId));\n return (\n <View>\n {groups.map((group) => {\n const open = folded[group.name] ?? group.openByDefault;\n return (\n <View key={group.name}>\n <Button\n variant=\"ghost\"\n accessibilityState={{ expanded: open }}\n onPress={() => setFolded((current) => ({ ...current, [group.name]: !open }))}\n >\n {group.name} · {group.rows.length}\n </Button>\n {open\n ? group.rows.map((row) => (\n <ListRow\n key={row.identity}\n leading={\n <Dot\n tone={\n row.tone === 'failed'\n ? 'red'\n : row.tone === 'running' || row.tone === 'paused'\n ? 'yellow'\n : row.tone === 'done'\n ? 'green'\n : 'muted'\n }\n />\n }\n title={\n <Button\n variant=\"ghost\"\n testID={`activity-workflow-${row.runKey}`}\n onPress={() => {\n if (row.ownerSessionId && openSession) {\n openSession(row.ownerSessionId);\n return;\n }\n const run = state.runs.find(\n (item) => `${item.workspace}/${item.routeKey ?? item.runKey}` === row.identity,\n );\n if (sessionId !== null) focusRun(sessionId, row.identity);\n if (run) openTransientTab(workflowTab(run));\n }}\n >\n {row.name}\n </Button>\n }\n description={\n <View style={{ flexDirection: 'row', alignItems: 'center' }}>\n <Text style={styles.status}>{row.detail} · </Text>\n <WorkflowDuration startedAt={row.startedAt} endedAt={row.finishedAt} style={styles.status} />\n </View>\n }\n />\n ))\n : null}\n </View>\n );\n })}\n {/* Runs the agent started with the dynamicWorkflow namespace; the tab shows their graphs. */}\n {dynamicRuns.length > 0 ? (\n <View testID=\"activity-dynamic-workflows\">\n <Text style={styles.heading}>Dynamic</Text>\n <DynamicWorkflowActivity runs={dynamicRuns} onOpen={() => openTransientTab(dynamicWorkflowTab())} />\n </View>\n ) : null}\n {/* The cockpit's idle line: the status, then the one jade action beside it. With runs, the action alone stays below them. */}\n <View style={styles.idle}>\n {groups.length === 0 && dynamicRuns.length === 0 ? <Text style={styles.status}>Idle</Text> : null}\n <Pressable\n accessibilityRole=\"button\"\n accessibilityState={{ disabled: sessionId === null }}\n testID=\"activity-workflow-launch\"\n disabled={sessionId === null}\n hitSlop={10}\n onPress={() => {\n if (sessionId !== null) openCatalog(sessionId);\n }}\n style={styles.action}\n >\n <Text style={styles.actionText(sessionId === null)}>Launch a workflow</Text>\n <ArrowRightIcon size={14} color={sessionId === null ? 'dim' : 'green'} />\n </Pressable>\n </View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create((theme: PoNativeTheme) => ({\n idle: { flexDirection: 'row', alignItems: 'center', flexWrap: 'wrap', gap: theme.spacing(4) },\n heading: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n fontWeight: theme.fontWeight.semibold,\n color: theme.colors.hi,\n paddingVertical: theme.spacing(1),\n },\n status: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n color: theme.colors.dim,\n },\n action: { flexDirection: 'row', alignItems: 'center', gap: theme.spacing(1) },\n actionText: (disabled: boolean) => ({\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n fontWeight: theme.fontWeight.medium,\n color: disabled ? theme.colors.dim : theme.colors.green,\n }),\n}));\n","import { defineFill } from '@agimon-ai/po-core/native';\n\nimport { WorkflowsActivitySection } from './_components/WorkflowsActivitySection.native';\nexport default defineFill({ component: WorkflowsActivitySection });\n","import type { ToolResultView } from '@agimon-ai/po-core/web';\nimport type { MessageLine, MessageLineTone } from '@agimon-ai/po-web-components';\n\n/**\n * The cockpit half of src/tui/workflow/workflowToolRender.ts: the same\n * result shapes reduced to a list of toned lines, so the React cards stay a\n * thin mapping and the parsing is testable without a DOM. Kept in step with\n * the TUI by hand; the two share no code because web/ may not import src/tui.\n */\n\nexport type WorkflowToolName =\n | 'launch_workflow'\n | 'list_workflows'\n | 'workflow_run'\n | 'workflow_tools'\n | 'scaffold_workflow';\n\n/** The toned lines the shared MessageLines draws; the vocabulary is the components package's. */\nexport type LineTone = MessageLineTone;\nexport type ToolLine = MessageLine;\n\nexport interface WorkflowCallSummary {\n action: string;\n target?: string;\n metadata: string[];\n}\n\nexport interface WorkflowRenderOptions {\n expanded: boolean;\n isError: boolean;\n isPartial: boolean;\n}\n\ntype JsonRecord = Record<string, unknown>;\n\ninterface WorkflowState {\n tone: LineTone;\n glyph: string;\n label: string;\n}\n\ninterface WorkflowCatalogItem {\n description: string;\n name: string;\n path: string;\n tags: string[];\n}\n\ninterface WorkflowCatalog {\n directory?: string;\n page: number;\n pageSize: number;\n tags: Array<{ count: number; tag: string }>;\n total: number;\n totalPages: number;\n workflows: WorkflowCatalogItem[];\n}\n\ninterface EvidenceSection {\n body: string[];\n name: string;\n}\n\nconst COLLAPSED_CATALOG_ROWS = 6;\nconst COLLAPSED_DETAIL_LINES = 8;\nconst PARTIAL_DETAIL_LINES = 4;\n\nexport const WORKFLOW_TOOL_NAMES: readonly WorkflowToolName[] = [\n 'list_workflows',\n 'launch_workflow',\n 'workflow_run',\n 'workflow_tools',\n 'scaffold_workflow',\n];\n\n/** The card's tool, with any other name read as workflow_run, as the web card always has. */\nexport function workflowToolName(name: string): WorkflowToolName {\n return WORKFLOW_TOOL_NAMES.includes(name as WorkflowToolName) ? (name as WorkflowToolName) : 'workflow_run';\n}\n\nfunction asRecord(value: unknown): JsonRecord | undefined {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return undefined;\n return value as JsonRecord;\n}\n\nfunction inlineText(value: string): string {\n let normalized = '';\n for (const character of value) {\n const code = character.codePointAt(0) ?? 0;\n normalized += code <= 31 || code === 127 ? ' ' : character;\n }\n return normalized.replace(/\\s+/gu, ' ').trim();\n}\n\nfunction readString(record: JsonRecord | undefined, key: string): string | undefined {\n const value = record?.[key];\n if (typeof value !== 'string') return undefined;\n return inlineText(value) || undefined;\n}\n\nfunction readNumber(record: JsonRecord | undefined, key: string): number | undefined {\n const value = record?.[key];\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined;\n}\n\nfunction readBoolean(record: JsonRecord | undefined, key: string): boolean | undefined {\n const value = record?.[key];\n return typeof value === 'boolean' ? value : undefined;\n}\n\nfunction readStringArray(record: JsonRecord | undefined, key: string): string[] {\n const value = record?.[key];\n if (!Array.isArray(value)) return [];\n return value.filter((item): item is string => typeof item === 'string');\n}\n\nfunction parseJsonRecord(text: string | undefined): JsonRecord | undefined {\n if (!text) return undefined;\n try {\n return asRecord(JSON.parse(text));\n } catch {\n // Not every workflow result is JSON; the plain-text shapes fall through.\n return undefined;\n }\n}\n\nfunction textBlocks(result: ToolResultView | null): string[] {\n if (!result) return [];\n return result.content.flatMap((item) => {\n const record = asRecord(item);\n return record?.type === 'text' && typeof record.text === 'string' ? [record.text] : [];\n });\n}\n\nfunction detailLines(result: ToolResultView | null): string[] {\n return textBlocks(result)\n .flatMap((block) => block.split('\\n'))\n .map((entry) => entry.trimEnd())\n .filter((entry) => entry.length > 0);\n}\n\nfunction firstPayload(result: ToolResultView | null): JsonRecord | undefined {\n return parseJsonRecord(textBlocks(result)[0]);\n}\n\nfunction plural(count: number, singular: string, pluralForm = `${singular}s`): string {\n return count === 1 ? singular : pluralForm;\n}\n\nfunction line(text: string, tone: LineTone, extra: Omit<ToolLine, 'text' | 'tone'> = {}): ToolLine {\n return { text, tone, ...extra };\n}\n\nfunction labelValue(label: string, value: string): ToolLine {\n return line(`${label} ${value}`, 'text');\n}\n\nfunction hiddenLine(hidden: number): ToolLine {\n return line(`… ${hidden} more`, 'dim');\n}\n\nfunction targetScope(args: JsonRecord): string | undefined {\n const runKey = readString(args, 'runKey');\n if (!runKey) return undefined;\n const workspace = readString(args, 'workspace');\n return workspace ? `${workspace}/${runKey}` : runKey;\n}\n\nfunction toolAction(toolName: WorkflowToolName, args: JsonRecord): string {\n if (toolName === 'list_workflows') return 'list';\n if (toolName === 'launch_workflow') return 'launch';\n if (toolName === 'scaffold_workflow') return 'scaffold';\n return readString(args, 'action') ?? 'run';\n}\n\nfunction toolTarget(toolName: WorkflowToolName, args: JsonRecord): string | undefined {\n if (toolName === 'list_workflows') return readString(args, 'directory');\n if (toolName === 'launch_workflow') return readString(args, 'workflowPath');\n if (toolName === 'scaffold_workflow') return readString(args, 'path');\n return targetScope(args);\n}\n\nfunction statusTimestamp(value: string): string {\n return value.replace('T', ' ').replace(/\\.\\d{3}Z$/, 'Z');\n}\n\nfunction workflowNameFromPath(path: string | undefined): string {\n if (!path) return 'workflow';\n const filename = path.split('/').at(-1) ?? path;\n return filename.replace(/\\.workflow\\.ya?ml$/u, '') || filename;\n}\n\nfunction callMetadata(toolName: WorkflowToolName, args: JsonRecord): string[] {\n const values: string[] = [];\n\n if (toolName === 'list_workflows') {\n const page = readNumber(args, 'page');\n const pageSize = readNumber(args, 'pageSize');\n if (page !== undefined) values.push(`page ${page}`);\n if (pageSize !== undefined) values.push(`${pageSize}/page`);\n if (readString(args, 'filter')) values.push('filtered');\n const tags = readStringArray(args, 'tags');\n if (tags.length > 0) values.push(`${tags.length} ${plural(tags.length, 'tag')}`);\n } else if (toolName === 'launch_workflow') {\n const job = readString(args, 'job');\n const runner = readString(args, 'runner');\n const workspace = readString(args, 'workspace');\n const inputCount = Object.keys(asRecord(args.inputs) ?? {}).length;\n const environmentCount = Object.keys(asRecord(args.env) ?? {}).length;\n if (workspace) values.push(`workspace ${workspace}`);\n if (job) values.push(`job ${job}`);\n if (runner) values.push(`runner ${runner}`);\n if (readBoolean(args, 'dryRun')) values.push('dry run');\n if (readString(args, 'prompt')) values.push('with prompt');\n if (inputCount > 0) values.push(`${inputCount} ${plural(inputCount, 'input')}`);\n if (environmentCount > 0) values.push(`${environmentCount} env`);\n } else if (toolName === 'scaffold_workflow') {\n if (readBoolean(args, 'force')) values.push('overwrite allowed');\n } else {\n if (readString(args, 'expectedRunId')) values.push('generation checked');\n if (readString(args, 'reason')) values.push('with reason');\n if (readBoolean(args, 'dryRun')) values.push('dry run');\n if (readString(args, 'job')) values.push('job override');\n if (readString(args, 'runner')) values.push('runner override');\n }\n\n return values;\n}\n\n/** The header beside the tool name: action, target, and the call's flags. */\nexport function workflowCallSummary(toolName: WorkflowToolName, args: JsonRecord): WorkflowCallSummary {\n const target = toolTarget(toolName, args);\n return {\n action: toolAction(toolName, args),\n ...(target === undefined ? {} : { target }),\n metadata: callMetadata(toolName, args),\n };\n}\n\nfunction parseCatalog(payload: JsonRecord | undefined): WorkflowCatalog | undefined {\n if (!Array.isArray(payload?.workflows)) return undefined;\n\n const workflows = payload.workflows.flatMap((value) => {\n const record = asRecord(value);\n const path = readString(record, 'path');\n if (!record || !path) return [];\n return [\n {\n description: readString(record, 'description') ?? '',\n name: readString(record, 'name') ?? '',\n path,\n tags: readStringArray(record, 'tags'),\n },\n ];\n });\n const tags = Array.isArray(payload.tags)\n ? payload.tags.flatMap((value) => {\n const record = asRecord(value);\n const tag = readString(record, 'tag');\n const count = readNumber(record, 'count');\n return tag && count !== undefined ? [{ count, tag }] : [];\n })\n : [];\n\n const directory = readString(payload, 'directory');\n return {\n ...(directory === undefined ? {} : { directory }),\n page: readNumber(payload, 'page') ?? 1,\n pageSize: readNumber(payload, 'pageSize') ?? workflows.length,\n tags,\n total: readNumber(payload, 'total') ?? workflows.length,\n totalPages: readNumber(payload, 'totalPages') ?? (workflows.length > 0 ? 1 : 0),\n workflows,\n };\n}\n\nfunction catalogItemLines(item: WorkflowCatalogItem, expanded: boolean): ToolLine[] {\n const name = item.name || workflowNameFromPath(item.path);\n const lines = [line(`› ${name} · ${item.path}`, 'text')];\n if (!expanded) return lines;\n if (item.description) lines.push(line(item.description, 'muted', { indent: true }));\n if (item.tags.length > 0) lines.push(line(`tags ${item.tags.join(', ')}`, 'dim', { indent: true }));\n return lines;\n}\n\nfunction catalogLines(result: ToolResultView | null, options: WorkflowRenderOptions): ToolLine[] | undefined {\n const catalog = parseCatalog(firstPayload(result));\n if (!catalog) return undefined;\n\n const pageLabel = `page ${catalog.page}/${catalog.totalPages}`;\n const glyph = catalog.total > 0 ? '✓' : '○';\n const summary = line(`${glyph} ${catalog.total} ${plural(catalog.total, 'workflow')} · ${pageLabel}`, 'hi', {\n bold: true,\n });\n const shown = options.expanded ? catalog.workflows : catalog.workflows.slice(0, COLLAPSED_CATALOG_ROWS);\n const lines = [summary, ...shown.flatMap((item) => catalogItemLines(item, options.expanded))];\n const hidden = catalog.workflows.length - shown.length;\n if (hidden > 0) lines.push(hiddenLine(hidden));\n\n if (options.expanded) {\n if (catalog.tags.length > 0) {\n const tags = catalog.tags.map(({ count, tag }) => `${tag} (${count})`).join(', ');\n lines.push(labelValue('available tags', tags));\n }\n if (catalog.directory) lines.push(labelValue('directory', catalog.directory));\n lines.push(labelValue('page size', String(catalog.pageSize)));\n }\n return lines;\n}\n\nfunction readWorkflowState(record: JsonRecord): WorkflowState {\n const stage = readString(record, 'effectiveStage') ?? readString(record, 'stage') ?? 'unknown';\n const outcome = readString(record, 'effectiveOutcome') ?? readString(record, 'outcome');\n const executionState = readString(record, 'executionState');\n\n if (outcome === 'interrupted') return { tone: 'warning', glyph: '!', label: 'interrupted' };\n if (stage === 'error' || outcome === 'failed') return { tone: 'error', glyph: '✗', label: 'failed' };\n if (stage === 'completed' && outcome === 'skipped') return { tone: 'muted', glyph: '○', label: 'skipped' };\n if (stage === 'completed') return { tone: 'success', glyph: '✓', label: 'completed' };\n if (executionState === 'paused') return { tone: 'warning', glyph: 'Ⅱ', label: 'paused' };\n if (executionState === 'pause_requested') return { tone: 'warning', glyph: '◐', label: 'pause requested' };\n if (executionState === 'resume_requested') return { tone: 'warning', glyph: '◐', label: 'resume requested' };\n if (stage === 'running') return { tone: 'accent', glyph: '◐', label: 'running' };\n return { tone: 'muted', glyph: '○', label: stage };\n}\n\nfunction currentActivity(record: JsonRecord): ToolLine | undefined {\n const position = asRecord(record.position);\n const cursor = asRecord(record.executionCursor);\n const job = readString(position, 'job') ?? readString(cursor, 'job') ?? readString(record, 'job');\n const step = readString(position, 'step') ?? readString(cursor, 'stepName');\n const phase = readString(cursor, 'phase');\n if (!job && !step && !phase) return undefined;\n const context = job ?? phase ?? 'workflow';\n return line(`[${context}] ${step ?? phase ?? 'current job'}`, 'text', { indent: true });\n}\n\nfunction launcherLabel(record: JsonRecord): string | undefined {\n const launcher = asRecord(record.launcher);\n const type = readString(launcher, 'type');\n if (!type) return undefined;\n const identity = readString(launcher, 'sessionName') ?? readString(launcher, 'workspaceId');\n return identity ? `${type} ${identity}` : type;\n}\n\nfunction workflowRecordLines(record: JsonRecord, expanded: boolean): ToolLine[] | undefined {\n const runKey = readString(record, 'runKey');\n const stage = readString(record, 'stage');\n if (!runKey || !stage) return undefined;\n\n const state = readWorkflowState(record);\n const displayName = readString(record, 'displayName') ?? runKey;\n const lines = [\n line(`Status retrieved · ${displayName} · workflow: ${state.label}`, state.tone, { bold: true }),\n labelValue('workspace', readString(record, 'workspace') ?? 'unknown'),\n labelValue('runKey', runKey),\n ];\n const activity = currentActivity(record);\n if (activity) lines.push(activity);\n\n const failure = readString(record, 'errorMessage') ?? readString(record, 'failureReason');\n if (failure) lines.push(line(`error ${failure}`, 'error'));\n const staleReason = readString(record, 'staleReason');\n if (staleReason) lines.push(line(`stale ${staleReason}`, 'warning'));\n\n const startedAt = readString(record, 'startedAt');\n const exitCode = readNumber(record, 'exitCode');\n const conciseMetadata = [\n readString(record, 'runner') ? `runner ${readString(record, 'runner')}` : undefined,\n readBoolean(record, 'dryRun') ? 'dry run' : undefined,\n exitCode !== undefined ? `exit ${exitCode}` : undefined,\n startedAt ? `started ${statusTimestamp(startedAt)}` : undefined,\n ].filter((value): value is string => !!value);\n if (conciseMetadata.length > 0) lines.push(line(conciseMetadata.join(' · '), 'dim'));\n\n if (!expanded) return lines;\n\n const finishedAt = readString(record, 'finishedAt');\n const repairId = readString(record, 'activeRepairId');\n const detailedValues: Array<[string, string | undefined]> = [\n ['workflow', readString(record, 'workflowPath')],\n ['workflow id', readString(record, 'workflowId')],\n ['run id', readString(record, 'runId')],\n ['launcher', launcherLabel(record)],\n ['job', readString(record, 'job')],\n ['outcome', readString(record, 'effectiveOutcome') ?? readString(record, 'outcome')],\n ['finished', finishedAt ? statusTimestamp(finishedAt) : undefined],\n ['pid', readNumber(record, 'pid')?.toString()],\n ['repair', repairId ? `#${repairId}` : undefined],\n ['worktree', readString(record, 'worktreeBranch') ?? readString(record, 'worktreePath')],\n ];\n for (const [label, value] of detailedValues) {\n if (value) lines.push(labelValue(label, value));\n }\n const jobs = record.jobs;\n if (Array.isArray(jobs)) {\n for (const value of jobs) {\n const job = asRecord(value);\n const name = readString(job, 'name');\n const status = readString(job, 'status');\n if (!name || !status) continue;\n lines.push(labelValue('job', `${name} · ${status}`));\n if (!Array.isArray(job?.steps)) continue;\n for (const value of job.steps) {\n const step = asRecord(value);\n const stepName = readString(step, 'name');\n const stepStatus = readString(step, 'status');\n if (stepName && stepStatus) lines.push(line(`step ${stepName} · ${stepStatus}`, 'text', { indent: true }));\n }\n }\n }\n return lines;\n}\n\nfunction statusLines(result: ToolResultView | null, options: WorkflowRenderOptions): ToolLine[] | undefined {\n const payload = firstPayload(result);\n if (!payload) return undefined;\n return workflowRecordLines(payload, options.expanded);\n}\n\nfunction nestedRequestedAt(payload: JsonRecord | undefined): string | undefined {\n return readString(asRecord(payload?.request), 'requestedAt') ?? readString(payload, 'requestedAt');\n}\n\nfunction controlLines(\n action: string,\n args: JsonRecord,\n result: ToolResultView | null,\n options: WorkflowRenderOptions,\n): ToolLine[] {\n const payload = firstPayload(result);\n const scope = targetScope(args) ?? readString(payload, 'runKey') ?? 'workflow';\n const payloadWorkspace = readString(payload, 'workspace');\n const resolvedScope = payloadWorkspace && !scope.includes('/') ? `${payloadWorkspace}/${scope}` : scope;\n const lines = [line(`◐ ${action} requested · ${resolvedScope}`, 'warning', { bold: true })];\n const requestedAt = nestedRequestedAt(payload);\n if (requestedAt) lines.push(labelValue('requested', statusTimestamp(requestedAt)));\n if (options.expanded) lines.push(line('verify the transition with workflow_run status', 'dim'));\n return lines;\n}\n\nfunction matchLine(text: string, pattern: RegExp): string | undefined {\n return text.match(pattern)?.[1]?.trim();\n}\n\nfunction launchSummary(text: string, args: JsonRecord): { name: string; scope: string; state: WorkflowState } {\n const startedName = matchLine(text, /^Started (.+) in workspace .+\\.$/mu);\n const workspace = matchLine(text, /^Started .+ in workspace (.+)\\.$/mu) ?? readString(args, 'workspace');\n const runKey = matchLine(text, /^Run key:\\s*(.+)$/mu);\n const path = readString(args, 'workflowPath');\n const name = startedName ?? workflowNameFromPath(path);\n const scope = runKey ? (workspace ? `${workspace}/${runKey}` : runKey) : (workspace ?? path ?? 'workflow');\n\n if (/Workflow completed successfully/iu.test(text)) {\n return { name, scope, state: { tone: 'success', glyph: '✓', label: 'completed' } };\n }\n if (/Workflow skipped/iu.test(text)) {\n return { name, scope, state: { tone: 'muted', glyph: '○', label: 'skipped' } };\n }\n if (/no run was registered/iu.test(text)) {\n return { name, scope, state: { tone: 'warning', glyph: '◐', label: 'starting · run key pending' } };\n }\n return { name, scope, state: { tone: 'accent', glyph: '◐', label: runKey ? 'started' : 'launch accepted' } };\n}\n\nfunction launchLines(args: JsonRecord, result: ToolResultView | null, options: WorkflowRenderOptions): ToolLine[] {\n const text = textBlocks(result).join('\\n');\n const summary = launchSummary(text, args);\n const lines = [\n line(`${summary.state.glyph} ${summary.name} · ${summary.scope} · ${summary.state.label}`, summary.state.tone, {\n bold: true,\n }),\n ];\n const metadata = [\n readString(args, 'job') ? `job ${readString(args, 'job')}` : undefined,\n readString(args, 'runner') ? `runner ${readString(args, 'runner')}` : undefined,\n readBoolean(args, 'dryRun') ? 'dry run' : undefined,\n ].filter((value): value is string => !!value);\n if (metadata.length > 0) lines.push(line(metadata.join(' · '), 'dim'));\n if (options.expanded) {\n const details = detailLines(result).filter((entry) => !entry.startsWith('Next steps for the agent:'));\n lines.push(...details.map((entry) => line(entry, 'text')));\n }\n return lines;\n}\n\nfunction splitEvidence(text: string): EvidenceSection[] {\n const sections: EvidenceSection[] = [];\n let current: EvidenceSection | undefined;\n for (const entry of text.split('\\n')) {\n const match = entry.match(/^--- (.+) ---$/u);\n if (match?.[1]) {\n current = { body: [], name: match[1] };\n sections.push(current);\n continue;\n }\n current?.body.push(entry);\n }\n return sections;\n}\n\nfunction recoveryEvidenceLines(\n args: JsonRecord,\n result: ToolResultView | null,\n options: WorkflowRenderOptions,\n): ToolLine[] {\n const sections = splitEvidence(textBlocks(result).join('\\n'));\n const runSection = sections.find((section) => section.name === 'run.json');\n const record = parseJsonRecord(runSection?.body.join('\\n'));\n const recordLines = record ? workflowRecordLines(record, options.expanded) : undefined;\n const evidenceSections = sections.filter((section) => section.name !== 'run.json');\n const scope = targetScope(args) ?? 'workflow';\n const lines = recordLines ?? [line(`✓ recovery evidence · ${scope}`, 'success', { bold: true })];\n const names = evidenceSections.map((section) => section.name);\n lines.push(\n names.length > 0 ? labelValue('evidence', names.join(', ')) : line('no durable evidence files recorded', 'muted'),\n );\n if (options.expanded) {\n for (const section of evidenceSections) {\n lines.push(line(section.name, 'hi', { bold: true }));\n lines.push(...section.body.filter((entry) => entry.length > 0).map((entry) => line(entry, 'text')));\n }\n }\n return lines;\n}\n\nfunction simpleActionLines(\n action: string,\n args: JsonRecord,\n result: ToolResultView | null,\n options: WorkflowRenderOptions,\n): ToolLine[] {\n const scope = targetScope(args) ?? 'workflow';\n const actionLabel: Record<string, string> = {\n follow: 'following output',\n open: 'launcher opened',\n recover: readBoolean(args, 'dryRun') ? 'recovery dry run finished' : 'recovery accepted',\n tail: 'launcher output checked',\n };\n const state: WorkflowState =\n action === 'recover'\n ? { tone: 'accent', glyph: '◐', label: actionLabel[action] ?? action }\n : { tone: 'success', glyph: '✓', label: actionLabel[action] ?? action };\n const lines = [line(`${state.glyph} ${state.label} · ${scope}`, state.tone, { bold: true })];\n const details = detailLines(result);\n if (action === 'tail') {\n const workflowLine = details.find((entry) => entry.startsWith('Workflow:'));\n const stageLine = details.find((entry) => entry.startsWith('Stage:'));\n if (workflowLine) lines.push(line(workflowLine, 'text'));\n if (stageLine) lines.push(line(stageLine, 'text'));\n }\n if (options.expanded) lines.push(...details.map((entry) => line(entry, 'text')));\n return lines;\n}\n\nfunction failureLines(\n toolName: WorkflowToolName,\n args: JsonRecord,\n result: ToolResultView | null,\n options: WorkflowRenderOptions,\n): ToolLine[] {\n const action = toolAction(toolName, args);\n const target = toolTarget(toolName, args);\n const details = detailLines(result);\n const shown = options.expanded ? details : details.slice(0, COLLAPSED_DETAIL_LINES);\n const lines = [\n line(\n toolName === 'workflow_run' && action === 'status'\n ? `✗ Status lookup failed${target ? ` · ${target}` : ''}`\n : `✗ ${action} failed${target ? ` · ${target}` : ''}`,\n 'error',\n { bold: true },\n ),\n ...(shown.length > 0 ? shown.map((entry) => line(entry, 'text')) : [line('Unknown workflow error', 'error')]),\n ];\n const hidden = details.length - shown.length;\n if (hidden > 0) lines.push(hiddenLine(hidden));\n return lines;\n}\n\nfunction partialLines(toolName: WorkflowToolName, args: JsonRecord, result: ToolResultView | null): ToolLine[] {\n const details = detailLines(result);\n const shown = details.slice(-PARTIAL_DETAIL_LINES);\n const action = toolAction(toolName, args);\n const target = toolTarget(toolName, args);\n const hidden = details.length - shown.length;\n const lines = [line(`◐ ${action}${target ? ` · ${target}` : ''}`, 'accent', { bold: true })];\n if (hidden > 0) lines.push(line(`… ${hidden} earlier`, 'dim'));\n lines.push(...shown.map((entry) => line(entry, 'text')));\n return lines;\n}\n\nfunction fallbackLines(result: ToolResultView | null, options: WorkflowRenderOptions): ToolLine[] {\n const details = detailLines(result);\n if (details.length === 0) return [line('No workflow output.', 'muted')];\n const shown = options.expanded ? details : details.slice(0, COLLAPSED_DETAIL_LINES);\n const lines = shown.map((entry) => line(entry, 'text'));\n const hidden = details.length - shown.length;\n if (hidden > 0) lines.push(hiddenLine(hidden));\n return lines;\n}\n\n/** The body of a workflow tool card, chosen by tool, action, and result shape. */\nexport function workflowResultLines(\n toolName: WorkflowToolName,\n args: JsonRecord,\n result: ToolResultView | null,\n options: WorkflowRenderOptions,\n): ToolLine[] {\n if (options.isPartial) return partialLines(toolName, args, result);\n if (options.isError) return failureLines(toolName, args, result, options);\n\n if (toolName === 'list_workflows') return catalogLines(result, options) ?? fallbackLines(result, options);\n if (toolName === 'launch_workflow') return launchLines(args, result, options);\n\n const action = readString(args, 'action');\n if (action === 'status') return statusLines(result, options) ?? fallbackLines(result, options);\n if (action === 'pause' || action === 'resume' || action === 'stop')\n return controlLines(action, args, result, options);\n if (action === 'recovery-evidence') return recoveryEvidenceLines(args, result, options);\n if (action === 'follow' || action === 'open' || action === 'recover' || action === 'tail') {\n return simpleActionLines(action, args, result, options);\n }\n return fallbackLines(result, options);\n}\n\n/**\n * The reason a failed call gives, for a card that shows only the reason: the\n * `{ error }` payload the runtime answers a failed operation with, or the plain\n * text a launch failure carries.\n */\nexport function workflowFailureReason(result: ToolResultView | null, output = ''): string {\n const text = (textBlocks(result).join('\\n') || output).trim();\n const error = readString(parseJsonRecord(text), 'error');\n if (error) return error;\n return text || 'Unknown workflow error';\n}\n\n/** One labelled figure of a structured result. */\nexport interface WorkflowFact {\n label: string;\n value: string;\n}\n\n/** One row of a compact list: a title, a quiet detail, and an optional status chip. */\nexport interface WorkflowRow {\n key: string;\n title: string;\n detail?: string;\n chip?: { label: string; tone: 'blue' | 'green' | 'yellow' | 'red' | 'neutral' };\n}\n\n/**\n * A JSON result the toned lines have no dedicated shape for, laid out instead\n * of printed: the failed-run summaries `workflow_tools list-failed` answers\n * with, or any other record as its scalar figures and list counts.\n */\nexport interface WorkflowStructuredView {\n headline: string;\n facts: WorkflowFact[];\n rows: WorkflowRow[];\n note?: string;\n}\n\nfunction parseJsonValue(text: string): unknown {\n try {\n return JSON.parse(text);\n } catch {\n // Plain text is not a structured result; the lines draw it.\n return undefined;\n }\n}\n\nfunction failedRunsView(payload: unknown): WorkflowStructuredView | undefined {\n if (!Array.isArray(payload)) return undefined;\n const rows = payload.flatMap((value): WorkflowRow[] => {\n const record = asRecord(value);\n const runKey = readString(record, 'runKey');\n if (!runKey) return [];\n const workspace = readString(record, 'workspace');\n const failedJob = readString(record, 'failedJob');\n const updatedAt = readString(record, 'updatedAt');\n const outcome = readString(record, 'outcome') ?? 'failed';\n const detail = [\n workspace ? `${workspace}/${runKey}` : runKey,\n failedJob ? `job ${failedJob}` : undefined,\n updatedAt ? statusTimestamp(updatedAt) : undefined,\n ].filter((entry): entry is string => !!entry);\n return [\n {\n key: `${workspace ?? ''}/${runKey}`,\n title: readString(record, 'displayName') ?? runKey,\n detail: detail.join(' · '),\n chip: { label: outcome, tone: outcome === 'interrupted' ? 'yellow' : 'red' },\n },\n ];\n });\n if (rows.length !== payload.length) return undefined;\n return {\n headline: rows.length === 0 ? 'No failed runs' : `${rows.length} failed ${plural(rows.length, 'run')}`,\n facts: [],\n rows,\n ...(rows.length > 0 ? { note: 'Read recovery-evidence before recover.' } : {}),\n };\n}\n\nfunction scalarText(value: unknown): string | undefined {\n if (typeof value === 'string') return inlineText(value) || undefined;\n if (typeof value === 'number' && Number.isFinite(value)) return String(value);\n if (typeof value === 'boolean') return value ? 'yes' : 'no';\n return undefined;\n}\n\n/** Any JSON result as its scalar figures and list counts, or a list of rows for an array. */\nexport function workflowGenericView(payload: unknown): WorkflowStructuredView {\n if (Array.isArray(payload)) {\n const rows = payload.map((value, index): WorkflowRow => {\n const record = asRecord(value);\n const scalars = Object.values(record ?? {}).flatMap((entry) => scalarText(entry) ?? []);\n const title = scalarText(value) ?? scalars[0] ?? `item ${index + 1}`;\n const rest = scalars.slice(1).join(' · ');\n return { key: String(index), title, ...(rest ? { detail: rest } : {}) };\n });\n return { headline: `${rows.length} ${plural(rows.length, 'item')}`, facts: [], rows };\n }\n const record = asRecord(payload) ?? {};\n const facts = Object.entries(record).flatMap(([label, value]): WorkflowFact[] => {\n const scalar = scalarText(value);\n if (scalar !== undefined) return [{ label, value: scalar }];\n if (Array.isArray(value)) return [{ label, value: `${value.length} ${plural(value.length, 'item')}` }];\n const nested = asRecord(value);\n if (nested) {\n const count = Object.keys(nested).length;\n return [{ label, value: `${count} ${plural(count, 'field')}` }];\n }\n return [];\n });\n return { headline: facts.length === 0 ? 'No details returned' : 'Result', facts, rows: [] };\n}\n\n/**\n * The laid-out form of a JSON result the toned lines would otherwise print\n * as raw text, or undefined when the lines already parse it (the catalog, a\n * run record, a control request) or the result is plain text.\n */\nexport function workflowStructuredView(\n toolName: WorkflowToolName,\n args: JsonRecord,\n result: ToolResultView | null,\n): WorkflowStructuredView | undefined {\n const text = textBlocks(result).join('\\n').trim();\n if (!text.startsWith('{') && !text.startsWith('[')) return undefined;\n const payload = parseJsonValue(text);\n if (payload === undefined) return undefined;\n const action = readString(args, 'action');\n if (toolName === 'workflow_tools' && action === 'list-failed')\n return failedRunsView(payload) ?? workflowGenericView(payload);\n const record = asRecord(payload);\n if (toolName === 'list_workflows' && parseCatalog(record)) return undefined;\n if (toolName === 'launch_workflow') return undefined;\n if (action === 'status' && record && workflowRecordLines(record, false)) return undefined;\n if (action === 'pause' || action === 'resume' || action === 'stop') return undefined;\n return workflowGenericView(payload);\n}\n","import type { ToolResultView } from '@agimon-ai/po-core/web';\n\nimport { type WorkflowFact, type WorkflowRow, workflowGenericView } from './workflowToolRender';\n\n/**\n * The view model of the workflow child tools, the lead's spawnChild,\n * childStatus and children and the child's reportCriteria and\n * reviewArtifacts, registered under the names in\n * src/services/workflowNamespace (CHILD_TOOL_NAMES). The runtime picks which\n * of them a session gets by its role, so the renderers claim them by name\n * through `matches`. Results arrive as JSON text; they are parsed and\n * validated here into figures, chips, and compact lists, and only text that\n * does not parse falls back to plain lines. As the namespace's call cards do,\n * the view leaves out the assignment prompt, input values, criteria\n * feedback, and reviewed artifact bodies.\n */\n\nexport const WORKFLOW_CHILD_TOOL_NAMES = [\n 'workflow_spawn_child',\n 'workflow_child_status',\n 'workflow_children',\n 'workflow_report_criteria',\n 'workflow_review_artifacts',\n] as const;\n\nexport type WorkflowChildToolName = (typeof WORKFLOW_CHILD_TOOL_NAMES)[number];\n\nexport type WorkflowChipTone = NonNullable<WorkflowRow['chip']>['tone'];\n\nexport interface WorkflowChildChip {\n label: string;\n tone: WorkflowChipTone;\n}\n\nexport interface WorkflowChildSection {\n title: string;\n rows: WorkflowRow[];\n}\n\n/** A parsed child-tool result: one key figure, its facts, compact lists, and a quiet note. */\nexport interface WorkflowChildView {\n headline: string;\n chip?: WorkflowChildChip;\n facts: WorkflowFact[];\n sections: WorkflowChildSection[];\n /** A failure the result itself reports, such as a child that ended failed. */\n error?: string;\n note?: string;\n /** Plain text that did not parse, shown as it came. */\n text?: string[];\n}\n\n/** The header beside the tool name: the one piece that stays whole and the detail that may truncate. */\nexport interface WorkflowChildSummary {\n primary?: string;\n detail: string[];\n}\n\ntype JsonRecord = Record<string, unknown>;\n\nexport function matchesWorkflowChildTool(toolName: string): boolean {\n return (WORKFLOW_CHILD_TOOL_NAMES as readonly string[]).includes(toolName);\n}\n\nfunction asRecord(value: unknown): JsonRecord | undefined {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return undefined;\n return value as JsonRecord;\n}\n\nfunction readString(record: JsonRecord | undefined, key: string): string | undefined {\n const value = record?.[key];\n if (typeof value !== 'string') return undefined;\n return value.replace(/\\s+/gu, ' ').trim() || undefined;\n}\n\nfunction readNumber(record: JsonRecord | undefined, key: string): number | undefined {\n const value = record?.[key];\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined;\n}\n\nfunction plural(count: number, singular: string, pluralForm = `${singular}s`): string {\n return count === 1 ? singular : pluralForm;\n}\n\nfunction timestamp(value: string): string {\n return value.replace('T', ' ').replace(/\\.\\d{3}Z$/u, 'Z');\n}\n\nfunction resultText(result: ToolResultView | null): string {\n if (!result) return '';\n return result.content\n .flatMap((item) => {\n const record = asRecord(item);\n return record?.type === 'text' && typeof record.text === 'string' ? [record.text] : [];\n })\n .join('\\n')\n .trim();\n}\n\ntype Parsed = { ok: true; value: unknown } | { ok: false };\n\nfunction parseResult(result: ToolResultView | null): Parsed {\n const text = resultText(result);\n if (text) {\n try {\n return { ok: true, value: JSON.parse(text) };\n } catch {\n // Not JSON: the caller shows the text as it came.\n return { ok: false };\n }\n }\n return result && result.details !== undefined ? { ok: true, value: result.details } : { ok: false };\n}\n\nfunction criteriaResults(args: JsonRecord): Array<{ key: string; status: string }> {\n const results = asRecord(args.results);\n if (!results) return [];\n return Object.entries(results).flatMap(([key, value]) => {\n const status = readString(asRecord(value), 'status');\n return status ? [{ key, status }] : [];\n });\n}\n\nexport function workflowChildSummary(toolName: string, args: JsonRecord): WorkflowChildSummary {\n if (toolName === 'workflow_spawn_child') {\n const inputs = Object.keys(asRecord(args.inputs) ?? {}).length;\n const job = readString(args, 'job');\n return {\n ...(job === undefined ? {} : { primary: job }),\n detail: inputs > 0 ? [`${inputs} ${plural(inputs, 'input')}`] : [],\n };\n }\n if (toolName === 'workflow_child_status') {\n const id = readString(args, 'invocationId');\n return { ...(id === undefined ? {} : { primary: id }), detail: [] };\n }\n if (toolName === 'workflow_report_criteria') {\n const results = criteriaResults(args);\n if (results.length === 0) return { detail: [] };\n const notMet = results.filter((entry) => entry.status === 'not-met').length;\n return {\n primary: `${results.length} ${plural(results.length, 'criterion', 'criteria')}`,\n detail: notMet > 0 ? [`${notMet} not met`] : [],\n };\n }\n return { detail: [] };\n}\n\n/** What the card says while the call runs. */\nexport function workflowChildRunningLabel(toolName: string): string {\n if (toolName === 'workflow_spawn_child') return 'Starting the child';\n if (toolName === 'workflow_child_status') return 'Reading the child';\n if (toolName === 'workflow_children') return 'Reading the children';\n if (toolName === 'workflow_report_criteria') return 'Reporting criteria';\n if (toolName === 'workflow_review_artifacts') return 'Reading the artifacts';\n return 'Running';\n}\n\nconst INVOCATION_CHIPS: Readonly<Record<string, WorkflowChildChip>> = {\n running: { label: 'running', tone: 'blue' },\n completed: { label: 'completed', tone: 'green' },\n failed: { label: 'failed', tone: 'red' },\n interrupted: { label: 'interrupted', tone: 'yellow' },\n};\n\nconst CRITERION_CHIPS: Readonly<Record<string, WorkflowChildChip>> = {\n checked: { label: 'checked', tone: 'green' },\n 'not-met': { label: 'not met', tone: 'yellow' },\n unchecked: { label: 'unchecked', tone: 'neutral' },\n};\n\nfunction invocationChip(state: string): WorkflowChildChip {\n return INVOCATION_CHIPS[state] ?? { label: state, tone: 'neutral' };\n}\n\nfunction invocationView(value: unknown): WorkflowChildView | undefined {\n const record = asRecord(value);\n const invocationId = readString(record, 'invocationId');\n const job = readString(record, 'job');\n const state = readString(record, 'state');\n if (!record || !invocationId || !job || !state) return undefined;\n const sessions = Array.isArray(record.sessionIds) ? record.sessionIds.filter((id) => typeof id === 'string') : [];\n const startedAt = readString(record, 'startedAt');\n const endedAt = readString(record, 'endedAt');\n const facts: WorkflowFact[] = [{ label: 'invocation', value: invocationId }];\n if (startedAt) facts.push({ label: 'started', value: timestamp(startedAt) });\n if (endedAt) facts.push({ label: 'ended', value: timestamp(endedAt) });\n if (sessions.length > 0) facts.push({ label: 'sessions', value: String(sessions.length) });\n const error = readString(record, 'error');\n return {\n headline: job,\n chip: invocationChip(state),\n facts,\n sections: [],\n ...(error === undefined ? {} : { error }),\n ...(state === 'running' ? { note: 'Check back with childStatus; a started child is not a finished one.' } : {}),\n };\n}\n\nfunction criterionRow(value: unknown): WorkflowRow | undefined {\n const record = asRecord(value);\n const key = readString(record, 'key');\n const status = readString(record, 'status');\n if (!key || !status) return undefined;\n const verifiedBy = readString(record, 'verifiedBy');\n return {\n key,\n title: key,\n ...(verifiedBy === undefined ? {} : { detail: `verified by ${verifiedBy}` }),\n chip: CRITERION_CHIPS[status] ?? { label: status, tone: 'neutral' },\n };\n}\n\nfunction invocationRow(value: unknown): WorkflowRow | undefined {\n const record = asRecord(value);\n const id = readString(record, 'invocationId');\n const job = readString(record, 'job');\n const state = readString(record, 'state');\n if (!id || !job || !state) return undefined;\n return { key: id, title: job, detail: id, chip: invocationChip(state) };\n}\n\nfunction childrenView(value: unknown): WorkflowChildView | undefined {\n const record = asRecord(value);\n const lead = readString(record, 'lead');\n if (!record || !lead || !Array.isArray(record.criteria) || !Array.isArray(record.invocations)) return undefined;\n const criteria = record.criteria.flatMap((entry) => criterionRow(entry) ?? []);\n const invocations = record.invocations.flatMap((entry) => invocationRow(entry) ?? []);\n const checked = criteria.filter((row) => row.chip?.label === 'checked').length;\n const continuations = readNumber(record, 'continuations');\n const maxContinuations = readNumber(record, 'maxContinuations');\n const facts: WorkflowFact[] = [{ label: 'lead', value: lead }];\n if (continuations !== undefined && maxContinuations !== undefined) {\n facts.push({ label: 'continuations', value: `${continuations}/${maxContinuations}` });\n }\n const sections: WorkflowChildSection[] = [];\n if (criteria.length > 0) sections.push({ title: 'Criteria', rows: criteria });\n if (invocations.length > 0) sections.push({ title: 'Children', rows: invocations });\n return {\n headline:\n criteria.length > 0\n ? `${checked}/${criteria.length} ${plural(criteria.length, 'criterion', 'criteria')} checked`\n : `${invocations.length} ${plural(invocations.length, 'child', 'children')}`,\n facts,\n sections,\n ...(sections.length === 0 ? { note: 'No children spawned yet.' } : {}),\n };\n}\n\nfunction reportView(args: JsonRecord): WorkflowChildView {\n const results = criteriaResults(args);\n const rows = results.map((entry): WorkflowRow => ({\n key: entry.key,\n title: entry.key,\n chip: CRITERION_CHIPS[entry.status] ?? { label: entry.status, tone: 'neutral' },\n }));\n return {\n headline: `${rows.length} ${plural(rows.length, 'criterion', 'criteria')} reported`,\n facts: [],\n sections: rows.length > 0 ? [{ title: 'Criteria', rows }] : [],\n note: 'The lead reads these on its next look at the children.',\n };\n}\n\nfunction artifactsView(value: unknown): WorkflowChildView | undefined {\n const record = asRecord(value);\n const revision = readString(record, 'revision');\n const artifacts = asRecord(record?.artifacts);\n if (!revision || !artifacts) return undefined;\n const rows = Object.entries(artifacts).map(([name, body]): WorkflowRow => {\n const lines = typeof body === 'string' && body.length > 0 ? body.split('\\n').length : 0;\n return { key: name, title: name, detail: `${lines} ${plural(lines, 'line')}` };\n });\n return {\n headline: `${rows.length} ${plural(rows.length, 'artifact')}`,\n facts: [{ label: 'revision', value: revision }],\n sections: rows.length > 0 ? [{ title: 'Artifacts', rows }] : [],\n ...(rows.length === 0 ? { note: 'No artifacts recorded for review.' } : {}),\n };\n}\n\nfunction textView(result: ToolResultView | null): WorkflowChildView {\n const lines = resultText(result)\n .split('\\n')\n .map((entry) => entry.trimEnd())\n .filter((entry) => entry.length > 0);\n return { headline: '', facts: [], sections: [], text: lines.length > 0 ? lines : ['No output.'] };\n}\n\n/** The settled result of a child tool, parsed by tool; raw text only when it does not parse. */\nexport function workflowChildView(\n toolName: string,\n args: JsonRecord,\n result: ToolResultView | null,\n): WorkflowChildView {\n if (toolName === 'workflow_report_criteria') return reportView(args);\n const parsed = parseResult(result);\n if (!parsed.ok) return textView(result);\n const view =\n toolName === 'workflow_spawn_child' || toolName === 'workflow_child_status'\n ? invocationView(parsed.value)\n : toolName === 'workflow_children'\n ? childrenView(parsed.value)\n : toolName === 'workflow_review_artifacts'\n ? artifactsView(parsed.value)\n : undefined;\n if (view) return view;\n // JSON of a shape this card does not know is still laid out, never printed.\n const generic = workflowGenericView(parsed.value);\n return {\n headline: generic.headline,\n facts: generic.facts,\n sections: generic.rows.length > 0 ? [{ title: 'Items', rows: generic.rows }] : [],\n };\n}\n","import { Badge, fontOf } from '@agimon-ai/po-native-components';\nimport type { PoNativeTheme } from '@agimon-ai/po-web-components/nativeTheme';\nimport { Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport type { LineTone, ToolLine, WorkflowFact, WorkflowRow } from '../_lib/workflowToolRender';\n\n/*\n * The pieces the workflow tool cards lay a parsed result out with on the\n * phone: the toned lines the web's MessageLines draws, and for a structured\n * result its key figure, labelled facts, compact rows with a status chip,\n * and a quiet note.\n */\n\nexport function WorkflowLines({ lines }: { lines: readonly ToolLine[] }) {\n return (\n <View style={styles.lines}>\n {lines.map((entry, index) => (\n <Text\n key={`${String(index)}-${entry.text}`}\n selectable\n style={[\n styles.sans,\n TONE_STYLE[entry.tone],\n entry.bold === true ? styles.bold : null,\n entry.indent === true ? styles.indent : null,\n ]}\n >\n {entry.text}\n </Text>\n ))}\n </View>\n );\n}\n\n/** The key figure of a result, with its status chip beside it when it has one. */\nexport function WorkflowHeadline({ text, chip }: { text: string; chip?: WorkflowRow['chip'] }) {\n return (\n <View style={styles.headline}>\n {text.length > 0 ? (\n <Text numberOfLines={1} style={[styles.sans, styles.bold, styles.hi, styles.headlineText]}>\n {text}\n </Text>\n ) : null}\n {chip !== undefined ? (\n <Badge tone={chip.tone} size=\"xs\">\n {chip.label}\n </Badge>\n ) : null}\n </View>\n );\n}\n\n/** Labelled figures, each label over its value, wrapping across the row. */\nexport function WorkflowFacts({ facts }: { facts: readonly WorkflowFact[] }) {\n if (facts.length === 0) return null;\n return (\n <View style={styles.facts}>\n {facts.map((fact) => (\n <View key={fact.label} style={styles.fact}>\n <Text style={styles.label}>{fact.label}</Text>\n <Text selectable numberOfLines={1} ellipsizeMode=\"middle\" style={[styles.mono, styles.text]}>\n {fact.value}\n </Text>\n </View>\n ))}\n </View>\n );\n}\n\n/** A titled compact list: one row per item, the title and chip on a line, the detail quiet below. */\nexport function WorkflowRows({ title, rows }: { title?: string; rows: readonly WorkflowRow[] }) {\n if (rows.length === 0) return null;\n return (\n <View style={styles.section}>\n {title !== undefined ? <Text style={styles.label}>{title}</Text> : null}\n {rows.map((row) => (\n <View key={row.key} style={styles.row}>\n <View style={styles.rowLine}>\n <Text numberOfLines={1} style={[styles.sans, styles.text, styles.rowTitle]}>\n {row.title}\n </Text>\n {row.chip !== undefined ? (\n <Badge tone={row.chip.tone} size=\"xs\">\n {row.chip.label}\n </Badge>\n ) : null}\n </View>\n {row.detail !== undefined ? (\n <Text numberOfLines={1} ellipsizeMode=\"middle\" style={[styles.small, styles.faint]}>\n {row.detail}\n </Text>\n ) : null}\n </View>\n ))}\n </View>\n );\n}\n\nexport function WorkflowNote({ children }: { children: string }) {\n return <Text style={[styles.small, styles.faint]}>{children}</Text>;\n}\n\n/** A failure reason, alone in red: the card's edge and icon already say it failed. */\nexport function WorkflowReason({ children }: { children: string }) {\n return (\n <Text selectable style={[styles.sans, styles.error]}>\n {children}\n </Text>\n );\n}\n\nconst styles = StyleSheet.create((theme: PoNativeTheme) => ({\n sans: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n },\n small: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n },\n mono: {\n fontFamily: fontOf(theme.fontFamily.mono),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n },\n lines: { gap: theme.spacing(0.5) },\n headline: { flexDirection: 'row', alignItems: 'center', gap: theme.spacing(2), minWidth: 0 },\n headlineText: { flexShrink: 1 },\n facts: { flexDirection: 'row', flexWrap: 'wrap', columnGap: theme.spacing(5), rowGap: theme.spacing(2) },\n fact: { gap: theme.spacing(0.5), maxWidth: '100%' },\n section: { gap: theme.spacing(2) },\n row: { gap: theme.spacing(0.5) },\n rowLine: { flexDirection: 'row', alignItems: 'center', gap: theme.spacing(2), minWidth: 0 },\n rowTitle: { flexShrink: 1 },\n label: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.xs,\n lineHeight: theme.lineHeight.xs,\n fontWeight: theme.fontWeight.semibold,\n textTransform: 'uppercase',\n color: theme.colors.dim,\n },\n bold: { fontWeight: theme.fontWeight.semibold },\n indent: { paddingLeft: theme.spacing(4) },\n error: { color: theme.colors.red },\n hi: { color: theme.colors.hi },\n text: { color: theme.colors.text },\n dim: { color: theme.colors.dim },\n faint: { color: theme.colors.faint },\n success: { color: theme.colors.green },\n warning: { color: theme.colors.yellow },\n accent: { color: theme.colors.blue },\n}));\n\n/** The line tones of the web's MessageLines, drawn with the same theme tokens. */\nconst TONE_STYLE: Readonly<Record<LineTone, object>> = {\n hi: styles.hi,\n text: styles.text,\n dim: styles.dim,\n muted: styles.faint,\n success: styles.success,\n error: styles.error,\n warning: styles.warning,\n accent: styles.accent,\n};\n","import type { ToolMessageRenderProps } from '@agimon-ai/po-core/native';\nimport {\n fontOf,\n MessageItem,\n MessageItemBody,\n MessageItemHeader,\n MessageItemStatus,\n toolTone,\n} from '@agimon-ai/po-native-components';\nimport type { PoNativeTheme } from '@agimon-ai/po-web-components/nativeTheme';\nimport { Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport { workflowChildRunningLabel, workflowChildSummary, workflowChildView } from '../_lib/workflowChildToolView';\nimport { workflowFailureReason } from '../_lib/workflowToolRender';\nimport {\n WorkflowFacts,\n WorkflowHeadline,\n WorkflowLines,\n WorkflowNote,\n WorkflowReason,\n WorkflowRows,\n} from './WorkflowResultParts.native';\n\n/**\n * The workflow child tools' timeline item on native, as the web's: the job,\n * invocation or criteria count whole beside the tool name, the key figure\n * and its chip as the collapsed preview, and the facts and compact lists\n * once expanded. A failure shows only its reason.\n */\nexport function WorkflowChildToolMessage({ toolName, args, result, output, running, isError }: ToolMessageRenderProps) {\n const summary = workflowChildSummary(toolName, args);\n const view = running || isError ? undefined : workflowChildView(toolName, args, result);\n const expandable =\n view !== undefined &&\n (view.facts.length > 0 ||\n view.sections.length > 0 ||\n view.error !== undefined ||\n view.note !== undefined ||\n (view.text?.length ?? 0) > 1);\n return (\n <MessageItem tone={toolTone({ running, isError })} expandable={expandable}>\n {({ expanded }) => (\n <>\n <MessageItemHeader title={toolName}>\n <View testID={`tool-call-${toolName}`} style={styles.summary}>\n {summary.primary !== undefined ? (\n <Text numberOfLines={1} style={[styles.sans, styles.primary]}>\n {summary.primary}\n </Text>\n ) : null}\n {/* Beside a main piece the detail only ever fit as a stub, so it shows when it is the summary. */}\n {summary.primary === undefined && summary.detail.length > 0 ? (\n <Text numberOfLines={1} style={[styles.sans, styles.detail]}>\n {summary.detail.join(' · ')}\n </Text>\n ) : null}\n </View>\n </MessageItemHeader>\n {isError ? (\n <MessageItemBody testID={`tool-result-${toolName}`}>\n <WorkflowReason>{workflowFailureReason(result, output)}</WorkflowReason>\n </MessageItemBody>\n ) : running ? (\n <MessageItemBody testID={`tool-result-${toolName}`}>\n <MessageItemStatus tone=\"running\">{workflowChildRunningLabel(toolName)}</MessageItemStatus>\n </MessageItemBody>\n ) : view === undefined ? null : view.text !== undefined ? (\n <MessageItemBody testID={`tool-result-${toolName}`}>\n <WorkflowLines\n lines={(expanded ? view.text : view.text.slice(0, 1)).map((text) => ({ text, tone: 'text' }))}\n />\n </MessageItemBody>\n ) : (\n <MessageItemBody testID={`tool-result-${toolName}`}>\n <View style={styles.stack}>\n <WorkflowHeadline text={view.headline} {...(view.chip === undefined ? {} : { chip: view.chip })} />\n {expanded ? (\n <>\n {view.error !== undefined ? <WorkflowReason>{view.error}</WorkflowReason> : null}\n <WorkflowFacts facts={view.facts} />\n {view.sections.map((section) => (\n <WorkflowRows key={section.title} title={section.title} rows={section.rows} />\n ))}\n {view.note !== undefined ? <WorkflowNote>{view.note}</WorkflowNote> : null}\n </>\n ) : null}\n </View>\n </MessageItemBody>\n )}\n </>\n )}\n </MessageItem>\n );\n}\n\nconst styles = StyleSheet.create((theme: PoNativeTheme) => ({\n // One line on the title's row beside the long tool name: the job, id or count, or the detail\n // when there is no main piece.\n summary: { flex: 1, flexDirection: 'row', alignItems: 'center', gap: theme.spacing(2), minWidth: 0 },\n sans: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n },\n primary: { flexShrink: 1, fontWeight: theme.fontWeight.semibold, color: theme.colors.hi },\n detail: { flexShrink: 1, color: theme.colors.faint },\n stack: { gap: theme.spacing(3) },\n}));\n","import { defineToolRenderer } from '@agimon-ai/po-core/native';\n\nimport { WorkflowChildToolMessage } from './_components/WorkflowChildToolMessage.native';\nimport { matchesWorkflowChildTool, WORKFLOW_CHILD_TOOL_NAMES } from './_lib/workflowChildToolView';\n\n/** The runtime registers only the child tools a session's role allows, so the names are matched, not just listed. */\nexport default defineToolRenderer({\n tools: [...WORKFLOW_CHILD_TOOL_NAMES],\n matches: matchesWorkflowChildTool,\n message: WorkflowChildToolMessage,\n});\n","import type { ToolMessageRenderProps } from '@agimon-ai/po-core/native';\nimport { fontOf, MessageItem, MessageItemBody, MessageItemHeader, toolTone } from '@agimon-ai/po-native-components';\nimport type { PoNativeTheme } from '@agimon-ai/po-web-components/nativeTheme';\nimport { Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport {\n workflowCallSummary,\n workflowFailureReason,\n workflowResultLines,\n workflowStructuredView,\n workflowToolName,\n} from '../_lib/workflowToolRender';\nimport {\n WorkflowFacts,\n WorkflowHeadline,\n WorkflowLines,\n WorkflowNote,\n WorkflowReason,\n WorkflowRows,\n} from './WorkflowResultParts.native';\n\n/**\n * The workflow tools' timeline item on native, as the web's: the action\n * whole beside the tool name with the target and flags truncating after it,\n * and the shape-specific summary lines in the body (a preview collapsed, as\n * the web shows). A JSON result the lines have no shape for, such as\n * list-failed, is laid out as figures and rows rather than printed. A failure\n * shows only its reason; the edge and icon say it failed.\n */\nexport function WorkflowToolMessage({ toolName, args, result, output, running, isError }: ToolMessageRenderProps) {\n const name = workflowToolName(toolName);\n const summary = workflowCallSummary(name, args);\n const detail = [summary.target, ...summary.metadata].filter((value): value is string => value !== undefined);\n const structured = running || isError ? undefined : workflowStructuredView(name, args, result);\n const collapsed = workflowResultLines(name, args, result, { expanded: false, isError, isPartial: running });\n const full = workflowResultLines(name, args, result, { expanded: true, isError, isPartial: running });\n const expandable =\n !isError &&\n (structured !== undefined\n ? structured.facts.length + structured.rows.length > 0 || structured.note !== undefined\n : full.length > collapsed.length);\n return (\n <MessageItem tone={toolTone({ running, isError })} expandable={expandable}>\n {({ expanded }) => (\n <>\n <MessageItemHeader title={toolName}>\n <View testID={`tool-call-${toolName}`} style={styles.summary}>\n <Text numberOfLines={1} style={[styles.sans, styles.primary]}>\n {summary.action}\n </Text>\n {detail.length > 0 ? (\n <Text numberOfLines={1} ellipsizeMode=\"middle\" style={[styles.sans, styles.detail]}>\n · {detail.join(' · ')}\n </Text>\n ) : null}\n </View>\n </MessageItemHeader>\n {isError ? (\n <MessageItemBody testID={`tool-result-${toolName}`}>\n <WorkflowReason>{workflowFailureReason(result, output)}</WorkflowReason>\n </MessageItemBody>\n ) : structured !== undefined ? (\n <MessageItemBody testID={`tool-result-${toolName}`}>\n <View style={styles.stack}>\n <WorkflowHeadline text={structured.headline} />\n {expanded ? (\n <>\n <WorkflowFacts facts={structured.facts} />\n <WorkflowRows rows={structured.rows} />\n {structured.note !== undefined ? <WorkflowNote>{structured.note}</WorkflowNote> : null}\n </>\n ) : null}\n </View>\n </MessageItemBody>\n ) : (expanded ? full : collapsed).length > 0 ? (\n <MessageItemBody testID={`tool-result-${toolName}`}>\n <WorkflowLines lines={expanded ? full : collapsed} />\n </MessageItemBody>\n ) : null}\n </>\n )}\n </MessageItem>\n );\n}\n\nconst styles = StyleSheet.create((theme: PoNativeTheme) => ({\n // One line on the title's row: the action stays whole, the target and flags truncate in the middle.\n summary: { flex: 1, flexDirection: 'row', alignItems: 'center', gap: theme.spacing(2), minWidth: 0 },\n sans: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n },\n primary: { flexShrink: 0, maxWidth: '50%', fontWeight: theme.fontWeight.semibold, color: theme.colors.hi },\n detail: { flexShrink: 1, color: theme.colors.faint },\n stack: { gap: theme.spacing(3) },\n}));\n","import { defineToolRenderer } from '@agimon-ai/po-core/native';\n\nimport { WorkflowToolMessage } from './_components/WorkflowToolMessage.native';\n\nexport default defineToolRenderer({\n tools: ['list_workflows', 'launch_workflow', 'workflow_run', 'workflow_tools', 'scaffold_workflow'],\n message: WorkflowToolMessage,\n});\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineNativePlugin, type WebPluginContributions } from '@agimon-ai/po-core/native';\n\nimport fillWorkflows from '../src/extensions/workspaces/(frontend)/fill/Workflows.home.native';\nimport activityGroupWorkflows from '../src/extensions/workspaces/sessions/(frontend)/activity-group/workflows.native';\nimport channelDynamicWorkflowRuns from '../src/extensions/workspaces/sessions/(frontend)/channel/dynamic-workflow-runs.native';\nimport channelWorkflowCatalog from '../src/extensions/workspaces/sessions/(frontend)/channel/workflow-catalog.native';\nimport channelWorkflowRuns from '../src/extensions/workspaces/sessions/(frontend)/channel/workflow-runs.native';\nimport dockWorkflow from '../src/extensions/workspaces/sessions/(frontend)/dock/workflow.native';\nimport fillWorkflowLauncher from '../src/extensions/workspaces/sessions/(frontend)/fill/WorkflowLauncher.overlay.native';\nimport fillWorkflows2 from '../src/extensions/workspaces/sessions/(frontend)/fill/Workflows.activity.workflows.native';\nimport toolWorkflowChild from '../src/extensions/workspaces/sessions/(frontend)/tool/workflow-child.native';\nimport toolWorkflow from '../src/extensions/workspaces/sessions/(frontend)/tool/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: 'workflows',\n workspace: {\n get fills(): WebPluginContributions['fills'] { return [via({ slot: 'home', id: 'workflows' }, fillWorkflows)]; },\n },\n session: {\n get activityGroups(): WebPluginContributions['activityGroups'] { return [via({ name: 'workflows' }, activityGroupWorkflows)]; },\n get channels(): WebPluginContributions['channels'] { return [via({ channel: 'dynamic_workflow_runs' }, channelDynamicWorkflowRuns), via({ channel: 'workflow_catalog' }, channelWorkflowCatalog), via({ channel: 'workflow_runs' }, channelWorkflowRuns)]; },\n get dockFaces(): WebPluginContributions['dockFaces'] { return [via({ id: 'workflow' }, dockWorkflow)]; },\n get fills(): WebPluginContributions['fills'] { return [via({ slot: 'overlay', id: 'workflow-launcher' }, fillWorkflowLauncher), via({ slot: 'activity.workflows', id: 'workflows' }, fillWorkflows2)]; },\n get toolRenderers(): WebPluginContributions['toolRenderers'] { return [via({ tools: ['workflow_child'] }, toolWorkflowChild), via({ tools: ['workflow'] }, toolWorkflow)]; },\n },\n});\n"],"mappings":"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"}
|