@caupulican/pi-adaptative 0.90.7 → 0.90.12

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 (224) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/dist/bundled-resources/skills/tool-call-repair/SKILL.md +5 -4
  3. package/dist/bundled-resources/skills/tool-call-repair/references/failure-grammar.md +6 -3
  4. package/dist/bundled-resources/skills/tool-call-repair/references/repair-catalogue.md +1 -0
  5. package/dist/core/agent-session-contracts.d.ts +2 -0
  6. package/dist/core/agent-session-contracts.d.ts.map +1 -1
  7. package/dist/core/agent-session-contracts.js.map +1 -1
  8. package/dist/core/agent-session.d.ts +8 -7
  9. package/dist/core/agent-session.d.ts.map +1 -1
  10. package/dist/core/agent-session.js +84 -197
  11. package/dist/core/agent-session.js.map +1 -1
  12. package/dist/core/autonomy/bounded-completion.d.ts +7 -1
  13. package/dist/core/autonomy/bounded-completion.d.ts.map +1 -1
  14. package/dist/core/autonomy/bounded-completion.js +8 -2
  15. package/dist/core/autonomy/bounded-completion.js.map +1 -1
  16. package/dist/core/autonomy/contracts.d.ts +1 -1
  17. package/dist/core/autonomy/contracts.d.ts.map +1 -1
  18. package/dist/core/autonomy/contracts.js.map +1 -1
  19. package/dist/core/background-lane-controller.d.ts +14 -0
  20. package/dist/core/background-lane-controller.d.ts.map +1 -1
  21. package/dist/core/background-lane-controller.js +32 -0
  22. package/dist/core/background-lane-controller.js.map +1 -1
  23. package/dist/core/billing-failover-controller.js +1 -1
  24. package/dist/core/billing-failover-controller.js.map +1 -1
  25. package/dist/core/context/current-work-memory.d.ts +1 -1
  26. package/dist/core/context/current-work-memory.d.ts.map +1 -1
  27. package/dist/core/context/current-work-memory.js +2 -1
  28. package/dist/core/context/current-work-memory.js.map +1 -1
  29. package/dist/core/context/long-term-memory-trigger.d.ts +1 -1
  30. package/dist/core/context/long-term-memory-trigger.d.ts.map +1 -1
  31. package/dist/core/context/long-term-memory-trigger.js +2 -1
  32. package/dist/core/context/long-term-memory-trigger.js.map +1 -1
  33. package/dist/core/delegation/managed-lane-controller.js +2 -2
  34. package/dist/core/delegation/managed-lane-controller.js.map +1 -1
  35. package/dist/core/delegation/worker-agent-control-coordinator.d.ts +13 -0
  36. package/dist/core/delegation/worker-agent-control-coordinator.d.ts.map +1 -1
  37. package/dist/core/delegation/worker-agent-control-coordinator.js +71 -8
  38. package/dist/core/delegation/worker-agent-control-coordinator.js.map +1 -1
  39. package/dist/core/delegation/worker-attempt-executor.d.ts.map +1 -1
  40. package/dist/core/delegation/worker-attempt-executor.js +13 -8
  41. package/dist/core/delegation/worker-attempt-executor.js.map +1 -1
  42. package/dist/core/delegation/worker-claim.d.ts.map +1 -1
  43. package/dist/core/delegation/worker-claim.js +14 -1
  44. package/dist/core/delegation/worker-claim.js.map +1 -1
  45. package/dist/core/delegation/worker-delegation-controller.d.ts +3 -2
  46. package/dist/core/delegation/worker-delegation-controller.d.ts.map +1 -1
  47. package/dist/core/delegation/worker-delegation-controller.js +95 -42
  48. package/dist/core/delegation/worker-delegation-controller.js.map +1 -1
  49. package/dist/core/delegation/worker-fleet-limits.d.ts.map +1 -1
  50. package/dist/core/delegation/worker-fleet-limits.js +5 -1
  51. package/dist/core/delegation/worker-fleet-limits.js.map +1 -1
  52. package/dist/core/delegation/worker-lane-projection.d.ts.map +1 -1
  53. package/dist/core/delegation/worker-lane-projection.js +7 -4
  54. package/dist/core/delegation/worker-lane-projection.js.map +1 -1
  55. package/dist/core/delegation/worker-lifecycle.d.ts +8 -0
  56. package/dist/core/delegation/worker-lifecycle.d.ts.map +1 -1
  57. package/dist/core/delegation/worker-lifecycle.js.map +1 -1
  58. package/dist/core/delegation/worker-notification-coordinator.d.ts +21 -0
  59. package/dist/core/delegation/worker-notification-coordinator.d.ts.map +1 -1
  60. package/dist/core/delegation/worker-notification-coordinator.js +65 -2
  61. package/dist/core/delegation/worker-notification-coordinator.js.map +1 -1
  62. package/dist/core/delegation/worker-runner.d.ts +7 -0
  63. package/dist/core/delegation/worker-runner.d.ts.map +1 -1
  64. package/dist/core/delegation/worker-runner.js +24 -7
  65. package/dist/core/delegation/worker-runner.js.map +1 -1
  66. package/dist/core/delegation/worker-system-prompt.d.ts +54 -0
  67. package/dist/core/delegation/worker-system-prompt.d.ts.map +1 -0
  68. package/dist/core/delegation/worker-system-prompt.js +85 -0
  69. package/dist/core/delegation/worker-system-prompt.js.map +1 -0
  70. package/dist/core/delegation/worker-tree-budget-coordinator.d.ts.map +1 -1
  71. package/dist/core/delegation/worker-tree-budget-coordinator.js +4 -0
  72. package/dist/core/delegation/worker-tree-budget-coordinator.js.map +1 -1
  73. package/dist/core/delegation/worker-write-reservation-coordinator.d.ts +4 -0
  74. package/dist/core/delegation/worker-write-reservation-coordinator.d.ts.map +1 -1
  75. package/dist/core/delegation/worker-write-reservation-coordinator.js +28 -1
  76. package/dist/core/delegation/worker-write-reservation-coordinator.js.map +1 -1
  77. package/dist/core/durable-custom-message-turn-controller.d.ts.map +1 -1
  78. package/dist/core/durable-custom-message-turn-controller.js +14 -3
  79. package/dist/core/durable-custom-message-turn-controller.js.map +1 -1
  80. package/dist/core/extension-binding-controller.d.ts +107 -0
  81. package/dist/core/extension-binding-controller.d.ts.map +1 -0
  82. package/dist/core/extension-binding-controller.js +224 -0
  83. package/dist/core/extension-binding-controller.js.map +1 -0
  84. package/dist/core/extensions/extension-session-scope.d.ts +17 -0
  85. package/dist/core/extensions/extension-session-scope.d.ts.map +1 -0
  86. package/dist/core/extensions/extension-session-scope.js +135 -0
  87. package/dist/core/extensions/extension-session-scope.js.map +1 -0
  88. package/dist/core/extensions/index.d.ts +1 -0
  89. package/dist/core/extensions/index.d.ts.map +1 -1
  90. package/dist/core/extensions/index.js +1 -0
  91. package/dist/core/extensions/index.js.map +1 -1
  92. package/dist/core/extensions/types.d.ts +2 -0
  93. package/dist/core/extensions/types.d.ts.map +1 -1
  94. package/dist/core/extensions/types.js.map +1 -1
  95. package/dist/core/extensions/wrapper.d.ts +2 -1
  96. package/dist/core/extensions/wrapper.d.ts.map +1 -1
  97. package/dist/core/extensions/wrapper.js +10 -4
  98. package/dist/core/extensions/wrapper.js.map +1 -1
  99. package/dist/core/foreground-terminal-handoff-controller.d.ts +9 -0
  100. package/dist/core/foreground-terminal-handoff-controller.d.ts.map +1 -1
  101. package/dist/core/foreground-terminal-handoff-controller.js +35 -9
  102. package/dist/core/foreground-terminal-handoff-controller.js.map +1 -1
  103. package/dist/core/goal-loop-controller.d.ts.map +1 -1
  104. package/dist/core/goal-loop-controller.js +10 -1
  105. package/dist/core/goal-loop-controller.js.map +1 -1
  106. package/dist/core/goals/compact-goal-context.d.ts +1 -1
  107. package/dist/core/goals/compact-goal-context.d.ts.map +1 -1
  108. package/dist/core/goals/compact-goal-context.js +2 -1
  109. package/dist/core/goals/compact-goal-context.js.map +1 -1
  110. package/dist/core/goals/goal-execution-errors.d.ts +18 -0
  111. package/dist/core/goals/goal-execution-errors.d.ts.map +1 -0
  112. package/dist/core/goals/goal-execution-errors.js +21 -0
  113. package/dist/core/goals/goal-execution-errors.js.map +1 -0
  114. package/dist/core/goals/goal-lifecycle.d.ts.map +1 -1
  115. package/dist/core/goals/goal-lifecycle.js +3 -3
  116. package/dist/core/goals/goal-lifecycle.js.map +1 -1
  117. package/dist/core/goals/goal-session-controller.d.ts +11 -0
  118. package/dist/core/goals/goal-session-controller.d.ts.map +1 -1
  119. package/dist/core/goals/goal-session-controller.js +74 -14
  120. package/dist/core/goals/goal-session-controller.js.map +1 -1
  121. package/dist/core/goals/goal-state.js +1 -1
  122. package/dist/core/goals/goal-state.js.map +1 -1
  123. package/dist/core/goals/goal-tool-core.d.ts.map +1 -1
  124. package/dist/core/goals/goal-tool-core.js +2 -2
  125. package/dist/core/goals/goal-tool-core.js.map +1 -1
  126. package/dist/core/goals/natural-language-goal.d.ts +18 -0
  127. package/dist/core/goals/natural-language-goal.d.ts.map +1 -1
  128. package/dist/core/goals/natural-language-goal.js +99 -16
  129. package/dist/core/goals/natural-language-goal.js.map +1 -1
  130. package/dist/core/model-registry.d.ts +5 -0
  131. package/dist/core/model-registry.d.ts.map +1 -1
  132. package/dist/core/model-registry.js +10 -0
  133. package/dist/core/model-registry.js.map +1 -1
  134. package/dist/core/model-resolver.d.ts.map +1 -1
  135. package/dist/core/model-resolver.js +3 -1
  136. package/dist/core/model-resolver.js.map +1 -1
  137. package/dist/core/orchestration/capability-gateway.d.ts +1 -1
  138. package/dist/core/orchestration/capability-gateway.d.ts.map +1 -1
  139. package/dist/core/orchestration/capability-gateway.js +4 -4
  140. package/dist/core/orchestration/capability-gateway.js.map +1 -1
  141. package/dist/core/orchestration/event-store.d.ts +8 -0
  142. package/dist/core/orchestration/event-store.d.ts.map +1 -1
  143. package/dist/core/orchestration/event-store.js +9 -7
  144. package/dist/core/orchestration/event-store.js.map +1 -1
  145. package/dist/core/orchestration/task-runtime-reducer.js +1 -1
  146. package/dist/core/orchestration/task-runtime-reducer.js.map +1 -1
  147. package/dist/core/orchestration/worker-model-pins.d.ts +7 -0
  148. package/dist/core/orchestration/worker-model-pins.d.ts.map +1 -1
  149. package/dist/core/orchestration/worker-model-pins.js +17 -1
  150. package/dist/core/orchestration/worker-model-pins.js.map +1 -1
  151. package/dist/core/provider-request-runtime-controller.d.ts +9 -0
  152. package/dist/core/provider-request-runtime-controller.d.ts.map +1 -1
  153. package/dist/core/provider-request-runtime-controller.js +17 -3
  154. package/dist/core/provider-request-runtime-controller.js.map +1 -1
  155. package/dist/core/provider-tool-text.d.ts +15 -1
  156. package/dist/core/provider-tool-text.d.ts.map +1 -1
  157. package/dist/core/provider-tool-text.js +42 -10
  158. package/dist/core/provider-tool-text.js.map +1 -1
  159. package/dist/core/research/research-lane-controller.d.ts +1 -1
  160. package/dist/core/research/research-lane-controller.d.ts.map +1 -1
  161. package/dist/core/research/research-lane-controller.js +2 -1
  162. package/dist/core/research/research-lane-controller.js.map +1 -1
  163. package/dist/core/resource-loader.d.ts +3 -0
  164. package/dist/core/resource-loader.d.ts.map +1 -1
  165. package/dist/core/resource-loader.js +8 -0
  166. package/dist/core/resource-loader.js.map +1 -1
  167. package/dist/core/runtime-builder.d.ts +8 -0
  168. package/dist/core/runtime-builder.d.ts.map +1 -1
  169. package/dist/core/runtime-builder.js +6 -0
  170. package/dist/core/runtime-builder.js.map +1 -1
  171. package/dist/core/session-supervision-runtime.d.ts.map +1 -1
  172. package/dist/core/session-supervision-runtime.js +2 -1
  173. package/dist/core/session-supervision-runtime.js.map +1 -1
  174. package/dist/core/settings-manager.d.ts +2 -2
  175. package/dist/core/settings-manager.d.ts.map +1 -1
  176. package/dist/core/settings-manager.js +7 -2
  177. package/dist/core/settings-manager.js.map +1 -1
  178. package/dist/core/tasks/task-state.d.ts +1 -1
  179. package/dist/core/tasks/task-state.d.ts.map +1 -1
  180. package/dist/core/tasks/task-state.js +4 -2
  181. package/dist/core/tasks/task-state.js.map +1 -1
  182. package/dist/core/tools/delegate.d.ts +13 -0
  183. package/dist/core/tools/delegate.d.ts.map +1 -1
  184. package/dist/core/tools/delegate.js +20 -18
  185. package/dist/core/tools/delegate.js.map +1 -1
  186. package/dist/core/util/atomic-file.d.ts +7 -0
  187. package/dist/core/util/atomic-file.d.ts.map +1 -1
  188. package/dist/core/util/atomic-file.js +8 -6
  189. package/dist/core/util/atomic-file.js.map +1 -1
  190. package/dist/core/util/faultable-fs.d.ts +30 -0
  191. package/dist/core/util/faultable-fs.d.ts.map +1 -0
  192. package/dist/core/util/faultable-fs.js +30 -0
  193. package/dist/core/util/faultable-fs.js.map +1 -0
  194. package/dist/modes/interactive/auth-dialogs-controller.d.ts.map +1 -1
  195. package/dist/modes/interactive/auth-dialogs-controller.js +1 -0
  196. package/dist/modes/interactive/auth-dialogs-controller.js.map +1 -1
  197. package/dist/modes/interactive/components/activity-lane.d.ts.map +1 -1
  198. package/dist/modes/interactive/components/activity-lane.js +4 -3
  199. package/dist/modes/interactive/components/activity-lane.js.map +1 -1
  200. package/dist/modes/interactive/components/footer.js +1 -1
  201. package/dist/modes/interactive/components/footer.js.map +1 -1
  202. package/dist/modes/interactive/components/oauth-selector.d.ts +2 -0
  203. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  204. package/dist/modes/interactive/components/oauth-selector.js +3 -2
  205. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  206. package/dist/modes/interactive/report-commands.js +1 -1
  207. package/dist/modes/interactive/report-commands.js.map +1 -1
  208. package/dist/modes/interactive/session-flow-commands.d.ts +1 -1
  209. package/dist/modes/interactive/session-flow-commands.d.ts.map +1 -1
  210. package/dist/modes/interactive/session-flow-commands.js +3 -2
  211. package/dist/modes/interactive/session-flow-commands.js.map +1 -1
  212. package/docs/extensions.md +1 -0
  213. package/docs/providers.md +3 -0
  214. package/docs/settings.md +4 -2
  215. package/docs/tool-repair.md +1 -0
  216. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  217. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  218. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  219. package/examples/extensions/sandbox/package-lock.json +2 -2
  220. package/examples/extensions/sandbox/package.json +1 -1
  221. package/examples/extensions/with-deps/package-lock.json +2 -2
  222. package/examples/extensions/with-deps/package.json +1 -1
  223. package/npm-shrinkwrap.json +12 -12
  224. package/package.json +9 -4
@@ -1 +1 @@
1
- {"version":3,"file":"activity-lane.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/activity-lane.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Component } from \"@caupulican/pi-tui\";\nimport { truncateToWidth, visibleWidth } from \"@caupulican/pi-tui\";\nimport type { LaneRecord } from \"../../../core/autonomy/lane-tracker.ts\";\nimport { type GoalState, isGoalUnfinishedStatus } from \"../../../core/goals/goal-state.ts\";\nimport type { TaskStep, TaskStepsState } from \"../../../core/tasks/task-state.ts\";\nimport type { Theme, ThemeColor } from \"../theme/theme.ts\";\n\nexport type ActivityLaneKind = \"runtime\" | \"tool\" | \"task\" | \"worker\" | \"goal\" | \"queue\" | \"notice\";\nexport type ActivityLaneStatus = \"active\" | \"waiting\" | \"success\" | \"warning\" | \"failure\" | \"neutral\";\n\nexport interface ActivityLaneItem {\n\tid: string;\n\tkind: ActivityLaneKind;\n\tlabel: string;\n\tstatus: ActivityLaneStatus;\n\t/** Short aggregation key (e.g. \"bash\", \"python\", \"agent\") for the concurrency slot. */\n\ttag?: string;\n}\n\nexport interface ActivityLaneCanonicalSnapshot {\n\tgoalState?: GoalState;\n\ttaskState?: TaskStepsState;\n\tlaneRecords: readonly LaneRecord[];\n}\n\nexport interface ActivityLaneProjection {\n\tactive: ActivityLaneItem[];\n\tterminal: ActivityLaneItem[];\n}\n\nconst DEFAULT_TERMINAL_HOLD_MS = 2_000;\nconst MAX_ACTIVITY_LABEL_LENGTH = 240;\nconst MAX_SEEN_TERMINALS = 512;\n\nexport const BACKGROUND_TOOL_ACTIVITY_ID_PREFIX = \"background-tool:\";\n\nexport function backgroundToolActivityId(taskId: string): string {\n\treturn `${BACKGROUND_TOOL_ACTIVITY_ID_PREFIX}${taskId}`;\n}\n\nexport function isBackgroundToolActivityItem(item: Pick<ActivityLaneItem, \"id\" | \"kind\">): boolean {\n\treturn item.kind === \"tool\" && item.id.startsWith(BACKGROUND_TOOL_ACTIVITY_ID_PREFIX);\n}\n\nconst STATUS_COLORS: Record<ActivityLaneStatus, ThemeColor> = {\n\tactive: \"muted\",\n\twaiting: \"warning\",\n\tsuccess: \"success\",\n\twarning: \"warning\",\n\tfailure: \"error\",\n\tneutral: \"muted\",\n};\n\nfunction boundedLabel(value: string): string {\n\tconst normalized = value.replace(/\\s+/g, \" \").trim();\n\treturn normalized.length <= MAX_ACTIVITY_LABEL_LENGTH\n\t\t? normalized\n\t\t: `${normalized.slice(0, MAX_ACTIVITY_LABEL_LENGTH - 1)}…`;\n}\n\nfunction taskLabel(step: TaskStep, state: TaskStepsState): string {\n\tconst total = state.steps.length + state.archive.completed + state.archive.cancelled;\n\tconst activeIndex = state.steps.findIndex((candidate) => candidate.id === step.id);\n\tconst archived = state.archive.completed + state.archive.cancelled;\n\tconst position = Math.min(total, archived + Math.max(0, activeIndex) + 1);\n\tconst prefix = step.status === \"blocked\" ? \"Blocked\" : step.status === \"pending\" ? \"Next\" : \"Step\";\n\tconst content = step.status === \"in_progress\" ? (step.activeForm ?? step.content) : step.content;\n\treturn boundedLabel(`${prefix} ${position}/${total} · ${content}`);\n}\n\nfunction projectTaskState(state: TaskStepsState | undefined): ActivityLaneProjection {\n\tif (!state) return { active: [], terminal: [] };\n\tconst inProgress = state.steps.find((step) => step.status === \"in_progress\");\n\tconst blocked = state.steps.find((step) => step.status === \"blocked\");\n\tconst pending = state.steps.find((step) => step.status === \"pending\");\n\tconst current = inProgress ?? blocked ?? pending;\n\tconst active = current\n\t\t? [\n\t\t\t\t{\n\t\t\t\t\tid: `task:${current.id}`,\n\t\t\t\t\tkind: \"task\" as const,\n\t\t\t\t\tlabel: taskLabel(current, state),\n\t\t\t\t\tstatus: current.status === \"blocked\" ? (\"waiting\" as const) : (\"active\" as const),\n\t\t\t\t},\n\t\t\t]\n\t\t: [];\n\tconst terminal = state.steps\n\t\t.filter((step) => step.status === \"completed\" || step.status === \"cancelled\")\n\t\t.map(\n\t\t\t(step): ActivityLaneItem => ({\n\t\t\t\tid: `terminal:task:${step.id}:${step.status}:${step.updatedAt}`,\n\t\t\t\tkind: \"task\",\n\t\t\t\tlabel: boundedLabel(\n\t\t\t\t\tstep.status === \"completed\" ? `Completed · ${step.content}` : `Cancelled · ${step.content}`,\n\t\t\t\t),\n\t\t\t\tstatus: step.status === \"completed\" ? \"success\" : \"neutral\",\n\t\t\t}),\n\t\t);\n\treturn { active, terminal };\n}\n\nfunction projectGoalState(state: GoalState | undefined): ActivityLaneProjection {\n\tif (!state) return { active: [], terminal: [] };\n\tconst satisfied = state.requirements.filter((requirement) => requirement.status === \"satisfied\").length;\n\tconst progress = state.requirements.length > 0 ? ` ${satisfied}/${state.requirements.length}` : \"\";\n\tif (isGoalUnfinishedStatus(state.status)) {\n\t\tconst stopped = state.status === \"active\" ? \"\" : ` ${state.status.replace(\"_\", \" \")}`;\n\t\treturn {\n\t\t\tactive: [\n\t\t\t\t{\n\t\t\t\t\tid: `goal:${state.goalId}`,\n\t\t\t\t\tkind: \"goal\",\n\t\t\t\t\tlabel: boundedLabel(`Goal${stopped}${progress} · ${state.userGoal}`),\n\t\t\t\t\tstatus: state.status === \"active\" ? \"active\" : \"waiting\",\n\t\t\t\t},\n\t\t\t],\n\t\t\tterminal: [],\n\t\t};\n\t}\n\treturn {\n\t\tactive: [],\n\t\tterminal: [\n\t\t\t{\n\t\t\t\tid: `terminal:goal:${state.goalId}:${state.status}:${state.updatedAt}`,\n\t\t\t\tkind: \"goal\",\n\t\t\t\tlabel: state.status === \"completed\" ? \"Goal achieved\" : \"Goal closed\",\n\t\t\t\tstatus: state.status === \"completed\" ? \"success\" : \"neutral\",\n\t\t\t},\n\t\t],\n\t};\n}\n\nfunction laneLabel(record: LaneRecord): string {\n\tconst runtime = record.type === \"tmux-worker\" ? \"tmux\" : \"agent\";\n\tconst label = record.label ?? record.laneId;\n\treturn boundedLabel(`${runtime} · ${label}`);\n}\n\nfunction projectLaneRecords(records: readonly LaneRecord[]): ActivityLaneProjection {\n\tconst workers = records.filter((record) => record.type === \"worker\" || record.type === \"tmux-worker\");\n\tconst active = workers\n\t\t.filter((record) => record.status === \"queued\" || record.status === \"running\")\n\t\t.map(\n\t\t\t(record): ActivityLaneItem => ({\n\t\t\t\tid: `worker:${record.laneId}`,\n\t\t\t\tkind: \"worker\",\n\t\t\t\tlabel: laneLabel(record),\n\t\t\t\tstatus: record.status === \"queued\" ? \"waiting\" : \"active\",\n\t\t\t\ttag: record.type === \"tmux-worker\" ? \"tmux\" : \"agent\",\n\t\t\t}),\n\t\t);\n\tconst terminal = workers\n\t\t.filter(\n\t\t\t(record) =>\n\t\t\t\trecord.status === \"succeeded\" ||\n\t\t\t\trecord.status === \"partial\" ||\n\t\t\t\trecord.status === \"blocked\" ||\n\t\t\t\trecord.status === \"failed\" ||\n\t\t\t\trecord.status === \"timeout\" ||\n\t\t\t\trecord.status === \"budget_exhausted\" ||\n\t\t\t\trecord.status === \"canceled\",\n\t\t)\n\t\t.map(\n\t\t\t(record): ActivityLaneItem => ({\n\t\t\t\tid: `terminal:worker:${record.laneId}:${record.status}:${record.completedAt ?? \"unknown\"}`,\n\t\t\t\tkind: \"worker\",\n\t\t\t\tlabel: boundedLabel(\n\t\t\t\t\t`${record.status === \"succeeded\" ? \"Finished\" : record.status} · ${record.label ?? record.laneId}`,\n\t\t\t\t),\n\t\t\t\tstatus:\n\t\t\t\t\trecord.status === \"succeeded\"\n\t\t\t\t\t\t? \"success\"\n\t\t\t\t\t\t: record.status === \"partial\" || record.status === \"blocked\"\n\t\t\t\t\t\t\t? \"warning\"\n\t\t\t\t\t\t\t: record.status === \"canceled\"\n\t\t\t\t\t\t\t\t? \"neutral\"\n\t\t\t\t\t\t\t\t: \"failure\",\n\t\t\t}),\n\t\t);\n\treturn { active, terminal };\n}\n\nexport function projectActivityLane(snapshot: ActivityLaneCanonicalSnapshot): ActivityLaneProjection {\n\tconst task = projectTaskState(snapshot.taskState);\n\tconst lanes = projectLaneRecords(snapshot.laneRecords);\n\tconst goal = projectGoalState(snapshot.goalState);\n\treturn {\n\t\tactive: [...task.active, ...lanes.active, ...goal.active],\n\t\tterminal: [...task.terminal, ...lanes.terminal, ...goal.terminal],\n\t};\n}\n\n/**\n * Slot layout. One row, fixed slot order and anchors, left to right by stability:\n *\n * ● working Step 2/5 · Confirming duplicate-charge risk 2 bash Queued 1 ● Read finished\n * turn plan (only elastic slot) concurrency/queue last event\n *\n * Only the plan slot truncates. When width runs out, whole slots drop right-to-left\n * (event, then concurrency) so surviving slots never shift position mid-turn.\n * Color carries status only; labels stay in the text/muted hierarchy.\n */\nconst TURN_TEXT_MAX = 32;\nconst EVENT_TEXT_MAX = 36;\nconst QUEUE_TEXT_MAX = 32;\nconst AGGREGATE_GROUP_MAX = 3;\nconst PLAN_TEXT_MIN = 24;\nconst SLOT_GAP_WIDTH = 2;\n\nfunction isTerminalStatus(status: ActivityLaneStatus): boolean {\n\treturn status === \"success\" || status === \"warning\" || status === \"failure\" || status === \"neutral\";\n}\n\ninterface AggregateGroup {\n\ttag: string;\n\tcount: number;\n\twaiting: boolean;\n}\n\ninterface LaneSlots {\n\tturn: ActivityLaneItem | undefined;\n\tplan: ActivityLaneItem | undefined;\n\tgroups: AggregateGroup[];\n\tqueue: ActivityLaneItem | undefined;\n\tevent: ActivityLaneItem | undefined;\n}\n\nfunction normalizeActivityTag(tag: string | undefined, fallback: \"tool\" | \"worker\"): string {\n\tconst normalized = (tag ?? fallback)\n\t\t.replace(/[_\\s-]+/g, \" \")\n\t\t.trim()\n\t\t.toLowerCase();\n\treturn normalized || fallback;\n}\n\nfunction classifySlots(items: readonly ActivityLaneItem[]): LaneSlots {\n\tlet turn: ActivityLaneItem | undefined;\n\tlet plan: ActivityLaneItem | undefined;\n\tlet goal: ActivityLaneItem | undefined;\n\tlet queue: ActivityLaneItem | undefined;\n\tlet event: ActivityLaneItem | undefined;\n\tconst groups = new Map<string, AggregateGroup>();\n\n\tfor (const item of items) {\n\t\tif (isTerminalStatus(item.status)) {\n\t\t\tevent = item; // last one wins: transients are ordered oldest-first\n\t\t\tcontinue;\n\t\t}\n\t\tswitch (item.kind) {\n\t\t\tcase \"runtime\":\n\t\t\t\t// Waiting states (retry countdowns) outrank plain working states.\n\t\t\t\tif (!turn || (item.status === \"waiting\" && turn.status !== \"waiting\")) turn = item;\n\t\t\t\tbreak;\n\t\t\tcase \"task\":\n\t\t\t\tplan ??= item;\n\t\t\t\tbreak;\n\t\t\tcase \"goal\":\n\t\t\t\tgoal ??= item;\n\t\t\t\tbreak;\n\t\t\tcase \"queue\":\n\t\t\t\tqueue ??= item;\n\t\t\t\tbreak;\n\t\t\tcase \"tool\":\n\t\t\tcase \"worker\": {\n\t\t\t\tconst tag = normalizeActivityTag(item.tag, item.kind);\n\t\t\t\tconst group = groups.get(tag) ?? { tag, count: 0, waiting: false };\n\t\t\t\tgroup.count += 1;\n\t\t\t\tif (item.status === \"waiting\") group.waiting = true;\n\t\t\t\tgroups.set(tag, group);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"notice\":\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn { turn, plan: plan ?? goal, groups: [...groups.values()], queue, event };\n}\n\nfunction renderConcurrency(theme: Theme, groups: readonly AggregateGroup[]): string {\n\tconst parts: string[] = [];\n\tconst shown = groups.slice(0, AGGREGATE_GROUP_MAX);\n\tfor (const group of shown) {\n\t\tparts.push(theme.fg(group.waiting ? \"warning\" : \"muted\", `${group.count} ${group.tag}`));\n\t}\n\tconst overflow = groups.length - shown.length;\n\tif (overflow > 0) parts.push(theme.fg(\"dim\", `+${overflow}`));\n\treturn parts.join(theme.fg(\"dim\", \" · \"));\n}\n\nexport function renderActivityLaneLine(theme: Theme, items: readonly ActivityLaneItem[], width: number): string[] {\n\tconst safeWidth = Math.max(1, width);\n\tif (items.length === 0 || safeWidth < 3) return [];\n\tconst slots = classifySlots(items);\n\tif (!slots.turn && !slots.plan && slots.groups.length === 0 && !slots.queue && !slots.event) return [];\n\n\tconst indent = \" \";\n\tconst gap = \" \".repeat(SLOT_GAP_WIDTH);\n\n\t// Turn slot: alive-anchor glyph plus a short state. The generic working state keeps the\n\t// word \"working\"; load-bearing runtime labels (retry, compaction, routing) pass through.\n\tlet turnPart = \"\";\n\tconst planFromTurn = slots.turn?.id === \"runtime:turn\" ? slots.turn.label : undefined;\n\tif (slots.turn) {\n\t\tconst text = slots.turn.id === \"runtime:turn\" ? \"working\" : slots.turn.label;\n\t\tconst dotColor: ThemeColor = slots.turn.status === \"waiting\" ? \"warning\" : \"accent\";\n\t\tturnPart = `${theme.fg(dotColor, \"●\")} ${theme.fg(\"muted\", truncateToWidth(text, TURN_TEXT_MAX, \"…\"))}`;\n\t}\n\n\t// Plan slot content: task step, else goal, else the live working message.\n\tconst planItem = slots.plan;\n\tconst planText = planItem?.label ?? planFromTurn ?? \"\";\n\tconst planColor: ThemeColor = planItem ? (planItem.status === \"waiting\" ? \"warning\" : \"text\") : \"muted\";\n\n\t// Right-aligned slots at natural size. Events and concurrency drop before the plan\n\t// shrinks below its preferred width; the user-owned queue state remains visible.\n\tlet concurrencyPart = renderConcurrency(theme, slots.groups);\n\tconst queuePart = slots.queue ? theme.fg(\"warning\", truncateToWidth(slots.queue.label, QUEUE_TEXT_MAX, \"…\")) : \"\";\n\tlet eventPart = slots.event\n\t\t? `${theme.fg(STATUS_COLORS[slots.event.status], \"●\")} ${theme.fg(\n\t\t\t\t\"muted\",\n\t\t\t\ttruncateToWidth(slots.event.label, EVENT_TEXT_MAX, \"…\"),\n\t\t\t)}`\n\t\t: \"\";\n\n\tconst leftBase = visibleWidth(indent) + (turnPart ? visibleWidth(turnPart) : 0);\n\tconst planGap = turnPart && planText ? SLOT_GAP_WIDTH : 0;\n\tconst rightPart = (): string => [concurrencyPart, queuePart, eventPart].filter(Boolean).join(gap);\n\tconst planBudget = (): number => {\n\t\tlet right = visibleWidth(rightPart());\n\t\tif (right > 0) right += SLOT_GAP_WIDTH; // breathing room before the right block\n\t\treturn safeWidth - leftBase - planGap - right;\n\t};\n\n\tif (planText && planBudget() < PLAN_TEXT_MIN && eventPart) eventPart = \"\";\n\tif (planText && planBudget() < PLAN_TEXT_MIN && concurrencyPart) concurrencyPart = \"\";\n\n\tconst planAvailable = Math.max(0, planBudget());\n\tconst planPart = planText ? theme.fg(planColor, truncateToWidth(planText, planAvailable, \"…\")) : \"\";\n\n\tconst renderedRightPart = rightPart();\n\n\tlet line = indent + turnPart + (turnPart && planPart ? gap : \"\") + planPart;\n\tif (renderedRightPart) {\n\t\tconst pad = Math.max(SLOT_GAP_WIDTH, safeWidth - visibleWidth(line) - visibleWidth(renderedRightPart));\n\t\tline += \" \".repeat(pad) + renderedRightPart;\n\t}\n\treturn [truncateToWidth(line, safeWidth, \"\")];\n}\n\nexport class ActivityLaneComponent implements Component {\n\tprivate readonly theme: Theme;\n\tprivate readonly requestRender: () => void;\n\tprivate readonly terminalHoldMs: number;\n\tprivate sessionKey: string | undefined;\n\tprivate readonly canonical = new Map<string, ActivityLaneItem>();\n\tprivate readonly live = new Map<string, ActivityLaneItem>();\n\tprivate readonly transient = new Map<string, ActivityLaneItem>();\n\tprivate readonly transientTimers = new Map<string, ReturnType<typeof setTimeout>>();\n\tprivate readonly seenTerminalKeys = new Set<string>();\n\tprivate transientSequence = 0;\n\n\tconstructor(theme: Theme, requestRender: () => void, terminalHoldMs = DEFAULT_TERMINAL_HOLD_MS) {\n\t\tthis.theme = theme;\n\t\tthis.requestRender = requestRender;\n\t\tthis.terminalHoldMs = terminalHoldMs;\n\t}\n\n\tprivate rememberTerminal(key: string): void {\n\t\tthis.seenTerminalKeys.add(key);\n\t\twhile (this.seenTerminalKeys.size > MAX_SEEN_TERMINALS) {\n\t\t\tconst oldest = this.seenTerminalKeys.values().next().value;\n\t\t\tif (oldest === undefined) break;\n\t\t\tthis.seenTerminalKeys.delete(oldest);\n\t\t}\n\t}\n\n\tprivate addTransient(item: ActivityLaneItem): void {\n\t\tconst id = `${item.id}:${++this.transientSequence}`;\n\t\tthis.transient.set(id, { ...item, id });\n\t\tconst timer = setTimeout(() => {\n\t\t\tthis.transient.delete(id);\n\t\t\tthis.transientTimers.delete(id);\n\t\t\tthis.requestRender();\n\t\t}, this.terminalHoldMs);\n\t\tthis.transientTimers.set(id, timer);\n\t}\n\n\tprivate applyProjection(projection: ActivityLaneProjection, showNewTerminals: boolean): void {\n\t\tthis.canonical.clear();\n\t\tfor (const item of projection.active) this.canonical.set(item.id, item);\n\t\tfor (const item of projection.terminal.slice(-MAX_SEEN_TERMINALS)) {\n\t\t\tif (showNewTerminals && !this.seenTerminalKeys.has(item.id)) this.addTransient(item);\n\t\t\tthis.rememberTerminal(item.id);\n\t\t}\n\t\tthis.requestRender();\n\t}\n\n\treplaceCanonical(sessionKey: string, snapshot: ActivityLaneCanonicalSnapshot): void {\n\t\tif (this.sessionKey !== sessionKey) {\n\t\t\tthis.clearTransient();\n\t\t\tthis.live.clear();\n\t\t\tthis.seenTerminalKeys.clear();\n\t\t\tthis.sessionKey = sessionKey;\n\t\t}\n\t\tthis.applyProjection(projectActivityLane(snapshot), false);\n\t}\n\n\tupdateCanonical(sessionKey: string, snapshot: ActivityLaneCanonicalSnapshot): void {\n\t\tif (this.sessionKey !== sessionKey) {\n\t\t\tthis.replaceCanonical(sessionKey, snapshot);\n\t\t\treturn;\n\t\t}\n\t\tthis.applyProjection(projectActivityLane(snapshot), true);\n\t}\n\n\tstart(item: Omit<ActivityLaneItem, \"status\">): void {\n\t\tthis.live.set(item.id, { ...item, label: boundedLabel(item.label), status: \"active\" });\n\t\tthis.requestRender();\n\t}\n\n\twait(item: Omit<ActivityLaneItem, \"status\">): void {\n\t\tthis.live.set(item.id, { ...item, label: boundedLabel(item.label), status: \"waiting\" });\n\t\tthis.requestRender();\n\t}\n\n\tupdate(id: string, label: string): void {\n\t\tconst current = this.live.get(id);\n\t\tif (!current) return;\n\t\tthis.live.set(id, { ...current, label: boundedLabel(label) });\n\t\tthis.requestRender();\n\t}\n\n\tremove(id: string): void {\n\t\tif (this.live.delete(id)) this.requestRender();\n\t}\n\n\tremoveByPrefix(prefix: string): void {\n\t\tlet removed = false;\n\t\tfor (const id of this.live.keys()) {\n\t\t\tif (!id.startsWith(prefix)) continue;\n\t\t\tthis.live.delete(id);\n\t\t\tremoved = true;\n\t\t}\n\t\tif (removed) this.requestRender();\n\t}\n\n\tfinish(id: string, status: \"success\" | \"failure\" | \"neutral\", fallback?: Omit<ActivityLaneItem, \"status\">): void {\n\t\tconst current = this.live.get(id) ?? fallback;\n\t\tthis.live.delete(id);\n\t\tif (current) this.addTransient({ ...current, label: boundedLabel(current.label), status });\n\t\tthis.requestRender();\n\t}\n\n\tannounce(label: string, status: \"success\" | \"failure\" | \"neutral\" = \"success\"): void {\n\t\tthis.addTransient({ id: \"notice\", kind: \"notice\", label: boundedLabel(label), status });\n\t\tthis.requestRender();\n\t}\n\n\tprivate clearTransient(): void {\n\t\tfor (const timer of this.transientTimers.values()) clearTimeout(timer);\n\t\tthis.transientTimers.clear();\n\t\tthis.transient.clear();\n\t}\n\n\tgetItems(): ActivityLaneItem[] {\n\t\t// Slot classification decides visibility; the turn state always feeds the turn slot.\n\t\treturn [...this.transient.values(), ...this.live.values(), ...this.canonical.values()];\n\t}\n\n\trender(width: number): string[] {\n\t\treturn renderActivityLaneLine(this.theme, this.getItems(), width);\n\t}\n\n\tinvalidate(): void {}\n\n\tdispose(): void {\n\t\tthis.clearTransient();\n\t\tthis.live.clear();\n\t\tthis.canonical.clear();\n\t\tthis.seenTerminalKeys.clear();\n\t}\n}\n"]}
1
+ {"version":3,"file":"activity-lane.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/activity-lane.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Component } from \"@caupulican/pi-tui\";\nimport { truncateToWidth, visibleWidth } from \"@caupulican/pi-tui\";\nimport type { LaneRecord } from \"../../../core/autonomy/lane-tracker.ts\";\nimport { type GoalState, isGoalExecutionActive, isGoalUnfinishedStatus } from \"../../../core/goals/goal-state.ts\";\nimport type { TaskStep, TaskStepsState } from \"../../../core/tasks/task-state.ts\";\nimport type { Theme, ThemeColor } from \"../theme/theme.ts\";\n\nexport type ActivityLaneKind = \"runtime\" | \"tool\" | \"task\" | \"worker\" | \"goal\" | \"queue\" | \"notice\";\nexport type ActivityLaneStatus = \"active\" | \"waiting\" | \"success\" | \"warning\" | \"failure\" | \"neutral\";\n\nexport interface ActivityLaneItem {\n\tid: string;\n\tkind: ActivityLaneKind;\n\tlabel: string;\n\tstatus: ActivityLaneStatus;\n\t/** Short aggregation key (e.g. \"bash\", \"python\", \"agent\") for the concurrency slot. */\n\ttag?: string;\n}\n\nexport interface ActivityLaneCanonicalSnapshot {\n\tgoalState?: GoalState;\n\ttaskState?: TaskStepsState;\n\tlaneRecords: readonly LaneRecord[];\n}\n\nexport interface ActivityLaneProjection {\n\tactive: ActivityLaneItem[];\n\tterminal: ActivityLaneItem[];\n}\n\nconst DEFAULT_TERMINAL_HOLD_MS = 2_000;\nconst MAX_ACTIVITY_LABEL_LENGTH = 240;\nconst MAX_SEEN_TERMINALS = 512;\n\nexport const BACKGROUND_TOOL_ACTIVITY_ID_PREFIX = \"background-tool:\";\n\nexport function backgroundToolActivityId(taskId: string): string {\n\treturn `${BACKGROUND_TOOL_ACTIVITY_ID_PREFIX}${taskId}`;\n}\n\nexport function isBackgroundToolActivityItem(item: Pick<ActivityLaneItem, \"id\" | \"kind\">): boolean {\n\treturn item.kind === \"tool\" && item.id.startsWith(BACKGROUND_TOOL_ACTIVITY_ID_PREFIX);\n}\n\nconst STATUS_COLORS: Record<ActivityLaneStatus, ThemeColor> = {\n\tactive: \"muted\",\n\twaiting: \"warning\",\n\tsuccess: \"success\",\n\twarning: \"warning\",\n\tfailure: \"error\",\n\tneutral: \"muted\",\n};\n\nfunction boundedLabel(value: string): string {\n\tconst normalized = value.replace(/\\s+/g, \" \").trim();\n\treturn normalized.length <= MAX_ACTIVITY_LABEL_LENGTH\n\t\t? normalized\n\t\t: `${normalized.slice(0, MAX_ACTIVITY_LABEL_LENGTH - 1)}…`;\n}\n\nfunction taskLabel(step: TaskStep, state: TaskStepsState): string {\n\tconst total = state.steps.length + state.archive.completed + state.archive.cancelled;\n\tconst activeIndex = state.steps.findIndex((candidate) => candidate.id === step.id);\n\tconst archived = state.archive.completed + state.archive.cancelled;\n\tconst position = Math.min(total, archived + Math.max(0, activeIndex) + 1);\n\tconst prefix = step.status === \"blocked\" ? \"Blocked\" : step.status === \"pending\" ? \"Next\" : \"Step\";\n\tconst content = step.status === \"in_progress\" ? (step.activeForm ?? step.content) : step.content;\n\treturn boundedLabel(`${prefix} ${position}/${total} · ${content}`);\n}\n\nfunction projectTaskState(state: TaskStepsState | undefined): ActivityLaneProjection {\n\tif (!state) return { active: [], terminal: [] };\n\tconst inProgress = state.steps.find((step) => step.status === \"in_progress\");\n\tconst blocked = state.steps.find((step) => step.status === \"blocked\");\n\tconst pending = state.steps.find((step) => step.status === \"pending\");\n\tconst current = inProgress ?? blocked ?? pending;\n\tconst active = current\n\t\t? [\n\t\t\t\t{\n\t\t\t\t\tid: `task:${current.id}`,\n\t\t\t\t\tkind: \"task\" as const,\n\t\t\t\t\tlabel: taskLabel(current, state),\n\t\t\t\t\tstatus: current.status === \"blocked\" ? (\"waiting\" as const) : (\"active\" as const),\n\t\t\t\t},\n\t\t\t]\n\t\t: [];\n\tconst terminal = state.steps\n\t\t.filter((step) => step.status === \"completed\" || step.status === \"cancelled\")\n\t\t.map(\n\t\t\t(step): ActivityLaneItem => ({\n\t\t\t\tid: `terminal:task:${step.id}:${step.status}:${step.updatedAt}`,\n\t\t\t\tkind: \"task\",\n\t\t\t\tlabel: boundedLabel(\n\t\t\t\t\tstep.status === \"completed\" ? `Completed · ${step.content}` : `Cancelled · ${step.content}`,\n\t\t\t\t),\n\t\t\t\tstatus: step.status === \"completed\" ? \"success\" : \"neutral\",\n\t\t\t}),\n\t\t);\n\treturn { active, terminal };\n}\n\nfunction projectGoalState(state: GoalState | undefined): ActivityLaneProjection {\n\tif (!state) return { active: [], terminal: [] };\n\tconst satisfied = state.requirements.filter((requirement) => requirement.status === \"satisfied\").length;\n\tconst progress = state.requirements.length > 0 ? ` ${satisfied}/${state.requirements.length}` : \"\";\n\tif (isGoalUnfinishedStatus(state.status)) {\n\t\tconst goalActive = isGoalExecutionActive(state.status);\n\t\tconst stopped = goalActive ? \"\" : ` ${state.status.replace(\"_\", \" \")}`;\n\t\treturn {\n\t\t\tactive: [\n\t\t\t\t{\n\t\t\t\t\tid: `goal:${state.goalId}`,\n\t\t\t\t\tkind: \"goal\",\n\t\t\t\t\tlabel: boundedLabel(`Goal${stopped}${progress} · ${state.userGoal}`),\n\t\t\t\t\tstatus: goalActive ? \"active\" : \"waiting\",\n\t\t\t\t},\n\t\t\t],\n\t\t\tterminal: [],\n\t\t};\n\t}\n\treturn {\n\t\tactive: [],\n\t\tterminal: [\n\t\t\t{\n\t\t\t\tid: `terminal:goal:${state.goalId}:${state.status}:${state.updatedAt}`,\n\t\t\t\tkind: \"goal\",\n\t\t\t\tlabel: state.status === \"completed\" ? \"Goal achieved\" : \"Goal closed\",\n\t\t\t\tstatus: state.status === \"completed\" ? \"success\" : \"neutral\",\n\t\t\t},\n\t\t],\n\t};\n}\n\nfunction laneLabel(record: LaneRecord): string {\n\tconst runtime = record.type === \"tmux-worker\" ? \"tmux\" : \"agent\";\n\tconst label = record.label ?? record.laneId;\n\treturn boundedLabel(`${runtime} · ${label}`);\n}\n\nfunction projectLaneRecords(records: readonly LaneRecord[]): ActivityLaneProjection {\n\tconst workers = records.filter((record) => record.type === \"worker\" || record.type === \"tmux-worker\");\n\tconst active = workers\n\t\t.filter((record) => record.status === \"queued\" || record.status === \"running\")\n\t\t.map(\n\t\t\t(record): ActivityLaneItem => ({\n\t\t\t\tid: `worker:${record.laneId}`,\n\t\t\t\tkind: \"worker\",\n\t\t\t\tlabel: laneLabel(record),\n\t\t\t\tstatus: record.status === \"queued\" ? \"waiting\" : \"active\",\n\t\t\t\ttag: record.type === \"tmux-worker\" ? \"tmux\" : \"agent\",\n\t\t\t}),\n\t\t);\n\tconst terminal = workers\n\t\t.filter(\n\t\t\t(record) =>\n\t\t\t\trecord.status === \"succeeded\" ||\n\t\t\t\trecord.status === \"partial\" ||\n\t\t\t\trecord.status === \"blocked\" ||\n\t\t\t\trecord.status === \"failed\" ||\n\t\t\t\trecord.status === \"timeout\" ||\n\t\t\t\trecord.status === \"budget_exhausted\" ||\n\t\t\t\trecord.status === \"canceled\",\n\t\t)\n\t\t.map(\n\t\t\t(record): ActivityLaneItem => ({\n\t\t\t\tid: `terminal:worker:${record.laneId}:${record.status}:${record.completedAt ?? \"unknown\"}`,\n\t\t\t\tkind: \"worker\",\n\t\t\t\tlabel: boundedLabel(\n\t\t\t\t\t`${record.status === \"succeeded\" ? \"Finished\" : record.status} · ${record.label ?? record.laneId}`,\n\t\t\t\t),\n\t\t\t\tstatus:\n\t\t\t\t\trecord.status === \"succeeded\"\n\t\t\t\t\t\t? \"success\"\n\t\t\t\t\t\t: record.status === \"partial\" || record.status === \"blocked\"\n\t\t\t\t\t\t\t? \"warning\"\n\t\t\t\t\t\t\t: record.status === \"canceled\"\n\t\t\t\t\t\t\t\t? \"neutral\"\n\t\t\t\t\t\t\t\t: \"failure\",\n\t\t\t}),\n\t\t);\n\treturn { active, terminal };\n}\n\nexport function projectActivityLane(snapshot: ActivityLaneCanonicalSnapshot): ActivityLaneProjection {\n\tconst task = projectTaskState(snapshot.taskState);\n\tconst lanes = projectLaneRecords(snapshot.laneRecords);\n\tconst goal = projectGoalState(snapshot.goalState);\n\treturn {\n\t\tactive: [...task.active, ...lanes.active, ...goal.active],\n\t\tterminal: [...task.terminal, ...lanes.terminal, ...goal.terminal],\n\t};\n}\n\n/**\n * Slot layout. One row, fixed slot order and anchors, left to right by stability:\n *\n * ● working Step 2/5 · Confirming duplicate-charge risk 2 bash Queued 1 ● Read finished\n * turn plan (only elastic slot) concurrency/queue last event\n *\n * Only the plan slot truncates. When width runs out, whole slots drop right-to-left\n * (event, then concurrency) so surviving slots never shift position mid-turn.\n * Color carries status only; labels stay in the text/muted hierarchy.\n */\nconst TURN_TEXT_MAX = 32;\nconst EVENT_TEXT_MAX = 36;\nconst QUEUE_TEXT_MAX = 32;\nconst AGGREGATE_GROUP_MAX = 3;\nconst PLAN_TEXT_MIN = 24;\nconst SLOT_GAP_WIDTH = 2;\n\nfunction isTerminalStatus(status: ActivityLaneStatus): boolean {\n\treturn status === \"success\" || status === \"warning\" || status === \"failure\" || status === \"neutral\";\n}\n\ninterface AggregateGroup {\n\ttag: string;\n\tcount: number;\n\twaiting: boolean;\n}\n\ninterface LaneSlots {\n\tturn: ActivityLaneItem | undefined;\n\tplan: ActivityLaneItem | undefined;\n\tgroups: AggregateGroup[];\n\tqueue: ActivityLaneItem | undefined;\n\tevent: ActivityLaneItem | undefined;\n}\n\nfunction normalizeActivityTag(tag: string | undefined, fallback: \"tool\" | \"worker\"): string {\n\tconst normalized = (tag ?? fallback)\n\t\t.replace(/[_\\s-]+/g, \" \")\n\t\t.trim()\n\t\t.toLowerCase();\n\treturn normalized || fallback;\n}\n\nfunction classifySlots(items: readonly ActivityLaneItem[]): LaneSlots {\n\tlet turn: ActivityLaneItem | undefined;\n\tlet plan: ActivityLaneItem | undefined;\n\tlet goal: ActivityLaneItem | undefined;\n\tlet queue: ActivityLaneItem | undefined;\n\tlet event: ActivityLaneItem | undefined;\n\tconst groups = new Map<string, AggregateGroup>();\n\n\tfor (const item of items) {\n\t\tif (isTerminalStatus(item.status)) {\n\t\t\tevent = item; // last one wins: transients are ordered oldest-first\n\t\t\tcontinue;\n\t\t}\n\t\tswitch (item.kind) {\n\t\t\tcase \"runtime\":\n\t\t\t\t// Waiting states (retry countdowns) outrank plain working states.\n\t\t\t\tif (!turn || (item.status === \"waiting\" && turn.status !== \"waiting\")) turn = item;\n\t\t\t\tbreak;\n\t\t\tcase \"task\":\n\t\t\t\tplan ??= item;\n\t\t\t\tbreak;\n\t\t\tcase \"goal\":\n\t\t\t\tgoal ??= item;\n\t\t\t\tbreak;\n\t\t\tcase \"queue\":\n\t\t\t\tqueue ??= item;\n\t\t\t\tbreak;\n\t\t\tcase \"tool\":\n\t\t\tcase \"worker\": {\n\t\t\t\tconst tag = normalizeActivityTag(item.tag, item.kind);\n\t\t\t\tconst group = groups.get(tag) ?? { tag, count: 0, waiting: false };\n\t\t\t\tgroup.count += 1;\n\t\t\t\tif (item.status === \"waiting\") group.waiting = true;\n\t\t\t\tgroups.set(tag, group);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"notice\":\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn { turn, plan: plan ?? goal, groups: [...groups.values()], queue, event };\n}\n\nfunction renderConcurrency(theme: Theme, groups: readonly AggregateGroup[]): string {\n\tconst parts: string[] = [];\n\tconst shown = groups.slice(0, AGGREGATE_GROUP_MAX);\n\tfor (const group of shown) {\n\t\tparts.push(theme.fg(group.waiting ? \"warning\" : \"muted\", `${group.count} ${group.tag}`));\n\t}\n\tconst overflow = groups.length - shown.length;\n\tif (overflow > 0) parts.push(theme.fg(\"dim\", `+${overflow}`));\n\treturn parts.join(theme.fg(\"dim\", \" · \"));\n}\n\nexport function renderActivityLaneLine(theme: Theme, items: readonly ActivityLaneItem[], width: number): string[] {\n\tconst safeWidth = Math.max(1, width);\n\tif (items.length === 0 || safeWidth < 3) return [];\n\tconst slots = classifySlots(items);\n\tif (!slots.turn && !slots.plan && slots.groups.length === 0 && !slots.queue && !slots.event) return [];\n\n\tconst indent = \" \";\n\tconst gap = \" \".repeat(SLOT_GAP_WIDTH);\n\n\t// Turn slot: alive-anchor glyph plus a short state. The generic working state keeps the\n\t// word \"working\"; load-bearing runtime labels (retry, compaction, routing) pass through.\n\tlet turnPart = \"\";\n\tconst planFromTurn = slots.turn?.id === \"runtime:turn\" ? slots.turn.label : undefined;\n\tif (slots.turn) {\n\t\tconst text = slots.turn.id === \"runtime:turn\" ? \"working\" : slots.turn.label;\n\t\tconst dotColor: ThemeColor = slots.turn.status === \"waiting\" ? \"warning\" : \"accent\";\n\t\tturnPart = `${theme.fg(dotColor, \"●\")} ${theme.fg(\"muted\", truncateToWidth(text, TURN_TEXT_MAX, \"…\"))}`;\n\t}\n\n\t// Plan slot content: task step, else goal, else the live working message.\n\tconst planItem = slots.plan;\n\tconst planText = planItem?.label ?? planFromTurn ?? \"\";\n\tconst planColor: ThemeColor = planItem ? (planItem.status === \"waiting\" ? \"warning\" : \"text\") : \"muted\";\n\n\t// Right-aligned slots at natural size. Events and concurrency drop before the plan\n\t// shrinks below its preferred width; the user-owned queue state remains visible.\n\tlet concurrencyPart = renderConcurrency(theme, slots.groups);\n\tconst queuePart = slots.queue ? theme.fg(\"warning\", truncateToWidth(slots.queue.label, QUEUE_TEXT_MAX, \"…\")) : \"\";\n\tlet eventPart = slots.event\n\t\t? `${theme.fg(STATUS_COLORS[slots.event.status], \"●\")} ${theme.fg(\n\t\t\t\t\"muted\",\n\t\t\t\ttruncateToWidth(slots.event.label, EVENT_TEXT_MAX, \"…\"),\n\t\t\t)}`\n\t\t: \"\";\n\n\tconst leftBase = visibleWidth(indent) + (turnPart ? visibleWidth(turnPart) : 0);\n\tconst planGap = turnPart && planText ? SLOT_GAP_WIDTH : 0;\n\tconst rightPart = (): string => [concurrencyPart, queuePart, eventPart].filter(Boolean).join(gap);\n\tconst planBudget = (): number => {\n\t\tlet right = visibleWidth(rightPart());\n\t\tif (right > 0) right += SLOT_GAP_WIDTH; // breathing room before the right block\n\t\treturn safeWidth - leftBase - planGap - right;\n\t};\n\n\tif (planText && planBudget() < PLAN_TEXT_MIN && eventPart) eventPart = \"\";\n\tif (planText && planBudget() < PLAN_TEXT_MIN && concurrencyPart) concurrencyPart = \"\";\n\n\tconst planAvailable = Math.max(0, planBudget());\n\tconst planPart = planText ? theme.fg(planColor, truncateToWidth(planText, planAvailable, \"…\")) : \"\";\n\n\tconst renderedRightPart = rightPart();\n\n\tlet line = indent + turnPart + (turnPart && planPart ? gap : \"\") + planPart;\n\tif (renderedRightPart) {\n\t\tconst pad = Math.max(SLOT_GAP_WIDTH, safeWidth - visibleWidth(line) - visibleWidth(renderedRightPart));\n\t\tline += \" \".repeat(pad) + renderedRightPart;\n\t}\n\treturn [truncateToWidth(line, safeWidth, \"\")];\n}\n\nexport class ActivityLaneComponent implements Component {\n\tprivate readonly theme: Theme;\n\tprivate readonly requestRender: () => void;\n\tprivate readonly terminalHoldMs: number;\n\tprivate sessionKey: string | undefined;\n\tprivate readonly canonical = new Map<string, ActivityLaneItem>();\n\tprivate readonly live = new Map<string, ActivityLaneItem>();\n\tprivate readonly transient = new Map<string, ActivityLaneItem>();\n\tprivate readonly transientTimers = new Map<string, ReturnType<typeof setTimeout>>();\n\tprivate readonly seenTerminalKeys = new Set<string>();\n\tprivate transientSequence = 0;\n\n\tconstructor(theme: Theme, requestRender: () => void, terminalHoldMs = DEFAULT_TERMINAL_HOLD_MS) {\n\t\tthis.theme = theme;\n\t\tthis.requestRender = requestRender;\n\t\tthis.terminalHoldMs = terminalHoldMs;\n\t}\n\n\tprivate rememberTerminal(key: string): void {\n\t\tthis.seenTerminalKeys.add(key);\n\t\twhile (this.seenTerminalKeys.size > MAX_SEEN_TERMINALS) {\n\t\t\tconst oldest = this.seenTerminalKeys.values().next().value;\n\t\t\tif (oldest === undefined) break;\n\t\t\tthis.seenTerminalKeys.delete(oldest);\n\t\t}\n\t}\n\n\tprivate addTransient(item: ActivityLaneItem): void {\n\t\tconst id = `${item.id}:${++this.transientSequence}`;\n\t\tthis.transient.set(id, { ...item, id });\n\t\tconst timer = setTimeout(() => {\n\t\t\tthis.transient.delete(id);\n\t\t\tthis.transientTimers.delete(id);\n\t\t\tthis.requestRender();\n\t\t}, this.terminalHoldMs);\n\t\tthis.transientTimers.set(id, timer);\n\t}\n\n\tprivate applyProjection(projection: ActivityLaneProjection, showNewTerminals: boolean): void {\n\t\tthis.canonical.clear();\n\t\tfor (const item of projection.active) this.canonical.set(item.id, item);\n\t\tfor (const item of projection.terminal.slice(-MAX_SEEN_TERMINALS)) {\n\t\t\tif (showNewTerminals && !this.seenTerminalKeys.has(item.id)) this.addTransient(item);\n\t\t\tthis.rememberTerminal(item.id);\n\t\t}\n\t\tthis.requestRender();\n\t}\n\n\treplaceCanonical(sessionKey: string, snapshot: ActivityLaneCanonicalSnapshot): void {\n\t\tif (this.sessionKey !== sessionKey) {\n\t\t\tthis.clearTransient();\n\t\t\tthis.live.clear();\n\t\t\tthis.seenTerminalKeys.clear();\n\t\t\tthis.sessionKey = sessionKey;\n\t\t}\n\t\tthis.applyProjection(projectActivityLane(snapshot), false);\n\t}\n\n\tupdateCanonical(sessionKey: string, snapshot: ActivityLaneCanonicalSnapshot): void {\n\t\tif (this.sessionKey !== sessionKey) {\n\t\t\tthis.replaceCanonical(sessionKey, snapshot);\n\t\t\treturn;\n\t\t}\n\t\tthis.applyProjection(projectActivityLane(snapshot), true);\n\t}\n\n\tstart(item: Omit<ActivityLaneItem, \"status\">): void {\n\t\tthis.live.set(item.id, { ...item, label: boundedLabel(item.label), status: \"active\" });\n\t\tthis.requestRender();\n\t}\n\n\twait(item: Omit<ActivityLaneItem, \"status\">): void {\n\t\tthis.live.set(item.id, { ...item, label: boundedLabel(item.label), status: \"waiting\" });\n\t\tthis.requestRender();\n\t}\n\n\tupdate(id: string, label: string): void {\n\t\tconst current = this.live.get(id);\n\t\tif (!current) return;\n\t\tthis.live.set(id, { ...current, label: boundedLabel(label) });\n\t\tthis.requestRender();\n\t}\n\n\tremove(id: string): void {\n\t\tif (this.live.delete(id)) this.requestRender();\n\t}\n\n\tremoveByPrefix(prefix: string): void {\n\t\tlet removed = false;\n\t\tfor (const id of this.live.keys()) {\n\t\t\tif (!id.startsWith(prefix)) continue;\n\t\t\tthis.live.delete(id);\n\t\t\tremoved = true;\n\t\t}\n\t\tif (removed) this.requestRender();\n\t}\n\n\tfinish(id: string, status: \"success\" | \"failure\" | \"neutral\", fallback?: Omit<ActivityLaneItem, \"status\">): void {\n\t\tconst current = this.live.get(id) ?? fallback;\n\t\tthis.live.delete(id);\n\t\tif (current) this.addTransient({ ...current, label: boundedLabel(current.label), status });\n\t\tthis.requestRender();\n\t}\n\n\tannounce(label: string, status: \"success\" | \"failure\" | \"neutral\" = \"success\"): void {\n\t\tthis.addTransient({ id: \"notice\", kind: \"notice\", label: boundedLabel(label), status });\n\t\tthis.requestRender();\n\t}\n\n\tprivate clearTransient(): void {\n\t\tfor (const timer of this.transientTimers.values()) clearTimeout(timer);\n\t\tthis.transientTimers.clear();\n\t\tthis.transient.clear();\n\t}\n\n\tgetItems(): ActivityLaneItem[] {\n\t\t// Slot classification decides visibility; the turn state always feeds the turn slot.\n\t\treturn [...this.transient.values(), ...this.live.values(), ...this.canonical.values()];\n\t}\n\n\trender(width: number): string[] {\n\t\treturn renderActivityLaneLine(this.theme, this.getItems(), width);\n\t}\n\n\tinvalidate(): void {}\n\n\tdispose(): void {\n\t\tthis.clearTransient();\n\t\tthis.live.clear();\n\t\tthis.canonical.clear();\n\t\tthis.seenTerminalKeys.clear();\n\t}\n}\n"]}
@@ -204,7 +204,7 @@ export class FooterComponent {
204
204
  statsParts.push(`R${formatTokens(totalCacheRead)}`);
205
205
  if (totalCacheWrite)
206
206
  statsParts.push(`W${formatTokens(totalCacheWrite)}`);
207
- const usingSubscription = state.model ? this.session.modelRegistry.isUsingOAuth(state.model) : false;
207
+ const usingSubscription = state.model ? this.session.modelRegistry.isUsingSubscription(state.model) : false;
208
208
  statsParts.push(...formatFooterCostParts(costSummary, 3, { subscription: usingSubscription }));
209
209
  // Keep the warning-only guard proactive without duplicating the authoritative
210
210
  // CURRENT/TODAY/SUBAGENTS totals rendered above.
@@ -1 +1 @@
1
- {"version":3,"file":"footer.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/footer.ts"],"names":[],"mappings":"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","sourcesContent":["import { isAbsolute, relative, resolve, sep } from \"node:path\";\nimport { type Component, truncateToWidth, visibleWidth } from \"@caupulican/pi-tui\";\nimport type { AgentSession } from \"../../../core/agent-session.ts\";\nimport { formatFooterCostParts } from \"../../../core/cost/cost-summary.ts\";\nimport type { ReadonlyFooterDataProvider } from \"../../../core/footer-data-provider.ts\";\nimport { theme } from \"../theme/theme.ts\";\n\n/**\n * Sanitize text for display in a single-line status.\n * Removes newlines, tabs, carriage returns, and other control characters.\n */\nfunction sanitizeStatusText(text: string): string {\n\t// Replace newlines, tabs, carriage returns with space, then collapse multiple spaces\n\treturn text\n\t\t.replace(/[\\r\\n\\t]/g, \" \")\n\t\t.replace(/ +/g, \" \")\n\t\t.trim();\n}\n\nfunction stripAnsi(text: string): string {\n\treturn text.replace(/\\u001b\\[[0-?]*[ -/]*[@-~]/g, \"\");\n}\n\nfunction normalizeLearningPhase(phase: string): string {\n\tconst normalized = phase\n\t\t.toLowerCase()\n\t\t.replace(/[^a-z0-9_-]+/g, \"\")\n\t\t.trim();\n\tif (!normalized) return \"active\";\n\tif (normalized === \"starting\") return \"start\";\n\tif (normalized === \"mapping\") return \"map\";\n\tif (normalized === \"scanning\") return \"scan\";\n\tif (normalized === \"auditing\") return \"audit\";\n\tif (normalized === \"learning\") return \"run\";\n\tif (normalized === \"pruning\") return \"prune\";\n\treturn normalized.slice(0, 16);\n}\n\nfunction formatExtensionStatuses(statuses: ReadonlyMap<string, string>): string[] {\n\tconst regularStatuses: string[] = [];\n\tconst learningPhases = new Set<string>();\n\tlet sawLearningStatus = false;\n\n\tfor (const [key, rawText] of Array.from(statuses.entries()).sort(([a], [b]) => a.localeCompare(b))) {\n\t\tconst text = sanitizeStatusText(rawText);\n\t\tconst plain = stripAnsi(text).trim();\n\t\tconst plainLower = plain.toLowerCase();\n\t\tlet phase: string | undefined;\n\n\t\tif (plainLower.startsWith(\"(learning)\")) {\n\t\t\tphase = plain.slice(\"(learning)\".length).trim();\n\t\t} else if (plainLower === \"learning\") {\n\t\t\tphase = \"active\";\n\t\t} else if (/^learn(?:ing)?\\s*[: ]/.test(plainLower)) {\n\t\t\tphase = plain.replace(/^learn(?:ing)?\\s*[: ]/i, \"\").trim();\n\t\t}\n\n\t\tif (phase !== undefined) {\n\t\t\tsawLearningStatus = true;\n\t\t\tlearningPhases.add(normalizeLearningPhase(phase));\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (key === \"auto-learn\" || key === \"continuous-learning\") {\n\t\t\tsawLearningStatus = true;\n\t\t\tlearningPhases.add(\"active\");\n\t\t\tcontinue;\n\t\t}\n\n\t\tregularStatuses.push(text);\n\t}\n\n\tif (!sawLearningStatus) return regularStatuses;\n\tconst phases = Array.from(learningPhases).filter((phase) => phase !== \"active\");\n\tconst phaseText = phases.length > 0 ? phases.join(\"/\") : \"active\";\n\treturn [theme.fg(\"warning\", \"learn\") + theme.fg(\"dim\", `:${phaseText}`), ...regularStatuses];\n}\n\n/**\n * Format token counts for compact footer display.\n */\nfunction formatTokens(count: number): string {\n\tif (count < 1000) return count.toString();\n\tif (count < 10000) return `${(count / 1000).toFixed(1)}k`;\n\tif (count < 1000000) return `${Math.round(count / 1000)}k`;\n\tif (count < 10000000) return `${(count / 1000000).toFixed(1)}M`;\n\treturn `${Math.round(count / 1000000)}M`;\n}\n\nexport function formatCwdForFooter(cwd: string, home: string | undefined): string {\n\tif (!home) return cwd;\n\n\tconst resolvedCwd = resolve(cwd);\n\tconst resolvedHome = resolve(home);\n\tconst relativeToHome = relative(resolvedHome, resolvedCwd);\n\tconst isInsideHome =\n\t\trelativeToHome === \"\" ||\n\t\t(relativeToHome !== \"..\" && !relativeToHome.startsWith(`..${sep}`) && !isAbsolute(relativeToHome));\n\n\tif (!isInsideHome) return cwd;\n\treturn relativeToHome === \"\" ? \"~\" : `~${sep}${relativeToHome}`;\n}\n\n/**\n * Footer component that shows pwd, token stats, and context usage.\n * Computes token/context stats from session, gets git branch and extension statuses from provider.\n */\ntype FooterUsageSnapshot = {\n\tentryCount: number;\n\tmessageCount: number;\n\ttotalInput: number;\n\ttotalOutput: number;\n\ttotalCacheRead: number;\n\ttotalCacheWrite: number;\n\tcontextUsage: ReturnType<AgentSession[\"getContextUsage\"]>;\n};\n\nexport class FooterComponent implements Component {\n\tprivate autoCompactEnabled = true;\n\tprivate session: AgentSession;\n\tprivate footerData: ReadonlyFooterDataProvider;\n\tprivate usageSnapshot?: FooterUsageSnapshot;\n\tprivate cumulativeUsage?: Omit<FooterUsageSnapshot, \"messageCount\" | \"contextUsage\">;\n\n\tconstructor(session: AgentSession, footerData: ReadonlyFooterDataProvider) {\n\t\tthis.session = session;\n\t\tthis.footerData = footerData;\n\t}\n\n\tsetSession(session: AgentSession): void {\n\t\tthis.session = session;\n\t\tthis.usageSnapshot = undefined;\n\t\tthis.cumulativeUsage = undefined;\n\t}\n\n\tsetAutoCompactEnabled(enabled: boolean): void {\n\t\tthis.autoCompactEnabled = enabled;\n\t}\n\n\t/**\n\t * Invalidate cached footer stats when session state changes.\n\t */\n\tinvalidate(): void {\n\t\tthis.usageSnapshot = undefined;\n\t}\n\n\t/**\n\t * Clean up resources.\n\t * Git watcher cleanup now handled by provider.\n\t */\n\tdispose(): void {\n\t\t// Git watcher cleanup handled by provider\n\t}\n\n\tprivate getUsageSnapshot(messageCount: number): FooterUsageSnapshot {\n\t\tconst sessionManager = this.session.sessionManager as AgentSession[\"sessionManager\"] & {\n\t\t\tgetEntryCount?: () => number;\n\t\t};\n\t\tconst entryCount = sessionManager.getEntryCount?.() ?? sessionManager.getEntries().length;\n\t\tconst cached = this.usageSnapshot;\n\t\tif (cached && cached.entryCount === entryCount && cached.messageCount === messageCount) {\n\t\t\treturn cached;\n\t\t}\n\n\t\t// Session entries are append ordered. Reuse accumulated totals and process only the delta;\n\t\t// invalidating footer layout/context state must not force a full history scan.\n\t\tconst previous = this.cumulativeUsage;\n\t\tconst incrementalSessionManager = sessionManager as unknown as {\n\t\t\tgetEntriesSince?: (startIndex: number) => ReturnType<typeof sessionManager.getEntries>;\n\t\t};\n\t\tconst canExtend = previous !== undefined && entryCount >= previous.entryCount;\n\t\tlet totalInput = canExtend ? previous.totalInput : 0;\n\t\tlet totalOutput = canExtend ? previous.totalOutput : 0;\n\t\tlet totalCacheRead = canExtend ? previous.totalCacheRead : 0;\n\t\tlet totalCacheWrite = canExtend ? previous.totalCacheWrite : 0;\n\n\t\tconst entries =\n\t\t\tcanExtend && incrementalSessionManager.getEntriesSince\n\t\t\t\t? incrementalSessionManager.getEntriesSince(previous.entryCount)\n\t\t\t\t: this.session.sessionManager.getEntries();\n\t\tfor (let i = 0; i < entries.length; i++) {\n\t\t\tconst entry = entries[i];\n\t\t\tif (entry.type !== \"message\" || entry.message.role !== \"assistant\") continue;\n\t\t\tconst usage = entry.message.usage;\n\t\t\tif (!usage) continue;\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}\n\n\t\tthis.cumulativeUsage = {\n\t\t\tentryCount,\n\t\t\ttotalInput,\n\t\t\ttotalOutput,\n\t\t\ttotalCacheRead,\n\t\t\ttotalCacheWrite,\n\t\t};\n\t\tconst snapshot: FooterUsageSnapshot = {\n\t\t\t...this.cumulativeUsage,\n\t\t\tmessageCount,\n\t\t\t// Calculate context usage from session (handles compaction correctly).\n\t\t\t// After compaction, tokens are unknown until the next LLM response.\n\t\t\tcontextUsage: this.session.getContextUsage(),\n\t\t};\n\t\tthis.usageSnapshot = snapshot;\n\t\treturn snapshot;\n\t}\n\n\trender(width: number): string[] {\n\t\tconst state = this.session.state;\n\t\tconst usageSnapshot = this.getUsageSnapshot(state.messages?.length ?? 0);\n\t\tconst { totalInput, totalOutput, totalCacheRead, totalCacheWrite, contextUsage } = usageSnapshot;\n\t\tconst costSummary = this.session.getCostSummary();\n\t\tconst contextWindow = contextUsage?.contextWindow ?? state.model?.contextWindow ?? 0;\n\t\tconst contextPercentValue = contextUsage?.percent ?? 0;\n\t\tconst contextPercent = contextUsage?.percent !== null ? contextPercentValue.toFixed(1) : \"?\";\n\n\t\t// Replace home directory with ~\n\t\tlet pwd = formatCwdForFooter(this.session.sessionManager.getCwd(), process.env.HOME || process.env.USERPROFILE);\n\n\t\t// Add git branch if available\n\t\tconst branch = this.footerData.getGitBranch();\n\t\tif (branch) {\n\t\t\tpwd = `${pwd} (${branch})`;\n\t\t}\n\n\t\t// Add session name if set\n\t\tconst sessionName = this.session.sessionManager.getSessionName();\n\t\tif (sessionName) {\n\t\t\tpwd = `${pwd} • ${sessionName}`;\n\t\t}\n\n\t\t// Build stats line\n\t\tconst statsParts = [];\n\t\tif (totalInput) statsParts.push(`↑${formatTokens(totalInput)}`);\n\t\tif (totalOutput) statsParts.push(`↓${formatTokens(totalOutput)}`);\n\t\tif (totalCacheRead) statsParts.push(`R${formatTokens(totalCacheRead)}`);\n\t\tif (totalCacheWrite) statsParts.push(`W${formatTokens(totalCacheWrite)}`);\n\n\t\tconst usingSubscription = state.model ? this.session.modelRegistry.isUsingOAuth(state.model) : false;\n\t\tstatsParts.push(...formatFooterCostParts(costSummary, 3, { subscription: usingSubscription }));\n\n\t\t// Keep the warning-only guard proactive without duplicating the authoritative\n\t\t// CURRENT/TODAY/SUBAGENTS totals rendered above.\n\t\tconst costGuard = this.session.getLastCostGuardDecision?.();\n\t\tif (costGuard?.over) {\n\t\t\tstatsParts.push(theme.fg(\"warning\", `GUARD:$${costGuard.estUsd.toFixed(2)}/turn`));\n\t\t}\n\n\t\t// Colorize context percentage based on usage\n\t\tlet contextPercentStr: string;\n\t\tconst autoIndicator = this.autoCompactEnabled ? \" (auto)\" : \"\";\n\t\tconst contextPercentDisplay =\n\t\t\tcontextPercent === \"?\"\n\t\t\t\t? `?/${formatTokens(contextWindow)}${autoIndicator}`\n\t\t\t\t: `${contextPercent}%/${formatTokens(contextWindow)}${autoIndicator}`;\n\t\tif (contextPercentValue > 90) {\n\t\t\tcontextPercentStr = theme.fg(\"error\", contextPercentDisplay);\n\t\t} else if (contextPercentValue > 70) {\n\t\t\tcontextPercentStr = theme.fg(\"warning\", contextPercentDisplay);\n\t\t} else {\n\t\t\tcontextPercentStr = contextPercentDisplay;\n\t\t}\n\t\tstatsParts.push(contextPercentStr);\n\n\t\tlet statsLeft = statsParts.join(\" \");\n\n\t\t// Add model display name on the right side, plus thinking level if model supports it\n\t\tconst modelName = state.model?.name || state.model?.id || \"no-model\";\n\n\t\tlet statsLeftWidth = visibleWidth(statsLeft);\n\n\t\t// If statsLeft is too wide, truncate it\n\t\tif (statsLeftWidth > width) {\n\t\t\tstatsLeft = truncateToWidth(statsLeft, width, \"...\");\n\t\t\tstatsLeftWidth = visibleWidth(statsLeft);\n\t\t}\n\n\t\t// Calculate available space for padding (minimum 2 spaces between stats and model)\n\t\tconst minPadding = 2;\n\n\t\t// Add thinking level indicator if model supports reasoning\n\t\tlet rightSideWithoutProvider = modelName;\n\t\tif (state.model?.reasoning) {\n\t\t\tconst thinkingLevel = state.thinkingLevel || \"off\";\n\t\t\trightSideWithoutProvider =\n\t\t\t\tthinkingLevel === \"off\" ? `${modelName} • thinking off` : `${modelName} • ${thinkingLevel}`;\n\t\t}\n\n\t\t// Prepend the provider in parentheses if there are multiple providers and there's enough room\n\t\tlet rightSide = rightSideWithoutProvider;\n\t\tif (this.footerData.getAvailableProviderCount() > 1 && state.model) {\n\t\t\trightSide = `(${state.model!.provider}) ${rightSideWithoutProvider}`;\n\t\t\tif (statsLeftWidth + minPadding + visibleWidth(rightSide) > width) {\n\t\t\t\t// Too wide, fall back\n\t\t\t\trightSide = rightSideWithoutProvider;\n\t\t\t}\n\t\t}\n\n\t\tconst rightSideWidth = visibleWidth(rightSide);\n\t\tconst totalNeeded = statsLeftWidth + minPadding + rightSideWidth;\n\n\t\tlet statsLine: string;\n\t\tif (totalNeeded <= width) {\n\t\t\t// Both fit - add padding to right-align model\n\t\t\tconst padding = \" \".repeat(width - statsLeftWidth - rightSideWidth);\n\t\t\tstatsLine = statsLeft + padding + rightSide;\n\t\t} else {\n\t\t\t// Need to truncate right side\n\t\t\tconst availableForRight = width - statsLeftWidth - minPadding;\n\t\t\tif (availableForRight > 0) {\n\t\t\t\tconst truncatedRight = truncateToWidth(rightSide, availableForRight, \"\");\n\t\t\t\tconst truncatedRightWidth = visibleWidth(truncatedRight);\n\t\t\t\tconst padding = \" \".repeat(Math.max(0, width - statsLeftWidth - truncatedRightWidth));\n\t\t\t\tstatsLine = statsLeft + padding + truncatedRight;\n\t\t\t} else {\n\t\t\t\t// Not enough space for right side at all\n\t\t\t\tstatsLine = statsLeft;\n\t\t\t}\n\t\t}\n\n\t\t// Apply dim to each part separately. statsLeft may contain color codes (for context %)\n\t\t// that end with a reset, which would clear an outer dim wrapper. So we dim the parts\n\t\t// before and after the colored section independently.\n\t\tconst dimStatsLeft = theme.fg(\"dim\", statsLeft);\n\t\tconst remainder = statsLine.slice(statsLeft.length); // padding + rightSide\n\t\tconst dimRemainder = theme.fg(\"dim\", remainder);\n\n\t\tconst pwdLine = truncateToWidth(theme.fg(\"dim\", pwd), width, theme.fg(\"dim\", \"...\"));\n\t\tconst lines = [pwdLine, dimStatsLeft + dimRemainder];\n\n\t\t// Add extension statuses on a single line. Learning-related statuses are\n\t\t// folded into one compact chip so independent learning systems do not render\n\t\t// brittle duplicates like \"(learning) (learning) auto\".\n\t\tconst extensionStatuses = this.footerData.getExtensionStatuses();\n\t\tconst autonomyStatus = this.footerData.getAutonomyStatus();\n\n\t\tconst statusParts: string[] = [];\n\t\tif (autonomyStatus) {\n\t\t\tconst sanitizedAutonomyStatus = sanitizeStatusText(autonomyStatus);\n\t\t\tif (sanitizedAutonomyStatus) {\n\t\t\t\tstatusParts.push(sanitizedAutonomyStatus);\n\t\t\t}\n\t\t}\n\t\tif (extensionStatuses.size > 0) {\n\t\t\tconst extLine = formatExtensionStatuses(extensionStatuses).join(\" \");\n\t\t\tif (extLine) {\n\t\t\t\tstatusParts.push(extLine);\n\t\t\t}\n\t\t}\n\n\t\tif (statusParts.length > 0) {\n\t\t\tconst statusLine = statusParts.join(\" \");\n\t\t\tlines.push(truncateToWidth(statusLine, width, theme.fg(\"dim\", \"...\")));\n\t\t}\n\n\t\treturn lines;\n\t}\n}\n"]}
1
+ {"version":3,"file":"footer.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/footer.ts"],"names":[],"mappings":"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","sourcesContent":["import { isAbsolute, relative, resolve, sep } from \"node:path\";\nimport { type Component, truncateToWidth, visibleWidth } from \"@caupulican/pi-tui\";\nimport type { AgentSession } from \"../../../core/agent-session.ts\";\nimport { formatFooterCostParts } from \"../../../core/cost/cost-summary.ts\";\nimport type { ReadonlyFooterDataProvider } from \"../../../core/footer-data-provider.ts\";\nimport { theme } from \"../theme/theme.ts\";\n\n/**\n * Sanitize text for display in a single-line status.\n * Removes newlines, tabs, carriage returns, and other control characters.\n */\nfunction sanitizeStatusText(text: string): string {\n\t// Replace newlines, tabs, carriage returns with space, then collapse multiple spaces\n\treturn text\n\t\t.replace(/[\\r\\n\\t]/g, \" \")\n\t\t.replace(/ +/g, \" \")\n\t\t.trim();\n}\n\nfunction stripAnsi(text: string): string {\n\treturn text.replace(/\\u001b\\[[0-?]*[ -/]*[@-~]/g, \"\");\n}\n\nfunction normalizeLearningPhase(phase: string): string {\n\tconst normalized = phase\n\t\t.toLowerCase()\n\t\t.replace(/[^a-z0-9_-]+/g, \"\")\n\t\t.trim();\n\tif (!normalized) return \"active\";\n\tif (normalized === \"starting\") return \"start\";\n\tif (normalized === \"mapping\") return \"map\";\n\tif (normalized === \"scanning\") return \"scan\";\n\tif (normalized === \"auditing\") return \"audit\";\n\tif (normalized === \"learning\") return \"run\";\n\tif (normalized === \"pruning\") return \"prune\";\n\treturn normalized.slice(0, 16);\n}\n\nfunction formatExtensionStatuses(statuses: ReadonlyMap<string, string>): string[] {\n\tconst regularStatuses: string[] = [];\n\tconst learningPhases = new Set<string>();\n\tlet sawLearningStatus = false;\n\n\tfor (const [key, rawText] of Array.from(statuses.entries()).sort(([a], [b]) => a.localeCompare(b))) {\n\t\tconst text = sanitizeStatusText(rawText);\n\t\tconst plain = stripAnsi(text).trim();\n\t\tconst plainLower = plain.toLowerCase();\n\t\tlet phase: string | undefined;\n\n\t\tif (plainLower.startsWith(\"(learning)\")) {\n\t\t\tphase = plain.slice(\"(learning)\".length).trim();\n\t\t} else if (plainLower === \"learning\") {\n\t\t\tphase = \"active\";\n\t\t} else if (/^learn(?:ing)?\\s*[: ]/.test(plainLower)) {\n\t\t\tphase = plain.replace(/^learn(?:ing)?\\s*[: ]/i, \"\").trim();\n\t\t}\n\n\t\tif (phase !== undefined) {\n\t\t\tsawLearningStatus = true;\n\t\t\tlearningPhases.add(normalizeLearningPhase(phase));\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (key === \"auto-learn\" || key === \"continuous-learning\") {\n\t\t\tsawLearningStatus = true;\n\t\t\tlearningPhases.add(\"active\");\n\t\t\tcontinue;\n\t\t}\n\n\t\tregularStatuses.push(text);\n\t}\n\n\tif (!sawLearningStatus) return regularStatuses;\n\tconst phases = Array.from(learningPhases).filter((phase) => phase !== \"active\");\n\tconst phaseText = phases.length > 0 ? phases.join(\"/\") : \"active\";\n\treturn [theme.fg(\"warning\", \"learn\") + theme.fg(\"dim\", `:${phaseText}`), ...regularStatuses];\n}\n\n/**\n * Format token counts for compact footer display.\n */\nfunction formatTokens(count: number): string {\n\tif (count < 1000) return count.toString();\n\tif (count < 10000) return `${(count / 1000).toFixed(1)}k`;\n\tif (count < 1000000) return `${Math.round(count / 1000)}k`;\n\tif (count < 10000000) return `${(count / 1000000).toFixed(1)}M`;\n\treturn `${Math.round(count / 1000000)}M`;\n}\n\nexport function formatCwdForFooter(cwd: string, home: string | undefined): string {\n\tif (!home) return cwd;\n\n\tconst resolvedCwd = resolve(cwd);\n\tconst resolvedHome = resolve(home);\n\tconst relativeToHome = relative(resolvedHome, resolvedCwd);\n\tconst isInsideHome =\n\t\trelativeToHome === \"\" ||\n\t\t(relativeToHome !== \"..\" && !relativeToHome.startsWith(`..${sep}`) && !isAbsolute(relativeToHome));\n\n\tif (!isInsideHome) return cwd;\n\treturn relativeToHome === \"\" ? \"~\" : `~${sep}${relativeToHome}`;\n}\n\n/**\n * Footer component that shows pwd, token stats, and context usage.\n * Computes token/context stats from session, gets git branch and extension statuses from provider.\n */\ntype FooterUsageSnapshot = {\n\tentryCount: number;\n\tmessageCount: number;\n\ttotalInput: number;\n\ttotalOutput: number;\n\ttotalCacheRead: number;\n\ttotalCacheWrite: number;\n\tcontextUsage: ReturnType<AgentSession[\"getContextUsage\"]>;\n};\n\nexport class FooterComponent implements Component {\n\tprivate autoCompactEnabled = true;\n\tprivate session: AgentSession;\n\tprivate footerData: ReadonlyFooterDataProvider;\n\tprivate usageSnapshot?: FooterUsageSnapshot;\n\tprivate cumulativeUsage?: Omit<FooterUsageSnapshot, \"messageCount\" | \"contextUsage\">;\n\n\tconstructor(session: AgentSession, footerData: ReadonlyFooterDataProvider) {\n\t\tthis.session = session;\n\t\tthis.footerData = footerData;\n\t}\n\n\tsetSession(session: AgentSession): void {\n\t\tthis.session = session;\n\t\tthis.usageSnapshot = undefined;\n\t\tthis.cumulativeUsage = undefined;\n\t}\n\n\tsetAutoCompactEnabled(enabled: boolean): void {\n\t\tthis.autoCompactEnabled = enabled;\n\t}\n\n\t/**\n\t * Invalidate cached footer stats when session state changes.\n\t */\n\tinvalidate(): void {\n\t\tthis.usageSnapshot = undefined;\n\t}\n\n\t/**\n\t * Clean up resources.\n\t * Git watcher cleanup now handled by provider.\n\t */\n\tdispose(): void {\n\t\t// Git watcher cleanup handled by provider\n\t}\n\n\tprivate getUsageSnapshot(messageCount: number): FooterUsageSnapshot {\n\t\tconst sessionManager = this.session.sessionManager as AgentSession[\"sessionManager\"] & {\n\t\t\tgetEntryCount?: () => number;\n\t\t};\n\t\tconst entryCount = sessionManager.getEntryCount?.() ?? sessionManager.getEntries().length;\n\t\tconst cached = this.usageSnapshot;\n\t\tif (cached && cached.entryCount === entryCount && cached.messageCount === messageCount) {\n\t\t\treturn cached;\n\t\t}\n\n\t\t// Session entries are append ordered. Reuse accumulated totals and process only the delta;\n\t\t// invalidating footer layout/context state must not force a full history scan.\n\t\tconst previous = this.cumulativeUsage;\n\t\tconst incrementalSessionManager = sessionManager as unknown as {\n\t\t\tgetEntriesSince?: (startIndex: number) => ReturnType<typeof sessionManager.getEntries>;\n\t\t};\n\t\tconst canExtend = previous !== undefined && entryCount >= previous.entryCount;\n\t\tlet totalInput = canExtend ? previous.totalInput : 0;\n\t\tlet totalOutput = canExtend ? previous.totalOutput : 0;\n\t\tlet totalCacheRead = canExtend ? previous.totalCacheRead : 0;\n\t\tlet totalCacheWrite = canExtend ? previous.totalCacheWrite : 0;\n\n\t\tconst entries =\n\t\t\tcanExtend && incrementalSessionManager.getEntriesSince\n\t\t\t\t? incrementalSessionManager.getEntriesSince(previous.entryCount)\n\t\t\t\t: this.session.sessionManager.getEntries();\n\t\tfor (let i = 0; i < entries.length; i++) {\n\t\t\tconst entry = entries[i];\n\t\t\tif (entry.type !== \"message\" || entry.message.role !== \"assistant\") continue;\n\t\t\tconst usage = entry.message.usage;\n\t\t\tif (!usage) continue;\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}\n\n\t\tthis.cumulativeUsage = {\n\t\t\tentryCount,\n\t\t\ttotalInput,\n\t\t\ttotalOutput,\n\t\t\ttotalCacheRead,\n\t\t\ttotalCacheWrite,\n\t\t};\n\t\tconst snapshot: FooterUsageSnapshot = {\n\t\t\t...this.cumulativeUsage,\n\t\t\tmessageCount,\n\t\t\t// Calculate context usage from session (handles compaction correctly).\n\t\t\t// After compaction, tokens are unknown until the next LLM response.\n\t\t\tcontextUsage: this.session.getContextUsage(),\n\t\t};\n\t\tthis.usageSnapshot = snapshot;\n\t\treturn snapshot;\n\t}\n\n\trender(width: number): string[] {\n\t\tconst state = this.session.state;\n\t\tconst usageSnapshot = this.getUsageSnapshot(state.messages?.length ?? 0);\n\t\tconst { totalInput, totalOutput, totalCacheRead, totalCacheWrite, contextUsage } = usageSnapshot;\n\t\tconst costSummary = this.session.getCostSummary();\n\t\tconst contextWindow = contextUsage?.contextWindow ?? state.model?.contextWindow ?? 0;\n\t\tconst contextPercentValue = contextUsage?.percent ?? 0;\n\t\tconst contextPercent = contextUsage?.percent !== null ? contextPercentValue.toFixed(1) : \"?\";\n\n\t\t// Replace home directory with ~\n\t\tlet pwd = formatCwdForFooter(this.session.sessionManager.getCwd(), process.env.HOME || process.env.USERPROFILE);\n\n\t\t// Add git branch if available\n\t\tconst branch = this.footerData.getGitBranch();\n\t\tif (branch) {\n\t\t\tpwd = `${pwd} (${branch})`;\n\t\t}\n\n\t\t// Add session name if set\n\t\tconst sessionName = this.session.sessionManager.getSessionName();\n\t\tif (sessionName) {\n\t\t\tpwd = `${pwd} • ${sessionName}`;\n\t\t}\n\n\t\t// Build stats line\n\t\tconst statsParts = [];\n\t\tif (totalInput) statsParts.push(`↑${formatTokens(totalInput)}`);\n\t\tif (totalOutput) statsParts.push(`↓${formatTokens(totalOutput)}`);\n\t\tif (totalCacheRead) statsParts.push(`R${formatTokens(totalCacheRead)}`);\n\t\tif (totalCacheWrite) statsParts.push(`W${formatTokens(totalCacheWrite)}`);\n\n\t\tconst usingSubscription = state.model ? this.session.modelRegistry.isUsingSubscription(state.model) : false;\n\t\tstatsParts.push(...formatFooterCostParts(costSummary, 3, { subscription: usingSubscription }));\n\n\t\t// Keep the warning-only guard proactive without duplicating the authoritative\n\t\t// CURRENT/TODAY/SUBAGENTS totals rendered above.\n\t\tconst costGuard = this.session.getLastCostGuardDecision?.();\n\t\tif (costGuard?.over) {\n\t\t\tstatsParts.push(theme.fg(\"warning\", `GUARD:$${costGuard.estUsd.toFixed(2)}/turn`));\n\t\t}\n\n\t\t// Colorize context percentage based on usage\n\t\tlet contextPercentStr: string;\n\t\tconst autoIndicator = this.autoCompactEnabled ? \" (auto)\" : \"\";\n\t\tconst contextPercentDisplay =\n\t\t\tcontextPercent === \"?\"\n\t\t\t\t? `?/${formatTokens(contextWindow)}${autoIndicator}`\n\t\t\t\t: `${contextPercent}%/${formatTokens(contextWindow)}${autoIndicator}`;\n\t\tif (contextPercentValue > 90) {\n\t\t\tcontextPercentStr = theme.fg(\"error\", contextPercentDisplay);\n\t\t} else if (contextPercentValue > 70) {\n\t\t\tcontextPercentStr = theme.fg(\"warning\", contextPercentDisplay);\n\t\t} else {\n\t\t\tcontextPercentStr = contextPercentDisplay;\n\t\t}\n\t\tstatsParts.push(contextPercentStr);\n\n\t\tlet statsLeft = statsParts.join(\" \");\n\n\t\t// Add model display name on the right side, plus thinking level if model supports it\n\t\tconst modelName = state.model?.name || state.model?.id || \"no-model\";\n\n\t\tlet statsLeftWidth = visibleWidth(statsLeft);\n\n\t\t// If statsLeft is too wide, truncate it\n\t\tif (statsLeftWidth > width) {\n\t\t\tstatsLeft = truncateToWidth(statsLeft, width, \"...\");\n\t\t\tstatsLeftWidth = visibleWidth(statsLeft);\n\t\t}\n\n\t\t// Calculate available space for padding (minimum 2 spaces between stats and model)\n\t\tconst minPadding = 2;\n\n\t\t// Add thinking level indicator if model supports reasoning\n\t\tlet rightSideWithoutProvider = modelName;\n\t\tif (state.model?.reasoning) {\n\t\t\tconst thinkingLevel = state.thinkingLevel || \"off\";\n\t\t\trightSideWithoutProvider =\n\t\t\t\tthinkingLevel === \"off\" ? `${modelName} • thinking off` : `${modelName} • ${thinkingLevel}`;\n\t\t}\n\n\t\t// Prepend the provider in parentheses if there are multiple providers and there's enough room\n\t\tlet rightSide = rightSideWithoutProvider;\n\t\tif (this.footerData.getAvailableProviderCount() > 1 && state.model) {\n\t\t\trightSide = `(${state.model!.provider}) ${rightSideWithoutProvider}`;\n\t\t\tif (statsLeftWidth + minPadding + visibleWidth(rightSide) > width) {\n\t\t\t\t// Too wide, fall back\n\t\t\t\trightSide = rightSideWithoutProvider;\n\t\t\t}\n\t\t}\n\n\t\tconst rightSideWidth = visibleWidth(rightSide);\n\t\tconst totalNeeded = statsLeftWidth + minPadding + rightSideWidth;\n\n\t\tlet statsLine: string;\n\t\tif (totalNeeded <= width) {\n\t\t\t// Both fit - add padding to right-align model\n\t\t\tconst padding = \" \".repeat(width - statsLeftWidth - rightSideWidth);\n\t\t\tstatsLine = statsLeft + padding + rightSide;\n\t\t} else {\n\t\t\t// Need to truncate right side\n\t\t\tconst availableForRight = width - statsLeftWidth - minPadding;\n\t\t\tif (availableForRight > 0) {\n\t\t\t\tconst truncatedRight = truncateToWidth(rightSide, availableForRight, \"\");\n\t\t\t\tconst truncatedRightWidth = visibleWidth(truncatedRight);\n\t\t\t\tconst padding = \" \".repeat(Math.max(0, width - statsLeftWidth - truncatedRightWidth));\n\t\t\t\tstatsLine = statsLeft + padding + truncatedRight;\n\t\t\t} else {\n\t\t\t\t// Not enough space for right side at all\n\t\t\t\tstatsLine = statsLeft;\n\t\t\t}\n\t\t}\n\n\t\t// Apply dim to each part separately. statsLeft may contain color codes (for context %)\n\t\t// that end with a reset, which would clear an outer dim wrapper. So we dim the parts\n\t\t// before and after the colored section independently.\n\t\tconst dimStatsLeft = theme.fg(\"dim\", statsLeft);\n\t\tconst remainder = statsLine.slice(statsLeft.length); // padding + rightSide\n\t\tconst dimRemainder = theme.fg(\"dim\", remainder);\n\n\t\tconst pwdLine = truncateToWidth(theme.fg(\"dim\", pwd), width, theme.fg(\"dim\", \"...\"));\n\t\tconst lines = [pwdLine, dimStatsLeft + dimRemainder];\n\n\t\t// Add extension statuses on a single line. Learning-related statuses are\n\t\t// folded into one compact chip so independent learning systems do not render\n\t\t// brittle duplicates like \"(learning) (learning) auto\".\n\t\tconst extensionStatuses = this.footerData.getExtensionStatuses();\n\t\tconst autonomyStatus = this.footerData.getAutonomyStatus();\n\n\t\tconst statusParts: string[] = [];\n\t\tif (autonomyStatus) {\n\t\t\tconst sanitizedAutonomyStatus = sanitizeStatusText(autonomyStatus);\n\t\t\tif (sanitizedAutonomyStatus) {\n\t\t\t\tstatusParts.push(sanitizedAutonomyStatus);\n\t\t\t}\n\t\t}\n\t\tif (extensionStatuses.size > 0) {\n\t\t\tconst extLine = formatExtensionStatuses(extensionStatuses).join(\" \");\n\t\t\tif (extLine) {\n\t\t\t\tstatusParts.push(extLine);\n\t\t\t}\n\t\t}\n\n\t\tif (statusParts.length > 0) {\n\t\t\tconst statusLine = statusParts.join(\" \");\n\t\t\tlines.push(truncateToWidth(statusLine, width, theme.fg(\"dim\", \"...\")));\n\t\t}\n\n\t\treturn lines;\n\t}\n}\n"]}
@@ -4,6 +4,8 @@ export type AuthSelectorProvider = {
4
4
  id: string;
5
5
  name: string;
6
6
  authType: "oauth" | "api_key";
7
+ /** Secondary line shown under the provider name, e.g. "Sign in with SuperGrok or X Premium". */
8
+ loginLabel?: string;
7
9
  };
8
10
  /**
9
11
  * Component that renders an auth provider selector
@@ -1 +1 @@
1
- {"version":3,"file":"oauth-selector.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/oauth-selector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,SAAS,EAAqD,MAAM,oBAAoB,CAAC;AAClH,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAW7E,MAAM,MAAM,oBAAoB,GAAG;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;CAC9B,CAAC;AAEF;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,SAAU,YAAW,SAAS;IACzE,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,aAAa,CAAwB;IAG7C,IAAI,OAAO,IAAI,OAAO,CAErB;IACD,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,EAEzB;IAED,OAAO,CAAC,aAAa,CAAY;IACjC,OAAO,CAAC,YAAY,CAAyB;IAC7C,OAAO,CAAC,iBAAiB,CAAyB;IAClD,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,IAAI,CAAqB;IACjC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,aAAa,CAAqC;IAC1D,OAAO,CAAC,gBAAgB,CAA+B;IACvD,OAAO,CAAC,gBAAgB,CAAa;IAErC,YACC,IAAI,EAAE,OAAO,GAAG,QAAQ,EACxB,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,oBAAoB,EAAE,EACjC,QAAQ,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,EACtC,QAAQ,EAAE,MAAM,IAAI,EACpB,aAAa,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,UAAU,EAsClD;IAED,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,UAAU;IA0ClB,OAAO,CAAC,qBAAqB;IA0B7B,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CA8BjC;CACD"}
1
+ {"version":3,"file":"oauth-selector.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/oauth-selector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,SAAS,EAAqD,MAAM,oBAAoB,CAAC;AAClH,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAW7E,MAAM,MAAM,oBAAoB,GAAG;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,gGAAgG;IAChG,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,SAAU,YAAW,SAAS;IACzE,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,aAAa,CAAwB;IAG7C,IAAI,OAAO,IAAI,OAAO,CAErB;IACD,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,EAEzB;IAED,OAAO,CAAC,aAAa,CAAY;IACjC,OAAO,CAAC,YAAY,CAAyB;IAC7C,OAAO,CAAC,iBAAiB,CAAyB;IAClD,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,IAAI,CAAqB;IACjC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,aAAa,CAAqC;IAC1D,OAAO,CAAC,gBAAgB,CAA+B;IACvD,OAAO,CAAC,gBAAgB,CAAa;IAErC,YACC,IAAI,EAAE,OAAO,GAAG,QAAQ,EACxB,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,oBAAoB,EAAE,EACjC,QAAQ,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,EACtC,QAAQ,EAAE,MAAM,IAAI,EACpB,aAAa,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,UAAU,EAsClD;IAED,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,UAAU;IA2ClB,OAAO,CAAC,qBAAqB;IA0B7B,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CA8BjC;CACD"}
@@ -61,15 +61,16 @@ export class OAuthSelectorComponent extends Container {
61
61
  continue;
62
62
  const isSelected = i === this.selectedIndex;
63
63
  const statusIndicator = this.formatStatusIndicator(provider);
64
+ const loginLabelSuffix = provider.loginLabel ? theme.fg("muted", ` — ${provider.loginLabel}`) : "";
64
65
  let line = "";
65
66
  if (isSelected) {
66
67
  const prefix = theme.fg("accent", "→ ");
67
68
  const text = theme.fg("accent", provider.name);
68
- line = prefix + text + statusIndicator;
69
+ line = prefix + text + loginLabelSuffix + statusIndicator;
69
70
  }
70
71
  else {
71
72
  const text = ` ${theme.fg("text", provider.name)}`;
72
- line = text + statusIndicator;
73
+ line = text + loginLabelSuffix + statusIndicator;
73
74
  }
74
75
  this.listContainer.addChild(new TruncatedText(line, 1, 0));
75
76
  }
@@ -1 +1 @@
1
- {"version":3,"file":"oauth-selector.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/oauth-selector.ts"],"names":[],"mappings":"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","sourcesContent":["import { Container, type Focusable, getKeybindings, type Input, Spacer, TruncatedText } from \"@caupulican/pi-tui\";\nimport type { AuthStatus, AuthStorage } from \"../../../core/auth-storage.ts\";\nimport { theme } from \"../theme/theme.ts\";\nimport { DynamicBorder } from \"./dynamic-border.ts\";\nimport {\n\tadvanceSelectorIndex,\n\tfilterSelectorItems,\n\tgetCenteredVisibleRange,\n\tgetSelectorScrollText,\n\tSearchableListSurface,\n} from \"./selector-list.ts\";\n\nexport type AuthSelectorProvider = {\n\tid: string;\n\tname: string;\n\tauthType: \"oauth\" | \"api_key\";\n};\n\n/**\n * Component that renders an auth provider selector\n */\nexport class OAuthSelectorComponent extends Container implements Focusable {\n\tprivate searchInput: Input;\n\tprivate searchSurface: SearchableListSurface;\n\n\t// Focusable implementation - propagate to search input for IME cursor positioning\n\tget focused(): boolean {\n\t\treturn this.searchSurface.focused;\n\t}\n\tset focused(value: boolean) {\n\t\tthis.searchSurface.focused = value;\n\t}\n\n\tprivate listContainer: Container;\n\tprivate allProviders: AuthSelectorProvider[];\n\tprivate filteredProviders: AuthSelectorProvider[];\n\tprivate selectedIndex: number = 0;\n\tprivate mode: \"login\" | \"logout\";\n\tprivate authStorage: AuthStorage;\n\tprivate getAuthStatus: (providerId: string) => AuthStatus;\n\tprivate onSelectCallback: (providerId: string) => void;\n\tprivate onCancelCallback: () => void;\n\n\tconstructor(\n\t\tmode: \"login\" | \"logout\",\n\t\tauthStorage: AuthStorage,\n\t\tproviders: AuthSelectorProvider[],\n\t\tonSelect: (providerId: string) => void,\n\t\tonCancel: () => void,\n\t\tgetAuthStatus?: (providerId: string) => AuthStatus,\n\t) {\n\t\tsuper();\n\n\t\tthis.mode = mode;\n\t\tthis.authStorage = authStorage;\n\t\tthis.getAuthStatus = getAuthStatus ?? ((providerId) => this.authStorage.getAuthStatus(providerId));\n\t\tthis.allProviders = providers;\n\t\tthis.filteredProviders = providers;\n\t\tthis.onSelectCallback = onSelect;\n\t\tthis.onCancelCallback = onCancel;\n\n\t\t// Add top border\n\t\tthis.addChild(new DynamicBorder());\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Add title\n\t\tconst title = mode === \"login\" ? \"Select provider to configure:\" : \"Select provider to logout:\";\n\t\tthis.addChild(new TruncatedText(theme.fg(\"accent\", theme.bold(title)), 1, 0));\n\t\tthis.addChild(new Spacer(1));\n\n\t\tthis.searchSurface = SearchableListSurface.mount(this);\n\t\tthis.searchInput = this.searchSurface.searchInput;\n\t\tthis.listContainer = this.searchSurface.listContainer;\n\t\tthis.searchInput.onSubmit = () => {\n\t\t\tconst selectedProvider = this.filteredProviders[this.selectedIndex];\n\t\t\tif (selectedProvider) {\n\t\t\t\tthis.onSelectCallback(selectedProvider.id);\n\t\t\t}\n\t\t};\n\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Add bottom border\n\t\tthis.addChild(new DynamicBorder());\n\n\t\t// Initial render\n\t\tthis.filterProviders(\"\");\n\t}\n\n\tprivate filterProviders(query: string): void {\n\t\tthis.filteredProviders = filterSelectorItems(\n\t\t\tthis.allProviders,\n\t\t\tquery,\n\t\t\t(provider) => `${provider.name} ${provider.id} ${provider.authType}`,\n\t\t);\n\t\tthis.selectedIndex = Math.max(0, Math.min(this.selectedIndex, Math.max(0, this.filteredProviders.length - 1)));\n\t\tthis.updateList();\n\t}\n\n\tprivate updateList(): void {\n\t\tthis.listContainer.clear();\n\n\t\tconst maxVisible = 8;\n\t\tconst range = getCenteredVisibleRange(this.selectedIndex, this.filteredProviders.length, maxVisible);\n\t\tconst { startIndex, endIndex } = range;\n\n\t\tfor (let i = startIndex; i < endIndex; i++) {\n\t\t\tconst provider = this.filteredProviders[i];\n\t\t\tif (!provider) continue;\n\n\t\t\tconst isSelected = i === this.selectedIndex;\n\n\t\t\tconst statusIndicator = this.formatStatusIndicator(provider);\n\t\t\tlet line = \"\";\n\t\t\tif (isSelected) {\n\t\t\t\tconst prefix = theme.fg(\"accent\", \"→ \");\n\t\t\t\tconst text = theme.fg(\"accent\", provider.name);\n\t\t\t\tline = prefix + text + statusIndicator;\n\t\t\t} else {\n\t\t\t\tconst text = ` ${theme.fg(\"text\", provider.name)}`;\n\t\t\t\tline = text + statusIndicator;\n\t\t\t}\n\n\t\t\tthis.listContainer.addChild(new TruncatedText(line, 1, 0));\n\t\t}\n\n\t\tconst scrollText = getSelectorScrollText(this.selectedIndex, this.filteredProviders.length, range);\n\t\tif (scrollText) this.listContainer.addChild(new TruncatedText(theme.fg(\"muted\", scrollText), 1, 0));\n\n\t\t// Show \"no providers\" if empty\n\t\tif (this.filteredProviders.length === 0) {\n\t\t\tconst message =\n\t\t\t\tthis.allProviders.length === 0\n\t\t\t\t\t? this.mode === \"login\"\n\t\t\t\t\t\t? \"No providers available\"\n\t\t\t\t\t\t: \"No providers logged in. Use /login first.\"\n\t\t\t\t\t: \"No matching providers\";\n\t\t\tthis.listContainer.addChild(new TruncatedText(theme.fg(\"muted\", ` ${message}`), 1, 0));\n\t\t}\n\t}\n\n\tprivate formatStatusIndicator(provider: AuthSelectorProvider): string {\n\t\tconst credential = this.authStorage.get(provider.id);\n\t\tif (credential?.type === provider.authType) return theme.fg(\"success\", \" ✓ configured\");\n\t\tif (credential) {\n\t\t\tconst label = credential.type === \"oauth\" ? \"subscription configured\" : \"API key configured\";\n\t\t\treturn theme.fg(\"muted\", \" • \") + theme.fg(\"warning\", label);\n\t\t}\n\t\tif (provider.authType !== \"api_key\") return theme.fg(\"muted\", \" • unconfigured\");\n\n\t\tconst status = this.getAuthStatus(provider.id);\n\t\tswitch (status.source) {\n\t\t\tcase \"environment\":\n\t\t\t\treturn theme.fg(\"success\", ` ✓ env: ${status.label ?? \"API key\"}`);\n\t\t\tcase \"runtime\":\n\t\t\t\treturn theme.fg(\"success\", \" ✓ runtime API key\");\n\t\t\tcase \"fallback\":\n\t\t\t\treturn theme.fg(\"success\", \" ✓ custom API key\");\n\t\t\tcase \"models_json_key\":\n\t\t\t\treturn theme.fg(\"success\", \" ✓ key in models.json\");\n\t\t\tcase \"models_json_command\":\n\t\t\t\treturn theme.fg(\"success\", \" ✓ command in models.json\");\n\t\t\tdefault:\n\t\t\t\treturn theme.fg(\"muted\", \" • unconfigured\");\n\t\t}\n\t}\n\n\thandleInput(keyData: string): void {\n\t\tconst kb = getKeybindings();\n\t\t// Up arrow\n\t\tif (kb.matches(keyData, \"tui.select.up\")) {\n\t\t\tif (this.filteredProviders.length === 0) return;\n\t\t\tthis.selectedIndex = advanceSelectorIndex(this.selectedIndex, this.filteredProviders.length, -1, \"clamp\");\n\t\t\tthis.updateList();\n\t\t}\n\t\t// Down arrow\n\t\telse if (kb.matches(keyData, \"tui.select.down\")) {\n\t\t\tif (this.filteredProviders.length === 0) return;\n\t\t\tthis.selectedIndex = advanceSelectorIndex(this.selectedIndex, this.filteredProviders.length, 1, \"clamp\");\n\t\t\tthis.updateList();\n\t\t}\n\t\t// Enter\n\t\telse if (kb.matches(keyData, \"tui.select.confirm\")) {\n\t\t\tconst selectedProvider = this.filteredProviders[this.selectedIndex];\n\t\t\tif (selectedProvider) {\n\t\t\t\tthis.onSelectCallback(selectedProvider.id);\n\t\t\t}\n\t\t}\n\t\t// Escape or Ctrl+C\n\t\telse if (kb.matches(keyData, \"tui.select.cancel\")) {\n\t\t\tthis.onCancelCallback();\n\t\t}\n\t\t// Pass everything else to search input\n\t\telse {\n\t\t\tthis.searchInput.handleInput(keyData);\n\t\t\tthis.filterProviders(this.searchInput.getValue());\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"oauth-selector.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/oauth-selector.ts"],"names":[],"mappings":"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","sourcesContent":["import { Container, type Focusable, getKeybindings, type Input, Spacer, TruncatedText } from \"@caupulican/pi-tui\";\nimport type { AuthStatus, AuthStorage } from \"../../../core/auth-storage.ts\";\nimport { theme } from \"../theme/theme.ts\";\nimport { DynamicBorder } from \"./dynamic-border.ts\";\nimport {\n\tadvanceSelectorIndex,\n\tfilterSelectorItems,\n\tgetCenteredVisibleRange,\n\tgetSelectorScrollText,\n\tSearchableListSurface,\n} from \"./selector-list.ts\";\n\nexport type AuthSelectorProvider = {\n\tid: string;\n\tname: string;\n\tauthType: \"oauth\" | \"api_key\";\n\t/** Secondary line shown under the provider name, e.g. \"Sign in with SuperGrok or X Premium\". */\n\tloginLabel?: string;\n};\n\n/**\n * Component that renders an auth provider selector\n */\nexport class OAuthSelectorComponent extends Container implements Focusable {\n\tprivate searchInput: Input;\n\tprivate searchSurface: SearchableListSurface;\n\n\t// Focusable implementation - propagate to search input for IME cursor positioning\n\tget focused(): boolean {\n\t\treturn this.searchSurface.focused;\n\t}\n\tset focused(value: boolean) {\n\t\tthis.searchSurface.focused = value;\n\t}\n\n\tprivate listContainer: Container;\n\tprivate allProviders: AuthSelectorProvider[];\n\tprivate filteredProviders: AuthSelectorProvider[];\n\tprivate selectedIndex: number = 0;\n\tprivate mode: \"login\" | \"logout\";\n\tprivate authStorage: AuthStorage;\n\tprivate getAuthStatus: (providerId: string) => AuthStatus;\n\tprivate onSelectCallback: (providerId: string) => void;\n\tprivate onCancelCallback: () => void;\n\n\tconstructor(\n\t\tmode: \"login\" | \"logout\",\n\t\tauthStorage: AuthStorage,\n\t\tproviders: AuthSelectorProvider[],\n\t\tonSelect: (providerId: string) => void,\n\t\tonCancel: () => void,\n\t\tgetAuthStatus?: (providerId: string) => AuthStatus,\n\t) {\n\t\tsuper();\n\n\t\tthis.mode = mode;\n\t\tthis.authStorage = authStorage;\n\t\tthis.getAuthStatus = getAuthStatus ?? ((providerId) => this.authStorage.getAuthStatus(providerId));\n\t\tthis.allProviders = providers;\n\t\tthis.filteredProviders = providers;\n\t\tthis.onSelectCallback = onSelect;\n\t\tthis.onCancelCallback = onCancel;\n\n\t\t// Add top border\n\t\tthis.addChild(new DynamicBorder());\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Add title\n\t\tconst title = mode === \"login\" ? \"Select provider to configure:\" : \"Select provider to logout:\";\n\t\tthis.addChild(new TruncatedText(theme.fg(\"accent\", theme.bold(title)), 1, 0));\n\t\tthis.addChild(new Spacer(1));\n\n\t\tthis.searchSurface = SearchableListSurface.mount(this);\n\t\tthis.searchInput = this.searchSurface.searchInput;\n\t\tthis.listContainer = this.searchSurface.listContainer;\n\t\tthis.searchInput.onSubmit = () => {\n\t\t\tconst selectedProvider = this.filteredProviders[this.selectedIndex];\n\t\t\tif (selectedProvider) {\n\t\t\t\tthis.onSelectCallback(selectedProvider.id);\n\t\t\t}\n\t\t};\n\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Add bottom border\n\t\tthis.addChild(new DynamicBorder());\n\n\t\t// Initial render\n\t\tthis.filterProviders(\"\");\n\t}\n\n\tprivate filterProviders(query: string): void {\n\t\tthis.filteredProviders = filterSelectorItems(\n\t\t\tthis.allProviders,\n\t\t\tquery,\n\t\t\t(provider) => `${provider.name} ${provider.id} ${provider.authType}`,\n\t\t);\n\t\tthis.selectedIndex = Math.max(0, Math.min(this.selectedIndex, Math.max(0, this.filteredProviders.length - 1)));\n\t\tthis.updateList();\n\t}\n\n\tprivate updateList(): void {\n\t\tthis.listContainer.clear();\n\n\t\tconst maxVisible = 8;\n\t\tconst range = getCenteredVisibleRange(this.selectedIndex, this.filteredProviders.length, maxVisible);\n\t\tconst { startIndex, endIndex } = range;\n\n\t\tfor (let i = startIndex; i < endIndex; i++) {\n\t\t\tconst provider = this.filteredProviders[i];\n\t\t\tif (!provider) continue;\n\n\t\t\tconst isSelected = i === this.selectedIndex;\n\n\t\t\tconst statusIndicator = this.formatStatusIndicator(provider);\n\t\t\tconst loginLabelSuffix = provider.loginLabel ? theme.fg(\"muted\", ` — ${provider.loginLabel}`) : \"\";\n\t\t\tlet line = \"\";\n\t\t\tif (isSelected) {\n\t\t\t\tconst prefix = theme.fg(\"accent\", \"→ \");\n\t\t\t\tconst text = theme.fg(\"accent\", provider.name);\n\t\t\t\tline = prefix + text + loginLabelSuffix + statusIndicator;\n\t\t\t} else {\n\t\t\t\tconst text = ` ${theme.fg(\"text\", provider.name)}`;\n\t\t\t\tline = text + loginLabelSuffix + statusIndicator;\n\t\t\t}\n\n\t\t\tthis.listContainer.addChild(new TruncatedText(line, 1, 0));\n\t\t}\n\n\t\tconst scrollText = getSelectorScrollText(this.selectedIndex, this.filteredProviders.length, range);\n\t\tif (scrollText) this.listContainer.addChild(new TruncatedText(theme.fg(\"muted\", scrollText), 1, 0));\n\n\t\t// Show \"no providers\" if empty\n\t\tif (this.filteredProviders.length === 0) {\n\t\t\tconst message =\n\t\t\t\tthis.allProviders.length === 0\n\t\t\t\t\t? this.mode === \"login\"\n\t\t\t\t\t\t? \"No providers available\"\n\t\t\t\t\t\t: \"No providers logged in. Use /login first.\"\n\t\t\t\t\t: \"No matching providers\";\n\t\t\tthis.listContainer.addChild(new TruncatedText(theme.fg(\"muted\", ` ${message}`), 1, 0));\n\t\t}\n\t}\n\n\tprivate formatStatusIndicator(provider: AuthSelectorProvider): string {\n\t\tconst credential = this.authStorage.get(provider.id);\n\t\tif (credential?.type === provider.authType) return theme.fg(\"success\", \" ✓ configured\");\n\t\tif (credential) {\n\t\t\tconst label = credential.type === \"oauth\" ? \"subscription configured\" : \"API key configured\";\n\t\t\treturn theme.fg(\"muted\", \" • \") + theme.fg(\"warning\", label);\n\t\t}\n\t\tif (provider.authType !== \"api_key\") return theme.fg(\"muted\", \" • unconfigured\");\n\n\t\tconst status = this.getAuthStatus(provider.id);\n\t\tswitch (status.source) {\n\t\t\tcase \"environment\":\n\t\t\t\treturn theme.fg(\"success\", ` ✓ env: ${status.label ?? \"API key\"}`);\n\t\t\tcase \"runtime\":\n\t\t\t\treturn theme.fg(\"success\", \" ✓ runtime API key\");\n\t\t\tcase \"fallback\":\n\t\t\t\treturn theme.fg(\"success\", \" ✓ custom API key\");\n\t\t\tcase \"models_json_key\":\n\t\t\t\treturn theme.fg(\"success\", \" ✓ key in models.json\");\n\t\t\tcase \"models_json_command\":\n\t\t\t\treturn theme.fg(\"success\", \" ✓ command in models.json\");\n\t\t\tdefault:\n\t\t\t\treturn theme.fg(\"muted\", \" • unconfigured\");\n\t\t}\n\t}\n\n\thandleInput(keyData: string): void {\n\t\tconst kb = getKeybindings();\n\t\t// Up arrow\n\t\tif (kb.matches(keyData, \"tui.select.up\")) {\n\t\t\tif (this.filteredProviders.length === 0) return;\n\t\t\tthis.selectedIndex = advanceSelectorIndex(this.selectedIndex, this.filteredProviders.length, -1, \"clamp\");\n\t\t\tthis.updateList();\n\t\t}\n\t\t// Down arrow\n\t\telse if (kb.matches(keyData, \"tui.select.down\")) {\n\t\t\tif (this.filteredProviders.length === 0) return;\n\t\t\tthis.selectedIndex = advanceSelectorIndex(this.selectedIndex, this.filteredProviders.length, 1, \"clamp\");\n\t\t\tthis.updateList();\n\t\t}\n\t\t// Enter\n\t\telse if (kb.matches(keyData, \"tui.select.confirm\")) {\n\t\t\tconst selectedProvider = this.filteredProviders[this.selectedIndex];\n\t\t\tif (selectedProvider) {\n\t\t\t\tthis.onSelectCallback(selectedProvider.id);\n\t\t\t}\n\t\t}\n\t\t// Escape or Ctrl+C\n\t\telse if (kb.matches(keyData, \"tui.select.cancel\")) {\n\t\t\tthis.onCancelCallback();\n\t\t}\n\t\t// Pass everything else to search input\n\t\telse {\n\t\t\tthis.searchInput.handleInput(keyData);\n\t\t\tthis.filterProviders(this.searchInput.getValue());\n\t\t}\n\t}\n}\n"]}
@@ -37,7 +37,7 @@ export function handleUsageCommand(host) {
37
37
  const autoLearn = host.getCurrentAutoLearnSettings();
38
38
  const costGuard = host.session.getLastCostGuardDecision();
39
39
  const activeModel = host.session.model;
40
- const usingSubscription = activeModel ? host.session.modelRegistry.isUsingOAuth(activeModel) : false;
40
+ const usingSubscription = activeModel ? host.session.modelRegistry.isUsingSubscription(activeModel) : false;
41
41
  const isChatGptSubscription = usingSubscription && activeModel?.provider === "openai-codex";
42
42
  let info = `${theme.bold("Usage & Optimization")}\n\n`;
43
43
  info += `${theme.bold("Session tokens")}\n`;