@ashx-j/lunr-dev 0.2.13-dev.3.1 → 0.2.13-dev.5.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.
Files changed (120) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/dist/builtin-extensions/ashxj-tui.d.ts +2 -1
  3. package/dist/builtin-extensions/ashxj-tui.d.ts.map +1 -1
  4. package/dist/builtin-extensions/ashxj-tui.js +7 -17
  5. package/dist/builtin-extensions/ashxj-tui.js.map +1 -1
  6. package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts +2 -0
  7. package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts.map +1 -1
  8. package/dist/builtin-extensions/pi-subagents/src/extension/index.js +27 -22
  9. package/dist/builtin-extensions/pi-subagents/src/extension/index.js.map +1 -1
  10. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.d.ts.map +1 -1
  11. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.js +5 -2
  12. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.js.map +1 -1
  13. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.d.ts.map +1 -1
  14. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.js +12 -1
  15. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.js.map +1 -1
  16. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-status.d.ts +1 -0
  17. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-status.d.ts.map +1 -1
  18. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-status.js +3 -2
  19. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-status.js.map +1 -1
  20. package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-append.d.ts.map +1 -1
  21. package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-append.js +1 -0
  22. package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-append.js.map +1 -1
  23. package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-root-attachment.d.ts.map +1 -1
  24. package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-root-attachment.js +3 -0
  25. package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-root-attachment.js.map +1 -1
  26. package/dist/builtin-extensions/pi-subagents/src/runs/background/fleet-view.d.ts.map +1 -1
  27. package/dist/builtin-extensions/pi-subagents/src/runs/background/fleet-view.js +3 -3
  28. package/dist/builtin-extensions/pi-subagents/src/runs/background/fleet-view.js.map +1 -1
  29. package/dist/builtin-extensions/pi-subagents/src/runs/background/run-status.d.ts.map +1 -1
  30. package/dist/builtin-extensions/pi-subagents/src/runs/background/run-status.js +2 -2
  31. package/dist/builtin-extensions/pi-subagents/src/runs/background/run-status.js.map +1 -1
  32. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts.map +1 -1
  33. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js +3 -0
  34. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js.map +1 -1
  35. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.d.ts.map +1 -1
  36. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js +7 -1
  37. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js.map +1 -1
  38. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts.map +1 -1
  39. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js +2 -0
  40. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js.map +1 -1
  41. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts +1 -0
  42. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts.map +1 -1
  43. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js +19 -3
  44. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js.map +1 -1
  45. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.d.ts +10 -1
  46. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.d.ts.map +1 -1
  47. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.js +19 -0
  48. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.js.map +1 -1
  49. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts +1 -0
  50. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts.map +1 -1
  51. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.js.map +1 -1
  52. package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.d.ts +2 -1
  53. package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.d.ts.map +1 -1
  54. package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.js +17 -0
  55. package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.js.map +1 -1
  56. package/dist/builtin-extensions/pi-subagents/src/shared/formatters.d.ts +3 -1
  57. package/dist/builtin-extensions/pi-subagents/src/shared/formatters.d.ts.map +1 -1
  58. package/dist/builtin-extensions/pi-subagents/src/shared/formatters.js +14 -3
  59. package/dist/builtin-extensions/pi-subagents/src/shared/formatters.js.map +1 -1
  60. package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts +14 -0
  61. package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts.map +1 -1
  62. package/dist/builtin-extensions/pi-subagents/src/shared/types.js.map +1 -1
  63. package/dist/builtin-extensions/pi-subagents/src/tui/fleet.d.ts.map +1 -1
  64. package/dist/builtin-extensions/pi-subagents/src/tui/fleet.js +2 -2
  65. package/dist/builtin-extensions/pi-subagents/src/tui/fleet.js.map +1 -1
  66. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts.map +1 -1
  67. package/dist/builtin-extensions/pi-subagents/src/tui/render.js +12 -10
  68. package/dist/builtin-extensions/pi-subagents/src/tui/render.js.map +1 -1
  69. package/dist/core/customize.d.ts +2 -4
  70. package/dist/core/customize.d.ts.map +1 -1
  71. package/dist/core/customize.js +2 -8
  72. package/dist/core/customize.js.map +1 -1
  73. package/dist/core/settings-manager.d.ts +0 -6
  74. package/dist/core/settings-manager.d.ts.map +1 -1
  75. package/dist/core/settings-manager.js +0 -17
  76. package/dist/core/settings-manager.js.map +1 -1
  77. package/dist/core/slash-commands.d.ts.map +1 -1
  78. package/dist/core/slash-commands.js +1 -0
  79. package/dist/core/slash-commands.js.map +1 -1
  80. package/dist/migrations.d.ts +2 -0
  81. package/dist/migrations.d.ts.map +1 -1
  82. package/dist/migrations.js +14 -4
  83. package/dist/migrations.js.map +1 -1
  84. package/dist/modes/interactive/components/assistant-message.d.ts +1 -3
  85. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  86. package/dist/modes/interactive/components/assistant-message.js +4 -32
  87. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  88. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  89. package/dist/modes/interactive/components/custom-editor.js +2 -1
  90. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  91. package/dist/modes/interactive/components/plan-message.d.ts +1 -3
  92. package/dist/modes/interactive/components/plan-message.d.ts.map +1 -1
  93. package/dist/modes/interactive/components/plan-message.js +1 -16
  94. package/dist/modes/interactive/components/plan-message.js.map +1 -1
  95. package/dist/modes/interactive/components/settings-selector.d.ts +0 -4
  96. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  97. package/dist/modes/interactive/components/settings-selector.js +10 -30
  98. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  99. package/dist/modes/interactive/components/user-message.d.ts +1 -3
  100. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  101. package/dist/modes/interactive/components/user-message.js +2 -19
  102. package/dist/modes/interactive/components/user-message.js.map +1 -1
  103. package/dist/modes/interactive/interactive-mode.d.ts +2 -0
  104. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  105. package/dist/modes/interactive/interactive-mode.js +29 -34
  106. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  107. package/dist/modes/interactive/theme/moon.json +0 -1
  108. package/dist/modes/interactive/theme/theme-schema.json +3 -3
  109. package/dist/modes/interactive/theme/theme.d.ts +1 -1
  110. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  111. package/dist/modes/interactive/theme/theme.js +0 -6
  112. package/dist/modes/interactive/theme/theme.js.map +1 -1
  113. package/docs/features.md +2 -2
  114. package/docs/keybindings.md +1 -1
  115. package/docs/quickstart.md +1 -1
  116. package/docs/settings.md +1 -3
  117. package/docs/terminal-setup.md +2 -2
  118. package/docs/usage.md +2 -1
  119. package/docs/windows.md +1 -1
  120. package/package.json +4 -4
@@ -1,13 +1,15 @@
1
1
  /**
2
2
  * Formatting utilities for display output
3
3
  */
4
- import type { Usage, SingleResult } from "./types.ts";
4
+ import type { ModelSelection, Usage, SingleResult } from "./types.ts";
5
5
  import type { ChainStep } from "./settings.ts";
6
6
  /**
7
7
  * Format token count with k suffix for large numbers
8
8
  */
9
9
  export declare function formatTokens(n: number): string;
10
10
  export declare function formatModelThinking(model?: string, thinking?: string): string;
11
+ /** Compact/header badge: selected tier name, or resolved model when selected by model / inherit. */
12
+ export declare function formatModelSelection(selection?: ModelSelection, resolvedModel?: string, thinking?: string): string;
11
13
  /**
12
14
  * Format usage statistics into a compact string
13
15
  */
@@ -1 +1 @@
1
- {"version":3,"file":"formatters.d.ts","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/shared/formatters.ts"],"names":[],"mappings":"AACA;;GAEG;AAIH,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAI/C;;GAEG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAgB,mBAAmB,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAU7E;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAU5D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAIjD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAChC,KAAK,EAAE,SAAS,EAAE,EAClB,OAAO,EAAE,YAAY,EAAE,EACvB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,WAAW,GAAG,QAAQ,EAC9B,UAAU,CAAC,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC3C,MAAM,CA8BR;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,UAAQ,GAAG,MAAM,CAuBpG;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAM7C","sourcesContent":["// @ts-nocheck\n/**\n * Formatting utilities for display output\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { Usage, SingleResult } from \"./types.ts\";\nimport type { ChainStep } from \"./settings.ts\";\nimport { isDynamicParallelStep, isParallelStep } from \"./settings.ts\";\nimport { splitKnownThinkingSuffix, THINKING_LEVELS } from \"./model-info.ts\";\n\n/**\n * Format token count with k suffix for large numbers\n */\nexport function formatTokens(n: number): string {\n\treturn n < 1000 ? String(n) : n < 10000 ? `${(n / 1000).toFixed(1)}k` : `${Math.round(n / 1000)}k`;\n}\n\nexport function formatModelThinking(model?: string, thinking?: string): string {\n\tconst parsed = model ? splitKnownThinkingSuffix(model) : undefined;\n\tlet displayModel = parsed?.baseModel ?? model;\n\tconst explicitThinking = THINKING_LEVELS.find((level) => level === thinking?.trim());\n\tconst displayThinking = parsed?.thinkingSuffix ? parsed.thinkingSuffix.slice(1) : explicitThinking;\n\tif (displayModel) {\n\t\tconst slashIdx = displayModel.lastIndexOf(\"/\");\n\t\tif (slashIdx !== -1) displayModel = displayModel.slice(slashIdx + 1);\n\t}\n\treturn [displayModel, displayThinking ? `thinking ${displayThinking}` : undefined].filter(Boolean).join(\" · \");\n}\n\n/**\n * Format usage statistics into a compact string\n */\nexport function formatUsage(u: Usage, model?: string): string {\n\tconst parts: string[] = [];\n\tif (u.turns) parts.push(`${u.turns} turn${u.turns > 1 ? \"s\" : \"\"}`);\n\tif (u.input) parts.push(`in:${formatTokens(u.input)}`);\n\tif (u.output) parts.push(`out:${formatTokens(u.output)}`);\n\tif (u.cacheRead) parts.push(`R${formatTokens(u.cacheRead)}`);\n\tif (u.cacheWrite) parts.push(`W${formatTokens(u.cacheWrite)}`);\n\tif (u.cost) parts.push(`$${u.cost.toFixed(4)}`);\n\tif (model) parts.push(model);\n\treturn parts.join(\" \");\n}\n\n/**\n * Format duration in human-readable form\n */\nexport function formatDuration(ms: number): string {\n\tif (ms < 1000) return `${ms}ms`;\n\tif (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n\treturn `${Math.floor(ms / 60000)}m${Math.floor((ms % 60000) / 1000)}s`;\n}\n\n/**\n * Build a summary string for a completed/failed chain\n */\nexport function buildChainSummary(\n\tsteps: ChainStep[],\n\tresults: SingleResult[],\n\tchainDir: string,\n\tstatus: \"completed\" | \"failed\",\n\tfailedStep?: { index: number; error: string },\n): string {\n\tconst stepNames = steps\n\t\t.map((step) => (isParallelStep(step) ? `parallel[${step.parallel.length}]` : isDynamicParallelStep(step) ? `expand:${step.parallel.agent}` : step.agent))\n\t\t.join(\" → \");\n\n\tconst totalDuration = results.reduce((sum, r) => sum + (r.progress?.durationMs || 0), 0);\n\tconst durationStr = formatDuration(totalDuration);\n\n\tconst progressPath = path.join(chainDir, \"progress.md\");\n\tconst hasProgress = fs.existsSync(progressPath);\n\tconst allSkills = new Set<string>();\n\tfor (const r of results) {\n\t\tif (r.skills) r.skills.forEach((s) => allSkills.add(s));\n\t}\n\tconst skillsLine = allSkills.size > 0 ? `🔧 Skills: ${[...allSkills].join(\", \")}` : \"\";\n\n\tif (status === \"completed\") {\n\t\tconst stepWord = results.length === 1 ? \"step\" : \"steps\";\n\t\treturn `✅ Chain completed: ${stepNames} (${results.length} ${stepWord}, ${durationStr})${skillsLine ? `\\n${skillsLine}` : \"\"}\n\n📋 Progress: ${hasProgress ? progressPath : \"(none)\"}\n📁 Artifacts: ${chainDir}`;\n\t} else {\n\t\tconst stepInfo = failedStep ? ` at step ${failedStep.index + 1}` : \"\";\n\t\tconst errorInfo = failedStep?.error ? `: ${failedStep.error}` : \"\";\n\t\treturn `❌ Chain failed${stepInfo}${errorInfo}${skillsLine ? `\\n${skillsLine}` : \"\"}\n\n📋 Progress: ${hasProgress ? progressPath : \"(none)\"}\n📁 Artifacts: ${chainDir}`;\n\t}\n}\n\n/**\n * Format a tool call for display\n */\nexport function formatToolCall(name: string, args: Record<string, unknown>, expanded = false): string {\n\tswitch (name) {\n\t\tcase \"bash\": {\n\t\t\tconst command = typeof args.command === \"string\" ? args.command : \"\";\n\t\t\tconst maxLength = expanded ? 240 : 60;\n\t\t\treturn `$ ${command.slice(0, maxLength)}${command.length > maxLength ? \"...\" : \"\"}`;\n\t\t}\n\t\tcase \"read\":\n\t\tcase \"write\":\n\t\tcase \"edit\": {\n\t\t\tconst target = typeof args.path === \"string\"\n\t\t\t\t? args.path\n\t\t\t\t: typeof args.file_path === \"string\"\n\t\t\t\t\t? args.file_path\n\t\t\t\t\t: \"\";\n\t\t\treturn `${name} ${shortenPath(target)}`;\n\t\t}\n\t\tdefault: {\n\t\t\tconst s = JSON.stringify(args);\n\t\t\tconst maxLength = expanded ? 160 : 40;\n\t\t\treturn `${name} ${s.slice(0, maxLength)}${s.length > maxLength ? \"...\" : \"\"}`;\n\t\t}\n\t}\n}\n\n/**\n * Shorten a path by replacing home directory with ~\n */\nexport function shortenPath(p: string): string {\n\tconst home = process.env.HOME;\n\tif (home && p.startsWith(home)) {\n\t\treturn `~${p.slice(home.length)}`;\n\t}\n\treturn p;\n}\n"]}
1
+ {"version":3,"file":"formatters.d.ts","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/shared/formatters.ts"],"names":[],"mappings":"AACA;;GAEG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAI/C;;GAEG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE9C;AASD,wBAAgB,mBAAmB,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAQ7E;AAED,oGAAoG;AACpG,wBAAgB,oBAAoB,CAAC,SAAS,CAAC,EAAE,cAAc,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAKlH;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAU5D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAIjD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAChC,KAAK,EAAE,SAAS,EAAE,EAClB,OAAO,EAAE,YAAY,EAAE,EACvB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,WAAW,GAAG,QAAQ,EAC9B,UAAU,CAAC,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC3C,MAAM,CA8BR;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,UAAQ,GAAG,MAAM,CAuBpG;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAM7C","sourcesContent":["// @ts-nocheck\n/**\n * Formatting utilities for display output\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { ModelSelection, Usage, SingleResult } from \"./types.ts\";\nimport type { ChainStep } from \"./settings.ts\";\nimport { isDynamicParallelStep, isParallelStep } from \"./settings.ts\";\nimport { splitKnownThinkingSuffix, THINKING_LEVELS } from \"./model-info.ts\";\n\n/**\n * Format token count with k suffix for large numbers\n */\nexport function formatTokens(n: number): string {\n\treturn n < 1000 ? String(n) : n < 10000 ? `${(n / 1000).toFixed(1)}k` : `${Math.round(n / 1000)}k`;\n}\n\nfunction formatThinkingLabel(model?: string, thinking?: string): string | undefined {\n\tconst parsed = model ? splitKnownThinkingSuffix(model) : undefined;\n\tconst explicitThinking = THINKING_LEVELS.find((level) => level === thinking?.trim());\n\tconst displayThinking = parsed?.thinkingSuffix ? parsed.thinkingSuffix.slice(1) : explicitThinking;\n\treturn displayThinking ? `thinking ${displayThinking}` : undefined;\n}\n\nexport function formatModelThinking(model?: string, thinking?: string): string {\n\tconst parsed = model ? splitKnownThinkingSuffix(model) : undefined;\n\tlet displayModel = parsed?.baseModel ?? model;\n\tif (displayModel) {\n\t\tconst slashIdx = displayModel.lastIndexOf(\"/\");\n\t\tif (slashIdx !== -1) displayModel = displayModel.slice(slashIdx + 1);\n\t}\n\treturn [displayModel, formatThinkingLabel(model, thinking)].filter(Boolean).join(\" · \");\n}\n\n/** Compact/header badge: selected tier name, or resolved model when selected by model / inherit. */\nexport function formatModelSelection(selection?: ModelSelection, resolvedModel?: string, thinking?: string): string {\n\tif (selection?.kind === \"tier\" && selection.tier) {\n\t\treturn [selection.tier, formatThinkingLabel(resolvedModel, thinking)].filter(Boolean).join(\" · \");\n\t}\n\treturn formatModelThinking(resolvedModel, thinking);\n}\n\n/**\n * Format usage statistics into a compact string\n */\nexport function formatUsage(u: Usage, model?: string): string {\n\tconst parts: string[] = [];\n\tif (u.turns) parts.push(`${u.turns} turn${u.turns > 1 ? \"s\" : \"\"}`);\n\tif (u.input) parts.push(`in:${formatTokens(u.input)}`);\n\tif (u.output) parts.push(`out:${formatTokens(u.output)}`);\n\tif (u.cacheRead) parts.push(`R${formatTokens(u.cacheRead)}`);\n\tif (u.cacheWrite) parts.push(`W${formatTokens(u.cacheWrite)}`);\n\tif (u.cost) parts.push(`$${u.cost.toFixed(4)}`);\n\tif (model) parts.push(model);\n\treturn parts.join(\" \");\n}\n\n/**\n * Format duration in human-readable form\n */\nexport function formatDuration(ms: number): string {\n\tif (ms < 1000) return `${ms}ms`;\n\tif (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n\treturn `${Math.floor(ms / 60000)}m${Math.floor((ms % 60000) / 1000)}s`;\n}\n\n/**\n * Build a summary string for a completed/failed chain\n */\nexport function buildChainSummary(\n\tsteps: ChainStep[],\n\tresults: SingleResult[],\n\tchainDir: string,\n\tstatus: \"completed\" | \"failed\",\n\tfailedStep?: { index: number; error: string },\n): string {\n\tconst stepNames = steps\n\t\t.map((step) => (isParallelStep(step) ? `parallel[${step.parallel.length}]` : isDynamicParallelStep(step) ? `expand:${step.parallel.agent}` : step.agent))\n\t\t.join(\" → \");\n\n\tconst totalDuration = results.reduce((sum, r) => sum + (r.progress?.durationMs || 0), 0);\n\tconst durationStr = formatDuration(totalDuration);\n\n\tconst progressPath = path.join(chainDir, \"progress.md\");\n\tconst hasProgress = fs.existsSync(progressPath);\n\tconst allSkills = new Set<string>();\n\tfor (const r of results) {\n\t\tif (r.skills) r.skills.forEach((s) => allSkills.add(s));\n\t}\n\tconst skillsLine = allSkills.size > 0 ? `🔧 Skills: ${[...allSkills].join(\", \")}` : \"\";\n\n\tif (status === \"completed\") {\n\t\tconst stepWord = results.length === 1 ? \"step\" : \"steps\";\n\t\treturn `✅ Chain completed: ${stepNames} (${results.length} ${stepWord}, ${durationStr})${skillsLine ? `\\n${skillsLine}` : \"\"}\n\n📋 Progress: ${hasProgress ? progressPath : \"(none)\"}\n📁 Artifacts: ${chainDir}`;\n\t} else {\n\t\tconst stepInfo = failedStep ? ` at step ${failedStep.index + 1}` : \"\";\n\t\tconst errorInfo = failedStep?.error ? `: ${failedStep.error}` : \"\";\n\t\treturn `❌ Chain failed${stepInfo}${errorInfo}${skillsLine ? `\\n${skillsLine}` : \"\"}\n\n📋 Progress: ${hasProgress ? progressPath : \"(none)\"}\n📁 Artifacts: ${chainDir}`;\n\t}\n}\n\n/**\n * Format a tool call for display\n */\nexport function formatToolCall(name: string, args: Record<string, unknown>, expanded = false): string {\n\tswitch (name) {\n\t\tcase \"bash\": {\n\t\t\tconst command = typeof args.command === \"string\" ? args.command : \"\";\n\t\t\tconst maxLength = expanded ? 240 : 60;\n\t\t\treturn `$ ${command.slice(0, maxLength)}${command.length > maxLength ? \"...\" : \"\"}`;\n\t\t}\n\t\tcase \"read\":\n\t\tcase \"write\":\n\t\tcase \"edit\": {\n\t\t\tconst target = typeof args.path === \"string\"\n\t\t\t\t? args.path\n\t\t\t\t: typeof args.file_path === \"string\"\n\t\t\t\t\t? args.file_path\n\t\t\t\t\t: \"\";\n\t\t\treturn `${name} ${shortenPath(target)}`;\n\t\t}\n\t\tdefault: {\n\t\t\tconst s = JSON.stringify(args);\n\t\t\tconst maxLength = expanded ? 160 : 40;\n\t\t\treturn `${name} ${s.slice(0, maxLength)}${s.length > maxLength ? \"...\" : \"\"}`;\n\t\t}\n\t}\n}\n\n/**\n * Shorten a path by replacing home directory with ~\n */\nexport function shortenPath(p: string): string {\n\tconst home = process.env.HOME;\n\tif (home && p.startsWith(home)) {\n\t\treturn `~${p.slice(home.length)}`;\n\t}\n\treturn p;\n}\n"]}
@@ -12,17 +12,28 @@ import { splitKnownThinkingSuffix, THINKING_LEVELS } from "./model-info.js";
12
12
  export function formatTokens(n) {
13
13
  return n < 1000 ? String(n) : n < 10000 ? `${(n / 1000).toFixed(1)}k` : `${Math.round(n / 1000)}k`;
14
14
  }
15
- export function formatModelThinking(model, thinking) {
15
+ function formatThinkingLabel(model, thinking) {
16
16
  const parsed = model ? splitKnownThinkingSuffix(model) : undefined;
17
- let displayModel = parsed?.baseModel ?? model;
18
17
  const explicitThinking = THINKING_LEVELS.find((level) => level === thinking?.trim());
19
18
  const displayThinking = parsed?.thinkingSuffix ? parsed.thinkingSuffix.slice(1) : explicitThinking;
19
+ return displayThinking ? `thinking ${displayThinking}` : undefined;
20
+ }
21
+ export function formatModelThinking(model, thinking) {
22
+ const parsed = model ? splitKnownThinkingSuffix(model) : undefined;
23
+ let displayModel = parsed?.baseModel ?? model;
20
24
  if (displayModel) {
21
25
  const slashIdx = displayModel.lastIndexOf("/");
22
26
  if (slashIdx !== -1)
23
27
  displayModel = displayModel.slice(slashIdx + 1);
24
28
  }
25
- return [displayModel, displayThinking ? `thinking ${displayThinking}` : undefined].filter(Boolean).join(" · ");
29
+ return [displayModel, formatThinkingLabel(model, thinking)].filter(Boolean).join(" · ");
30
+ }
31
+ /** Compact/header badge: selected tier name, or resolved model when selected by model / inherit. */
32
+ export function formatModelSelection(selection, resolvedModel, thinking) {
33
+ if (selection?.kind === "tier" && selection.tier) {
34
+ return [selection.tier, formatThinkingLabel(resolvedModel, thinking)].filter(Boolean).join(" · ");
35
+ }
36
+ return formatModelThinking(resolvedModel, thinking);
26
37
  }
27
38
  /**
28
39
  * Format usage statistics into a compact string
@@ -1 +1 @@
1
- {"version":3,"file":"formatters.js","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/shared/formatters.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\n/**\n * Formatting utilities for display output\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { Usage, SingleResult } from \"./types.ts\";\nimport type { ChainStep } from \"./settings.ts\";\nimport { isDynamicParallelStep, isParallelStep } from \"./settings.ts\";\nimport { splitKnownThinkingSuffix, THINKING_LEVELS } from \"./model-info.ts\";\n\n/**\n * Format token count with k suffix for large numbers\n */\nexport function formatTokens(n: number): string {\n\treturn n < 1000 ? String(n) : n < 10000 ? `${(n / 1000).toFixed(1)}k` : `${Math.round(n / 1000)}k`;\n}\n\nexport function formatModelThinking(model?: string, thinking?: string): string {\n\tconst parsed = model ? splitKnownThinkingSuffix(model) : undefined;\n\tlet displayModel = parsed?.baseModel ?? model;\n\tconst explicitThinking = THINKING_LEVELS.find((level) => level === thinking?.trim());\n\tconst displayThinking = parsed?.thinkingSuffix ? parsed.thinkingSuffix.slice(1) : explicitThinking;\n\tif (displayModel) {\n\t\tconst slashIdx = displayModel.lastIndexOf(\"/\");\n\t\tif (slashIdx !== -1) displayModel = displayModel.slice(slashIdx + 1);\n\t}\n\treturn [displayModel, displayThinking ? `thinking ${displayThinking}` : undefined].filter(Boolean).join(\" · \");\n}\n\n/**\n * Format usage statistics into a compact string\n */\nexport function formatUsage(u: Usage, model?: string): string {\n\tconst parts: string[] = [];\n\tif (u.turns) parts.push(`${u.turns} turn${u.turns > 1 ? \"s\" : \"\"}`);\n\tif (u.input) parts.push(`in:${formatTokens(u.input)}`);\n\tif (u.output) parts.push(`out:${formatTokens(u.output)}`);\n\tif (u.cacheRead) parts.push(`R${formatTokens(u.cacheRead)}`);\n\tif (u.cacheWrite) parts.push(`W${formatTokens(u.cacheWrite)}`);\n\tif (u.cost) parts.push(`$${u.cost.toFixed(4)}`);\n\tif (model) parts.push(model);\n\treturn parts.join(\" \");\n}\n\n/**\n * Format duration in human-readable form\n */\nexport function formatDuration(ms: number): string {\n\tif (ms < 1000) return `${ms}ms`;\n\tif (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n\treturn `${Math.floor(ms / 60000)}m${Math.floor((ms % 60000) / 1000)}s`;\n}\n\n/**\n * Build a summary string for a completed/failed chain\n */\nexport function buildChainSummary(\n\tsteps: ChainStep[],\n\tresults: SingleResult[],\n\tchainDir: string,\n\tstatus: \"completed\" | \"failed\",\n\tfailedStep?: { index: number; error: string },\n): string {\n\tconst stepNames = steps\n\t\t.map((step) => (isParallelStep(step) ? `parallel[${step.parallel.length}]` : isDynamicParallelStep(step) ? `expand:${step.parallel.agent}` : step.agent))\n\t\t.join(\" → \");\n\n\tconst totalDuration = results.reduce((sum, r) => sum + (r.progress?.durationMs || 0), 0);\n\tconst durationStr = formatDuration(totalDuration);\n\n\tconst progressPath = path.join(chainDir, \"progress.md\");\n\tconst hasProgress = fs.existsSync(progressPath);\n\tconst allSkills = new Set<string>();\n\tfor (const r of results) {\n\t\tif (r.skills) r.skills.forEach((s) => allSkills.add(s));\n\t}\n\tconst skillsLine = allSkills.size > 0 ? `🔧 Skills: ${[...allSkills].join(\", \")}` : \"\";\n\n\tif (status === \"completed\") {\n\t\tconst stepWord = results.length === 1 ? \"step\" : \"steps\";\n\t\treturn `✅ Chain completed: ${stepNames} (${results.length} ${stepWord}, ${durationStr})${skillsLine ? `\\n${skillsLine}` : \"\"}\n\n📋 Progress: ${hasProgress ? progressPath : \"(none)\"}\n📁 Artifacts: ${chainDir}`;\n\t} else {\n\t\tconst stepInfo = failedStep ? ` at step ${failedStep.index + 1}` : \"\";\n\t\tconst errorInfo = failedStep?.error ? `: ${failedStep.error}` : \"\";\n\t\treturn `❌ Chain failed${stepInfo}${errorInfo}${skillsLine ? `\\n${skillsLine}` : \"\"}\n\n📋 Progress: ${hasProgress ? progressPath : \"(none)\"}\n📁 Artifacts: ${chainDir}`;\n\t}\n}\n\n/**\n * Format a tool call for display\n */\nexport function formatToolCall(name: string, args: Record<string, unknown>, expanded = false): string {\n\tswitch (name) {\n\t\tcase \"bash\": {\n\t\t\tconst command = typeof args.command === \"string\" ? args.command : \"\";\n\t\t\tconst maxLength = expanded ? 240 : 60;\n\t\t\treturn `$ ${command.slice(0, maxLength)}${command.length > maxLength ? \"...\" : \"\"}`;\n\t\t}\n\t\tcase \"read\":\n\t\tcase \"write\":\n\t\tcase \"edit\": {\n\t\t\tconst target = typeof args.path === \"string\"\n\t\t\t\t? args.path\n\t\t\t\t: typeof args.file_path === \"string\"\n\t\t\t\t\t? args.file_path\n\t\t\t\t\t: \"\";\n\t\t\treturn `${name} ${shortenPath(target)}`;\n\t\t}\n\t\tdefault: {\n\t\t\tconst s = JSON.stringify(args);\n\t\t\tconst maxLength = expanded ? 160 : 40;\n\t\t\treturn `${name} ${s.slice(0, maxLength)}${s.length > maxLength ? \"...\" : \"\"}`;\n\t\t}\n\t}\n}\n\n/**\n * Shorten a path by replacing home directory with ~\n */\nexport function shortenPath(p: string): string {\n\tconst home = process.env.HOME;\n\tif (home && p.startsWith(home)) {\n\t\treturn `~${p.slice(home.length)}`;\n\t}\n\treturn p;\n}\n"]}
1
+ {"version":3,"file":"formatters.js","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/shared/formatters.ts"],"names":[],"mappings":"AAAA,cAAc;AACd;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAGlC,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACtE,OAAO,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAE5E;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,CAAS,EAAU;IAC/C,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC;AAAA,CACnG;AAED,SAAS,mBAAmB,CAAC,KAAc,EAAE,QAAiB,EAAsB;IACnF,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACnE,MAAM,gBAAgB,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACrF,MAAM,eAAe,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC;IACnG,OAAO,eAAe,CAAC,CAAC,CAAC,YAAY,eAAe,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAAA,CACnE;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAc,EAAE,QAAiB,EAAU;IAC9E,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACnE,IAAI,YAAY,GAAG,MAAM,EAAE,SAAS,IAAI,KAAK,CAAC;IAC9C,IAAI,YAAY,EAAE,CAAC;QAClB,MAAM,QAAQ,GAAG,YAAY,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC/C,IAAI,QAAQ,KAAK,CAAC,CAAC;YAAE,YAAY,GAAG,YAAY,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,CAAC,YAAY,EAAE,mBAAmB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAK,CAAC,CAAC;AAAA,CACxF;AAED,oGAAoG;AACpG,MAAM,UAAU,oBAAoB,CAAC,SAA0B,EAAE,aAAsB,EAAE,QAAiB,EAAU;IACnH,IAAI,SAAS,EAAE,IAAI,KAAK,MAAM,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC;QAClD,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,mBAAmB,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAK,CAAC,CAAC;IACnG,CAAC;IACD,OAAO,mBAAmB,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;AAAA,CACpD;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,CAAQ,EAAE,KAAc,EAAU;IAC7D,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,CAAC,CAAC,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACpE,IAAI,CAAC,CAAC,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,MAAM,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACvD,IAAI,CAAC,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,OAAO,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC1D,IAAI,CAAC,CAAC,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAC7D,IAAI,CAAC,CAAC,UAAU;QAAE,KAAK,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IAC/D,IAAI,CAAC,CAAC,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAChD,IAAI,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7B,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAAA,CACvB;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,EAAU,EAAU;IAClD,IAAI,EAAE,GAAG,IAAI;QAAE,OAAO,GAAG,EAAE,IAAI,CAAC;IAChC,IAAI,EAAE,GAAG,KAAK;QAAE,OAAO,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IACpD,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC;AAAA,CACvE;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAChC,KAAkB,EAClB,OAAuB,EACvB,QAAgB,EAChB,MAA8B,EAC9B,UAA6C,EACpC;IACT,MAAM,SAAS,GAAG,KAAK;SACrB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACxJ,IAAI,CAAC,OAAK,CAAC,CAAC;IAEd,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,UAAU,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACzF,MAAM,WAAW,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;IAElD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IACxD,MAAM,WAAW,GAAG,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IAChD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACzB,IAAI,CAAC,CAAC,MAAM;YAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,CAAC;IACD,MAAM,UAAU,GAAG,SAAS,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,gBAAa,CAAC,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAEtF,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;QACzD,OAAO,wBAAsB,SAAS,KAAK,OAAO,CAAC,MAAM,IAAI,QAAQ,KAAK,WAAW,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE;;iBAEhH,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ;kBACpC,QAAQ,EAAE,CAAC;IACzB,CAAC;SAAM,CAAC;QACP,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,YAAY,UAAU,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtE,MAAM,SAAS,GAAG,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnE,OAAO,mBAAiB,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE;;iBAEtE,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ;kBACpC,QAAQ,EAAE,CAAC;IACzB,CAAC;AAAA,CACD;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,IAA6B,EAAE,QAAQ,GAAG,KAAK,EAAU;IACrG,QAAQ,IAAI,EAAE,CAAC;QACd,KAAK,MAAM,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YACrE,MAAM,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACtC,OAAO,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACrF,CAAC;QACD,KAAK,MAAM,CAAC;QACZ,KAAK,OAAO,CAAC;QACb,KAAK,MAAM,EAAE,CAAC;YACb,MAAM,MAAM,GAAG,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ;gBAC3C,CAAC,CAAC,IAAI,CAAC,IAAI;gBACX,CAAC,CAAC,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ;oBACnC,CAAC,CAAC,IAAI,CAAC,SAAS;oBAChB,CAAC,CAAC,EAAE,CAAC;YACP,OAAO,GAAG,IAAI,IAAI,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;QACzC,CAAC;QACD,SAAS,CAAC;YACT,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC/B,MAAM,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACtC,OAAO,GAAG,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAC/E,CAAC;IACF,CAAC;AAAA,CACD;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,CAAS,EAAU;IAC9C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IAC9B,IAAI,IAAI,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;IACnC,CAAC;IACD,OAAO,CAAC,CAAC;AAAA,CACT","sourcesContent":["// @ts-nocheck\n/**\n * Formatting utilities for display output\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { ModelSelection, Usage, SingleResult } from \"./types.ts\";\nimport type { ChainStep } from \"./settings.ts\";\nimport { isDynamicParallelStep, isParallelStep } from \"./settings.ts\";\nimport { splitKnownThinkingSuffix, THINKING_LEVELS } from \"./model-info.ts\";\n\n/**\n * Format token count with k suffix for large numbers\n */\nexport function formatTokens(n: number): string {\n\treturn n < 1000 ? String(n) : n < 10000 ? `${(n / 1000).toFixed(1)}k` : `${Math.round(n / 1000)}k`;\n}\n\nfunction formatThinkingLabel(model?: string, thinking?: string): string | undefined {\n\tconst parsed = model ? splitKnownThinkingSuffix(model) : undefined;\n\tconst explicitThinking = THINKING_LEVELS.find((level) => level === thinking?.trim());\n\tconst displayThinking = parsed?.thinkingSuffix ? parsed.thinkingSuffix.slice(1) : explicitThinking;\n\treturn displayThinking ? `thinking ${displayThinking}` : undefined;\n}\n\nexport function formatModelThinking(model?: string, thinking?: string): string {\n\tconst parsed = model ? splitKnownThinkingSuffix(model) : undefined;\n\tlet displayModel = parsed?.baseModel ?? model;\n\tif (displayModel) {\n\t\tconst slashIdx = displayModel.lastIndexOf(\"/\");\n\t\tif (slashIdx !== -1) displayModel = displayModel.slice(slashIdx + 1);\n\t}\n\treturn [displayModel, formatThinkingLabel(model, thinking)].filter(Boolean).join(\" · \");\n}\n\n/** Compact/header badge: selected tier name, or resolved model when selected by model / inherit. */\nexport function formatModelSelection(selection?: ModelSelection, resolvedModel?: string, thinking?: string): string {\n\tif (selection?.kind === \"tier\" && selection.tier) {\n\t\treturn [selection.tier, formatThinkingLabel(resolvedModel, thinking)].filter(Boolean).join(\" · \");\n\t}\n\treturn formatModelThinking(resolvedModel, thinking);\n}\n\n/**\n * Format usage statistics into a compact string\n */\nexport function formatUsage(u: Usage, model?: string): string {\n\tconst parts: string[] = [];\n\tif (u.turns) parts.push(`${u.turns} turn${u.turns > 1 ? \"s\" : \"\"}`);\n\tif (u.input) parts.push(`in:${formatTokens(u.input)}`);\n\tif (u.output) parts.push(`out:${formatTokens(u.output)}`);\n\tif (u.cacheRead) parts.push(`R${formatTokens(u.cacheRead)}`);\n\tif (u.cacheWrite) parts.push(`W${formatTokens(u.cacheWrite)}`);\n\tif (u.cost) parts.push(`$${u.cost.toFixed(4)}`);\n\tif (model) parts.push(model);\n\treturn parts.join(\" \");\n}\n\n/**\n * Format duration in human-readable form\n */\nexport function formatDuration(ms: number): string {\n\tif (ms < 1000) return `${ms}ms`;\n\tif (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n\treturn `${Math.floor(ms / 60000)}m${Math.floor((ms % 60000) / 1000)}s`;\n}\n\n/**\n * Build a summary string for a completed/failed chain\n */\nexport function buildChainSummary(\n\tsteps: ChainStep[],\n\tresults: SingleResult[],\n\tchainDir: string,\n\tstatus: \"completed\" | \"failed\",\n\tfailedStep?: { index: number; error: string },\n): string {\n\tconst stepNames = steps\n\t\t.map((step) => (isParallelStep(step) ? `parallel[${step.parallel.length}]` : isDynamicParallelStep(step) ? `expand:${step.parallel.agent}` : step.agent))\n\t\t.join(\" → \");\n\n\tconst totalDuration = results.reduce((sum, r) => sum + (r.progress?.durationMs || 0), 0);\n\tconst durationStr = formatDuration(totalDuration);\n\n\tconst progressPath = path.join(chainDir, \"progress.md\");\n\tconst hasProgress = fs.existsSync(progressPath);\n\tconst allSkills = new Set<string>();\n\tfor (const r of results) {\n\t\tif (r.skills) r.skills.forEach((s) => allSkills.add(s));\n\t}\n\tconst skillsLine = allSkills.size > 0 ? `🔧 Skills: ${[...allSkills].join(\", \")}` : \"\";\n\n\tif (status === \"completed\") {\n\t\tconst stepWord = results.length === 1 ? \"step\" : \"steps\";\n\t\treturn `✅ Chain completed: ${stepNames} (${results.length} ${stepWord}, ${durationStr})${skillsLine ? `\\n${skillsLine}` : \"\"}\n\n📋 Progress: ${hasProgress ? progressPath : \"(none)\"}\n📁 Artifacts: ${chainDir}`;\n\t} else {\n\t\tconst stepInfo = failedStep ? ` at step ${failedStep.index + 1}` : \"\";\n\t\tconst errorInfo = failedStep?.error ? `: ${failedStep.error}` : \"\";\n\t\treturn `❌ Chain failed${stepInfo}${errorInfo}${skillsLine ? `\\n${skillsLine}` : \"\"}\n\n📋 Progress: ${hasProgress ? progressPath : \"(none)\"}\n📁 Artifacts: ${chainDir}`;\n\t}\n}\n\n/**\n * Format a tool call for display\n */\nexport function formatToolCall(name: string, args: Record<string, unknown>, expanded = false): string {\n\tswitch (name) {\n\t\tcase \"bash\": {\n\t\t\tconst command = typeof args.command === \"string\" ? args.command : \"\";\n\t\t\tconst maxLength = expanded ? 240 : 60;\n\t\t\treturn `$ ${command.slice(0, maxLength)}${command.length > maxLength ? \"...\" : \"\"}`;\n\t\t}\n\t\tcase \"read\":\n\t\tcase \"write\":\n\t\tcase \"edit\": {\n\t\t\tconst target = typeof args.path === \"string\"\n\t\t\t\t? args.path\n\t\t\t\t: typeof args.file_path === \"string\"\n\t\t\t\t\t? args.file_path\n\t\t\t\t\t: \"\";\n\t\t\treturn `${name} ${shortenPath(target)}`;\n\t\t}\n\t\tdefault: {\n\t\t\tconst s = JSON.stringify(args);\n\t\t\tconst maxLength = expanded ? 160 : 40;\n\t\t\treturn `${name} ${s.slice(0, maxLength)}${s.length > maxLength ? \"...\" : \"\"}`;\n\t\t}\n\t}\n}\n\n/**\n * Shorten a path by replacing home directory with ~\n */\nexport function shortenPath(p: string): string {\n\tconst home = process.env.HOME;\n\tif (home && p.startsWith(home)) {\n\t\treturn `~${p.slice(home.length)}`;\n\t}\n\treturn p;\n}\n"]}
@@ -12,6 +12,15 @@ export interface MaxOutputConfig {
12
12
  export type OutputMode = "inline" | "file-only";
13
13
  export type ChildPermission = "full" | "read-only";
14
14
  export type ChildTier = "light" | "standard" | "heavy";
15
+ /** How the child model was chosen. Captured from requested params before resolution. */
16
+ export type ModelSelection = {
17
+ kind: "model";
18
+ } | {
19
+ kind: "tier";
20
+ tier: ChildTier;
21
+ } | {
22
+ kind: "inherit";
23
+ };
15
24
  export interface ChildSpec {
16
25
  childId: string;
17
26
  task: string;
@@ -20,6 +29,7 @@ export interface ChildSpec {
20
29
  effectivePermissions: ChildPermission;
21
30
  model?: string;
22
31
  tier?: ChildTier;
32
+ modelSelection?: ModelSelection;
23
33
  skill?: string | string[] | false;
24
34
  cwd?: string;
25
35
  output?: string | false;
@@ -305,6 +315,7 @@ export interface SteeringRecoveryDescriptor {
305
315
  cwd: string;
306
316
  model?: string;
307
317
  thinking?: string;
318
+ modelSelection?: ModelSelection;
308
319
  skills?: string[];
309
320
  outputPath?: string;
310
321
  outputMode: "inline" | "file-only";
@@ -385,6 +396,7 @@ export interface AgentProgress {
385
396
  currentPath?: string;
386
397
  model?: string;
387
398
  thinking?: string;
399
+ modelSelection?: ModelSelection;
388
400
  thinkingText?: string;
389
401
  recentTools: Array<{
390
402
  tool: string;
@@ -558,6 +570,7 @@ export interface SingleResult {
558
570
  usage: Usage;
559
571
  model?: string;
560
572
  thinking?: string;
573
+ modelSelection?: ModelSelection;
561
574
  attemptedModels?: string[];
562
575
  modelAttempts?: ModelAttempt[];
563
576
  controlEvents?: ControlEvent[];
@@ -835,6 +848,7 @@ export interface AsyncStatus {
835
848
  skills?: string[];
836
849
  model?: string;
837
850
  thinking?: string;
851
+ modelSelection?: ModelSelection;
838
852
  attemptedModels?: string[];
839
853
  modelAttempts?: ModelAttempt[];
840
854
  totalCost?: CostSummary;