@agimon-ai/po-task 0.0.0-alpha.49 → 0.0.0-alpha.50
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 +139 -136
- package/dist/extensions/native.mjs.map +1 -1
- package/package.json +6 -6
|
@@ -283,149 +283,152 @@ function TaskDetailSheet({ task, sessionId, mode: initialMode, send, onClose })
|
|
|
283
283
|
onOpenChange: (open) => {
|
|
284
284
|
if (!open) onClose();
|
|
285
285
|
},
|
|
286
|
-
children: /* @__PURE__ */ jsxs(SheetContent, {
|
|
287
|
-
|
|
288
|
-
children: /* @__PURE__ */ jsx(
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
children: [/* @__PURE__ */ jsxs(Text, {
|
|
299
|
-
style: styles$2.id,
|
|
300
|
-
children: ["#", task.id]
|
|
301
|
-
}), /* @__PURE__ */ jsxs(Badge, {
|
|
302
|
-
testID: "task-detail-status",
|
|
303
|
-
children: [/* @__PURE__ */ jsx(Dot, {
|
|
304
|
-
tone: TASK_STATUS_TONE[task.status],
|
|
305
|
-
pulse: task.status === "in_progress"
|
|
306
|
-
}), task.status.replace("_", " ")]
|
|
307
|
-
})]
|
|
308
|
-
}),
|
|
309
|
-
mode === "view" ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
310
|
-
/* @__PURE__ */ jsx(Text, {
|
|
311
|
-
testID: "task-detail-description",
|
|
312
|
-
style: task.description ? styles$2.body : styles$2.hint,
|
|
313
|
-
children: task.description ?? "No description on this task."
|
|
314
|
-
}),
|
|
315
|
-
/* @__PURE__ */ jsx(TaskFacts, { task }),
|
|
286
|
+
children: /* @__PURE__ */ jsxs(SheetContent, {
|
|
287
|
+
keep: mode !== "view",
|
|
288
|
+
children: [/* @__PURE__ */ jsx(SheetHeader, {
|
|
289
|
+
closeLabel: "close task",
|
|
290
|
+
children: /* @__PURE__ */ jsx(SheetTitle, {
|
|
291
|
+
testID: "task-detail-title",
|
|
292
|
+
accessibilityLabel: `task #${task.id}: ${task.subject}`,
|
|
293
|
+
children: task.subject
|
|
294
|
+
})
|
|
295
|
+
}), /* @__PURE__ */ jsxs(SheetBody, {
|
|
296
|
+
testID: "task-detail-dialog",
|
|
297
|
+
children: [
|
|
316
298
|
/* @__PURE__ */ jsxs(View, {
|
|
317
|
-
style: styles$2.
|
|
318
|
-
children: [
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
onPress: () => setMode("edit")
|
|
299
|
+
style: styles$2.status,
|
|
300
|
+
children: [/* @__PURE__ */ jsxs(Text, {
|
|
301
|
+
style: styles$2.id,
|
|
302
|
+
children: ["#", task.id]
|
|
303
|
+
}), /* @__PURE__ */ jsxs(Badge, {
|
|
304
|
+
testID: "task-detail-status",
|
|
305
|
+
children: [/* @__PURE__ */ jsx(Dot, {
|
|
306
|
+
tone: TASK_STATUS_TONE[task.status],
|
|
307
|
+
pulse: task.status === "in_progress"
|
|
308
|
+
}), task.status.replace("_", " ")]
|
|
328
309
|
})]
|
|
329
|
-
})
|
|
330
|
-
] }) : null,
|
|
331
|
-
mode === "edit" ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
332
|
-
/* @__PURE__ */ jsx(Field, {
|
|
333
|
-
label: "Subject",
|
|
334
|
-
children: /* @__PURE__ */ jsx(Input, {
|
|
335
|
-
testID: "task-detail-subject-input",
|
|
336
|
-
accessibilityLabel: "Subject",
|
|
337
|
-
autoFocus: true,
|
|
338
|
-
value: draft.subject,
|
|
339
|
-
onChangeText: (subject) => setDraft({
|
|
340
|
-
...draft,
|
|
341
|
-
subject
|
|
342
|
-
})
|
|
343
|
-
})
|
|
344
310
|
}),
|
|
345
|
-
/* @__PURE__ */
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
311
|
+
mode === "view" ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
312
|
+
/* @__PURE__ */ jsx(Text, {
|
|
313
|
+
testID: "task-detail-description",
|
|
314
|
+
style: task.description ? styles$2.body : styles$2.hint,
|
|
315
|
+
children: task.description ?? "No description on this task."
|
|
316
|
+
}),
|
|
317
|
+
/* @__PURE__ */ jsx(TaskFacts, { task }),
|
|
318
|
+
/* @__PURE__ */ jsxs(View, {
|
|
319
|
+
style: styles$2.footer,
|
|
320
|
+
children: [agent ? /* @__PURE__ */ jsx(SheetAction, {
|
|
321
|
+
label: "Message agent",
|
|
322
|
+
variant: "ghost",
|
|
323
|
+
testID: "task-detail-open-message",
|
|
324
|
+
onPress: () => setMode("message")
|
|
325
|
+
}) : null, /* @__PURE__ */ jsx(SheetAction, {
|
|
326
|
+
label: "Edit",
|
|
327
|
+
variant: "primary",
|
|
328
|
+
testID: "task-detail-open-edit",
|
|
329
|
+
onPress: () => setMode("edit")
|
|
330
|
+
})]
|
|
357
331
|
})
|
|
358
|
-
}),
|
|
359
|
-
/* @__PURE__ */
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
332
|
+
] }) : null,
|
|
333
|
+
mode === "edit" ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
334
|
+
/* @__PURE__ */ jsx(Field, {
|
|
335
|
+
label: "Subject",
|
|
336
|
+
children: /* @__PURE__ */ jsx(Input, {
|
|
337
|
+
testID: "task-detail-subject-input",
|
|
338
|
+
accessibilityLabel: "Subject",
|
|
339
|
+
autoFocus: true,
|
|
340
|
+
value: draft.subject,
|
|
341
|
+
onChangeText: (subject) => setDraft({
|
|
342
|
+
...draft,
|
|
343
|
+
subject
|
|
344
|
+
})
|
|
345
|
+
})
|
|
346
|
+
}),
|
|
347
|
+
/* @__PURE__ */ jsx(Field, {
|
|
348
|
+
label: "Description",
|
|
349
|
+
children: /* @__PURE__ */ jsx(Textarea, {
|
|
350
|
+
testID: "task-detail-description-input",
|
|
351
|
+
accessibilityLabel: "Description",
|
|
352
|
+
numberOfLines: DESCRIPTION_LINES,
|
|
353
|
+
value: draft.description,
|
|
354
|
+
placeholder: "What this task covers",
|
|
355
|
+
onChangeText: (description) => setDraft({
|
|
370
356
|
...draft,
|
|
371
|
-
|
|
372
|
-
})
|
|
373
|
-
}
|
|
357
|
+
description
|
|
358
|
+
})
|
|
359
|
+
})
|
|
360
|
+
}),
|
|
361
|
+
/* @__PURE__ */ jsx(Field, {
|
|
362
|
+
label: "Status",
|
|
363
|
+
children: /* @__PURE__ */ jsx(SegmentedControl, {
|
|
364
|
+
accessibilityLabel: "Status",
|
|
365
|
+
options: STATUS_CHOICES.map((status) => ({
|
|
366
|
+
value: status,
|
|
367
|
+
label: status.replace("_", " ")
|
|
368
|
+
})),
|
|
369
|
+
value: draft.status,
|
|
370
|
+
onValueChange: (status) => {
|
|
371
|
+
if (STATUS_CHOICES.includes(status)) setDraft({
|
|
372
|
+
...draft,
|
|
373
|
+
status
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
})
|
|
377
|
+
}),
|
|
378
|
+
/* @__PURE__ */ jsx(Text, {
|
|
379
|
+
style: styles$2.hint,
|
|
380
|
+
children: "Saved as one prompt naming only the fields you changed"
|
|
381
|
+
}),
|
|
382
|
+
/* @__PURE__ */ jsxs(View, {
|
|
383
|
+
style: styles$2.footer,
|
|
384
|
+
children: [/* @__PURE__ */ jsx(SheetAction, {
|
|
385
|
+
label: "Cancel",
|
|
386
|
+
variant: "ghost",
|
|
387
|
+
testID: "task-detail-cancel",
|
|
388
|
+
onPress: onClose
|
|
389
|
+
}), /* @__PURE__ */ jsx(SheetAction, {
|
|
390
|
+
label: "Save",
|
|
391
|
+
variant: "primary",
|
|
392
|
+
testID: "task-detail-save",
|
|
393
|
+
onPress: submitEdit
|
|
394
|
+
})]
|
|
374
395
|
})
|
|
375
|
-
}),
|
|
376
|
-
/* @__PURE__ */
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
})
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
396
|
+
] }) : null,
|
|
397
|
+
mode === "message" && agent ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
398
|
+
/* @__PURE__ */ jsx(Field, {
|
|
399
|
+
label: `Message to ${agentName}`,
|
|
400
|
+
children: /* @__PURE__ */ jsx(Textarea, {
|
|
401
|
+
testID: "task-detail-message-input",
|
|
402
|
+
accessibilityLabel: "Message to agent",
|
|
403
|
+
autoFocus: true,
|
|
404
|
+
numberOfLines: MESSAGE_LINES,
|
|
405
|
+
value: message,
|
|
406
|
+
placeholder: "Guidance for the run working on this task",
|
|
407
|
+
onChangeText: setMessage
|
|
408
|
+
})
|
|
409
|
+
}),
|
|
410
|
+
/* @__PURE__ */ jsx(Text, {
|
|
411
|
+
style: styles$2.hint,
|
|
412
|
+
children: "Steers the run, it does not edit the task"
|
|
413
|
+
}),
|
|
414
|
+
/* @__PURE__ */ jsxs(View, {
|
|
415
|
+
style: styles$2.footer,
|
|
416
|
+
children: [/* @__PURE__ */ jsx(SheetAction, {
|
|
417
|
+
label: "Cancel",
|
|
418
|
+
variant: "ghost",
|
|
419
|
+
testID: "task-detail-cancel",
|
|
420
|
+
onPress: onClose
|
|
421
|
+
}), /* @__PURE__ */ jsx(SheetAction, {
|
|
422
|
+
label: "Send",
|
|
423
|
+
variant: "primary",
|
|
424
|
+
testID: "task-detail-send",
|
|
425
|
+
onPress: submitMessage
|
|
426
|
+
})]
|
|
406
427
|
})
|
|
407
|
-
})
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
}),
|
|
412
|
-
/* @__PURE__ */ jsxs(View, {
|
|
413
|
-
style: styles$2.footer,
|
|
414
|
-
children: [/* @__PURE__ */ jsx(SheetAction, {
|
|
415
|
-
label: "Cancel",
|
|
416
|
-
variant: "ghost",
|
|
417
|
-
testID: "task-detail-cancel",
|
|
418
|
-
onPress: onClose
|
|
419
|
-
}), /* @__PURE__ */ jsx(SheetAction, {
|
|
420
|
-
label: "Send",
|
|
421
|
-
variant: "primary",
|
|
422
|
-
testID: "task-detail-send",
|
|
423
|
-
onPress: submitMessage
|
|
424
|
-
})]
|
|
425
|
-
})
|
|
426
|
-
] }) : null
|
|
427
|
-
]
|
|
428
|
-
})] })
|
|
428
|
+
] }) : null
|
|
429
|
+
]
|
|
430
|
+
})]
|
|
431
|
+
})
|
|
429
432
|
});
|
|
430
433
|
}
|
|
431
434
|
const styles$2 = StyleSheet.create((theme) => ({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native.mjs","names":["isRecord","SessionFrameSender","AgentAvatar","Badge","Button","Dot","Input","Label","SegmentedControl","Sheet","SheetContent","SheetHeader","SheetTitle","SheetBody","Textarea","ReactNode","useState","StyleSheet","WebTask","WebTaskStatus","requestTaskEdit","requestTaskMessage","taskEditDraft","taskAgentName","TaskEditDraft","TASK_STATUS_TONE","TaskSheetMode","STATUS_CHOICES","DESCRIPTION_LINES","MESSAGE_LINES","ActionVariant","Field","label","children","styles","field","Fact","term","testID","fact","factValue","SheetAction","variant","onPress","TaskFacts","task","agent","delegation","facts","value","state","hint","activeForm","blockedBy","length","map","id","join","owner","updatedAt","TaskDetailSheet","sessionId","mode","initialMode","send","onClose","setMode","draft","setDraft","message","setMessage","agentName","submitEdit","submitMessage","trim","open","subject","status","replace","description","body","footer","includes","create","theme","gap","spacing","uni__dependencies","flexDirection","alignItems","fontSize","sm","lineHeight","color","colors","faint","base","lg","text","width","dim","flex","flexWrap","justifyContent","styles","WebPluginSlotProps","AgentAvatar","Badge","Button","ChevronDownIcon","ChevronRightIcon","Dot","DropdownMenu","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuItem","EditIcon","KebabIcon","MessageIcon","TrashIcon","ListRow","useCallback","useState","useSyncExternalStore","StyleSheet","WebTask","requestTaskRemoval","taskAgentName","tasks","TaskDetailSheet","TaskSheetMode","TASK_STATUS_TONE","TitleInk","SheetState","taskId","mode","titleInk","status","useSessionTasks","sessionId","subscribe","listener","subscription","store","unsubscribe","select","state","TaskRow","task","sendSessionFrame","openSheet","doing","activeForm","undefined","agent","delegation","waits","blockedBy","length","map","id","join","detail","filter","Boolean","subject","styles","titleButton","title","line","meta","TasksActivitySection","sessionTasks","historyOpen","setHistoryOpen","sheet","setSheet","active","history","failed","done","total","sheetTask","find","row","section","min","max","now","progress","track","fill","width","group","expanded","open","historyToggle","historyLabel","create","theme","gap","spacing","uni__dependencies","paddingHorizontal","height","borderRadius","full","overflow","backgroundColor","colors","deep","green","flexDirection","alignItems","justifyContent","paddingVertical","ink","fontSize","base","lineHeight","fontWeight","color","sm","faint","text","flexShrink","dim","red","minHeight","md","styles","ToolMessageRenderProps","MessageItem","MessageItemHeader","MessageItemBody","MessageItemStatus","Dot","CodeBlock","toolTone","StatusTone","DotTone","StyleSheet","STATUS_LABEL","TaskCallTone","TaskResultTone","TaskRow","TaskStatus","taskCallView","taskResultView","InkToken","STATUS_DOT","Readonly","Record","pending","in_progress","completed","failed","deleted","CALL_INK","dim","accent","RESULT_TONE","running","ok","error","warning","TaskRowLine","row","waits","blockedBy","length","map","id","join","meta","agent","activeForm","filter","Boolean","subject","status","styles","dot","rowText","rowSubject","ink","closed","TaskToolMessage","args","result","output","isError","call","collapsed","details","expanded","isPartial","full","hidden","rows","errorLines","view","empty","action","glyph","subjectTone","detail","tone","text","create","theme","fontSize","base","lineHeight","fontWeight","color","colors","uni__dependencies","flexShrink","body","gap","spacing","flexDirection","alignItems","marginTop","flex","sm","token","fillTasks","activityGroupTasks","channelTaskGraph","fillTasks2","toolTask"],"sources":["../../src/extensions/workspaces/(frontend)/fill/Tasks.home.native.ts","../../src/types/webTasks.ts","../../src/extensions/workspaces/sessions/(frontend)/channel/_lib/tasksModel.ts","../../src/extensions/workspaces/sessions/(frontend)/channel/_lib/tasksStore.native.ts","../../src/extensions/workspaces/sessions/(frontend)/activity-group/tasks.native.ts","../../src/extensions/workspaces/sessions/(frontend)/channel/task-graph.native.ts","../../src/extensions/workspaces/sessions/(frontend)/fill/_lib/taskStatusTone.ts","../../src/extensions/workspaces/sessions/(frontend)/fill/_lib/TaskDetailSheet.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/fill/_lib/TasksActivitySection.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/fill/Tasks.activity.tasks.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/_lib/taskToolFormat.ts","../../src/extensions/workspaces/sessions/(frontend)/tool/_lib/TaskToolMessage.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/task.native.tsx","../../generated/native.ts"],"sourcesContent":["import { defineFill } from '@agimon-ai/po-core/native';\n\nexport default defineFill({ data: { version: 1, label: 'Tasks', source: 'task_graph', destination: 'tasks' } });\n","/** Browser-safe task view published by the cockpit hub channel. */\nexport const TASKS_CHANNEL_TYPE = 'task_graph';\n\nexport type WebTaskStatus = 'pending' | 'in_progress' | 'completed' | 'failed' | 'deleted';\n\nexport interface WebTask {\n id: number;\n subject: string;\n description?: string;\n activeForm?: string;\n status: WebTaskStatus;\n blockedBy: number[];\n owner?: string;\n updatedAt?: string;\n delegation?: {\n agent?: string;\n identity?: string;\n state?: string;\n };\n}\n\nexport interface WebTasksPayload {\n tasks: WebTask[];\n rev: number;\n}\n","/*\n * The task graph's store-free half: payload parsing and the prompts a cockpit\n * edit becomes. It holds no runtime import, so the web store (tasksStore.ts)\n * and the native store (tasksStore.native.ts) share it unchanged.\n */\nimport type { SessionFrameSender } from '@agimon-ai/po-core/web';\n\nimport type { WebTask, WebTasksPayload } from '../../../../../../types/webTasks';\n\nexport interface TasksSession {\n tasks: WebTask[];\n rev: number;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction parseTask(value: unknown): WebTask | null {\n if (!isRecord(value) || typeof value.id !== 'number' || typeof value.subject !== 'string') return null;\n if (!['pending', 'in_progress', 'completed', 'failed'].includes(String(value.status))) return null;\n const task: WebTask = {\n id: value.id,\n subject: value.subject,\n status: value.status as WebTask['status'],\n blockedBy: Array.isArray(value.blockedBy)\n ? value.blockedBy.filter((id): id is number => typeof id === 'number')\n : [],\n };\n if (typeof value.description === 'string') task.description = value.description;\n if (typeof value.activeForm === 'string') task.activeForm = value.activeForm;\n if (typeof value.owner === 'string') task.owner = value.owner;\n if (typeof value.updatedAt === 'string') task.updatedAt = value.updatedAt;\n if (isRecord(value.delegation)) {\n task.delegation = {};\n if (typeof value.delegation.agent === 'string') task.delegation.agent = value.delegation.agent;\n if (typeof value.delegation.identity === 'string') task.delegation.identity = value.delegation.identity;\n if (typeof value.delegation.state === 'string') task.delegation.state = value.delegation.state;\n }\n return task;\n}\n\n/** Narrows a hub frame to a task graph payload; null when it is not one. */\nexport function parseTasksPayload(input: unknown): WebTasksPayload | null {\n if (!isRecord(input) || !Array.isArray(input.tasks) || typeof input.rev !== 'number') return null;\n return { tasks: input.tasks.map(parseTask).filter((task): task is WebTask => task !== null), rev: input.rev };\n}\n\n/** Same first-name presentation as the Agents panel, without changing routing identity. */\nexport function taskAgentName(delegation: WebTask['delegation']): string | undefined {\n const first = delegation?.identity?.split('-')[0];\n // ponytail: Older assignments keep the agent type; reassign to attach a named run.\n return first ? first.charAt(0).toUpperCase() + first.slice(1) : delegation?.agent;\n}\n\n/** The fields the cockpit lets a human change on a task. */\nexport interface TaskEditDraft {\n subject: string;\n description: string;\n status: WebTask['status'];\n}\n\nexport function taskEditDraft(task: WebTask): TaskEditDraft {\n return { subject: task.subject, description: task.description ?? '', status: task.status };\n}\n\nfunction changedFields(task: WebTask, draft: TaskEditDraft): string[] {\n const changes: string[] = [];\n const subject = draft.subject.trim();\n const description = draft.description.trim();\n if (subject && subject !== task.subject) changes.push(`set subject to \"${subject}\"`);\n if (description !== (task.description ?? '').trim()) {\n changes.push(description ? `set description to \"${description}\"` : 'clear the description');\n }\n if (draft.status !== task.status) changes.push(`set status to ${draft.status}`);\n return changes;\n}\n\n/**\n * The agent stays the only writer of task state, so an edit leaves the cockpit\n * as one prompt naming exactly the fields the human changed. Nothing changed\n * means nothing to send.\n */\nexport function taskEditInstruction(task: WebTask, draft: TaskEditDraft): string | null {\n const changes = changedFields(task, draft);\n if (changes.length === 0) return null;\n return `Update task #${task.id}: ${changes.join('; ')}. Change nothing else and keep the dependency graph valid.`;\n}\n\nexport function requestTaskEdit(\n send: SessionFrameSender,\n sessionId: string,\n task: WebTask,\n draft: TaskEditDraft,\n): boolean {\n const message = taskEditInstruction(task, draft);\n if (message === null) return false;\n send(sessionId, { type: 'prompt', message });\n return true;\n}\n\n/** Steering for the subagent that owns a delegated task. */\nexport function taskMessageInstruction(taskId: number, agent: string, message: string): string {\n return `Steer the ${agent} run working on task #${taskId} with this message, then update the task if its plan changed: ${message.trim()}`;\n}\n\nexport function requestTaskMessage(\n send: SessionFrameSender,\n sessionId: string,\n taskId: number,\n agent: string,\n message: string,\n): void {\n send(sessionId, { type: 'prompt', message: taskMessageInstruction(taskId, agent, message) });\n}\n\nexport function requestTaskRemoval(send: SessionFrameSender, sessionId: string, taskId: number): void {\n send(sessionId, {\n type: 'prompt',\n message: `Remove task #${taskId}. Also remove or repair every dependency that references it so the remaining task graph is valid.`,\n });\n}\n","import { defineSessionStore } from '@agimon-ai/po-core/native';\n\nimport { TASKS_CHANNEL_TYPE, type WebTasksPayload } from '../../../../../../types/webTasks';\nimport { parseTasksPayload, type TasksSession } from './tasksModel';\n\n/**\n * The native copy of the task graph store. It mirrors tasksStore.ts with the\n * native SDK, since the app provides `@agimon-ai/po-core/native` and never the\n * web contract; the parsing and the edit prompts come from the same model.\n */\nexport const tasks = defineSessionStore<TasksSession>({ tasks: [], rev: 0 });\n\nexport const tasksChannel = tasks.channel<WebTasksPayload>({\n channel: TASKS_CHANNEL_TYPE,\n parse: parseTasksPayload,\n reduce: (_current, payload) => payload,\n});\n","import { defineActivityGroup } from '@agimon-ai/po-core/native';\nimport { TaskIcon } from '@agimon-ai/po-native-components';\nimport { createElement } from 'react';\n\nimport { tasks } from '../channel/_lib/tasksStore.native';\n\n/**\n * The live task board in the app's Activity list, matching tasks.web.ts.\n *\n * Active means a delegated run is still out, not that the list has entries: a\n * pending task waits for this agent's next turn and reports to nobody.\n */\nexport default defineActivityGroup({\n keys: 't l',\n // The shared activity contract still supplies web-only icon props.\n icon: (_props: { 'aria-hidden'?: boolean; className?: string }) => createElement(TaskIcon),\n statusKey: '@agimon-ai/po-task',\n marksBackgroundWork: false,\n activeSource: {\n subscribe(listener: () => void) {\n const subscription = tasks.store.subscribe(listener);\n return () => subscription.unsubscribe();\n },\n isActive(sessionId: string | null) {\n return tasks\n .select(tasks.store.state, sessionId)\n .tasks.some((task) => task.delegation?.state === 'requested' || task.delegation?.state === 'running');\n },\n },\n order: 65,\n});\n","import { defineChannelFile } from '@agimon-ai/po-core/native';\n\nimport { tasksChannel } from './_lib/tasksStore.native';\n\nexport default defineChannelFile(tasksChannel);\n","import type { WebTaskStatus } from '../../../../../../types/webTasks';\n\n/**\n * The tone a task status reads in, named by theme token so web and native agree.\n * Jade (`green`) is Po working; finished work goes quiet; red is a real failure.\n */\nexport type TaskStatusTone = 'muted' | 'neutral' | 'green' | 'red';\n\nexport const TASK_STATUS_TONE: Readonly<Record<WebTaskStatus, TaskStatusTone>> = {\n pending: 'muted',\n in_progress: 'green',\n completed: 'neutral',\n failed: 'red',\n deleted: 'muted',\n};\n","import type { SessionFrameSender } from '@agimon-ai/po-core/native';\nimport {\n AgentAvatar,\n Badge,\n Button,\n Dot,\n Input,\n Label,\n SegmentedControl,\n Sheet,\n SheetContent,\n SheetHeader,\n SheetTitle,\n SheetBody,\n Textarea,\n} from '@agimon-ai/po-native-components';\nimport { type ReactNode, useState } from 'react';\nimport { Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport type { WebTask, WebTaskStatus } from '../../../../../../types/webTasks';\nimport {\n requestTaskEdit,\n requestTaskMessage,\n taskEditDraft,\n taskAgentName,\n type TaskEditDraft,\n} from '../../channel/_lib/tasksModel';\nimport { TASK_STATUS_TONE } from './taskStatusTone';\n\n/** How the one task sheet is opened: reading it, changing it, or steering its run. */\nexport type TaskSheetMode = 'view' | 'edit' | 'message';\n\nconst STATUS_CHOICES: readonly WebTaskStatus[] = ['pending', 'in_progress', 'completed', 'failed'];\nconst DESCRIPTION_LINES = 5;\nconst MESSAGE_LINES = 4;\n\ntype ActionVariant = 'primary' | 'ghost';\n\nfunction Field({ label, children }: { label: string; children: ReactNode }) {\n return (\n <View style={styles.field}>\n <Label>{label}</Label>\n {children}\n </View>\n );\n}\n\n/** One term and its value in the facts list. */\nfunction Fact({ term, testID, children }: { term: string; testID: string; children: ReactNode }) {\n return (\n <View style={styles.fact}>\n <Text style={styles.term}>{term}</Text>\n <View testID={testID} style={styles.factValue}>\n {children}\n </View>\n </View>\n );\n}\n\nfunction SheetAction({\n label,\n variant,\n testID,\n onPress,\n}: {\n label: string;\n variant: ActionVariant;\n testID: string;\n onPress: () => void;\n}) {\n return (\n <Button testID={testID} variant={variant} onPress={onPress}>\n {label}\n </Button>\n );\n}\n\nfunction TaskFacts({ task }: { task: WebTask }) {\n const agent = taskAgentName(task.delegation);\n return (\n <View style={styles.facts}>\n {agent ? (\n <Fact term=\"Agent\" testID=\"task-detail-agent\">\n <AgentAvatar name={agent} size=\"sm\" />\n <Text style={styles.value}>{agent}</Text>\n {task.delegation?.state ? <Text style={styles.hint}>{task.delegation.state}</Text> : null}\n </Fact>\n ) : null}\n {task.activeForm ? (\n <Fact term=\"Doing now\" testID=\"task-detail-active-form\">\n <Text style={styles.value}>{task.activeForm}</Text>\n </Fact>\n ) : null}\n {task.blockedBy.length > 0 ? (\n <Fact term=\"Waits for\" testID=\"task-detail-blocked-by\">\n <Text style={styles.value}>{task.blockedBy.map((id) => `#${id}`).join(', ')}</Text>\n </Fact>\n ) : null}\n {task.owner ? (\n <Fact term=\"Owner\" testID=\"task-detail-owner\">\n <Text style={styles.value}>{task.owner}</Text>\n </Fact>\n ) : null}\n {task.updatedAt ? (\n <Fact term=\"Updated\" testID=\"task-detail-updated\">\n <Text style={styles.value}>{task.updatedAt}</Text>\n </Fact>\n ) : null}\n </View>\n );\n}\n\n/**\n * One task in a bottom sheet, read first and changed second, as the web\n * dialog does. Every change leaves as a prompt the session can see, so the\n * agent remains the only writer of task state.\n */\nexport function TaskDetailSheet({\n task,\n sessionId,\n mode: initialMode,\n send,\n onClose,\n}: {\n task: WebTask;\n sessionId: string;\n mode: TaskSheetMode;\n send: SessionFrameSender;\n onClose: () => void;\n}) {\n const [mode, setMode] = useState<TaskSheetMode>(initialMode);\n const [draft, setDraft] = useState<TaskEditDraft>(() => taskEditDraft(task));\n const [message, setMessage] = useState('');\n const agent = task.delegation?.agent;\n const agentName = taskAgentName(task.delegation);\n\n const submitEdit = (): void => {\n if (requestTaskEdit(send, sessionId, task, draft)) onClose();\n };\n const submitMessage = (): void => {\n if (!message.trim() || !agent) return;\n requestTaskMessage(send, sessionId, task.id, agent, message);\n onClose();\n };\n\n return (\n <Sheet\n open\n onOpenChange={(open) => {\n if (!open) onClose();\n }}\n >\n <SheetContent>\n <SheetHeader closeLabel=\"close task\">\n <SheetTitle testID=\"task-detail-title\" accessibilityLabel={`task #${task.id}: ${task.subject}`}>\n {task.subject}\n </SheetTitle>\n </SheetHeader>\n <SheetBody testID=\"task-detail-dialog\">\n <View style={styles.status}>\n <Text style={styles.id}>#{task.id}</Text>\n <Badge testID=\"task-detail-status\">\n <Dot tone={TASK_STATUS_TONE[task.status]} pulse={task.status === 'in_progress'} />\n {task.status.replace('_', ' ')}\n </Badge>\n </View>\n {mode === 'view' ? (\n <>\n <Text testID=\"task-detail-description\" style={task.description ? styles.body : styles.hint}>\n {task.description ?? 'No description on this task.'}\n </Text>\n <TaskFacts task={task} />\n <View style={styles.footer}>\n {agent ? (\n <SheetAction\n label=\"Message agent\"\n variant=\"ghost\"\n testID=\"task-detail-open-message\"\n onPress={() => setMode('message')}\n />\n ) : null}\n <SheetAction\n label=\"Edit\"\n variant=\"primary\"\n testID=\"task-detail-open-edit\"\n onPress={() => setMode('edit')}\n />\n </View>\n </>\n ) : null}\n\n {mode === 'edit' ? (\n <>\n <Field label=\"Subject\">\n <Input\n testID=\"task-detail-subject-input\"\n accessibilityLabel=\"Subject\"\n autoFocus\n value={draft.subject}\n onChangeText={(subject) => setDraft({ ...draft, subject })}\n />\n </Field>\n <Field label=\"Description\">\n <Textarea\n testID=\"task-detail-description-input\"\n accessibilityLabel=\"Description\"\n numberOfLines={DESCRIPTION_LINES}\n value={draft.description}\n placeholder=\"What this task covers\"\n onChangeText={(description) => setDraft({ ...draft, description })}\n />\n </Field>\n <Field label=\"Status\">\n <SegmentedControl\n accessibilityLabel=\"Status\"\n options={STATUS_CHOICES.map((status) => ({ value: status, label: status.replace('_', ' ') }))}\n value={draft.status}\n onValueChange={(status) => {\n if (STATUS_CHOICES.includes(status as WebTaskStatus))\n setDraft({ ...draft, status: status as WebTaskStatus });\n }}\n />\n </Field>\n <Text style={styles.hint}>Saved as one prompt naming only the fields you changed</Text>\n <View style={styles.footer}>\n <SheetAction label=\"Cancel\" variant=\"ghost\" testID=\"task-detail-cancel\" onPress={onClose} />\n <SheetAction label=\"Save\" variant=\"primary\" testID=\"task-detail-save\" onPress={submitEdit} />\n </View>\n </>\n ) : null}\n\n {mode === 'message' && agent ? (\n <>\n <Field label={`Message to ${agentName}`}>\n <Textarea\n testID=\"task-detail-message-input\"\n accessibilityLabel=\"Message to agent\"\n autoFocus\n numberOfLines={MESSAGE_LINES}\n value={message}\n placeholder=\"Guidance for the run working on this task\"\n onChangeText={setMessage}\n />\n </Field>\n <Text style={styles.hint}>Steers the run, it does not edit the task</Text>\n <View style={styles.footer}>\n <SheetAction label=\"Cancel\" variant=\"ghost\" testID=\"task-detail-cancel\" onPress={onClose} />\n <SheetAction label=\"Send\" variant=\"primary\" testID=\"task-detail-send\" onPress={submitMessage} />\n </View>\n </>\n ) : null}\n </SheetBody>\n </SheetContent>\n </Sheet>\n );\n}\n\nconst styles = StyleSheet.create((theme) => ({\n field: { gap: theme.spacing(1.5) },\n status: { flexDirection: 'row', alignItems: 'center', gap: theme.spacing(2) },\n id: { fontSize: theme.fontSize.sm, lineHeight: theme.lineHeight.sm, color: theme.colors.faint },\n body: { fontSize: theme.fontSize.base, lineHeight: theme.lineHeight.lg, color: theme.colors.text },\n facts: { gap: theme.spacing(2.5) },\n fact: { flexDirection: 'row', alignItems: 'center', gap: theme.spacing(4) },\n term: {\n width: theme.spacing(20),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n color: theme.colors.dim,\n },\n factValue: { flex: 1, flexDirection: 'row', alignItems: 'center', flexWrap: 'wrap', gap: theme.spacing(1.5) },\n value: { fontSize: theme.fontSize.base, lineHeight: theme.lineHeight.base, color: theme.colors.text },\n hint: { fontSize: theme.fontSize.sm, lineHeight: theme.lineHeight.sm, color: theme.colors.dim },\n footer: { flexDirection: 'row', justifyContent: 'flex-end', gap: theme.spacing(2) },\n}));\n","import type { WebPluginSlotProps } from '@agimon-ai/po-core/native';\nimport {\n AgentAvatar,\n Badge,\n Button,\n ChevronDownIcon,\n ChevronRightIcon,\n Dot,\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n EditIcon,\n KebabIcon,\n MessageIcon,\n TrashIcon,\n ListRow,\n} from '@agimon-ai/po-native-components';\nimport { useCallback, useState, useSyncExternalStore } from 'react';\nimport { Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport type { WebTask } from '../../../../../../types/webTasks';\nimport { requestTaskRemoval, taskAgentName } from '../../channel/_lib/tasksModel';\nimport { tasks } from '../../channel/_lib/tasksStore.native';\nimport { TaskDetailSheet, type TaskSheetMode } from './TaskDetailSheet.native';\nimport { TASK_STATUS_TONE } from './taskStatusTone';\n\ntype TitleInk = 'dim' | 'hi';\n\ninterface SheetState {\n taskId: number;\n mode: TaskSheetMode;\n}\n\nfunction titleInk(status: WebTask['status']): TitleInk {\n return status === 'completed' || status === 'failed' ? 'dim' : 'hi';\n}\n\n/** The session's tasks, read from the native store without @tanstack/react-store, which the app does not provide. */\nfunction useSessionTasks(sessionId: string | null): WebTask[] {\n const subscribe = useCallback((listener: () => void) => {\n const subscription = tasks.store.subscribe(listener);\n return () => subscription.unsubscribe();\n }, []);\n return useSyncExternalStore(subscribe, () => tasks.select(tasks.store.state, sessionId).tasks);\n}\n\nfunction TaskRow({\n task,\n sessionId,\n sendSessionFrame,\n openSheet,\n}: {\n task: WebTask;\n sessionId: string;\n sendSessionFrame: WebPluginSlotProps['sendSessionFrame'];\n openSheet: (mode: TaskSheetMode) => void;\n}) {\n const doing = task.status === 'in_progress' ? task.activeForm : undefined;\n const agent = taskAgentName(task.delegation);\n const waits = task.blockedBy.length > 0 ? `Waits for ${task.blockedBy.map((id) => `#${id}`).join(', ')}` : '';\n const detail = [doing, waits].filter(Boolean).join(' · ');\n return (\n <View testID={`activity-task-${task.id}`}>\n <ListRow\n leading={<Dot tone={TASK_STATUS_TONE[task.status]} pulse={task.status === 'in_progress'} />}\n title={\n <Button\n variant=\"ghost\"\n testID={`activity-task-title-${task.id}`}\n accessibilityLabel={task.subject}\n onPress={() => openSheet('view')}\n style={styles.titleButton}\n >\n <Text numberOfLines={2} style={styles.title(titleInk(task.status))}>\n <Text style={styles.id}>#{task.id}</Text> {task.subject}\n </Text>\n </Button>\n }\n description={\n agent || detail ? (\n <View style={styles.line}>\n {agent ? <AgentAvatar name={agent} size=\"sm\" /> : null}\n {agent ? <Text style={styles.agent}>{agent}</Text> : null}\n {detail ? (\n <Text numberOfLines={1} style={styles.meta}>\n {detail}\n </Text>\n ) : null}\n </View>\n ) : undefined\n }\n trailing={\n task.status !== 'completed' && task.status !== 'deleted' ? (\n <DropdownMenu>\n <DropdownMenuTrigger\n variant=\"ghost\"\n size=\"icon\"\n testID={`activity-task-menu-${task.id}`}\n accessibilityLabel={`task #${task.id} actions`}\n >\n <KebabIcon />\n </DropdownMenuTrigger>\n <DropdownMenuContent>\n <DropdownMenuItem onSelect={() => openSheet('edit')}>\n <EditIcon />\n Edit\n </DropdownMenuItem>\n {agent ? (\n <DropdownMenuItem onSelect={() => openSheet('message')}>\n <MessageIcon />\n Message agent\n </DropdownMenuItem>\n ) : null}\n <DropdownMenuItem\n variant=\"destructive\"\n onSelect={() => requestTaskRemoval(sendSessionFrame, sessionId, task.id)}\n >\n <TrashIcon color=\"red\" />\n Remove\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n ) : undefined\n }\n />\n </View>\n );\n}\n\n/**\n * The session task graph in the app's Activity list, mirroring the web\n * section: a done count, active rows, finished and failed ones folded away by\n * default, and a sheet for reading or changing one task. Empty graphs render\n * nothing.\n */\nexport function TasksActivitySection({ sessionId, sendSessionFrame }: WebPluginSlotProps) {\n const sessionTasks = useSessionTasks(sessionId);\n const [historyOpen, setHistoryOpen] = useState(false);\n const [sheet, setSheet] = useState<SheetState>();\n if (sessionId === null || sessionTasks.length === 0) return null;\n\n const active = sessionTasks.filter((task) => task.status === 'pending' || task.status === 'in_progress');\n const history = sessionTasks.filter((task) => task.status === 'completed' || task.status === 'failed');\n const failed = history.filter((task) => task.status === 'failed').length;\n const done = history.length - failed;\n const total = active.length + history.length;\n const sheetTask = sheet ? sessionTasks.find((task) => task.id === sheet.taskId) : undefined;\n const row = (task: WebTask) => (\n <TaskRow\n key={task.id}\n task={task}\n sessionId={sessionId}\n sendSessionFrame={sendSessionFrame}\n openSheet={(mode) => setSheet({ taskId: task.id, mode })}\n />\n );\n return (\n <View style={styles.section}>\n {total > 0 ? (\n <View\n testID=\"activity-task-progress\"\n accessible\n accessibilityRole=\"progressbar\"\n accessibilityValue={{ min: 0, max: total, now: done }}\n style={styles.progress}\n >\n <Text style={styles.meta}>\n {done} of {total} done\n </Text>\n {/* ponytail: po-native-components has no Progress yet; promote this bar there when a second caller needs one. */}\n <View style={styles.track}>\n <View style={[styles.fill, { width: `${(done / total) * 100}%` }]} />\n </View>\n </View>\n ) : null}\n {active.length > 0 ? <View style={styles.group}>{active.map(row)}</View> : null}\n {history.length > 0 ? (\n <View style={styles.group}>\n <Button\n variant=\"ghost\"\n testID=\"activity-task-history-toggle\"\n accessibilityState={{ expanded: historyOpen }}\n onPress={() => setHistoryOpen((open) => !open)}\n style={styles.historyToggle}\n >\n <>{historyOpen ? <ChevronDownIcon /> : <ChevronRightIcon />}</>\n <Text style={styles.historyLabel}>Finished</Text>\n <Badge>{history.length}</Badge>\n {failed > 0 ? <Text style={styles.failed}>{failed} failed</Text> : null}\n </Button>\n {historyOpen ? <View style={styles.group}>{history.map(row)}</View> : null}\n </View>\n ) : null}\n {sheet && sheetTask ? (\n <TaskDetailSheet\n key={`${sheetTask.id}-${sheet.mode}`}\n task={sheetTask}\n sessionId={sessionId}\n mode={sheet.mode}\n send={sendSessionFrame}\n onClose={() => setSheet(undefined)}\n />\n ) : null}\n </View>\n );\n}\n\nconst styles = StyleSheet.create((theme) => ({\n section: {\n gap: theme.spacing(2),\n },\n group: {\n gap: theme.spacing(0.5),\n },\n progress: {\n gap: theme.spacing(1.5),\n paddingHorizontal: theme.spacing(1),\n },\n track: {\n height: theme.spacing(1),\n borderRadius: theme.borderRadius.full,\n overflow: 'hidden',\n backgroundColor: theme.colors.deep,\n },\n fill: {\n height: '100%',\n backgroundColor: theme.colors.green,\n },\n line: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: theme.spacing(1.5),\n },\n titleButton: {\n height: 'auto',\n justifyContent: 'flex-start',\n paddingHorizontal: 0,\n paddingVertical: theme.spacing(0.5),\n },\n title: (ink: TitleInk) => ({\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n fontWeight: '500',\n color: theme.colors[ink],\n }),\n id: {\n fontSize: theme.fontSize.sm,\n color: theme.colors.faint,\n },\n agent: {\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n color: theme.colors.text,\n },\n meta: {\n flexShrink: 1,\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n color: theme.colors.dim,\n },\n failed: {\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n color: theme.colors.red,\n },\n historyToggle: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'flex-start',\n gap: theme.spacing(1.5),\n minHeight: theme.spacing(11),\n paddingHorizontal: theme.spacing(1),\n borderRadius: theme.borderRadius.md,\n },\n historyLabel: {\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n fontWeight: '500',\n color: theme.colors.dim,\n },\n}));\n","import { defineFill } from '@agimon-ai/po-core/native';\n\nimport { TasksActivitySection } from './_lib/TasksActivitySection.native';\n\nexport default defineFill({ component: TasksActivitySection });\n","/**\n * Pure view logic for the task tool card, the browser counterpart of\n * the session frontend's shared format helpers (renderTaskCall, renderTaskResult). The plugin may reach\n * only its own files and src/types, so the store shapes it reads are\n * restated here as the wire JSON of a tool_execution frame.\n */\n\nimport { taskAgentName } from '../../channel/_lib/tasksModel';\n\nexport type TaskStatus = 'pending' | 'in_progress' | 'completed' | 'failed' | 'deleted';\nexport type TaskAction = 'upsert' | 'list' | 'get' | 'delete' | 'clear' | 'assign' | 'cancel';\n\nexport const STATUS_GLYPH: Record<TaskStatus, string> = {\n pending: '○',\n in_progress: '◐',\n completed: '●',\n failed: '✗',\n deleted: '⊘',\n};\n\nexport const STATUS_LABEL: Record<TaskStatus, string> = {\n pending: 'pending',\n in_progress: 'in progress',\n completed: 'completed',\n failed: 'failed',\n deleted: 'deleted',\n};\n\nexport const ACTION_GLYPH: Record<TaskAction, string> = {\n upsert: '✎',\n delete: '×',\n get: '›',\n list: '☰',\n clear: '∅',\n assign: '⇒',\n cancel: '⊗',\n};\n\n/**\n * `upsert` is two operations behind one name, so a homogeneous batch narrows to\n * the glyph the operator already reads: `+` means new work appeared, `→` means\n * work moved. A mixed batch keeps the neutral write glyph.\n */\nconst UPSERT_CREATE_GLYPH = '+';\nconst UPSERT_UPDATE_GLYPH = '→';\n/** Task rows kept in a collapsed result, before the card is expanded. */\nconst TRANSCRIPT_TASK_ROWS = 8;\nconst TASK_STATUSES: readonly TaskStatus[] = ['pending', 'in_progress', 'completed', 'failed', 'deleted'];\nconst TASK_ACTIONS: readonly TaskAction[] = ['upsert', 'list', 'get', 'delete', 'clear', 'assign', 'cancel'];\nconst INLINE_WHITESPACE = /\\s+/gu;\n\n/** One task as the result details carry it (src/models/task.ts Task). */\nexport interface TaskView {\n id: number;\n subject: string;\n status: TaskStatus;\n activeForm?: string;\n blockedBy?: number[];\n delegation?: { agent?: string; identity?: string; state?: string };\n}\n\n/** The result details (src/models/task.ts TaskDetails), narrowed to what the card reads. */\nexport interface TaskDetailsView {\n action: TaskAction;\n params: Record<string, unknown>;\n tasks: TaskView[];\n error?: string;\n upsert?: { applied: number[]; failed: number };\n assignment?: { assigned: number[]; failed: number };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isStatus(value: unknown): value is TaskStatus {\n return typeof value === 'string' && (TASK_STATUSES as readonly string[]).includes(value);\n}\n\nfunction isAction(value: unknown): value is TaskAction {\n return typeof value === 'string' && (TASK_ACTIONS as readonly string[]).includes(value);\n}\n\nfunction taskView(value: unknown): TaskView | null {\n if (!isRecord(value) || typeof value.id !== 'number' || typeof value.subject !== 'string') return null;\n if (!isStatus(value.status)) return null;\n const task: TaskView = { id: value.id, subject: value.subject, status: value.status };\n if (typeof value.activeForm === 'string') task.activeForm = value.activeForm;\n if (Array.isArray(value.blockedBy)) {\n task.blockedBy = value.blockedBy.filter((id): id is number => typeof id === 'number');\n }\n if (isRecord(value.delegation)) {\n task.delegation = {};\n if (typeof value.delegation.agent === 'string') task.delegation.agent = value.delegation.agent;\n if (typeof value.delegation.identity === 'string') task.delegation.identity = value.delegation.identity;\n if (typeof value.delegation.state === 'string') task.delegation.state = value.delegation.state;\n }\n return task;\n}\n\nfunction idList(value: unknown): number[] {\n return Array.isArray(value) ? value.filter((id): id is number => typeof id === 'number') : [];\n}\n\n/** Narrows the wire details; null when they are not a task result at all. */\nexport function taskDetailsView(details: unknown): TaskDetailsView | null {\n if (!isRecord(details) || !isAction(details.action) || !Array.isArray(details.tasks)) return null;\n const view: TaskDetailsView = {\n action: details.action,\n params: isRecord(details.params) ? details.params : {},\n tasks: details.tasks.map(taskView).filter((task): task is TaskView => task !== null),\n };\n if (typeof details.error === 'string') view.error = details.error;\n if (isRecord(details.upsert)) {\n view.upsert = {\n applied: idList(details.upsert.applied),\n failed: typeof details.upsert.failed === 'number' ? details.upsert.failed : 0,\n };\n }\n if (isRecord(details.assignment)) {\n view.assignment = {\n assigned: idList(details.assignment.assigned),\n failed: typeof details.assignment.failed === 'number' ? details.assignment.failed : 0,\n };\n }\n return view;\n}\n\n/** `#id` for the wire's id, which the TUI would resolve to a subject through the store. */\nfunction idLabel(value: unknown): string {\n return typeof value === 'number' || typeof value === 'string' ? `#${value}` : '#?';\n}\n\n/** Keep dynamic content on one line. */\nfunction inlineText(text: string): string {\n return text.replace(INLINE_WHITESPACE, ' ').trim();\n}\n\nexport type TaskCallTone = 'dim' | 'accent';\n\n/** The call header: glyph, action, then the subject or a count, as renderTaskCall lays it out. */\nexport interface TaskCallView {\n glyph: string;\n action: string;\n subject?: string;\n subjectTone: TaskCallTone;\n /** The assignee (`→ agent`) or the list filter. */\n detail?: string;\n}\n\nfunction upsertGlyph(items: readonly Record<string, unknown>[]): string {\n if (items.length === 0) return ACTION_GLYPH.upsert;\n if (items.every((item) => item.id === undefined)) return UPSERT_CREATE_GLYPH;\n if (items.every((item) => item.id !== undefined)) return UPSERT_UPDATE_GLYPH;\n return ACTION_GLYPH.upsert;\n}\n\n/**\n * The TUI resolves an id to its subject through the task store; the card has\n * no store and shows `#id` until the result names the task.\n */\nexport function taskCallView(args: Record<string, unknown>): TaskCallView {\n const action = typeof args.action === 'string' ? args.action : 'task';\n if (!isAction(action)) return { glyph: '?', action, subjectTone: 'dim' };\n const items = action === 'upsert' && Array.isArray(args.tasks) ? args.tasks.filter(isRecord) : [];\n const view: TaskCallView = {\n glyph: action === 'upsert' ? upsertGlyph(items) : ACTION_GLYPH[action],\n action,\n subjectTone: 'dim',\n };\n\n if (action === 'upsert') {\n // One entry reads exactly as create or update did; a batch reads as a count\n // rather than a subject it would have to pick arbitrarily.\n if (items.length === 1) {\n const only = items[0] ?? {};\n if (only.id === undefined) {\n if (typeof only.subject === 'string') view.subject = inlineText(only.subject);\n } else {\n view.subject = typeof only.subject === 'string' ? inlineText(only.subject) : idLabel(only.id);\n view.subjectTone = 'accent';\n }\n } else if (items.length > 1) {\n view.subject = `${items.length} tasks`;\n }\n } else if (action === 'assign') {\n const assignments = Array.isArray(args.assignments) ? args.assignments.filter(isRecord) : [];\n if (assignments.length === 1) {\n const only = assignments[0] ?? {};\n view.subject = idLabel(only.id);\n view.subjectTone = 'accent';\n if (typeof only.agent === 'string') view.detail = `→ ${only.agent}`;\n } else if (assignments.length > 1) {\n view.subject = `${assignments.length} tasks`;\n }\n } else if ((action === 'get' || action === 'delete' || action === 'cancel') && args.id !== undefined) {\n view.subject = idLabel(args.id);\n view.subjectTone = 'accent';\n } else if (action === 'list' && isStatus(args.status)) {\n view.detail = STATUS_LABEL[args.status];\n }\n return view;\n}\n\n/** One row of the result: the task line on the left, its status flushed right. */\nexport interface TaskRow {\n id: number;\n glyph: string;\n subject: string;\n status: TaskStatus;\n /** Struck through: the task is done with. */\n closed: boolean;\n agent?: string;\n activeForm?: string;\n blockedBy: number[];\n}\n\nexport type TaskResultTone = 'running' | 'ok' | 'error' | 'warning';\n\nexport interface TaskResultView {\n rows: TaskRow[];\n /** Error text lines when the tool threw or the reducer reported an error. */\n errorLines: string[];\n status: { glyph: string; tone: TaskResultTone; text: string } | null;\n}\n\nexport function taskRow(task: TaskView): TaskRow {\n const row: TaskRow = {\n id: task.id,\n glyph: STATUS_GLYPH[task.status],\n subject: inlineText(task.subject),\n status: task.status,\n closed: task.status === 'completed' || task.status === 'deleted',\n blockedBy: task.blockedBy ?? [],\n };\n const agent = taskAgentName(task.delegation);\n if (agent) row.agent = inlineText(agent);\n if (task.status === 'in_progress' && task.activeForm) row.activeForm = inlineText(task.activeForm);\n return row;\n}\n\nfunction nonEmptyLines(text: string): string[] {\n return text.split('\\n').filter((line) => line.trim().length > 0);\n}\n\n/**\n * The rows `list` reported to the model: `details.tasks` is the whole\n * document, so the call's filters apply again here or the card would disagree\n * with the text the model was given.\n */\nfunction listedTasks(details: TaskDetailsView): TaskView[] {\n let view = details.tasks;\n if (details.params.includeDeleted !== true) view = view.filter((task) => task.status !== 'deleted');\n if (isStatus(details.params.status)) view = view.filter((task) => task.status === details.params.status);\n return view;\n}\n\nfunction byIds(details: TaskDetailsView, ids: readonly number[]): TaskView[] {\n return ids.flatMap((id) => details.tasks.find((task) => task.id === id) ?? []);\n}\n\nfunction batch(\n tasks: readonly TaskView[],\n failed: number,\n verb: string,\n expanded: boolean,\n): Pick<TaskResultView, 'rows' | 'status'> {\n // One applied task and nothing failed is the common case: keep the single\n // row it has always had rather than dressing it as a bulk report.\n if (tasks.length === 1 && failed === 0) return { rows: [taskRow(tasks[0] as TaskView)], status: null };\n const shown = expanded ? tasks : tasks.slice(0, TRANSCRIPT_TASK_ROWS);\n let summary = `${tasks.length} ${verb}`;\n if (failed > 0) summary += ` · ${failed} failed`;\n if (tasks.length > shown.length) summary += ` · ${tasks.length - shown.length} more`;\n return {\n rows: shown.map(taskRow),\n status: { glyph: failed > 0 ? '!' : '✓', tone: failed > 0 ? 'warning' : 'ok', text: summary },\n };\n}\n\nexport function taskResultView(input: {\n details: unknown;\n output: string;\n expanded: boolean;\n isPartial: boolean;\n isError: boolean;\n}): TaskResultView {\n const details = taskDetailsView(input.details);\n\n // Running. `assign` and `cancel` stream a placeholder before the run settles.\n if (input.isPartial) {\n const text = nonEmptyLines(input.output).at(-1) ?? 'working';\n return { rows: [], errorLines: [], status: { glyph: '◐', tone: 'running', text } };\n }\n\n // Failed. Every failure path throws, so Pi hands back error text and no\n // details; without this the card would show a green tick on a failure.\n if (input.isError || details?.error !== undefined) {\n const all = nonEmptyLines(details?.error ?? input.output);\n if (all.length <= 1) return { rows: [], errorLines: [], status: { glyph: '✗', tone: 'error', text: all[0] ?? '' } };\n const errorLines = input.expanded ? all : all.slice(0, TRANSCRIPT_TASK_ROWS);\n return { rows: [], errorLines, status: { glyph: '✗', tone: 'error', text: '' } };\n }\n\n if (details === null) return { rows: [], errorLines: [], status: { glyph: '✓', tone: 'ok', text: '' } };\n\n if (details.action === 'list') {\n const tasks = listedTasks(details);\n const shown = input.expanded ? tasks : tasks.slice(0, TRANSCRIPT_TASK_ROWS);\n let summary = tasks.length === 0 ? 'no tasks' : `${tasks.length} task${tasks.length === 1 ? '' : 's'}`;\n if (tasks.length > shown.length) summary += ` · ${tasks.length - shown.length} more`;\n return { rows: shown.map(taskRow), errorLines: [], status: { glyph: '✓', tone: 'ok', text: summary } };\n }\n\n if (details.action === 'clear') {\n return { rows: [], errorLines: [], status: { glyph: '✓', tone: 'ok', text: 'cleared' } };\n }\n\n if (details.action === 'assign' && details.assignment) {\n const assigned = byIds(details, details.assignment.assigned);\n return { errorLines: [], ...batch(assigned, details.assignment.failed, 'assigned', input.expanded) };\n }\n\n if (details.action === 'upsert') {\n const touched = byIds(details, details.upsert?.applied ?? []);\n return { errorLines: [], ...batch(touched, details.upsert?.failed ?? 0, 'applied', input.expanded) };\n }\n\n // The single task an id-bearing action acted on, so the card names it rather than a bare tick.\n const id = details.params.id;\n const task = typeof id === 'number' ? details.tasks.find((candidate) => candidate.id === id) : undefined;\n if (!task) return { rows: [], errorLines: [], status: { glyph: '✓', tone: 'ok', text: '' } };\n return { rows: [taskRow(task)], errorLines: [], status: null };\n}\n","import type { ToolMessageRenderProps } from '@agimon-ai/po-core/native';\nimport {\n MessageItem,\n MessageItemHeader,\n MessageItemBody,\n MessageItemStatus,\n Dot,\n CodeBlock,\n toolTone,\n type StatusTone,\n type DotTone,\n} from '@agimon-ai/po-native-components';\nimport { Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport {\n STATUS_LABEL,\n type TaskCallTone,\n type TaskResultTone,\n type TaskRow,\n type TaskStatus,\n taskCallView,\n taskResultView,\n} from './taskToolFormat';\n\ntype InkToken = 'dim' | 'green' | 'hi';\n\n/** One colour per row, on the dot only: jade while Po works on it, red only for a real failure. */\nconst STATUS_DOT: Readonly<Record<TaskStatus, DotTone>> = {\n pending: 'muted',\n in_progress: 'green',\n completed: 'neutral',\n failed: 'red',\n deleted: 'muted',\n};\n\nconst CALL_INK: Readonly<Record<TaskCallTone, InkToken>> = {\n dim: 'hi',\n accent: 'green',\n};\n\nconst RESULT_TONE: Record<TaskResultTone, StatusTone> = {\n running: 'running',\n ok: 'ok',\n error: 'error',\n warning: 'running',\n};\n\n/** One task row: status dot, id and subject, with who is on it and what it waits for on a quiet line below. */\nfunction TaskRowLine({ row }: { row: TaskRow }) {\n const waits = row.blockedBy.length > 0 ? `waits for ${row.blockedBy.map((id) => `#${id}`).join(', ')}` : '';\n const meta = [row.agent, row.activeForm, waits].filter(Boolean).join(' · ');\n return (\n <View\n testID=\"tool-result-task-row\"\n accessible\n accessibilityLabel={`task #${row.id}, ${row.subject}, ${STATUS_LABEL[row.status]}`}\n style={styles.row}\n >\n <Dot tone={STATUS_DOT[row.status]} pulse={row.status === 'in_progress'} style={styles.dot} />\n <View style={styles.rowText}>\n <Text numberOfLines={1} style={[styles.rowSubject, styles.ink(row.closed ? 'dim' : 'hi')]}>\n <Text style={styles.meta}>#{row.id} </Text>\n {row.subject}\n </Text>\n {meta ? (\n <Text numberOfLines={1} style={styles.meta}>\n {meta}\n </Text>\n ) : null}\n </View>\n </View>\n );\n}\n\n/**\n * The task tool's timeline item on the phone, laid out as the web card is:\n * `glyph action subject` with the assignee or list filter in the header, then\n * the rows the action touched and the batch or list summary.\n */\nexport function TaskToolMessage({ args, result, output, running, isError }: ToolMessageRenderProps) {\n const call = taskCallView(args);\n const collapsed = taskResultView({ details: result?.details, output, expanded: false, isPartial: running, isError });\n const full = taskResultView({ details: result?.details, output, expanded: true, isPartial: running, isError });\n const hidden = full.rows.length - collapsed.rows.length + (full.errorLines.length - collapsed.errorLines.length);\n return (\n <MessageItem testID=\"tool-task\" tone={toolTone({ running, isError })} expandable={hidden > 0}>\n {({ expanded }) => {\n const view = expanded ? full : collapsed;\n const empty = view.rows.length === 0 && view.errorLines.length === 0 && view.status === null;\n return (\n <>\n <MessageItemHeader title=\"task\" testID=\"tool-call-task\" accessibilityLabel={`task ${call.action}`}>\n <Text style={styles.action}>\n {call.glyph} {call.action}\n </Text>\n {call.subject ? (\n <Text numberOfLines={1} style={[styles.subject, styles.ink(CALL_INK[call.subjectTone])]}>\n {call.subject}\n </Text>\n ) : null}\n {call.detail ? <Text style={styles.meta}>{call.detail}</Text> : null}\n </MessageItemHeader>\n {empty ? null : (\n <MessageItemBody testID=\"tool-result-task\">\n {view.rows.length > 0 ? (\n <View style={styles.rows}>\n {view.rows.map((row) => (\n <TaskRowLine key={row.id} row={row} />\n ))}\n </View>\n ) : null}\n {view.errorLines.length > 0 ? <CodeBlock text={view.errorLines.join('\\n')} /> : null}\n {!expanded && hidden > 0 ? (\n <MessageItemStatus expands accessibilityLabel={`Show ${hidden} more`}>\n {hidden} more\n </MessageItemStatus>\n ) : null}\n {view.status ? (\n <MessageItemStatus\n testID=\"tool-result-task-status\"\n tone={RESULT_TONE[view.status.tone]}\n glyph={view.status.glyph}\n >\n {view.status.text}\n </MessageItemStatus>\n ) : null}\n </MessageItemBody>\n )}\n </>\n );\n }}\n </MessageItem>\n );\n}\n\nconst styles = StyleSheet.create((theme) => ({\n action: {\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n fontWeight: '600',\n color: theme.colors.text,\n },\n subject: {\n flexShrink: 1,\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n fontWeight: '600',\n },\n body: {\n gap: theme.spacing(1),\n },\n rows: {\n gap: theme.spacing(0.5),\n },\n row: {\n flexDirection: 'row',\n alignItems: 'flex-start',\n gap: theme.spacing(2),\n },\n dot: {\n marginTop: theme.spacing(1.5),\n },\n rowText: {\n flex: 1,\n },\n rowSubject: {\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n fontWeight: '500',\n },\n meta: {\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n color: theme.colors.dim,\n },\n ink: (token: InkToken) => ({\n color: theme.colors[token],\n }),\n}));\n","import { defineToolRenderer } from '@agimon-ai/po-core/native';\n\nimport { TaskToolMessage } from './_lib/TaskToolMessage.native';\n\nexport default defineToolRenderer({ message: TaskToolMessage });\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineNativePlugin, type WebPluginContributions } from '@agimon-ai/po-core/native';\n\nimport fillTasks from '../src/extensions/workspaces/(frontend)/fill/Tasks.home.native';\nimport activityGroupTasks from '../src/extensions/workspaces/sessions/(frontend)/activity-group/tasks.native';\nimport channelTaskGraph from '../src/extensions/workspaces/sessions/(frontend)/channel/task-graph.native';\nimport fillTasks2 from '../src/extensions/workspaces/sessions/(frontend)/fill/Tasks.activity.tasks.native';\nimport toolTask from '../src/extensions/workspaces/sessions/(frontend)/tool/task.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: 'task',\n workspace: {\n get fills(): WebPluginContributions['fills'] { return [via({ slot: 'home', id: 'tasks' }, fillTasks)]; },\n },\n session: {\n get activityGroups(): WebPluginContributions['activityGroups'] { return [via({ name: 'tasks' }, activityGroupTasks)]; },\n get channels(): WebPluginContributions['channels'] { return [via({ channel: 'task_graph' }, channelTaskGraph)]; },\n get fills(): WebPluginContributions['fills'] { return [via({ slot: 'activity.tasks', id: 'tasks' }, fillTasks2)]; },\n get toolRenderers(): WebPluginContributions['toolRenderers'] { return [via({ tools: ['task'] }, toolTask)]; },\n },\n});\n"],"mappings":";;;;;;;;AAEA,IAAA,4BAAe,WAAW,EAAE,MAAM;CAAE,SAAS;CAAG,OAAO;CAAS,QAAQ;CAAc,aAAa;AAAQ,EAAE,CAAC;;;;ACD9G,MAAa,qBAAqB;;;ACalC,SAASA,WAAS,OAAkD;CAClE,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,UAAU,OAAgC;CACjD,IAAI,CAACA,WAAS,KAAK,KAAK,OAAO,MAAM,OAAO,YAAY,OAAO,MAAM,YAAY,UAAU,OAAO;CAClG,IAAI,CAAC;EAAC;EAAW;EAAe;EAAa;CAAQ,CAAC,CAAC,SAAS,OAAO,MAAM,MAAM,CAAC,GAAG,OAAO;CAC9F,MAAM,OAAgB;EACpB,IAAI,MAAM;EACV,SAAS,MAAM;EACf,QAAQ,MAAM;EACd,WAAW,MAAM,QAAQ,MAAM,SAAS,IACpC,MAAM,UAAU,QAAQ,OAAqB,OAAO,OAAO,QAAQ,IACnE,CAAC;CACP;CACA,IAAI,OAAO,MAAM,gBAAgB,UAAU,KAAK,cAAc,MAAM;CACpE,IAAI,OAAO,MAAM,eAAe,UAAU,KAAK,aAAa,MAAM;CAClE,IAAI,OAAO,MAAM,UAAU,UAAU,KAAK,QAAQ,MAAM;CACxD,IAAI,OAAO,MAAM,cAAc,UAAU,KAAK,YAAY,MAAM;CAChE,IAAIA,WAAS,MAAM,UAAU,GAAG;EAC9B,KAAK,aAAa,CAAC;EACnB,IAAI,OAAO,MAAM,WAAW,UAAU,UAAU,KAAK,WAAW,QAAQ,MAAM,WAAW;EACzF,IAAI,OAAO,MAAM,WAAW,aAAa,UAAU,KAAK,WAAW,WAAW,MAAM,WAAW;EAC/F,IAAI,OAAO,MAAM,WAAW,UAAU,UAAU,KAAK,WAAW,QAAQ,MAAM,WAAW;CAC3F;CACA,OAAO;AACT;;AAGA,SAAgB,kBAAkB,OAAwC;CACxE,IAAI,CAACA,WAAS,KAAK,KAAK,CAAC,MAAM,QAAQ,MAAM,KAAK,KAAK,OAAO,MAAM,QAAQ,UAAU,OAAO;CAC7F,OAAO;EAAE,OAAO,MAAM,MAAM,IAAI,SAAS,CAAC,CAAC,QAAQ,SAA0B,SAAS,IAAI;EAAG,KAAK,MAAM;CAAI;AAC9G;;AAGA,SAAgB,cAAc,YAAuD;CACnF,MAAM,QAAQ,YAAY,UAAU,MAAM,GAAG,CAAC,CAAC;CAE/C,OAAO,QAAQ,MAAM,OAAO,CAAC,CAAC,CAAC,YAAY,IAAI,MAAM,MAAM,CAAC,IAAI,YAAY;AAC9E;AASA,SAAgB,cAAc,MAA8B;CAC1D,OAAO;EAAE,SAAS,KAAK;EAAS,aAAa,KAAK,eAAe;EAAI,QAAQ,KAAK;CAAO;AAC3F;AAEA,SAAS,cAAc,MAAe,OAAgC;CACpE,MAAM,UAAoB,CAAC;CAC3B,MAAM,UAAU,MAAM,QAAQ,KAAK;CACnC,MAAM,cAAc,MAAM,YAAY,KAAK;CAC3C,IAAI,WAAW,YAAY,KAAK,SAAS,QAAQ,KAAK,mBAAmB,QAAQ,EAAE;CACnF,IAAI,iBAAiB,KAAK,eAAe,GAAA,CAAI,KAAK,GAChD,QAAQ,KAAK,cAAc,uBAAuB,YAAY,KAAK,uBAAuB;CAE5F,IAAI,MAAM,WAAW,KAAK,QAAQ,QAAQ,KAAK,iBAAiB,MAAM,QAAQ;CAC9E,OAAO;AACT;;;;;;AAOA,SAAgB,oBAAoB,MAAe,OAAqC;CACtF,MAAM,UAAU,cAAc,MAAM,KAAK;CACzC,IAAI,QAAQ,WAAW,GAAG,OAAO;CACjC,OAAO,gBAAgB,KAAK,GAAG,IAAI,QAAQ,KAAK,IAAI,EAAE;AACxD;AAEA,SAAgB,gBACd,MACA,WACA,MACA,OACS;CACT,MAAM,UAAU,oBAAoB,MAAM,KAAK;CAC/C,IAAI,YAAY,MAAM,OAAO;CAC7B,KAAK,WAAW;EAAE,MAAM;EAAU;CAAQ,CAAC;CAC3C,OAAO;AACT;;AAGA,SAAgB,uBAAuB,QAAgB,OAAe,SAAyB;CAC7F,OAAO,aAAa,MAAM,wBAAwB,OAAO,gEAAgE,QAAQ,KAAK;AACxI;AAEA,SAAgB,mBACd,MACA,WACA,QACA,OACA,SACM;CACN,KAAK,WAAW;EAAE,MAAM;EAAU,SAAS,uBAAuB,QAAQ,OAAO,OAAO;CAAE,CAAC;AAC7F;AAEA,SAAgB,mBAAmB,MAA0B,WAAmB,QAAsB;CACpG,KAAK,WAAW;EACd,MAAM;EACN,SAAS,gBAAgB,OAAO;CAClC,CAAC;AACH;;;;;;;;AC/GA,MAAa,QAAQ,mBAAiC;CAAE,OAAO,CAAC;CAAG,KAAK;AAAE,CAAC;AAE3E,MAAa,eAAe,MAAM,QAAyB;CACzD,SAAS;CACT,OAAO;CACP,SAAS,UAAU,YAAY;AACjC,CAAC;;;;;;;;;ACJD,IAAA,uBAAe,oBAAoB;CACjC,MAAM;CAEN,OAAO,WAA4D,cAAc,QAAQ;CACzF,WAAW;CACX,qBAAqB;CACrB,cAAc;EACZ,UAAU,UAAsB;GAC9B,MAAM,eAAe,MAAM,MAAM,UAAU,QAAQ;GACnD,aAAa,aAAa,YAAY;EACxC;EACA,SAAS,WAA0B;GACjC,OAAO,MACJ,OAAO,MAAM,MAAM,OAAO,SAAS,CAAC,CACpC,MAAM,MAAM,SAAS,KAAK,YAAY,UAAU,eAAe,KAAK,YAAY,UAAU,SAAS;EACxG;CACF;CACA,OAAO;AACT,CAAC;;;AC1BD,IAAA,4BAAe,kBAAkB,YAAY;;;ACI7C,MAAa,mBAAoE;CAC/E,SAAS;CACT,aAAa;CACb,WAAW;CACX,QAAQ;CACR,SAAS;AACX;;;ACmBA,MAAM2B,iBAA2C;CAAC;CAAW;CAAe;CAAa;AAAQ;AACjG,MAAMC,oBAAoB;AAC1B,MAAMC,gBAAgB;AAItB,SAASE,MAAM,EAAEC,OAAOC,YAAoD;CAC1E,OACE,qBAAC,MAAD;EAAM,OAAOC,SAAOC;EAApB,UAAA,CACE,oBAAC,OAAD,EAAA,UAAQH,MAAa,CAAA,GACpBC,QACG;;AAEV;;AAGA,SAASG,KAAK,EAAEC,MAAMC,QAAQL,YAAmE;CAC/F,OACE,qBAAC,MAAD;EAAM,OAAOC,SAAOK;EAApB,UAAA,CACE,oBAAC,MAAD;GAAM,OAAOL,SAAOG;GAAOA,UAAAA;EAAW,CAAA,GACtC,oBAAC,MAAD;GAAcC;GAAQ,OAAOJ,SAAOM;GACjCP;EACG,CAAA,CACF;;AAEV;AAEA,SAASQ,YAAY,EACnBT,OACAU,SACAJ,QACAK,WAMC;CACD,OACE,oBAAC,QAAD;EAAgBL;EAAiBI;EAAkBC;EAChDX,UAAAA;CACK,CAAA;AAEZ;AAEA,SAASY,UAAU,EAAEC,QAA2B;CAC9C,MAAMC,QAAQvB,cAAcsB,KAAKE,UAAU;CAC3C,OACE,qBAAC,MAAD;EAAM,OAAOb,SAAOc;EAApB,UAAA;GACGF,QACC,qBAAC,MAAD;IAAM,MAAK;IAAQ,QAAO;IAA1B,UAAA;KACE,oBAAC,aAAD;MAAa,MAAMA;MAAO,MAAK;KAAI,CAAA;KACnC,oBAAC,MAAD;MAAM,OAAOZ,SAAOe;MAAQH,UAAAA;KAAY,CAAA;KACvCD,KAAKE,YAAYG,QAAQ,oBAAC,MAAD;MAAM,OAAOhB,SAAOiB;MAAON,UAAAA,KAAKE,WAAWG;KAAY,CAAA,IAAI;IACjF;GACJ,CAAA,IAAA;GACHL,KAAKO,aACJ,oBAAC,MAAD;IAAM,MAAK;IAAY,QAAO;IAC5B,UAAA,oBAAC,MAAD;KAAM,OAAOlB,SAAOe;KAAQJ,UAAAA,KAAKO;IAAiB,CAAA;GAC9C,CAAA,IACJ;GACHP,KAAKQ,UAAUC,SAAS,IACvB,oBAAC,MAAD;IAAM,MAAK;IAAY,QAAO;IAC5B,UAAA,oBAAC,MAAD;KAAM,OAAOpB,SAAOe;KAAQJ,UAAAA,KAAKQ,UAAUE,KAAKC,OAAO,IAAIA,IAAI,CAAC,CAACC,KAAK,IAAI;IAAQ,CAAA;GAC9E,CAAA,IACJ;GACHZ,KAAKa,QACJ,oBAAC,MAAD;IAAM,MAAK;IAAQ,QAAO;IACxB,UAAA,oBAAC,MAAD;KAAM,OAAOxB,SAAOe;KAAQJ,UAAAA,KAAKa;IAAY,CAAA;GACzC,CAAA,IACJ;GACHb,KAAKc,YACJ,oBAAC,MAAD;IAAM,MAAK;IAAU,QAAO;IAC1B,UAAA,oBAAC,MAAD;KAAM,OAAOzB,SAAOe;KAAQJ,UAAAA,KAAKc;IAAgB,CAAA;GAC7C,CAAA,IACJ;EACA;;AAEV;;;;;;AAOA,SAAgBC,gBAAgB,EAC9Bf,MACAgB,WACAC,MAAMC,aACNC,MACAC,WAOC;CACD,MAAM,CAACH,MAAMI,WAAWlD,SAAwB+C,WAAW;CAC3D,MAAM,CAACI,OAAOC,YAAYpD,eAA8BM,cAAcuB,IAAI,CAAC;CAC3E,MAAM,CAACwB,SAASC,cAActD,SAAS,EAAE;CACzC,MAAM8B,QAAQD,KAAKE,YAAYD;CAC/B,MAAMyB,YAAYhD,cAAcsB,KAAKE,UAAU;CAE/C,MAAMyB,mBAAyB;EAC7B,IAAIpD,gBAAgB4C,MAAMH,WAAWhB,MAAMsB,KAAK,GAAGF,QAAQ;CAC7D;CACA,MAAMQ,sBAA4B;EAChC,IAAI,CAACJ,QAAQK,KAAK,KAAK,CAAC5B,OAAO;EAC/BzB,mBAAmB2C,MAAMH,WAAWhB,KAAKW,IAAIV,OAAOuB,OAAO;EAC3DJ,QAAQ;CACV;CAEA,OACE,oBAAC,OAAD;EACE,MAAA;EACA,eAAeU,SAAS;GACtB,IAAI,CAACA,MAAMV,QAAQ;EACrB;EAEA,UAAA,qBAAC,cAAD,EAAA,UAAA,CACE,oBAAC,aAAD;GAAa,YAAW;GACtB,UAAA,oBAAC,YAAD;IAAY,QAAO;IAAoB,oBAAoB,SAASpB,KAAKW,GAAE,IAAKX,KAAK+B;IAClF/B,UAAAA,KAAK+B;GACI,CAAA;EACD,CAAA,GACb,qBAAC,WAAD;GAAW,QAAO;GAAlB,UAAA;IACE,qBAAC,MAAD;KAAM,OAAO1C,SAAO2C;KAApB,UAAA,CACE,qBAAC,MAAD;MAAM,OAAO3C,SAAOsB;MAApB,UAAA,CAAwB,KAAEX,KAAKW,EAAS;KACxC,CAAA,GAAA,qBAAC,OAAD;MAAO,QAAO;MAAd,UAAA,CACE,oBAAC,KAAD;OAAK,MAAM/B,iBAAiBoB,KAAKgC;OAAS,OAAOhC,KAAKgC,WAAW;MAAc,CAAA,GAC9EhC,KAAKgC,OAAOC,QAAQ,KAAK,GAAG,CACxB;KACH,CAAA,CAAA;;IACLhB,SAAS,SACR,qBAAA,UAAA,EAAA,UAAA;KACE,oBAAC,MAAD;MAAM,QAAO;MAA0B,OAAOjB,KAAKkC,cAAc7C,SAAO8C,OAAO9C,SAAOiB;MACnFN,UAAAA,KAAKkC,eAAe;KACjB,CAAA;KACN,oBAAC,WAAD,EAAiBlC,KAAK,CAAA;KACtB,qBAAC,MAAD;MAAM,OAAOX,SAAO+C;MAApB,UAAA,CACGnC,QACC,oBAAC,aAAD;OACE,OAAM;OACN,SAAQ;OACR,QAAO;OACP,eAAeoB,QAAQ,SAAS;MAAE,CAAA,IAElC,MACJ,oBAAC,aAAD;OACE,OAAM;OACN,SAAQ;OACR,QAAO;OACP,eAAeA,QAAQ,MAAM;MAAE,CAAA,CAE7B;;IACR,EAAA,CAAA,IACE;IAEHJ,SAAS,SACR,qBAAA,UAAA,EAAA,UAAA;KACE,oBAAC,OAAD;MAAO,OAAM;MACX,UAAA,oBAAC,OAAD;OACE,QAAO;OACP,oBAAmB;OACnB,WAAA;OACA,OAAOK,MAAMS;OACb,eAAeA,YAAYR,SAAS;QAAE,GAAGD;QAAOS;OAAQ,CAAC;MAAE,CAAA;KAExD,CAAA;KACP,oBAAC,OAAD;MAAO,OAAM;MACX,UAAA,oBAAC,UAAD;OACE,QAAO;OACP,oBAAmB;OACnB,eAAehD;OACf,OAAOuC,MAAMY;OACb,aAAY;OACZ,eAAeA,gBAAgBX,SAAS;QAAE,GAAGD;QAAOY;OAAY,CAAC;MAAE,CAAA;KAEhE,CAAA;KACP,oBAAC,OAAD;MAAO,OAAM;MACX,UAAA,oBAAC,kBAAD;OACE,oBAAmB;OACnB,SAASpD,eAAe4B,KAAKsB,YAAY;QAAE5B,OAAO4B;QAAQ7C,OAAO6C,OAAOC,QAAQ,KAAK,GAAG;OAAE,EAAE;OAC5F,OAAOX,MAAMU;OACb,gBAAgBA,WAAW;QACzB,IAAIlD,eAAeuD,SAASL,MAAuB,GACjDT,SAAS;SAAE,GAAGD;SAAeU;QAAwB,CAAC;OAC1D;MAAE,CAAA;KAEC,CAAA;KACP,oBAAC,MAAD;MAAM,OAAO3C,SAAOiB;MAAM,UAAA;KAA4D,CAAA;KACtF,qBAAC,MAAD;MAAM,OAAOjB,SAAO+C;MAApB,UAAA,CACE,oBAAC,aAAD;OAAa,OAAM;OAAS,SAAQ;OAAQ,QAAO;OAAqB,SAAShB;MAAQ,CAAA,GACzF,oBAAC,aAAD;OAAa,OAAM;OAAO,SAAQ;OAAU,QAAO;OAAmB,SAASO;MAAW,CAAA,CACtF;;IACR,EAAA,CAAA,IACE;IAEHV,SAAS,aAAahB,QACrB,qBAAA,UAAA,EAAA,UAAA;KACE,oBAAC,OAAD;MAAO,OAAO,cAAcyB;MAC1B,UAAA,oBAAC,UAAD;OACE,QAAO;OACP,oBAAmB;OACnB,WAAA;OACA,eAAe1C;OACf,OAAOwC;OACP,aAAY;OACZ,cAAcC;MAAW,CAAA;KAEtB,CAAA;KACP,oBAAC,MAAD;MAAM,OAAOpC,SAAOiB;MAAM,UAAA;KAA+C,CAAA;KACzE,qBAAC,MAAD;MAAM,OAAOjB,SAAO+C;MAApB,UAAA,CACE,oBAAC,aAAD;OAAa,OAAM;OAAS,SAAQ;OAAQ,QAAO;OAAqB,SAAShB;MAAQ,CAAA,GACzF,oBAAC,aAAD;OAAa,OAAM;OAAO,SAAQ;OAAU,QAAO;OAAmB,SAASQ;MAAc,CAAA,CACzF;;IACR,EAAA,CAAA,IACE;GACK;EACC,CAAA,CAAA,EAAA,CAAA;CACT,CAAA;AAEX;AAEA,MAAMvC,WAASjB,WAAWkE,QAAQC,WAAW;CAC3CjD,OAAO;EAAEkD,KAAKD,MAAME,QAAQ,GAAG;EAACC,mBAAA,CAAA,CAAA;CAAC;CACjCV,QAAQ;EAAEW,eAAe;EAAOC,YAAY;EAAUJ,KAAKD,MAAME,QAAQ,CAAC;EAACC,mBAAA,CAAA,CAAA;CAAC;CAC5E/B,IAAI;EAAEkC,UAAUN,MAAMM,SAASC;EAAIC,YAAYR,MAAMQ,WAAWD;EAAIE,OAAOT,MAAMU,OAAOC;EAAKR,mBAAA,CAAA,CAAA;CAAC;CAC9FP,MAAM;EAAEU,UAAUN,MAAMM,SAASM;EAAMJ,YAAYR,MAAMQ,WAAWK;EAAIJ,OAAOT,MAAMU,OAAOI;EAAIX,mBAAA,CAAA,CAAA;CAAC;CACjGvC,OAAO;EAAEqC,KAAKD,MAAME,QAAQ,GAAG;EAACC,mBAAA,CAAA,CAAA;CAAC;CACjChD,MAAM;EAAEiD,eAAe;EAAOC,YAAY;EAAUJ,KAAKD,MAAME,QAAQ,CAAC;EAACC,mBAAA,CAAA,CAAA;CAAC;CAC1ElD,MAAM;EACJ8D,OAAOf,MAAME,QAAQ,EAAE;EACvBI,UAAUN,MAAMM,SAASM;EACzBJ,YAAYR,MAAMQ,WAAWI;EAC7BH,OAAOT,MAAMU,OAAOM;EAAGb,mBAAA,CAAA,CAAA;CACzB;CACA/C,WAAW;EAAE6D,MAAM;EAAGb,eAAe;EAAOC,YAAY;EAAUa,UAAU;EAAQjB,KAAKD,MAAME,QAAQ,GAAG;EAACC,mBAAA,CAAA,CAAA;CAAC;CAC5GtC,OAAO;EAAEyC,UAAUN,MAAMM,SAASM;EAAMJ,YAAYR,MAAMQ,WAAWI;EAAMH,OAAOT,MAAMU,OAAOI;EAAIX,mBAAA,CAAA,CAAA;CAAC;CACpGpC,MAAM;EAAEuC,UAAUN,MAAMM,SAASC;EAAIC,YAAYR,MAAMQ,WAAWD;EAAIE,OAAOT,MAAMU,OAAOM;EAAGb,mBAAA,CAAA,CAAA;CAAC;CAC9FN,QAAQ;EAAEO,eAAe;EAAOe,gBAAgB;EAAYlB,KAAKD,MAAME,QAAQ,CAAC;EAACC,mBAAA,CAAA,CAAA;CAAC;AACpF,EAAE;;;AChPF,SAASiD,SAASC,QAAqC;CACrD,OAAOA,WAAW,eAAeA,WAAW,WAAW,QAAQ;AACjE;;AAGA,SAASC,gBAAgBC,WAAqC;CAC5D,MAAMC,YAAYnB,aAAaoB,aAAyB;EACtD,MAAMC,eAAed,MAAMe,MAAMH,UAAUC,QAAQ;EACnD,aAAaC,aAAaE,YAAY;CACxC,GAAG,CAAA,CAAE;CACL,OAAOrB,qBAAqBiB,iBAAiBZ,MAAMiB,OAAOjB,MAAMe,MAAMG,OAAOP,SAAS,CAAC,CAACX,KAAK;AAC/F;AAEA,SAASmB,QAAQ,EACfC,MACAT,WACAU,kBACAC,aAMC;CACD,MAAMC,QAAQH,KAAKX,WAAW,gBAAgBW,KAAKI,aAAaC,KAAAA;CAChE,MAAMC,QAAQ3B,cAAcqB,KAAKO,UAAU;CAE3C,MAAMO,SAAS,CAACX,OADFH,KAAKS,UAAUC,SAAS,IAAI,aAAaV,KAAKS,UAAUE,KAAKC,OAAO,IAAIA,IAAI,CAAC,CAACC,KAAK,IAAI,MAAM,EAC/E,CAAC,CAACE,OAAOC,OAAO,CAAC,CAACH,KAAK,KAAK;CACxD,OACE,oBAAC,MAAD;EAAM,QAAQ,iBAAiBb,KAAKY;EAClC,UAAA,oBAAC,SAAD;GACE,SAAS,oBAAC,KAAD;IAAK,MAAM7B,iBAAiBiB,KAAKX;IAAS,OAAOW,KAAKX,WAAW;GAAc,CAAA;GACxF,OACE,oBAAC,QAAD;IACE,SAAQ;IACR,QAAQ,uBAAuBW,KAAKY;IACpC,oBAAoBZ,KAAKiB;IACzB,eAAef,UAAU,MAAM;IAC/B,OAAOgB,SAAOC;IAEd,UAAA,qBAAC,MAAD;KAAM,eAAe;KAAG,OAAOD,SAAOE,MAAMhC,SAASY,KAAKX,MAAM,CAAC;KAAjE,UAAA;MACE,qBAAC,MAAD;OAAM,OAAO6B,SAAON;OAApB,UAAA,CAAwB,KAAEZ,KAAKY,EAAS;;MAAC;MAAEZ,KAAKiB;KAC5C;;GACA,CAAA;GAEV,aACEX,SAASQ,SACP,qBAAC,MAAD;IAAM,OAAOI,SAAOG;IAApB,UAAA;KACGf,QAAQ,oBAAC,aAAD;MAAa,MAAMA;MAAO,MAAK;KAAI,CAAA,IAAM;KACjDA,QAAQ,oBAAC,MAAD;MAAM,OAAOY,SAAOZ;MAAQA,UAAAA;KAAY,CAAA,IAAI;KACpDQ,SACC,oBAAC,MAAD;MAAM,eAAe;MAAG,OAAOI,SAAOI;MACnCR,UAAAA;KACG,CAAA,IACJ;IACA;GACJT,CAAAA,IAAAA,KAAAA;GAEN,UACEL,KAAKX,WAAW,eAAeW,KAAKX,WAAW,YAC7C,qBAAC,cAAD,EAAA,UAAA,CACE,oBAAC,qBAAD;IACE,SAAQ;IACR,MAAK;IACL,QAAQ,sBAAsBW,KAAKY;IACnC,oBAAoB,SAASZ,KAAKY,GAAE;IAEpC,UAAA,oBAAC,WAAD,CAAU,CAAA;GACS,CAAA,GACrB,qBAAC,qBAAD,EAAA,UAAA;IACE,qBAAC,kBAAD;KAAkB,gBAAgBV,UAAU,MAAM;KAAlD,UAAA,CACE,oBAAC,UAAD,CAAS,CAAA,GAAA,MAEO;;IACjBI,QACC,qBAAC,kBAAD;KAAkB,gBAAgBJ,UAAU,SAAS;KAArD,UAAA,CACE,oBAAC,aAAD,CAAY,CAAA,GAAA,eAEI;IAChB,CAAA,IAAA;IACJ,qBAAC,kBAAD;KACE,SAAQ;KACR,gBAAgBxB,mBAAmBuB,kBAAkBV,WAAWS,KAAKY,EAAE;KAFzE,UAAA,CAIE,oBAAC,WAAD,EAAW,OAAM,MAAK,CAAA,GAAA,QAEN;;GACC,EAAA,CAAA,CACT,EAAA,CAAA,IACZP,KAAAA;EACL,CAAA;CAEC,CAAA;AAEV;;;;;;;AAQA,SAAgBkB,qBAAqB,EAAEhC,WAAWU,oBAAwC;CACxF,MAAMuB,eAAelC,gBAAgBC,SAAS;CAC9C,MAAM,CAACkC,aAAaC,kBAAkBpD,SAAS,KAAK;CACpD,MAAM,CAACqD,OAAOC,YAAYtD,SAAqB;CAC/C,IAAIiB,cAAc,QAAQiC,aAAad,WAAW,GAAG,OAAO;CAE5D,MAAMmB,SAASL,aAAaT,QAAQf,SAASA,KAAKX,WAAW,aAAaW,KAAKX,WAAW,aAAa;CACvG,MAAMyC,UAAUN,aAAaT,QAAQf,SAASA,KAAKX,WAAW,eAAeW,KAAKX,WAAW,QAAQ;CACrG,MAAM0C,SAASD,QAAQf,QAAQf,SAASA,KAAKX,WAAW,QAAQ,CAAC,CAACqB;CAClE,MAAMsB,OAAOF,QAAQpB,SAASqB;CAC9B,MAAME,QAAQJ,OAAOnB,SAASoB,QAAQpB;CACtC,MAAMwB,YAAYP,QAAQH,aAAaW,MAAMnC,SAASA,KAAKY,OAAOe,MAAMzC,MAAM,IAAImB,KAAAA;CAClF,MAAM+B,OAAOpC,SACX,oBAAC,SAAD;EAEQA;EACKT;EACOU;EAClB,YAAYd,SAASyC,SAAS;GAAE1C,QAAQc,KAAKY;GAAIzB;EAAK,CAAC;CAAE,GAJpDa,KAAKY,EAI+C;CAG7D,OACE,qBAAC,MAAD;EAAM,OAAOM,SAAOmB;EAApB,UAAA;GACGJ,QAAQ,IACP,qBAAC,MAAD;IACE,QAAO;IACP,YAAA;IACA,mBAAkB;IAClB,oBAAoB;KAAEK,KAAK;KAAGC,KAAKN;KAAOO,KAAKR;IAAK;IACpD,OAAOd,SAAOuB;IALhB,UAAA,CAOE,qBAAC,MAAD;KAAM,OAAOvB,SAAOI;KAApB,UAAA;MACGU;MAAK;MAAKC;MAAM;KACb;IAEN,CAAA,GAAA,oBAAC,MAAD;KAAM,OAAOf,SAAOwB;KAClB,UAAA,oBAAC,MAAD,EAAM,OAAO,CAACxB,SAAOyB,MAAM,EAAEC,OAAO,GAAIZ,OAAOC,QAAS,IAAG,GAAI,CAAC,EAAE,CAAA;IAC9D,CAAA,CACF;GACJ,CAAA,IAAA;GACHJ,OAAOnB,SAAS,IAAI,oBAAC,MAAD;IAAM,OAAOQ,SAAO2B;IAAQhB,UAAAA,OAAOlB,IAAIyB,GAAG;GAAQ,CAAA,IAAI;GAC1EN,QAAQpB,SAAS,IAChB,qBAAC,MAAD;IAAM,OAAOQ,SAAO2B;IAApB,UAAA,CACE,qBAAC,QAAD;KACE,SAAQ;KACR,QAAO;KACP,oBAAoB,EAAEC,UAAUrB,YAAY;KAC5C,eAAeC,gBAAgBqB,SAAS,CAACA,IAAI;KAC7C,OAAO7B,SAAO8B;KALhB,UAAA;MAOE,oBAAA,UAAA,EAAA,UAAGvB,cAAc,oBAAC,iBAAD,CAAgB,CAAA,IAAM,oBAAC,kBAAD,CAAiB,CAAA,EAAI,CAAA;MAC5D,oBAAC,MAAD;OAAM,OAAOP,SAAO+B;OAAc,UAAA;MAAc,CAAA;MAChD,oBAAC,OAAD,EAAA,UAAQnB,QAAQpB,OAAc,CAAA;MAC7BqB,SAAS,IAAI,qBAAC,MAAD;OAAM,OAAOb,SAAOa;OAApB,UAAA,CAA6BA,QAAO,SAAa;MAAI,CAAA,IAAA;KAC7D;IACPN,CAAAA,GAAAA,cAAc,oBAAC,MAAD;KAAM,OAAOP,SAAO2B;KAAQf,UAAAA,QAAQnB,IAAIyB,GAAG;IAAQ,CAAA,IAAI,IAClE;GACJ,CAAA,IAAA;GACHT,SAASO,YACR,oBAAC,iBAAD;IAEE,MAAMA;IACK3C;IACX,MAAMoC,MAAMxC;IACZ,MAAMc;IACN,eAAe2B,SAASvB,KAAAA,CAAS;GAAE,GAL9B,GAAG6B,UAAUtB,GAAE,GAAIe,MAAMxC,MAKK,IAEnC;EACA;;AAEV;AAEA,MAAM+B,WAAS1C,WAAW0E,QAAQC,WAAW;CAC3Cd,SAAS;EACPe,KAAKD,MAAME,QAAQ,CAAC;EAACC,mBAAA,CAAA,CAAA;CACvB;CACAT,OAAO;EACLO,KAAKD,MAAME,QAAQ,EAAG;EAACC,mBAAA,CAAA,CAAA;CACzB;CACAb,UAAU;EACRW,KAAKD,MAAME,QAAQ,GAAG;EACtBE,mBAAmBJ,MAAME,QAAQ,CAAC;EAACC,mBAAA,CAAA,CAAA;CACrC;CACAZ,OAAO;EACLc,QAAQL,MAAME,QAAQ,CAAC;EACvBI,cAAcN,MAAMM,aAAaC;EACjCC,UAAU;EACVC,iBAAiBT,MAAMU,OAAOC;EAAIR,mBAAA,CAAA,CAAA;CACpC;CACAX,MAAM;EACJa,QAAQ;EACRI,iBAAiBT,MAAMU,OAAOE;EAAKT,mBAAA,CAAA,CAAA;CACrC;CACAjC,MAAM;EACJ2C,eAAe;EACfC,YAAY;EACZb,KAAKD,MAAME,QAAQ,GAAG;EAACC,mBAAA,CAAA,CAAA;CACzB;CACAnC,aAAa;EACXqC,QAAQ;EACRU,gBAAgB;EAChBX,mBAAmB;EACnBY,iBAAiBhB,MAAME,QAAQ,EAAG;EAACC,mBAAA,CAAA,CAAA;CACrC;CACAlC,QAAQgD,SAAmB;EACzBC,UAAUlB,MAAMkB,SAASC;EACzBC,YAAYpB,MAAMoB,WAAWD;EAC7BE,YAAY;EACZC,OAAOtB,MAAMU,OAAOO;EAAId,mBAAA,CAAA,CAAA;CAC1B;CACA1C,IAAI;EACFyD,UAAUlB,MAAMkB,SAASK;EACzBD,OAAOtB,MAAMU,OAAOc;EAAKrB,mBAAA,CAAA,CAAA;CAC3B;CACAhD,OAAO;EACL+D,UAAUlB,MAAMkB,SAASK;EACzBH,YAAYpB,MAAMoB,WAAWG;EAC7BD,OAAOtB,MAAMU,OAAOe;EAAItB,mBAAA,CAAA,CAAA;CAC1B;CACAhC,MAAM;EACJuD,YAAY;EACZR,UAAUlB,MAAMkB,SAASK;EACzBH,YAAYpB,MAAMoB,WAAWG;EAC7BD,OAAOtB,MAAMU,OAAOiB;EAAGxB,mBAAA,CAAA,CAAA;CACzB;CACAvB,QAAQ;EACNsC,UAAUlB,MAAMkB,SAASK;EACzBH,YAAYpB,MAAMoB,WAAWG;EAC7BD,OAAOtB,MAAMU,OAAOkB;EAAGzB,mBAAA,CAAA,CAAA;CACzB;CACAN,eAAe;EACbgB,eAAe;EACfC,YAAY;EACZC,gBAAgB;EAChBd,KAAKD,MAAME,QAAQ,GAAG;EACtB2B,WAAW7B,MAAME,QAAQ,EAAE;EAC3BE,mBAAmBJ,MAAME,QAAQ,CAAC;EAClCI,cAAcN,MAAMM,aAAawB;EAAE3B,mBAAA,CAAA,CAAA;CACrC;CACAL,cAAc;EACZoB,UAAUlB,MAAMkB,SAASK;EACzBH,YAAYpB,MAAMoB,WAAWG;EAC7BF,YAAY;EACZC,OAAOtB,MAAMU,OAAOiB;EAAGxB,mBAAA,CAAA,CAAA;CACzB;AACF,EAAE;;;ACtRF,IAAA,sCAAe,WAAW,EAAE,WAAW,qBAAqB,CAAC;;;;;;;;;ACQ7D,MAAa,eAA2C;CACtD,SAAS;CACT,aAAa;CACb,WAAW;CACX,QAAQ;CACR,SAAS;AACX;AAEA,MAAa,eAA2C;CACtD,SAAS;CACT,aAAa;CACb,WAAW;CACX,QAAQ;CACR,SAAS;AACX;AAEA,MAAa,eAA2C;CACtD,QAAQ;CACR,QAAQ;CACR,KAAK;CACL,MAAM;CACN,OAAO;CACP,QAAQ;CACR,QAAQ;AACV;;;;;;AAOA,MAAM,sBAAsB;AAC5B,MAAM,sBAAsB;;AAE5B,MAAM,uBAAuB;AAC7B,MAAM,gBAAuC;CAAC;CAAW;CAAe;CAAa;CAAU;AAAS;AACxG,MAAM,eAAsC;CAAC;CAAU;CAAQ;CAAO;CAAU;CAAS;CAAU;AAAQ;AAC3G,MAAM,oBAAoB;AAsB1B,SAAS,SAAS,OAAkD;CAClE,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,SAAS,OAAqC;CACrD,OAAO,OAAO,UAAU,YAAa,cAAoC,SAAS,KAAK;AACzF;AAEA,SAAS,SAAS,OAAqC;CACrD,OAAO,OAAO,UAAU,YAAa,aAAmC,SAAS,KAAK;AACxF;AAEA,SAAS,SAAS,OAAiC;CACjD,IAAI,CAAC,SAAS,KAAK,KAAK,OAAO,MAAM,OAAO,YAAY,OAAO,MAAM,YAAY,UAAU,OAAO;CAClG,IAAI,CAAC,SAAS,MAAM,MAAM,GAAG,OAAO;CACpC,MAAM,OAAiB;EAAE,IAAI,MAAM;EAAI,SAAS,MAAM;EAAS,QAAQ,MAAM;CAAO;CACpF,IAAI,OAAO,MAAM,eAAe,UAAU,KAAK,aAAa,MAAM;CAClE,IAAI,MAAM,QAAQ,MAAM,SAAS,GAC/B,KAAK,YAAY,MAAM,UAAU,QAAQ,OAAqB,OAAO,OAAO,QAAQ;CAEtF,IAAI,SAAS,MAAM,UAAU,GAAG;EAC9B,KAAK,aAAa,CAAC;EACnB,IAAI,OAAO,MAAM,WAAW,UAAU,UAAU,KAAK,WAAW,QAAQ,MAAM,WAAW;EACzF,IAAI,OAAO,MAAM,WAAW,aAAa,UAAU,KAAK,WAAW,WAAW,MAAM,WAAW;EAC/F,IAAI,OAAO,MAAM,WAAW,UAAU,UAAU,KAAK,WAAW,QAAQ,MAAM,WAAW;CAC3F;CACA,OAAO;AACT;AAEA,SAAS,OAAO,OAA0B;CACxC,OAAO,MAAM,QAAQ,KAAK,IAAI,MAAM,QAAQ,OAAqB,OAAO,OAAO,QAAQ,IAAI,CAAC;AAC9F;;AAGA,SAAgB,gBAAgB,SAA0C;CACxE,IAAI,CAAC,SAAS,OAAO,KAAK,CAAC,SAAS,QAAQ,MAAM,KAAK,CAAC,MAAM,QAAQ,QAAQ,KAAK,GAAG,OAAO;CAC7F,MAAM,OAAwB;EAC5B,QAAQ,QAAQ;EAChB,QAAQ,SAAS,QAAQ,MAAM,IAAI,QAAQ,SAAS,CAAC;EACrD,OAAO,QAAQ,MAAM,IAAI,QAAQ,CAAC,CAAC,QAAQ,SAA2B,SAAS,IAAI;CACrF;CACA,IAAI,OAAO,QAAQ,UAAU,UAAU,KAAK,QAAQ,QAAQ;CAC5D,IAAI,SAAS,QAAQ,MAAM,GACzB,KAAK,SAAS;EACZ,SAAS,OAAO,QAAQ,OAAO,OAAO;EACtC,QAAQ,OAAO,QAAQ,OAAO,WAAW,WAAW,QAAQ,OAAO,SAAS;CAC9E;CAEF,IAAI,SAAS,QAAQ,UAAU,GAC7B,KAAK,aAAa;EAChB,UAAU,OAAO,QAAQ,WAAW,QAAQ;EAC5C,QAAQ,OAAO,QAAQ,WAAW,WAAW,WAAW,QAAQ,WAAW,SAAS;CACtF;CAEF,OAAO;AACT;;AAGA,SAAS,QAAQ,OAAwB;CACvC,OAAO,OAAO,UAAU,YAAY,OAAO,UAAU,WAAW,IAAI,UAAU;AAChF;;AAGA,SAAS,WAAW,MAAsB;CACxC,OAAO,KAAK,QAAQ,mBAAmB,GAAG,CAAC,CAAC,KAAK;AACnD;AAcA,SAAS,YAAY,OAAmD;CACtE,IAAI,MAAM,WAAW,GAAG,OAAO,aAAa;CAC5C,IAAI,MAAM,OAAO,SAAS,KAAK,OAAO,KAAA,CAAS,GAAG,OAAO;CACzD,IAAI,MAAM,OAAO,SAAS,KAAK,OAAO,KAAA,CAAS,GAAG,OAAO;CACzD,OAAO,aAAa;AACtB;;;;;AAMA,SAAgB,aAAa,MAA6C;CACxE,MAAM,SAAS,OAAO,KAAK,WAAW,WAAW,KAAK,SAAS;CAC/D,IAAI,CAAC,SAAS,MAAM,GAAG,OAAO;EAAE,OAAO;EAAK;EAAQ,aAAa;CAAM;CACvE,MAAM,QAAQ,WAAW,YAAY,MAAM,QAAQ,KAAK,KAAK,IAAI,KAAK,MAAM,OAAO,QAAQ,IAAI,CAAC;CAChG,MAAM,OAAqB;EACzB,OAAO,WAAW,WAAW,YAAY,KAAK,IAAI,aAAa;EAC/D;EACA,aAAa;CACf;CAEA,IAAI,WAAW,UAAU;EAGvB,IAAI,MAAM,WAAW,GAAG;GACtB,MAAM,OAAO,MAAM,MAAM,CAAC;GAC1B,IAAI,KAAK,OAAO,KAAA,GACV;QAAA,OAAO,KAAK,YAAY,UAAU,KAAK,UAAU,WAAW,KAAK,OAAO;GAAA,OACvE;IACL,KAAK,UAAU,OAAO,KAAK,YAAY,WAAW,WAAW,KAAK,OAAO,IAAI,QAAQ,KAAK,EAAE;IAC5F,KAAK,cAAc;GACrB;EACF,OAAO,IAAI,MAAM,SAAS,GACxB,KAAK,UAAU,GAAG,MAAM,OAAO;CAEnC,OAAO,IAAI,WAAW,UAAU;EAC9B,MAAM,cAAc,MAAM,QAAQ,KAAK,WAAW,IAAI,KAAK,YAAY,OAAO,QAAQ,IAAI,CAAC;EAC3F,IAAI,YAAY,WAAW,GAAG;GAC5B,MAAM,OAAO,YAAY,MAAM,CAAC;GAChC,KAAK,UAAU,QAAQ,KAAK,EAAE;GAC9B,KAAK,cAAc;GACnB,IAAI,OAAO,KAAK,UAAU,UAAU,KAAK,SAAS,KAAK,KAAK;EAC9D,OAAO,IAAI,YAAY,SAAS,GAC9B,KAAK,UAAU,GAAG,YAAY,OAAO;CAEzC,OAAO,KAAK,WAAW,SAAS,WAAW,YAAY,WAAW,aAAa,KAAK,OAAO,KAAA,GAAW;EACpG,KAAK,UAAU,QAAQ,KAAK,EAAE;EAC9B,KAAK,cAAc;CACrB,OAAO,IAAI,WAAW,UAAU,SAAS,KAAK,MAAM,GAClD,KAAK,SAAS,aAAa,KAAK;CAElC,OAAO;AACT;AAwBA,SAAgB,QAAQ,MAAyB;CAC/C,MAAM,MAAe;EACnB,IAAI,KAAK;EACT,OAAO,aAAa,KAAK;EACzB,SAAS,WAAW,KAAK,OAAO;EAChC,QAAQ,KAAK;EACb,QAAQ,KAAK,WAAW,eAAe,KAAK,WAAW;EACvD,WAAW,KAAK,aAAa,CAAC;CAChC;CACA,MAAM,QAAQ,cAAc,KAAK,UAAU;CAC3C,IAAI,OAAO,IAAI,QAAQ,WAAW,KAAK;CACvC,IAAI,KAAK,WAAW,iBAAiB,KAAK,YAAY,IAAI,aAAa,WAAW,KAAK,UAAU;CACjG,OAAO;AACT;AAEA,SAAS,cAAc,MAAwB;CAC7C,OAAO,KAAK,MAAM,IAAI,CAAC,CAAC,QAAQ,SAAS,KAAK,KAAK,CAAC,CAAC,SAAS,CAAC;AACjE;;;;;;AAOA,SAAS,YAAY,SAAsC;CACzD,IAAI,OAAO,QAAQ;CACnB,IAAI,QAAQ,OAAO,mBAAmB,MAAM,OAAO,KAAK,QAAQ,SAAS,KAAK,WAAW,SAAS;CAClG,IAAI,SAAS,QAAQ,OAAO,MAAM,GAAG,OAAO,KAAK,QAAQ,SAAS,KAAK,WAAW,QAAQ,OAAO,MAAM;CACvG,OAAO;AACT;AAEA,SAAS,MAAM,SAA0B,KAAoC;CAC3E,OAAO,IAAI,SAAS,OAAO,QAAQ,MAAM,MAAM,SAAS,KAAK,OAAO,EAAE,KAAK,CAAC,CAAC;AAC/E;AAEA,SAAS,MACP,OACA,QACA,MACA,UACyC;CAGzC,IAAI,MAAM,WAAW,KAAK,WAAW,GAAG,OAAO;EAAE,MAAM,CAAC,QAAQ,MAAM,EAAc,CAAC;EAAG,QAAQ;CAAK;CACrG,MAAM,QAAQ,WAAW,QAAQ,MAAM,MAAM,GAAG,oBAAoB;CACpE,IAAI,UAAU,GAAG,MAAM,OAAO,GAAG;CACjC,IAAI,SAAS,GAAG,WAAW,MAAM,OAAO;CACxC,IAAI,MAAM,SAAS,MAAM,QAAQ,WAAW,MAAM,MAAM,SAAS,MAAM,OAAO;CAC9E,OAAO;EACL,MAAM,MAAM,IAAI,OAAO;EACvB,QAAQ;GAAE,OAAO,SAAS,IAAI,MAAM;GAAK,MAAM,SAAS,IAAI,YAAY;GAAM,MAAM;EAAQ;CAC9F;AACF;AAEA,SAAgB,eAAe,OAMZ;CACjB,MAAM,UAAU,gBAAgB,MAAM,OAAO;CAG7C,IAAI,MAAM,WAER,OAAO;EAAE,MAAM,CAAC;EAAG,YAAY,CAAC;EAAG,QAAQ;GAAE,OAAO;GAAK,MAAM;GAAW,MAD7D,cAAc,MAAM,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK;EAC4B;CAAE;CAKnF,IAAI,MAAM,WAAW,SAAS,UAAU,KAAA,GAAW;EACjD,MAAM,MAAM,cAAc,SAAS,SAAS,MAAM,MAAM;EACxD,IAAI,IAAI,UAAU,GAAG,OAAO;GAAE,MAAM,CAAC;GAAG,YAAY,CAAC;GAAG,QAAQ;IAAE,OAAO;IAAK,MAAM;IAAS,MAAM,IAAI,MAAM;GAAG;EAAE;EAElH,OAAO;GAAE,MAAM,CAAC;GAAG,YADA,MAAM,WAAW,MAAM,IAAI,MAAM,GAAG,oBAAoB;GAC5C,QAAQ;IAAE,OAAO;IAAK,MAAM;IAAS,MAAM;GAAG;EAAE;CACjF;CAEA,IAAI,YAAY,MAAM,OAAO;EAAE,MAAM,CAAC;EAAG,YAAY,CAAC;EAAG,QAAQ;GAAE,OAAO;GAAK,MAAM;GAAM,MAAM;EAAG;CAAE;CAEtG,IAAI,QAAQ,WAAW,QAAQ;EAC7B,MAAM,QAAQ,YAAY,OAAO;EACjC,MAAM,QAAQ,MAAM,WAAW,QAAQ,MAAM,MAAM,GAAG,oBAAoB;EAC1E,IAAI,UAAU,MAAM,WAAW,IAAI,aAAa,GAAG,MAAM,OAAO,OAAO,MAAM,WAAW,IAAI,KAAK;EACjG,IAAI,MAAM,SAAS,MAAM,QAAQ,WAAW,MAAM,MAAM,SAAS,MAAM,OAAO;EAC9E,OAAO;GAAE,MAAM,MAAM,IAAI,OAAO;GAAG,YAAY,CAAC;GAAG,QAAQ;IAAE,OAAO;IAAK,MAAM;IAAM,MAAM;GAAQ;EAAE;CACvG;CAEA,IAAI,QAAQ,WAAW,SACrB,OAAO;EAAE,MAAM,CAAC;EAAG,YAAY,CAAC;EAAG,QAAQ;GAAE,OAAO;GAAK,MAAM;GAAM,MAAM;EAAU;CAAE;CAGzF,IAAI,QAAQ,WAAW,YAAY,QAAQ,YAEzC,OAAO;EAAE,YAAY,CAAC;EAAG,GAAG,MADX,MAAM,SAAS,QAAQ,WAAW,QACV,GAAG,QAAQ,WAAW,QAAQ,YAAY,MAAM,QAAQ;CAAE;CAGrG,IAAI,QAAQ,WAAW,UAErB,OAAO;EAAE,YAAY,CAAC;EAAG,GAAG,MADZ,MAAM,SAAS,QAAQ,QAAQ,WAAW,CAAC,CACnB,GAAG,QAAQ,QAAQ,UAAU,GAAG,WAAW,MAAM,QAAQ;CAAE;CAIrG,MAAM,KAAK,QAAQ,OAAO;CAC1B,MAAM,OAAO,OAAO,OAAO,WAAW,QAAQ,MAAM,MAAM,cAAc,UAAU,OAAO,EAAE,IAAI,KAAA;CAC/F,IAAI,CAAC,MAAM,OAAO;EAAE,MAAM,CAAC;EAAG,YAAY,CAAC;EAAG,QAAQ;GAAE,OAAO;GAAK,MAAM;GAAM,MAAM;EAAG;CAAE;CAC3F,OAAO;EAAE,MAAM,CAAC,QAAQ,IAAI,CAAC;EAAG,YAAY,CAAC;EAAG,QAAQ;CAAK;AAC/D;;;;ACjTA,MAAMgD,aAAoD;CACxDG,SAAS;CACTC,aAAa;CACbC,WAAW;CACXC,QAAQ;CACRC,SAAS;AACX;AAEA,MAAMC,WAAqD;CACzDC,KAAK;CACLC,QAAQ;AACV;AAEA,MAAMC,cAAkD;CACtDC,SAAS;CACTC,IAAI;CACJC,OAAO;CACPC,SAAS;AACX;;AAGA,SAASC,YAAY,EAAEC,OAAyB;CAC9C,MAAMC,QAAQD,IAAIE,UAAUC,SAAS,IAAI,aAAaH,IAAIE,UAAUE,KAAKC,OAAO,IAAIA,IAAI,CAAC,CAACC,KAAK,IAAI,MAAM;CACzG,MAAMC,OAAO;EAACP,IAAIQ;EAAOR,IAAIS;EAAYR;CAAK,CAAC,CAACS,OAAOC,OAAO,CAAC,CAACL,KAAK,KAAK;CAC1E,OACE,qBAAC,MAAD;EACE,QAAO;EACP,YAAA;EACA,oBAAoB,SAASN,IAAIK,GAAE,IAAKL,IAAIY,QAAO,IAAKrC,aAAayB,IAAIa;EACzE,OAAOC,OAAOd;EAJhB,UAAA,CAME,oBAAC,KAAD;GAAK,MAAMjB,WAAWiB,IAAIa;GAAS,OAAOb,IAAIa,WAAW;GAAe,OAAOC,OAAOC;EAAI,CAAA,GAC1F,qBAAC,MAAD;GAAM,OAAOD,OAAOE;GAApB,UAAA,CACE,qBAAC,MAAD;IAAM,eAAe;IAAG,OAAO,CAACF,OAAOG,YAAYH,OAAOI,IAAIlB,IAAImB,SAAS,QAAQ,IAAI,CAAC;IAAxF,UAAA,CACE,qBAAC,MAAD;KAAM,OAAOL,OAAOP;KAApB,UAAA;MAA0B;MAAEP,IAAIK;MAAG;KAAO;IACzCL,CAAAA,GAAAA,IAAIY,OACD;GACLL,CAAAA,GAAAA,OACC,oBAAC,MAAD;IAAM,eAAe;IAAG,OAAOO,OAAOP;IACnCA,UAAAA;GACG,CAAA,IACJ,IACA;EACF,CAAA,CAAA;;AAEV;;;;;;AAOA,SAAgBa,gBAAgB,EAAEC,MAAMC,QAAQC,QAAQ5B,SAAS6B,WAAmC;CAClG,MAAMC,OAAO7C,aAAayC,IAAI;CAC9B,MAAMK,YAAY7C,eAAe;EAAE8C,SAASL,QAAQK;EAASJ;EAAQK,UAAU;EAAOC,WAAWlC;EAAS6B;CAAQ,CAAC;CACnH,MAAMM,OAAOjD,eAAe;EAAE8C,SAASL,QAAQK;EAASJ;EAAQK,UAAU;EAAMC,WAAWlC;EAAS6B;CAAQ,CAAC;CAC7G,MAAMO,SAASD,KAAKE,KAAK7B,SAASuB,UAAUM,KAAK7B,UAAU2B,KAAKG,WAAW9B,SAASuB,UAAUO,WAAW9B;CACzG,OACE,oBAAC,aAAD;EAAa,QAAO;EAAY,MAAMhC,SAAS;GAAEwB;GAAS6B;EAAQ,CAAC;EAAG,YAAYO,SAAS;EACvF,WAAA,EAAEH,eAAe;GACjB,MAAMM,OAAON,WAAWE,OAAOJ;GAC/B,MAAMS,QAAQD,KAAKF,KAAK7B,WAAW,KAAK+B,KAAKD,WAAW9B,WAAW,KAAK+B,KAAKrB,WAAW;GACxF,OACE,qBAAA,UAAA,EAAA,UAAA,CACE,qBAAC,mBAAD;IAAmB,OAAM;IAAO,QAAO;IAAiB,oBAAoB,QAAQY,KAAKW;IAAzF,UAAA;KACE,qBAAC,MAAD;MAAM,OAAOtB,OAAOsB;MAApB,UAAA;OACGX,KAAKY;OAAM;OAAEZ,KAAKW;MACf;;KACLX,KAAKb,UACJ,oBAAC,MAAD;MAAM,eAAe;MAAG,OAAO,CAACE,OAAOF,SAASE,OAAOI,IAAI3B,SAASkC,KAAKa,YAAY,CAAC;MACnFb,UAAAA,KAAKb;KACF,CAAA,IACJ;KACHa,KAAKc,SAAS,oBAAC,MAAD;MAAM,OAAOzB,OAAOP;MAAOkB,UAAAA,KAAKc;KAAa,CAAA,IAAI;IAC/C;GAClBJ,CAAAA,GAAAA,QAAQ,OACP,qBAAC,iBAAD;IAAiB,QAAO;IAAxB,UAAA;KACGD,KAAKF,KAAK7B,SAAS,IAClB,oBAAC,MAAD;MAAM,OAAOW,OAAOkB;MACjBE,UAAAA,KAAKF,KAAK5B,KAAKJ,QACd,oBAAC,aAAD,EAA+BA,IAAI,GAAjBA,IAAIK,EAAa,CACpC;KACG,CAAA,IACJ;KACH6B,KAAKD,WAAW9B,SAAS,IAAI,oBAAC,WAAD,EAAW,MAAM+B,KAAKD,WAAW3B,KAAK,IAAI,EAAE,CAAA,IAAM;KAC/E,CAACsB,YAAYG,SAAS,IACrB,qBAAC,mBAAD;MAAmB,SAAA;MAAQ,oBAAoB,QAAQA,OAAM;MAA7D,UAAA,CACGA,QAAO,OACS;KACjB,CAAA,IAAA;KACHG,KAAKrB,SACJ,oBAAC,mBAAD;MACE,QAAO;MACP,MAAMnB,YAAYwC,KAAKrB,OAAO2B;MAC9B,OAAON,KAAKrB,OAAOwB;MAElBH,UAAAA,KAAKrB,OAAO4B;KACI,CAAA,IACjB;IACW;GAErB,CAAA,CAAA,EAAA,CAAA;EAEJ;CACW,CAAA;AAEjB;AAEA,MAAM3B,SAASxC,WAAWoE,QAAQC,WAAW;CAC3CP,QAAQ;EACNQ,UAAUD,MAAMC,SAASC;EACzBC,YAAYH,MAAMG,WAAWD;EAC7BE,YAAY;EACZC,OAAOL,MAAMM,OAAOR;EAAIS,mBAAA,CAAA,CAAA;CAC1B;CACAtC,SAAS;EACPuC,YAAY;EACZP,UAAUD,MAAMC,SAASC;EACzBC,YAAYH,MAAMG,WAAWD;EAC7BE,YAAY;EAAKG,mBAAA,CAAA,CAAA;CACnB;CACAE,MAAM;EACJC,KAAKV,MAAMW,QAAQ,CAAC;EAACJ,mBAAA,CAAA,CAAA;CACvB;CACAlB,MAAM;EACJqB,KAAKV,MAAMW,QAAQ,EAAG;EAACJ,mBAAA,CAAA,CAAA;CACzB;CACAlD,KAAK;EACHuD,eAAe;EACfC,YAAY;EACZH,KAAKV,MAAMW,QAAQ,CAAC;EAACJ,mBAAA,CAAA,CAAA;CACvB;CACAnC,KAAK;EACH0C,WAAWd,MAAMW,QAAQ,GAAG;EAACJ,mBAAA,CAAA,CAAA;CAC/B;CACAlC,SAAS,EACP0C,MAAM,EACR;CACAzC,YAAY;EACV2B,UAAUD,MAAMC,SAASC;EACzBC,YAAYH,MAAMG,WAAWD;EAC7BE,YAAY;EAAKG,mBAAA,CAAA,CAAA;CACnB;CACA3C,MAAM;EACJqC,UAAUD,MAAMC,SAASe;EACzBb,YAAYH,MAAMG,WAAWa;EAC7BX,OAAOL,MAAMM,OAAOzD;EAAG0D,mBAAA,CAAA,CAAA;CACzB;CACAhC,MAAM0C,WAAqB;EACzBZ,OAAOL,MAAMM,OAAOW;EAAMV,mBAAA,CAAA,CAAA;CAC5B;AACF,EAAE;;;AC/KF,IAAA,sBAAe,mBAAmB,EAAE,SAAS,gBAAgB,CAAC;;;ACK9D,MAAM,OAAU,UAAmC,UAChD,UAAU,KAAA,IAAY,KAAA,IAAY;CAAE,GAAG;CAAU,GAAI;AAAiB;AAEzE,MAAa,eAAe,mBAAmB;CAC7C,IAAI;CACJ,WAAW,EACT,IAAI,QAAyC;EAAE,OAAO,CAAC,IAAI;GAAE,MAAM;GAAQ,IAAI;EAAQ,GAAGW,yBAAS,CAAC;CAAG,EACzG;CACA,SAAS;EACP,IAAI,iBAA2D;GAAE,OAAO,CAAC,IAAI,EAAE,MAAM,QAAQ,GAAGC,oBAAkB,CAAC;EAAG;EACtH,IAAI,WAA+C;GAAE,OAAO,CAAC,IAAI,EAAE,SAAS,aAAa,GAAGC,yBAAgB,CAAC;EAAG;EAChH,IAAI,QAAyC;GAAE,OAAO,CAAC,IAAI;IAAE,MAAM;IAAkB,IAAI;GAAQ,GAAGC,mCAAU,CAAC;EAAG;EAClH,IAAI,gBAAyD;GAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,GAAGC,mBAAQ,CAAC;EAAG;CAC9G;AACF,CAAC"}
|
|
1
|
+
{"version":3,"file":"native.mjs","names":["isRecord","SessionFrameSender","AgentAvatar","Badge","Button","Dot","Input","Label","SegmentedControl","Sheet","SheetContent","SheetHeader","SheetTitle","SheetBody","Textarea","ReactNode","useState","StyleSheet","WebTask","WebTaskStatus","requestTaskEdit","requestTaskMessage","taskEditDraft","taskAgentName","TaskEditDraft","TASK_STATUS_TONE","TaskSheetMode","STATUS_CHOICES","DESCRIPTION_LINES","MESSAGE_LINES","ActionVariant","Field","label","children","styles","field","Fact","term","testID","fact","factValue","SheetAction","variant","onPress","TaskFacts","task","agent","delegation","facts","value","state","hint","activeForm","blockedBy","length","map","id","join","owner","updatedAt","TaskDetailSheet","sessionId","mode","initialMode","send","onClose","setMode","draft","setDraft","message","setMessage","agentName","submitEdit","submitMessage","trim","open","subject","status","replace","description","body","footer","includes","create","theme","gap","spacing","uni__dependencies","flexDirection","alignItems","fontSize","sm","lineHeight","color","colors","faint","base","lg","text","width","dim","flex","flexWrap","justifyContent","styles","WebPluginSlotProps","AgentAvatar","Badge","Button","ChevronDownIcon","ChevronRightIcon","Dot","DropdownMenu","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuItem","EditIcon","KebabIcon","MessageIcon","TrashIcon","ListRow","useCallback","useState","useSyncExternalStore","StyleSheet","WebTask","requestTaskRemoval","taskAgentName","tasks","TaskDetailSheet","TaskSheetMode","TASK_STATUS_TONE","TitleInk","SheetState","taskId","mode","titleInk","status","useSessionTasks","sessionId","subscribe","listener","subscription","store","unsubscribe","select","state","TaskRow","task","sendSessionFrame","openSheet","doing","activeForm","undefined","agent","delegation","waits","blockedBy","length","map","id","join","detail","filter","Boolean","subject","styles","titleButton","title","line","meta","TasksActivitySection","sessionTasks","historyOpen","setHistoryOpen","sheet","setSheet","active","history","failed","done","total","sheetTask","find","row","section","min","max","now","progress","track","fill","width","group","expanded","open","historyToggle","historyLabel","create","theme","gap","spacing","uni__dependencies","paddingHorizontal","height","borderRadius","full","overflow","backgroundColor","colors","deep","green","flexDirection","alignItems","justifyContent","paddingVertical","ink","fontSize","base","lineHeight","fontWeight","color","sm","faint","text","flexShrink","dim","red","minHeight","md","styles","ToolMessageRenderProps","MessageItem","MessageItemHeader","MessageItemBody","MessageItemStatus","Dot","CodeBlock","toolTone","StatusTone","DotTone","StyleSheet","STATUS_LABEL","TaskCallTone","TaskResultTone","TaskRow","TaskStatus","taskCallView","taskResultView","InkToken","STATUS_DOT","Readonly","Record","pending","in_progress","completed","failed","deleted","CALL_INK","dim","accent","RESULT_TONE","running","ok","error","warning","TaskRowLine","row","waits","blockedBy","length","map","id","join","meta","agent","activeForm","filter","Boolean","subject","status","styles","dot","rowText","rowSubject","ink","closed","TaskToolMessage","args","result","output","isError","call","collapsed","details","expanded","isPartial","full","hidden","rows","errorLines","view","empty","action","glyph","subjectTone","detail","tone","text","create","theme","fontSize","base","lineHeight","fontWeight","color","colors","uni__dependencies","flexShrink","body","gap","spacing","flexDirection","alignItems","marginTop","flex","sm","token","fillTasks","activityGroupTasks","channelTaskGraph","fillTasks2","toolTask"],"sources":["../../src/extensions/workspaces/(frontend)/fill/Tasks.home.native.ts","../../src/types/webTasks.ts","../../src/extensions/workspaces/sessions/(frontend)/channel/_lib/tasksModel.ts","../../src/extensions/workspaces/sessions/(frontend)/channel/_lib/tasksStore.native.ts","../../src/extensions/workspaces/sessions/(frontend)/activity-group/tasks.native.ts","../../src/extensions/workspaces/sessions/(frontend)/channel/task-graph.native.ts","../../src/extensions/workspaces/sessions/(frontend)/fill/_lib/taskStatusTone.ts","../../src/extensions/workspaces/sessions/(frontend)/fill/_lib/TaskDetailSheet.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/fill/_lib/TasksActivitySection.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/fill/Tasks.activity.tasks.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/_lib/taskToolFormat.ts","../../src/extensions/workspaces/sessions/(frontend)/tool/_lib/TaskToolMessage.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/task.native.tsx","../../generated/native.ts"],"sourcesContent":["import { defineFill } from '@agimon-ai/po-core/native';\n\nexport default defineFill({ data: { version: 1, label: 'Tasks', source: 'task_graph', destination: 'tasks' } });\n","/** Browser-safe task view published by the cockpit hub channel. */\nexport const TASKS_CHANNEL_TYPE = 'task_graph';\n\nexport type WebTaskStatus = 'pending' | 'in_progress' | 'completed' | 'failed' | 'deleted';\n\nexport interface WebTask {\n id: number;\n subject: string;\n description?: string;\n activeForm?: string;\n status: WebTaskStatus;\n blockedBy: number[];\n owner?: string;\n updatedAt?: string;\n delegation?: {\n agent?: string;\n identity?: string;\n state?: string;\n };\n}\n\nexport interface WebTasksPayload {\n tasks: WebTask[];\n rev: number;\n}\n","/*\n * The task graph's store-free half: payload parsing and the prompts a cockpit\n * edit becomes. It holds no runtime import, so the web store (tasksStore.ts)\n * and the native store (tasksStore.native.ts) share it unchanged.\n */\nimport type { SessionFrameSender } from '@agimon-ai/po-core/web';\n\nimport type { WebTask, WebTasksPayload } from '../../../../../../types/webTasks';\n\nexport interface TasksSession {\n tasks: WebTask[];\n rev: number;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction parseTask(value: unknown): WebTask | null {\n if (!isRecord(value) || typeof value.id !== 'number' || typeof value.subject !== 'string') return null;\n if (!['pending', 'in_progress', 'completed', 'failed'].includes(String(value.status))) return null;\n const task: WebTask = {\n id: value.id,\n subject: value.subject,\n status: value.status as WebTask['status'],\n blockedBy: Array.isArray(value.blockedBy)\n ? value.blockedBy.filter((id): id is number => typeof id === 'number')\n : [],\n };\n if (typeof value.description === 'string') task.description = value.description;\n if (typeof value.activeForm === 'string') task.activeForm = value.activeForm;\n if (typeof value.owner === 'string') task.owner = value.owner;\n if (typeof value.updatedAt === 'string') task.updatedAt = value.updatedAt;\n if (isRecord(value.delegation)) {\n task.delegation = {};\n if (typeof value.delegation.agent === 'string') task.delegation.agent = value.delegation.agent;\n if (typeof value.delegation.identity === 'string') task.delegation.identity = value.delegation.identity;\n if (typeof value.delegation.state === 'string') task.delegation.state = value.delegation.state;\n }\n return task;\n}\n\n/** Narrows a hub frame to a task graph payload; null when it is not one. */\nexport function parseTasksPayload(input: unknown): WebTasksPayload | null {\n if (!isRecord(input) || !Array.isArray(input.tasks) || typeof input.rev !== 'number') return null;\n return { tasks: input.tasks.map(parseTask).filter((task): task is WebTask => task !== null), rev: input.rev };\n}\n\n/** Same first-name presentation as the Agents panel, without changing routing identity. */\nexport function taskAgentName(delegation: WebTask['delegation']): string | undefined {\n const first = delegation?.identity?.split('-')[0];\n // ponytail: Older assignments keep the agent type; reassign to attach a named run.\n return first ? first.charAt(0).toUpperCase() + first.slice(1) : delegation?.agent;\n}\n\n/** The fields the cockpit lets a human change on a task. */\nexport interface TaskEditDraft {\n subject: string;\n description: string;\n status: WebTask['status'];\n}\n\nexport function taskEditDraft(task: WebTask): TaskEditDraft {\n return { subject: task.subject, description: task.description ?? '', status: task.status };\n}\n\nfunction changedFields(task: WebTask, draft: TaskEditDraft): string[] {\n const changes: string[] = [];\n const subject = draft.subject.trim();\n const description = draft.description.trim();\n if (subject && subject !== task.subject) changes.push(`set subject to \"${subject}\"`);\n if (description !== (task.description ?? '').trim()) {\n changes.push(description ? `set description to \"${description}\"` : 'clear the description');\n }\n if (draft.status !== task.status) changes.push(`set status to ${draft.status}`);\n return changes;\n}\n\n/**\n * The agent stays the only writer of task state, so an edit leaves the cockpit\n * as one prompt naming exactly the fields the human changed. Nothing changed\n * means nothing to send.\n */\nexport function taskEditInstruction(task: WebTask, draft: TaskEditDraft): string | null {\n const changes = changedFields(task, draft);\n if (changes.length === 0) return null;\n return `Update task #${task.id}: ${changes.join('; ')}. Change nothing else and keep the dependency graph valid.`;\n}\n\nexport function requestTaskEdit(\n send: SessionFrameSender,\n sessionId: string,\n task: WebTask,\n draft: TaskEditDraft,\n): boolean {\n const message = taskEditInstruction(task, draft);\n if (message === null) return false;\n send(sessionId, { type: 'prompt', message });\n return true;\n}\n\n/** Steering for the subagent that owns a delegated task. */\nexport function taskMessageInstruction(taskId: number, agent: string, message: string): string {\n return `Steer the ${agent} run working on task #${taskId} with this message, then update the task if its plan changed: ${message.trim()}`;\n}\n\nexport function requestTaskMessage(\n send: SessionFrameSender,\n sessionId: string,\n taskId: number,\n agent: string,\n message: string,\n): void {\n send(sessionId, { type: 'prompt', message: taskMessageInstruction(taskId, agent, message) });\n}\n\nexport function requestTaskRemoval(send: SessionFrameSender, sessionId: string, taskId: number): void {\n send(sessionId, {\n type: 'prompt',\n message: `Remove task #${taskId}. Also remove or repair every dependency that references it so the remaining task graph is valid.`,\n });\n}\n","import { defineSessionStore } from '@agimon-ai/po-core/native';\n\nimport { TASKS_CHANNEL_TYPE, type WebTasksPayload } from '../../../../../../types/webTasks';\nimport { parseTasksPayload, type TasksSession } from './tasksModel';\n\n/**\n * The native copy of the task graph store. It mirrors tasksStore.ts with the\n * native SDK, since the app provides `@agimon-ai/po-core/native` and never the\n * web contract; the parsing and the edit prompts come from the same model.\n */\nexport const tasks = defineSessionStore<TasksSession>({ tasks: [], rev: 0 });\n\nexport const tasksChannel = tasks.channel<WebTasksPayload>({\n channel: TASKS_CHANNEL_TYPE,\n parse: parseTasksPayload,\n reduce: (_current, payload) => payload,\n});\n","import { defineActivityGroup } from '@agimon-ai/po-core/native';\nimport { TaskIcon } from '@agimon-ai/po-native-components';\nimport { createElement } from 'react';\n\nimport { tasks } from '../channel/_lib/tasksStore.native';\n\n/**\n * The live task board in the app's Activity list, matching tasks.web.ts.\n *\n * Active means a delegated run is still out, not that the list has entries: a\n * pending task waits for this agent's next turn and reports to nobody.\n */\nexport default defineActivityGroup({\n keys: 't l',\n // The shared activity contract still supplies web-only icon props.\n icon: (_props: { 'aria-hidden'?: boolean; className?: string }) => createElement(TaskIcon),\n statusKey: '@agimon-ai/po-task',\n marksBackgroundWork: false,\n activeSource: {\n subscribe(listener: () => void) {\n const subscription = tasks.store.subscribe(listener);\n return () => subscription.unsubscribe();\n },\n isActive(sessionId: string | null) {\n return tasks\n .select(tasks.store.state, sessionId)\n .tasks.some((task) => task.delegation?.state === 'requested' || task.delegation?.state === 'running');\n },\n },\n order: 65,\n});\n","import { defineChannelFile } from '@agimon-ai/po-core/native';\n\nimport { tasksChannel } from './_lib/tasksStore.native';\n\nexport default defineChannelFile(tasksChannel);\n","import type { WebTaskStatus } from '../../../../../../types/webTasks';\n\n/**\n * The tone a task status reads in, named by theme token so web and native agree.\n * Jade (`green`) is Po working; finished work goes quiet; red is a real failure.\n */\nexport type TaskStatusTone = 'muted' | 'neutral' | 'green' | 'red';\n\nexport const TASK_STATUS_TONE: Readonly<Record<WebTaskStatus, TaskStatusTone>> = {\n pending: 'muted',\n in_progress: 'green',\n completed: 'neutral',\n failed: 'red',\n deleted: 'muted',\n};\n","import type { SessionFrameSender } from '@agimon-ai/po-core/native';\nimport {\n AgentAvatar,\n Badge,\n Button,\n Dot,\n Input,\n Label,\n SegmentedControl,\n Sheet,\n SheetContent,\n SheetHeader,\n SheetTitle,\n SheetBody,\n Textarea,\n} from '@agimon-ai/po-native-components';\nimport { type ReactNode, useState } from 'react';\nimport { Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport type { WebTask, WebTaskStatus } from '../../../../../../types/webTasks';\nimport {\n requestTaskEdit,\n requestTaskMessage,\n taskEditDraft,\n taskAgentName,\n type TaskEditDraft,\n} from '../../channel/_lib/tasksModel';\nimport { TASK_STATUS_TONE } from './taskStatusTone';\n\n/** How the one task sheet is opened: reading it, changing it, or steering its run. */\nexport type TaskSheetMode = 'view' | 'edit' | 'message';\n\nconst STATUS_CHOICES: readonly WebTaskStatus[] = ['pending', 'in_progress', 'completed', 'failed'];\nconst DESCRIPTION_LINES = 5;\nconst MESSAGE_LINES = 4;\n\ntype ActionVariant = 'primary' | 'ghost';\n\nfunction Field({ label, children }: { label: string; children: ReactNode }) {\n return (\n <View style={styles.field}>\n <Label>{label}</Label>\n {children}\n </View>\n );\n}\n\n/** One term and its value in the facts list. */\nfunction Fact({ term, testID, children }: { term: string; testID: string; children: ReactNode }) {\n return (\n <View style={styles.fact}>\n <Text style={styles.term}>{term}</Text>\n <View testID={testID} style={styles.factValue}>\n {children}\n </View>\n </View>\n );\n}\n\nfunction SheetAction({\n label,\n variant,\n testID,\n onPress,\n}: {\n label: string;\n variant: ActionVariant;\n testID: string;\n onPress: () => void;\n}) {\n return (\n <Button testID={testID} variant={variant} onPress={onPress}>\n {label}\n </Button>\n );\n}\n\nfunction TaskFacts({ task }: { task: WebTask }) {\n const agent = taskAgentName(task.delegation);\n return (\n <View style={styles.facts}>\n {agent ? (\n <Fact term=\"Agent\" testID=\"task-detail-agent\">\n <AgentAvatar name={agent} size=\"sm\" />\n <Text style={styles.value}>{agent}</Text>\n {task.delegation?.state ? <Text style={styles.hint}>{task.delegation.state}</Text> : null}\n </Fact>\n ) : null}\n {task.activeForm ? (\n <Fact term=\"Doing now\" testID=\"task-detail-active-form\">\n <Text style={styles.value}>{task.activeForm}</Text>\n </Fact>\n ) : null}\n {task.blockedBy.length > 0 ? (\n <Fact term=\"Waits for\" testID=\"task-detail-blocked-by\">\n <Text style={styles.value}>{task.blockedBy.map((id) => `#${id}`).join(', ')}</Text>\n </Fact>\n ) : null}\n {task.owner ? (\n <Fact term=\"Owner\" testID=\"task-detail-owner\">\n <Text style={styles.value}>{task.owner}</Text>\n </Fact>\n ) : null}\n {task.updatedAt ? (\n <Fact term=\"Updated\" testID=\"task-detail-updated\">\n <Text style={styles.value}>{task.updatedAt}</Text>\n </Fact>\n ) : null}\n </View>\n );\n}\n\n/**\n * One task in a bottom sheet, read first and changed second, as the web\n * dialog does. Every change leaves as a prompt the session can see, so the\n * agent remains the only writer of task state.\n */\nexport function TaskDetailSheet({\n task,\n sessionId,\n mode: initialMode,\n send,\n onClose,\n}: {\n task: WebTask;\n sessionId: string;\n mode: TaskSheetMode;\n send: SessionFrameSender;\n onClose: () => void;\n}) {\n const [mode, setMode] = useState<TaskSheetMode>(initialMode);\n const [draft, setDraft] = useState<TaskEditDraft>(() => taskEditDraft(task));\n const [message, setMessage] = useState('');\n const agent = task.delegation?.agent;\n const agentName = taskAgentName(task.delegation);\n\n const submitEdit = (): void => {\n if (requestTaskEdit(send, sessionId, task, draft)) onClose();\n };\n const submitMessage = (): void => {\n if (!message.trim() || !agent) return;\n requestTaskMessage(send, sessionId, task.id, agent, message);\n onClose();\n };\n\n return (\n <Sheet\n open\n onOpenChange={(open) => {\n if (!open) onClose();\n }}\n >\n {/* ponytail: edit and message modes stand in for unsaved work; a dirty check would let a clean edit close. */}\n <SheetContent keep={mode !== 'view'}>\n <SheetHeader closeLabel=\"close task\">\n <SheetTitle testID=\"task-detail-title\" accessibilityLabel={`task #${task.id}: ${task.subject}`}>\n {task.subject}\n </SheetTitle>\n </SheetHeader>\n <SheetBody testID=\"task-detail-dialog\">\n <View style={styles.status}>\n <Text style={styles.id}>#{task.id}</Text>\n <Badge testID=\"task-detail-status\">\n <Dot tone={TASK_STATUS_TONE[task.status]} pulse={task.status === 'in_progress'} />\n {task.status.replace('_', ' ')}\n </Badge>\n </View>\n {mode === 'view' ? (\n <>\n <Text testID=\"task-detail-description\" style={task.description ? styles.body : styles.hint}>\n {task.description ?? 'No description on this task.'}\n </Text>\n <TaskFacts task={task} />\n <View style={styles.footer}>\n {agent ? (\n <SheetAction\n label=\"Message agent\"\n variant=\"ghost\"\n testID=\"task-detail-open-message\"\n onPress={() => setMode('message')}\n />\n ) : null}\n <SheetAction\n label=\"Edit\"\n variant=\"primary\"\n testID=\"task-detail-open-edit\"\n onPress={() => setMode('edit')}\n />\n </View>\n </>\n ) : null}\n\n {mode === 'edit' ? (\n <>\n <Field label=\"Subject\">\n <Input\n testID=\"task-detail-subject-input\"\n accessibilityLabel=\"Subject\"\n autoFocus\n value={draft.subject}\n onChangeText={(subject) => setDraft({ ...draft, subject })}\n />\n </Field>\n <Field label=\"Description\">\n <Textarea\n testID=\"task-detail-description-input\"\n accessibilityLabel=\"Description\"\n numberOfLines={DESCRIPTION_LINES}\n value={draft.description}\n placeholder=\"What this task covers\"\n onChangeText={(description) => setDraft({ ...draft, description })}\n />\n </Field>\n <Field label=\"Status\">\n <SegmentedControl\n accessibilityLabel=\"Status\"\n options={STATUS_CHOICES.map((status) => ({ value: status, label: status.replace('_', ' ') }))}\n value={draft.status}\n onValueChange={(status) => {\n if (STATUS_CHOICES.includes(status as WebTaskStatus))\n setDraft({ ...draft, status: status as WebTaskStatus });\n }}\n />\n </Field>\n <Text style={styles.hint}>Saved as one prompt naming only the fields you changed</Text>\n <View style={styles.footer}>\n <SheetAction label=\"Cancel\" variant=\"ghost\" testID=\"task-detail-cancel\" onPress={onClose} />\n <SheetAction label=\"Save\" variant=\"primary\" testID=\"task-detail-save\" onPress={submitEdit} />\n </View>\n </>\n ) : null}\n\n {mode === 'message' && agent ? (\n <>\n <Field label={`Message to ${agentName}`}>\n <Textarea\n testID=\"task-detail-message-input\"\n accessibilityLabel=\"Message to agent\"\n autoFocus\n numberOfLines={MESSAGE_LINES}\n value={message}\n placeholder=\"Guidance for the run working on this task\"\n onChangeText={setMessage}\n />\n </Field>\n <Text style={styles.hint}>Steers the run, it does not edit the task</Text>\n <View style={styles.footer}>\n <SheetAction label=\"Cancel\" variant=\"ghost\" testID=\"task-detail-cancel\" onPress={onClose} />\n <SheetAction label=\"Send\" variant=\"primary\" testID=\"task-detail-send\" onPress={submitMessage} />\n </View>\n </>\n ) : null}\n </SheetBody>\n </SheetContent>\n </Sheet>\n );\n}\n\nconst styles = StyleSheet.create((theme) => ({\n field: { gap: theme.spacing(1.5) },\n status: { flexDirection: 'row', alignItems: 'center', gap: theme.spacing(2) },\n id: { fontSize: theme.fontSize.sm, lineHeight: theme.lineHeight.sm, color: theme.colors.faint },\n body: { fontSize: theme.fontSize.base, lineHeight: theme.lineHeight.lg, color: theme.colors.text },\n facts: { gap: theme.spacing(2.5) },\n fact: { flexDirection: 'row', alignItems: 'center', gap: theme.spacing(4) },\n term: {\n width: theme.spacing(20),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n color: theme.colors.dim,\n },\n factValue: { flex: 1, flexDirection: 'row', alignItems: 'center', flexWrap: 'wrap', gap: theme.spacing(1.5) },\n value: { fontSize: theme.fontSize.base, lineHeight: theme.lineHeight.base, color: theme.colors.text },\n hint: { fontSize: theme.fontSize.sm, lineHeight: theme.lineHeight.sm, color: theme.colors.dim },\n footer: { flexDirection: 'row', justifyContent: 'flex-end', gap: theme.spacing(2) },\n}));\n","import type { WebPluginSlotProps } from '@agimon-ai/po-core/native';\nimport {\n AgentAvatar,\n Badge,\n Button,\n ChevronDownIcon,\n ChevronRightIcon,\n Dot,\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n EditIcon,\n KebabIcon,\n MessageIcon,\n TrashIcon,\n ListRow,\n} from '@agimon-ai/po-native-components';\nimport { useCallback, useState, useSyncExternalStore } from 'react';\nimport { Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport type { WebTask } from '../../../../../../types/webTasks';\nimport { requestTaskRemoval, taskAgentName } from '../../channel/_lib/tasksModel';\nimport { tasks } from '../../channel/_lib/tasksStore.native';\nimport { TaskDetailSheet, type TaskSheetMode } from './TaskDetailSheet.native';\nimport { TASK_STATUS_TONE } from './taskStatusTone';\n\ntype TitleInk = 'dim' | 'hi';\n\ninterface SheetState {\n taskId: number;\n mode: TaskSheetMode;\n}\n\nfunction titleInk(status: WebTask['status']): TitleInk {\n return status === 'completed' || status === 'failed' ? 'dim' : 'hi';\n}\n\n/** The session's tasks, read from the native store without @tanstack/react-store, which the app does not provide. */\nfunction useSessionTasks(sessionId: string | null): WebTask[] {\n const subscribe = useCallback((listener: () => void) => {\n const subscription = tasks.store.subscribe(listener);\n return () => subscription.unsubscribe();\n }, []);\n return useSyncExternalStore(subscribe, () => tasks.select(tasks.store.state, sessionId).tasks);\n}\n\nfunction TaskRow({\n task,\n sessionId,\n sendSessionFrame,\n openSheet,\n}: {\n task: WebTask;\n sessionId: string;\n sendSessionFrame: WebPluginSlotProps['sendSessionFrame'];\n openSheet: (mode: TaskSheetMode) => void;\n}) {\n const doing = task.status === 'in_progress' ? task.activeForm : undefined;\n const agent = taskAgentName(task.delegation);\n const waits = task.blockedBy.length > 0 ? `Waits for ${task.blockedBy.map((id) => `#${id}`).join(', ')}` : '';\n const detail = [doing, waits].filter(Boolean).join(' · ');\n return (\n <View testID={`activity-task-${task.id}`}>\n <ListRow\n leading={<Dot tone={TASK_STATUS_TONE[task.status]} pulse={task.status === 'in_progress'} />}\n title={\n <Button\n variant=\"ghost\"\n testID={`activity-task-title-${task.id}`}\n accessibilityLabel={task.subject}\n onPress={() => openSheet('view')}\n style={styles.titleButton}\n >\n <Text numberOfLines={2} style={styles.title(titleInk(task.status))}>\n <Text style={styles.id}>#{task.id}</Text> {task.subject}\n </Text>\n </Button>\n }\n description={\n agent || detail ? (\n <View style={styles.line}>\n {agent ? <AgentAvatar name={agent} size=\"sm\" /> : null}\n {agent ? <Text style={styles.agent}>{agent}</Text> : null}\n {detail ? (\n <Text numberOfLines={1} style={styles.meta}>\n {detail}\n </Text>\n ) : null}\n </View>\n ) : undefined\n }\n trailing={\n task.status !== 'completed' && task.status !== 'deleted' ? (\n <DropdownMenu>\n <DropdownMenuTrigger\n variant=\"ghost\"\n size=\"icon\"\n testID={`activity-task-menu-${task.id}`}\n accessibilityLabel={`task #${task.id} actions`}\n >\n <KebabIcon />\n </DropdownMenuTrigger>\n <DropdownMenuContent>\n <DropdownMenuItem onSelect={() => openSheet('edit')}>\n <EditIcon />\n Edit\n </DropdownMenuItem>\n {agent ? (\n <DropdownMenuItem onSelect={() => openSheet('message')}>\n <MessageIcon />\n Message agent\n </DropdownMenuItem>\n ) : null}\n <DropdownMenuItem\n variant=\"destructive\"\n onSelect={() => requestTaskRemoval(sendSessionFrame, sessionId, task.id)}\n >\n <TrashIcon color=\"red\" />\n Remove\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n ) : undefined\n }\n />\n </View>\n );\n}\n\n/**\n * The session task graph in the app's Activity list, mirroring the web\n * section: a done count, active rows, finished and failed ones folded away by\n * default, and a sheet for reading or changing one task. Empty graphs render\n * nothing.\n */\nexport function TasksActivitySection({ sessionId, sendSessionFrame }: WebPluginSlotProps) {\n const sessionTasks = useSessionTasks(sessionId);\n const [historyOpen, setHistoryOpen] = useState(false);\n const [sheet, setSheet] = useState<SheetState>();\n if (sessionId === null || sessionTasks.length === 0) return null;\n\n const active = sessionTasks.filter((task) => task.status === 'pending' || task.status === 'in_progress');\n const history = sessionTasks.filter((task) => task.status === 'completed' || task.status === 'failed');\n const failed = history.filter((task) => task.status === 'failed').length;\n const done = history.length - failed;\n const total = active.length + history.length;\n const sheetTask = sheet ? sessionTasks.find((task) => task.id === sheet.taskId) : undefined;\n const row = (task: WebTask) => (\n <TaskRow\n key={task.id}\n task={task}\n sessionId={sessionId}\n sendSessionFrame={sendSessionFrame}\n openSheet={(mode) => setSheet({ taskId: task.id, mode })}\n />\n );\n return (\n <View style={styles.section}>\n {total > 0 ? (\n <View\n testID=\"activity-task-progress\"\n accessible\n accessibilityRole=\"progressbar\"\n accessibilityValue={{ min: 0, max: total, now: done }}\n style={styles.progress}\n >\n <Text style={styles.meta}>\n {done} of {total} done\n </Text>\n {/* ponytail: po-native-components has no Progress yet; promote this bar there when a second caller needs one. */}\n <View style={styles.track}>\n <View style={[styles.fill, { width: `${(done / total) * 100}%` }]} />\n </View>\n </View>\n ) : null}\n {active.length > 0 ? <View style={styles.group}>{active.map(row)}</View> : null}\n {history.length > 0 ? (\n <View style={styles.group}>\n <Button\n variant=\"ghost\"\n testID=\"activity-task-history-toggle\"\n accessibilityState={{ expanded: historyOpen }}\n onPress={() => setHistoryOpen((open) => !open)}\n style={styles.historyToggle}\n >\n <>{historyOpen ? <ChevronDownIcon /> : <ChevronRightIcon />}</>\n <Text style={styles.historyLabel}>Finished</Text>\n <Badge>{history.length}</Badge>\n {failed > 0 ? <Text style={styles.failed}>{failed} failed</Text> : null}\n </Button>\n {historyOpen ? <View style={styles.group}>{history.map(row)}</View> : null}\n </View>\n ) : null}\n {sheet && sheetTask ? (\n <TaskDetailSheet\n key={`${sheetTask.id}-${sheet.mode}`}\n task={sheetTask}\n sessionId={sessionId}\n mode={sheet.mode}\n send={sendSessionFrame}\n onClose={() => setSheet(undefined)}\n />\n ) : null}\n </View>\n );\n}\n\nconst styles = StyleSheet.create((theme) => ({\n section: {\n gap: theme.spacing(2),\n },\n group: {\n gap: theme.spacing(0.5),\n },\n progress: {\n gap: theme.spacing(1.5),\n paddingHorizontal: theme.spacing(1),\n },\n track: {\n height: theme.spacing(1),\n borderRadius: theme.borderRadius.full,\n overflow: 'hidden',\n backgroundColor: theme.colors.deep,\n },\n fill: {\n height: '100%',\n backgroundColor: theme.colors.green,\n },\n line: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: theme.spacing(1.5),\n },\n titleButton: {\n height: 'auto',\n justifyContent: 'flex-start',\n paddingHorizontal: 0,\n paddingVertical: theme.spacing(0.5),\n },\n title: (ink: TitleInk) => ({\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n fontWeight: '500',\n color: theme.colors[ink],\n }),\n id: {\n fontSize: theme.fontSize.sm,\n color: theme.colors.faint,\n },\n agent: {\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n color: theme.colors.text,\n },\n meta: {\n flexShrink: 1,\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n color: theme.colors.dim,\n },\n failed: {\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n color: theme.colors.red,\n },\n historyToggle: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'flex-start',\n gap: theme.spacing(1.5),\n minHeight: theme.spacing(11),\n paddingHorizontal: theme.spacing(1),\n borderRadius: theme.borderRadius.md,\n },\n historyLabel: {\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n fontWeight: '500',\n color: theme.colors.dim,\n },\n}));\n","import { defineFill } from '@agimon-ai/po-core/native';\n\nimport { TasksActivitySection } from './_lib/TasksActivitySection.native';\n\nexport default defineFill({ component: TasksActivitySection });\n","/**\n * Pure view logic for the task tool card, the browser counterpart of\n * the session frontend's shared format helpers (renderTaskCall, renderTaskResult). The plugin may reach\n * only its own files and src/types, so the store shapes it reads are\n * restated here as the wire JSON of a tool_execution frame.\n */\n\nimport { taskAgentName } from '../../channel/_lib/tasksModel';\n\nexport type TaskStatus = 'pending' | 'in_progress' | 'completed' | 'failed' | 'deleted';\nexport type TaskAction = 'upsert' | 'list' | 'get' | 'delete' | 'clear' | 'assign' | 'cancel';\n\nexport const STATUS_GLYPH: Record<TaskStatus, string> = {\n pending: '○',\n in_progress: '◐',\n completed: '●',\n failed: '✗',\n deleted: '⊘',\n};\n\nexport const STATUS_LABEL: Record<TaskStatus, string> = {\n pending: 'pending',\n in_progress: 'in progress',\n completed: 'completed',\n failed: 'failed',\n deleted: 'deleted',\n};\n\nexport const ACTION_GLYPH: Record<TaskAction, string> = {\n upsert: '✎',\n delete: '×',\n get: '›',\n list: '☰',\n clear: '∅',\n assign: '⇒',\n cancel: '⊗',\n};\n\n/**\n * `upsert` is two operations behind one name, so a homogeneous batch narrows to\n * the glyph the operator already reads: `+` means new work appeared, `→` means\n * work moved. A mixed batch keeps the neutral write glyph.\n */\nconst UPSERT_CREATE_GLYPH = '+';\nconst UPSERT_UPDATE_GLYPH = '→';\n/** Task rows kept in a collapsed result, before the card is expanded. */\nconst TRANSCRIPT_TASK_ROWS = 8;\nconst TASK_STATUSES: readonly TaskStatus[] = ['pending', 'in_progress', 'completed', 'failed', 'deleted'];\nconst TASK_ACTIONS: readonly TaskAction[] = ['upsert', 'list', 'get', 'delete', 'clear', 'assign', 'cancel'];\nconst INLINE_WHITESPACE = /\\s+/gu;\n\n/** One task as the result details carry it (src/models/task.ts Task). */\nexport interface TaskView {\n id: number;\n subject: string;\n status: TaskStatus;\n activeForm?: string;\n blockedBy?: number[];\n delegation?: { agent?: string; identity?: string; state?: string };\n}\n\n/** The result details (src/models/task.ts TaskDetails), narrowed to what the card reads. */\nexport interface TaskDetailsView {\n action: TaskAction;\n params: Record<string, unknown>;\n tasks: TaskView[];\n error?: string;\n upsert?: { applied: number[]; failed: number };\n assignment?: { assigned: number[]; failed: number };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isStatus(value: unknown): value is TaskStatus {\n return typeof value === 'string' && (TASK_STATUSES as readonly string[]).includes(value);\n}\n\nfunction isAction(value: unknown): value is TaskAction {\n return typeof value === 'string' && (TASK_ACTIONS as readonly string[]).includes(value);\n}\n\nfunction taskView(value: unknown): TaskView | null {\n if (!isRecord(value) || typeof value.id !== 'number' || typeof value.subject !== 'string') return null;\n if (!isStatus(value.status)) return null;\n const task: TaskView = { id: value.id, subject: value.subject, status: value.status };\n if (typeof value.activeForm === 'string') task.activeForm = value.activeForm;\n if (Array.isArray(value.blockedBy)) {\n task.blockedBy = value.blockedBy.filter((id): id is number => typeof id === 'number');\n }\n if (isRecord(value.delegation)) {\n task.delegation = {};\n if (typeof value.delegation.agent === 'string') task.delegation.agent = value.delegation.agent;\n if (typeof value.delegation.identity === 'string') task.delegation.identity = value.delegation.identity;\n if (typeof value.delegation.state === 'string') task.delegation.state = value.delegation.state;\n }\n return task;\n}\n\nfunction idList(value: unknown): number[] {\n return Array.isArray(value) ? value.filter((id): id is number => typeof id === 'number') : [];\n}\n\n/** Narrows the wire details; null when they are not a task result at all. */\nexport function taskDetailsView(details: unknown): TaskDetailsView | null {\n if (!isRecord(details) || !isAction(details.action) || !Array.isArray(details.tasks)) return null;\n const view: TaskDetailsView = {\n action: details.action,\n params: isRecord(details.params) ? details.params : {},\n tasks: details.tasks.map(taskView).filter((task): task is TaskView => task !== null),\n };\n if (typeof details.error === 'string') view.error = details.error;\n if (isRecord(details.upsert)) {\n view.upsert = {\n applied: idList(details.upsert.applied),\n failed: typeof details.upsert.failed === 'number' ? details.upsert.failed : 0,\n };\n }\n if (isRecord(details.assignment)) {\n view.assignment = {\n assigned: idList(details.assignment.assigned),\n failed: typeof details.assignment.failed === 'number' ? details.assignment.failed : 0,\n };\n }\n return view;\n}\n\n/** `#id` for the wire's id, which the TUI would resolve to a subject through the store. */\nfunction idLabel(value: unknown): string {\n return typeof value === 'number' || typeof value === 'string' ? `#${value}` : '#?';\n}\n\n/** Keep dynamic content on one line. */\nfunction inlineText(text: string): string {\n return text.replace(INLINE_WHITESPACE, ' ').trim();\n}\n\nexport type TaskCallTone = 'dim' | 'accent';\n\n/** The call header: glyph, action, then the subject or a count, as renderTaskCall lays it out. */\nexport interface TaskCallView {\n glyph: string;\n action: string;\n subject?: string;\n subjectTone: TaskCallTone;\n /** The assignee (`→ agent`) or the list filter. */\n detail?: string;\n}\n\nfunction upsertGlyph(items: readonly Record<string, unknown>[]): string {\n if (items.length === 0) return ACTION_GLYPH.upsert;\n if (items.every((item) => item.id === undefined)) return UPSERT_CREATE_GLYPH;\n if (items.every((item) => item.id !== undefined)) return UPSERT_UPDATE_GLYPH;\n return ACTION_GLYPH.upsert;\n}\n\n/**\n * The TUI resolves an id to its subject through the task store; the card has\n * no store and shows `#id` until the result names the task.\n */\nexport function taskCallView(args: Record<string, unknown>): TaskCallView {\n const action = typeof args.action === 'string' ? args.action : 'task';\n if (!isAction(action)) return { glyph: '?', action, subjectTone: 'dim' };\n const items = action === 'upsert' && Array.isArray(args.tasks) ? args.tasks.filter(isRecord) : [];\n const view: TaskCallView = {\n glyph: action === 'upsert' ? upsertGlyph(items) : ACTION_GLYPH[action],\n action,\n subjectTone: 'dim',\n };\n\n if (action === 'upsert') {\n // One entry reads exactly as create or update did; a batch reads as a count\n // rather than a subject it would have to pick arbitrarily.\n if (items.length === 1) {\n const only = items[0] ?? {};\n if (only.id === undefined) {\n if (typeof only.subject === 'string') view.subject = inlineText(only.subject);\n } else {\n view.subject = typeof only.subject === 'string' ? inlineText(only.subject) : idLabel(only.id);\n view.subjectTone = 'accent';\n }\n } else if (items.length > 1) {\n view.subject = `${items.length} tasks`;\n }\n } else if (action === 'assign') {\n const assignments = Array.isArray(args.assignments) ? args.assignments.filter(isRecord) : [];\n if (assignments.length === 1) {\n const only = assignments[0] ?? {};\n view.subject = idLabel(only.id);\n view.subjectTone = 'accent';\n if (typeof only.agent === 'string') view.detail = `→ ${only.agent}`;\n } else if (assignments.length > 1) {\n view.subject = `${assignments.length} tasks`;\n }\n } else if ((action === 'get' || action === 'delete' || action === 'cancel') && args.id !== undefined) {\n view.subject = idLabel(args.id);\n view.subjectTone = 'accent';\n } else if (action === 'list' && isStatus(args.status)) {\n view.detail = STATUS_LABEL[args.status];\n }\n return view;\n}\n\n/** One row of the result: the task line on the left, its status flushed right. */\nexport interface TaskRow {\n id: number;\n glyph: string;\n subject: string;\n status: TaskStatus;\n /** Struck through: the task is done with. */\n closed: boolean;\n agent?: string;\n activeForm?: string;\n blockedBy: number[];\n}\n\nexport type TaskResultTone = 'running' | 'ok' | 'error' | 'warning';\n\nexport interface TaskResultView {\n rows: TaskRow[];\n /** Error text lines when the tool threw or the reducer reported an error. */\n errorLines: string[];\n status: { glyph: string; tone: TaskResultTone; text: string } | null;\n}\n\nexport function taskRow(task: TaskView): TaskRow {\n const row: TaskRow = {\n id: task.id,\n glyph: STATUS_GLYPH[task.status],\n subject: inlineText(task.subject),\n status: task.status,\n closed: task.status === 'completed' || task.status === 'deleted',\n blockedBy: task.blockedBy ?? [],\n };\n const agent = taskAgentName(task.delegation);\n if (agent) row.agent = inlineText(agent);\n if (task.status === 'in_progress' && task.activeForm) row.activeForm = inlineText(task.activeForm);\n return row;\n}\n\nfunction nonEmptyLines(text: string): string[] {\n return text.split('\\n').filter((line) => line.trim().length > 0);\n}\n\n/**\n * The rows `list` reported to the model: `details.tasks` is the whole\n * document, so the call's filters apply again here or the card would disagree\n * with the text the model was given.\n */\nfunction listedTasks(details: TaskDetailsView): TaskView[] {\n let view = details.tasks;\n if (details.params.includeDeleted !== true) view = view.filter((task) => task.status !== 'deleted');\n if (isStatus(details.params.status)) view = view.filter((task) => task.status === details.params.status);\n return view;\n}\n\nfunction byIds(details: TaskDetailsView, ids: readonly number[]): TaskView[] {\n return ids.flatMap((id) => details.tasks.find((task) => task.id === id) ?? []);\n}\n\nfunction batch(\n tasks: readonly TaskView[],\n failed: number,\n verb: string,\n expanded: boolean,\n): Pick<TaskResultView, 'rows' | 'status'> {\n // One applied task and nothing failed is the common case: keep the single\n // row it has always had rather than dressing it as a bulk report.\n if (tasks.length === 1 && failed === 0) return { rows: [taskRow(tasks[0] as TaskView)], status: null };\n const shown = expanded ? tasks : tasks.slice(0, TRANSCRIPT_TASK_ROWS);\n let summary = `${tasks.length} ${verb}`;\n if (failed > 0) summary += ` · ${failed} failed`;\n if (tasks.length > shown.length) summary += ` · ${tasks.length - shown.length} more`;\n return {\n rows: shown.map(taskRow),\n status: { glyph: failed > 0 ? '!' : '✓', tone: failed > 0 ? 'warning' : 'ok', text: summary },\n };\n}\n\nexport function taskResultView(input: {\n details: unknown;\n output: string;\n expanded: boolean;\n isPartial: boolean;\n isError: boolean;\n}): TaskResultView {\n const details = taskDetailsView(input.details);\n\n // Running. `assign` and `cancel` stream a placeholder before the run settles.\n if (input.isPartial) {\n const text = nonEmptyLines(input.output).at(-1) ?? 'working';\n return { rows: [], errorLines: [], status: { glyph: '◐', tone: 'running', text } };\n }\n\n // Failed. Every failure path throws, so Pi hands back error text and no\n // details; without this the card would show a green tick on a failure.\n if (input.isError || details?.error !== undefined) {\n const all = nonEmptyLines(details?.error ?? input.output);\n if (all.length <= 1) return { rows: [], errorLines: [], status: { glyph: '✗', tone: 'error', text: all[0] ?? '' } };\n const errorLines = input.expanded ? all : all.slice(0, TRANSCRIPT_TASK_ROWS);\n return { rows: [], errorLines, status: { glyph: '✗', tone: 'error', text: '' } };\n }\n\n if (details === null) return { rows: [], errorLines: [], status: { glyph: '✓', tone: 'ok', text: '' } };\n\n if (details.action === 'list') {\n const tasks = listedTasks(details);\n const shown = input.expanded ? tasks : tasks.slice(0, TRANSCRIPT_TASK_ROWS);\n let summary = tasks.length === 0 ? 'no tasks' : `${tasks.length} task${tasks.length === 1 ? '' : 's'}`;\n if (tasks.length > shown.length) summary += ` · ${tasks.length - shown.length} more`;\n return { rows: shown.map(taskRow), errorLines: [], status: { glyph: '✓', tone: 'ok', text: summary } };\n }\n\n if (details.action === 'clear') {\n return { rows: [], errorLines: [], status: { glyph: '✓', tone: 'ok', text: 'cleared' } };\n }\n\n if (details.action === 'assign' && details.assignment) {\n const assigned = byIds(details, details.assignment.assigned);\n return { errorLines: [], ...batch(assigned, details.assignment.failed, 'assigned', input.expanded) };\n }\n\n if (details.action === 'upsert') {\n const touched = byIds(details, details.upsert?.applied ?? []);\n return { errorLines: [], ...batch(touched, details.upsert?.failed ?? 0, 'applied', input.expanded) };\n }\n\n // The single task an id-bearing action acted on, so the card names it rather than a bare tick.\n const id = details.params.id;\n const task = typeof id === 'number' ? details.tasks.find((candidate) => candidate.id === id) : undefined;\n if (!task) return { rows: [], errorLines: [], status: { glyph: '✓', tone: 'ok', text: '' } };\n return { rows: [taskRow(task)], errorLines: [], status: null };\n}\n","import type { ToolMessageRenderProps } from '@agimon-ai/po-core/native';\nimport {\n MessageItem,\n MessageItemHeader,\n MessageItemBody,\n MessageItemStatus,\n Dot,\n CodeBlock,\n toolTone,\n type StatusTone,\n type DotTone,\n} from '@agimon-ai/po-native-components';\nimport { Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport {\n STATUS_LABEL,\n type TaskCallTone,\n type TaskResultTone,\n type TaskRow,\n type TaskStatus,\n taskCallView,\n taskResultView,\n} from './taskToolFormat';\n\ntype InkToken = 'dim' | 'green' | 'hi';\n\n/** One colour per row, on the dot only: jade while Po works on it, red only for a real failure. */\nconst STATUS_DOT: Readonly<Record<TaskStatus, DotTone>> = {\n pending: 'muted',\n in_progress: 'green',\n completed: 'neutral',\n failed: 'red',\n deleted: 'muted',\n};\n\nconst CALL_INK: Readonly<Record<TaskCallTone, InkToken>> = {\n dim: 'hi',\n accent: 'green',\n};\n\nconst RESULT_TONE: Record<TaskResultTone, StatusTone> = {\n running: 'running',\n ok: 'ok',\n error: 'error',\n warning: 'running',\n};\n\n/** One task row: status dot, id and subject, with who is on it and what it waits for on a quiet line below. */\nfunction TaskRowLine({ row }: { row: TaskRow }) {\n const waits = row.blockedBy.length > 0 ? `waits for ${row.blockedBy.map((id) => `#${id}`).join(', ')}` : '';\n const meta = [row.agent, row.activeForm, waits].filter(Boolean).join(' · ');\n return (\n <View\n testID=\"tool-result-task-row\"\n accessible\n accessibilityLabel={`task #${row.id}, ${row.subject}, ${STATUS_LABEL[row.status]}`}\n style={styles.row}\n >\n <Dot tone={STATUS_DOT[row.status]} pulse={row.status === 'in_progress'} style={styles.dot} />\n <View style={styles.rowText}>\n <Text numberOfLines={1} style={[styles.rowSubject, styles.ink(row.closed ? 'dim' : 'hi')]}>\n <Text style={styles.meta}>#{row.id} </Text>\n {row.subject}\n </Text>\n {meta ? (\n <Text numberOfLines={1} style={styles.meta}>\n {meta}\n </Text>\n ) : null}\n </View>\n </View>\n );\n}\n\n/**\n * The task tool's timeline item on the phone, laid out as the web card is:\n * `glyph action subject` with the assignee or list filter in the header, then\n * the rows the action touched and the batch or list summary.\n */\nexport function TaskToolMessage({ args, result, output, running, isError }: ToolMessageRenderProps) {\n const call = taskCallView(args);\n const collapsed = taskResultView({ details: result?.details, output, expanded: false, isPartial: running, isError });\n const full = taskResultView({ details: result?.details, output, expanded: true, isPartial: running, isError });\n const hidden = full.rows.length - collapsed.rows.length + (full.errorLines.length - collapsed.errorLines.length);\n return (\n <MessageItem testID=\"tool-task\" tone={toolTone({ running, isError })} expandable={hidden > 0}>\n {({ expanded }) => {\n const view = expanded ? full : collapsed;\n const empty = view.rows.length === 0 && view.errorLines.length === 0 && view.status === null;\n return (\n <>\n <MessageItemHeader title=\"task\" testID=\"tool-call-task\" accessibilityLabel={`task ${call.action}`}>\n <Text style={styles.action}>\n {call.glyph} {call.action}\n </Text>\n {call.subject ? (\n <Text numberOfLines={1} style={[styles.subject, styles.ink(CALL_INK[call.subjectTone])]}>\n {call.subject}\n </Text>\n ) : null}\n {call.detail ? <Text style={styles.meta}>{call.detail}</Text> : null}\n </MessageItemHeader>\n {empty ? null : (\n <MessageItemBody testID=\"tool-result-task\">\n {view.rows.length > 0 ? (\n <View style={styles.rows}>\n {view.rows.map((row) => (\n <TaskRowLine key={row.id} row={row} />\n ))}\n </View>\n ) : null}\n {view.errorLines.length > 0 ? <CodeBlock text={view.errorLines.join('\\n')} /> : null}\n {!expanded && hidden > 0 ? (\n <MessageItemStatus expands accessibilityLabel={`Show ${hidden} more`}>\n {hidden} more\n </MessageItemStatus>\n ) : null}\n {view.status ? (\n <MessageItemStatus\n testID=\"tool-result-task-status\"\n tone={RESULT_TONE[view.status.tone]}\n glyph={view.status.glyph}\n >\n {view.status.text}\n </MessageItemStatus>\n ) : null}\n </MessageItemBody>\n )}\n </>\n );\n }}\n </MessageItem>\n );\n}\n\nconst styles = StyleSheet.create((theme) => ({\n action: {\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n fontWeight: '600',\n color: theme.colors.text,\n },\n subject: {\n flexShrink: 1,\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n fontWeight: '600',\n },\n body: {\n gap: theme.spacing(1),\n },\n rows: {\n gap: theme.spacing(0.5),\n },\n row: {\n flexDirection: 'row',\n alignItems: 'flex-start',\n gap: theme.spacing(2),\n },\n dot: {\n marginTop: theme.spacing(1.5),\n },\n rowText: {\n flex: 1,\n },\n rowSubject: {\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n fontWeight: '500',\n },\n meta: {\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n color: theme.colors.dim,\n },\n ink: (token: InkToken) => ({\n color: theme.colors[token],\n }),\n}));\n","import { defineToolRenderer } from '@agimon-ai/po-core/native';\n\nimport { TaskToolMessage } from './_lib/TaskToolMessage.native';\n\nexport default defineToolRenderer({ message: TaskToolMessage });\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineNativePlugin, type WebPluginContributions } from '@agimon-ai/po-core/native';\n\nimport fillTasks from '../src/extensions/workspaces/(frontend)/fill/Tasks.home.native';\nimport activityGroupTasks from '../src/extensions/workspaces/sessions/(frontend)/activity-group/tasks.native';\nimport channelTaskGraph from '../src/extensions/workspaces/sessions/(frontend)/channel/task-graph.native';\nimport fillTasks2 from '../src/extensions/workspaces/sessions/(frontend)/fill/Tasks.activity.tasks.native';\nimport toolTask from '../src/extensions/workspaces/sessions/(frontend)/tool/task.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: 'task',\n workspace: {\n get fills(): WebPluginContributions['fills'] { return [via({ slot: 'home', id: 'tasks' }, fillTasks)]; },\n },\n session: {\n get activityGroups(): WebPluginContributions['activityGroups'] { return [via({ name: 'tasks' }, activityGroupTasks)]; },\n get channels(): WebPluginContributions['channels'] { return [via({ channel: 'task_graph' }, channelTaskGraph)]; },\n get fills(): WebPluginContributions['fills'] { return [via({ slot: 'activity.tasks', id: 'tasks' }, fillTasks2)]; },\n get toolRenderers(): WebPluginContributions['toolRenderers'] { return [via({ tools: ['task'] }, toolTask)]; },\n },\n});\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agimon-ai/po-task",
|
|
3
|
-
"version": "0.0.0-alpha.
|
|
3
|
+
"version": "0.0.0-alpha.50",
|
|
4
4
|
"description": "Persistent, dependency-aware task graphs and subagent delegation for Pi coding sessions.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai",
|
|
@@ -131,15 +131,15 @@
|
|
|
131
131
|
"registry": "https://registry.npmjs.org/"
|
|
132
132
|
},
|
|
133
133
|
"dependencies": {
|
|
134
|
-
"@agimon-ai/po-core": "0.0.0-alpha.
|
|
135
|
-
"@agimon-ai/po-ui": "0.0.0-alpha.
|
|
136
|
-
"@agimon-ai/po-web-components": "0.0.0-alpha.
|
|
134
|
+
"@agimon-ai/po-core": "0.0.0-alpha.50",
|
|
135
|
+
"@agimon-ai/po-ui": "0.0.0-alpha.50",
|
|
136
|
+
"@agimon-ai/po-web-components": "0.0.0-alpha.50",
|
|
137
137
|
"@deepseek-ai/cordis": "4.0.5",
|
|
138
138
|
"typebox": "1.4.2"
|
|
139
139
|
},
|
|
140
140
|
"devDependencies": {
|
|
141
|
-
"@agimon-ai/po-build": "0.0.0-alpha.
|
|
142
|
-
"@agimon-ai/po-native-components": "0.0.0-alpha.
|
|
141
|
+
"@agimon-ai/po-build": "0.0.0-alpha.50",
|
|
142
|
+
"@agimon-ai/po-native-components": "0.0.0-alpha.50",
|
|
143
143
|
"@babel/core": "7.29.7",
|
|
144
144
|
"@earendil-works/pi-coding-agent": "1.4.0",
|
|
145
145
|
"@tanstack/react-store": "0.11.2",
|