iosm-cli 0.2.8 → 0.2.10
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 +66 -0
- package/README.md +3 -3
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +7 -3
- package/dist/cli/args.js.map +1 -1
- package/dist/core/agent-profiles.d.ts.map +1 -1
- package/dist/core/agent-profiles.js +5 -1
- package/dist/core/agent-profiles.js.map +1 -1
- package/dist/core/agent-session.d.ts +8 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +490 -3
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/sdk.d.ts +2 -2
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +7 -4
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/settings-manager.d.ts +18 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +29 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/shadow-guard.d.ts.map +1 -1
- package/dist/core/shadow-guard.js +12 -1
- package/dist/core/shadow-guard.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +4 -0
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +32 -1
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tools/db-run.d.ts +84 -0
- package/dist/core/tools/db-run.d.ts.map +1 -0
- package/dist/core/tools/db-run.js +690 -0
- package/dist/core/tools/db-run.js.map +1 -0
- package/dist/core/tools/index.d.ts +44 -0
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +16 -0
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/lint-run.d.ts +42 -0
- package/dist/core/tools/lint-run.d.ts.map +1 -0
- package/dist/core/tools/lint-run.js +276 -0
- package/dist/core/tools/lint-run.js.map +1 -0
- package/dist/core/tools/test-run.d.ts +36 -0
- package/dist/core/tools/test-run.d.ts.map +1 -0
- package/dist/core/tools/test-run.js +255 -0
- package/dist/core/tools/test-run.js.map +1 -0
- package/dist/core/tools/typecheck-run.d.ts +44 -0
- package/dist/core/tools/typecheck-run.d.ts.map +1 -0
- package/dist/core/tools/typecheck-run.js +343 -0
- package/dist/core/tools/typecheck-run.js.map +1 -0
- package/dist/core/tools/verification-runner.d.ts +53 -0
- package/dist/core/tools/verification-runner.d.ts.map +1 -0
- package/dist/core/tools/verification-runner.js +235 -0
- package/dist/core/tools/verification-runner.js.map +1 -0
- package/dist/core/ultrathink.d.ts +122 -0
- package/dist/core/ultrathink.d.ts.map +1 -0
- package/dist/core/ultrathink.js +621 -0
- package/dist/core/ultrathink.js.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.js +2 -1
- package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.js +2 -1
- package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-message.js +2 -1
- package/dist/modes/interactive/components/custom-message.js.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.js +4 -2
- package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
- package/dist/modes/interactive/components/subagent-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/subagent-message.js +3 -1
- package/dist/modes/interactive/components/subagent-message.js.map +1 -1
- package/dist/modes/interactive/components/task-plan-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/task-plan-message.js +2 -1
- package/dist/modes/interactive/components/task-plan-message.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +25 -7
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message.js +2 -1
- package/dist/modes/interactive/components/user-message.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +5 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +523 -9
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/theme/dark.json +39 -38
- package/dist/modes/interactive/theme/light.json +29 -29
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +16 -25
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/interactive/theme/universal.json +85 -0
- package/docs/cli-reference.md +21 -1
- package/docs/configuration.md +76 -1
- package/docs/development-and-testing.md +1 -1
- package/docs/interactive-mode.md +11 -2
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subagent-message.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/subagent-message.ts"],"names":[],"mappings":"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","sourcesContent":["import { homedir } from \"node:os\";\nimport { Box, Spacer, Text } from \"@mariozechner/pi-tui\";\nimport { theme } from \"../theme/theme.js\";\n\nexport type SubagentPhaseState = \"queued\" | \"starting\" | \"running\" | \"responding\";\nexport type SubagentDelegateStatus = \"pending\" | \"running\" | \"done\" | \"failed\";\n\nexport interface SubagentDelegateItem {\n\tindex: number;\n\tdescription: string;\n\tprofile: string;\n\tstatus: SubagentDelegateStatus;\n}\n\nexport interface SubagentInfo {\n\t/** Human-readable description of the subagent's task, e.g. \"Exploring TypeScript files\" */\n\tdescription: string;\n\t/** Profile name, e.g. \"explore\" | \"plan\" | \"fix\" */\n\tprofile: string;\n\t/** Current lifecycle state of the subagent */\n\tstatus: \"running\" | \"done\" | \"error\";\n\t/** Byte length of the subagent's output, populated when status is \"done\" */\n\toutputLength?: number;\n\t/** Wall-clock elapsed time in milliseconds, populated when status is \"done\" */\n\tdurationMs?: number;\n\t/** Error message, populated when status is \"error\" */\n\terrorMessage?: string;\n\t/** Current phase summary for in-progress work */\n\tphase?: string;\n\t/** Current phase state in the execution timeline */\n\tphaseState?: SubagentPhaseState;\n\t/** Effective working directory for the subagent */\n\tcwd?: string;\n\t/** Optional custom agent label */\n\tagent?: string;\n\t/** Optional lock domain key */\n\tlockKey?: string;\n\t/** Isolation mode for this run */\n\tisolation?: \"none\" | \"worktree\";\n\t/** Current active subagent tool (e.g. read, bash, write) */\n\tactiveTool?: string;\n\t/** Number of subagent tool calls started */\n\ttoolCallsStarted?: number;\n\t/** Number of subagent tool calls completed */\n\ttoolCallsCompleted?: number;\n\t/** Number of assistant messages produced inside subagent */\n\tassistantMessages?: number;\n\t/** Queue delay before execution started (ms) */\n\twaitMs?: number;\n\t/** Number of delegated child subtasks launched by this subagent */\n\tdelegatedTasks?: number;\n\t/** Number of delegated child subtasks finished successfully */\n\tdelegatedSucceeded?: number;\n\t/** Number of delegated child subtasks that failed */\n\tdelegatedFailed?: number;\n\t/** Currently active delegated subtask index (1-based) */\n\tdelegateIndex?: number;\n\t/** Total delegated subtasks in the current batch */\n\tdelegateTotal?: number;\n\t/** Currently active delegated subtask description */\n\tdelegateDescription?: string;\n\t/** Currently active delegated subtask profile */\n\tdelegateProfile?: string;\n\t/** Delegate task mini-list with per-item status */\n\tdelegateItems?: SubagentDelegateItem[];\n}\n\ntype DelegateSummary = {\n\ttotal: number;\n\tdone: number;\n\tfailed: number;\n\trunning: number;\n\tpending: number;\n};\n\n/**\n * Format a byte count as a compact human-readable string.\n * Mirrors the formatting conventions used elsewhere in the footer (k/M suffixes).\n */\nfunction formatBytes(bytes: number): string {\n\tif (bytes < 1024) return `${bytes}B`;\n\tif (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;\n\treturn `${(bytes / (1024 * 1024)).toFixed(1)}MB`;\n}\n\n/**\n * Format a millisecond duration as a compact human-readable string.\n * Keeps the unit explicit so users can immediately scan the value at a glance.\n */\nfunction formatDuration(ms: number): string {\n\tif (ms < 1000) return `${ms}ms`;\n\tif (ms < 60_000) return `${(ms / 1000).toFixed(1)}s`;\n\tconst minutes = Math.floor(ms / 60_000);\n\tconst seconds = ((ms % 60_000) / 1000).toFixed(0);\n\treturn `${minutes}m ${seconds}s`;\n}\n\nfunction formatElapsedClock(ms: number): string {\n\tconst totalSeconds = Math.max(0, Math.floor(ms / 1000));\n\tconst hours = Math.floor(totalSeconds / 3600);\n\tconst minutes = Math.floor((totalSeconds % 3600) / 60);\n\tconst seconds = totalSeconds % 60;\n\tconst pad2 = (value: number): string => value.toString().padStart(2, \"0\");\n\tif (hours > 0) {\n\t\treturn `${pad2(hours)}:${pad2(minutes)}:${pad2(seconds)}`;\n\t}\n\treturn `${pad2(minutes)}:${pad2(seconds)}`;\n}\n\nfunction shortenPath(path: string): string {\n\tconst home = homedir();\n\treturn path.startsWith(home) ? `~${path.slice(home.length)}` : path;\n}\n\nfunction formatToolProgress(started?: number, completed?: number): string | undefined {\n\tif (typeof started !== \"number\" || started < 0) return undefined;\n\tif (typeof completed === \"number\" && completed >= 0) {\n\t\treturn `tools ${completed}/${started}`;\n\t}\n\treturn `tools ${started}`;\n}\n\nfunction formatSubagentBadge(agent?: string): string {\n\tif (typeof agent !== \"string\") return \"[subagent]\";\n\tconst normalized = agent.trim();\n\tif (!normalized) return \"[subagent]\";\n\treturn `[subagent:${normalized}]`;\n}\n\nfunction renderPhaseTimeline(phaseState: SubagentPhaseState): string {\n\tconst phases: SubagentPhaseState[] = [\"queued\", \"starting\", \"running\", \"responding\"];\n\tconst currentIndex = phases.indexOf(phaseState);\n\tif (currentIndex < 0) return \"\";\n\n\tconst segments = phases.map((phase, index) => {\n\t\tconst marker = index < currentIndex ? \"[x]\" : index === currentIndex ? \"[>]\" : \"[ ]\";\n\t\tconst text = `${marker} ${phase}`;\n\t\tif (index < currentIndex) return theme.fg(\"success\", text);\n\t\tif (index === currentIndex) return theme.fg(\"accent\", text);\n\t\treturn theme.fg(\"muted\", text);\n\t});\n\treturn `${theme.fg(\"muted\", \"flow\")} ${segments.join(theme.fg(\"dim\", \" -> \"))}`;\n}\n\nfunction summarizeDelegates(info: SubagentInfo): DelegateSummary | undefined {\n\tif (Array.isArray(info.delegateItems) && info.delegateItems.length > 0) {\n\t\tlet done = 0;\n\t\tlet failed = 0;\n\t\tlet running = 0;\n\t\tlet pending = 0;\n\t\tfor (const item of info.delegateItems) {\n\t\t\tswitch (item.status) {\n\t\t\t\tcase \"done\":\n\t\t\t\t\tdone += 1;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"failed\":\n\t\t\t\t\tfailed += 1;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"running\":\n\t\t\t\t\trunning += 1;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tpending += 1;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn { total: info.delegateItems.length, done, failed, running, pending };\n\t}\n\tif (typeof info.delegatedTasks === \"number\" && info.delegatedTasks > 0) {\n\t\tconst total = info.delegatedTasks;\n\t\tconst done = typeof info.delegatedSucceeded === \"number\" ? Math.max(0, info.delegatedSucceeded) : 0;\n\t\tconst failed = typeof info.delegatedFailed === \"number\" ? Math.max(0, info.delegatedFailed) : 0;\n\t\tconst running = Math.max(0, total - done - failed);\n\t\tconst pending = 0;\n\t\treturn { total, done, failed, running, pending };\n\t}\n\treturn undefined;\n}\n\nfunction formatDelegateSummary(summary: DelegateSummary): string {\n\tconst parts: string[] = [`delegates ${summary.done}/${summary.total} done`];\n\tif (summary.failed > 0) {\n\t\tparts.push(`${summary.failed} failed`);\n\t}\n\tif (summary.running > 0) {\n\t\tparts.push(`${summary.running} running`);\n\t}\n\treturn parts.join(\", \");\n}\n\nfunction selectDelegateItemsForDisplay(items: SubagentDelegateItem[]): {\n\tvisibleItems: SubagentDelegateItem[];\n\tcompacted: boolean;\n\thiddenDonePending: number;\n\toverflow: number;\n} {\n\tconst compactThreshold = 6;\n\tconst maxRows = 5;\n\tif (items.length > compactThreshold) {\n\t\tconst critical = items.filter((item) => item.status === \"running\" || item.status === \"failed\");\n\t\tconst visibleItems = critical.slice(0, maxRows);\n\t\treturn {\n\t\t\tvisibleItems,\n\t\t\tcompacted: true,\n\t\t\thiddenDonePending: Math.max(0, items.length - critical.length),\n\t\t\toverflow: Math.max(0, critical.length - visibleItems.length),\n\t\t};\n\t}\n\tconst visibleItems = items.slice(0, maxRows);\n\treturn {\n\t\tvisibleItems,\n\t\tcompacted: false,\n\t\thiddenDonePending: 0,\n\t\toverflow: Math.max(0, items.length - visibleItems.length),\n\t};\n}\n\n/**\n * Component that surfaces a running or completed subagent (task tool invocation).\n *\n * Visual structure\n * ----------------\n * Line 1 (header): [subagent] <profile> · <description>\n * Line 2 (status):\n * running → ... <phase>\n * @ <cwd> · tool <active> · tools <done>/<started>\n * delegates <done>/<total> done, <failed> failed\n * delegate <i>/<n> · <description> · (<profile>)\n * delegates list with status markers (compact mode on large runs)\n * flow [x] queued -> [>] running -> [ ] responding\n * done → + <outputSize> output, <duration>, tools <done>/<started>, queue <wait>\n * error → x <errorMessage or \"error\">\n *\n * Theming follows the customMessage palette so the block sits visually alongside\n * other agent-injected messages (task plan, skill invocation, custom messages).\n */\nexport class SubagentMessageComponent extends Box {\n\tconstructor(info: SubagentInfo) {\n\t\tsuper(1, 1, (text) => theme.bg(\"customMessageBg\", text));\n\t\tthis.renderContent(info);\n\t}\n\n\t/**\n\t * Replace the rendered content with updated subagent info.\n\t * Call this whenever status, outputLength, durationMs, or errorMessage changes.\n\t */\n\tupdate(info: SubagentInfo): void {\n\t\tthis.clear();\n\t\tthis.renderContent(info);\n\t}\n\n\toverride invalidate(): void {\n\t\tsuper.invalidate();\n\t}\n\n\tprivate renderContent(info: SubagentInfo): void {\n\t\t// --- Header line ---\n\t\t// [subagent] or [subagent:<agent>] <profile> · <description>\n\t\tconst label = theme.fg(\"customMessageLabel\", `\\x1b[1m${formatSubagentBadge(info.agent)}\\x1b[22m`);\n\t\tconst profileBadge = theme.fg(\"accent\", info.profile);\n\t\tconst dot = theme.fg(\"dim\", \" \\u00B7 \"); // middle dot separator\n\t\tconst description = theme.fg(\"customMessageText\", info.description);\n\t\tthis.addChild(new Text(`${label} ${profileBadge}${dot}${description}`, 0, 0));\n\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// --- Status line ---\n\t\tswitch (info.status) {\n\t\t\t\tcase \"running\": {\n\t\t\t\t// Ellipsis prefix signals in-progress work without a spinner dependency\n\t\t\t\tconst indicator = theme.fg(\"accent\", \"...\");\n\t\t\t\tconst phase = info.phase?.trim() ? info.phase.trim() : \"running\";\n\t\t\t\tconst statusText = theme.fg(\"muted\", ` ${phase}`);\n\t\t\t\tthis.addChild(new Text(`${indicator}${statusText}`, 0, 0));\n\n\t\t\t\tconst metadata: string[] = [];\n\t\t\t\tif (info.cwd) {\n\t\t\t\t\tmetadata.push(theme.fg(\"muted\", `@ ${shortenPath(info.cwd)}`));\n\t\t\t\t}\n\t\t\t\tif (info.activeTool) {\n\t\t\t\t\tmetadata.push(theme.fg(\"customMessageText\", `tool ${info.activeTool}`));\n\t\t\t\t}\n\t\t\t\tconst toolProgress = formatToolProgress(info.toolCallsStarted, info.toolCallsCompleted);\n\t\t\t\tif (toolProgress) {\n\t\t\t\t\tmetadata.push(theme.fg(\"muted\", toolProgress));\n\t\t\t\t}\n\t\t\t\tif (typeof info.assistantMessages === \"number\" && info.assistantMessages > 0) {\n\t\t\t\t\tmetadata.push(theme.fg(\"muted\", `msgs ${info.assistantMessages}`));\n\t\t\t\t}\n\t\t\t\tif (info.agent) {\n\t\t\t\t\tmetadata.push(theme.fg(\"muted\", `agent ${info.agent}`));\n\t\t\t\t}\n\t\t\t\tif (typeof info.durationMs === \"number\" && info.durationMs >= 0) {\n\t\t\t\t\tmetadata.push(theme.fg(\"muted\", `elapsed ${formatElapsedClock(info.durationMs)}`));\n\t\t\t\t}\n\t\t\t\tif (info.isolation && info.isolation !== \"none\") {\n\t\t\t\t\tmetadata.push(theme.fg(\"muted\", `iso ${info.isolation}`));\n\t\t\t\t}\n\t\t\t\t\tif (info.lockKey) {\n\t\t\t\t\t\tmetadata.push(theme.fg(\"muted\", `lock ${info.lockKey}`));\n\t\t\t\t\t}\n\t\t\t\t\tif (metadata.length > 0) {\n\t\t\t\t\t\tthis.addChild(new Text(metadata.join(theme.fg(\"dim\", \" \\u00B7 \")), 0, 0));\n\t\t\t\t\t}\n\t\t\t\t\tconst delegateSummary = summarizeDelegates(info);\n\t\t\t\t\tif (delegateSummary) {\n\t\t\t\t\t\tthis.addChild(new Text(theme.fg(\"accent\", formatDelegateSummary(delegateSummary)), 0, 0));\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof info.delegateIndex === \"number\" && info.delegateIndex > 0) {\n\t\t\t\t\t\tconst delegateTotal =\n\t\t\t\t\t\t\ttypeof info.delegateTotal === \"number\" && info.delegateTotal > 0\n\t\t\t\t\t\t\t\t? info.delegateTotal\n\t\t\t\t\t\t\t\t: info.delegateIndex;\n\t\t\t\t\t\tconst delegateParts: string[] = [theme.fg(\"accent\", `delegate ${info.delegateIndex}/${delegateTotal}`)];\n\t\t\t\t\t\tif (typeof info.delegateDescription === \"string\" && info.delegateDescription.trim().length > 0) {\n\t\t\t\t\t\t\tdelegateParts.push(theme.fg(\"customMessageText\", info.delegateDescription.trim()));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (typeof info.delegateProfile === \"string\" && info.delegateProfile.trim().length > 0) {\n\t\t\t\t\t\t\tdelegateParts.push(theme.fg(\"muted\", `(${info.delegateProfile.trim()})`));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.addChild(new Text(delegateParts.join(theme.fg(\"dim\", \" \\u00B7 \")), 0, 0));\n\t\t\t\t\t}\n\t\t\t\t\tif (Array.isArray(info.delegateItems) && info.delegateItems.length > 0) {\n\t\t\t\t\t\tconst selected = selectDelegateItemsForDisplay(info.delegateItems);\n\t\t\t\t\t\tconst headerParts = [theme.fg(\"muted\", \"delegates\")];\n\t\t\t\t\t\tif (selected.compacted) {\n\t\t\t\t\t\t\theaderParts.push(theme.fg(\"accent\", \"compact\"));\n\t\t\t\t\t\t\tif (selected.hiddenDonePending > 0) {\n\t\t\t\t\t\t\t\theaderParts.push(theme.fg(\"muted\", `hidden ${selected.hiddenDonePending} done/pending`));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.addChild(new Text(headerParts.join(theme.fg(\"dim\", \" \\u00B7 \")), 0, 0));\n\t\t\t\t\t\tif (selected.visibleItems.length === 0 && selected.compacted) {\n\t\t\t\t\t\t\tthis.addChild(new Text(theme.fg(\"muted\", \"no running/failed delegates\"), 0, 0));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfor (const item of selected.visibleItems) {\n\t\t\t\t\t\t\tconst marker = (() => {\n\t\t\t\t\t\t\t\tswitch (item.status) {\n\t\t\t\t\t\t\t\t\tcase \"done\":\n\t\t\t\t\t\t\t\t\t\treturn theme.fg(\"success\", \"[x]\");\n\t\t\t\t\t\t\t\t\tcase \"running\":\n\t\t\t\t\t\t\t\t\t\treturn theme.fg(\"accent\", \"[>]\");\n\t\t\t\t\t\t\t\t\tcase \"failed\":\n\t\t\t\t\t\t\t\t\t\treturn theme.fg(\"warning\", \"[!]\");\n\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\treturn theme.fg(\"muted\", \"[ ]\");\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t})();\n\t\t\t\t\t\t\tconst label = `${item.index}. ${item.description} (${item.profile})`;\n\t\t\t\t\t\t\tconst textColor =\n\t\t\t\t\t\t\t\titem.status === \"done\"\n\t\t\t\t\t\t\t\t\t? \"muted\"\n\t\t\t\t\t\t\t\t\t: item.status === \"running\"\n\t\t\t\t\t\t\t\t\t\t? \"customMessageText\"\n\t\t\t\t\t\t\t\t\t\t: item.status === \"failed\"\n\t\t\t\t\t\t\t\t\t\t\t? \"warning\"\n\t\t\t\t\t\t\t\t\t\t\t: \"muted\";\n\t\t\t\t\t\t\tthis.addChild(new Text(`${marker} ${theme.fg(textColor, label)}`, 0, 0));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (selected.overflow > 0) {\n\t\t\t\t\t\t\tthis.addChild(new Text(theme.fg(\"muted\", `... +${selected.overflow} more`), 0, 0));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (info.phaseState) {\n\t\t\t\t\t\tthis.addChild(new Text(renderPhaseTimeline(info.phaseState), 0, 0));\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\tcase \"done\": {\n\t\t\t\tconst checkmark = theme.fg(\"success\", \"+\");\n\t\t\t\tconst parts: string[] = [];\n\t\t\t\tif (info.outputLength !== undefined) {\n\t\t\t\t\tparts.push(theme.fg(\"customMessageText\", formatBytes(info.outputLength)) + theme.fg(\"muted\", \" output\"));\n\t\t\t\t}\n\t\t\t\tif (info.durationMs !== undefined) {\n\t\t\t\t\tparts.push(theme.fg(\"muted\", formatDuration(info.durationMs)));\n\t\t\t\t}\n\t\t\t\tconst toolProgress = formatToolProgress(info.toolCallsStarted, info.toolCallsCompleted);\n\t\t\t\tif (toolProgress) {\n\t\t\t\t\tparts.push(theme.fg(\"muted\", toolProgress));\n\t\t\t\t}\n\t\t\t\t\tconst delegateSummary = summarizeDelegates(info);\n\t\t\t\t\tif (delegateSummary) {\n\t\t\t\t\t\tparts.push(theme.fg(\"muted\", `delegates ${delegateSummary.done}/${delegateSummary.total} done`));\n\t\t\t\t\t\tif (delegateSummary.failed > 0) {\n\t\t\t\t\t\t\tparts.push(theme.fg(\"warning\", `${delegateSummary.failed} failed`));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\tif (typeof info.waitMs === \"number\" && info.waitMs > 0) {\n\t\t\t\t\tparts.push(theme.fg(\"muted\", `queue ${formatDuration(info.waitMs)}`));\n\t\t\t\t}\n\t\t\t\tconst detail = parts.length > 0 ? \" \" + parts.join(theme.fg(\"dim\", \", \")) : \"\";\n\t\t\t\tthis.addChild(new Text(`${checkmark}${detail}`, 0, 0));\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"error\": {\n\t\t\t\tconst cross = theme.fg(\"error\", \"x\");\n\t\t\t\tconst message = info.errorMessage ? info.errorMessage : \"error\";\n\t\t\t\tconst errorText = theme.fg(\"error\", ` ${message}`);\n\t\t\t\tthis.addChild(new Text(`${cross}${errorText}`, 0, 0));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"subagent-message.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/subagent-message.ts"],"names":[],"mappings":"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","sourcesContent":["import { homedir } from \"node:os\";\nimport { Box, Spacer, Text } from \"@mariozechner/pi-tui\";\nimport { theme } from \"../theme/theme.js\";\n\nconst MESSAGE_BOX_PADDING_X = 2;\nconst MESSAGE_BOX_PADDING_Y = 1;\n\nexport type SubagentPhaseState = \"queued\" | \"starting\" | \"running\" | \"responding\";\nexport type SubagentDelegateStatus = \"pending\" | \"running\" | \"done\" | \"failed\";\n\nexport interface SubagentDelegateItem {\n\tindex: number;\n\tdescription: string;\n\tprofile: string;\n\tstatus: SubagentDelegateStatus;\n}\n\nexport interface SubagentInfo {\n\t/** Human-readable description of the subagent's task, e.g. \"Exploring TypeScript files\" */\n\tdescription: string;\n\t/** Profile name, e.g. \"explore\" | \"plan\" | \"fix\" */\n\tprofile: string;\n\t/** Current lifecycle state of the subagent */\n\tstatus: \"running\" | \"done\" | \"error\";\n\t/** Byte length of the subagent's output, populated when status is \"done\" */\n\toutputLength?: number;\n\t/** Wall-clock elapsed time in milliseconds, populated when status is \"done\" */\n\tdurationMs?: number;\n\t/** Error message, populated when status is \"error\" */\n\terrorMessage?: string;\n\t/** Current phase summary for in-progress work */\n\tphase?: string;\n\t/** Current phase state in the execution timeline */\n\tphaseState?: SubagentPhaseState;\n\t/** Effective working directory for the subagent */\n\tcwd?: string;\n\t/** Optional custom agent label */\n\tagent?: string;\n\t/** Optional lock domain key */\n\tlockKey?: string;\n\t/** Isolation mode for this run */\n\tisolation?: \"none\" | \"worktree\";\n\t/** Current active subagent tool (e.g. read, bash, write) */\n\tactiveTool?: string;\n\t/** Number of subagent tool calls started */\n\ttoolCallsStarted?: number;\n\t/** Number of subagent tool calls completed */\n\ttoolCallsCompleted?: number;\n\t/** Number of assistant messages produced inside subagent */\n\tassistantMessages?: number;\n\t/** Queue delay before execution started (ms) */\n\twaitMs?: number;\n\t/** Number of delegated child subtasks launched by this subagent */\n\tdelegatedTasks?: number;\n\t/** Number of delegated child subtasks finished successfully */\n\tdelegatedSucceeded?: number;\n\t/** Number of delegated child subtasks that failed */\n\tdelegatedFailed?: number;\n\t/** Currently active delegated subtask index (1-based) */\n\tdelegateIndex?: number;\n\t/** Total delegated subtasks in the current batch */\n\tdelegateTotal?: number;\n\t/** Currently active delegated subtask description */\n\tdelegateDescription?: string;\n\t/** Currently active delegated subtask profile */\n\tdelegateProfile?: string;\n\t/** Delegate task mini-list with per-item status */\n\tdelegateItems?: SubagentDelegateItem[];\n}\n\ntype DelegateSummary = {\n\ttotal: number;\n\tdone: number;\n\tfailed: number;\n\trunning: number;\n\tpending: number;\n};\n\n/**\n * Format a byte count as a compact human-readable string.\n * Mirrors the formatting conventions used elsewhere in the footer (k/M suffixes).\n */\nfunction formatBytes(bytes: number): string {\n\tif (bytes < 1024) return `${bytes}B`;\n\tif (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;\n\treturn `${(bytes / (1024 * 1024)).toFixed(1)}MB`;\n}\n\n/**\n * Format a millisecond duration as a compact human-readable string.\n * Keeps the unit explicit so users can immediately scan the value at a glance.\n */\nfunction formatDuration(ms: number): string {\n\tif (ms < 1000) return `${ms}ms`;\n\tif (ms < 60_000) return `${(ms / 1000).toFixed(1)}s`;\n\tconst minutes = Math.floor(ms / 60_000);\n\tconst seconds = ((ms % 60_000) / 1000).toFixed(0);\n\treturn `${minutes}m ${seconds}s`;\n}\n\nfunction formatElapsedClock(ms: number): string {\n\tconst totalSeconds = Math.max(0, Math.floor(ms / 1000));\n\tconst hours = Math.floor(totalSeconds / 3600);\n\tconst minutes = Math.floor((totalSeconds % 3600) / 60);\n\tconst seconds = totalSeconds % 60;\n\tconst pad2 = (value: number): string => value.toString().padStart(2, \"0\");\n\tif (hours > 0) {\n\t\treturn `${pad2(hours)}:${pad2(minutes)}:${pad2(seconds)}`;\n\t}\n\treturn `${pad2(minutes)}:${pad2(seconds)}`;\n}\n\nfunction shortenPath(path: string): string {\n\tconst home = homedir();\n\treturn path.startsWith(home) ? `~${path.slice(home.length)}` : path;\n}\n\nfunction formatToolProgress(started?: number, completed?: number): string | undefined {\n\tif (typeof started !== \"number\" || started < 0) return undefined;\n\tif (typeof completed === \"number\" && completed >= 0) {\n\t\treturn `tools ${completed}/${started}`;\n\t}\n\treturn `tools ${started}`;\n}\n\nfunction formatSubagentBadge(agent?: string): string {\n\tif (typeof agent !== \"string\") return \"[subagent]\";\n\tconst normalized = agent.trim();\n\tif (!normalized) return \"[subagent]\";\n\treturn `[subagent:${normalized}]`;\n}\n\nfunction renderPhaseTimeline(phaseState: SubagentPhaseState): string {\n\tconst phases: SubagentPhaseState[] = [\"queued\", \"starting\", \"running\", \"responding\"];\n\tconst currentIndex = phases.indexOf(phaseState);\n\tif (currentIndex < 0) return \"\";\n\n\tconst segments = phases.map((phase, index) => {\n\t\tconst marker = index < currentIndex ? \"[x]\" : index === currentIndex ? \"[>]\" : \"[ ]\";\n\t\tconst text = `${marker} ${phase}`;\n\t\tif (index < currentIndex) return theme.fg(\"success\", text);\n\t\tif (index === currentIndex) return theme.fg(\"accent\", text);\n\t\treturn theme.fg(\"muted\", text);\n\t});\n\treturn `${theme.fg(\"muted\", \"flow\")} ${segments.join(theme.fg(\"dim\", \" -> \"))}`;\n}\n\nfunction summarizeDelegates(info: SubagentInfo): DelegateSummary | undefined {\n\tif (Array.isArray(info.delegateItems) && info.delegateItems.length > 0) {\n\t\tlet done = 0;\n\t\tlet failed = 0;\n\t\tlet running = 0;\n\t\tlet pending = 0;\n\t\tfor (const item of info.delegateItems) {\n\t\t\tswitch (item.status) {\n\t\t\t\tcase \"done\":\n\t\t\t\t\tdone += 1;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"failed\":\n\t\t\t\t\tfailed += 1;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"running\":\n\t\t\t\t\trunning += 1;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tpending += 1;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn { total: info.delegateItems.length, done, failed, running, pending };\n\t}\n\tif (typeof info.delegatedTasks === \"number\" && info.delegatedTasks > 0) {\n\t\tconst total = info.delegatedTasks;\n\t\tconst done = typeof info.delegatedSucceeded === \"number\" ? Math.max(0, info.delegatedSucceeded) : 0;\n\t\tconst failed = typeof info.delegatedFailed === \"number\" ? Math.max(0, info.delegatedFailed) : 0;\n\t\tconst running = Math.max(0, total - done - failed);\n\t\tconst pending = 0;\n\t\treturn { total, done, failed, running, pending };\n\t}\n\treturn undefined;\n}\n\nfunction formatDelegateSummary(summary: DelegateSummary): string {\n\tconst parts: string[] = [`delegates ${summary.done}/${summary.total} done`];\n\tif (summary.failed > 0) {\n\t\tparts.push(`${summary.failed} failed`);\n\t}\n\tif (summary.running > 0) {\n\t\tparts.push(`${summary.running} running`);\n\t}\n\treturn parts.join(\", \");\n}\n\nfunction selectDelegateItemsForDisplay(items: SubagentDelegateItem[]): {\n\tvisibleItems: SubagentDelegateItem[];\n\tcompacted: boolean;\n\thiddenDonePending: number;\n\toverflow: number;\n} {\n\tconst compactThreshold = 6;\n\tconst maxRows = 5;\n\tif (items.length > compactThreshold) {\n\t\tconst critical = items.filter((item) => item.status === \"running\" || item.status === \"failed\");\n\t\tconst visibleItems = critical.slice(0, maxRows);\n\t\treturn {\n\t\t\tvisibleItems,\n\t\t\tcompacted: true,\n\t\t\thiddenDonePending: Math.max(0, items.length - critical.length),\n\t\t\toverflow: Math.max(0, critical.length - visibleItems.length),\n\t\t};\n\t}\n\tconst visibleItems = items.slice(0, maxRows);\n\treturn {\n\t\tvisibleItems,\n\t\tcompacted: false,\n\t\thiddenDonePending: 0,\n\t\toverflow: Math.max(0, items.length - visibleItems.length),\n\t};\n}\n\n/**\n * Component that surfaces a running or completed subagent (task tool invocation).\n *\n * Visual structure\n * ----------------\n * Line 1 (header): [subagent] <profile> · <description>\n * Line 2 (status):\n * running → ... <phase>\n * @ <cwd> · tool <active> · tools <done>/<started>\n * delegates <done>/<total> done, <failed> failed\n * delegate <i>/<n> · <description> · (<profile>)\n * delegates list with status markers (compact mode on large runs)\n * flow [x] queued -> [>] running -> [ ] responding\n * done → + <outputSize> output, <duration>, tools <done>/<started>, queue <wait>\n * error → x <errorMessage or \"error\">\n *\n * Theming follows the customMessage palette so the block sits visually alongside\n * other agent-injected messages (task plan, skill invocation, custom messages).\n */\nexport class SubagentMessageComponent extends Box {\n\tconstructor(info: SubagentInfo) {\n\t\tsuper(MESSAGE_BOX_PADDING_X, MESSAGE_BOX_PADDING_Y, (text) => theme.bg(\"customMessageBg\", text));\n\t\tthis.renderContent(info);\n\t}\n\n\t/**\n\t * Replace the rendered content with updated subagent info.\n\t * Call this whenever status, outputLength, durationMs, or errorMessage changes.\n\t */\n\tupdate(info: SubagentInfo): void {\n\t\tthis.clear();\n\t\tthis.renderContent(info);\n\t}\n\n\toverride invalidate(): void {\n\t\tsuper.invalidate();\n\t}\n\n\tprivate renderContent(info: SubagentInfo): void {\n\t\t// --- Header line ---\n\t\t// [subagent] or [subagent:<agent>] <profile> · <description>\n\t\tconst label = theme.fg(\"customMessageLabel\", `\\x1b[1m${formatSubagentBadge(info.agent)}\\x1b[22m`);\n\t\tconst profileBadge = theme.fg(\"accent\", info.profile);\n\t\tconst dot = theme.fg(\"dim\", \" \\u00B7 \"); // middle dot separator\n\t\tconst description = theme.fg(\"customMessageText\", info.description);\n\t\tthis.addChild(new Text(`${label} ${profileBadge}${dot}${description}`, 0, 0));\n\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// --- Status line ---\n\t\tswitch (info.status) {\n\t\t\t\tcase \"running\": {\n\t\t\t\t// Ellipsis prefix signals in-progress work without a spinner dependency\n\t\t\t\tconst indicator = theme.fg(\"accent\", \"...\");\n\t\t\t\tconst phase = info.phase?.trim() ? info.phase.trim() : \"running\";\n\t\t\t\tconst statusText = theme.fg(\"muted\", ` ${phase}`);\n\t\t\t\tthis.addChild(new Text(`${indicator}${statusText}`, 0, 0));\n\n\t\t\t\tconst metadata: string[] = [];\n\t\t\t\tif (info.cwd) {\n\t\t\t\t\tmetadata.push(theme.fg(\"muted\", `@ ${shortenPath(info.cwd)}`));\n\t\t\t\t}\n\t\t\t\tif (info.activeTool) {\n\t\t\t\t\tmetadata.push(theme.fg(\"customMessageText\", `tool ${info.activeTool}`));\n\t\t\t\t}\n\t\t\t\tconst toolProgress = formatToolProgress(info.toolCallsStarted, info.toolCallsCompleted);\n\t\t\t\tif (toolProgress) {\n\t\t\t\t\tmetadata.push(theme.fg(\"muted\", toolProgress));\n\t\t\t\t}\n\t\t\t\tif (typeof info.assistantMessages === \"number\" && info.assistantMessages > 0) {\n\t\t\t\t\tmetadata.push(theme.fg(\"muted\", `msgs ${info.assistantMessages}`));\n\t\t\t\t}\n\t\t\t\tif (info.agent) {\n\t\t\t\t\tmetadata.push(theme.fg(\"muted\", `agent ${info.agent}`));\n\t\t\t\t}\n\t\t\t\tif (typeof info.durationMs === \"number\" && info.durationMs >= 0) {\n\t\t\t\t\tmetadata.push(theme.fg(\"muted\", `elapsed ${formatElapsedClock(info.durationMs)}`));\n\t\t\t\t}\n\t\t\t\tif (info.isolation && info.isolation !== \"none\") {\n\t\t\t\t\tmetadata.push(theme.fg(\"muted\", `iso ${info.isolation}`));\n\t\t\t\t}\n\t\t\t\t\tif (info.lockKey) {\n\t\t\t\t\t\tmetadata.push(theme.fg(\"muted\", `lock ${info.lockKey}`));\n\t\t\t\t\t}\n\t\t\t\t\tif (metadata.length > 0) {\n\t\t\t\t\t\tthis.addChild(new Text(metadata.join(theme.fg(\"dim\", \" \\u00B7 \")), 0, 0));\n\t\t\t\t\t}\n\t\t\t\t\tconst delegateSummary = summarizeDelegates(info);\n\t\t\t\t\tif (delegateSummary) {\n\t\t\t\t\t\tthis.addChild(new Text(theme.fg(\"accent\", formatDelegateSummary(delegateSummary)), 0, 0));\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof info.delegateIndex === \"number\" && info.delegateIndex > 0) {\n\t\t\t\t\t\tconst delegateTotal =\n\t\t\t\t\t\t\ttypeof info.delegateTotal === \"number\" && info.delegateTotal > 0\n\t\t\t\t\t\t\t\t? info.delegateTotal\n\t\t\t\t\t\t\t\t: info.delegateIndex;\n\t\t\t\t\t\tconst delegateParts: string[] = [theme.fg(\"accent\", `delegate ${info.delegateIndex}/${delegateTotal}`)];\n\t\t\t\t\t\tif (typeof info.delegateDescription === \"string\" && info.delegateDescription.trim().length > 0) {\n\t\t\t\t\t\t\tdelegateParts.push(theme.fg(\"customMessageText\", info.delegateDescription.trim()));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (typeof info.delegateProfile === \"string\" && info.delegateProfile.trim().length > 0) {\n\t\t\t\t\t\t\tdelegateParts.push(theme.fg(\"muted\", `(${info.delegateProfile.trim()})`));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.addChild(new Text(delegateParts.join(theme.fg(\"dim\", \" \\u00B7 \")), 0, 0));\n\t\t\t\t\t}\n\t\t\t\t\tif (Array.isArray(info.delegateItems) && info.delegateItems.length > 0) {\n\t\t\t\t\t\tconst selected = selectDelegateItemsForDisplay(info.delegateItems);\n\t\t\t\t\t\tconst headerParts = [theme.fg(\"muted\", \"delegates\")];\n\t\t\t\t\t\tif (selected.compacted) {\n\t\t\t\t\t\t\theaderParts.push(theme.fg(\"accent\", \"compact\"));\n\t\t\t\t\t\t\tif (selected.hiddenDonePending > 0) {\n\t\t\t\t\t\t\t\theaderParts.push(theme.fg(\"muted\", `hidden ${selected.hiddenDonePending} done/pending`));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.addChild(new Text(headerParts.join(theme.fg(\"dim\", \" \\u00B7 \")), 0, 0));\n\t\t\t\t\t\tif (selected.visibleItems.length === 0 && selected.compacted) {\n\t\t\t\t\t\t\tthis.addChild(new Text(theme.fg(\"muted\", \"no running/failed delegates\"), 0, 0));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfor (const item of selected.visibleItems) {\n\t\t\t\t\t\t\tconst marker = (() => {\n\t\t\t\t\t\t\t\tswitch (item.status) {\n\t\t\t\t\t\t\t\t\tcase \"done\":\n\t\t\t\t\t\t\t\t\t\treturn theme.fg(\"success\", \"[x]\");\n\t\t\t\t\t\t\t\t\tcase \"running\":\n\t\t\t\t\t\t\t\t\t\treturn theme.fg(\"accent\", \"[>]\");\n\t\t\t\t\t\t\t\t\tcase \"failed\":\n\t\t\t\t\t\t\t\t\t\treturn theme.fg(\"warning\", \"[!]\");\n\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\treturn theme.fg(\"muted\", \"[ ]\");\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t})();\n\t\t\t\t\t\t\tconst label = `${item.index}. ${item.description} (${item.profile})`;\n\t\t\t\t\t\t\tconst textColor =\n\t\t\t\t\t\t\t\titem.status === \"done\"\n\t\t\t\t\t\t\t\t\t? \"muted\"\n\t\t\t\t\t\t\t\t\t: item.status === \"running\"\n\t\t\t\t\t\t\t\t\t\t? \"customMessageText\"\n\t\t\t\t\t\t\t\t\t\t: item.status === \"failed\"\n\t\t\t\t\t\t\t\t\t\t\t? \"warning\"\n\t\t\t\t\t\t\t\t\t\t\t: \"muted\";\n\t\t\t\t\t\t\tthis.addChild(new Text(`${marker} ${theme.fg(textColor, label)}`, 0, 0));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (selected.overflow > 0) {\n\t\t\t\t\t\t\tthis.addChild(new Text(theme.fg(\"muted\", `... +${selected.overflow} more`), 0, 0));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (info.phaseState) {\n\t\t\t\t\t\tthis.addChild(new Text(renderPhaseTimeline(info.phaseState), 0, 0));\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\tcase \"done\": {\n\t\t\t\tconst checkmark = theme.fg(\"success\", \"+\");\n\t\t\t\tconst parts: string[] = [];\n\t\t\t\tif (info.outputLength !== undefined) {\n\t\t\t\t\tparts.push(theme.fg(\"customMessageText\", formatBytes(info.outputLength)) + theme.fg(\"muted\", \" output\"));\n\t\t\t\t}\n\t\t\t\tif (info.durationMs !== undefined) {\n\t\t\t\t\tparts.push(theme.fg(\"muted\", formatDuration(info.durationMs)));\n\t\t\t\t}\n\t\t\t\tconst toolProgress = formatToolProgress(info.toolCallsStarted, info.toolCallsCompleted);\n\t\t\t\tif (toolProgress) {\n\t\t\t\t\tparts.push(theme.fg(\"muted\", toolProgress));\n\t\t\t\t}\n\t\t\t\t\tconst delegateSummary = summarizeDelegates(info);\n\t\t\t\t\tif (delegateSummary) {\n\t\t\t\t\t\tparts.push(theme.fg(\"muted\", `delegates ${delegateSummary.done}/${delegateSummary.total} done`));\n\t\t\t\t\t\tif (delegateSummary.failed > 0) {\n\t\t\t\t\t\t\tparts.push(theme.fg(\"warning\", `${delegateSummary.failed} failed`));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\tif (typeof info.waitMs === \"number\" && info.waitMs > 0) {\n\t\t\t\t\tparts.push(theme.fg(\"muted\", `queue ${formatDuration(info.waitMs)}`));\n\t\t\t\t}\n\t\t\t\tconst detail = parts.length > 0 ? \" \" + parts.join(theme.fg(\"dim\", \", \")) : \"\";\n\t\t\t\tthis.addChild(new Text(`${checkmark}${detail}`, 0, 0));\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"error\": {\n\t\t\t\tconst cross = theme.fg(\"error\", \"x\");\n\t\t\t\tconst message = info.errorMessage ? info.errorMessage : \"error\";\n\t\t\t\tconst errorText = theme.fg(\"error\", ` ${message}`);\n\t\t\t\tthis.addChild(new Text(`${cross}${errorText}`, 0, 0));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-plan-message.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/task-plan-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAgB,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"task-plan-message.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/task-plan-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAgB,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAMnE,qBAAa,wBAAyB,SAAQ,GAAG;IAChD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAmB;gBAEvB,QAAQ,EAAE,gBAAgB;IAMtC,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI;IAO3B,UAAU,IAAI,IAAI;IAK3B,OAAO,CAAC,WAAW;IAcnB,OAAO,CAAC,aAAa;CAsCrB"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { Box, Spacer, Text } from "@mariozechner/pi-tui";
|
|
2
2
|
import { theme } from "../theme/theme.js";
|
|
3
3
|
import { editorKey } from "./keybinding-hints.js";
|
|
4
|
+
const MESSAGE_BOX_PADDING_X = 2;
|
|
4
5
|
export class TaskPlanMessageComponent extends Box {
|
|
5
6
|
constructor(snapshot) {
|
|
6
|
-
super(
|
|
7
|
+
super(MESSAGE_BOX_PADDING_X, 1, (text) => theme.bg("customMessageBg", text));
|
|
7
8
|
this.expanded = false;
|
|
8
9
|
this.snapshot = snapshot;
|
|
9
10
|
this.renderContent();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-plan-message.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/task-plan-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,MAAM,OAAO,wBAAyB,SAAQ,GAAG;IAIhD,YAAY,QAA0B;QACrC,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"task-plan-message.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/task-plan-message.ts"],"names":[],"mappings":"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","sourcesContent":["import { Box, Spacer, Text } from \"@mariozechner/pi-tui\";\nimport type { TaskPlanSnapshot } from \"../../../core/task-plan.js\";\nimport { theme } from \"../theme/theme.js\";\nimport { editorKey } from \"./keybinding-hints.js\";\n\nconst MESSAGE_BOX_PADDING_X = 2;\n\nexport class TaskPlanMessageComponent extends Box {\n\tprivate expanded = false;\n\tprivate snapshot: TaskPlanSnapshot;\n\n\tconstructor(snapshot: TaskPlanSnapshot) {\n\t\tsuper(MESSAGE_BOX_PADDING_X, 1, (text) => theme.bg(\"customMessageBg\", text));\n\t\tthis.snapshot = snapshot;\n\t\tthis.renderContent();\n\t}\n\n\tsetExpanded(expanded: boolean): void {\n\t\tif (this.expanded !== expanded) {\n\t\t\tthis.expanded = expanded;\n\t\t\tthis.renderContent();\n\t\t}\n\t}\n\n\toverride invalidate(): void {\n\t\tsuper.invalidate();\n\t\tthis.renderContent();\n\t}\n\n\tprivate statusLabel(status: TaskPlanSnapshot[\"steps\"][number][\"status\"]): string {\n\t\tswitch (status) {\n\t\t\tcase \"done\":\n\t\t\t\treturn theme.fg(\"success\", \"[done]\");\n\t\t\tcase \"in_progress\":\n\t\t\t\treturn theme.fg(\"accent\", \"[in progress]\");\n\t\t\tcase \"blocked\":\n\t\t\t\treturn theme.fg(\"warning\", \"[blocked]\");\n\t\t\tcase \"pending\":\n\t\t\tdefault:\n\t\t\t\treturn theme.fg(\"muted\", \"[pending]\");\n\t\t}\n\t}\n\n\tprivate renderContent(): void {\n\t\tthis.clear();\n\n\t\tthis.addChild(new Text(theme.fg(\"customMessageLabel\", \"\\x1b[1m[plan]\\x1b[22m\"), 0, 0));\n\t\tthis.addChild(new Spacer(1));\n\n\t\tconst summary = `Complex task plan: ${this.snapshot.completedSteps}/${this.snapshot.totalSteps} done`;\n\t\tthis.addChild(new Text(theme.fg(\"customMessageText\", summary), 0, 0));\n\n\t\tif (this.snapshot.currentStepIndex !== null) {\n\t\t\tconst current = this.snapshot.steps[this.snapshot.currentStepIndex]?.title;\n\t\t\tif (current) {\n\t\t\t\tthis.addChild(new Text(theme.fg(\"accent\", `Current: ${current}`), 0, 0));\n\t\t\t}\n\t\t}\n\n\t\tif (!this.expanded) {\n\t\t\tthis.addChild(\n\t\t\t\tnew Text(\n\t\t\t\t\ttheme.fg(\"customMessageText\", \"Steps hidden (\") +\n\t\t\t\t\t\ttheme.fg(\"dim\", editorKey(\"expandTools\")) +\n\t\t\t\t\t\ttheme.fg(\"customMessageText\", \" to expand)\"),\n\t\t\t\t\t0,\n\t\t\t\t\t0,\n\t\t\t\t),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.addChild(new Spacer(1));\n\t\tfor (const [index, step] of this.snapshot.steps.entries()) {\n\t\t\tconst isCurrent = this.snapshot.currentStepIndex === index;\n\t\t\tconst marker = isCurrent ? theme.fg(\"accent\", \"-> \") : \" \";\n\t\t\tconst line =\n\t\t\t\tmarker + this.statusLabel(step.status) + theme.fg(\"customMessageText\", ` ${index + 1}. ${step.title}`);\n\t\t\tthis.addChild(new Text(line, 0, 0));\n\t\t}\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-execution.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/tool-execution.ts"],"names":[],"mappings":"AACA,OAAO,EAEN,SAAS,EAOT,KAAK,GAAG,EAER,MAAM,sBAAsB,CAAC;AAE9B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"tool-execution.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/tool-execution.ts"],"names":[],"mappings":"AACA,OAAO,EAEN,SAAS,EAOT,KAAK,GAAG,EAER,MAAM,sBAAsB,CAAC;AAE9B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AA+ExE,MAAM,WAAW,oBAAoB;IACpC,UAAU,CAAC,EAAE,OAAO,CAAC;CACrB;AAUD;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,SAAS;IACpD,OAAO,CAAC,UAAU,CAAM;IACxB,OAAO,CAAC,WAAW,CAAO;IAC1B,OAAO,CAAC,eAAe,CAAe;IACtC,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,IAAI,CAAM;IAClB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,EAAE,CAAM;IAChB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,MAAM,CAAC,CAIb;IAEF,OAAO,CAAC,eAAe,CAAC,CAAiC;IACzD,OAAO,CAAC,eAAe,CAAC,CAAS;IAEjC,OAAO,CAAC,eAAe,CAA8D;IAErF,OAAO,CAAC,mBAAmB,CAAC,CAAsB;IAElD,OAAO,CAAC,aAAa,CAAS;gBAG7B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,GAAG,EACT,OAAO,EAAE,oBAAoB,YAAK,EAClC,cAAc,EAAE,cAAc,GAAG,SAAS,EAC1C,EAAE,EAAE,GAAG,EACP,GAAG,GAAE,MAAsB;IA6B5B;;;;OAIG;IACH,OAAO,CAAC,wBAAwB;IAMhC,UAAU,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI;IAQ3B,OAAO,CAAC,mBAAmB;IAK3B,OAAO,CAAC,2BAA2B;IAYnC,OAAO,CAAC,8BAA8B;IAkBtC,OAAO,CAAC,oCAAoC;IAyD5C;;;OAGG;IACH,eAAe,IAAI,IAAI;IAWvB;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IA6B5B,YAAY,CACX,MAAM,EAAE;QACP,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAClF,OAAO,CAAC,EAAE,GAAG,CAAC;QACd,OAAO,EAAE,OAAO,CAAC;KACjB,EACD,SAAS,UAAQ,GACf,IAAI;IAeP;;;OAGG;IACH,OAAO,CAAC,0BAA0B;IA2BlC,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI;IAKpC,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAKzB,UAAU,IAAI,IAAI;IAKlB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAOxC,OAAO,CAAC,aAAa;IA8IrB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAyFzB,OAAO,CAAC,aAAa;IA2BrB,OAAO,CAAC,mBAAmB;CAwW3B"}
|
|
@@ -12,6 +12,8 @@ import { keyHint } from "./keybinding-hints.js";
|
|
|
12
12
|
import { truncateToVisualLines } from "./visual-truncate.js";
|
|
13
13
|
// Preview line limit for bash when not expanded
|
|
14
14
|
const BASH_PREVIEW_LINES = 5;
|
|
15
|
+
const TOOL_BOX_PADDING_X = 2;
|
|
16
|
+
const TOOL_BOX_PADDING_Y = 1;
|
|
15
17
|
// During partial write tool-call streaming, re-highlight the first N lines fully
|
|
16
18
|
// to keep multiline tokenization mostly correct without re-highlighting the full file.
|
|
17
19
|
const WRITE_PARTIAL_FULL_HIGHLIGHT_LINES = 50;
|
|
@@ -48,6 +50,9 @@ function str(value) {
|
|
|
48
50
|
return "";
|
|
49
51
|
return null; // Invalid type
|
|
50
52
|
}
|
|
53
|
+
function hasAnsiEscape(input) {
|
|
54
|
+
return /\x1b\[[0-9;]*m/.test(input);
|
|
55
|
+
}
|
|
51
56
|
function toolBadge(label, state) {
|
|
52
57
|
const color = state === "error" ? "error" : state === "success" ? "accent" : "muted";
|
|
53
58
|
return theme.fg("dim", "[") + theme.fg(color, label) + theme.fg("dim", "]");
|
|
@@ -55,8 +60,9 @@ function toolBadge(label, state) {
|
|
|
55
60
|
function toolHeader(label, subject, state, meta) {
|
|
56
61
|
const nestColor = state === "error" ? "error" : state === "success" ? "accent" : "dim";
|
|
57
62
|
const parts = [toolBadge(label, state)];
|
|
58
|
-
if (subject)
|
|
59
|
-
parts.push(subject);
|
|
63
|
+
if (subject) {
|
|
64
|
+
parts.push(hasAnsiEscape(subject) ? subject : theme.fg("toolTitle", subject));
|
|
65
|
+
}
|
|
60
66
|
if (meta)
|
|
61
67
|
parts.push(theme.fg("muted", meta));
|
|
62
68
|
return theme.fg(nestColor, "\u23BF ") + parts.join(" ");
|
|
@@ -87,8 +93,8 @@ export class ToolExecutionComponent extends Container {
|
|
|
87
93
|
this.cwd = cwd;
|
|
88
94
|
this.addChild(new Spacer(1));
|
|
89
95
|
// Always create both - contentBox for custom tools/bash, contentText for other built-ins
|
|
90
|
-
this.contentBox = new Box(
|
|
91
|
-
this.contentText = new Text("",
|
|
96
|
+
this.contentBox = new Box(TOOL_BOX_PADDING_X, TOOL_BOX_PADDING_Y, (text) => theme.bg("toolPendingBg", text));
|
|
97
|
+
this.contentText = new Text("", TOOL_BOX_PADDING_X, TOOL_BOX_PADDING_Y, (text) => theme.bg("toolPendingBg", text));
|
|
92
98
|
// Use contentBox for bash (visual truncation) or custom tools with custom renderers
|
|
93
99
|
// Use contentText for built-in tools (including overrides without custom renderers)
|
|
94
100
|
if (toolName === "bash" || (toolDefinition && !this.shouldUseBuiltInRenderer())) {
|
|
@@ -328,6 +334,7 @@ export class ToolExecutionComponent extends Container {
|
|
|
328
334
|
// Custom tools use Box for flexible component rendering
|
|
329
335
|
this.contentBox.setBgFn(bgFn);
|
|
330
336
|
this.contentBox.clear();
|
|
337
|
+
let customCallSectionRendered = false;
|
|
331
338
|
// Render call component
|
|
332
339
|
if (this.toolDefinition.renderCall) {
|
|
333
340
|
try {
|
|
@@ -335,24 +342,33 @@ export class ToolExecutionComponent extends Container {
|
|
|
335
342
|
if (callComponent !== undefined) {
|
|
336
343
|
this.contentBox.addChild(callComponent);
|
|
337
344
|
customRendererHasContent = true;
|
|
345
|
+
customCallSectionRendered = true;
|
|
338
346
|
}
|
|
339
347
|
}
|
|
340
348
|
catch {
|
|
341
349
|
// Fall back to default on error
|
|
342
350
|
this.contentBox.addChild(new Text(theme.fg("toolTitle", theme.bold(this.toolName)), 0, 0));
|
|
343
351
|
customRendererHasContent = true;
|
|
352
|
+
customCallSectionRendered = true;
|
|
344
353
|
}
|
|
345
354
|
}
|
|
346
355
|
else {
|
|
347
356
|
// No custom renderCall, show tool name
|
|
348
357
|
this.contentBox.addChild(new Text(theme.fg("toolTitle", theme.bold(this.toolName)), 0, 0));
|
|
349
358
|
customRendererHasContent = true;
|
|
359
|
+
customCallSectionRendered = true;
|
|
350
360
|
}
|
|
361
|
+
const addSectionSpacer = () => {
|
|
362
|
+
if (customCallSectionRendered) {
|
|
363
|
+
this.contentBox.addChild(new Spacer(1));
|
|
364
|
+
}
|
|
365
|
+
};
|
|
351
366
|
// Render result component if we have a result
|
|
352
367
|
if (this.result && this.toolDefinition.renderResult) {
|
|
353
368
|
try {
|
|
354
369
|
const resultComponent = this.toolDefinition.renderResult({ content: this.result.content, details: this.result.details }, { expanded: this.expanded, isPartial: this.isPartial }, theme);
|
|
355
370
|
if (resultComponent !== undefined) {
|
|
371
|
+
addSectionSpacer();
|
|
356
372
|
this.contentBox.addChild(resultComponent);
|
|
357
373
|
customRendererHasContent = true;
|
|
358
374
|
}
|
|
@@ -361,6 +377,7 @@ export class ToolExecutionComponent extends Container {
|
|
|
361
377
|
// Fall back to showing raw output on error
|
|
362
378
|
const output = this.getTextOutput();
|
|
363
379
|
if (output) {
|
|
380
|
+
addSectionSpacer();
|
|
364
381
|
this.contentBox.addChild(new Text(theme.fg("toolOutput", output), 0, 0));
|
|
365
382
|
customRendererHasContent = true;
|
|
366
383
|
}
|
|
@@ -370,6 +387,7 @@ export class ToolExecutionComponent extends Container {
|
|
|
370
387
|
// Has result but no custom renderResult
|
|
371
388
|
const output = this.getTextOutput();
|
|
372
389
|
if (output) {
|
|
390
|
+
addSectionSpacer();
|
|
373
391
|
this.contentBox.addChild(new Text(theme.fg("toolOutput", output), 0, 0));
|
|
374
392
|
customRendererHasContent = true;
|
|
375
393
|
}
|
|
@@ -764,7 +782,7 @@ export class ToolExecutionComponent extends Container {
|
|
|
764
782
|
const rawPath = str(this.args?.path);
|
|
765
783
|
const shortPath = rawPath !== null ? shortenPath(rawPath || ".") : null;
|
|
766
784
|
const pathLabel = shortPath === null ? "[invalid arg]" : shortPath || ".";
|
|
767
|
-
const subject = `${patternLabel} ${theme.fg("muted", "in")} ${shortPath === null ? invalidArg : theme.fg("accent", pathLabel)}`;
|
|
785
|
+
const subject = `${theme.fg("toolTitle", patternLabel)} ${theme.fg("muted", "in")} ${shortPath === null ? invalidArg : theme.fg("accent", pathLabel)}`;
|
|
768
786
|
if (this.isPartial) {
|
|
769
787
|
text = toolHeader("find", subject, "pending");
|
|
770
788
|
}
|
|
@@ -868,10 +886,10 @@ export class ToolExecutionComponent extends Container {
|
|
|
868
886
|
// Generic tool (shouldn't reach here for custom tools)
|
|
869
887
|
text = theme.fg("toolTitle", theme.bold(this.toolName));
|
|
870
888
|
const content = JSON.stringify(this.args, null, 2);
|
|
871
|
-
text += `\n\n${content}`;
|
|
889
|
+
text += `\n\n${theme.fg("toolOutput", content)}`;
|
|
872
890
|
const output = this.getTextOutput();
|
|
873
891
|
if (output) {
|
|
874
|
-
text += `\n${output}`;
|
|
892
|
+
text += `\n${theme.fg("toolOutput", output)}`;
|
|
875
893
|
}
|
|
876
894
|
}
|
|
877
895
|
return text;
|