@caupulican/pi-adaptative 0.94.0 → 0.94.1
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/CHANGELOG.md +16 -0
- package/dist/core/agent-paths.d.ts +2 -0
- package/dist/core/agent-paths.d.ts.map +1 -1
- package/dist/core/agent-paths.js +7 -0
- package/dist/core/agent-paths.js.map +1 -1
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +5 -1
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/background-lane-controller.d.ts +8 -0
- package/dist/core/background-lane-controller.d.ts.map +1 -1
- package/dist/core/background-lane-controller.js +75 -5
- package/dist/core/background-lane-controller.js.map +1 -1
- package/dist/core/background-tool-task-controller.d.ts +15 -0
- package/dist/core/background-tool-task-controller.d.ts.map +1 -1
- package/dist/core/background-tool-task-controller.js +122 -15
- package/dist/core/background-tool-task-controller.js.map +1 -1
- package/dist/core/context/long-term-memory-trigger.d.ts +3 -1
- package/dist/core/context/long-term-memory-trigger.d.ts.map +1 -1
- package/dist/core/context/long-term-memory-trigger.js +1 -1
- package/dist/core/context/long-term-memory-trigger.js.map +1 -1
- package/dist/core/context/okf-memory-provider.d.ts +3 -0
- package/dist/core/context/okf-memory-provider.d.ts.map +1 -1
- package/dist/core/context/okf-memory-provider.js +66 -31
- package/dist/core/context/okf-memory-provider.js.map +1 -1
- package/dist/core/context/okf-memory.d.ts +18 -1
- package/dist/core/context/okf-memory.d.ts.map +1 -1
- package/dist/core/context/okf-memory.js +48 -0
- package/dist/core/context/okf-memory.js.map +1 -1
- package/dist/core/delegation/worker-agent-control.d.ts +4 -0
- package/dist/core/delegation/worker-agent-control.d.ts.map +1 -1
- package/dist/core/delegation/worker-agent-control.js.map +1 -1
- package/dist/core/delegation/worker-execution-policy.d.ts.map +1 -1
- package/dist/core/delegation/worker-execution-policy.js +1 -1
- package/dist/core/delegation/worker-execution-policy.js.map +1 -1
- package/dist/core/delegation/worker-notification-coordinator.d.ts +10 -0
- package/dist/core/delegation/worker-notification-coordinator.d.ts.map +1 -1
- package/dist/core/delegation/worker-notification-coordinator.js +69 -3
- package/dist/core/delegation/worker-notification-coordinator.js.map +1 -1
- package/dist/core/foreground-terminal-handoff-controller.d.ts +17 -0
- package/dist/core/foreground-terminal-handoff-controller.d.ts.map +1 -1
- package/dist/core/foreground-terminal-handoff-controller.js +78 -10
- package/dist/core/foreground-terminal-handoff-controller.js.map +1 -1
- package/dist/core/learning/learning-audit.d.ts +5 -1
- package/dist/core/learning/learning-audit.d.ts.map +1 -1
- package/dist/core/learning/learning-audit.js +32 -1
- package/dist/core/learning/learning-audit.js.map +1 -1
- package/dist/core/learning/reflection-engine.d.ts +20 -0
- package/dist/core/learning/reflection-engine.d.ts.map +1 -1
- package/dist/core/learning/reflection-engine.js +58 -0
- package/dist/core/learning/reflection-engine.js.map +1 -1
- package/dist/core/memory/okf-project-memory-store.d.ts +28 -0
- package/dist/core/memory/okf-project-memory-store.d.ts.map +1 -0
- package/dist/core/memory/okf-project-memory-store.js +111 -0
- package/dist/core/memory/okf-project-memory-store.js.map +1 -0
- package/dist/core/memory/providers/file-store.d.ts +42 -1
- package/dist/core/memory/providers/file-store.d.ts.map +1 -1
- package/dist/core/memory/providers/file-store.js +274 -13
- package/dist/core/memory/providers/file-store.js.map +1 -1
- package/dist/core/memory-controller.d.ts +10 -1
- package/dist/core/memory-controller.d.ts.map +1 -1
- package/dist/core/memory-controller.js +72 -8
- package/dist/core/memory-controller.js.map +1 -1
- package/dist/core/provider-prompt-contracts.d.ts.map +1 -1
- package/dist/core/provider-prompt-contracts.js +9 -19
- package/dist/core/provider-prompt-contracts.js.map +1 -1
- package/dist/core/reflection-controller.d.ts +7 -0
- package/dist/core/reflection-controller.d.ts.map +1 -1
- package/dist/core/reflection-controller.js +94 -15
- package/dist/core/reflection-controller.js.map +1 -1
- package/dist/core/tools/delegate-status.d.ts +2 -0
- package/dist/core/tools/delegate-status.d.ts.map +1 -1
- package/dist/core/tools/delegate-status.js +4 -0
- package/dist/core/tools/delegate-status.js.map +1 -1
- package/dist/core/tools/delegate.d.ts +2 -0
- package/dist/core/tools/delegate.d.ts.map +1 -1
- package/dist/core/tools/delegate.js +83 -21
- package/dist/core/tools/delegate.js.map +1 -1
- package/dist/core/tools/tool-task.d.ts +1 -0
- package/dist/core/tools/tool-task.d.ts.map +1 -1
- package/dist/core/tools/tool-task.js +13 -8
- package/dist/core/tools/tool-task.js.map +1 -1
- package/dist/core/util/atomic-file.d.ts +2 -0
- package/dist/core/util/atomic-file.d.ts.map +1 -1
- package/dist/core/util/atomic-file.js +4 -0
- package/dist/core/util/atomic-file.js.map +1 -1
- package/dist/modes/interactive/auto-learn-controller.d.ts.map +1 -1
- package/dist/modes/interactive/auto-learn-controller.js +2 -0
- package/dist/modes/interactive/auto-learn-controller.js.map +1 -1
- package/dist/modes/interactive/components/activity-lane.d.ts.map +1 -1
- package/dist/modes/interactive/components/activity-lane.js +12 -23
- package/dist/modes/interactive/components/activity-lane.js.map +1 -1
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-message.js +125 -1
- package/dist/modes/interactive/components/custom-message.js.map +1 -1
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/npm-shrinkwrap.json +12 -12
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"activity-lane.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/activity-lane.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Component } from \"@caupulican/pi-tui\";\nimport { truncateToWidth, visibleWidth } from \"@caupulican/pi-tui\";\nimport type { LaneRecord } from \"../../../core/autonomy/lane-tracker.ts\";\nimport { type GoalState, isGoalExecutionActive, isGoalUnfinishedStatus } from \"../../../core/goals/goal-state.ts\";\nimport type { TaskStep, TaskStepsState } from \"../../../core/tasks/task-state.ts\";\nimport type { Theme, ThemeColor } from \"../theme/theme.ts\";\n\nexport type ActivityLaneKind = \"runtime\" | \"tool\" | \"task\" | \"worker\" | \"goal\" | \"queue\" | \"notice\";\nexport type ActivityLaneStatus = \"active\" | \"waiting\" | \"success\" | \"warning\" | \"failure\" | \"neutral\";\n\nexport interface ActivityLaneItem {\n\tid: string;\n\tkind: ActivityLaneKind;\n\tlabel: string;\n\tstatus: ActivityLaneStatus;\n\t/** Short aggregation key (e.g. \"bash\", \"python\", \"agent\") for the concurrency slot. */\n\ttag?: string;\n}\n\nexport interface ActivityLaneCanonicalSnapshot {\n\tgoalState?: GoalState;\n\ttaskState?: TaskStepsState;\n\tlaneRecords: readonly LaneRecord[];\n}\n\nexport interface ActivityLaneProjection {\n\tactive: ActivityLaneItem[];\n\tterminal: ActivityLaneItem[];\n}\n\nconst DEFAULT_TERMINAL_HOLD_MS = 2_000;\nconst MAX_ACTIVITY_LABEL_LENGTH = 240;\nconst MAX_SEEN_TERMINALS = 512;\n\nexport const BACKGROUND_TOOL_ACTIVITY_ID_PREFIX = \"background-tool:\";\n\nexport function backgroundToolActivityId(taskId: string): string {\n\treturn `${BACKGROUND_TOOL_ACTIVITY_ID_PREFIX}${taskId}`;\n}\n\nexport function isBackgroundToolActivityItem(item: Pick<ActivityLaneItem, \"id\" | \"kind\">): boolean {\n\treturn item.kind === \"tool\" && item.id.startsWith(BACKGROUND_TOOL_ACTIVITY_ID_PREFIX);\n}\n\nconst STATUS_COLORS: Record<ActivityLaneStatus, ThemeColor> = {\n\tactive: \"muted\",\n\twaiting: \"warning\",\n\tsuccess: \"success\",\n\twarning: \"warning\",\n\tfailure: \"error\",\n\tneutral: \"muted\",\n};\n\nfunction boundedLabel(value: string): string {\n\tconst normalized = value.replace(/\\s+/g, \" \").trim();\n\treturn normalized.length <= MAX_ACTIVITY_LABEL_LENGTH\n\t\t? normalized\n\t\t: `${normalized.slice(0, MAX_ACTIVITY_LABEL_LENGTH - 1)}…`;\n}\n\nfunction taskLabel(step: TaskStep, state: TaskStepsState): string {\n\tconst total = state.steps.length + state.archive.completed + state.archive.cancelled;\n\tconst activeIndex = state.steps.findIndex((candidate) => candidate.id === step.id);\n\tconst archived = state.archive.completed + state.archive.cancelled;\n\tconst position = Math.min(total, archived + Math.max(0, activeIndex) + 1);\n\tconst prefix = step.status === \"blocked\" ? \"Blocked\" : step.status === \"pending\" ? \"Next\" : \"Step\";\n\tconst content = step.status === \"in_progress\" ? (step.activeForm ?? step.content) : step.content;\n\treturn boundedLabel(`${prefix} ${position}/${total} · ${content}`);\n}\n\nfunction projectTaskState(state: TaskStepsState | undefined): ActivityLaneProjection {\n\tif (!state) return { active: [], terminal: [] };\n\tconst inProgress = state.steps.find((step) => step.status === \"in_progress\");\n\tconst blocked = state.steps.find((step) => step.status === \"blocked\");\n\tconst pending = state.steps.find((step) => step.status === \"pending\");\n\tconst current = inProgress ?? blocked ?? pending;\n\tconst active = current\n\t\t? [\n\t\t\t\t{\n\t\t\t\t\tid: `task:${current.id}`,\n\t\t\t\t\tkind: \"task\" as const,\n\t\t\t\t\tlabel: taskLabel(current, state),\n\t\t\t\t\tstatus: current.status === \"blocked\" ? (\"waiting\" as const) : (\"active\" as const),\n\t\t\t\t},\n\t\t\t]\n\t\t: [];\n\tconst terminal = state.steps\n\t\t.filter((step) => step.status === \"completed\" || step.status === \"cancelled\")\n\t\t.map(\n\t\t\t(step): ActivityLaneItem => ({\n\t\t\t\tid: `terminal:task:${step.id}:${step.status}:${step.updatedAt}`,\n\t\t\t\tkind: \"task\",\n\t\t\t\tlabel: boundedLabel(\n\t\t\t\t\tstep.status === \"completed\" ? `Completed · ${step.content}` : `Cancelled · ${step.content}`,\n\t\t\t\t),\n\t\t\t\tstatus: step.status === \"completed\" ? \"success\" : \"neutral\",\n\t\t\t}),\n\t\t);\n\treturn { active, terminal };\n}\n\nfunction projectGoalState(state: GoalState | undefined): ActivityLaneProjection {\n\tif (!state) return { active: [], terminal: [] };\n\tconst satisfied = state.requirements.filter((requirement) => requirement.status === \"satisfied\").length;\n\tconst progress = state.requirements.length > 0 ? ` ${satisfied}/${state.requirements.length}` : \"\";\n\tif (isGoalUnfinishedStatus(state.status)) {\n\t\tconst goalActive = isGoalExecutionActive(state.status);\n\t\tconst stopped = goalActive ? \"\" : ` ${state.status.replace(\"_\", \" \")}`;\n\t\treturn {\n\t\t\tactive: [\n\t\t\t\t{\n\t\t\t\t\tid: `goal:${state.goalId}`,\n\t\t\t\t\tkind: \"goal\",\n\t\t\t\t\tlabel: boundedLabel(`Goal${stopped}${progress} · ${state.userGoal}`),\n\t\t\t\t\tstatus: goalActive ? \"active\" : \"waiting\",\n\t\t\t\t},\n\t\t\t],\n\t\t\tterminal: [],\n\t\t};\n\t}\n\treturn {\n\t\tactive: [],\n\t\tterminal: [\n\t\t\t{\n\t\t\t\tid: `terminal:goal:${state.goalId}:${state.status}:${state.updatedAt}`,\n\t\t\t\tkind: \"goal\",\n\t\t\t\tlabel: state.status === \"completed\" ? \"Goal achieved\" : \"Goal closed\",\n\t\t\t\tstatus: state.status === \"completed\" ? \"success\" : \"neutral\",\n\t\t\t},\n\t\t],\n\t};\n}\n\nfunction laneLabel(record: LaneRecord): string {\n\tconst runtime = record.type === \"tmux-worker\" ? \"tmux\" : \"agent\";\n\tconst label = record.label ?? record.laneId;\n\treturn boundedLabel(`${runtime} · ${label}`);\n}\n\nfunction projectLaneRecords(records: readonly LaneRecord[]): ActivityLaneProjection {\n\tconst workers = records.filter((record) => record.type === \"worker\" || record.type === \"tmux-worker\");\n\tconst active = workers\n\t\t.filter((record) => record.status === \"queued\" || record.status === \"running\")\n\t\t.map(\n\t\t\t(record): ActivityLaneItem => ({\n\t\t\t\tid: `worker:${record.laneId}`,\n\t\t\t\tkind: \"worker\",\n\t\t\t\tlabel: laneLabel(record),\n\t\t\t\tstatus: record.status === \"queued\" ? \"waiting\" : \"active\",\n\t\t\t\ttag: record.type === \"tmux-worker\" ? \"tmux\" : \"agent\",\n\t\t\t}),\n\t\t);\n\tconst terminal = workers\n\t\t.filter(\n\t\t\t(record) =>\n\t\t\t\trecord.status === \"succeeded\" ||\n\t\t\t\trecord.status === \"partial\" ||\n\t\t\t\trecord.status === \"blocked\" ||\n\t\t\t\trecord.status === \"failed\" ||\n\t\t\t\trecord.status === \"timeout\" ||\n\t\t\t\trecord.status === \"budget_exhausted\" ||\n\t\t\t\trecord.status === \"canceled\",\n\t\t)\n\t\t.map(\n\t\t\t(record): ActivityLaneItem => ({\n\t\t\t\tid: `terminal:worker:${record.laneId}:${record.status}:${record.completedAt ?? \"unknown\"}`,\n\t\t\t\tkind: \"worker\",\n\t\t\t\tlabel: boundedLabel(\n\t\t\t\t\t`${record.status === \"succeeded\" ? \"Finished\" : record.status} · ${record.label ?? record.laneId}`,\n\t\t\t\t),\n\t\t\t\tstatus:\n\t\t\t\t\trecord.status === \"succeeded\"\n\t\t\t\t\t\t? \"success\"\n\t\t\t\t\t\t: record.status === \"partial\" || record.status === \"blocked\"\n\t\t\t\t\t\t\t? \"warning\"\n\t\t\t\t\t\t\t: record.status === \"canceled\"\n\t\t\t\t\t\t\t\t? \"neutral\"\n\t\t\t\t\t\t\t\t: \"failure\",\n\t\t\t}),\n\t\t);\n\treturn { active, terminal };\n}\n\nexport function projectActivityLane(snapshot: ActivityLaneCanonicalSnapshot): ActivityLaneProjection {\n\tconst task = projectTaskState(snapshot.taskState);\n\tconst lanes = projectLaneRecords(snapshot.laneRecords);\n\tconst goal = projectGoalState(snapshot.goalState);\n\treturn {\n\t\tactive: [...task.active, ...lanes.active, ...goal.active],\n\t\tterminal: [...task.terminal, ...lanes.terminal, ...goal.terminal],\n\t};\n}\n\n/**\n * Slot layout. One row, fixed slot order and anchors, left to right by stability:\n *\n * ● working Step 2/5 · Confirming duplicate-charge risk 2 bash Queued 1 ● Read finished\n * turn plan (only elastic slot) concurrency/queue last event\n *\n * Only the plan slot truncates. When width runs out, whole slots drop right-to-left\n * (event, then concurrency) so surviving slots never shift position mid-turn.\n * Color carries status only; labels stay in the text/muted hierarchy.\n */\nconst TURN_TEXT_MAX = 32;\nconst EVENT_TEXT_MAX = 36;\nconst QUEUE_TEXT_MAX = 32;\nconst AGGREGATE_GROUP_MAX = 3;\nconst PLAN_TEXT_MIN = 24;\nconst SLOT_GAP_WIDTH = 2;\n\nfunction isTerminalStatus(status: ActivityLaneStatus): boolean {\n\treturn status === \"success\" || status === \"warning\" || status === \"failure\" || status === \"neutral\";\n}\n\ninterface AggregateGroup {\n\ttag: string;\n\tcount: number;\n\twaiting: boolean;\n}\n\ninterface LaneSlots {\n\tturn: ActivityLaneItem | undefined;\n\tplan: ActivityLaneItem | undefined;\n\tgroups: AggregateGroup[];\n\tqueue: ActivityLaneItem | undefined;\n\tevent: ActivityLaneItem | undefined;\n}\n\nfunction normalizeActivityTag(tag: string | undefined, fallback: \"tool\" | \"worker\"): string {\n\tconst normalized = (tag ?? fallback)\n\t\t.replace(/[_\\s-]+/g, \" \")\n\t\t.trim()\n\t\t.toLowerCase();\n\treturn normalized || fallback;\n}\n\nfunction classifySlots(items: readonly ActivityLaneItem[]): LaneSlots {\n\tlet turn: ActivityLaneItem | undefined;\n\tlet plan: ActivityLaneItem | undefined;\n\tlet goal: ActivityLaneItem | undefined;\n\tlet queue: ActivityLaneItem | undefined;\n\tlet event: ActivityLaneItem | undefined;\n\tconst groups = new Map<string, AggregateGroup>();\n\n\tfor (const item of items) {\n\t\tif (isTerminalStatus(item.status)) {\n\t\t\tevent = item; // last one wins: transients are ordered oldest-first\n\t\t\tcontinue;\n\t\t}\n\t\tswitch (item.kind) {\n\t\t\tcase \"runtime\":\n\t\t\t\t// Waiting states (retry countdowns) outrank plain working states.\n\t\t\t\tif (!turn || (item.status === \"waiting\" && turn.status !== \"waiting\")) turn = item;\n\t\t\t\tbreak;\n\t\t\tcase \"task\":\n\t\t\t\tplan ??= item;\n\t\t\t\tbreak;\n\t\t\tcase \"goal\":\n\t\t\t\tgoal ??= item;\n\t\t\t\tbreak;\n\t\t\tcase \"queue\":\n\t\t\t\tqueue ??= item;\n\t\t\t\tbreak;\n\t\t\tcase \"tool\":\n\t\t\tcase \"worker\": {\n\t\t\t\tconst tag = normalizeActivityTag(item.tag, item.kind);\n\t\t\t\tconst group = groups.get(tag) ?? { tag, count: 0, waiting: false };\n\t\t\t\tgroup.count += 1;\n\t\t\t\tif (item.status === \"waiting\") group.waiting = true;\n\t\t\t\tgroups.set(tag, group);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"notice\":\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn { turn, plan: plan ?? goal, groups: [...groups.values()], queue, event };\n}\n\nfunction renderConcurrency(theme: Theme, groups: readonly AggregateGroup[]): string {\n\tconst parts: string[] = [];\n\tconst shown = groups.slice(0, AGGREGATE_GROUP_MAX);\n\tfor (const group of shown) {\n\t\tparts.push(theme.fg(group.waiting ? \"warning\" : \"muted\", `${group.count} ${group.tag}`));\n\t}\n\tconst overflow = groups.length - shown.length;\n\tif (overflow > 0) parts.push(theme.fg(\"dim\", `+${overflow}`));\n\treturn parts.join(theme.fg(\"dim\", \" · \"));\n}\n\nexport function renderActivityLaneLine(theme: Theme, items: readonly ActivityLaneItem[], width: number): string[] {\n\tconst safeWidth = Math.max(1, width);\n\tif (items.length === 0 || safeWidth < 3) return [];\n\tconst slots = classifySlots(items);\n\tif (!slots.turn && !slots.plan && slots.groups.length === 0 && !slots.queue && !slots.event) return [];\n\n\tconst indent = \" \";\n\tconst gap = \" \".repeat(SLOT_GAP_WIDTH);\n\n\t// Turn slot: alive-anchor glyph plus a short state. The generic working state keeps the\n\t// word \"working\"; load-bearing runtime labels (retry, compaction, routing) pass through.\n\tlet turnPart = \"\";\n\tconst planFromTurn = slots.turn?.id === \"runtime:turn\" ? slots.turn.label : undefined;\n\tif (slots.turn) {\n\t\tconst text = slots.turn.id === \"runtime:turn\" ? \"working\" : slots.turn.label;\n\t\tconst dotColor: ThemeColor = slots.turn.status === \"waiting\" ? \"warning\" : \"accent\";\n\t\tturnPart = `${theme.fg(dotColor, \"●\")} ${theme.fg(\"muted\", truncateToWidth(text, TURN_TEXT_MAX, \"…\"))}`;\n\t}\n\n\t// Plan slot content: task step, else goal, else the live working message.\n\tconst planItem = slots.plan;\n\tconst planText = planItem?.label ?? planFromTurn ?? \"\";\n\tconst planColor: ThemeColor = planItem ? (planItem.status === \"waiting\" ? \"warning\" : \"text\") : \"muted\";\n\n\t// Right-aligned slots at natural size. Events and concurrency drop before the plan\n\t// shrinks below its preferred width; the user-owned queue state remains visible.\n\tlet concurrencyPart = renderConcurrency(theme, slots.groups);\n\tconst queuePart = slots.queue ? theme.fg(\"warning\", truncateToWidth(slots.queue.label, QUEUE_TEXT_MAX, \"…\")) : \"\";\n\tlet eventPart = slots.event\n\t\t? `${theme.fg(STATUS_COLORS[slots.event.status], \"●\")} ${theme.fg(\n\t\t\t\t\"muted\",\n\t\t\t\ttruncateToWidth(slots.event.label, EVENT_TEXT_MAX, \"…\"),\n\t\t\t)}`\n\t\t: \"\";\n\n\tconst leftBase = visibleWidth(indent) + (turnPart ? visibleWidth(turnPart) : 0);\n\tconst planGap = turnPart && planText ? SLOT_GAP_WIDTH : 0;\n\tconst rightPart = (): string => [concurrencyPart, queuePart, eventPart].filter(Boolean).join(gap);\n\tconst planBudget = (): number => {\n\t\tlet right = visibleWidth(rightPart());\n\t\tif (right > 0) right += SLOT_GAP_WIDTH; // breathing room before the right block\n\t\treturn safeWidth - leftBase - planGap - right;\n\t};\n\n\tif (planText && planBudget() < PLAN_TEXT_MIN && eventPart) eventPart = \"\";\n\tif (planText && planBudget() < PLAN_TEXT_MIN && concurrencyPart) concurrencyPart = \"\";\n\n\tconst planAvailable = Math.max(0, planBudget());\n\tconst planPart = planText ? theme.fg(planColor, truncateToWidth(planText, planAvailable, \"…\")) : \"\";\n\n\tconst renderedRightPart = rightPart();\n\n\tlet line = indent + turnPart + (turnPart && planPart ? gap : \"\") + planPart;\n\tif (renderedRightPart) {\n\t\tconst pad = Math.max(SLOT_GAP_WIDTH, safeWidth - visibleWidth(line) - visibleWidth(renderedRightPart));\n\t\tline += \" \".repeat(pad) + renderedRightPart;\n\t}\n\treturn [truncateToWidth(line, safeWidth, \"\")];\n}\n\nexport class ActivityLaneComponent implements Component {\n\tprivate readonly theme: Theme;\n\tprivate readonly requestRender: () => void;\n\tprivate readonly terminalHoldMs: number;\n\tprivate sessionKey: string | undefined;\n\tprivate readonly canonical = new Map<string, ActivityLaneItem>();\n\tprivate readonly live = new Map<string, ActivityLaneItem>();\n\tprivate readonly transient = new Map<string, ActivityLaneItem>();\n\tprivate readonly transientTimers = new Map<string, ReturnType<typeof setTimeout>>();\n\tprivate readonly seenTerminalKeys = new Set<string>();\n\tprivate transientSequence = 0;\n\n\tconstructor(theme: Theme, requestRender: () => void, terminalHoldMs = DEFAULT_TERMINAL_HOLD_MS) {\n\t\tthis.theme = theme;\n\t\tthis.requestRender = requestRender;\n\t\tthis.terminalHoldMs = terminalHoldMs;\n\t}\n\n\tprivate rememberTerminal(key: string): void {\n\t\tthis.seenTerminalKeys.add(key);\n\t\twhile (this.seenTerminalKeys.size > MAX_SEEN_TERMINALS) {\n\t\t\tconst oldest = this.seenTerminalKeys.values().next().value;\n\t\t\tif (oldest === undefined) break;\n\t\t\tthis.seenTerminalKeys.delete(oldest);\n\t\t}\n\t}\n\n\tprivate addTransient(item: ActivityLaneItem): void {\n\t\tconst id = `${item.id}:${++this.transientSequence}`;\n\t\tthis.transient.set(id, { ...item, id });\n\t\tconst timer = setTimeout(() => {\n\t\t\tthis.transient.delete(id);\n\t\t\tthis.transientTimers.delete(id);\n\t\t\tthis.requestRender();\n\t\t}, this.terminalHoldMs);\n\t\tthis.transientTimers.set(id, timer);\n\t}\n\n\tprivate applyProjection(projection: ActivityLaneProjection, showNewTerminals: boolean): void {\n\t\tthis.canonical.clear();\n\t\tfor (const item of projection.active) this.canonical.set(item.id, item);\n\t\tfor (const item of projection.terminal.slice(-MAX_SEEN_TERMINALS)) {\n\t\t\tif (showNewTerminals && !this.seenTerminalKeys.has(item.id)) this.addTransient(item);\n\t\t\tthis.rememberTerminal(item.id);\n\t\t}\n\t\tthis.requestRender();\n\t}\n\n\treplaceCanonical(sessionKey: string, snapshot: ActivityLaneCanonicalSnapshot): void {\n\t\tif (this.sessionKey !== sessionKey) {\n\t\t\tthis.clearTransient();\n\t\t\tthis.live.clear();\n\t\t\tthis.seenTerminalKeys.clear();\n\t\t\tthis.sessionKey = sessionKey;\n\t\t}\n\t\tthis.applyProjection(projectActivityLane(snapshot), false);\n\t}\n\n\tupdateCanonical(sessionKey: string, snapshot: ActivityLaneCanonicalSnapshot): void {\n\t\tif (this.sessionKey !== sessionKey) {\n\t\t\tthis.replaceCanonical(sessionKey, snapshot);\n\t\t\treturn;\n\t\t}\n\t\tthis.applyProjection(projectActivityLane(snapshot), true);\n\t}\n\n\tstart(item: Omit<ActivityLaneItem, \"status\">): void {\n\t\tthis.live.set(item.id, { ...item, label: boundedLabel(item.label), status: \"active\" });\n\t\tthis.requestRender();\n\t}\n\n\twait(item: Omit<ActivityLaneItem, \"status\">): void {\n\t\tthis.live.set(item.id, { ...item, label: boundedLabel(item.label), status: \"waiting\" });\n\t\tthis.requestRender();\n\t}\n\n\tupdate(id: string, label: string): void {\n\t\tconst current = this.live.get(id);\n\t\tif (!current) return;\n\t\tthis.live.set(id, { ...current, label: boundedLabel(label) });\n\t\tthis.requestRender();\n\t}\n\n\tremove(id: string): void {\n\t\tif (this.live.delete(id)) this.requestRender();\n\t}\n\n\tremoveByPrefix(prefix: string): void {\n\t\tlet removed = false;\n\t\tfor (const id of this.live.keys()) {\n\t\t\tif (!id.startsWith(prefix)) continue;\n\t\t\tthis.live.delete(id);\n\t\t\tremoved = true;\n\t\t}\n\t\tif (removed) this.requestRender();\n\t}\n\n\tfinish(id: string, status: \"success\" | \"failure\" | \"neutral\", fallback?: Omit<ActivityLaneItem, \"status\">): void {\n\t\tconst current = this.live.get(id) ?? fallback;\n\t\tthis.live.delete(id);\n\t\tif (current) this.addTransient({ ...current, label: boundedLabel(current.label), status });\n\t\tthis.requestRender();\n\t}\n\n\tannounce(label: string, status: \"success\" | \"warning\" | \"failure\" | \"neutral\" = \"success\"): void {\n\t\tthis.addTransient({ id: \"notice\", kind: \"notice\", label: boundedLabel(label), status });\n\t\tthis.requestRender();\n\t}\n\n\tprivate clearTransient(): void {\n\t\tfor (const timer of this.transientTimers.values()) clearTimeout(timer);\n\t\tthis.transientTimers.clear();\n\t\tthis.transient.clear();\n\t}\n\n\tgetItems(): ActivityLaneItem[] {\n\t\t// Slot classification decides visibility; the turn state always feeds the turn slot.\n\t\treturn [...this.transient.values(), ...this.live.values(), ...this.canonical.values()];\n\t}\n\n\trender(width: number): string[] {\n\t\treturn renderActivityLaneLine(this.theme, this.getItems(), width);\n\t}\n\n\tinvalidate(): void {}\n\n\tdispose(): void {\n\t\tthis.clearTransient();\n\t\tthis.live.clear();\n\t\tthis.canonical.clear();\n\t\tthis.seenTerminalKeys.clear();\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"activity-lane.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/activity-lane.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Component } from \"@caupulican/pi-tui\";\nimport { truncateToWidth, visibleWidth } from \"@caupulican/pi-tui\";\nimport type { LaneRecord } from \"../../../core/autonomy/lane-tracker.ts\";\nimport { type GoalState, isGoalExecutionActive, isGoalUnfinishedStatus } from \"../../../core/goals/goal-state.ts\";\nimport type { TaskStep, TaskStepsState } from \"../../../core/tasks/task-state.ts\";\nimport type { Theme, ThemeColor } from \"../theme/theme.ts\";\n\nexport type ActivityLaneKind = \"runtime\" | \"tool\" | \"task\" | \"worker\" | \"goal\" | \"queue\" | \"notice\";\nexport type ActivityLaneStatus = \"active\" | \"waiting\" | \"success\" | \"warning\" | \"failure\" | \"neutral\";\n\nexport interface ActivityLaneItem {\n\tid: string;\n\tkind: ActivityLaneKind;\n\tlabel: string;\n\tstatus: ActivityLaneStatus;\n\t/** Short aggregation key (e.g. \"bash\", \"python\", \"agent\") for the concurrency slot. */\n\ttag?: string;\n}\n\nexport interface ActivityLaneCanonicalSnapshot {\n\tgoalState?: GoalState;\n\ttaskState?: TaskStepsState;\n\tlaneRecords: readonly LaneRecord[];\n}\n\nexport interface ActivityLaneProjection {\n\tactive: ActivityLaneItem[];\n\tterminal: ActivityLaneItem[];\n}\n\nconst DEFAULT_TERMINAL_HOLD_MS = 2_000;\nconst MAX_ACTIVITY_LABEL_LENGTH = 240;\nconst MAX_SEEN_TERMINALS = 512;\n\nexport const BACKGROUND_TOOL_ACTIVITY_ID_PREFIX = \"background-tool:\";\n\nexport function backgroundToolActivityId(taskId: string): string {\n\treturn `${BACKGROUND_TOOL_ACTIVITY_ID_PREFIX}${taskId}`;\n}\n\nexport function isBackgroundToolActivityItem(item: Pick<ActivityLaneItem, \"id\" | \"kind\">): boolean {\n\treturn item.kind === \"tool\" && item.id.startsWith(BACKGROUND_TOOL_ACTIVITY_ID_PREFIX);\n}\n\nconst STATUS_COLORS: Record<ActivityLaneStatus, ThemeColor> = {\n\tactive: \"muted\",\n\twaiting: \"warning\",\n\tsuccess: \"success\",\n\twarning: \"warning\",\n\tfailure: \"error\",\n\tneutral: \"muted\",\n};\n\nfunction boundedLabel(value: string): string {\n\tconst normalized = value.replace(/\\s+/g, \" \").trim();\n\treturn normalized.length <= MAX_ACTIVITY_LABEL_LENGTH\n\t\t? normalized\n\t\t: `${normalized.slice(0, MAX_ACTIVITY_LABEL_LENGTH - 1)}…`;\n}\n\nfunction taskLabel(step: TaskStep, state: TaskStepsState): string {\n\tconst total = state.steps.length + state.archive.completed + state.archive.cancelled;\n\tconst activeIndex = state.steps.findIndex((candidate) => candidate.id === step.id);\n\tconst archived = state.archive.completed + state.archive.cancelled;\n\tconst position = Math.min(total, archived + Math.max(0, activeIndex) + 1);\n\tconst prefix = step.status === \"blocked\" ? \"Blocked\" : step.status === \"pending\" ? \"Next\" : \"Step\";\n\tconst content = step.status === \"in_progress\" ? (step.activeForm ?? step.content) : step.content;\n\treturn boundedLabel(`${prefix} ${position}/${total} · ${content}`);\n}\n\nfunction projectTaskState(state: TaskStepsState | undefined): ActivityLaneProjection {\n\tif (!state) return { active: [], terminal: [] };\n\tconst inProgress = state.steps.find((step) => step.status === \"in_progress\");\n\tconst blocked = state.steps.find((step) => step.status === \"blocked\");\n\tconst pending = state.steps.find((step) => step.status === \"pending\");\n\tconst current = inProgress ?? blocked ?? pending;\n\tconst active = current\n\t\t? [\n\t\t\t\t{\n\t\t\t\t\tid: `task:${current.id}`,\n\t\t\t\t\tkind: \"task\" as const,\n\t\t\t\t\tlabel: taskLabel(current, state),\n\t\t\t\t\tstatus: current.status === \"blocked\" ? (\"waiting\" as const) : (\"active\" as const),\n\t\t\t\t},\n\t\t\t]\n\t\t: [];\n\tconst terminal = state.steps\n\t\t.filter((step) => step.status === \"completed\" || step.status === \"cancelled\")\n\t\t.map(\n\t\t\t(step): ActivityLaneItem => ({\n\t\t\t\tid: `terminal:task:${step.id}:${step.status}:${step.updatedAt}`,\n\t\t\t\tkind: \"task\",\n\t\t\t\tlabel: boundedLabel(\n\t\t\t\t\tstep.status === \"completed\" ? `Completed · ${step.content}` : `Cancelled · ${step.content}`,\n\t\t\t\t),\n\t\t\t\tstatus: step.status === \"completed\" ? \"success\" : \"neutral\",\n\t\t\t}),\n\t\t);\n\treturn { active, terminal };\n}\n\nfunction projectGoalState(state: GoalState | undefined): ActivityLaneProjection {\n\tif (!state) return { active: [], terminal: [] };\n\tconst satisfied = state.requirements.filter((requirement) => requirement.status === \"satisfied\").length;\n\tconst progress = state.requirements.length > 0 ? ` ${satisfied}/${state.requirements.length}` : \"\";\n\tif (isGoalUnfinishedStatus(state.status)) {\n\t\tconst goalActive = isGoalExecutionActive(state.status);\n\t\tconst stopped = goalActive ? \"\" : ` ${state.status.replace(\"_\", \" \")}`;\n\t\treturn {\n\t\t\tactive: [\n\t\t\t\t{\n\t\t\t\t\tid: `goal:${state.goalId}`,\n\t\t\t\t\tkind: \"goal\",\n\t\t\t\t\tlabel: boundedLabel(`Goal${stopped}${progress} · ${state.userGoal}`),\n\t\t\t\t\tstatus: goalActive ? \"active\" : \"waiting\",\n\t\t\t\t},\n\t\t\t],\n\t\t\tterminal: [],\n\t\t};\n\t}\n\treturn {\n\t\tactive: [],\n\t\tterminal: [\n\t\t\t{\n\t\t\t\tid: `terminal:goal:${state.goalId}:${state.status}:${state.updatedAt}`,\n\t\t\t\tkind: \"goal\",\n\t\t\t\tlabel: state.status === \"completed\" ? \"Goal achieved\" : \"Goal closed\",\n\t\t\t\tstatus: state.status === \"completed\" ? \"success\" : \"neutral\",\n\t\t\t},\n\t\t],\n\t};\n}\n\nfunction laneLabel(record: LaneRecord): string {\n\tconst runtime = record.type === \"tmux-worker\" ? \"tmux\" : \"agent\";\n\tconst label = record.label ?? record.laneId;\n\treturn boundedLabel(`${runtime} · ${label}`);\n}\n\nfunction projectLaneRecords(records: readonly LaneRecord[]): ActivityLaneProjection {\n\tconst workers = records.filter((record) => record.type === \"worker\" || record.type === \"tmux-worker\");\n\tconst active = workers\n\t\t.filter((record) => record.status === \"queued\" || record.status === \"running\")\n\t\t.map(\n\t\t\t(record): ActivityLaneItem => ({\n\t\t\t\tid: `worker:${record.laneId}`,\n\t\t\t\tkind: \"worker\",\n\t\t\t\tlabel: laneLabel(record),\n\t\t\t\tstatus: record.status === \"queued\" ? \"waiting\" : \"active\",\n\t\t\t\ttag:\n\t\t\t\t\trecord.type === \"tmux-worker\"\n\t\t\t\t\t\t? record.status === \"queued\"\n\t\t\t\t\t\t\t? \"tmux agent queued\"\n\t\t\t\t\t\t\t: \"tmux agent running\"\n\t\t\t\t\t\t: record.status === \"queued\"\n\t\t\t\t\t\t\t? \"agent queued\"\n\t\t\t\t\t\t\t: \"agent running\",\n\t\t\t}),\n\t\t);\n\t// Terminal workers are projected only after the foreground delivery owner resolves the\n\t// observation receipt. This prevents already-read events from flashing in the TUI.\n\treturn { active, terminal: [] };\n}\n\nexport function projectActivityLane(snapshot: ActivityLaneCanonicalSnapshot): ActivityLaneProjection {\n\tconst task = projectTaskState(snapshot.taskState);\n\tconst lanes = projectLaneRecords(snapshot.laneRecords);\n\tconst goal = projectGoalState(snapshot.goalState);\n\treturn {\n\t\tactive: [...task.active, ...lanes.active, ...goal.active],\n\t\tterminal: [...task.terminal, ...lanes.terminal, ...goal.terminal],\n\t};\n}\n\n/**\n * Slot layout. One row, fixed slot order and anchors, left to right by stability:\n *\n * ● working Step 2/5 · Confirming duplicate-charge risk 2 bash Queued 1 ● Read finished\n * turn plan (only elastic slot) concurrency/queue last event\n *\n * Only the plan slot truncates. When width runs out, whole slots drop right-to-left\n * (event, then concurrency) so surviving slots never shift position mid-turn.\n * Color carries status only; labels stay in the text/muted hierarchy.\n */\nconst TURN_TEXT_MAX = 32;\nconst EVENT_TEXT_MAX = 36;\nconst QUEUE_TEXT_MAX = 32;\nconst AGGREGATE_GROUP_MAX = 3;\nconst PLAN_TEXT_MIN = 24;\nconst SLOT_GAP_WIDTH = 2;\n\nfunction isTerminalStatus(status: ActivityLaneStatus): boolean {\n\treturn status === \"success\" || status === \"warning\" || status === \"failure\" || status === \"neutral\";\n}\n\ninterface AggregateGroup {\n\ttag: string;\n\tcount: number;\n\twaiting: boolean;\n}\n\ninterface LaneSlots {\n\tturn: ActivityLaneItem | undefined;\n\tplan: ActivityLaneItem | undefined;\n\tgroups: AggregateGroup[];\n\tqueue: ActivityLaneItem | undefined;\n\tevent: ActivityLaneItem | undefined;\n}\n\nfunction normalizeActivityTag(tag: string | undefined, fallback: \"tool\" | \"worker\"): string {\n\tconst normalized = (tag ?? fallback)\n\t\t.replace(/[_\\s-]+/g, \" \")\n\t\t.trim()\n\t\t.toLowerCase();\n\treturn normalized || fallback;\n}\n\nfunction classifySlots(items: readonly ActivityLaneItem[]): LaneSlots {\n\tlet turn: ActivityLaneItem | undefined;\n\tlet plan: ActivityLaneItem | undefined;\n\tlet goal: ActivityLaneItem | undefined;\n\tlet queue: ActivityLaneItem | undefined;\n\tlet event: ActivityLaneItem | undefined;\n\tconst groups = new Map<string, AggregateGroup>();\n\n\tfor (const item of items) {\n\t\tif (isTerminalStatus(item.status)) {\n\t\t\tevent = item; // last one wins: transients are ordered oldest-first\n\t\t\tcontinue;\n\t\t}\n\t\tswitch (item.kind) {\n\t\t\tcase \"runtime\":\n\t\t\t\t// Waiting states (retry countdowns) outrank plain working states.\n\t\t\t\tif (!turn || (item.status === \"waiting\" && turn.status !== \"waiting\")) turn = item;\n\t\t\t\tbreak;\n\t\t\tcase \"task\":\n\t\t\t\tplan ??= item;\n\t\t\t\tbreak;\n\t\t\tcase \"goal\":\n\t\t\t\tgoal ??= item;\n\t\t\t\tbreak;\n\t\t\tcase \"queue\":\n\t\t\t\tqueue ??= item;\n\t\t\t\tbreak;\n\t\t\tcase \"tool\":\n\t\t\tcase \"worker\": {\n\t\t\t\tconst tag = normalizeActivityTag(item.tag, item.kind);\n\t\t\t\tconst group = groups.get(tag) ?? { tag, count: 0, waiting: false };\n\t\t\t\tgroup.count += 1;\n\t\t\t\tif (item.status === \"waiting\") group.waiting = true;\n\t\t\t\tgroups.set(tag, group);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"notice\":\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn { turn, plan: plan ?? goal, groups: [...groups.values()], queue, event };\n}\n\nfunction renderConcurrency(theme: Theme, groups: readonly AggregateGroup[]): string {\n\tconst parts: string[] = [];\n\tconst shown = groups.slice(0, AGGREGATE_GROUP_MAX);\n\tfor (const group of shown) {\n\t\tconst tag = group.count === 1 ? group.tag : group.tag.replace(/\\bagent\\b/, \"agents\");\n\t\tparts.push(theme.fg(group.waiting ? \"warning\" : \"muted\", `${group.count} ${tag}`));\n\t}\n\tconst overflow = groups.length - shown.length;\n\tif (overflow > 0) parts.push(theme.fg(\"dim\", `+${overflow}`));\n\treturn parts.join(theme.fg(\"dim\", \" · \"));\n}\n\nexport function renderActivityLaneLine(theme: Theme, items: readonly ActivityLaneItem[], width: number): string[] {\n\tconst safeWidth = Math.max(1, width);\n\tif (items.length === 0 || safeWidth < 3) return [];\n\tconst slots = classifySlots(items);\n\tif (!slots.turn && !slots.plan && slots.groups.length === 0 && !slots.queue && !slots.event) return [];\n\n\tconst indent = \" \";\n\tconst gap = \" \".repeat(SLOT_GAP_WIDTH);\n\n\t// Turn slot: alive-anchor glyph plus a short state. The generic working state keeps the\n\t// word \"working\"; load-bearing runtime labels (retry, compaction, routing) pass through.\n\tlet turnPart = \"\";\n\tconst planFromTurn = slots.turn?.id === \"runtime:turn\" ? slots.turn.label : undefined;\n\tif (slots.turn) {\n\t\tconst text = slots.turn.id === \"runtime:turn\" ? \"working\" : slots.turn.label;\n\t\tconst dotColor: ThemeColor = slots.turn.status === \"waiting\" ? \"warning\" : \"accent\";\n\t\tturnPart = `${theme.fg(dotColor, \"●\")} ${theme.fg(\"muted\", truncateToWidth(text, TURN_TEXT_MAX, \"…\"))}`;\n\t}\n\n\t// Plan slot content: task step, else goal, else the live working message.\n\tconst planItem = slots.plan;\n\tconst planText = planItem?.label ?? planFromTurn ?? \"\";\n\tconst planColor: ThemeColor = planItem ? (planItem.status === \"waiting\" ? \"warning\" : \"text\") : \"muted\";\n\n\t// Right-aligned slots at natural size. Events and concurrency drop before the plan\n\t// shrinks below its preferred width; the user-owned queue state remains visible.\n\tlet concurrencyPart = renderConcurrency(theme, slots.groups);\n\tconst queuePart = slots.queue ? theme.fg(\"warning\", truncateToWidth(slots.queue.label, QUEUE_TEXT_MAX, \"…\")) : \"\";\n\tlet eventPart = slots.event\n\t\t? `${theme.fg(STATUS_COLORS[slots.event.status], \"●\")} ${theme.fg(\n\t\t\t\t\"muted\",\n\t\t\t\ttruncateToWidth(slots.event.label, EVENT_TEXT_MAX, \"…\"),\n\t\t\t)}`\n\t\t: \"\";\n\n\tconst leftBase = visibleWidth(indent) + (turnPart ? visibleWidth(turnPart) : 0);\n\tconst planGap = turnPart && planText ? SLOT_GAP_WIDTH : 0;\n\tconst rightPart = (): string => [concurrencyPart, queuePart, eventPart].filter(Boolean).join(gap);\n\tconst planBudget = (): number => {\n\t\tlet right = visibleWidth(rightPart());\n\t\tif (right > 0) right += SLOT_GAP_WIDTH; // breathing room before the right block\n\t\treturn safeWidth - leftBase - planGap - right;\n\t};\n\n\tif (planText && planBudget() < PLAN_TEXT_MIN && eventPart) eventPart = \"\";\n\tif (planText && planBudget() < PLAN_TEXT_MIN && concurrencyPart) concurrencyPart = \"\";\n\n\tconst planAvailable = Math.max(0, planBudget());\n\tconst planPart = planText ? theme.fg(planColor, truncateToWidth(planText, planAvailable, \"…\")) : \"\";\n\n\tconst renderedRightPart = rightPart();\n\n\tlet line = indent + turnPart + (turnPart && planPart ? gap : \"\") + planPart;\n\tif (renderedRightPart) {\n\t\tconst pad = Math.max(SLOT_GAP_WIDTH, safeWidth - visibleWidth(line) - visibleWidth(renderedRightPart));\n\t\tline += \" \".repeat(pad) + renderedRightPart;\n\t}\n\treturn [truncateToWidth(line, safeWidth, \"\")];\n}\n\nexport class ActivityLaneComponent implements Component {\n\tprivate readonly theme: Theme;\n\tprivate readonly requestRender: () => void;\n\tprivate readonly terminalHoldMs: number;\n\tprivate sessionKey: string | undefined;\n\tprivate readonly canonical = new Map<string, ActivityLaneItem>();\n\tprivate readonly live = new Map<string, ActivityLaneItem>();\n\tprivate readonly transient = new Map<string, ActivityLaneItem>();\n\tprivate readonly transientTimers = new Map<string, ReturnType<typeof setTimeout>>();\n\tprivate readonly seenTerminalKeys = new Set<string>();\n\tprivate transientSequence = 0;\n\n\tconstructor(theme: Theme, requestRender: () => void, terminalHoldMs = DEFAULT_TERMINAL_HOLD_MS) {\n\t\tthis.theme = theme;\n\t\tthis.requestRender = requestRender;\n\t\tthis.terminalHoldMs = terminalHoldMs;\n\t}\n\n\tprivate rememberTerminal(key: string): void {\n\t\tthis.seenTerminalKeys.add(key);\n\t\twhile (this.seenTerminalKeys.size > MAX_SEEN_TERMINALS) {\n\t\t\tconst oldest = this.seenTerminalKeys.values().next().value;\n\t\t\tif (oldest === undefined) break;\n\t\t\tthis.seenTerminalKeys.delete(oldest);\n\t\t}\n\t}\n\n\tprivate addTransient(item: ActivityLaneItem): void {\n\t\tconst id = `${item.id}:${++this.transientSequence}`;\n\t\tthis.transient.set(id, { ...item, id });\n\t\tconst timer = setTimeout(() => {\n\t\t\tthis.transient.delete(id);\n\t\t\tthis.transientTimers.delete(id);\n\t\t\tthis.requestRender();\n\t\t}, this.terminalHoldMs);\n\t\tthis.transientTimers.set(id, timer);\n\t}\n\n\tprivate applyProjection(projection: ActivityLaneProjection, showNewTerminals: boolean): void {\n\t\tthis.canonical.clear();\n\t\tfor (const item of projection.active) this.canonical.set(item.id, item);\n\t\tfor (const item of projection.terminal.slice(-MAX_SEEN_TERMINALS)) {\n\t\t\tif (showNewTerminals && !this.seenTerminalKeys.has(item.id)) this.addTransient(item);\n\t\t\tthis.rememberTerminal(item.id);\n\t\t}\n\t\tthis.requestRender();\n\t}\n\n\treplaceCanonical(sessionKey: string, snapshot: ActivityLaneCanonicalSnapshot): void {\n\t\tif (this.sessionKey !== sessionKey) {\n\t\t\tthis.clearTransient();\n\t\t\tthis.live.clear();\n\t\t\tthis.seenTerminalKeys.clear();\n\t\t\tthis.sessionKey = sessionKey;\n\t\t}\n\t\tthis.applyProjection(projectActivityLane(snapshot), false);\n\t}\n\n\tupdateCanonical(sessionKey: string, snapshot: ActivityLaneCanonicalSnapshot): void {\n\t\tif (this.sessionKey !== sessionKey) {\n\t\t\tthis.replaceCanonical(sessionKey, snapshot);\n\t\t\treturn;\n\t\t}\n\t\tthis.applyProjection(projectActivityLane(snapshot), true);\n\t}\n\n\tstart(item: Omit<ActivityLaneItem, \"status\">): void {\n\t\tthis.live.set(item.id, { ...item, label: boundedLabel(item.label), status: \"active\" });\n\t\tthis.requestRender();\n\t}\n\n\twait(item: Omit<ActivityLaneItem, \"status\">): void {\n\t\tthis.live.set(item.id, { ...item, label: boundedLabel(item.label), status: \"waiting\" });\n\t\tthis.requestRender();\n\t}\n\n\tupdate(id: string, label: string): void {\n\t\tconst current = this.live.get(id);\n\t\tif (!current) return;\n\t\tthis.live.set(id, { ...current, label: boundedLabel(label) });\n\t\tthis.requestRender();\n\t}\n\n\tremove(id: string): void {\n\t\tif (this.live.delete(id)) this.requestRender();\n\t}\n\n\tremoveByPrefix(prefix: string): void {\n\t\tlet removed = false;\n\t\tfor (const id of this.live.keys()) {\n\t\t\tif (!id.startsWith(prefix)) continue;\n\t\t\tthis.live.delete(id);\n\t\t\tremoved = true;\n\t\t}\n\t\tif (removed) this.requestRender();\n\t}\n\n\tfinish(id: string, status: \"success\" | \"failure\" | \"neutral\", fallback?: Omit<ActivityLaneItem, \"status\">): void {\n\t\tconst current = this.live.get(id) ?? fallback;\n\t\tthis.live.delete(id);\n\t\tif (current) this.addTransient({ ...current, label: boundedLabel(current.label), status });\n\t\tthis.requestRender();\n\t}\n\n\tannounce(label: string, status: \"success\" | \"warning\" | \"failure\" | \"neutral\" = \"success\"): void {\n\t\tthis.addTransient({ id: \"notice\", kind: \"notice\", label: boundedLabel(label), status });\n\t\tthis.requestRender();\n\t}\n\n\tprivate clearTransient(): void {\n\t\tfor (const timer of this.transientTimers.values()) clearTimeout(timer);\n\t\tthis.transientTimers.clear();\n\t\tthis.transient.clear();\n\t}\n\n\tgetItems(): ActivityLaneItem[] {\n\t\t// Slot classification decides visibility; the turn state always feeds the turn slot.\n\t\treturn [...this.transient.values(), ...this.live.values(), ...this.canonical.values()];\n\t}\n\n\trender(width: number): string[] {\n\t\treturn renderActivityLaneLine(this.theme, this.getItems(), width);\n\t}\n\n\tinvalidate(): void {}\n\n\tdispose(): void {\n\t\tthis.clearTransient();\n\t\tthis.live.clear();\n\t\tthis.canonical.clear();\n\t\tthis.seenTerminalKeys.clear();\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"custom-message.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/custom-message.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"custom-message.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/custom-message.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE/D,OAAO,EAGN,SAAS,EAET,KAAK,aAAa,EAIlB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAWzE;;;GAGG;AACH,qBAAa,sBAAuB,SAAQ,SAAS;IACpD,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,cAAc,CAAC,CAAkB;IACzC,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,eAAe,CAAC,CAAY;IACpC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,SAAS,CAAS;IAE1B,YACC,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,EAC/B,cAAc,CAAC,EAAE,eAAe,EAChC,aAAa,GAAE,aAAkC,EAajD;IAED,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAKnC;IAEQ,UAAU,IAAI,IAAI,CAG1B;IAED,OAAO,CAAC,OAAO;CAuDf"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import { Box, Container, Markdown, Spacer, Text } from "@caupulican/pi-tui";
|
|
1
|
+
import { Box, Container, Markdown, Spacer, Text, truncateToWidth, } from "@caupulican/pi-tui";
|
|
2
|
+
import { createBackgroundActivitySummaryContract, isBackgroundActivitySummaryContract, } from "../../../core/foreground-terminal-handoff-controller.js";
|
|
3
|
+
import { isPlainRecord } from "../../../core/util/value-guards.js";
|
|
2
4
|
import { getMarkdownTheme, theme } from "../theme/theme.js";
|
|
3
5
|
import { renderTitleBadge } from "./tool-title.js";
|
|
4
6
|
/**
|
|
@@ -34,6 +36,12 @@ export class CustomMessageComponent extends Container {
|
|
|
34
36
|
this.customComponent = undefined;
|
|
35
37
|
}
|
|
36
38
|
this.removeChild(this.box);
|
|
39
|
+
const backgroundSummary = formatBackgroundActivitySummary(this.message);
|
|
40
|
+
if (backgroundSummary) {
|
|
41
|
+
this.customComponent = new BackgroundActivitySummaryComponent(backgroundSummary);
|
|
42
|
+
this.addChild(this.customComponent);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
37
45
|
// Try custom renderer first - it handles its own styling
|
|
38
46
|
if (this.customRenderer) {
|
|
39
47
|
try {
|
|
@@ -71,4 +79,120 @@ export class CustomMessageComponent extends Container {
|
|
|
71
79
|
}));
|
|
72
80
|
}
|
|
73
81
|
}
|
|
82
|
+
function boundedIds(ids, totalCount) {
|
|
83
|
+
const shown = ids.slice(0, 4);
|
|
84
|
+
const omitted = Math.max(0, totalCount - shown.length);
|
|
85
|
+
return `[${shown.join(", ")}${omitted > 0 ? `, +${omitted}` : ""}]`;
|
|
86
|
+
}
|
|
87
|
+
class BackgroundActivitySummaryComponent {
|
|
88
|
+
constructor(summary) {
|
|
89
|
+
this.summary = summary;
|
|
90
|
+
}
|
|
91
|
+
render(width) {
|
|
92
|
+
const line = `${theme.fg(this.summary.status, "•")} ${theme.fg("muted", this.summary.text)}`;
|
|
93
|
+
return [truncateToWidth(line, Math.max(1, width), "…")];
|
|
94
|
+
}
|
|
95
|
+
invalidate() { }
|
|
96
|
+
}
|
|
97
|
+
function noun(count, singular) {
|
|
98
|
+
return count === 1 ? singular : `${singular}s`;
|
|
99
|
+
}
|
|
100
|
+
function formatCountedStatus(count, singularNoun, singularVerb, pluralVerb, ids) {
|
|
101
|
+
if (count === 0)
|
|
102
|
+
return undefined;
|
|
103
|
+
const verb = count === 1 ? singularVerb : pluralVerb;
|
|
104
|
+
const idsText = ids.length > 0 ? ` ${boundedIds(ids, count)}` : "";
|
|
105
|
+
return `${count} ${noun(count, singularNoun)} ${verb}${idsText}`;
|
|
106
|
+
}
|
|
107
|
+
function fallbackBackgroundActivitySummary(kind) {
|
|
108
|
+
const singularNoun = kind === "agent" ? "agent" : "background task";
|
|
109
|
+
return {
|
|
110
|
+
text: `Background ${singularNoun} activity unavailable`,
|
|
111
|
+
status: "warning",
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
function recordSummaryItems(kind, records) {
|
|
115
|
+
const items = [];
|
|
116
|
+
for (const record of records) {
|
|
117
|
+
const id = kind === "agent" ? record.laneId : record.taskId;
|
|
118
|
+
if (typeof id !== "string" || id.length === 0 || typeof record.status !== "string")
|
|
119
|
+
return undefined;
|
|
120
|
+
if (kind === "agent") {
|
|
121
|
+
const claimNeedsReview = isPlainRecord(record.claim) && record.claim.parentReviewRequired === true;
|
|
122
|
+
const status = record.status === "failed" || record.status === "timeout" || record.status === "budget_exhausted"
|
|
123
|
+
? "failed"
|
|
124
|
+
: record.status === "canceled"
|
|
125
|
+
? "canceled"
|
|
126
|
+
: claimNeedsReview || record.status === "partial" || record.status === "blocked"
|
|
127
|
+
? "attention"
|
|
128
|
+
: record.status === "succeeded"
|
|
129
|
+
? "success"
|
|
130
|
+
: undefined;
|
|
131
|
+
if (!status)
|
|
132
|
+
return undefined;
|
|
133
|
+
items.push({ id, status });
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
if (record.status !== "completed" && record.status !== "failed" && record.status !== "canceled")
|
|
137
|
+
return undefined;
|
|
138
|
+
items.push({
|
|
139
|
+
id,
|
|
140
|
+
status: record.status === "failed" ? "failed" : record.status === "canceled" ? "canceled" : "success",
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
return items;
|
|
144
|
+
}
|
|
145
|
+
function readSummaryContract(message, kind, items) {
|
|
146
|
+
if (isPlainRecord(message.details) && isBackgroundActivitySummaryContract(message.details.summary)) {
|
|
147
|
+
const summary = message.details.summary;
|
|
148
|
+
if (summary.kind !== kind || !items || summary.totalCount < items.length)
|
|
149
|
+
return undefined;
|
|
150
|
+
const includedCounts = {
|
|
151
|
+
attention: items.filter((item) => item.status === "attention").length,
|
|
152
|
+
failed: items.filter((item) => item.status === "failed").length,
|
|
153
|
+
canceled: items.filter((item) => item.status === "canceled").length,
|
|
154
|
+
};
|
|
155
|
+
if (summary.attentionCount < includedCounts.attention ||
|
|
156
|
+
summary.failedCount < includedCounts.failed ||
|
|
157
|
+
summary.canceledCount < includedCounts.canceled) {
|
|
158
|
+
return undefined;
|
|
159
|
+
}
|
|
160
|
+
return summary;
|
|
161
|
+
}
|
|
162
|
+
return items && items.length > 0 ? createBackgroundActivitySummaryContract(kind, items) : undefined;
|
|
163
|
+
}
|
|
164
|
+
function formatBackgroundActivitySummary(message) {
|
|
165
|
+
const kind = message.customType === "background-worker-completion"
|
|
166
|
+
? "agent"
|
|
167
|
+
: message.customType === "background-tool-completion"
|
|
168
|
+
? "task"
|
|
169
|
+
: undefined;
|
|
170
|
+
if (!kind)
|
|
171
|
+
return undefined;
|
|
172
|
+
if (!isPlainRecord(message.details) || !Array.isArray(message.details.records))
|
|
173
|
+
return fallbackBackgroundActivitySummary(kind);
|
|
174
|
+
if (message.details.records.some((record) => !isPlainRecord(record)))
|
|
175
|
+
return fallbackBackgroundActivitySummary(kind);
|
|
176
|
+
const records = message.details.records;
|
|
177
|
+
const items = recordSummaryItems(kind, records);
|
|
178
|
+
const summary = readSummaryContract(message, kind, items);
|
|
179
|
+
if (!summary || !items)
|
|
180
|
+
return fallbackBackgroundActivitySummary(kind);
|
|
181
|
+
const nounName = kind === "agent" ? "agent" : "background task";
|
|
182
|
+
const attentionIds = items.filter((item) => item.status === "attention").map((item) => item.id);
|
|
183
|
+
const failedIds = items.filter((item) => item.status === "failed").map((item) => item.id);
|
|
184
|
+
const canceledIds = items.filter((item) => item.status === "canceled").map((item) => item.id);
|
|
185
|
+
const text = [
|
|
186
|
+
`${summary.totalCount} ${noun(summary.totalCount, nounName)} finished`,
|
|
187
|
+
formatCountedStatus(summary.attentionCount, nounName, "needs verification", "need verification", attentionIds),
|
|
188
|
+
formatCountedStatus(summary.failedCount, nounName, "failed", "failed", failedIds),
|
|
189
|
+
formatCountedStatus(summary.canceledCount, nounName, "canceled", "canceled", canceledIds),
|
|
190
|
+
]
|
|
191
|
+
.filter((part) => part !== undefined)
|
|
192
|
+
.join(" | ");
|
|
193
|
+
return {
|
|
194
|
+
text,
|
|
195
|
+
status: summary.failedCount > 0 ? "error" : summary.attentionCount + summary.canceledCount > 0 ? "warning" : "success",
|
|
196
|
+
};
|
|
197
|
+
}
|
|
74
198
|
//# sourceMappingURL=custom-message.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"custom-message.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/custom-message.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CustomMessage } from \"@caupulican/pi-agent-core\";\nimport type { TextContent } from \"@caupulican/pi-ai\";\nimport type { Component } from \"@caupulican/pi-tui\";\nimport { Box, Container, Markdown, type MarkdownTheme, Spacer, Text } from \"@caupulican/pi-tui\";\nimport type { MessageRenderer } from \"../../../core/extensions/types.ts\";\nimport { getMarkdownTheme, theme } from \"../theme/theme.ts\";\nimport { renderTitleBadge } from \"./tool-title.ts\";\n\n/**\n * Component that renders a custom message entry from extensions.\n * Uses distinct styling to differentiate from user messages.\n */\nexport class CustomMessageComponent extends Container {\n\tprivate message: CustomMessage<unknown>;\n\tprivate customRenderer?: MessageRenderer;\n\tprivate box: Box;\n\tprivate customComponent?: Component;\n\tprivate markdownTheme: MarkdownTheme;\n\tprivate _expanded = false;\n\n\tconstructor(\n\t\tmessage: CustomMessage<unknown>,\n\t\tcustomRenderer?: MessageRenderer,\n\t\tmarkdownTheme: MarkdownTheme = getMarkdownTheme(),\n\t) {\n\t\tsuper();\n\t\tthis.message = message;\n\t\tthis.customRenderer = customRenderer;\n\t\tthis.markdownTheme = markdownTheme;\n\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Create box with purple background (used for default rendering)\n\t\tthis.box = new Box(1, 1, (t) => theme.bg(\"customMessageBg\", t));\n\n\t\tthis.rebuild();\n\t}\n\n\tsetExpanded(expanded: boolean): void {\n\t\tif (this._expanded !== expanded) {\n\t\t\tthis._expanded = expanded;\n\t\t\tthis.rebuild();\n\t\t}\n\t}\n\n\toverride invalidate(): void {\n\t\tsuper.invalidate();\n\t\tthis.rebuild();\n\t}\n\n\tprivate rebuild(): void {\n\t\t// Remove previous content component\n\t\tif (this.customComponent) {\n\t\t\tthis.removeChild(this.customComponent);\n\t\t\tthis.customComponent = undefined;\n\t\t}\n\t\tthis.removeChild(this.box);\n\n\t\t// Try custom renderer first - it handles its own styling\n\t\tif (this.customRenderer) {\n\t\t\ttry {\n\t\t\t\tconst component = this.customRenderer(this.message, { expanded: this._expanded }, theme);\n\t\t\t\tif (component) {\n\t\t\t\t\t// Custom renderer provides its own styled component\n\t\t\t\t\tthis.customComponent = component;\n\t\t\t\t\tthis.addChild(component);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Fall through to default rendering\n\t\t\t}\n\t\t}\n\n\t\t// Default rendering uses our box\n\t\tthis.addChild(this.box);\n\t\tthis.box.clear();\n\n\t\t// Default rendering: label + content\n\t\tthis.box.addChild(new Text(renderTitleBadge(theme, { label: this.message.customType }), 0, 0));\n\t\tthis.box.addChild(new Spacer(1));\n\n\t\t// Extract text content\n\t\tlet text: string;\n\t\tif (typeof this.message.content === \"string\") {\n\t\t\ttext = this.message.content;\n\t\t} else {\n\t\t\ttext = this.message.content\n\t\t\t\t.filter((c): c is TextContent => c.type === \"text\")\n\t\t\t\t.map((c) => c.text)\n\t\t\t\t.join(\"\\n\");\n\t\t}\n\n\t\tthis.box.addChild(\n\t\t\tnew Markdown(text, 0, 0, this.markdownTheme, {\n\t\t\t\tcolor: (text: string) => theme.fg(\"customMessageText\", text),\n\t\t\t}),\n\t\t);\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"custom-message.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/custom-message.ts"],"names":[],"mappings":"AAEA,OAAO,EACN,GAAG,EAEH,SAAS,EACT,QAAQ,EAER,MAAM,EACN,IAAI,EACJ,eAAe,GACf,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAGN,uCAAuC,EACvC,mCAAmC,GACnC,MAAM,yDAAyD,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD;;;GAGG;AACH,MAAM,OAAO,sBAAuB,SAAQ,SAAS;IAQpD,YACC,OAA+B,EAC/B,cAAgC,EAChC,aAAa,GAAkB,gBAAgB,EAAE;QAEjD,KAAK,EAAE,CAAC;QAPD,cAAS,GAAG,KAAK,CAAC;QAQzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QAEnC,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAE7B,iEAAiE;QACjE,IAAI,CAAC,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,CAAC;QAEhE,IAAI,CAAC,OAAO,EAAE,CAAC;IAChB,CAAC;IAED,WAAW,CAAC,QAAiB;QAC5B,IAAI,IAAI,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;YACjC,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;YAC1B,IAAI,CAAC,OAAO,EAAE,CAAC;QAChB,CAAC;IACF,CAAC;IAEQ,UAAU;QAClB,KAAK,CAAC,UAAU,EAAE,CAAC;QACnB,IAAI,CAAC,OAAO,EAAE,CAAC;IAChB,CAAC;IAEO,OAAO;QACd,oCAAoC;QACpC,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YACvC,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC;QAClC,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAE3B,MAAM,iBAAiB,GAAG,+BAA+B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxE,IAAI,iBAAiB,EAAE,CAAC;YACvB,IAAI,CAAC,eAAe,GAAG,IAAI,kCAAkC,CAAC,iBAAiB,CAAC,CAAC;YACjF,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YACpC,OAAO;QACR,CAAC;QAED,yDAAyD;QACzD,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACzB,IAAI,CAAC;gBACJ,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,KAAK,CAAC,CAAC;gBACzF,IAAI,SAAS,EAAE,CAAC;oBACf,oDAAoD;oBACpD,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC;oBACjC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;oBACzB,OAAO;gBACR,CAAC;YACF,CAAC;YAAC,MAAM,CAAC;gBACR,oCAAoC;YACrC,CAAC;QACF,CAAC;QAED,iCAAiC;QACjC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;QAEjB,qCAAqC;QACrC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/F,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAEjC,uBAAuB;QACvB,IAAI,IAAY,CAAC;QACjB,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC9C,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;QAC7B,CAAC;aAAM,CAAC;YACP,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO;iBACzB,MAAM,CAAC,CAAC,CAAC,EAAoB,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;iBAClD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;iBAClB,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,QAAQ,CAChB,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE;YAC5C,KAAK,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,mBAAmB,EAAE,IAAI,CAAC;SAC5D,CAAC,CACF,CAAC;IACH,CAAC;CACD;AAED,SAAS,UAAU,CAAC,GAAsB,EAAE,UAAkB;IAC7D,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IACvD,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;AACrE,CAAC;AAOD,MAAM,kCAAkC;IAGvC,YAAY,OAAkC;QAC7C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACxB,CAAC;IAED,MAAM,CAAC,KAAa;QACnB,MAAM,IAAI,GAAG,GAAG,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7F,OAAO,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IACzD,CAAC;IAED,UAAU,KAAU,CAAC;CACrB;AAED,SAAS,IAAI,CAAC,KAAa,EAAE,QAAgB;IAC5C,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,CAAC;AAChD,CAAC;AAED,SAAS,mBAAmB,CAC3B,KAAa,EACb,YAAoB,EACpB,YAAoB,EACpB,UAAkB,EAClB,GAAsB;IAEtB,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAClC,MAAM,IAAI,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC;IACrD,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACnE,OAAO,GAAG,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,IAAI,GAAG,OAAO,EAAE,CAAC;AAClE,CAAC;AAED,SAAS,iCAAiC,CAAC,IAAsB;IAChE,MAAM,YAAY,GAAG,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC;IACpE,OAAO;QACN,IAAI,EAAE,cAAc,YAAY,uBAAuB;QACvD,MAAM,EAAE,SAAS;KACjB,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAC1B,IAAsB,EACtB,OAA2C;IAE3C,MAAM,KAAK,GAAoC,EAAE,CAAC;IAClD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC9B,MAAM,EAAE,GAAG,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;QAC5D,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QACrG,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACtB,MAAM,gBAAgB,GAAG,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,oBAAoB,KAAK,IAAI,CAAC;YACnG,MAAM,MAAM,GACX,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,kBAAkB;gBAChG,CAAC,CAAC,QAAQ;gBACV,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,UAAU;oBAC7B,CAAC,CAAC,UAAU;oBACZ,CAAC,CAAC,gBAAgB,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;wBAC/E,CAAC,CAAC,WAAW;wBACb,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,WAAW;4BAC9B,CAAC,CAAC,SAAS;4BACX,CAAC,CAAC,SAAS,CAAC;YACjB,IAAI,CAAC,MAAM;gBAAE,OAAO,SAAS,CAAC;YAC9B,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YAC3B,SAAS;QACV,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU;YAAE,OAAO,SAAS,CAAC;QAClH,KAAK,CAAC,IAAI,CAAC;YACV,EAAE;YACF,MAAM,EAAE,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;SACrG,CAAC,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED,SAAS,mBAAmB,CAC3B,OAA+B,EAC/B,IAAsB,EACtB,KAA2D;IAE3D,IAAI,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,mCAAmC,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACpG,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;QACxC,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC,UAAU,GAAG,KAAK,CAAC,MAAM;YAAE,OAAO,SAAS,CAAC;QAC3F,MAAM,cAAc,GAAG;YACtB,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,MAAM;YACrE,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,MAAM;YAC/D,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,MAAM;SACnE,CAAC;QACF,IACC,OAAO,CAAC,cAAc,GAAG,cAAc,CAAC,SAAS;YACjD,OAAO,CAAC,WAAW,GAAG,cAAc,CAAC,MAAM;YAC3C,OAAO,CAAC,aAAa,GAAG,cAAc,CAAC,QAAQ,EAC9C,CAAC;YACF,OAAO,SAAS,CAAC;QAClB,CAAC;QACD,OAAO,OAAO,CAAC;IAChB,CAAC;IACD,OAAO,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,uCAAuC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACrG,CAAC;AAED,SAAS,+BAA+B,CAAC,OAA+B;IACvE,MAAM,IAAI,GACT,OAAO,CAAC,UAAU,KAAK,8BAA8B;QACpD,CAAC,CAAC,OAAO;QACT,CAAC,CAAC,OAAO,CAAC,UAAU,KAAK,4BAA4B;YACpD,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,SAAS,CAAC;IACf,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5B,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;QAC7E,OAAO,iCAAiC,CAAC,IAAI,CAAC,CAAC;IAChD,IAAI,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAAE,OAAO,iCAAiC,CAAC,IAAI,CAAC,CAAC;IACrH,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,OAAoC,CAAC;IACrE,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,mBAAmB,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAC1D,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK;QAAE,OAAO,iCAAiC,CAAC,IAAI,CAAC,CAAC;IACvE,MAAM,QAAQ,GAAG,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC;IAChE,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChG,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1F,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9F,MAAM,IAAI,GAAG;QACZ,GAAG,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,WAAW;QACtE,mBAAmB,CAAC,OAAO,CAAC,cAAc,EAAE,QAAQ,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,YAAY,CAAC;QAC9G,mBAAmB,CAAC,OAAO,CAAC,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC;QACjF,mBAAmB,CAAC,OAAO,CAAC,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,CAAC;KACzF;SACC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC;SACpD,IAAI,CAAC,KAAK,CAAC,CAAC;IACd,OAAO;QACN,IAAI;QACJ,MAAM,EACL,OAAO,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,GAAG,OAAO,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;KAC/G,CAAC;AACH,CAAC","sourcesContent":["import type { CustomMessage } from \"@caupulican/pi-agent-core\";\nimport type { TextContent } from \"@caupulican/pi-ai\";\nimport {\n\tBox,\n\ttype Component,\n\tContainer,\n\tMarkdown,\n\ttype MarkdownTheme,\n\tSpacer,\n\tText,\n\ttruncateToWidth,\n} from \"@caupulican/pi-tui\";\nimport type { MessageRenderer } from \"../../../core/extensions/types.ts\";\nimport {\n\ttype BackgroundActivitySummaryContract,\n\ttype BackgroundActivitySummaryItem,\n\tcreateBackgroundActivitySummaryContract,\n\tisBackgroundActivitySummaryContract,\n} from \"../../../core/foreground-terminal-handoff-controller.ts\";\nimport { isPlainRecord } from \"../../../core/util/value-guards.ts\";\nimport { getMarkdownTheme, theme } from \"../theme/theme.ts\";\nimport { renderTitleBadge } from \"./tool-title.ts\";\n\n/**\n * Component that renders a custom message entry from extensions.\n * Uses distinct styling to differentiate from user messages.\n */\nexport class CustomMessageComponent extends Container {\n\tprivate message: CustomMessage<unknown>;\n\tprivate customRenderer?: MessageRenderer;\n\tprivate box: Box;\n\tprivate customComponent?: Component;\n\tprivate markdownTheme: MarkdownTheme;\n\tprivate _expanded = false;\n\n\tconstructor(\n\t\tmessage: CustomMessage<unknown>,\n\t\tcustomRenderer?: MessageRenderer,\n\t\tmarkdownTheme: MarkdownTheme = getMarkdownTheme(),\n\t) {\n\t\tsuper();\n\t\tthis.message = message;\n\t\tthis.customRenderer = customRenderer;\n\t\tthis.markdownTheme = markdownTheme;\n\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Create box with purple background (used for default rendering)\n\t\tthis.box = new Box(1, 1, (t) => theme.bg(\"customMessageBg\", t));\n\n\t\tthis.rebuild();\n\t}\n\n\tsetExpanded(expanded: boolean): void {\n\t\tif (this._expanded !== expanded) {\n\t\t\tthis._expanded = expanded;\n\t\t\tthis.rebuild();\n\t\t}\n\t}\n\n\toverride invalidate(): void {\n\t\tsuper.invalidate();\n\t\tthis.rebuild();\n\t}\n\n\tprivate rebuild(): void {\n\t\t// Remove previous content component\n\t\tif (this.customComponent) {\n\t\t\tthis.removeChild(this.customComponent);\n\t\t\tthis.customComponent = undefined;\n\t\t}\n\t\tthis.removeChild(this.box);\n\n\t\tconst backgroundSummary = formatBackgroundActivitySummary(this.message);\n\t\tif (backgroundSummary) {\n\t\t\tthis.customComponent = new BackgroundActivitySummaryComponent(backgroundSummary);\n\t\t\tthis.addChild(this.customComponent);\n\t\t\treturn;\n\t\t}\n\n\t\t// Try custom renderer first - it handles its own styling\n\t\tif (this.customRenderer) {\n\t\t\ttry {\n\t\t\t\tconst component = this.customRenderer(this.message, { expanded: this._expanded }, theme);\n\t\t\t\tif (component) {\n\t\t\t\t\t// Custom renderer provides its own styled component\n\t\t\t\t\tthis.customComponent = component;\n\t\t\t\t\tthis.addChild(component);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Fall through to default rendering\n\t\t\t}\n\t\t}\n\n\t\t// Default rendering uses our box\n\t\tthis.addChild(this.box);\n\t\tthis.box.clear();\n\n\t\t// Default rendering: label + content\n\t\tthis.box.addChild(new Text(renderTitleBadge(theme, { label: this.message.customType }), 0, 0));\n\t\tthis.box.addChild(new Spacer(1));\n\n\t\t// Extract text content\n\t\tlet text: string;\n\t\tif (typeof this.message.content === \"string\") {\n\t\t\ttext = this.message.content;\n\t\t} else {\n\t\t\ttext = this.message.content\n\t\t\t\t.filter((c): c is TextContent => c.type === \"text\")\n\t\t\t\t.map((c) => c.text)\n\t\t\t\t.join(\"\\n\");\n\t\t}\n\n\t\tthis.box.addChild(\n\t\t\tnew Markdown(text, 0, 0, this.markdownTheme, {\n\t\t\t\tcolor: (text: string) => theme.fg(\"customMessageText\", text),\n\t\t\t}),\n\t\t);\n\t}\n}\n\nfunction boundedIds(ids: readonly string[], totalCount: number): string {\n\tconst shown = ids.slice(0, 4);\n\tconst omitted = Math.max(0, totalCount - shown.length);\n\treturn `[${shown.join(\", \")}${omitted > 0 ? `, +${omitted}` : \"\"}]`;\n}\n\ninterface BackgroundActivitySummary {\n\ttext: string;\n\tstatus: \"success\" | \"warning\" | \"error\";\n}\n\nclass BackgroundActivitySummaryComponent implements Component {\n\tprivate readonly summary: BackgroundActivitySummary;\n\n\tconstructor(summary: BackgroundActivitySummary) {\n\t\tthis.summary = summary;\n\t}\n\n\trender(width: number): string[] {\n\t\tconst line = `${theme.fg(this.summary.status, \"•\")} ${theme.fg(\"muted\", this.summary.text)}`;\n\t\treturn [truncateToWidth(line, Math.max(1, width), \"…\")];\n\t}\n\n\tinvalidate(): void {}\n}\n\nfunction noun(count: number, singular: string): string {\n\treturn count === 1 ? singular : `${singular}s`;\n}\n\nfunction formatCountedStatus(\n\tcount: number,\n\tsingularNoun: string,\n\tsingularVerb: string,\n\tpluralVerb: string,\n\tids: readonly string[],\n): string | undefined {\n\tif (count === 0) return undefined;\n\tconst verb = count === 1 ? singularVerb : pluralVerb;\n\tconst idsText = ids.length > 0 ? ` ${boundedIds(ids, count)}` : \"\";\n\treturn `${count} ${noun(count, singularNoun)} ${verb}${idsText}`;\n}\n\nfunction fallbackBackgroundActivitySummary(kind: \"agent\" | \"task\"): BackgroundActivitySummary {\n\tconst singularNoun = kind === \"agent\" ? \"agent\" : \"background task\";\n\treturn {\n\t\ttext: `Background ${singularNoun} activity unavailable`,\n\t\tstatus: \"warning\",\n\t};\n}\n\nfunction recordSummaryItems(\n\tkind: \"agent\" | \"task\",\n\trecords: readonly Record<string, unknown>[],\n): BackgroundActivitySummaryItem[] | undefined {\n\tconst items: BackgroundActivitySummaryItem[] = [];\n\tfor (const record of records) {\n\t\tconst id = kind === \"agent\" ? record.laneId : record.taskId;\n\t\tif (typeof id !== \"string\" || id.length === 0 || typeof record.status !== \"string\") return undefined;\n\t\tif (kind === \"agent\") {\n\t\t\tconst claimNeedsReview = isPlainRecord(record.claim) && record.claim.parentReviewRequired === true;\n\t\t\tconst status =\n\t\t\t\trecord.status === \"failed\" || record.status === \"timeout\" || record.status === \"budget_exhausted\"\n\t\t\t\t\t? \"failed\"\n\t\t\t\t\t: record.status === \"canceled\"\n\t\t\t\t\t\t? \"canceled\"\n\t\t\t\t\t\t: claimNeedsReview || record.status === \"partial\" || record.status === \"blocked\"\n\t\t\t\t\t\t\t? \"attention\"\n\t\t\t\t\t\t\t: record.status === \"succeeded\"\n\t\t\t\t\t\t\t\t? \"success\"\n\t\t\t\t\t\t\t\t: undefined;\n\t\t\tif (!status) return undefined;\n\t\t\titems.push({ id, status });\n\t\t\tcontinue;\n\t\t}\n\t\tif (record.status !== \"completed\" && record.status !== \"failed\" && record.status !== \"canceled\") return undefined;\n\t\titems.push({\n\t\t\tid,\n\t\t\tstatus: record.status === \"failed\" ? \"failed\" : record.status === \"canceled\" ? \"canceled\" : \"success\",\n\t\t});\n\t}\n\treturn items;\n}\n\nfunction readSummaryContract(\n\tmessage: CustomMessage<unknown>,\n\tkind: \"agent\" | \"task\",\n\titems: readonly BackgroundActivitySummaryItem[] | undefined,\n): BackgroundActivitySummaryContract | undefined {\n\tif (isPlainRecord(message.details) && isBackgroundActivitySummaryContract(message.details.summary)) {\n\t\tconst summary = message.details.summary;\n\t\tif (summary.kind !== kind || !items || summary.totalCount < items.length) return undefined;\n\t\tconst includedCounts = {\n\t\t\tattention: items.filter((item) => item.status === \"attention\").length,\n\t\t\tfailed: items.filter((item) => item.status === \"failed\").length,\n\t\t\tcanceled: items.filter((item) => item.status === \"canceled\").length,\n\t\t};\n\t\tif (\n\t\t\tsummary.attentionCount < includedCounts.attention ||\n\t\t\tsummary.failedCount < includedCounts.failed ||\n\t\t\tsummary.canceledCount < includedCounts.canceled\n\t\t) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn summary;\n\t}\n\treturn items && items.length > 0 ? createBackgroundActivitySummaryContract(kind, items) : undefined;\n}\n\nfunction formatBackgroundActivitySummary(message: CustomMessage<unknown>): BackgroundActivitySummary | undefined {\n\tconst kind =\n\t\tmessage.customType === \"background-worker-completion\"\n\t\t\t? \"agent\"\n\t\t\t: message.customType === \"background-tool-completion\"\n\t\t\t\t? \"task\"\n\t\t\t\t: undefined;\n\tif (!kind) return undefined;\n\tif (!isPlainRecord(message.details) || !Array.isArray(message.details.records))\n\t\treturn fallbackBackgroundActivitySummary(kind);\n\tif (message.details.records.some((record) => !isPlainRecord(record))) return fallbackBackgroundActivitySummary(kind);\n\tconst records = message.details.records as Record<string, unknown>[];\n\tconst items = recordSummaryItems(kind, records);\n\tconst summary = readSummaryContract(message, kind, items);\n\tif (!summary || !items) return fallbackBackgroundActivitySummary(kind);\n\tconst nounName = kind === \"agent\" ? \"agent\" : \"background task\";\n\tconst attentionIds = items.filter((item) => item.status === \"attention\").map((item) => item.id);\n\tconst failedIds = items.filter((item) => item.status === \"failed\").map((item) => item.id);\n\tconst canceledIds = items.filter((item) => item.status === \"canceled\").map((item) => item.id);\n\tconst text = [\n\t\t`${summary.totalCount} ${noun(summary.totalCount, nounName)} finished`,\n\t\tformatCountedStatus(summary.attentionCount, nounName, \"needs verification\", \"need verification\", attentionIds),\n\t\tformatCountedStatus(summary.failedCount, nounName, \"failed\", \"failed\", failedIds),\n\t\tformatCountedStatus(summary.canceledCount, nounName, \"canceled\", \"canceled\", canceledIds),\n\t]\n\t\t.filter((part): part is string => part !== undefined)\n\t\t.join(\" | \");\n\treturn {\n\t\ttext,\n\t\tstatus:\n\t\t\tsummary.failedCount > 0 ? \"error\" : summary.attentionCount + summary.canceledCount > 0 ? \"warning\" : \"success\",\n\t};\n}\n"]}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pi-extension-custom-provider",
|
|
3
|
-
"version": "0.94.
|
|
3
|
+
"version": "0.94.1",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "pi-extension-custom-provider",
|
|
9
|
-
"version": "0.94.
|
|
9
|
+
"version": "0.94.1",
|
|
10
10
|
"dependencies": {
|
|
11
11
|
"@anthropic-ai/sdk": "^0.52.0"
|
|
12
12
|
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pi-extension-sandbox",
|
|
3
|
-
"version": "0.94.
|
|
3
|
+
"version": "0.94.1",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "pi-extension-sandbox",
|
|
9
|
-
"version": "0.94.
|
|
9
|
+
"version": "0.94.1",
|
|
10
10
|
"dependencies": {
|
|
11
11
|
"@anthropic-ai/sandbox-runtime": "^0.0.26"
|
|
12
12
|
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pi-extension-with-deps",
|
|
3
|
-
"version": "0.94.
|
|
3
|
+
"version": "0.94.1",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "pi-extension-with-deps",
|
|
9
|
-
"version": "0.94.
|
|
9
|
+
"version": "0.94.1",
|
|
10
10
|
"dependencies": {
|
|
11
11
|
"ms": "^2.1.3"
|
|
12
12
|
},
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@caupulican/pi-adaptative",
|
|
3
|
-
"version": "0.94.
|
|
3
|
+
"version": "0.94.1",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@caupulican/pi-adaptative",
|
|
9
|
-
"version": "0.94.
|
|
9
|
+
"version": "0.94.1",
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"dependencies": {
|
|
12
|
-
"@caupulican/pi-agent-core": "^0.94.
|
|
13
|
-
"@caupulican/pi-ai": "^0.94.
|
|
14
|
-
"@caupulican/pi-tui": "^0.94.
|
|
12
|
+
"@caupulican/pi-agent-core": "^0.94.1",
|
|
13
|
+
"@caupulican/pi-ai": "^0.94.1",
|
|
14
|
+
"@caupulican/pi-tui": "^0.94.1",
|
|
15
15
|
"@silvia-odwyer/photon-node": "0.3.4",
|
|
16
16
|
"chalk": "5.6.2",
|
|
17
17
|
"cross-spawn": "7.0.6",
|
|
@@ -506,11 +506,11 @@
|
|
|
506
506
|
}
|
|
507
507
|
},
|
|
508
508
|
"node_modules/@caupulican/pi-agent-core": {
|
|
509
|
-
"version": "0.94.
|
|
510
|
-
"resolved": "https://registry.npmjs.org/@caupulican/pi-agent-core/-/pi-agent-core-0.94.
|
|
509
|
+
"version": "0.94.1",
|
|
510
|
+
"resolved": "https://registry.npmjs.org/@caupulican/pi-agent-core/-/pi-agent-core-0.94.1.tgz",
|
|
511
511
|
"license": "MIT",
|
|
512
512
|
"dependencies": {
|
|
513
|
-
"@caupulican/pi-ai": "^0.94.
|
|
513
|
+
"@caupulican/pi-ai": "^0.94.1",
|
|
514
514
|
"ignore": "7.0.5",
|
|
515
515
|
"typebox": "1.1.38",
|
|
516
516
|
"yaml": "2.9.0"
|
|
@@ -520,8 +520,8 @@
|
|
|
520
520
|
}
|
|
521
521
|
},
|
|
522
522
|
"node_modules/@caupulican/pi-ai": {
|
|
523
|
-
"version": "0.94.
|
|
524
|
-
"resolved": "https://registry.npmjs.org/@caupulican/pi-ai/-/pi-ai-0.94.
|
|
523
|
+
"version": "0.94.1",
|
|
524
|
+
"resolved": "https://registry.npmjs.org/@caupulican/pi-ai/-/pi-ai-0.94.1.tgz",
|
|
525
525
|
"license": "MIT",
|
|
526
526
|
"dependencies": {
|
|
527
527
|
"@anthropic-ai/sdk": "0.117.1",
|
|
@@ -546,8 +546,8 @@
|
|
|
546
546
|
}
|
|
547
547
|
},
|
|
548
548
|
"node_modules/@caupulican/pi-tui": {
|
|
549
|
-
"version": "0.94.
|
|
550
|
-
"resolved": "https://registry.npmjs.org/@caupulican/pi-tui/-/pi-tui-0.94.
|
|
549
|
+
"version": "0.94.1",
|
|
550
|
+
"resolved": "https://registry.npmjs.org/@caupulican/pi-tui/-/pi-tui-0.94.1.tgz",
|
|
551
551
|
"license": "MIT",
|
|
552
552
|
"dependencies": {
|
|
553
553
|
"get-east-asian-width": "1.6.0",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@caupulican/pi-adaptative",
|
|
3
|
-
"version": "0.94.
|
|
3
|
+
"version": "0.94.1",
|
|
4
4
|
"description": "Adaptive fork of Pi coding agent for self-evolving agent harness experiments",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"piConfig": {
|
|
@@ -89,9 +89,9 @@
|
|
|
89
89
|
"postinstall": "node scripts/postinstall-python-runtime.mjs"
|
|
90
90
|
},
|
|
91
91
|
"dependencies": {
|
|
92
|
-
"@caupulican/pi-agent-core": "^0.94.
|
|
93
|
-
"@caupulican/pi-ai": "^0.94.
|
|
94
|
-
"@caupulican/pi-tui": "^0.94.
|
|
92
|
+
"@caupulican/pi-agent-core": "^0.94.1",
|
|
93
|
+
"@caupulican/pi-ai": "^0.94.1",
|
|
94
|
+
"@caupulican/pi-tui": "^0.94.1",
|
|
95
95
|
"@silvia-odwyer/photon-node": "0.3.4",
|
|
96
96
|
"chalk": "5.6.2",
|
|
97
97
|
"cross-spawn": "7.0.6",
|