@intrect/openswarm 0.17.2 → 0.17.3

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 (256) hide show
  1. package/README.md +21 -5
  2. package/config.example.yaml +18 -0
  3. package/dist/adapters/agenticLoop.d.ts +2 -0
  4. package/dist/adapters/agenticLoop.d.ts.map +1 -1
  5. package/dist/adapters/agenticLoop.js +6 -3
  6. package/dist/adapters/agenticLoop.js.map +1 -1
  7. package/dist/adapters/base.d.ts.map +1 -1
  8. package/dist/adapters/base.js +9 -0
  9. package/dist/adapters/base.js.map +1 -1
  10. package/dist/adapters/claude.d.ts.map +1 -1
  11. package/dist/adapters/claude.js +6 -3
  12. package/dist/adapters/claude.js.map +1 -1
  13. package/dist/adapters/codex.d.ts.map +1 -1
  14. package/dist/adapters/codex.js +3 -2
  15. package/dist/adapters/codex.js.map +1 -1
  16. package/dist/adapters/codexResponses.d.ts +2 -1
  17. package/dist/adapters/codexResponses.d.ts.map +1 -1
  18. package/dist/adapters/codexResponses.js +34 -30
  19. package/dist/adapters/codexResponses.js.map +1 -1
  20. package/dist/adapters/errorClassification.d.ts +11 -0
  21. package/dist/adapters/errorClassification.d.ts.map +1 -1
  22. package/dist/adapters/errorClassification.js +21 -0
  23. package/dist/adapters/errorClassification.js.map +1 -1
  24. package/dist/adapters/gpt.d.ts.map +1 -1
  25. package/dist/adapters/gpt.js +1 -0
  26. package/dist/adapters/gpt.js.map +1 -1
  27. package/dist/adapters/local.d.ts.map +1 -1
  28. package/dist/adapters/local.js +1 -0
  29. package/dist/adapters/local.js.map +1 -1
  30. package/dist/adapters/openrouter.d.ts.map +1 -1
  31. package/dist/adapters/openrouter.js +1 -0
  32. package/dist/adapters/openrouter.js.map +1 -1
  33. package/dist/adapters/processRegistry.d.ts.map +1 -1
  34. package/dist/adapters/processRegistry.js +8 -0
  35. package/dist/adapters/processRegistry.js.map +1 -1
  36. package/dist/adapters/types.d.ts +2 -0
  37. package/dist/adapters/types.d.ts.map +1 -1
  38. package/dist/agents/pairPipeline.d.ts +10 -139
  39. package/dist/agents/pairPipeline.d.ts.map +1 -1
  40. package/dist/agents/pairPipeline.js +127 -35
  41. package/dist/agents/pairPipeline.js.map +1 -1
  42. package/dist/agents/pairPipelineTypes.d.ts +109 -0
  43. package/dist/agents/pairPipelineTypes.d.ts.map +1 -0
  44. package/dist/agents/pairPipelineTypes.js +2 -0
  45. package/dist/agents/pairPipelineTypes.js.map +1 -0
  46. package/dist/agents/pipelineGuards.d.ts.map +1 -1
  47. package/dist/agents/pipelineGuards.js +346 -0
  48. package/dist/agents/pipelineGuards.js.map +1 -1
  49. package/dist/agents/pipelineTaskPrefix.d.ts +3 -0
  50. package/dist/agents/pipelineTaskPrefix.d.ts.map +1 -0
  51. package/dist/agents/pipelineTaskPrefix.js +16 -0
  52. package/dist/agents/pipelineTaskPrefix.js.map +1 -0
  53. package/dist/agents/reflection.d.ts +1 -1
  54. package/dist/agents/reflection.d.ts.map +1 -1
  55. package/dist/agents/reflection.js +3 -1
  56. package/dist/agents/reflection.js.map +1 -1
  57. package/dist/agents/reviewer.d.ts +6 -0
  58. package/dist/agents/reviewer.d.ts.map +1 -1
  59. package/dist/agents/reviewer.js +4 -1
  60. package/dist/agents/reviewer.js.map +1 -1
  61. package/dist/agents/stageErrorClassification.d.ts +16 -0
  62. package/dist/agents/stageErrorClassification.d.ts.map +1 -0
  63. package/dist/agents/stageErrorClassification.js +38 -0
  64. package/dist/agents/stageErrorClassification.js.map +1 -0
  65. package/dist/agents/stageModelResolver.d.ts +8 -0
  66. package/dist/agents/stageModelResolver.d.ts.map +1 -0
  67. package/dist/agents/stageModelResolver.js +22 -0
  68. package/dist/agents/stageModelResolver.js.map +1 -0
  69. package/dist/agents/worker.d.ts +33 -0
  70. package/dist/agents/worker.d.ts.map +1 -1
  71. package/dist/agents/worker.js +59 -4
  72. package/dist/agents/worker.js.map +1 -1
  73. package/dist/agents/workerFanout.d.ts +38 -0
  74. package/dist/agents/workerFanout.d.ts.map +1 -0
  75. package/dist/agents/workerFanout.js +277 -0
  76. package/dist/agents/workerFanout.js.map +1 -0
  77. package/dist/agents/workerFanoutGate.d.ts +48 -0
  78. package/dist/agents/workerFanoutGate.d.ts.map +1 -0
  79. package/dist/agents/workerFanoutGate.js +146 -0
  80. package/dist/agents/workerFanoutGate.js.map +1 -0
  81. package/dist/agents/workerValidationEvidence.d.ts +5 -0
  82. package/dist/agents/workerValidationEvidence.d.ts.map +1 -0
  83. package/dist/agents/workerValidationEvidence.js +75 -0
  84. package/dist/agents/workerValidationEvidence.js.map +1 -0
  85. package/dist/automation/autonomousRunner.d.ts +18 -6
  86. package/dist/automation/autonomousRunner.d.ts.map +1 -1
  87. package/dist/automation/autonomousRunner.js +209 -39
  88. package/dist/automation/autonomousRunner.js.map +1 -1
  89. package/dist/automation/backlogGrooming.d.ts +52 -0
  90. package/dist/automation/backlogGrooming.d.ts.map +1 -0
  91. package/dist/automation/backlogGrooming.js +231 -0
  92. package/dist/automation/backlogGrooming.js.map +1 -0
  93. package/dist/automation/runnerExecution.d.ts +1 -1
  94. package/dist/automation/runnerExecution.d.ts.map +1 -1
  95. package/dist/automation/runnerExecution.js +31 -9
  96. package/dist/automation/runnerExecution.js.map +1 -1
  97. package/dist/automation/runnerTypes.d.ts +3 -1
  98. package/dist/automation/runnerTypes.d.ts.map +1 -1
  99. package/dist/automation/taskSource.d.ts +6 -3
  100. package/dist/automation/taskSource.d.ts.map +1 -1
  101. package/dist/automation/taskSource.js +5 -0
  102. package/dist/automation/taskSource.js.map +1 -1
  103. package/dist/cli/daemon.d.ts +20 -3
  104. package/dist/cli/daemon.d.ts.map +1 -1
  105. package/dist/cli/daemon.js +42 -2
  106. package/dist/cli/daemon.js.map +1 -1
  107. package/dist/cli/fixBoard.d.ts +14 -0
  108. package/dist/cli/fixBoard.d.ts.map +1 -0
  109. package/dist/cli/fixBoard.js +32 -0
  110. package/dist/cli/fixBoard.js.map +1 -0
  111. package/dist/cli/fixCommand.d.ts +8 -0
  112. package/dist/cli/fixCommand.d.ts.map +1 -1
  113. package/dist/cli/fixCommand.js +47 -8
  114. package/dist/cli/fixCommand.js.map +1 -1
  115. package/dist/cli/memoryCommand.d.ts +37 -0
  116. package/dist/cli/memoryCommand.d.ts.map +1 -0
  117. package/dist/cli/memoryCommand.js +156 -0
  118. package/dist/cli/memoryCommand.js.map +1 -0
  119. package/dist/cli/reviewAudit.d.ts +68 -0
  120. package/dist/cli/reviewAudit.d.ts.map +1 -1
  121. package/dist/cli/reviewAudit.js +147 -4
  122. package/dist/cli/reviewAudit.js.map +1 -1
  123. package/dist/cli/reviewMaxCommand.d.ts +2 -0
  124. package/dist/cli/reviewMaxCommand.d.ts.map +1 -1
  125. package/dist/cli/reviewMaxCommand.js +61 -36
  126. package/dist/cli/reviewMaxCommand.js.map +1 -1
  127. package/dist/cli.js +68 -13
  128. package/dist/cli.js.map +1 -1
  129. package/dist/core/config.d.ts +413 -0
  130. package/dist/core/config.d.ts.map +1 -1
  131. package/dist/core/config.js +51 -5
  132. package/dist/core/config.js.map +1 -1
  133. package/dist/core/eventHub.d.ts +22 -0
  134. package/dist/core/eventHub.d.ts.map +1 -1
  135. package/dist/core/eventHub.js +1 -0
  136. package/dist/core/eventHub.js.map +1 -1
  137. package/dist/core/providerOverride.d.ts +9 -0
  138. package/dist/core/providerOverride.d.ts.map +1 -1
  139. package/dist/core/providerOverride.js +12 -0
  140. package/dist/core/providerOverride.js.map +1 -1
  141. package/dist/core/service.d.ts.map +1 -1
  142. package/dist/core/service.js +8 -2
  143. package/dist/core/service.js.map +1 -1
  144. package/dist/core/types.d.ts +61 -1
  145. package/dist/core/types.d.ts.map +1 -1
  146. package/dist/linear/linear.d.ts +2 -1
  147. package/dist/linear/linear.d.ts.map +1 -1
  148. package/dist/linear/linear.js +16 -6
  149. package/dist/linear/linear.js.map +1 -1
  150. package/dist/locale/prompts/en.d.ts.map +1 -1
  151. package/dist/locale/prompts/en.js +11 -1
  152. package/dist/locale/prompts/en.js.map +1 -1
  153. package/dist/locale/prompts/ko.d.ts.map +1 -1
  154. package/dist/locale/prompts/ko.js +11 -1
  155. package/dist/locale/prompts/ko.js.map +1 -1
  156. package/dist/memory/compaction.d.ts +2 -2
  157. package/dist/memory/compaction.d.ts.map +1 -1
  158. package/dist/memory/compaction.js +22 -17
  159. package/dist/memory/compaction.js.map +1 -1
  160. package/dist/memory/index.d.ts +3 -3
  161. package/dist/memory/index.js +3 -3
  162. package/dist/memory/memoryCore.d.ts +15 -27
  163. package/dist/memory/memoryCore.d.ts.map +1 -1
  164. package/dist/memory/memoryCore.js +112 -97
  165. package/dist/memory/memoryCore.js.map +1 -1
  166. package/dist/memory/memoryFilters.d.ts +8 -0
  167. package/dist/memory/memoryFilters.d.ts.map +1 -0
  168. package/dist/memory/memoryFilters.js +26 -0
  169. package/dist/memory/memoryFilters.js.map +1 -0
  170. package/dist/memory/memoryOps.d.ts +7 -23
  171. package/dist/memory/memoryOps.d.ts.map +1 -1
  172. package/dist/memory/memoryOps.js +49 -109
  173. package/dist/memory/memoryOps.js.map +1 -1
  174. package/dist/memory/repoKnowledge.d.ts.map +1 -1
  175. package/dist/memory/repoKnowledge.js +48 -3
  176. package/dist/memory/repoKnowledge.js.map +1 -1
  177. package/dist/orchestration/conflictDetector.d.ts.map +1 -1
  178. package/dist/orchestration/conflictDetector.js +26 -7
  179. package/dist/orchestration/conflictDetector.js.map +1 -1
  180. package/dist/orchestration/taskScheduler.d.ts +5 -0
  181. package/dist/orchestration/taskScheduler.d.ts.map +1 -1
  182. package/dist/orchestration/taskScheduler.js +36 -12
  183. package/dist/orchestration/taskScheduler.js.map +1 -1
  184. package/dist/registry/memoryBridge.js +4 -4
  185. package/dist/registry/memoryBridge.js.map +1 -1
  186. package/dist/support/chatMemory.js +1 -1
  187. package/dist/support/chatMemory.js.map +1 -1
  188. package/dist/support/dashboardHtml.d.ts +1 -1
  189. package/dist/support/dashboardHtml.d.ts.map +1 -1
  190. package/dist/support/dashboardHtml.js +12 -0
  191. package/dist/support/dashboardHtml.js.map +1 -1
  192. package/dist/support/gitTracker.d.ts +30 -3
  193. package/dist/support/gitTracker.d.ts.map +1 -1
  194. package/dist/support/gitTracker.js +108 -29
  195. package/dist/support/gitTracker.js.map +1 -1
  196. package/dist/support/repoMetadata.d.ts +10 -0
  197. package/dist/support/repoMetadata.d.ts.map +1 -1
  198. package/dist/support/repoMetadata.js +31 -0
  199. package/dist/support/repoMetadata.js.map +1 -1
  200. package/dist/support/updateNotifier.d.ts +12 -0
  201. package/dist/support/updateNotifier.d.ts.map +1 -1
  202. package/dist/support/updateNotifier.js +71 -0
  203. package/dist/support/updateNotifier.js.map +1 -1
  204. package/dist/support/web.d.ts.map +1 -1
  205. package/dist/support/web.js +5 -3
  206. package/dist/support/web.js.map +1 -1
  207. package/dist/support/worktreeManager.d.ts +33 -0
  208. package/dist/support/worktreeManager.d.ts.map +1 -1
  209. package/dist/support/worktreeManager.js +172 -2
  210. package/dist/support/worktreeManager.js.map +1 -1
  211. package/dist/tui/App.js +1 -1
  212. package/dist/tui/App.js.map +1 -1
  213. package/dist/tui/components/AuditBoard.d.ts +3 -2
  214. package/dist/tui/components/AuditBoard.d.ts.map +1 -1
  215. package/dist/tui/components/AuditBoard.js +13 -4
  216. package/dist/tui/components/AuditBoard.js.map +1 -1
  217. package/dist/tui/components/DataTable.d.ts +3 -1
  218. package/dist/tui/components/DataTable.d.ts.map +1 -1
  219. package/dist/tui/components/DataTable.js +22 -5
  220. package/dist/tui/components/DataTable.js.map +1 -1
  221. package/dist/tui/components/StageTimeline.d.ts +1 -1
  222. package/dist/tui/components/StageTimeline.d.ts.map +1 -1
  223. package/dist/tui/components/StageTimeline.js +5 -2
  224. package/dist/tui/components/StageTimeline.js.map +1 -1
  225. package/dist/tui/components/SubagentTree.d.ts +6 -6
  226. package/dist/tui/components/SubagentTree.d.ts.map +1 -1
  227. package/dist/tui/components/SubagentTree.js +33 -5
  228. package/dist/tui/components/SubagentTree.js.map +1 -1
  229. package/dist/tui/eventCoalescer.d.ts +29 -0
  230. package/dist/tui/eventCoalescer.d.ts.map +1 -0
  231. package/dist/tui/eventCoalescer.js +56 -0
  232. package/dist/tui/eventCoalescer.js.map +1 -0
  233. package/dist/tui/hooks/usePipelineEvents.d.ts +1 -1
  234. package/dist/tui/hooks/usePipelineEvents.d.ts.map +1 -1
  235. package/dist/tui/hooks/usePipelineEvents.js +18 -4
  236. package/dist/tui/hooks/usePipelineEvents.js.map +1 -1
  237. package/dist/tui/monitorRows.d.ts +41 -2
  238. package/dist/tui/monitorRows.d.ts.map +1 -1
  239. package/dist/tui/monitorRows.js +86 -7
  240. package/dist/tui/monitorRows.js.map +1 -1
  241. package/dist/tui/panels/MonitorPanel.d.ts +2 -1
  242. package/dist/tui/panels/MonitorPanel.d.ts.map +1 -1
  243. package/dist/tui/panels/MonitorPanel.js +2 -2
  244. package/dist/tui/panels/MonitorPanel.js.map +1 -1
  245. package/dist/tui/panels/PipelinePanel.d.ts.map +1 -1
  246. package/dist/tui/panels/PipelinePanel.js +6 -1
  247. package/dist/tui/panels/PipelinePanel.js.map +1 -1
  248. package/dist/tui/pipelineEvents.d.ts +14 -0
  249. package/dist/tui/pipelineEvents.d.ts.map +1 -1
  250. package/dist/tui/pipelineEvents.js +89 -1
  251. package/dist/tui/pipelineEvents.js.map +1 -1
  252. package/dist/tui/subagentTree.d.ts +26 -3
  253. package/dist/tui/subagentTree.d.ts.map +1 -1
  254. package/dist/tui/subagentTree.js +89 -14
  255. package/dist/tui/subagentTree.js.map +1 -1
  256. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"AuditBoard.d.ts","sourceRoot":"","sources":["../../../src/tui/components/AuditBoard.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD,OAAO,KAAK,EAAE,SAAS,EAAiB,MAAM,0BAA0B,CAAC;AASzE,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,gEAAgE;IAChE,MAAM,EAAE,YAAY,CAAC;CACtB;AAID,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,eAAe,+BA6DzE"}
1
+ {"version":3,"file":"AuditBoard.d.ts","sourceRoot":"","sources":["../../../src/tui/components/AuditBoard.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD,OAAO,KAAK,EAAE,SAAS,EAA8B,MAAM,0BAA0B,CAAC;AAUtF,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,gDAAgD;IAChD,MAAM,EAAE,YAAY,CAAC;IACrB,IAAI,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;CACxB;AAID,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,IAAc,EAAE,EAAE,eAAe,+BA6EzF"}
@@ -10,7 +10,7 @@ import { useState, useEffect } from 'react';
10
10
  import { theme, ICON } from '../theme.js';
11
11
  import { Spinner } from './Status.js';
12
12
  const truncate = (s, n) => (s.length <= n ? s : `${s.slice(0, n - 1)}…`);
13
- export function AuditBoard({ areas, concurrency, events }) {
13
+ export function AuditBoard({ areas, concurrency, events, mode = 'audit' }) {
14
14
  const [statuses, setStatuses] = useState(() => Object.fromEntries(areas.map((a) => [a.label, { status: 'pending' }])));
15
15
  useEffect(() => {
16
16
  const onProgress = (e) => {
@@ -21,8 +21,14 @@ export function AuditBoard({ areas, concurrency, events }) {
21
21
  next = { ...cur, status: 'running' };
22
22
  else if (e.type === 'log')
23
23
  next = { ...cur, lastLog: e.line };
24
- else if (e.type === 'done')
25
- next = { ...cur, status: 'done', decision: e.decision };
24
+ else if (e.type === 'done') {
25
+ next = {
26
+ ...cur,
27
+ status: 'done',
28
+ decision: 'decision' in e ? e.decision : undefined,
29
+ filesChanged: 'filesChanged' in e ? e.filesChanged : undefined,
30
+ };
31
+ }
26
32
  else
27
33
  next = { ...cur, status: 'error', lastLog: e.error };
28
34
  return { ...prev, [e.label]: next };
@@ -40,6 +46,9 @@ export function AuditBoard({ areas, concurrency, events }) {
40
46
  const revised = entries.filter((s) => s.decision === 'revise').length;
41
47
  const rejected = entries.filter((s) => s.decision === 'reject').length;
42
48
  const failed = entries.filter((s) => s.status === 'error').length;
43
- return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { children: [_jsx(Spinner, {}), _jsx(Text, { bold: true, children: ` Codebase audit · ${done}/${areas.length} areas · concurrency ${concurrency}` })] }), running.map(([label, s]) => (_jsxs(Text, { color: theme.dim, children: [' ', _jsx(Spinner, {}), ` ${label}`, s.lastLog ? ` ${truncate(s.lastLog, 48)}` : ''] }, label))), _jsxs(Text, { color: theme.dim, children: [' ', _jsx(Text, { color: theme.ok, children: `${ICON.ok} ${approved} done` }), ' · ', _jsx(Text, { color: theme.accentAlt, children: `${ICON.revise} ${revised} revise` }), ' · ', _jsx(Text, { color: theme.err, children: `${ICON.fail} ${rejected} reject` }), failed ? (_jsxs(Text, { children: [' · ', _jsx(Text, { color: theme.warn, children: `${ICON.warn} ${failed} failed` })] })) : null] })] }));
49
+ const edited = entries.filter((s) => s.status === 'done' && (s.filesChanged ?? 0) > 0).length;
50
+ const touched = entries.reduce((sum, s) => sum + (s.filesChanged ?? 0), 0);
51
+ const title = mode === 'fix' ? 'Review fix pass' : 'Codebase audit';
52
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { children: [_jsx(Spinner, {}), _jsx(Text, { bold: true, children: ` ${title} · ${done}/${areas.length} areas · concurrency ${concurrency}` })] }), running.map(([label, s]) => (_jsxs(Text, { color: theme.dim, children: [' ', _jsx(Spinner, {}), ` ${label}`, s.lastLog ? ` ${truncate(s.lastLog, 48)}` : ''] }, label))), _jsxs(Text, { color: theme.dim, children: [' ', mode === 'fix' ? (_jsx(Text, { color: theme.ok, children: `${ICON.ok} ${edited} edited · ${touched} files` })) : (_jsxs(Text, { children: [_jsx(Text, { color: theme.ok, children: `${ICON.ok} ${approved} done` }), ' · ', _jsx(Text, { color: theme.accentAlt, children: `${ICON.revise} ${revised} revise` }), ' · ', _jsx(Text, { color: theme.err, children: `${ICON.fail} ${rejected} reject` })] })), failed ? (_jsxs(Text, { children: [' · ', _jsx(Text, { color: theme.warn, children: `${ICON.warn} ${failed} failed` })] })) : null] })] }));
44
53
  }
45
54
  //# sourceMappingURL=AuditBoard.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AuditBoard.js","sourceRoot":"","sources":["../../../src/tui/components/AuditBoard.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AuditBoard.js","sourceRoot":"","sources":["../../../src/tui/components/AuditBoard.tsx"],"names":[],"mappings":"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"}
@@ -1,6 +1,8 @@
1
1
  import type { Table } from '../monitorRows.js';
2
2
  export interface DataTableProps extends Table {
3
3
  empty?: string;
4
+ maxCellWidth?: number;
5
+ terminalWidth?: number;
4
6
  }
5
- export declare function DataTable({ columns, rows, empty }: DataTableProps): import("react").JSX.Element;
7
+ export declare function DataTable({ columns, rows, empty, maxCellWidth, terminalWidth }: DataTableProps): import("react").JSX.Element;
6
8
  //# sourceMappingURL=DataTable.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DataTable.d.ts","sourceRoot":"","sources":["../../../src/tui/components/DataTable.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE/C,MAAM,WAAW,cAAe,SAAQ,KAAK;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,cAAc,+BAiBjE"}
1
+ {"version":3,"file":"DataTable.d.ts","sourceRoot":"","sources":["../../../src/tui/components/DataTable.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE/C,MAAM,WAAW,cAAe,SAAQ,KAAK;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,YAAiB,EAAE,aAAa,EAAE,EAAE,cAAc,+BAkCnG"}
@@ -2,13 +2,30 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  // DataTable — minimal column-aligned table for the monitor tabs (S6).
3
3
  // Hand-rolled (no ink-table) to avoid peer-version risk on ink 7 / react 19.
4
4
  import { Box, Text } from 'ink';
5
- import { displayWidth } from '../../cli/reviewProgress.js';
6
- export function DataTable({ columns, rows, empty }) {
5
+ import { displayWidth, truncateLine } from '../../cli/reviewProgress.js';
6
+ export function DataTable({ columns, rows, empty, maxCellWidth = 28, terminalWidth }) {
7
7
  if (rows.length === 0) {
8
8
  return _jsx(Text, { dimColor: true, children: empty ?? '(no data)' });
9
9
  }
10
- const widths = columns.map((c, i) => Math.max(displayWidth(c), ...rows.map((r) => displayWidth(r[i] ?? ''))));
11
- const fmt = (cells) => cells.map((cell, i) => `${cell ?? ''}${' '.repeat(Math.max(0, widths[i] - displayWidth(cell ?? '')))}`).join(' ');
12
- return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { bold: true, children: fmt(columns) }), rows.map((r, i) => (_jsx(Text, { children: fmt(r) }, i)))] }));
10
+ const visibleColumnCount = terminalWidth
11
+ ? Math.max(1, Math.min(columns.length, terminalWidth))
12
+ : columns.length;
13
+ const rawColumns = columns.slice(0, visibleColumnCount);
14
+ const separatorWidth = terminalWidth && visibleColumnCount > 1
15
+ ? Math.max(0, Math.min(2, Math.floor((terminalWidth - visibleColumnCount) / (visibleColumnCount - 1))))
16
+ : 2;
17
+ const separator = ' '.repeat(separatorWidth);
18
+ const gapWidth = Math.max(0, visibleColumnCount - 1) * separatorWidth;
19
+ const availableCellWidth = terminalWidth ? Math.max(1, terminalWidth - gapWidth) : undefined;
20
+ const columnCount = Math.max(1, visibleColumnCount);
21
+ const cellWidth = availableCellWidth
22
+ ? Math.max(1, Math.min(maxCellWidth, Math.floor(availableCellWidth / columnCount)))
23
+ : maxCellWidth;
24
+ const clip = (value) => truncateLine(value, cellWidth);
25
+ const clippedColumns = rawColumns.map(clip);
26
+ const clippedRows = rows.map((row) => rawColumns.map((_, i) => clip(row[i] ?? '')));
27
+ const widths = clippedColumns.map((c, i) => Math.max(displayWidth(c), ...clippedRows.map((r) => displayWidth(r[i] ?? ''))));
28
+ const fmt = (cells) => cells.map((cell, i) => `${cell ?? ''}${' '.repeat(Math.max(0, widths[i] - displayWidth(cell ?? '')))}`).join(separator);
29
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { bold: true, children: fmt(clippedColumns) }), clippedRows.map((r, i) => (_jsx(Text, { children: fmt(r) }, i)))] }));
13
30
  }
14
31
  //# sourceMappingURL=DataTable.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DataTable.js","sourceRoot":"","sources":["../../../src/tui/components/DataTable.tsx"],"names":[],"mappings":";AAAA,sEAAsE;AACtE,6EAA6E;AAC7E,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAO3D,MAAM,UAAU,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAkB;IAChE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,KAAC,IAAI,IAAC,QAAQ,kBAAE,KAAK,IAAI,WAAW,GAAQ,CAAC;IACtD,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAClC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CACxE,CAAC;IACF,MAAM,GAAG,GAAG,CAAC,KAAe,EAAE,EAAE,CAC9B,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrH,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,KAAC,IAAI,IAAC,IAAI,kBAAE,GAAG,CAAC,OAAO,CAAC,GAAQ,EAC/B,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAClB,KAAC,IAAI,cAAU,GAAG,CAAC,CAAC,CAAC,IAAV,CAAC,CAAiB,CAC9B,CAAC,IACE,CACP,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"DataTable.js","sourceRoot":"","sources":["../../../src/tui/components/DataTable.tsx"],"names":[],"mappings":"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"}
@@ -3,5 +3,5 @@ export interface StageTimelineProps {
3
3
  stages: StageEntry[];
4
4
  max?: number;
5
5
  }
6
- export declare function StageTimeline({ stages, max }: StageTimelineProps): import("react").JSX.Element;
6
+ export declare const StageTimeline: import("react").NamedExoticComponent<StageTimelineProps>;
7
7
  //# sourceMappingURL=StageTimeline.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"StageTimeline.d.ts","sourceRoot":"","sources":["../../../src/tui/components/StageTimeline.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAKvD,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,aAAa,CAAC,EAAE,MAAM,EAAE,GAAQ,EAAE,EAAE,kBAAkB,+BAsBrE"}
1
+ {"version":3,"file":"StageTimeline.d.ts","sourceRoot":"","sources":["../../../src/tui/components/StageTimeline.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAKvD,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAID,eAAO,MAAM,aAAa,0DAsBxB,CAAC"}
@@ -3,10 +3,13 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  // Presentational: takes already-reduced stage entries (parity with the
4
4
  // dashboard's renderStages).
5
5
  import { Box, Text } from 'ink';
6
+ import { memo } from 'react';
6
7
  import { STATUS } from '../theme.js';
7
8
  // Single-sourced glyphs + colors (INT-2260): running → ◐, complete → ✓, fail → ✗.
8
9
  const KIND = { start: 'running', complete: 'ok', fail: 'err' };
9
- export function StageTimeline({ stages, max = 12 }) {
10
+ // Memoized so a log-only pipeline update (unchanged `stages` identity) skips
11
+ // re-rendering the timeline, cutting per-commit work during SSE bursts. (INT-2407)
12
+ export const StageTimeline = memo(function StageTimeline({ stages, max = 12 }) {
10
13
  const shown = max > 0 ? stages.slice(-max) : [];
11
14
  return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { bold: true, children: "Pipeline stages" }), shown.length === 0 ? (_jsx(Text, { dimColor: true, children: "(no stage activity yet)" })) : (shown.map((s, i) => {
12
15
  const dur = s.durationMs ? ` ${Math.round(s.durationMs / 1000)}s` : '';
@@ -15,5 +18,5 @@ export function StageTimeline({ stages, max = 12 }) {
15
18
  const st = STATUS[KIND[s.status]];
16
19
  return (_jsx(Text, { color: st.color, children: `${st.icon} ${s.stage}${model}${dur}${decision}` }, i));
17
20
  }))] }));
18
- }
21
+ });
19
22
  //# sourceMappingURL=StageTimeline.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"StageTimeline.js","sourceRoot":"","sources":["../../../src/tui/components/StageTimeline.tsx"],"names":[],"mappings":";AAAA,0EAA0E;AAC1E,uEAAuE;AACvE,6BAA6B;AAC7B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAIrC,kFAAkF;AAClF,MAAM,IAAI,GAA6C,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAOzG,MAAM,UAAU,aAAa,CAAC,EAAE,MAAM,EAAE,GAAG,GAAG,EAAE,EAAsB;IACpE,MAAM,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAChD,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,KAAC,IAAI,IAAC,IAAI,sCAAuB,EAChC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACpB,KAAC,IAAI,IAAC,QAAQ,8CAA+B,CAC9C,CAAC,CAAC,CAAC,CACF,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACjB,MAAM,GAAG,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvE,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7C,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtD,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;gBAClC,OAAO,CACL,KAAC,IAAI,IAAS,KAAK,EAAE,EAAE,CAAC,KAAK,YAC1B,GAAG,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,GAAG,KAAK,GAAG,GAAG,GAAG,QAAQ,EAAE,IADxC,CAAC,CAEL,CACR,CAAC;YACJ,CAAC,CAAC,CACH,IACG,CACP,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"StageTimeline.js","sourceRoot":"","sources":["../../../src/tui/components/StageTimeline.tsx"],"names":[],"mappings":";AAAA,0EAA0E;AAC1E,uEAAuE;AACvE,6BAA6B;AAC7B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAIrC,kFAAkF;AAClF,MAAM,IAAI,GAA6C,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAOzG,6EAA6E;AAC7E,mFAAmF;AACnF,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,aAAa,CAAC,EAAE,MAAM,EAAE,GAAG,GAAG,EAAE,EAAsB;IAC/F,MAAM,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAChD,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,KAAC,IAAI,IAAC,IAAI,sCAAuB,EAChC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACpB,KAAC,IAAI,IAAC,QAAQ,8CAA+B,CAC9C,CAAC,CAAC,CAAC,CACF,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACjB,MAAM,GAAG,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvE,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7C,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtD,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;gBAClC,OAAO,CACL,KAAC,IAAI,IAAS,KAAK,EAAE,EAAE,CAAC,KAAK,YAC1B,GAAG,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,GAAG,KAAK,GAAG,GAAG,GAAG,QAAQ,EAAE,IADxC,CAAC,CAEL,CACR,CAAC;YACJ,CAAC,CAAC,CACH,IACG,CACP,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -1,10 +1,10 @@
1
- import type { TaskNode } from '../subagentTree.js';
1
+ import type { RepositoryNode } from '../subagentTree.js';
2
2
  export interface SubagentTreeProps {
3
- tasks: TaskNode[];
4
- /** Max tasks shown (most recent). */
3
+ repositories: RepositoryNode[];
4
+ /** Max worktrees shown across each repository (most recent). */
5
5
  max?: number;
6
- /** Max stage children shown per task. */
7
- maxStages?: number;
6
+ /** Max role children shown per worktree. */
7
+ maxRoles?: number;
8
8
  }
9
- export declare function SubagentTree({ tasks, max, maxStages }: SubagentTreeProps): import("react").JSX.Element;
9
+ export declare const SubagentTree: import("react").NamedExoticComponent<SubagentTreeProps>;
10
10
  //# sourceMappingURL=SubagentTree.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SubagentTree.d.ts","sourceRoot":"","sources":["../../../src/tui/components/SubagentTree.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAc,MAAM,oBAAoB,CAAC;AAsB/D,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,qCAAqC;IACrC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,yCAAyC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,YAAY,CAAC,EAAE,KAAK,EAAE,GAAO,EAAE,SAAa,EAAE,EAAE,iBAAiB,+BAuBhF"}
1
+ {"version":3,"file":"SubagentTree.d.ts","sourceRoot":"","sources":["../../../src/tui/components/SubagentTree.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAc,MAAM,oBAAoB,CAAC;AAwBrE,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,gEAAgE;IAChE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAqBD,eAAO,MAAM,YAAY,yDAmCvB,CAAC"}
@@ -2,11 +2,14 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  // SubagentTree — concurrent tasks as a per-worktree agent tree (S7).
3
3
  // Presentational: takes nodes built by buildSubagentTree.
4
4
  import { Box, Text } from 'ink';
5
+ import { memo, useEffect, useState } from 'react';
5
6
  import { STATUS } from '../theme.js';
7
+ import { spinnerFrame } from '../loadingMessages.js';
6
8
  // Single-sourced glyphs + colors (INT-2260): running → ◐, complete → ✓, fail → ✗.
7
9
  const KIND = { start: 'running', complete: 'ok', fail: 'err' };
8
10
  const STAGE_LABEL_MAX_CHARS = 80;
9
11
  const MODEL_LABEL_MAX_CHARS = 80;
12
+ const NODE_LABEL_MAX_CHARS = 96;
10
13
  // eslint-disable-next-line no-control-regex
11
14
  const TERMINAL_ESCAPE_RE = /\x1b(?:\][^\x07]*(?:\x07|\x1b\\)|\[[0-?]*[ -/]*[@-~]|[@-Z\\-_])/g;
12
15
  // eslint-disable-next-line no-control-regex
@@ -19,10 +22,35 @@ function sanitizeTerminalLabel(value, maxChars) {
19
22
  function clampLimit(value) {
20
23
  return Number.isFinite(value) ? Math.max(0, Math.floor(value)) : 0;
21
24
  }
22
- export function SubagentTree({ tasks, max = 6, maxStages = 5 }) {
23
- const taskLimit = clampLimit(max);
24
- const stageLimit = clampLimit(maxStages);
25
- const shown = taskLimit === 0 ? [] : tasks.slice(-taskLimit);
26
- return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { bold: true, children: "Agents (by task)" }), shown.length === 0 ? (_jsx(Text, { dimColor: true, children: "(no active agents)" })) : (shown.map((task) => (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: STATUS[KIND[task.status]].color, children: `${STATUS[KIND[task.status]].icon} ${sanitizeTerminalLabel(task.taskId).slice(0, 16)}` }), (stageLimit === 0 ? [] : task.stages.slice(-stageLimit)).map((s, i) => (_jsx(Text, { dimColor: true, children: ` └ ${sanitizeTerminalLabel(s.stage, STAGE_LABEL_MAX_CHARS)}${s.model ? ` (${sanitizeTerminalLabel(s.model, MODEL_LABEL_MAX_CHARS)})` : ''} — ${s.status}` }, i)))] }, task.taskId))))] }));
25
+ function formatDuration(ms) {
26
+ if (ms == null)
27
+ return undefined;
28
+ if (ms < 1000)
29
+ return `${ms}ms`;
30
+ return `${Math.round(ms / 1000)}s`;
27
31
  }
32
+ function worktreeLabel(task) {
33
+ const id = task.issueIdentifier ?? task.taskId;
34
+ const branch = task.branch ? ` ${task.branch}` : task.worktree ? ` worktree/${task.worktree}` : '';
35
+ const stage = task.currentStage ? ` ${task.currentStage}` : '';
36
+ const duration = formatDuration(task.durationMs);
37
+ const decision = task.decision ? ` ${task.decision}` : '';
38
+ const title = task.title ? ` ${task.title}` : '';
39
+ return sanitizeTerminalLabel(`${id}${branch}${stage}${duration ? ` ${duration}` : ''}${decision}${title}`, NODE_LABEL_MAX_CHARS);
40
+ }
41
+ // Memoized so log-only pipeline updates (stable `repositories` identity from the
42
+ // panel's useMemo) skip re-rendering the tree — only stage changes rebuild it,
43
+ // which also keeps the spinner interval from re-subscribing each render. (INT-2407)
44
+ export const SubagentTree = memo(function SubagentTree({ repositories, max = 6, maxRoles = 5 }) {
45
+ const worktreeLimit = clampLimit(max);
46
+ const roleLimit = clampLimit(maxRoles);
47
+ const [tick, setTick] = useState(0);
48
+ useEffect(() => {
49
+ if (!repositories.some((repo) => repo.worktrees.some((task) => task.roles.some((role) => role.status === 'start'))))
50
+ return;
51
+ const timer = setInterval(() => setTick((value) => value + 1), 120);
52
+ return () => clearInterval(timer);
53
+ }, [repositories]);
54
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { bold: true, children: "Agents by repository" }), repositories.length === 0 || worktreeLimit === 0 ? (_jsx(Text, { dimColor: true, children: "(no active agents)" })) : (repositories.map((repo) => (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: STATUS[KIND[repo.status]].color, children: `${STATUS[KIND[repo.status]].icon} ${sanitizeTerminalLabel(repo.repository, NODE_LABEL_MAX_CHARS)}` }), repo.worktrees.slice(-worktreeLimit).map((task) => (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { dimColor: true, children: ` └ ${worktreeLabel(task)} — ${task.status}` }), (roleLimit === 0 ? [] : task.roles.slice(-roleLimit)).map((role, i) => (_jsx(Text, { dimColor: true, children: ` └ ${role.status === 'start' ? spinnerFrame(tick) : ''} ${sanitizeTerminalLabel(role.role, STAGE_LABEL_MAX_CHARS)}${role.model ? ` (${sanitizeTerminalLabel(role.model, MODEL_LABEL_MAX_CHARS)})` : ''} — ${role.status}${role.activity ? ` · ${sanitizeTerminalLabel(role.activity, STAGE_LABEL_MAX_CHARS)}` : ''}${role.rateLimitResetsAt ? ` · reset ${new Date(role.rateLimitResetsAt).toISOString()}` : ''}${role.decision ? `/${role.decision}` : ''}` }, i)))] }, `${repo.repository}:${task.taskId}`)))] }, repo.repository))))] }));
55
+ });
28
56
  //# sourceMappingURL=SubagentTree.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SubagentTree.js","sourceRoot":"","sources":["../../../src/tui/components/SubagentTree.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SubagentTree.js","sourceRoot":"","sources":["../../../src/tui/components/SubagentTree.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ type TimerHandle = ReturnType<typeof setTimeout>;
2
+ export interface Coalescer<T> {
3
+ /** Buffer an item; schedules a trailing flush if none is pending. */
4
+ push(item: T): void;
5
+ /** Immediately flush any buffered items (no-op when empty). */
6
+ flush(): void;
7
+ /** Drop buffered items and cancel a pending flush. */
8
+ cancel(): void;
9
+ /** Buffered-but-not-yet-flushed count (introspection/tests). */
10
+ pending(): number;
11
+ }
12
+ export interface CoalescerOptions<T> {
13
+ /** Receives the batch (in push order) on each flush. Never called with []. */
14
+ onFlush: (items: T[]) => void;
15
+ /** Max time an item waits before flushing. `<= 0` flushes synchronously on push. */
16
+ delayMs: number;
17
+ /** Injectable timer (defaults to global setTimeout) — swapped in tests. */
18
+ setTimer?: (cb: () => void, ms: number) => TimerHandle;
19
+ /** Injectable clear (defaults to global clearTimeout). */
20
+ clearTimer?: (handle: TimerHandle) => void;
21
+ }
22
+ /**
23
+ * Create a trailing-edge coalescer: the first `push` schedules a flush in
24
+ * `delayMs`; further pushes within that window accumulate without rescheduling,
25
+ * so throughput is bounded to one flush per `delayMs` and latency to `delayMs`.
26
+ */
27
+ export declare function createCoalescer<T>(options: CoalescerOptions<T>): Coalescer<T>;
28
+ export {};
29
+ //# sourceMappingURL=eventCoalescer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eventCoalescer.d.ts","sourceRoot":"","sources":["../../src/tui/eventCoalescer.ts"],"names":[],"mappings":"AASA,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;AAEjD,MAAM,WAAW,SAAS,CAAC,CAAC;IAC1B,qEAAqE;IACrE,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACpB,+DAA+D;IAC/D,KAAK,IAAI,IAAI,CAAC;IACd,sDAAsD;IACtD,MAAM,IAAI,IAAI,CAAC;IACf,gEAAgE;IAChE,OAAO,IAAI,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC;IACjC,8EAA8E;IAC9E,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC;IAC9B,oFAAoF;IACpF,OAAO,EAAE,MAAM,CAAC;IAChB,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,IAAI,EAAE,EAAE,EAAE,MAAM,KAAK,WAAW,CAAC;IACvD,0DAA0D;IAC1D,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;CAC5C;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAyC7E"}
@@ -0,0 +1,56 @@
1
+ // ============================================
2
+ // OpenSwarm - Event coalescer (INT-2407)
3
+ // Buffers a burst of items and flushes them as one batch at most once per
4
+ // `delayMs`, so rapid SSE events cause a single re-render instead of N. In the
5
+ // alternate-screen buffer every React commit repaints the whole frame, so N
6
+ // per-event commits = N visible erase/redraws = flicker. Pure (timer injectable)
7
+ // — unit-tested without React/ink.
8
+ // ============================================
9
+ /**
10
+ * Create a trailing-edge coalescer: the first `push` schedules a flush in
11
+ * `delayMs`; further pushes within that window accumulate without rescheduling,
12
+ * so throughput is bounded to one flush per `delayMs` and latency to `delayMs`.
13
+ */
14
+ export function createCoalescer(options) {
15
+ const setTimer = options.setTimer ?? ((cb, ms) => setTimeout(cb, ms));
16
+ const clearTimer = options.clearTimer ?? ((handle) => clearTimeout(handle));
17
+ let buffer = [];
18
+ let timer = null;
19
+ const emit = () => {
20
+ timer = null;
21
+ if (buffer.length === 0)
22
+ return;
23
+ const batch = buffer;
24
+ buffer = [];
25
+ options.onFlush(batch);
26
+ };
27
+ return {
28
+ push(item) {
29
+ buffer.push(item);
30
+ if (options.delayMs <= 0) {
31
+ emit();
32
+ return;
33
+ }
34
+ if (timer === null)
35
+ timer = setTimer(emit, options.delayMs);
36
+ },
37
+ flush() {
38
+ if (timer !== null) {
39
+ clearTimer(timer);
40
+ timer = null;
41
+ }
42
+ emit();
43
+ },
44
+ cancel() {
45
+ if (timer !== null) {
46
+ clearTimer(timer);
47
+ timer = null;
48
+ }
49
+ buffer = [];
50
+ },
51
+ pending() {
52
+ return buffer.length;
53
+ },
54
+ };
55
+ }
56
+ //# sourceMappingURL=eventCoalescer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eventCoalescer.js","sourceRoot":"","sources":["../../src/tui/eventCoalescer.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,yCAAyC;AACzC,0EAA0E;AAC1E,+EAA+E;AAC/E,4EAA4E;AAC5E,iFAAiF;AACjF,mCAAmC;AACnC,+CAA+C;AA0B/C;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAI,OAA4B;IAC7D,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IACtE,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5E,IAAI,MAAM,GAAQ,EAAE,CAAC;IACrB,IAAI,KAAK,GAAuB,IAAI,CAAC;IAErC,MAAM,IAAI,GAAG,GAAG,EAAE;QAChB,KAAK,GAAG,IAAI,CAAC;QACb,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAChC,MAAM,KAAK,GAAG,MAAM,CAAC;QACrB,MAAM,GAAG,EAAE,CAAC;QACZ,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC,CAAC;IAEF,OAAO;QACL,IAAI,CAAC,IAAI;YACP,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClB,IAAI,OAAO,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC;gBACzB,IAAI,EAAE,CAAC;gBACP,OAAO;YACT,CAAC;YACD,IAAI,KAAK,KAAK,IAAI;gBAAE,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAC9D,CAAC;QACD,KAAK;YACH,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACnB,UAAU,CAAC,KAAK,CAAC,CAAC;gBAClB,KAAK,GAAG,IAAI,CAAC;YACf,CAAC;YACD,IAAI,EAAE,CAAC;QACT,CAAC;QACD,MAAM;YACJ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACnB,UAAU,CAAC,KAAK,CAAC,CAAC;gBAClB,KAAK,GAAG,IAAI,CAAC;YACf,CAAC;YACD,MAAM,GAAG,EAAE,CAAC;QACd,CAAC;QACD,OAAO;YACL,OAAO,MAAM,CAAC,MAAM,CAAC;QACvB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -2,5 +2,5 @@ import { type PipelineState } from '../pipelineEvents.js';
2
2
  export interface PipelineEventsResult extends PipelineState {
3
3
  connected: boolean;
4
4
  }
5
- export declare function usePipelineEvents(port: number | undefined): PipelineEventsResult;
5
+ export declare function usePipelineEvents(port: number | undefined, flushMs?: number): PipelineEventsResult;
6
6
  //# sourceMappingURL=usePipelineEvents.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"usePipelineEvents.d.ts","sourceRoot":"","sources":["../../../src/tui/hooks/usePipelineEvents.ts"],"names":[],"mappings":"AASA,OAAO,EAA6C,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErG,MAAM,WAAW,oBAAqB,SAAQ,aAAa;IACzD,SAAS,EAAE,OAAO,CAAC;CACpB;AASD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,oBAAoB,CAgBhF"}
1
+ {"version":3,"file":"usePipelineEvents.d.ts","sourceRoot":"","sources":["../../../src/tui/hooks/usePipelineEvents.ts"],"names":[],"mappings":"AAWA,OAAO,EAIL,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAC;AAE9B,MAAM,WAAW,oBAAqB,SAAQ,aAAa;IACzD,SAAS,EAAE,OAAO,CAAC;CACpB;AAkBD,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,OAAO,GAAE,MAAyB,GACjC,oBAAoB,CAuBtB"}
@@ -6,13 +6,20 @@
6
6
  // ============================================
7
7
  import { useEffect, useReducer, useState } from 'react';
8
8
  import { connectEventStream } from '../sse.js';
9
- import { reducePipelineEvent, initialPipelineState } from '../pipelineEvents.js';
9
+ import { createCoalescer } from '../eventCoalescer.js';
10
+ import { reducePipelineEvent, reducePipelineEvents, initialPipelineState, } from '../pipelineEvents.js';
11
+ // Coalesce SSE bursts into at most one repaint per window. In the alternate
12
+ // screen every commit repaints the whole frame, so dispatching per event made
13
+ // the Pipeline tab flicker on every log/stage event. (INT-2407)
14
+ const DEFAULT_FLUSH_MS = 90;
10
15
  function pipelineReducer(state, action) {
11
16
  if (action.type === 'reset')
12
17
  return initialPipelineState;
18
+ if (action.type === 'batch')
19
+ return reducePipelineEvents(state, action.events);
13
20
  return reducePipelineEvent(state, action);
14
21
  }
15
- export function usePipelineEvents(port) {
22
+ export function usePipelineEvents(port, flushMs = DEFAULT_FLUSH_MS) {
16
23
  const [state, dispatch] = useReducer(pipelineReducer, initialPipelineState);
17
24
  const [connected, setConnected] = useState(false);
18
25
  useEffect(() => {
@@ -20,12 +27,19 @@ export function usePipelineEvents(port) {
20
27
  setConnected(false);
21
28
  if (!port)
22
29
  return;
23
- const handle = connectEventStream({ port, onEvent: dispatch, onStatus: setConnected });
30
+ // Buffer events and flush a single batched dispatch per window; connection
31
+ // status stays immediate (not coalesced) so the live indicator is snappy.
32
+ const coalescer = createCoalescer({
33
+ delayMs: flushMs,
34
+ onFlush: (events) => dispatch({ type: 'batch', events }),
35
+ });
36
+ const handle = connectEventStream({ port, onEvent: (e) => coalescer.push(e), onStatus: setConnected });
24
37
  return () => {
25
38
  setConnected(false);
39
+ coalescer.cancel();
26
40
  handle.close();
27
41
  };
28
- }, [port]);
42
+ }, [port, flushMs]);
29
43
  return { ...state, connected };
30
44
  }
31
45
  //# sourceMappingURL=usePipelineEvents.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"usePipelineEvents.js","sourceRoot":"","sources":["../../../src/tui/hooks/usePipelineEvents.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,8DAA8D;AAC9D,4EAA4E;AAC5E,4EAA4E;AAC5E,kDAAkD;AAClD,+CAA+C;AAE/C,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAsB,MAAM,sBAAsB,CAAC;AAQrG,SAAS,eAAe,CAAC,KAAoB,EAAE,MAAsB;IACnE,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,oBAAoB,CAAC;IACzD,OAAO,mBAAmB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAwB;IACxD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,UAAU,CAAC,eAAe,EAAE,oBAAoB,CAAC,CAAC;IAC5E,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAElD,SAAS,CAAC,GAAG,EAAE;QACb,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QAC5B,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,MAAM,MAAM,GAAG,kBAAkB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC;QACvF,OAAO,GAAG,EAAE;YACV,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,OAAO,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,CAAC;AACjC,CAAC"}
1
+ {"version":3,"file":"usePipelineEvents.js","sourceRoot":"","sources":["../../../src/tui/hooks/usePipelineEvents.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,8DAA8D;AAC9D,4EAA4E;AAC5E,4EAA4E;AAC5E,kDAAkD;AAClD,+CAA+C;AAE/C,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAExD,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,GAErB,MAAM,sBAAsB,CAAC;AAM9B,4EAA4E;AAC5E,8EAA8E;AAC9E,gEAAgE;AAChE,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAO5B,SAAS,eAAe,CAAC,KAAoB,EAAE,MAAsB;IACnE,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,oBAAoB,CAAC;IACzD,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,oBAAoB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/E,OAAO,mBAAmB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,IAAwB,EACxB,UAAkB,gBAAgB;IAElC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,UAAU,CAAC,eAAe,EAAE,oBAAoB,CAAC,CAAC;IAC5E,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAElD,SAAS,CAAC,GAAG,EAAE;QACb,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QAC5B,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,2EAA2E;QAC3E,0EAA0E;QAC1E,MAAM,SAAS,GAAG,eAAe,CAAW;YAC1C,OAAO,EAAE,OAAO;YAChB,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;SACzD,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,kBAAkB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC;QACvG,OAAO,GAAG,EAAE;YACV,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,SAAS,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IAEpB,OAAO,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,CAAC;AACjC,CAAC"}
@@ -4,10 +4,32 @@ export interface Table {
4
4
  }
5
5
  export interface ApiProject {
6
6
  name: string;
7
+ linearProject?: string;
7
8
  path: string;
8
9
  enabled: boolean;
9
- running?: string[];
10
- queued?: string[];
10
+ running?: ApiTaskSummary[];
11
+ queued?: ApiTaskSummary[];
12
+ pending?: ApiTaskSummary[];
13
+ git?: {
14
+ branch?: string;
15
+ hasChanges?: boolean;
16
+ uncommittedFiles?: number;
17
+ ahead?: number;
18
+ behind?: number;
19
+ } | null;
20
+ prs?: Array<{
21
+ number: number;
22
+ branch: string;
23
+ title: string;
24
+ updatedAt?: string;
25
+ }>;
26
+ }
27
+ interface ApiTaskSummary {
28
+ id: string;
29
+ title: string;
30
+ priority?: number | string;
31
+ issueIdentifier?: string;
32
+ linearState?: string;
11
33
  }
12
34
  export declare function projectsToTable(projects: ApiProject[]): Table;
13
35
  export interface ApiPipelineEvent {
@@ -19,6 +41,15 @@ export interface ApiPipelineEvent {
19
41
  model?: string;
20
42
  title?: string;
21
43
  issueIdentifier?: string;
44
+ repository?: string;
45
+ projectPath?: string;
46
+ durationMs?: number;
47
+ decision?: string;
48
+ summary?: string;
49
+ feedback?: string;
50
+ error?: string;
51
+ filesChangedCount?: number;
52
+ issuesCount?: number;
22
53
  };
23
54
  }
24
55
  /** Most-recent pipeline stage events as task rows (newest first). */
@@ -31,6 +62,13 @@ export interface ApiStuckIssue {
31
62
  project?: {
32
63
  name: string;
33
64
  };
65
+ state?: string;
66
+ labels?: string[];
67
+ comments?: Array<{
68
+ body: string;
69
+ createdAt: string;
70
+ }>;
71
+ stuckDays?: number;
34
72
  }
35
73
  export declare function stuckToTable(stuck: ApiStuckIssue[], failed: ApiStuckIssue[]): Table;
36
74
  export interface ApiIssue {
@@ -40,4 +78,5 @@ export interface ApiIssue {
40
78
  priority: number | string;
41
79
  }
42
80
  export declare function issuesToTable(issues: ApiIssue[]): Table;
81
+ export {};
43
82
  //# sourceMappingURL=monitorRows.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"monitorRows.d.ts","sourceRoot":"","sources":["../../src/tui/monitorRows.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,KAAK;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,KAAK,CAU7D;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE;QACJ,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH;AAID,qEAAqE;AACrE,wBAAgB,eAAe,CAAC,MAAM,EAAE,gBAAgB,EAAE,EAAE,KAAK,SAAK,GAAG,KAAK,CAoB7E;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5B;AAUD,wBAAgB,YAAY,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,KAAK,CAYnF;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;CAC3B;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,CASvD"}
1
+ {"version":3,"file":"monitorRows.d.ts","sourceRoot":"","sources":["../../src/tui/monitorRows.ts"],"names":[],"mappings":"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"}