@evalops/maestro 0.10.46 → 0.10.48

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 (152) hide show
  1. package/README.md +4 -0
  2. package/dist/agent/providers/openai-codex-session.js +1 -1
  3. package/dist/agent/providers/openai-codex-session.js.map +1 -1
  4. package/dist/app-server/in-process-client.d.ts +2 -2
  5. package/dist/app-server/in-process-client.js.map +1 -1
  6. package/dist/app-server/protocol-modes-api.js +1 -1
  7. package/dist/app-server/protocol-modes-api.js.map +1 -1
  8. package/dist/app-server/sandbox-check-api.d.ts +21 -0
  9. package/dist/app-server/{sandbox-proof-api.d.ts.map → sandbox-check-api.d.ts.map} +1 -1
  10. package/dist/app-server/{sandbox-proof-api.js → sandbox-check-api.js} +18 -18
  11. package/dist/app-server/{sandbox-proof-api.js.map → sandbox-check-api.js.map} +1 -1
  12. package/dist/app-server/session-api.d.ts +5 -5
  13. package/dist/app-server/session-api.js +18 -18
  14. package/dist/app-server/session-api.js.map +1 -1
  15. package/dist/audit/logger.d.ts +1 -1
  16. package/dist/cli/args.d.ts.map +1 -1
  17. package/dist/cli/args.js +3 -1
  18. package/dist/cli/args.js.map +1 -1
  19. package/dist/cli/commands/codex.js +30 -3
  20. package/dist/cli/commands/codex.js.map +1 -1
  21. package/dist/cli/commands/update.d.ts +12 -0
  22. package/dist/cli/commands/update.d.ts.map +1 -0
  23. package/dist/cli/commands/update.js +148 -0
  24. package/dist/cli/commands/update.js.map +1 -0
  25. package/dist/cli/help.d.ts.map +1 -1
  26. package/dist/cli/help.js +4 -0
  27. package/dist/cli/help.js.map +1 -1
  28. package/dist/cli-tui/auth-state.d.ts +7 -0
  29. package/dist/cli-tui/auth-state.d.ts.map +1 -0
  30. package/dist/cli-tui/auth-state.js +46 -0
  31. package/dist/cli-tui/auth-state.js.map +1 -0
  32. package/dist/cli-tui/commands/command-catalog.d.ts.map +1 -1
  33. package/dist/cli-tui/commands/command-catalog.js +8 -3
  34. package/dist/cli-tui/commands/command-catalog.js.map +1 -1
  35. package/dist/cli-tui/commands/command-suite-handlers.d.ts +2 -5
  36. package/dist/cli-tui/commands/command-suite-handlers.d.ts.map +1 -1
  37. package/dist/cli-tui/commands/command-suite-handlers.js.map +1 -1
  38. package/dist/cli-tui/commands/subcommands/auth-commands.d.ts +6 -5
  39. package/dist/cli-tui/commands/subcommands/auth-commands.d.ts.map +1 -1
  40. package/dist/cli-tui/commands/subcommands/auth-commands.js +2 -2
  41. package/dist/cli-tui/commands/subcommands/auth-commands.js.map +1 -1
  42. package/dist/cli-tui/commands/subcommands/ui-commands.d.ts +1 -1
  43. package/dist/cli-tui/commands/subcommands/ui-commands.js +2 -2
  44. package/dist/cli-tui/commands/subcommands/ui-commands.js.map +1 -1
  45. package/dist/cli-tui/footer.d.ts.map +1 -1
  46. package/dist/cli-tui/footer.js +1 -1
  47. package/dist/cli-tui/footer.js.map +1 -1
  48. package/dist/cli-tui/oauth/oauth-flow-controller.d.ts.map +1 -1
  49. package/dist/cli-tui/oauth/oauth-flow-controller.js +24 -11
  50. package/dist/cli-tui/oauth/oauth-flow-controller.js.map +1 -1
  51. package/dist/cli-tui/selectors/oauth-selector-view.d.ts +1 -0
  52. package/dist/cli-tui/selectors/oauth-selector-view.d.ts.map +1 -1
  53. package/dist/cli-tui/selectors/oauth-selector-view.js +1 -1
  54. package/dist/cli-tui/selectors/oauth-selector-view.js.map +1 -1
  55. package/dist/cli-tui/selectors/oauth-selector.d.ts +2 -1
  56. package/dist/cli-tui/selectors/oauth-selector.d.ts.map +1 -1
  57. package/dist/cli-tui/selectors/oauth-selector.js +25 -2
  58. package/dist/cli-tui/selectors/oauth-selector.js.map +1 -1
  59. package/dist/cli-tui/tui-renderer/command-suite-wiring.d.ts +2 -5
  60. package/dist/cli-tui/tui-renderer/command-suite-wiring.d.ts.map +1 -1
  61. package/dist/cli-tui/tui-renderer/command-suite-wiring.js.map +1 -1
  62. package/dist/cli-tui/tui-renderer/ui-state-controller.d.ts +1 -1
  63. package/dist/cli-tui/tui-renderer/ui-state-controller.d.ts.map +1 -1
  64. package/dist/cli-tui/tui-renderer/ui-state-controller.js +5 -11
  65. package/dist/cli-tui/tui-renderer/ui-state-controller.js.map +1 -1
  66. package/dist/cli-tui/tui-renderer.d.ts +0 -4
  67. package/dist/cli-tui/tui-renderer.d.ts.map +1 -1
  68. package/dist/cli-tui/tui-renderer.js +4 -29
  69. package/dist/cli-tui/tui-renderer.js.map +1 -1
  70. package/dist/cli-tui/ui-state.js +1 -1
  71. package/dist/cli-tui/ui-state.js.map +1 -1
  72. package/dist/cli-tui/utils/footer-utils.d.ts +1 -1
  73. package/dist/cli-tui/utils/footer-utils.d.ts.map +1 -1
  74. package/dist/cli-tui/utils/footer-utils.js.map +1 -1
  75. package/dist/cli.js +4800 -3779
  76. package/dist/cli.js.map +1 -1
  77. package/dist/codex/app-server-client.d.ts +16 -2
  78. package/dist/codex/app-server-client.d.ts.map +1 -1
  79. package/dist/codex/app-server-client.js +67 -7
  80. package/dist/codex/app-server-client.js.map +1 -1
  81. package/dist/codex/auth.d.ts +4 -0
  82. package/dist/codex/auth.d.ts.map +1 -0
  83. package/dist/codex/auth.js +103 -0
  84. package/dist/codex/auth.js.map +1 -0
  85. package/dist/db/schema.d.ts +1 -1
  86. package/dist/evalops/agent-bootstrap.js +2 -2
  87. package/dist/evalops/agent-bootstrap.js.map +1 -1
  88. package/dist/main.d.ts.map +1 -1
  89. package/dist/main.js +10 -1
  90. package/dist/main.js.map +1 -1
  91. package/dist/models/config-loader.d.ts +12 -12
  92. package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.d.ts +19 -19
  93. package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.d.ts.map +1 -1
  94. package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.js +12 -13
  95. package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.js.map +1 -1
  96. package/dist/node_modules/@evalops/contracts/dist/scenario.d.ts +2 -0
  97. package/dist/node_modules/@evalops/contracts/dist/scenario.d.ts.map +1 -1
  98. package/dist/node_modules/@evalops/contracts/dist/scenario.js.map +1 -1
  99. package/dist/node_modules/@evalops/contracts/package.json +1 -1
  100. package/dist/node_modules/@evalops/tui/package.json +1 -1
  101. package/dist/oauth/index.d.ts +1 -0
  102. package/dist/oauth/index.d.ts.map +1 -1
  103. package/dist/oauth/index.js +42 -2
  104. package/dist/oauth/index.js.map +1 -1
  105. package/dist/platform/operating-plane-client.d.ts +3 -3
  106. package/dist/platform/operating-plane-client.d.ts.map +1 -1
  107. package/dist/platform/operating-plane-client.js.map +1 -1
  108. package/dist/platform/operating-plane-summary.js +3 -6
  109. package/dist/platform/operating-plane-summary.js.map +1 -1
  110. package/dist/server/agent-trajectory-scenarios.d.ts.map +1 -1
  111. package/dist/server/agent-trajectory-scenarios.js +29 -6
  112. package/dist/server/agent-trajectory-scenarios.js.map +1 -1
  113. package/dist/server/app-context.d.ts +2 -0
  114. package/dist/server/app-context.d.ts.map +1 -1
  115. package/dist/server/app-context.js.map +1 -1
  116. package/dist/server/handlers/headless-sessions.d.ts.map +1 -1
  117. package/dist/server/handlers/headless-sessions.js +44 -10
  118. package/dist/server/handlers/headless-sessions.js.map +1 -1
  119. package/dist/server/handlers/hosted-runner-identity.d.ts +2 -0
  120. package/dist/server/handlers/hosted-runner-identity.d.ts.map +1 -1
  121. package/dist/server/handlers/hosted-runner-identity.js +2 -0
  122. package/dist/server/handlers/hosted-runner-identity.js.map +1 -1
  123. package/dist/server/handlers/platform-a2a-push.d.ts.map +1 -1
  124. package/dist/server/handlers/platform-a2a-push.js +113 -2
  125. package/dist/server/handlers/platform-a2a-push.js.map +1 -1
  126. package/dist/server/handlers/ui.d.ts.map +1 -1
  127. package/dist/server/handlers/ui.js +5 -5
  128. package/dist/server/handlers/ui.js.map +1 -1
  129. package/dist/server/headless-in-process-host.d.ts.map +1 -1
  130. package/dist/server/headless-in-process-host.js +1 -1
  131. package/dist/server/headless-in-process-host.js.map +1 -1
  132. package/dist/server/headless-runtime-service.d.ts +9 -2
  133. package/dist/server/headless-runtime-service.d.ts.map +1 -1
  134. package/dist/server/headless-runtime-service.js +54 -15
  135. package/dist/server/headless-runtime-service.js.map +1 -1
  136. package/dist/server/stores/ui-store.d.ts.map +1 -1
  137. package/dist/server/stores/ui-store.js +8 -1
  138. package/dist/server/stores/ui-store.js.map +1 -1
  139. package/dist/tools/background/task-runtime.js +1 -1
  140. package/dist/tools/background/task-runtime.js.map +1 -1
  141. package/dist/tools/background/task-types.d.ts +1 -1
  142. package/dist/update/check.d.ts +2 -0
  143. package/dist/update/check.d.ts.map +1 -1
  144. package/dist/update/check.js +100 -41
  145. package/dist/update/check.js.map +1 -1
  146. package/dist/update/startup-refresh.d.ts +56 -0
  147. package/dist/update/startup-refresh.d.ts.map +1 -0
  148. package/dist/update/startup-refresh.js +321 -0
  149. package/dist/update/startup-refresh.js.map +1 -0
  150. package/dist/version.json +2 -2
  151. package/package.json +297 -296
  152. package/dist/app-server/sandbox-proof-api.d.ts +0 -21
@@ -28,7 +28,7 @@ export function loadUiState() {
28
28
  compactTools: typeof parsed.compactTools === "boolean"
29
29
  ? parsed.compactTools
30
30
  : undefined,
31
- footerMode: parsed.footerMode === "ensemble" || parsed.footerMode === "solo"
31
+ footerMode: parsed.footerMode === "rich" || parsed.footerMode === "solo"
32
32
  ? parsed.footerMode
33
33
  : undefined,
34
34
  cleanMode: parsed.cleanMode === "soft" ||
@@ -1 +1 @@
1
- {"version":3,"file":"ui-state.js","sourceRoot":"","sources":["../../src/cli-tui/ui-state.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { PATHS } from \"../config/constants.js\";\nimport type { CleanMode } from \"../conversation/render-model.js\";\nimport { resolveEnvPath } from \"../utils/path-expansion.js\";\nimport type { FooterMode } from \"./utils/footer-utils.js\";\n\nexport type QueueMode = \"one\" | \"all\";\n\nexport interface UiState {\n\tqueueMode?: QueueMode;\n\tsteeringMode?: QueueMode;\n\tfollowUpMode?: QueueMode;\n\tcompactTools?: boolean;\n\tfooterMode?: FooterMode;\n\tzenMode?: boolean;\n\tcleanMode?: CleanMode;\n\treducedMotion?: boolean;\n\thideThinkingBlocks?: boolean;\n\trecentCommands?: string[];\n\tfavoriteCommands?: string[];\n}\n\nconst getUiStatePath = () =>\n\tresolveEnvPath(process.env.MAESTRO_UI_STATE) ?? PATHS.UI_STATE_FILE;\n\nconst getCommandPrefsPath = () =>\n\tresolveEnvPath(process.env.MAESTRO_COMMAND_PREFS) ?? PATHS.COMMAND_PREFS_FILE;\n\nexport function loadUiState(): UiState {\n\tconst uiStatePath = getUiStatePath();\n\tif (!existsSync(uiStatePath)) {\n\t\treturn {};\n\t}\n\ttry {\n\t\tconst raw = readFileSync(uiStatePath, \"utf-8\");\n\t\tconst parsed = JSON.parse(raw) as UiState;\n\t\tconst legacyQueueMode =\n\t\t\tparsed.queueMode === \"one\" || parsed.queueMode === \"all\"\n\t\t\t\t? parsed.queueMode\n\t\t\t\t: undefined;\n\t\tconst steeringMode =\n\t\t\tparsed.steeringMode === \"one\" || parsed.steeringMode === \"all\"\n\t\t\t\t? parsed.steeringMode\n\t\t\t\t: legacyQueueMode;\n\t\tconst followUpMode =\n\t\t\tparsed.followUpMode === \"one\" || parsed.followUpMode === \"all\"\n\t\t\t\t? parsed.followUpMode\n\t\t\t\t: legacyQueueMode;\n\t\treturn {\n\t\t\tqueueMode: legacyQueueMode,\n\t\t\tsteeringMode,\n\t\t\tfollowUpMode,\n\t\t\tcompactTools:\n\t\t\t\ttypeof parsed.compactTools === \"boolean\"\n\t\t\t\t\t? parsed.compactTools\n\t\t\t\t\t: undefined,\n\t\t\tfooterMode:\n\t\t\t\tparsed.footerMode === \"ensemble\" || parsed.footerMode === \"solo\"\n\t\t\t\t\t? parsed.footerMode\n\t\t\t\t\t: undefined,\n\t\t\tcleanMode:\n\t\t\t\tparsed.cleanMode === \"soft\" ||\n\t\t\t\tparsed.cleanMode === \"aggressive\" ||\n\t\t\t\tparsed.cleanMode === \"off\"\n\t\t\t\t\t? parsed.cleanMode\n\t\t\t\t\t: undefined,\n\t\t\tzenMode: typeof parsed.zenMode === \"boolean\" ? parsed.zenMode : undefined,\n\t\t\treducedMotion:\n\t\t\t\ttypeof parsed.reducedMotion === \"boolean\"\n\t\t\t\t\t? parsed.reducedMotion\n\t\t\t\t\t: undefined,\n\t\t\thideThinkingBlocks:\n\t\t\t\ttypeof parsed.hideThinkingBlocks === \"boolean\"\n\t\t\t\t\t? parsed.hideThinkingBlocks\n\t\t\t\t\t: undefined,\n\t\t\trecentCommands: Array.isArray(parsed.recentCommands)\n\t\t\t\t? (parsed.recentCommands as string[]).filter(\n\t\t\t\t\t\t(item) => typeof item === \"string\" && item.trim().length > 0,\n\t\t\t\t\t)\n\t\t\t\t: undefined,\n\t\t\tfavoriteCommands: Array.isArray(parsed.favoriteCommands)\n\t\t\t\t? (parsed.favoriteCommands as string[]).filter(\n\t\t\t\t\t\t(item) => typeof item === \"string\" && item.trim().length > 0,\n\t\t\t\t\t)\n\t\t\t\t: undefined,\n\t\t};\n\t} catch {\n\t\treturn {};\n\t}\n}\n\nexport function saveUiState(partial: UiState): void {\n\tconst current = loadUiState();\n\tconst next: UiState = { ...current, ...partial };\n\tconst uiStatePath = getUiStatePath();\n\tmkdirSync(dirname(uiStatePath), { recursive: true });\n\twriteFileSync(uiStatePath, JSON.stringify(next, null, 2), \"utf-8\");\n}\n\nexport function loadCommandPrefs(): {\n\tfavorites: string[];\n\trecents: string[];\n} {\n\tconst prefsPath = getCommandPrefsPath();\n\tif (!existsSync(prefsPath)) {\n\t\treturn { favorites: [], recents: [] };\n\t}\n\ttry {\n\t\tconst raw = readFileSync(prefsPath, \"utf-8\");\n\t\tconst parsed = JSON.parse(raw) as Record<string, unknown>;\n\t\tconst favorites = Array.isArray(parsed.favorites)\n\t\t\t? (parsed.favorites as unknown[]).filter(\n\t\t\t\t\t(item): item is string => typeof item === \"string\",\n\t\t\t\t)\n\t\t\t: [];\n\t\tconst recents = Array.isArray(parsed.recents)\n\t\t\t? (parsed.recents as unknown[]).filter(\n\t\t\t\t\t(item): item is string => typeof item === \"string\",\n\t\t\t\t)\n\t\t\t: [];\n\t\treturn { favorites, recents };\n\t} catch {\n\t\treturn { favorites: [], recents: [] };\n\t}\n}\n\nexport function saveCommandPrefs(prefs: {\n\tfavorites: string[];\n\trecents: string[];\n}): void {\n\tconst prefsPath = getCommandPrefsPath();\n\tmkdirSync(dirname(prefsPath), { recursive: true });\n\twriteFileSync(prefsPath, JSON.stringify(prefs, null, 2), \"utf-8\");\n}\n"]}
1
+ {"version":3,"file":"ui-state.js","sourceRoot":"","sources":["../../src/cli-tui/ui-state.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { PATHS } from \"../config/constants.js\";\nimport type { CleanMode } from \"../conversation/render-model.js\";\nimport { resolveEnvPath } from \"../utils/path-expansion.js\";\nimport type { FooterMode } from \"./utils/footer-utils.js\";\n\nexport type QueueMode = \"one\" | \"all\";\n\nexport interface UiState {\n\tqueueMode?: QueueMode;\n\tsteeringMode?: QueueMode;\n\tfollowUpMode?: QueueMode;\n\tcompactTools?: boolean;\n\tfooterMode?: FooterMode;\n\tzenMode?: boolean;\n\tcleanMode?: CleanMode;\n\treducedMotion?: boolean;\n\thideThinkingBlocks?: boolean;\n\trecentCommands?: string[];\n\tfavoriteCommands?: string[];\n}\n\nconst getUiStatePath = () =>\n\tresolveEnvPath(process.env.MAESTRO_UI_STATE) ?? PATHS.UI_STATE_FILE;\n\nconst getCommandPrefsPath = () =>\n\tresolveEnvPath(process.env.MAESTRO_COMMAND_PREFS) ?? PATHS.COMMAND_PREFS_FILE;\n\nexport function loadUiState(): UiState {\n\tconst uiStatePath = getUiStatePath();\n\tif (!existsSync(uiStatePath)) {\n\t\treturn {};\n\t}\n\ttry {\n\t\tconst raw = readFileSync(uiStatePath, \"utf-8\");\n\t\tconst parsed = JSON.parse(raw) as UiState;\n\t\tconst legacyQueueMode =\n\t\t\tparsed.queueMode === \"one\" || parsed.queueMode === \"all\"\n\t\t\t\t? parsed.queueMode\n\t\t\t\t: undefined;\n\t\tconst steeringMode =\n\t\t\tparsed.steeringMode === \"one\" || parsed.steeringMode === \"all\"\n\t\t\t\t? parsed.steeringMode\n\t\t\t\t: legacyQueueMode;\n\t\tconst followUpMode =\n\t\t\tparsed.followUpMode === \"one\" || parsed.followUpMode === \"all\"\n\t\t\t\t? parsed.followUpMode\n\t\t\t\t: legacyQueueMode;\n\t\treturn {\n\t\t\tqueueMode: legacyQueueMode,\n\t\t\tsteeringMode,\n\t\t\tfollowUpMode,\n\t\t\tcompactTools:\n\t\t\t\ttypeof parsed.compactTools === \"boolean\"\n\t\t\t\t\t? parsed.compactTools\n\t\t\t\t\t: undefined,\n\t\t\tfooterMode:\n\t\t\t\tparsed.footerMode === \"rich\" || parsed.footerMode === \"solo\"\n\t\t\t\t\t? parsed.footerMode\n\t\t\t\t\t: undefined,\n\t\t\tcleanMode:\n\t\t\t\tparsed.cleanMode === \"soft\" ||\n\t\t\t\tparsed.cleanMode === \"aggressive\" ||\n\t\t\t\tparsed.cleanMode === \"off\"\n\t\t\t\t\t? parsed.cleanMode\n\t\t\t\t\t: undefined,\n\t\t\tzenMode: typeof parsed.zenMode === \"boolean\" ? parsed.zenMode : undefined,\n\t\t\treducedMotion:\n\t\t\t\ttypeof parsed.reducedMotion === \"boolean\"\n\t\t\t\t\t? parsed.reducedMotion\n\t\t\t\t\t: undefined,\n\t\t\thideThinkingBlocks:\n\t\t\t\ttypeof parsed.hideThinkingBlocks === \"boolean\"\n\t\t\t\t\t? parsed.hideThinkingBlocks\n\t\t\t\t\t: undefined,\n\t\t\trecentCommands: Array.isArray(parsed.recentCommands)\n\t\t\t\t? (parsed.recentCommands as string[]).filter(\n\t\t\t\t\t\t(item) => typeof item === \"string\" && item.trim().length > 0,\n\t\t\t\t\t)\n\t\t\t\t: undefined,\n\t\t\tfavoriteCommands: Array.isArray(parsed.favoriteCommands)\n\t\t\t\t? (parsed.favoriteCommands as string[]).filter(\n\t\t\t\t\t\t(item) => typeof item === \"string\" && item.trim().length > 0,\n\t\t\t\t\t)\n\t\t\t\t: undefined,\n\t\t};\n\t} catch {\n\t\treturn {};\n\t}\n}\n\nexport function saveUiState(partial: UiState): void {\n\tconst current = loadUiState();\n\tconst next: UiState = { ...current, ...partial };\n\tconst uiStatePath = getUiStatePath();\n\tmkdirSync(dirname(uiStatePath), { recursive: true });\n\twriteFileSync(uiStatePath, JSON.stringify(next, null, 2), \"utf-8\");\n}\n\nexport function loadCommandPrefs(): {\n\tfavorites: string[];\n\trecents: string[];\n} {\n\tconst prefsPath = getCommandPrefsPath();\n\tif (!existsSync(prefsPath)) {\n\t\treturn { favorites: [], recents: [] };\n\t}\n\ttry {\n\t\tconst raw = readFileSync(prefsPath, \"utf-8\");\n\t\tconst parsed = JSON.parse(raw) as Record<string, unknown>;\n\t\tconst favorites = Array.isArray(parsed.favorites)\n\t\t\t? (parsed.favorites as unknown[]).filter(\n\t\t\t\t\t(item): item is string => typeof item === \"string\",\n\t\t\t\t)\n\t\t\t: [];\n\t\tconst recents = Array.isArray(parsed.recents)\n\t\t\t? (parsed.recents as unknown[]).filter(\n\t\t\t\t\t(item): item is string => typeof item === \"string\",\n\t\t\t\t)\n\t\t\t: [];\n\t\treturn { favorites, recents };\n\t} catch {\n\t\treturn { favorites: [], recents: [] };\n\t}\n}\n\nexport function saveCommandPrefs(prefs: {\n\tfavorites: string[];\n\trecents: string[];\n}): void {\n\tconst prefsPath = getCommandPrefsPath();\n\tmkdirSync(dirname(prefsPath), { recursive: true });\n\twriteFileSync(prefsPath, JSON.stringify(prefs, null, 2), \"utf-8\");\n}\n"]}
@@ -63,7 +63,7 @@ export declare function buildBrandLine(width: number, state: Pick<AgentState, "m
63
63
  * Format: ~/project (main) +1.2k -500 ~3.2k | ctx 2.3% | $0.04
64
64
  */
65
65
  export declare function buildPathAndStatsLine(cwd: string, stats: FooterStats, width: number, branch: string | null, stageLabel: string | null): string;
66
- export type FooterMode = "ensemble" | "solo";
66
+ export type FooterMode = "rich" | "solo";
67
67
  export interface FooterStats {
68
68
  totalInput: number;
69
69
  totalOutput: number;
@@ -1 +1 @@
1
- {"version":3,"file":"footer-utils.d.ts","sourceRoot":"","sources":["../../../src/cli-tui/utils/footer-utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"footer-utils.d.ts","sourceRoot":"","sources":["../../../src/cli-tui/utils/footer-utils.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"footer-utils.js","sourceRoot":"","sources":["../../../src/cli-tui/utils/footer-utils.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Footer Utilities - Terminal footer bar layout and rendering\n *\n * This module handles the complex layout calculations needed to render an\n * informative footer bar in varying terminal widths. The footer displays:\n * - Brand/model information\n * - Token usage statistics\n * - Context window utilization\n * - Cost tracking\n * - Current working path with git branch\n * - Stage indicators (thinking, working, etc.)\n *\n * ## Layout Philosophy\n *\n * The footer uses a **priority-based truncation** system. As terminal width\n * decreases, lower-priority elements are dropped or truncated first:\n *\n * 1. Full layout: All stats + model + brand\n * 2. Drop brand, keep model\n * 3. Truncate model name\n * 4. Stats only\n *\n * ## Width Calculation Challenges\n *\n * Terminal width calculation must account for:\n * - ANSI escape sequences (colors, bold) that consume bytes but not visual space\n * - Unicode characters that may be wider than expected (emoji, CJK)\n * - Combining characters and zero-width joiners\n *\n * We use `visibleWidth()` from @evalops/tui for accurate measurements.\n *\n * ## Zone-Based Layout\n *\n * The footer is divided into \"zones\" with percentage-based width allocation:\n * - Badge zone: 25% for stage labels and runtime badges\n * - Path zone: Remaining space for working directory\n * - Stats zone: Right-aligned usage metrics\n *\n * Minimum widths ensure each zone remains readable even in narrow terminals.\n *\n * @module tui/utils/footer-utils\n */\n\nimport { visibleWidth } from \"@evalops/tui\";\nimport chalk from \"chalk\";\nimport type { AgentState, AssistantMessage, Usage } from \"../../agent/types.js\";\nimport {\n\tbrand,\n\tmetricStat,\n\tthemePalette,\n\tseparator as themedSeparator,\n} from \"../../style/theme.js\";\nimport { getHomeDir } from \"../../utils/path-expansion.js\";\nimport {\n\tbuildContextBadge,\n\tbuildContextBar,\n\tcolorizeContextPercent,\n\tcomposeBrandLabel,\n} from \"./footer-visual-widgets.js\";\nimport { shimmerText } from \"./shimmer.js\";\nimport { STAGE_SHIMMER_OPTIONS } from \"./stage-labels.js\";\n\n// Re-export extracted modules for backward compatibility\nexport { GitBranchTracker } from \"./git-branch-tracker.js\";\nexport {\n\tbuildContextBar,\n\tbuildCostSparkline,\n\tbuildGitStatusGlyph,\n\tcomposeBrandLabel,\n\tformatRelativeTime,\n\ttype GitStatusType,\n} from \"./footer-visual-widgets.js\";\n\nexport const CONTEXT_HINT_THRESHOLD = 70;\nexport const CONTEXT_HINT_WARN_GAP = 5;\nexport const CONTEXT_WARN_THRESHOLD =\n\tCONTEXT_HINT_THRESHOLD + CONTEXT_HINT_WARN_GAP;\nexport const CONTEXT_DANGER_THRESHOLD = 90;\nconst MIN_PADDING = 2;\nconst MODEL_BRAND_SEPARATOR_WIDTH = 1;\nconst MIN_MODEL_LABEL_CHARS = 3;\nconst BADGE_ZONE_MIN_WIDTH = 15;\nconst PATH_ZONE_MIN_WIDTH = 20;\nconst BADGE_ZONE_PERCENT = 0.25;\nconst TRUNCATION_ELLIPSIS = \"…\";\nexport const FOOTER_MIN_PADDING = MIN_PADDING;\nexport const FOOTER_MIN_MODEL_LABEL_CHARS = MIN_MODEL_LABEL_CHARS;\nexport const FOOTER_MODEL_BRAND_SEPARATOR_WIDTH = MODEL_BRAND_SEPARATOR_WIDTH;\n\nconst ANSI_STRING_TERMINATORS = \"(?:\\\\u0007|\\\\u001B\\\\u005C|\\\\u009C)\";\nconst ANSI_OSC_SEQUENCE = `(?:\\\\u001B\\\\][\\\\s\\\\S]*?${ANSI_STRING_TERMINATORS})`;\nconst ANSI_CSI_SEQUENCE =\n\t\"[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:\\\\d{1,4}(?:[;:]\\\\d{0,4})*)?[\\\\dA-PR-TZcf-nq-uy=><~]\";\nconst ANSI_ESCAPE_SEQUENCE = new RegExp(\n\t`${ANSI_OSC_SEQUENCE}|${ANSI_CSI_SEQUENCE}`,\n\t\"g\",\n);\n\n/**\n * Build a horizontal rule line using box-drawing characters.\n */\nexport function buildHorizontalRule(width: number): string {\n\tif (width <= 0) return \"\";\n\treturn chalk.hex(themePalette.dim)(\"─\".repeat(width));\n}\n\n/**\n * Build the brand line: `* composer` on left, model name on right\n */\nexport function buildBrandLine(\n\twidth: number,\n\tstate: Pick<AgentState, \"model\" | \"thinkingLevel\">,\n): string {\n\tconst glyph = brand.glyph();\n\tconst name = brand.text();\n\tconst brandLeft = `${glyph} ${name}`;\n\tconst brandLeftWidth = visibleWidth(brandLeft);\n\n\tconst modelLabel = formatModelLabel(state);\n\tconst modelRight = chalk.hex(themePalette.model)(modelLabel);\n\tconst modelRightWidth = visibleWidth(modelRight);\n\n\tconst totalNeeded = brandLeftWidth + MIN_PADDING + modelRightWidth;\n\tif (totalNeeded <= width) {\n\t\tconst padding = \" \".repeat(\n\t\t\tMath.max(0, width - brandLeftWidth - modelRightWidth),\n\t\t);\n\t\treturn `${brandLeft}${padding}${modelRight}`;\n\t}\n\n\t// Truncate model if needed\n\tconst availableForModel = width - brandLeftWidth - MIN_PADDING;\n\tif (availableForModel > MIN_MODEL_LABEL_CHARS) {\n\t\tconst truncated = truncateModelLabel(modelLabel, availableForModel);\n\t\tconst truncatedColored = chalk.hex(themePalette.model)(truncated);\n\t\tconst padding = \" \".repeat(\n\t\t\tMath.max(0, width - brandLeftWidth - visibleWidth(truncatedColored)),\n\t\t);\n\t\treturn `${brandLeft}${padding}${truncatedColored}`;\n\t}\n\n\t// Just brand if model doesn't fit\n\treturn brandLeft;\n}\n\n/**\n * Build the path and stats line with pipe separators.\n * Format: ~/project (main) +1.2k -500 ~3.2k | ctx 2.3% | $0.04\n */\nexport function buildPathAndStatsLine(\n\tcwd: string,\n\tstats: FooterStats,\n\twidth: number,\n\tbranch: string | null,\n\tstageLabel: string | null,\n): string {\n\tconst pipeSep = chalk.hex(themePalette.dim)(\" | \");\n\n\t// Build right side: token stats | ctx % | cost\n\tconst statsParts: string[] = [];\n\tif (stats.totalInput)\n\t\tstatsParts.push(\n\t\t\t`${chalk.hex(themePalette.accentCool)(\"+\")}${chalk\n\t\t\t\t.hex(themePalette.text)\n\t\t\t\t.bold(formatTokenCount(stats.totalInput))}`,\n\t\t);\n\tif (stats.totalOutput)\n\t\tstatsParts.push(\n\t\t\t`${chalk.hex(themePalette.accentWarm)(\"-\")}${chalk\n\t\t\t\t.hex(themePalette.text)\n\t\t\t\t.bold(formatTokenCount(stats.totalOutput))}`,\n\t\t);\n\tif (stats.totalCacheRead)\n\t\tstatsParts.push(\n\t\t\t`${chalk.hex(themePalette.cacheRead)(\"~\")}${chalk\n\t\t\t\t.hex(themePalette.text)\n\t\t\t\t.bold(formatTokenCount(stats.totalCacheRead))}`,\n\t\t);\n\n\tconst tokensGroup = statsParts.join(\" \");\n\t// Context bar with visual progress indicator\n\tconst contextPercent =\n\t\tstats.contextWindow > 0\n\t\t\t? `${buildContextBar(stats.contextPercent, 8)} ${colorizeContextPercent(stats.contextPercent)}`\n\t\t\t: \"\";\n\tconst costLabel =\n\t\tstats.totalCost > 0\n\t\t\t? `${chalk.hex(themePalette.cost)(\"$\")}${chalk\n\t\t\t\t\t.hex(themePalette.metric)\n\t\t\t\t\t.bold(stats.totalCost.toFixed(2))}`\n\t\t\t: \"\";\n\n\tconst rightParts: string[] = [];\n\tif (tokensGroup) rightParts.push(tokensGroup);\n\tif (contextPercent) rightParts.push(contextPercent);\n\tif (costLabel) rightParts.push(costLabel);\n\tconst rightSide = rightParts.join(pipeSep);\n\tconst rightSideWidth = visibleWidth(rightSide);\n\n\t// Build left side: stage (if any) + path with branch\n\tconst leftParts: string[] = [];\n\tif (stageLabel) {\n\t\tleftParts.push(renderStaticStageBadge(stageLabel));\n\t}\n\tconst pathFormatted = formatPathWithBranch(\n\t\tcwd,\n\t\tMath.max(20, width - rightSideWidth - 6),\n\t\tbranch,\n\t);\n\tleftParts.push(chalk.hex(themePalette.muted)(pathFormatted));\n\tconst leftSide = leftParts.join(\" \");\n\tconst leftSideWidth = visibleWidth(leftSide);\n\n\tconst totalNeeded = leftSideWidth + MIN_PADDING + rightSideWidth;\n\tif (totalNeeded <= width) {\n\t\tconst padding = \" \".repeat(\n\t\t\tMath.max(MIN_PADDING, width - leftSideWidth - rightSideWidth),\n\t\t);\n\t\treturn `${leftSide}${padding}${rightSide}`;\n\t}\n\n\t// Narrow width: just return what fits\n\tif (width < 60) {\n\t\treturn leftSide;\n\t}\n\n\t// Truncate path to make room\n\tconst availableForPath = Math.max(\n\t\t15,\n\t\twidth - rightSideWidth - MIN_PADDING - (stageLabel ? 15 : 0),\n\t);\n\tconst truncatedPath = formatPathWithBranch(cwd, availableForPath, branch, 15);\n\tconst truncatedLeftParts: string[] = [];\n\tif (stageLabel) {\n\t\ttruncatedLeftParts.push(renderStaticStageBadge(stageLabel));\n\t}\n\ttruncatedLeftParts.push(chalk.hex(themePalette.muted)(truncatedPath));\n\tconst truncatedLeft = truncatedLeftParts.join(\" \");\n\tconst truncatedLeftWidth = visibleWidth(truncatedLeft);\n\tconst padding = \" \".repeat(\n\t\tMath.max(MIN_PADDING, width - truncatedLeftWidth - rightSideWidth),\n\t);\n\treturn `${truncatedLeft}${padding}${rightSide}`;\n}\n\nexport type FooterMode = \"ensemble\" | \"solo\";\n\nexport interface FooterStats {\n\ttotalInput: number;\n\ttotalOutput: number;\n\ttotalCacheRead: number;\n\ttotalCacheWrite: number;\n\ttotalCost: number;\n\tcontextTokens: number;\n\tcontextWindow: number;\n\tcontextPercent: number;\n}\n\nexport type HintType = \"context\" | \"plan\" | \"queue\" | \"bash\" | \"custom\";\n\nexport interface FooterHint {\n\ttype: HintType;\n\tmessage: string;\n\tpriority: number; // Higher = more important\n}\n\nexport type StageKind = \"thinking\" | \"working\" | \"responding\" | \"dreaming\";\n\n// Static color-coded badges for stages\nconst STAGE_COLORS: Record<StageKind, string> = {\n\tthinking: \"#93c5fd\", // soft blue\n\tworking: \"#fbbf24\", // amber\n\tresponding: \"#7dd3fc\", // sky\n\tdreaming: \"#c084fc\", // violet\n} as const;\n\nexport function formatModelLabel(\n\tstate: Pick<AgentState, \"model\" | \"thinkingLevel\">,\n): string {\n\tconst modelId = state.model?.id ?? \"no-model\";\n\tif (!state.model?.reasoning) {\n\t\treturn modelId;\n\t}\n\tconst thinkingLevel = state.thinkingLevel || \"off\";\n\treturn thinkingLevel === \"off\" ? modelId : `${modelId} • ${thinkingLevel}`;\n}\n\nexport function resolveFooterHint(\n\tstats: FooterStats,\n\texplicitHint?: string | null,\n): string | null {\n\tconst shouldWarn =\n\t\tstats.contextWindow > 0 && stats.contextPercent >= CONTEXT_HINT_THRESHOLD;\n\tif (shouldWarn) {\n\t\treturn `Context ${stats.contextPercent.toFixed(1)}% – run /compact to summarize`;\n\t}\n\treturn explicitHint ?? null;\n}\n\nexport function calculateFooterStats(state: AgentState): FooterStats {\n\tlet totalInput = 0;\n\tlet totalOutput = 0;\n\tlet totalCacheRead = 0;\n\tlet totalCacheWrite = 0;\n\tlet totalCost = 0;\n\n\tfor (const message of state.messages) {\n\t\tif (message.role === \"assistant\") {\n\t\t\tconst assistantMsg = message as AssistantMessage;\n\t\t\tconst usage = normalizeUsage(assistantMsg.usage);\n\t\t\ttotalInput += usage.input;\n\t\t\ttotalOutput += usage.output;\n\t\t\ttotalCacheRead += usage.cacheRead;\n\t\t\ttotalCacheWrite += usage.cacheWrite;\n\t\t\ttotalCost += usage.cost.total;\n\t\t}\n\t}\n\n\tlet lastSuccessfulUsage: Usage | undefined;\n\n\t// Iterate backwards to find the last successful assistant message (anchor)\n\tfor (let i = state.messages.length - 1; i >= 0; i--) {\n\t\tconst msg = state.messages[i];\n\t\tif (!msg) continue;\n\t\tif (msg.role === \"assistant\") {\n\t\t\tconst assistantMsg = msg as AssistantMessage;\n\t\t\tif (\n\t\t\t\tassistantMsg.stopReason !== \"aborted\" &&\n\t\t\t\tassistantMsg.stopReason !== \"error\"\n\t\t\t) {\n\t\t\t\tlastSuccessfulUsage = normalizeUsage(assistantMsg.usage);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Calculate context percentage: last successful turn's total\n\tconst contextTokens = lastSuccessfulUsage\n\t\t? Math.max(\n\t\t\t\t0,\n\t\t\t\tlastSuccessfulUsage.input +\n\t\t\t\t\tlastSuccessfulUsage.cacheRead +\n\t\t\t\t\tlastSuccessfulUsage.output,\n\t\t\t)\n\t\t: 0;\n\n\tconst contextWindow = state.model.contextWindow ?? 0;\n\tconst contextPercent =\n\t\tcontextWindow > 0 ? (contextTokens / contextWindow) * 100 : 0;\n\n\treturn {\n\t\ttotalInput,\n\t\ttotalOutput,\n\t\ttotalCacheRead,\n\t\ttotalCacheWrite,\n\t\ttotalCost,\n\t\tcontextTokens,\n\t\tcontextWindow,\n\t\tcontextPercent,\n\t};\n}\n\nconst ZERO_USAGE: Usage = {\n\tinput: 0,\n\toutput: 0,\n\tcacheRead: 0,\n\tcacheWrite: 0,\n\tcost: {\n\t\tinput: 0,\n\t\toutput: 0,\n\t\tcacheRead: 0,\n\t\tcacheWrite: 0,\n\t\ttotal: 0,\n\t},\n};\n\nexport function normalizeUsage(usage?: Usage): Usage {\n\tif (!usage) {\n\t\treturn ZERO_USAGE;\n\t}\n\treturn {\n\t\tinput: usage.input ?? 0,\n\t\toutput: usage.output ?? 0,\n\t\tcacheRead: usage.cacheRead ?? 0,\n\t\tcacheWrite: usage.cacheWrite ?? 0,\n\t\tcost: {\n\t\t\tinput: usage.cost?.input ?? 0,\n\t\t\toutput: usage.cost?.output ?? 0,\n\t\t\tcacheRead: usage.cost?.cacheRead ?? 0,\n\t\t\tcacheWrite: usage.cost?.cacheWrite ?? 0,\n\t\t\ttotal: usage.cost?.total ?? 0,\n\t\t},\n\t};\n}\n\nexport function formatTokenCount(count: number): string {\n\tif (count < 1000) return count.toString();\n\tif (count < 10000) return `${(count / 1000).toFixed(1)}k`;\n\treturn `${Math.round(count / 1000)}k`;\n}\n\nfunction replaceHomePrefix(path: string, home: string): string {\n\tconst normalizedPath = path.replace(/\\\\/g, \"/\");\n\tconst normalizedHome = home.replace(/\\\\/g, \"/\");\n\tconst normalizeForCompare = (value: string) =>\n\t\tprocess.platform === \"win32\" ? value.toLowerCase() : value;\n\tconst pathCheck = normalizeForCompare(normalizedPath);\n\tconst homeCheck = normalizeForCompare(normalizedHome);\n\tif (pathCheck === homeCheck) {\n\t\treturn \"~\";\n\t}\n\tif (pathCheck.startsWith(`${homeCheck}/`)) {\n\t\treturn `~${normalizedPath.slice(normalizedHome.length)}`;\n\t}\n\treturn path;\n}\n\nexport function formatPath(path: string, width: number, minWidth = 20): string {\n\tconst usableWidth = Math.max(1, Math.floor(width));\n\tconst clampedMinWidth = Math.min(\n\t\tMath.max(1, Math.floor(minWidth)),\n\t\tusableWidth,\n\t);\n\tconst home = getHomeDir();\n\tconst pwd = home ? replaceHomePrefix(path, home) : path;\n\tconst maxPathLength = Math.max(clampedMinWidth, usableWidth - 10);\n\tif (visibleWidth(pwd) <= maxPathLength) {\n\t\treturn pwd;\n\t}\n\tif (maxPathLength <= 3) {\n\t\treturn pwd.slice(0, maxPathLength);\n\t}\n\tconst start = pwd.slice(0, Math.max(0, Math.floor(maxPathLength / 2) - 2));\n\tconst end = pwd.slice(-Math.max(0, Math.floor(maxPathLength / 2) - 1));\n\treturn `${start}...${end}`;\n}\n\n/**\n * Render a static, color-coded stage badge (no shimmer)\n */\nexport function renderStaticStageBadge(label: string): string {\n\tconst trimmed = label.trim();\n\tconst normalized = trimmed.toLowerCase();\n\tif (!normalized) return \"\";\n\n\tconst [firstWord] = normalized.split(/\\s+/u);\n\tlet kind: StageKind | undefined;\n\tswitch (firstWord) {\n\t\tcase \"thinking\":\n\t\t\tkind = \"thinking\";\n\t\t\tbreak;\n\t\tcase \"working\":\n\t\t\tkind = \"working\";\n\t\t\tbreak;\n\t\tcase \"responding\":\n\t\t\tkind = \"responding\";\n\t\t\tbreak;\n\t\tcase \"dreaming\":\n\t\t\tkind = \"dreaming\";\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tkind = undefined;\n\t}\n\n\tconst color = kind ? STAGE_COLORS[kind] : themePalette.muted;\n\tif (kind && shimmerAllowed()) {\n\t\tconst options = STAGE_SHIMMER_OPTIONS[kind];\n\t\tif (options) {\n\t\t\tconst shimmering = shimmerText(trimmed || label, { ...options, time: 0 });\n\t\t\t// Append a concealed plain label so consumers (and tests) can still find the\n\t\t\t// raw text without affecting visible output.\n\t\t\tconst hiddenLabel = `\\u001B[8m${trimmed || label}\\u001B[28m`;\n\t\t\treturn ensureAnsi(shimmering, trimmed || label) + hiddenLabel;\n\t\t}\n\t}\n\treturn chalk.hex(color).bold(trimmed || label);\n}\n\nfunction shimmerAllowed(): boolean {\n\tconst shimmerEnv = (process.env.MAESTRO_TUI_SHIMMER || \"on\").toLowerCase();\n\tif (shimmerEnv === \"off\") return false;\n\tconst noColor = process.env.NO_COLOR ?? \"\";\n\tconst composerNoColor = process.env.MAESTRO_NO_COLOR ?? \"\";\n\tconst isDisabled = (value: string) =>\n\t\tBoolean(\n\t\t\tvalue &&\n\t\t\t\tvalue !== \"0\" &&\n\t\t\t\tvalue.toLowerCase() !== \"false\" &&\n\t\t\t\tvalue.toLowerCase() !== \"undefined\",\n\t\t);\n\tif (isDisabled(noColor) || isDisabled(composerNoColor)) return false;\n\treturn true;\n}\n\nfunction ensureAnsi(rendered: string, fallback: string): string {\n\tif (rendered?.includes(\"\\u001B[\")) {\n\t\treturn rendered;\n\t}\n\t// Add a simple bold ANSI wrap to satisfy \"colored\" expectation\n\treturn `\\u001B[1m\\u001B[35m${rendered || fallback}\\u001B[39m\\u001B[22m`;\n}\n\n/**\n * Render runtime badge with distinct styling (not gray)\n */\nexport function renderRuntimeBadge(badge: string): string {\n\t// Runtime badges like \"queue:all(3)\", \"safe-mode\", etc.\n\t// Use a distinct color to make them stand out\n\treturn chalk.hex(\"#94e2d5\").bold(badge); // mint color for visibility\n}\n\nfunction matchAnsiSequence(\n\tvalue: string,\n\tstartIndex: number,\n): { sequence: string; nextIndex: number } | null {\n\tANSI_ESCAPE_SEQUENCE.lastIndex = startIndex;\n\tconst match = ANSI_ESCAPE_SEQUENCE.exec(value);\n\tif (match && match.index === startIndex) {\n\t\treturn { sequence: match[0], nextIndex: ANSI_ESCAPE_SEQUENCE.lastIndex };\n\t}\n\treturn null;\n}\n\nfunction truncateAnsiToWidth(value: string, maxWidth: number): string {\n\tif (!value || maxWidth <= 0) {\n\t\treturn \"\";\n\t}\n\tif (visibleWidth(value) <= maxWidth) {\n\t\treturn value;\n\t}\n\tlet width = 0;\n\tlet index = 0;\n\tlet result = \"\";\n\twhile (index < value.length && width < maxWidth) {\n\t\tconst ansiMatch = matchAnsiSequence(value, index);\n\t\tif (ansiMatch) {\n\t\t\tresult += ansiMatch.sequence;\n\t\t\tindex = ansiMatch.nextIndex;\n\t\t\tcontinue;\n\t\t}\n\t\tconst codePoint = value.codePointAt(index);\n\t\tif (codePoint === undefined) {\n\t\t\tbreak;\n\t\t}\n\t\tconst char = String.fromCodePoint(codePoint);\n\t\tconst charWidth = visibleWidth(char);\n\t\tif (charWidth === 0) {\n\t\t\tresult += char;\n\t\t\tindex += char.length;\n\t\t\tcontinue;\n\t\t}\n\t\tif (width + charWidth > maxWidth) {\n\t\t\tbreak;\n\t\t}\n\t\twidth += charWidth;\n\t\tresult += char;\n\t\tindex += char.length;\n\t}\n\treturn result;\n}\n\n/**\n * Merge and prioritize multiple hints\n */\nexport function mergeHints(\n\tstats: FooterStats,\n\thints: FooterHint[],\n\twidth: number,\n): string | null {\n\tconst allHints: FooterHint[] = [...hints];\n\n\t// Add context hint if needed\n\tconst shouldWarn =\n\t\tstats.contextWindow > 0 && stats.contextPercent >= CONTEXT_HINT_THRESHOLD;\n\tif (shouldWarn) {\n\t\tallHints.push({\n\t\t\ttype: \"context\",\n\t\t\tmessage: `Context ${stats.contextPercent.toFixed(1)}% – run /compact to summarize`,\n\t\t\tpriority: 100, // High priority\n\t\t});\n\t}\n\n\tif (allHints.length === 0) return null;\n\n\t// Sort by priority (highest first)\n\tallHints.sort((a, b) => b.priority - a.priority);\n\n\t// Try to fit multiple hints with icons\n\tconst hintIcons: Record<HintType, string> = {\n\t\tcontext: \"⚠\",\n\t\tplan: \"📋\",\n\t\tqueue: \"⏳\",\n\t\tbash: \"⚙\",\n\t\tcustom: \"ℹ\",\n\t};\n\n\tconst formatted: string[] = [];\n\tlet currentWidth = 0;\n\n\tfor (const hint of allHints) {\n\t\tconst icon = hintIcons[hint.type];\n\t\tconst text = `${icon} ${hint.message}`;\n\t\tconst textWidth = visibleWidth(text);\n\n\t\tif (formatted.length === 0) {\n\t\t\t// Always include the highest priority hint\n\t\t\tformatted.push(text);\n\t\t\tcurrentWidth = textWidth;\n\t\t} else {\n\t\t\t// Try to add additional hints if they fit\n\t\t\tconst separator = \" \";\n\t\t\tconst needed = currentWidth + visibleWidth(separator) + textWidth;\n\t\t\tif (needed <= width - 10) {\n\t\t\t\t// Leave some margin\n\t\t\t\tformatted.push(text);\n\t\t\t\tcurrentWidth = needed;\n\t\t\t} else {\n\t\t\t\tbreak; // No more space\n\t\t\t}\n\t\t}\n\t}\n\n\treturn formatted.join(\" \");\n}\n\n/**\n * Truncate Model Label to Fit Available Width\n *\n * Progressively removes characters from the end of the model label until\n * it fits within the target width. Uses visible width calculation to\n * correctly handle ANSI escape sequences.\n *\n * ## Why Character-by-Character?\n *\n * We can't simply use String.slice() with a character count because:\n * 1. ANSI codes consume 0 visual width but multiple characters\n * 2. Some Unicode chars (emoji, CJK) consume 2 visual columns\n * 3. We need to preserve styling codes at the beginning\n *\n * The loop approach ensures we stop exactly when we hit the target width.\n *\n * @param label - The model label (may contain ANSI color codes)\n * @param targetWidth - Maximum visual width allowed\n * @returns Truncated label that fits within targetWidth columns\n */\nexport function truncateModelLabel(label: string, targetWidth: number): string {\n\t// Edge case: no space at all\n\tif (targetWidth <= 0) return \"\";\n\t// Fast path: already fits\n\tif (visibleWidth(label) <= targetWidth) {\n\t\treturn label;\n\t}\n\t// Truncate character by character until it fits\n\tlet result = label;\n\twhile (visibleWidth(result) > targetWidth && result.length > 0) {\n\t\tresult = result.slice(0, -1);\n\t}\n\t// Clean up trailing whitespace that may look odd\n\treturn result.trimEnd();\n}\n\n/**\n * Build Stats Line - Priority-based footer layout algorithm\n *\n * Constructs the main stats footer line with adaptive layout that gracefully\n * degrades as terminal width decreases. Uses a priority system to determine\n * what content to show/hide.\n *\n * ## Layout Priority (highest to lowest)\n *\n * 1. **Full layout**: Stats + Model Name + Brand Logo\n * Example: \"▲12K ▼5K ⟲10K $0.05 | 45% claude-sonnet-4.0 ◆ Maestro\"\n *\n * 2. **Drop brand**: Stats + Model Name (brand removed first)\n * Example: \"▲12K ▼5K ⟲10K $0.05 | 45% claude-sonnet-4.0\"\n *\n * 3. **Truncate model**: Stats + Shortened Model Name\n * Example: \"▲12K ▼5K ⟲10K $0.05 | 45% claude-son...\"\n *\n * 4. **Stats only**: Just the usage metrics (very narrow terminals)\n * Example: \"▲12K ▼5K $0.05 | 45%\"\n *\n * ## Stat Components (left side)\n *\n * - ▲ Input tokens (blue) - tokens sent to model\n * - ▼ Output tokens (orange) - tokens generated by model\n * - ⟲ Cache read (cyan) - tokens loaded from cache\n * - ⟳ Cache write (magenta) - tokens written to cache\n * - $ Cost (green) - cumulative API cost\n * - Context badge - context window utilization percentage\n *\n * @param stats - Usage statistics to display\n * @param width - Available terminal width in columns\n * @param state - Agent state for model/thinking level info\n * @returns Formatted footer string with ANSI colors\n */\nexport function buildStatsLine(\n\tstats: FooterStats,\n\twidth: number,\n\tstate: Pick<AgentState, \"model\" | \"thinkingLevel\">,\n): string {\n\t// Build left side: usage statistics\n\tconst statsParts: string[] = [];\n\tif (stats.totalInput)\n\t\tstatsParts.push(\n\t\t\tmetricStat(\n\t\t\t\t\"▲\",\n\t\t\t\tthemePalette.accentCool,\n\t\t\t\tformatTokenCount(stats.totalInput),\n\t\t\t),\n\t\t);\n\tif (stats.totalOutput)\n\t\tstatsParts.push(\n\t\t\tmetricStat(\n\t\t\t\t\"▼\",\n\t\t\t\tthemePalette.accentWarm,\n\t\t\t\tformatTokenCount(stats.totalOutput),\n\t\t\t),\n\t\t);\n\tif (stats.totalCacheRead)\n\t\tstatsParts.push(\n\t\t\tmetricStat(\n\t\t\t\t\"⟲\",\n\t\t\t\tthemePalette.cacheRead,\n\t\t\t\tformatTokenCount(stats.totalCacheRead),\n\t\t\t),\n\t\t);\n\tif (stats.totalCacheWrite)\n\t\tstatsParts.push(\n\t\t\tmetricStat(\n\t\t\t\t\"⟳\",\n\t\t\t\tthemePalette.cacheWrite,\n\t\t\t\tformatTokenCount(stats.totalCacheWrite),\n\t\t\t),\n\t\t);\n\tif (stats.totalCost)\n\t\tstatsParts.push(\n\t\t\t`${chalk.hex(themePalette.cost)(\"$\")}${chalk\n\t\t\t\t.hex(themePalette.metric)\n\t\t\t\t.bold(stats.totalCost.toFixed(3))}`,\n\t\t);\n\n\t// Context badge always shown (critical for user awareness)\n\tstatsParts.push(buildContextBadge(stats));\n\tconst separator = themedSeparator();\n\tconst statsLeft = statsParts.join(separator);\n\n\t// Build right side: model label + brand\n\tconst modelLabel = formatModelLabel(state);\n\tconst { toned, brand: composerBrand } = composeBrandLabel(modelLabel);\n\n\tconst statsLeftWidth = visibleWidth(statsLeft);\n\n\t// ═══════════════════════════════════════════════════════════════════════\n\t// Priority-based layout: try each configuration until one fits\n\t// ═══════════════════════════════════════════════════════════════════════\n\n\t// Priority 1: Full layout (stats + model + brand)\n\tlet rightSide = `${toned} ${composerBrand}`;\n\tlet rightWidth = visibleWidth(rightSide);\n\tlet totalNeeded = statsLeftWidth + MIN_PADDING + rightWidth;\n\n\tif (totalNeeded <= width) {\n\t\t// Everything fits!\n\t\tconst padding = \" \".repeat(\n\t\t\tMath.max(0, width - statsLeftWidth - rightWidth),\n\t\t);\n\t\treturn statsLeft + padding + rightSide;\n\t}\n\n\t// Priority 2: stats + model (drop brand to preserve model label)\n\trightSide = toned;\n\trightWidth = visibleWidth(rightSide);\n\ttotalNeeded = statsLeftWidth + MIN_PADDING + rightWidth;\n\n\tif (totalNeeded <= width) {\n\t\tconst padding = \" \".repeat(\n\t\t\tMath.max(0, width - statsLeftWidth - rightWidth),\n\t\t);\n\t\treturn statsLeft + padding + rightSide;\n\t}\n\n\t// Priority 3: stats + truncated model (still no brand)\n\tconst availableForModel = width - statsLeftWidth - MIN_PADDING;\n\tif (availableForModel > MIN_MODEL_LABEL_CHARS) {\n\t\tconst truncated = truncateModelLabel(modelLabel, availableForModel);\n\t\tconst tonedTruncated = chalk.hex(themePalette.model)(truncated);\n\t\tconst padding = \" \".repeat(\n\t\t\tMath.max(0, width - statsLeftWidth - visibleWidth(tonedTruncated)),\n\t\t);\n\t\treturn statsLeft + padding + tonedTruncated;\n\t}\n\n\t// Priority 4: stats only (model doesn't fit)\n\treturn statsLeft;\n}\n\nexport function buildSoloStatsLine(\n\tstats: FooterStats,\n\twidth: number,\n\tstate: Pick<AgentState, \"model\" | \"thinkingLevel\">,\n): string {\n\tconst statsParts: string[] = [];\n\tif (stats.totalInput)\n\t\tstatsParts.push(`↑${formatTokenCount(stats.totalInput)}`);\n\tif (stats.totalOutput)\n\t\tstatsParts.push(`↓${formatTokenCount(stats.totalOutput)}`);\n\tif (stats.totalCacheRead)\n\t\tstatsParts.push(`R${formatTokenCount(stats.totalCacheRead)}`);\n\tif (stats.totalCacheWrite)\n\t\tstatsParts.push(`W${formatTokenCount(stats.totalCacheWrite)}`);\n\tif (stats.totalCost) statsParts.push(`$${stats.totalCost.toFixed(3)}`);\n\n\tconst contextValue = Number.isFinite(stats.contextPercent)\n\t\t? stats.contextPercent\n\t\t: 0;\n\tstatsParts.push(colorizeContextPercent(contextValue));\n\tconst statsLeft = statsParts.join(\" \");\n\tconst rightSide = formatModelLabel(state);\n\tif (!rightSide) {\n\t\treturn statsLeft;\n\t}\n\tconst statsLeftWidth = visibleWidth(statsLeft);\n\tconst rightWidth = visibleWidth(rightSide);\n\tconst totalNeeded = statsLeftWidth + MIN_PADDING + rightWidth;\n\n\tif (totalNeeded <= width) {\n\t\tconst padding = \" \".repeat(\n\t\t\tMath.max(MIN_PADDING, width - statsLeftWidth - rightWidth),\n\t\t);\n\t\treturn statsLeft + padding + rightSide;\n\t}\n\n\tconst availableForRight = width - statsLeftWidth - MIN_PADDING;\n\tif (availableForRight > MIN_MODEL_LABEL_CHARS) {\n\t\tconst truncated = truncateModelLabel(rightSide, availableForRight);\n\t\tconst padding = \" \".repeat(\n\t\t\tMath.max(MIN_PADDING, width - statsLeftWidth - visibleWidth(truncated)),\n\t\t);\n\t\treturn statsLeft + padding + truncated;\n\t}\n\treturn statsLeft;\n}\n\n/**\n * Build a 2-zone footer layout for badges + cwd path\n */\nexport function buildBadgeAndPathLine(\n\tcwd: string,\n\tstageLabel: string | null,\n\truntimeBadges: string[],\n\twidth: number,\n\tbranch: string | null = null,\n): string {\n\tif (width < 40) {\n\t\treturn chalk.gray(formatPathWithBranch(cwd, width, branch));\n\t}\n\n\tconst badgesBudget = Math.max(\n\t\tBADGE_ZONE_MIN_WIDTH,\n\t\tMath.floor(width * BADGE_ZONE_PERCENT),\n\t);\n\tconst badgeParts: string[] = [];\n\tif (stageLabel) {\n\t\tbadgeParts.push(renderStaticStageBadge(stageLabel));\n\t}\n\tfor (const rb of runtimeBadges) {\n\t\tbadgeParts.push(renderRuntimeBadge(rb));\n\t}\n\tconst badgeZone = formatBadgeZone(badgeParts, badgesBudget);\n\tconst hasBadges = badgeZone.length > 0;\n\tconst separator = hasBadges ? \" \" : \"\";\n\tconst badgeZoneWidth = hasBadges ? visibleWidth(badgeZone) : 0;\n\tconst separatorWidth = hasBadges ? visibleWidth(separator) : 0;\n\tconst availableForPath = Math.max(0, width - badgeZoneWidth - separatorWidth);\n\tconst desiredPathWidth = Math.max(PATH_ZONE_MIN_WIDTH, width - badgesBudget);\n\tconst pathBudget = Math.min(desiredPathWidth, availableForPath);\n\tif (pathBudget <= 0) {\n\t\treturn badgeZone;\n\t}\n\tconst minPathWidth = Math.min(PATH_ZONE_MIN_WIDTH, pathBudget);\n\tconst pathFormatted = formatPathWithBranch(\n\t\tcwd,\n\t\tpathBudget,\n\t\tbranch,\n\t\tminPathWidth,\n\t);\n\tconst pathZone = chalk.gray(pathFormatted);\n\treturn `${badgeZone}${separator}${pathZone}`;\n}\n\nfunction formatBadgeZone(badgeParts: string[], budget: number): string {\n\tif (badgeParts.length === 0 || budget <= 0) {\n\t\treturn \"\";\n\t}\n\tconst joined = badgeParts.join(\" \");\n\tif (visibleWidth(joined) <= budget) {\n\t\treturn joined;\n\t}\n\tif (budget <= 1) {\n\t\treturn TRUNCATION_ELLIPSIS.slice(0, budget);\n\t}\n\tconst truncated = truncateAnsiToWidth(\n\t\tjoined,\n\t\tMath.max(0, budget - 1),\n\t).trimEnd();\n\tif (!truncated) {\n\t\treturn TRUNCATION_ELLIPSIS;\n\t}\n\treturn `${truncated}${TRUNCATION_ELLIPSIS}`;\n}\n\n/**\n * Format path with optional git branch suffix.\n * Example: \"~/project (main)\"\n */\nexport function formatPathWithBranch(\n\tpath: string,\n\twidth: number,\n\tbranch: string | null,\n\tminWidth = 20,\n): string {\n\tconst home = getHomeDir();\n\tlet pwd = home ? replaceHomePrefix(path, home) : path;\n\n\t// Add branch suffix if available\n\tif (branch) {\n\t\tpwd = `${pwd} (${branch})`;\n\t}\n\n\tconst usableWidth = Math.max(1, Math.floor(width));\n\tconst clampedMinWidth = Math.min(\n\t\tMath.max(1, Math.floor(minWidth)),\n\t\tusableWidth,\n\t);\n\tconst maxPathLength = Math.max(clampedMinWidth, usableWidth - 10);\n\n\tif (visibleWidth(pwd) <= maxPathLength) {\n\t\treturn pwd;\n\t}\n\n\tif (maxPathLength <= 3) {\n\t\treturn pwd.slice(0, maxPathLength);\n\t}\n\n\tconst start = pwd.slice(0, Math.max(0, Math.floor(maxPathLength / 2) - 2));\n\tconst end = pwd.slice(-Math.max(0, Math.floor(maxPathLength / 2) - 1));\n\treturn `${start}...${end}`;\n}\n"]}
1
+ {"version":3,"file":"footer-utils.js","sourceRoot":"","sources":["../../../src/cli-tui/utils/footer-utils.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Footer Utilities - Terminal footer bar layout and rendering\n *\n * This module handles the complex layout calculations needed to render an\n * informative footer bar in varying terminal widths. The footer displays:\n * - Brand/model information\n * - Token usage statistics\n * - Context window utilization\n * - Cost tracking\n * - Current working path with git branch\n * - Stage indicators (thinking, working, etc.)\n *\n * ## Layout Philosophy\n *\n * The footer uses a **priority-based truncation** system. As terminal width\n * decreases, lower-priority elements are dropped or truncated first:\n *\n * 1. Full layout: All stats + model + brand\n * 2. Drop brand, keep model\n * 3. Truncate model name\n * 4. Stats only\n *\n * ## Width Calculation Challenges\n *\n * Terminal width calculation must account for:\n * - ANSI escape sequences (colors, bold) that consume bytes but not visual space\n * - Unicode characters that may be wider than expected (emoji, CJK)\n * - Combining characters and zero-width joiners\n *\n * We use `visibleWidth()` from @evalops/tui for accurate measurements.\n *\n * ## Zone-Based Layout\n *\n * The footer is divided into \"zones\" with percentage-based width allocation:\n * - Badge zone: 25% for stage labels and runtime badges\n * - Path zone: Remaining space for working directory\n * - Stats zone: Right-aligned usage metrics\n *\n * Minimum widths ensure each zone remains readable even in narrow terminals.\n *\n * @module tui/utils/footer-utils\n */\n\nimport { visibleWidth } from \"@evalops/tui\";\nimport chalk from \"chalk\";\nimport type { AgentState, AssistantMessage, Usage } from \"../../agent/types.js\";\nimport {\n\tbrand,\n\tmetricStat,\n\tthemePalette,\n\tseparator as themedSeparator,\n} from \"../../style/theme.js\";\nimport { getHomeDir } from \"../../utils/path-expansion.js\";\nimport {\n\tbuildContextBadge,\n\tbuildContextBar,\n\tcolorizeContextPercent,\n\tcomposeBrandLabel,\n} from \"./footer-visual-widgets.js\";\nimport { shimmerText } from \"./shimmer.js\";\nimport { STAGE_SHIMMER_OPTIONS } from \"./stage-labels.js\";\n\n// Re-export extracted modules for backward compatibility\nexport { GitBranchTracker } from \"./git-branch-tracker.js\";\nexport {\n\tbuildContextBar,\n\tbuildCostSparkline,\n\tbuildGitStatusGlyph,\n\tcomposeBrandLabel,\n\tformatRelativeTime,\n\ttype GitStatusType,\n} from \"./footer-visual-widgets.js\";\n\nexport const CONTEXT_HINT_THRESHOLD = 70;\nexport const CONTEXT_HINT_WARN_GAP = 5;\nexport const CONTEXT_WARN_THRESHOLD =\n\tCONTEXT_HINT_THRESHOLD + CONTEXT_HINT_WARN_GAP;\nexport const CONTEXT_DANGER_THRESHOLD = 90;\nconst MIN_PADDING = 2;\nconst MODEL_BRAND_SEPARATOR_WIDTH = 1;\nconst MIN_MODEL_LABEL_CHARS = 3;\nconst BADGE_ZONE_MIN_WIDTH = 15;\nconst PATH_ZONE_MIN_WIDTH = 20;\nconst BADGE_ZONE_PERCENT = 0.25;\nconst TRUNCATION_ELLIPSIS = \"…\";\nexport const FOOTER_MIN_PADDING = MIN_PADDING;\nexport const FOOTER_MIN_MODEL_LABEL_CHARS = MIN_MODEL_LABEL_CHARS;\nexport const FOOTER_MODEL_BRAND_SEPARATOR_WIDTH = MODEL_BRAND_SEPARATOR_WIDTH;\n\nconst ANSI_STRING_TERMINATORS = \"(?:\\\\u0007|\\\\u001B\\\\u005C|\\\\u009C)\";\nconst ANSI_OSC_SEQUENCE = `(?:\\\\u001B\\\\][\\\\s\\\\S]*?${ANSI_STRING_TERMINATORS})`;\nconst ANSI_CSI_SEQUENCE =\n\t\"[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:\\\\d{1,4}(?:[;:]\\\\d{0,4})*)?[\\\\dA-PR-TZcf-nq-uy=><~]\";\nconst ANSI_ESCAPE_SEQUENCE = new RegExp(\n\t`${ANSI_OSC_SEQUENCE}|${ANSI_CSI_SEQUENCE}`,\n\t\"g\",\n);\n\n/**\n * Build a horizontal rule line using box-drawing characters.\n */\nexport function buildHorizontalRule(width: number): string {\n\tif (width <= 0) return \"\";\n\treturn chalk.hex(themePalette.dim)(\"─\".repeat(width));\n}\n\n/**\n * Build the brand line: `* composer` on left, model name on right\n */\nexport function buildBrandLine(\n\twidth: number,\n\tstate: Pick<AgentState, \"model\" | \"thinkingLevel\">,\n): string {\n\tconst glyph = brand.glyph();\n\tconst name = brand.text();\n\tconst brandLeft = `${glyph} ${name}`;\n\tconst brandLeftWidth = visibleWidth(brandLeft);\n\n\tconst modelLabel = formatModelLabel(state);\n\tconst modelRight = chalk.hex(themePalette.model)(modelLabel);\n\tconst modelRightWidth = visibleWidth(modelRight);\n\n\tconst totalNeeded = brandLeftWidth + MIN_PADDING + modelRightWidth;\n\tif (totalNeeded <= width) {\n\t\tconst padding = \" \".repeat(\n\t\t\tMath.max(0, width - brandLeftWidth - modelRightWidth),\n\t\t);\n\t\treturn `${brandLeft}${padding}${modelRight}`;\n\t}\n\n\t// Truncate model if needed\n\tconst availableForModel = width - brandLeftWidth - MIN_PADDING;\n\tif (availableForModel > MIN_MODEL_LABEL_CHARS) {\n\t\tconst truncated = truncateModelLabel(modelLabel, availableForModel);\n\t\tconst truncatedColored = chalk.hex(themePalette.model)(truncated);\n\t\tconst padding = \" \".repeat(\n\t\t\tMath.max(0, width - brandLeftWidth - visibleWidth(truncatedColored)),\n\t\t);\n\t\treturn `${brandLeft}${padding}${truncatedColored}`;\n\t}\n\n\t// Just brand if model doesn't fit\n\treturn brandLeft;\n}\n\n/**\n * Build the path and stats line with pipe separators.\n * Format: ~/project (main) +1.2k -500 ~3.2k | ctx 2.3% | $0.04\n */\nexport function buildPathAndStatsLine(\n\tcwd: string,\n\tstats: FooterStats,\n\twidth: number,\n\tbranch: string | null,\n\tstageLabel: string | null,\n): string {\n\tconst pipeSep = chalk.hex(themePalette.dim)(\" | \");\n\n\t// Build right side: token stats | ctx % | cost\n\tconst statsParts: string[] = [];\n\tif (stats.totalInput)\n\t\tstatsParts.push(\n\t\t\t`${chalk.hex(themePalette.accentCool)(\"+\")}${chalk\n\t\t\t\t.hex(themePalette.text)\n\t\t\t\t.bold(formatTokenCount(stats.totalInput))}`,\n\t\t);\n\tif (stats.totalOutput)\n\t\tstatsParts.push(\n\t\t\t`${chalk.hex(themePalette.accentWarm)(\"-\")}${chalk\n\t\t\t\t.hex(themePalette.text)\n\t\t\t\t.bold(formatTokenCount(stats.totalOutput))}`,\n\t\t);\n\tif (stats.totalCacheRead)\n\t\tstatsParts.push(\n\t\t\t`${chalk.hex(themePalette.cacheRead)(\"~\")}${chalk\n\t\t\t\t.hex(themePalette.text)\n\t\t\t\t.bold(formatTokenCount(stats.totalCacheRead))}`,\n\t\t);\n\n\tconst tokensGroup = statsParts.join(\" \");\n\t// Context bar with visual progress indicator\n\tconst contextPercent =\n\t\tstats.contextWindow > 0\n\t\t\t? `${buildContextBar(stats.contextPercent, 8)} ${colorizeContextPercent(stats.contextPercent)}`\n\t\t\t: \"\";\n\tconst costLabel =\n\t\tstats.totalCost > 0\n\t\t\t? `${chalk.hex(themePalette.cost)(\"$\")}${chalk\n\t\t\t\t\t.hex(themePalette.metric)\n\t\t\t\t\t.bold(stats.totalCost.toFixed(2))}`\n\t\t\t: \"\";\n\n\tconst rightParts: string[] = [];\n\tif (tokensGroup) rightParts.push(tokensGroup);\n\tif (contextPercent) rightParts.push(contextPercent);\n\tif (costLabel) rightParts.push(costLabel);\n\tconst rightSide = rightParts.join(pipeSep);\n\tconst rightSideWidth = visibleWidth(rightSide);\n\n\t// Build left side: stage (if any) + path with branch\n\tconst leftParts: string[] = [];\n\tif (stageLabel) {\n\t\tleftParts.push(renderStaticStageBadge(stageLabel));\n\t}\n\tconst pathFormatted = formatPathWithBranch(\n\t\tcwd,\n\t\tMath.max(20, width - rightSideWidth - 6),\n\t\tbranch,\n\t);\n\tleftParts.push(chalk.hex(themePalette.muted)(pathFormatted));\n\tconst leftSide = leftParts.join(\" \");\n\tconst leftSideWidth = visibleWidth(leftSide);\n\n\tconst totalNeeded = leftSideWidth + MIN_PADDING + rightSideWidth;\n\tif (totalNeeded <= width) {\n\t\tconst padding = \" \".repeat(\n\t\t\tMath.max(MIN_PADDING, width - leftSideWidth - rightSideWidth),\n\t\t);\n\t\treturn `${leftSide}${padding}${rightSide}`;\n\t}\n\n\t// Narrow width: just return what fits\n\tif (width < 60) {\n\t\treturn leftSide;\n\t}\n\n\t// Truncate path to make room\n\tconst availableForPath = Math.max(\n\t\t15,\n\t\twidth - rightSideWidth - MIN_PADDING - (stageLabel ? 15 : 0),\n\t);\n\tconst truncatedPath = formatPathWithBranch(cwd, availableForPath, branch, 15);\n\tconst truncatedLeftParts: string[] = [];\n\tif (stageLabel) {\n\t\ttruncatedLeftParts.push(renderStaticStageBadge(stageLabel));\n\t}\n\ttruncatedLeftParts.push(chalk.hex(themePalette.muted)(truncatedPath));\n\tconst truncatedLeft = truncatedLeftParts.join(\" \");\n\tconst truncatedLeftWidth = visibleWidth(truncatedLeft);\n\tconst padding = \" \".repeat(\n\t\tMath.max(MIN_PADDING, width - truncatedLeftWidth - rightSideWidth),\n\t);\n\treturn `${truncatedLeft}${padding}${rightSide}`;\n}\n\nexport type FooterMode = \"rich\" | \"solo\";\n\nexport interface FooterStats {\n\ttotalInput: number;\n\ttotalOutput: number;\n\ttotalCacheRead: number;\n\ttotalCacheWrite: number;\n\ttotalCost: number;\n\tcontextTokens: number;\n\tcontextWindow: number;\n\tcontextPercent: number;\n}\n\nexport type HintType = \"context\" | \"plan\" | \"queue\" | \"bash\" | \"custom\";\n\nexport interface FooterHint {\n\ttype: HintType;\n\tmessage: string;\n\tpriority: number; // Higher = more important\n}\n\nexport type StageKind = \"thinking\" | \"working\" | \"responding\" | \"dreaming\";\n\n// Static color-coded badges for stages\nconst STAGE_COLORS: Record<StageKind, string> = {\n\tthinking: \"#93c5fd\", // soft blue\n\tworking: \"#fbbf24\", // amber\n\tresponding: \"#7dd3fc\", // sky\n\tdreaming: \"#c084fc\", // violet\n} as const;\n\nexport function formatModelLabel(\n\tstate: Pick<AgentState, \"model\" | \"thinkingLevel\">,\n): string {\n\tconst modelId = state.model?.id ?? \"no-model\";\n\tif (!state.model?.reasoning) {\n\t\treturn modelId;\n\t}\n\tconst thinkingLevel = state.thinkingLevel || \"off\";\n\treturn thinkingLevel === \"off\" ? modelId : `${modelId} • ${thinkingLevel}`;\n}\n\nexport function resolveFooterHint(\n\tstats: FooterStats,\n\texplicitHint?: string | null,\n): string | null {\n\tconst shouldWarn =\n\t\tstats.contextWindow > 0 && stats.contextPercent >= CONTEXT_HINT_THRESHOLD;\n\tif (shouldWarn) {\n\t\treturn `Context ${stats.contextPercent.toFixed(1)}% – run /compact to summarize`;\n\t}\n\treturn explicitHint ?? null;\n}\n\nexport function calculateFooterStats(state: AgentState): FooterStats {\n\tlet totalInput = 0;\n\tlet totalOutput = 0;\n\tlet totalCacheRead = 0;\n\tlet totalCacheWrite = 0;\n\tlet totalCost = 0;\n\n\tfor (const message of state.messages) {\n\t\tif (message.role === \"assistant\") {\n\t\t\tconst assistantMsg = message as AssistantMessage;\n\t\t\tconst usage = normalizeUsage(assistantMsg.usage);\n\t\t\ttotalInput += usage.input;\n\t\t\ttotalOutput += usage.output;\n\t\t\ttotalCacheRead += usage.cacheRead;\n\t\t\ttotalCacheWrite += usage.cacheWrite;\n\t\t\ttotalCost += usage.cost.total;\n\t\t}\n\t}\n\n\tlet lastSuccessfulUsage: Usage | undefined;\n\n\t// Iterate backwards to find the last successful assistant message (anchor)\n\tfor (let i = state.messages.length - 1; i >= 0; i--) {\n\t\tconst msg = state.messages[i];\n\t\tif (!msg) continue;\n\t\tif (msg.role === \"assistant\") {\n\t\t\tconst assistantMsg = msg as AssistantMessage;\n\t\t\tif (\n\t\t\t\tassistantMsg.stopReason !== \"aborted\" &&\n\t\t\t\tassistantMsg.stopReason !== \"error\"\n\t\t\t) {\n\t\t\t\tlastSuccessfulUsage = normalizeUsage(assistantMsg.usage);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Calculate context percentage: last successful turn's total\n\tconst contextTokens = lastSuccessfulUsage\n\t\t? Math.max(\n\t\t\t\t0,\n\t\t\t\tlastSuccessfulUsage.input +\n\t\t\t\t\tlastSuccessfulUsage.cacheRead +\n\t\t\t\t\tlastSuccessfulUsage.output,\n\t\t\t)\n\t\t: 0;\n\n\tconst contextWindow = state.model.contextWindow ?? 0;\n\tconst contextPercent =\n\t\tcontextWindow > 0 ? (contextTokens / contextWindow) * 100 : 0;\n\n\treturn {\n\t\ttotalInput,\n\t\ttotalOutput,\n\t\ttotalCacheRead,\n\t\ttotalCacheWrite,\n\t\ttotalCost,\n\t\tcontextTokens,\n\t\tcontextWindow,\n\t\tcontextPercent,\n\t};\n}\n\nconst ZERO_USAGE: Usage = {\n\tinput: 0,\n\toutput: 0,\n\tcacheRead: 0,\n\tcacheWrite: 0,\n\tcost: {\n\t\tinput: 0,\n\t\toutput: 0,\n\t\tcacheRead: 0,\n\t\tcacheWrite: 0,\n\t\ttotal: 0,\n\t},\n};\n\nexport function normalizeUsage(usage?: Usage): Usage {\n\tif (!usage) {\n\t\treturn ZERO_USAGE;\n\t}\n\treturn {\n\t\tinput: usage.input ?? 0,\n\t\toutput: usage.output ?? 0,\n\t\tcacheRead: usage.cacheRead ?? 0,\n\t\tcacheWrite: usage.cacheWrite ?? 0,\n\t\tcost: {\n\t\t\tinput: usage.cost?.input ?? 0,\n\t\t\toutput: usage.cost?.output ?? 0,\n\t\t\tcacheRead: usage.cost?.cacheRead ?? 0,\n\t\t\tcacheWrite: usage.cost?.cacheWrite ?? 0,\n\t\t\ttotal: usage.cost?.total ?? 0,\n\t\t},\n\t};\n}\n\nexport function formatTokenCount(count: number): string {\n\tif (count < 1000) return count.toString();\n\tif (count < 10000) return `${(count / 1000).toFixed(1)}k`;\n\treturn `${Math.round(count / 1000)}k`;\n}\n\nfunction replaceHomePrefix(path: string, home: string): string {\n\tconst normalizedPath = path.replace(/\\\\/g, \"/\");\n\tconst normalizedHome = home.replace(/\\\\/g, \"/\");\n\tconst normalizeForCompare = (value: string) =>\n\t\tprocess.platform === \"win32\" ? value.toLowerCase() : value;\n\tconst pathCheck = normalizeForCompare(normalizedPath);\n\tconst homeCheck = normalizeForCompare(normalizedHome);\n\tif (pathCheck === homeCheck) {\n\t\treturn \"~\";\n\t}\n\tif (pathCheck.startsWith(`${homeCheck}/`)) {\n\t\treturn `~${normalizedPath.slice(normalizedHome.length)}`;\n\t}\n\treturn path;\n}\n\nexport function formatPath(path: string, width: number, minWidth = 20): string {\n\tconst usableWidth = Math.max(1, Math.floor(width));\n\tconst clampedMinWidth = Math.min(\n\t\tMath.max(1, Math.floor(minWidth)),\n\t\tusableWidth,\n\t);\n\tconst home = getHomeDir();\n\tconst pwd = home ? replaceHomePrefix(path, home) : path;\n\tconst maxPathLength = Math.max(clampedMinWidth, usableWidth - 10);\n\tif (visibleWidth(pwd) <= maxPathLength) {\n\t\treturn pwd;\n\t}\n\tif (maxPathLength <= 3) {\n\t\treturn pwd.slice(0, maxPathLength);\n\t}\n\tconst start = pwd.slice(0, Math.max(0, Math.floor(maxPathLength / 2) - 2));\n\tconst end = pwd.slice(-Math.max(0, Math.floor(maxPathLength / 2) - 1));\n\treturn `${start}...${end}`;\n}\n\n/**\n * Render a static, color-coded stage badge (no shimmer)\n */\nexport function renderStaticStageBadge(label: string): string {\n\tconst trimmed = label.trim();\n\tconst normalized = trimmed.toLowerCase();\n\tif (!normalized) return \"\";\n\n\tconst [firstWord] = normalized.split(/\\s+/u);\n\tlet kind: StageKind | undefined;\n\tswitch (firstWord) {\n\t\tcase \"thinking\":\n\t\t\tkind = \"thinking\";\n\t\t\tbreak;\n\t\tcase \"working\":\n\t\t\tkind = \"working\";\n\t\t\tbreak;\n\t\tcase \"responding\":\n\t\t\tkind = \"responding\";\n\t\t\tbreak;\n\t\tcase \"dreaming\":\n\t\t\tkind = \"dreaming\";\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tkind = undefined;\n\t}\n\n\tconst color = kind ? STAGE_COLORS[kind] : themePalette.muted;\n\tif (kind && shimmerAllowed()) {\n\t\tconst options = STAGE_SHIMMER_OPTIONS[kind];\n\t\tif (options) {\n\t\t\tconst shimmering = shimmerText(trimmed || label, { ...options, time: 0 });\n\t\t\t// Append a concealed plain label so consumers (and tests) can still find the\n\t\t\t// raw text without affecting visible output.\n\t\t\tconst hiddenLabel = `\\u001B[8m${trimmed || label}\\u001B[28m`;\n\t\t\treturn ensureAnsi(shimmering, trimmed || label) + hiddenLabel;\n\t\t}\n\t}\n\treturn chalk.hex(color).bold(trimmed || label);\n}\n\nfunction shimmerAllowed(): boolean {\n\tconst shimmerEnv = (process.env.MAESTRO_TUI_SHIMMER || \"on\").toLowerCase();\n\tif (shimmerEnv === \"off\") return false;\n\tconst noColor = process.env.NO_COLOR ?? \"\";\n\tconst composerNoColor = process.env.MAESTRO_NO_COLOR ?? \"\";\n\tconst isDisabled = (value: string) =>\n\t\tBoolean(\n\t\t\tvalue &&\n\t\t\t\tvalue !== \"0\" &&\n\t\t\t\tvalue.toLowerCase() !== \"false\" &&\n\t\t\t\tvalue.toLowerCase() !== \"undefined\",\n\t\t);\n\tif (isDisabled(noColor) || isDisabled(composerNoColor)) return false;\n\treturn true;\n}\n\nfunction ensureAnsi(rendered: string, fallback: string): string {\n\tif (rendered?.includes(\"\\u001B[\")) {\n\t\treturn rendered;\n\t}\n\t// Add a simple bold ANSI wrap to satisfy \"colored\" expectation\n\treturn `\\u001B[1m\\u001B[35m${rendered || fallback}\\u001B[39m\\u001B[22m`;\n}\n\n/**\n * Render runtime badge with distinct styling (not gray)\n */\nexport function renderRuntimeBadge(badge: string): string {\n\t// Runtime badges like \"queue:all(3)\", \"safe-mode\", etc.\n\t// Use a distinct color to make them stand out\n\treturn chalk.hex(\"#94e2d5\").bold(badge); // mint color for visibility\n}\n\nfunction matchAnsiSequence(\n\tvalue: string,\n\tstartIndex: number,\n): { sequence: string; nextIndex: number } | null {\n\tANSI_ESCAPE_SEQUENCE.lastIndex = startIndex;\n\tconst match = ANSI_ESCAPE_SEQUENCE.exec(value);\n\tif (match && match.index === startIndex) {\n\t\treturn { sequence: match[0], nextIndex: ANSI_ESCAPE_SEQUENCE.lastIndex };\n\t}\n\treturn null;\n}\n\nfunction truncateAnsiToWidth(value: string, maxWidth: number): string {\n\tif (!value || maxWidth <= 0) {\n\t\treturn \"\";\n\t}\n\tif (visibleWidth(value) <= maxWidth) {\n\t\treturn value;\n\t}\n\tlet width = 0;\n\tlet index = 0;\n\tlet result = \"\";\n\twhile (index < value.length && width < maxWidth) {\n\t\tconst ansiMatch = matchAnsiSequence(value, index);\n\t\tif (ansiMatch) {\n\t\t\tresult += ansiMatch.sequence;\n\t\t\tindex = ansiMatch.nextIndex;\n\t\t\tcontinue;\n\t\t}\n\t\tconst codePoint = value.codePointAt(index);\n\t\tif (codePoint === undefined) {\n\t\t\tbreak;\n\t\t}\n\t\tconst char = String.fromCodePoint(codePoint);\n\t\tconst charWidth = visibleWidth(char);\n\t\tif (charWidth === 0) {\n\t\t\tresult += char;\n\t\t\tindex += char.length;\n\t\t\tcontinue;\n\t\t}\n\t\tif (width + charWidth > maxWidth) {\n\t\t\tbreak;\n\t\t}\n\t\twidth += charWidth;\n\t\tresult += char;\n\t\tindex += char.length;\n\t}\n\treturn result;\n}\n\n/**\n * Merge and prioritize multiple hints\n */\nexport function mergeHints(\n\tstats: FooterStats,\n\thints: FooterHint[],\n\twidth: number,\n): string | null {\n\tconst allHints: FooterHint[] = [...hints];\n\n\t// Add context hint if needed\n\tconst shouldWarn =\n\t\tstats.contextWindow > 0 && stats.contextPercent >= CONTEXT_HINT_THRESHOLD;\n\tif (shouldWarn) {\n\t\tallHints.push({\n\t\t\ttype: \"context\",\n\t\t\tmessage: `Context ${stats.contextPercent.toFixed(1)}% – run /compact to summarize`,\n\t\t\tpriority: 100, // High priority\n\t\t});\n\t}\n\n\tif (allHints.length === 0) return null;\n\n\t// Sort by priority (highest first)\n\tallHints.sort((a, b) => b.priority - a.priority);\n\n\t// Try to fit multiple hints with icons\n\tconst hintIcons: Record<HintType, string> = {\n\t\tcontext: \"⚠\",\n\t\tplan: \"📋\",\n\t\tqueue: \"⏳\",\n\t\tbash: \"⚙\",\n\t\tcustom: \"ℹ\",\n\t};\n\n\tconst formatted: string[] = [];\n\tlet currentWidth = 0;\n\n\tfor (const hint of allHints) {\n\t\tconst icon = hintIcons[hint.type];\n\t\tconst text = `${icon} ${hint.message}`;\n\t\tconst textWidth = visibleWidth(text);\n\n\t\tif (formatted.length === 0) {\n\t\t\t// Always include the highest priority hint\n\t\t\tformatted.push(text);\n\t\t\tcurrentWidth = textWidth;\n\t\t} else {\n\t\t\t// Try to add additional hints if they fit\n\t\t\tconst separator = \" \";\n\t\t\tconst needed = currentWidth + visibleWidth(separator) + textWidth;\n\t\t\tif (needed <= width - 10) {\n\t\t\t\t// Leave some margin\n\t\t\t\tformatted.push(text);\n\t\t\t\tcurrentWidth = needed;\n\t\t\t} else {\n\t\t\t\tbreak; // No more space\n\t\t\t}\n\t\t}\n\t}\n\n\treturn formatted.join(\" \");\n}\n\n/**\n * Truncate Model Label to Fit Available Width\n *\n * Progressively removes characters from the end of the model label until\n * it fits within the target width. Uses visible width calculation to\n * correctly handle ANSI escape sequences.\n *\n * ## Why Character-by-Character?\n *\n * We can't simply use String.slice() with a character count because:\n * 1. ANSI codes consume 0 visual width but multiple characters\n * 2. Some Unicode chars (emoji, CJK) consume 2 visual columns\n * 3. We need to preserve styling codes at the beginning\n *\n * The loop approach ensures we stop exactly when we hit the target width.\n *\n * @param label - The model label (may contain ANSI color codes)\n * @param targetWidth - Maximum visual width allowed\n * @returns Truncated label that fits within targetWidth columns\n */\nexport function truncateModelLabel(label: string, targetWidth: number): string {\n\t// Edge case: no space at all\n\tif (targetWidth <= 0) return \"\";\n\t// Fast path: already fits\n\tif (visibleWidth(label) <= targetWidth) {\n\t\treturn label;\n\t}\n\t// Truncate character by character until it fits\n\tlet result = label;\n\twhile (visibleWidth(result) > targetWidth && result.length > 0) {\n\t\tresult = result.slice(0, -1);\n\t}\n\t// Clean up trailing whitespace that may look odd\n\treturn result.trimEnd();\n}\n\n/**\n * Build Stats Line - Priority-based footer layout algorithm\n *\n * Constructs the main stats footer line with adaptive layout that gracefully\n * degrades as terminal width decreases. Uses a priority system to determine\n * what content to show/hide.\n *\n * ## Layout Priority (highest to lowest)\n *\n * 1. **Full layout**: Stats + Model Name + Brand Logo\n * Example: \"▲12K ▼5K ⟲10K $0.05 | 45% claude-sonnet-4.0 ◆ Maestro\"\n *\n * 2. **Drop brand**: Stats + Model Name (brand removed first)\n * Example: \"▲12K ▼5K ⟲10K $0.05 | 45% claude-sonnet-4.0\"\n *\n * 3. **Truncate model**: Stats + Shortened Model Name\n * Example: \"▲12K ▼5K ⟲10K $0.05 | 45% claude-son...\"\n *\n * 4. **Stats only**: Just the usage metrics (very narrow terminals)\n * Example: \"▲12K ▼5K $0.05 | 45%\"\n *\n * ## Stat Components (left side)\n *\n * - ▲ Input tokens (blue) - tokens sent to model\n * - ▼ Output tokens (orange) - tokens generated by model\n * - ⟲ Cache read (cyan) - tokens loaded from cache\n * - ⟳ Cache write (magenta) - tokens written to cache\n * - $ Cost (green) - cumulative API cost\n * - Context badge - context window utilization percentage\n *\n * @param stats - Usage statistics to display\n * @param width - Available terminal width in columns\n * @param state - Agent state for model/thinking level info\n * @returns Formatted footer string with ANSI colors\n */\nexport function buildStatsLine(\n\tstats: FooterStats,\n\twidth: number,\n\tstate: Pick<AgentState, \"model\" | \"thinkingLevel\">,\n): string {\n\t// Build left side: usage statistics\n\tconst statsParts: string[] = [];\n\tif (stats.totalInput)\n\t\tstatsParts.push(\n\t\t\tmetricStat(\n\t\t\t\t\"▲\",\n\t\t\t\tthemePalette.accentCool,\n\t\t\t\tformatTokenCount(stats.totalInput),\n\t\t\t),\n\t\t);\n\tif (stats.totalOutput)\n\t\tstatsParts.push(\n\t\t\tmetricStat(\n\t\t\t\t\"▼\",\n\t\t\t\tthemePalette.accentWarm,\n\t\t\t\tformatTokenCount(stats.totalOutput),\n\t\t\t),\n\t\t);\n\tif (stats.totalCacheRead)\n\t\tstatsParts.push(\n\t\t\tmetricStat(\n\t\t\t\t\"⟲\",\n\t\t\t\tthemePalette.cacheRead,\n\t\t\t\tformatTokenCount(stats.totalCacheRead),\n\t\t\t),\n\t\t);\n\tif (stats.totalCacheWrite)\n\t\tstatsParts.push(\n\t\t\tmetricStat(\n\t\t\t\t\"⟳\",\n\t\t\t\tthemePalette.cacheWrite,\n\t\t\t\tformatTokenCount(stats.totalCacheWrite),\n\t\t\t),\n\t\t);\n\tif (stats.totalCost)\n\t\tstatsParts.push(\n\t\t\t`${chalk.hex(themePalette.cost)(\"$\")}${chalk\n\t\t\t\t.hex(themePalette.metric)\n\t\t\t\t.bold(stats.totalCost.toFixed(3))}`,\n\t\t);\n\n\t// Context badge always shown (critical for user awareness)\n\tstatsParts.push(buildContextBadge(stats));\n\tconst separator = themedSeparator();\n\tconst statsLeft = statsParts.join(separator);\n\n\t// Build right side: model label + brand\n\tconst modelLabel = formatModelLabel(state);\n\tconst { toned, brand: composerBrand } = composeBrandLabel(modelLabel);\n\n\tconst statsLeftWidth = visibleWidth(statsLeft);\n\n\t// ═══════════════════════════════════════════════════════════════════════\n\t// Priority-based layout: try each configuration until one fits\n\t// ═══════════════════════════════════════════════════════════════════════\n\n\t// Priority 1: Full layout (stats + model + brand)\n\tlet rightSide = `${toned} ${composerBrand}`;\n\tlet rightWidth = visibleWidth(rightSide);\n\tlet totalNeeded = statsLeftWidth + MIN_PADDING + rightWidth;\n\n\tif (totalNeeded <= width) {\n\t\t// Everything fits!\n\t\tconst padding = \" \".repeat(\n\t\t\tMath.max(0, width - statsLeftWidth - rightWidth),\n\t\t);\n\t\treturn statsLeft + padding + rightSide;\n\t}\n\n\t// Priority 2: stats + model (drop brand to preserve model label)\n\trightSide = toned;\n\trightWidth = visibleWidth(rightSide);\n\ttotalNeeded = statsLeftWidth + MIN_PADDING + rightWidth;\n\n\tif (totalNeeded <= width) {\n\t\tconst padding = \" \".repeat(\n\t\t\tMath.max(0, width - statsLeftWidth - rightWidth),\n\t\t);\n\t\treturn statsLeft + padding + rightSide;\n\t}\n\n\t// Priority 3: stats + truncated model (still no brand)\n\tconst availableForModel = width - statsLeftWidth - MIN_PADDING;\n\tif (availableForModel > MIN_MODEL_LABEL_CHARS) {\n\t\tconst truncated = truncateModelLabel(modelLabel, availableForModel);\n\t\tconst tonedTruncated = chalk.hex(themePalette.model)(truncated);\n\t\tconst padding = \" \".repeat(\n\t\t\tMath.max(0, width - statsLeftWidth - visibleWidth(tonedTruncated)),\n\t\t);\n\t\treturn statsLeft + padding + tonedTruncated;\n\t}\n\n\t// Priority 4: stats only (model doesn't fit)\n\treturn statsLeft;\n}\n\nexport function buildSoloStatsLine(\n\tstats: FooterStats,\n\twidth: number,\n\tstate: Pick<AgentState, \"model\" | \"thinkingLevel\">,\n): string {\n\tconst statsParts: string[] = [];\n\tif (stats.totalInput)\n\t\tstatsParts.push(`↑${formatTokenCount(stats.totalInput)}`);\n\tif (stats.totalOutput)\n\t\tstatsParts.push(`↓${formatTokenCount(stats.totalOutput)}`);\n\tif (stats.totalCacheRead)\n\t\tstatsParts.push(`R${formatTokenCount(stats.totalCacheRead)}`);\n\tif (stats.totalCacheWrite)\n\t\tstatsParts.push(`W${formatTokenCount(stats.totalCacheWrite)}`);\n\tif (stats.totalCost) statsParts.push(`$${stats.totalCost.toFixed(3)}`);\n\n\tconst contextValue = Number.isFinite(stats.contextPercent)\n\t\t? stats.contextPercent\n\t\t: 0;\n\tstatsParts.push(colorizeContextPercent(contextValue));\n\tconst statsLeft = statsParts.join(\" \");\n\tconst rightSide = formatModelLabel(state);\n\tif (!rightSide) {\n\t\treturn statsLeft;\n\t}\n\tconst statsLeftWidth = visibleWidth(statsLeft);\n\tconst rightWidth = visibleWidth(rightSide);\n\tconst totalNeeded = statsLeftWidth + MIN_PADDING + rightWidth;\n\n\tif (totalNeeded <= width) {\n\t\tconst padding = \" \".repeat(\n\t\t\tMath.max(MIN_PADDING, width - statsLeftWidth - rightWidth),\n\t\t);\n\t\treturn statsLeft + padding + rightSide;\n\t}\n\n\tconst availableForRight = width - statsLeftWidth - MIN_PADDING;\n\tif (availableForRight > MIN_MODEL_LABEL_CHARS) {\n\t\tconst truncated = truncateModelLabel(rightSide, availableForRight);\n\t\tconst padding = \" \".repeat(\n\t\t\tMath.max(MIN_PADDING, width - statsLeftWidth - visibleWidth(truncated)),\n\t\t);\n\t\treturn statsLeft + padding + truncated;\n\t}\n\treturn statsLeft;\n}\n\n/**\n * Build a 2-zone footer layout for badges + cwd path\n */\nexport function buildBadgeAndPathLine(\n\tcwd: string,\n\tstageLabel: string | null,\n\truntimeBadges: string[],\n\twidth: number,\n\tbranch: string | null = null,\n): string {\n\tif (width < 40) {\n\t\treturn chalk.gray(formatPathWithBranch(cwd, width, branch));\n\t}\n\n\tconst badgesBudget = Math.max(\n\t\tBADGE_ZONE_MIN_WIDTH,\n\t\tMath.floor(width * BADGE_ZONE_PERCENT),\n\t);\n\tconst badgeParts: string[] = [];\n\tif (stageLabel) {\n\t\tbadgeParts.push(renderStaticStageBadge(stageLabel));\n\t}\n\tfor (const rb of runtimeBadges) {\n\t\tbadgeParts.push(renderRuntimeBadge(rb));\n\t}\n\tconst badgeZone = formatBadgeZone(badgeParts, badgesBudget);\n\tconst hasBadges = badgeZone.length > 0;\n\tconst separator = hasBadges ? \" \" : \"\";\n\tconst badgeZoneWidth = hasBadges ? visibleWidth(badgeZone) : 0;\n\tconst separatorWidth = hasBadges ? visibleWidth(separator) : 0;\n\tconst availableForPath = Math.max(0, width - badgeZoneWidth - separatorWidth);\n\tconst desiredPathWidth = Math.max(PATH_ZONE_MIN_WIDTH, width - badgesBudget);\n\tconst pathBudget = Math.min(desiredPathWidth, availableForPath);\n\tif (pathBudget <= 0) {\n\t\treturn badgeZone;\n\t}\n\tconst minPathWidth = Math.min(PATH_ZONE_MIN_WIDTH, pathBudget);\n\tconst pathFormatted = formatPathWithBranch(\n\t\tcwd,\n\t\tpathBudget,\n\t\tbranch,\n\t\tminPathWidth,\n\t);\n\tconst pathZone = chalk.gray(pathFormatted);\n\treturn `${badgeZone}${separator}${pathZone}`;\n}\n\nfunction formatBadgeZone(badgeParts: string[], budget: number): string {\n\tif (badgeParts.length === 0 || budget <= 0) {\n\t\treturn \"\";\n\t}\n\tconst joined = badgeParts.join(\" \");\n\tif (visibleWidth(joined) <= budget) {\n\t\treturn joined;\n\t}\n\tif (budget <= 1) {\n\t\treturn TRUNCATION_ELLIPSIS.slice(0, budget);\n\t}\n\tconst truncated = truncateAnsiToWidth(\n\t\tjoined,\n\t\tMath.max(0, budget - 1),\n\t).trimEnd();\n\tif (!truncated) {\n\t\treturn TRUNCATION_ELLIPSIS;\n\t}\n\treturn `${truncated}${TRUNCATION_ELLIPSIS}`;\n}\n\n/**\n * Format path with optional git branch suffix.\n * Example: \"~/project (main)\"\n */\nexport function formatPathWithBranch(\n\tpath: string,\n\twidth: number,\n\tbranch: string | null,\n\tminWidth = 20,\n): string {\n\tconst home = getHomeDir();\n\tlet pwd = home ? replaceHomePrefix(path, home) : path;\n\n\t// Add branch suffix if available\n\tif (branch) {\n\t\tpwd = `${pwd} (${branch})`;\n\t}\n\n\tconst usableWidth = Math.max(1, Math.floor(width));\n\tconst clampedMinWidth = Math.min(\n\t\tMath.max(1, Math.floor(minWidth)),\n\t\tusableWidth,\n\t);\n\tconst maxPathLength = Math.max(clampedMinWidth, usableWidth - 10);\n\n\tif (visibleWidth(pwd) <= maxPathLength) {\n\t\treturn pwd;\n\t}\n\n\tif (maxPathLength <= 3) {\n\t\treturn pwd.slice(0, maxPathLength);\n\t}\n\n\tconst start = pwd.slice(0, Math.max(0, Math.floor(maxPathLength / 2) - 2));\n\tconst end = pwd.slice(-Math.max(0, Math.floor(maxPathLength / 2) - 1));\n\treturn `${start}...${end}`;\n}\n"]}