@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.
- package/README.md +21 -5
- package/config.example.yaml +18 -0
- package/dist/adapters/agenticLoop.d.ts +2 -0
- package/dist/adapters/agenticLoop.d.ts.map +1 -1
- package/dist/adapters/agenticLoop.js +6 -3
- package/dist/adapters/agenticLoop.js.map +1 -1
- package/dist/adapters/base.d.ts.map +1 -1
- package/dist/adapters/base.js +9 -0
- package/dist/adapters/base.js.map +1 -1
- package/dist/adapters/claude.d.ts.map +1 -1
- package/dist/adapters/claude.js +6 -3
- package/dist/adapters/claude.js.map +1 -1
- package/dist/adapters/codex.d.ts.map +1 -1
- package/dist/adapters/codex.js +3 -2
- package/dist/adapters/codex.js.map +1 -1
- package/dist/adapters/codexResponses.d.ts +2 -1
- package/dist/adapters/codexResponses.d.ts.map +1 -1
- package/dist/adapters/codexResponses.js +34 -30
- package/dist/adapters/codexResponses.js.map +1 -1
- package/dist/adapters/errorClassification.d.ts +11 -0
- package/dist/adapters/errorClassification.d.ts.map +1 -1
- package/dist/adapters/errorClassification.js +21 -0
- package/dist/adapters/errorClassification.js.map +1 -1
- package/dist/adapters/gpt.d.ts.map +1 -1
- package/dist/adapters/gpt.js +1 -0
- package/dist/adapters/gpt.js.map +1 -1
- package/dist/adapters/local.d.ts.map +1 -1
- package/dist/adapters/local.js +1 -0
- package/dist/adapters/local.js.map +1 -1
- package/dist/adapters/openrouter.d.ts.map +1 -1
- package/dist/adapters/openrouter.js +1 -0
- package/dist/adapters/openrouter.js.map +1 -1
- package/dist/adapters/processRegistry.d.ts.map +1 -1
- package/dist/adapters/processRegistry.js +8 -0
- package/dist/adapters/processRegistry.js.map +1 -1
- package/dist/adapters/types.d.ts +2 -0
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/agents/pairPipeline.d.ts +10 -139
- package/dist/agents/pairPipeline.d.ts.map +1 -1
- package/dist/agents/pairPipeline.js +127 -35
- package/dist/agents/pairPipeline.js.map +1 -1
- package/dist/agents/pairPipelineTypes.d.ts +109 -0
- package/dist/agents/pairPipelineTypes.d.ts.map +1 -0
- package/dist/agents/pairPipelineTypes.js +2 -0
- package/dist/agents/pairPipelineTypes.js.map +1 -0
- package/dist/agents/pipelineGuards.d.ts.map +1 -1
- package/dist/agents/pipelineGuards.js +346 -0
- package/dist/agents/pipelineGuards.js.map +1 -1
- package/dist/agents/pipelineTaskPrefix.d.ts +3 -0
- package/dist/agents/pipelineTaskPrefix.d.ts.map +1 -0
- package/dist/agents/pipelineTaskPrefix.js +16 -0
- package/dist/agents/pipelineTaskPrefix.js.map +1 -0
- package/dist/agents/reflection.d.ts +1 -1
- package/dist/agents/reflection.d.ts.map +1 -1
- package/dist/agents/reflection.js +3 -1
- package/dist/agents/reflection.js.map +1 -1
- package/dist/agents/reviewer.d.ts +6 -0
- package/dist/agents/reviewer.d.ts.map +1 -1
- package/dist/agents/reviewer.js +4 -1
- package/dist/agents/reviewer.js.map +1 -1
- package/dist/agents/stageErrorClassification.d.ts +16 -0
- package/dist/agents/stageErrorClassification.d.ts.map +1 -0
- package/dist/agents/stageErrorClassification.js +38 -0
- package/dist/agents/stageErrorClassification.js.map +1 -0
- package/dist/agents/stageModelResolver.d.ts +8 -0
- package/dist/agents/stageModelResolver.d.ts.map +1 -0
- package/dist/agents/stageModelResolver.js +22 -0
- package/dist/agents/stageModelResolver.js.map +1 -0
- package/dist/agents/worker.d.ts +33 -0
- package/dist/agents/worker.d.ts.map +1 -1
- package/dist/agents/worker.js +59 -4
- package/dist/agents/worker.js.map +1 -1
- package/dist/agents/workerFanout.d.ts +38 -0
- package/dist/agents/workerFanout.d.ts.map +1 -0
- package/dist/agents/workerFanout.js +277 -0
- package/dist/agents/workerFanout.js.map +1 -0
- package/dist/agents/workerFanoutGate.d.ts +48 -0
- package/dist/agents/workerFanoutGate.d.ts.map +1 -0
- package/dist/agents/workerFanoutGate.js +146 -0
- package/dist/agents/workerFanoutGate.js.map +1 -0
- package/dist/agents/workerValidationEvidence.d.ts +5 -0
- package/dist/agents/workerValidationEvidence.d.ts.map +1 -0
- package/dist/agents/workerValidationEvidence.js +75 -0
- package/dist/agents/workerValidationEvidence.js.map +1 -0
- package/dist/automation/autonomousRunner.d.ts +18 -6
- package/dist/automation/autonomousRunner.d.ts.map +1 -1
- package/dist/automation/autonomousRunner.js +209 -39
- package/dist/automation/autonomousRunner.js.map +1 -1
- package/dist/automation/backlogGrooming.d.ts +52 -0
- package/dist/automation/backlogGrooming.d.ts.map +1 -0
- package/dist/automation/backlogGrooming.js +231 -0
- package/dist/automation/backlogGrooming.js.map +1 -0
- package/dist/automation/runnerExecution.d.ts +1 -1
- package/dist/automation/runnerExecution.d.ts.map +1 -1
- package/dist/automation/runnerExecution.js +31 -9
- package/dist/automation/runnerExecution.js.map +1 -1
- package/dist/automation/runnerTypes.d.ts +3 -1
- package/dist/automation/runnerTypes.d.ts.map +1 -1
- package/dist/automation/taskSource.d.ts +6 -3
- package/dist/automation/taskSource.d.ts.map +1 -1
- package/dist/automation/taskSource.js +5 -0
- package/dist/automation/taskSource.js.map +1 -1
- package/dist/cli/daemon.d.ts +20 -3
- package/dist/cli/daemon.d.ts.map +1 -1
- package/dist/cli/daemon.js +42 -2
- package/dist/cli/daemon.js.map +1 -1
- package/dist/cli/fixBoard.d.ts +14 -0
- package/dist/cli/fixBoard.d.ts.map +1 -0
- package/dist/cli/fixBoard.js +32 -0
- package/dist/cli/fixBoard.js.map +1 -0
- package/dist/cli/fixCommand.d.ts +8 -0
- package/dist/cli/fixCommand.d.ts.map +1 -1
- package/dist/cli/fixCommand.js +47 -8
- package/dist/cli/fixCommand.js.map +1 -1
- package/dist/cli/memoryCommand.d.ts +37 -0
- package/dist/cli/memoryCommand.d.ts.map +1 -0
- package/dist/cli/memoryCommand.js +156 -0
- package/dist/cli/memoryCommand.js.map +1 -0
- package/dist/cli/reviewAudit.d.ts +68 -0
- package/dist/cli/reviewAudit.d.ts.map +1 -1
- package/dist/cli/reviewAudit.js +147 -4
- package/dist/cli/reviewAudit.js.map +1 -1
- package/dist/cli/reviewMaxCommand.d.ts +2 -0
- package/dist/cli/reviewMaxCommand.d.ts.map +1 -1
- package/dist/cli/reviewMaxCommand.js +61 -36
- package/dist/cli/reviewMaxCommand.js.map +1 -1
- package/dist/cli.js +68 -13
- package/dist/cli.js.map +1 -1
- package/dist/core/config.d.ts +413 -0
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +51 -5
- package/dist/core/config.js.map +1 -1
- package/dist/core/eventHub.d.ts +22 -0
- package/dist/core/eventHub.d.ts.map +1 -1
- package/dist/core/eventHub.js +1 -0
- package/dist/core/eventHub.js.map +1 -1
- package/dist/core/providerOverride.d.ts +9 -0
- package/dist/core/providerOverride.d.ts.map +1 -1
- package/dist/core/providerOverride.js +12 -0
- package/dist/core/providerOverride.js.map +1 -1
- package/dist/core/service.d.ts.map +1 -1
- package/dist/core/service.js +8 -2
- package/dist/core/service.js.map +1 -1
- package/dist/core/types.d.ts +61 -1
- package/dist/core/types.d.ts.map +1 -1
- package/dist/linear/linear.d.ts +2 -1
- package/dist/linear/linear.d.ts.map +1 -1
- package/dist/linear/linear.js +16 -6
- package/dist/linear/linear.js.map +1 -1
- package/dist/locale/prompts/en.d.ts.map +1 -1
- package/dist/locale/prompts/en.js +11 -1
- package/dist/locale/prompts/en.js.map +1 -1
- package/dist/locale/prompts/ko.d.ts.map +1 -1
- package/dist/locale/prompts/ko.js +11 -1
- package/dist/locale/prompts/ko.js.map +1 -1
- package/dist/memory/compaction.d.ts +2 -2
- package/dist/memory/compaction.d.ts.map +1 -1
- package/dist/memory/compaction.js +22 -17
- package/dist/memory/compaction.js.map +1 -1
- package/dist/memory/index.d.ts +3 -3
- package/dist/memory/index.js +3 -3
- package/dist/memory/memoryCore.d.ts +15 -27
- package/dist/memory/memoryCore.d.ts.map +1 -1
- package/dist/memory/memoryCore.js +112 -97
- package/dist/memory/memoryCore.js.map +1 -1
- package/dist/memory/memoryFilters.d.ts +8 -0
- package/dist/memory/memoryFilters.d.ts.map +1 -0
- package/dist/memory/memoryFilters.js +26 -0
- package/dist/memory/memoryFilters.js.map +1 -0
- package/dist/memory/memoryOps.d.ts +7 -23
- package/dist/memory/memoryOps.d.ts.map +1 -1
- package/dist/memory/memoryOps.js +49 -109
- package/dist/memory/memoryOps.js.map +1 -1
- package/dist/memory/repoKnowledge.d.ts.map +1 -1
- package/dist/memory/repoKnowledge.js +48 -3
- package/dist/memory/repoKnowledge.js.map +1 -1
- package/dist/orchestration/conflictDetector.d.ts.map +1 -1
- package/dist/orchestration/conflictDetector.js +26 -7
- package/dist/orchestration/conflictDetector.js.map +1 -1
- package/dist/orchestration/taskScheduler.d.ts +5 -0
- package/dist/orchestration/taskScheduler.d.ts.map +1 -1
- package/dist/orchestration/taskScheduler.js +36 -12
- package/dist/orchestration/taskScheduler.js.map +1 -1
- package/dist/registry/memoryBridge.js +4 -4
- package/dist/registry/memoryBridge.js.map +1 -1
- package/dist/support/chatMemory.js +1 -1
- package/dist/support/chatMemory.js.map +1 -1
- package/dist/support/dashboardHtml.d.ts +1 -1
- package/dist/support/dashboardHtml.d.ts.map +1 -1
- package/dist/support/dashboardHtml.js +12 -0
- package/dist/support/dashboardHtml.js.map +1 -1
- package/dist/support/gitTracker.d.ts +30 -3
- package/dist/support/gitTracker.d.ts.map +1 -1
- package/dist/support/gitTracker.js +108 -29
- package/dist/support/gitTracker.js.map +1 -1
- package/dist/support/repoMetadata.d.ts +10 -0
- package/dist/support/repoMetadata.d.ts.map +1 -1
- package/dist/support/repoMetadata.js +31 -0
- package/dist/support/repoMetadata.js.map +1 -1
- package/dist/support/updateNotifier.d.ts +12 -0
- package/dist/support/updateNotifier.d.ts.map +1 -1
- package/dist/support/updateNotifier.js +71 -0
- package/dist/support/updateNotifier.js.map +1 -1
- package/dist/support/web.d.ts.map +1 -1
- package/dist/support/web.js +5 -3
- package/dist/support/web.js.map +1 -1
- package/dist/support/worktreeManager.d.ts +33 -0
- package/dist/support/worktreeManager.d.ts.map +1 -1
- package/dist/support/worktreeManager.js +172 -2
- package/dist/support/worktreeManager.js.map +1 -1
- package/dist/tui/App.js +1 -1
- package/dist/tui/App.js.map +1 -1
- package/dist/tui/components/AuditBoard.d.ts +3 -2
- package/dist/tui/components/AuditBoard.d.ts.map +1 -1
- package/dist/tui/components/AuditBoard.js +13 -4
- package/dist/tui/components/AuditBoard.js.map +1 -1
- package/dist/tui/components/DataTable.d.ts +3 -1
- package/dist/tui/components/DataTable.d.ts.map +1 -1
- package/dist/tui/components/DataTable.js +22 -5
- package/dist/tui/components/DataTable.js.map +1 -1
- package/dist/tui/components/StageTimeline.d.ts +1 -1
- package/dist/tui/components/StageTimeline.d.ts.map +1 -1
- package/dist/tui/components/StageTimeline.js +5 -2
- package/dist/tui/components/StageTimeline.js.map +1 -1
- package/dist/tui/components/SubagentTree.d.ts +6 -6
- package/dist/tui/components/SubagentTree.d.ts.map +1 -1
- package/dist/tui/components/SubagentTree.js +33 -5
- package/dist/tui/components/SubagentTree.js.map +1 -1
- package/dist/tui/eventCoalescer.d.ts +29 -0
- package/dist/tui/eventCoalescer.d.ts.map +1 -0
- package/dist/tui/eventCoalescer.js +56 -0
- package/dist/tui/eventCoalescer.js.map +1 -0
- package/dist/tui/hooks/usePipelineEvents.d.ts +1 -1
- package/dist/tui/hooks/usePipelineEvents.d.ts.map +1 -1
- package/dist/tui/hooks/usePipelineEvents.js +18 -4
- package/dist/tui/hooks/usePipelineEvents.js.map +1 -1
- package/dist/tui/monitorRows.d.ts +41 -2
- package/dist/tui/monitorRows.d.ts.map +1 -1
- package/dist/tui/monitorRows.js +86 -7
- package/dist/tui/monitorRows.js.map +1 -1
- package/dist/tui/panels/MonitorPanel.d.ts +2 -1
- package/dist/tui/panels/MonitorPanel.d.ts.map +1 -1
- package/dist/tui/panels/MonitorPanel.js +2 -2
- package/dist/tui/panels/MonitorPanel.js.map +1 -1
- package/dist/tui/panels/PipelinePanel.d.ts.map +1 -1
- package/dist/tui/panels/PipelinePanel.js +6 -1
- package/dist/tui/panels/PipelinePanel.js.map +1 -1
- package/dist/tui/pipelineEvents.d.ts +14 -0
- package/dist/tui/pipelineEvents.d.ts.map +1 -1
- package/dist/tui/pipelineEvents.js +89 -1
- package/dist/tui/pipelineEvents.js.map +1 -1
- package/dist/tui/subagentTree.d.ts +26 -3
- package/dist/tui/subagentTree.d.ts.map +1 -1
- package/dist/tui/subagentTree.js +89 -14
- package/dist/tui/subagentTree.js.map +1 -1
- 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,
|
|
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 = {
|
|
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
|
-
|
|
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":";AAAA,8EAA8E;AAC9E,gFAAgF;AAChF,+EAA+E;AAC/E,8EAA8E;AAC9E,2EAA2E;AAC3E,+CAA+C;AAC/C,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAE5C,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;
|
|
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;
|
|
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
|
|
11
|
-
|
|
12
|
-
|
|
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;
|
|
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
|
|
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":"
|
|
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
|
-
|
|
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,
|
|
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 {
|
|
1
|
+
import type { RepositoryNode } from '../subagentTree.js';
|
|
2
2
|
export interface SubagentTreeProps {
|
|
3
|
-
|
|
4
|
-
/** Max
|
|
3
|
+
repositories: RepositoryNode[];
|
|
4
|
+
/** Max worktrees shown across each repository (most recent). */
|
|
5
5
|
max?: number;
|
|
6
|
-
/** Max
|
|
7
|
-
|
|
6
|
+
/** Max role children shown per worktree. */
|
|
7
|
+
maxRoles?: number;
|
|
8
8
|
}
|
|
9
|
-
export declare
|
|
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":"
|
|
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
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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":";AAAA,qEAAqE;AACrE,0DAA0D;AAC1D,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"SubagentTree.js","sourceRoot":"","sources":["../../../src/tui/components/SubagentTree.tsx"],"names":[],"mappings":";AAAA,qEAAqE;AACrE,0DAA0D;AAC1D,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,kFAAkF;AAClF,MAAM,IAAI,GAAmC,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAC/F,MAAM,qBAAqB,GAAG,EAAE,CAAC;AACjC,MAAM,qBAAqB,GAAG,EAAE,CAAC;AACjC,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEhC,4CAA4C;AAC5C,MAAM,kBAAkB,GAAG,kEAAkE,CAAC;AAC9F,4CAA4C;AAC5C,MAAM,UAAU,GAAG,uBAAuB,CAAC;AAE3C,SAAS,qBAAqB,CAAC,KAAyB,EAAE,QAAiB;IACzE,MAAM,GAAG,GAAG,KAAK,IAAI,EAAE,CAAC;IACxB,MAAM,OAAO,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IACtE,OAAO,OAAO,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AACzE,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACrE,CAAC;AAUD,SAAS,cAAc,CAAC,EAAsB;IAC5C,IAAI,EAAE,IAAI,IAAI;QAAE,OAAO,SAAS,CAAC;IACjC,IAAI,EAAE,GAAG,IAAI;QAAE,OAAO,GAAG,EAAE,IAAI,CAAC;IAChC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC;AACrC,CAAC;AAED,SAAS,aAAa,CAAC,IAAyC;IAC9D,MAAM,EAAE,GAAG,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,MAAM,CAAC;IAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACnG,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/D,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACjD,OAAO,qBAAqB,CAAC,GAAG,EAAE,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,QAAQ,GAAG,KAAK,EAAE,EAAE,oBAAoB,CAAC,CAAC;AACnI,CAAC;AAED,iFAAiF;AACjF,+EAA+E;AAC/E,oFAAoF;AACpF,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,YAAY,CAAC,EAAE,YAAY,EAAE,GAAG,GAAG,CAAC,EAAE,QAAQ,GAAG,CAAC,EAAqB;IAC/G,MAAM,aAAa,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,SAAS,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAEpC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC;YAAE,OAAO;QAC5H,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACpE,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnB,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,KAAC,IAAI,IAAC,IAAI,2CAA4B,EACrC,YAAY,CAAC,MAAM,KAAK,CAAC,IAAI,aAAa,KAAK,CAAC,CAAC,CAAC,CAAC,CAClD,KAAC,IAAI,IAAC,QAAQ,yCAA0B,CACzC,CAAC,CAAC,CAAC,CACF,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACzB,MAAC,GAAG,IAAuB,aAAa,EAAC,QAAQ,aAC/C,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,YAAG,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,qBAAqB,CAAC,IAAI,CAAC,UAAU,EAAE,oBAAoB,CAAC,EAAE,GAAQ,EACzJ,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAClD,MAAC,GAAG,IAA2C,aAAa,EAAC,QAAQ,aACnE,KAAC,IAAI,IAAC,QAAQ,kBAAE,OAAO,aAAa,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,GAAQ,EACpE,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CACtE,KAAC,IAAI,IAAS,QAAQ,kBACnB,UAAU,IAAI,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,qBAAqB,CAAC,IAAI,CAAC,IAAI,EAAE,qBAAqB,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,qBAAqB,CAAC,IAAI,CAAC,KAAK,EAAE,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,qBAAqB,CAAC,IAAI,CAAC,QAAQ,EAAE,qBAAqB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,IADzb,CAAC,CAEL,CACR,CAAC,KANM,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,MAAM,EAAE,CAOvC,CACP,CAAC,KAXM,IAAI,CAAC,UAAU,CAYnB,CACP,CAAC,CACH,IACG,CACP,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -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":"
|
|
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 {
|
|
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
|
-
|
|
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;
|
|
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?:
|
|
10
|
-
queued?:
|
|
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;
|
|
1
|
+
{"version":3,"file":"monitorRows.d.ts","sourceRoot":"","sources":["../../src/tui/monitorRows.ts"],"names":[],"mappings":"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"}
|