@agents-ensemble/cli 0.0.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/dist/async-operator-input.d.ts +6 -0
  2. package/dist/async-operator-input.d.ts.map +1 -0
  3. package/dist/async-operator-input.js +58 -0
  4. package/dist/async-operator-input.js.map +1 -0
  5. package/dist/display/create-session-display-sink.d.ts +9 -0
  6. package/dist/display/create-session-display-sink.d.ts.map +1 -0
  7. package/dist/display/create-session-display-sink.js +31 -0
  8. package/dist/display/create-session-display-sink.js.map +1 -0
  9. package/dist/display/select-session-display-backend.d.ts +11 -0
  10. package/dist/display/select-session-display-backend.d.ts.map +1 -0
  11. package/dist/display/select-session-display-backend.js +16 -0
  12. package/dist/display/select-session-display-backend.js.map +1 -0
  13. package/dist/display/session-display-backend.d.ts +7 -0
  14. package/dist/display/session-display-backend.d.ts.map +1 -0
  15. package/dist/display/session-display-backend.js +2 -0
  16. package/dist/display/session-display-backend.js.map +1 -0
  17. package/dist/display/session-display-reducer.d.ts +6 -0
  18. package/dist/display/session-display-reducer.d.ts.map +1 -0
  19. package/dist/display/session-display-reducer.js +74 -0
  20. package/dist/display/session-display-reducer.js.map +1 -0
  21. package/dist/display/session-display-state.d.ts +14 -0
  22. package/dist/display/session-display-state.d.ts.map +1 -0
  23. package/dist/display/session-display-state.js +6 -0
  24. package/dist/display/session-display-state.js.map +1 -0
  25. package/dist/display/string-session-display-backend.d.ts +8 -0
  26. package/dist/display/string-session-display-backend.d.ts.map +1 -0
  27. package/dist/display/string-session-display-backend.js +18 -0
  28. package/dist/display/string-session-display-backend.js.map +1 -0
  29. package/dist/display/stub-session-display-backend.d.ts +15 -0
  30. package/dist/display/stub-session-display-backend.d.ts.map +1 -0
  31. package/dist/display/stub-session-display-backend.js +17 -0
  32. package/dist/display/stub-session-display-backend.js.map +1 -0
  33. package/dist/format-models-list.d.ts +9 -0
  34. package/dist/format-models-list.d.ts.map +1 -0
  35. package/dist/format-models-list.js +17 -0
  36. package/dist/format-models-list.js.map +1 -0
  37. package/dist/format-session-summary.d.ts +4 -0
  38. package/dist/format-session-summary.d.ts.map +1 -0
  39. package/dist/format-session-summary.js +25 -0
  40. package/dist/format-session-summary.js.map +1 -0
  41. package/dist/index.d.ts +3 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +124 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/issue-command.d.ts +38 -0
  46. package/dist/issue-command.d.ts.map +1 -0
  47. package/dist/issue-command.js +117 -0
  48. package/dist/issue-command.js.map +1 -0
  49. package/dist/parse-worktree-mode.d.ts +4 -0
  50. package/dist/parse-worktree-mode.d.ts.map +1 -0
  51. package/dist/parse-worktree-mode.js +10 -0
  52. package/dist/parse-worktree-mode.js.map +1 -0
  53. package/dist/prompt-human-inquiry.d.ts +3 -0
  54. package/dist/prompt-human-inquiry.d.ts.map +1 -0
  55. package/dist/prompt-human-inquiry.js +29 -0
  56. package/dist/prompt-human-inquiry.js.map +1 -0
  57. package/dist/prompt-operator-input.d.ts +7 -0
  58. package/dist/prompt-operator-input.d.ts.map +1 -0
  59. package/dist/prompt-operator-input.js +51 -0
  60. package/dist/prompt-operator-input.js.map +1 -0
  61. package/dist/prompt-permission.d.ts +4 -0
  62. package/dist/prompt-permission.d.ts.map +1 -0
  63. package/dist/prompt-permission.js +8 -0
  64. package/dist/prompt-permission.js.map +1 -0
  65. package/dist/resolve-cli-max-turns.d.ts +8 -0
  66. package/dist/resolve-cli-max-turns.d.ts.map +1 -0
  67. package/dist/resolve-cli-max-turns.js +13 -0
  68. package/dist/resolve-cli-max-turns.js.map +1 -0
  69. package/dist/session-log-lines.d.ts +10 -0
  70. package/dist/session-log-lines.d.ts.map +1 -0
  71. package/dist/session-log-lines.js +121 -0
  72. package/dist/session-log-lines.js.map +1 -0
  73. package/dist/session-sinks.d.ts +20 -0
  74. package/dist/session-sinks.d.ts.map +1 -0
  75. package/dist/session-sinks.js +67 -0
  76. package/dist/session-sinks.js.map +1 -0
  77. package/dist/tui/activity-log.d.ts +32 -0
  78. package/dist/tui/activity-log.d.ts.map +1 -0
  79. package/dist/tui/activity-log.js +79 -0
  80. package/dist/tui/activity-log.js.map +1 -0
  81. package/dist/tui/compute-operator-input-cursor-y.d.ts +48 -0
  82. package/dist/tui/compute-operator-input-cursor-y.d.ts.map +1 -0
  83. package/dist/tui/compute-operator-input-cursor-y.js +52 -0
  84. package/dist/tui/compute-operator-input-cursor-y.js.map +1 -0
  85. package/dist/tui/create-issue-session-tui-host.d.ts +12 -0
  86. package/dist/tui/create-issue-session-tui-host.d.ts.map +1 -0
  87. package/dist/tui/create-issue-session-tui-host.js +88 -0
  88. package/dist/tui/create-issue-session-tui-host.js.map +1 -0
  89. package/dist/tui/create-issue-session-tui-host.test.d.ts +2 -0
  90. package/dist/tui/create-issue-session-tui-host.test.d.ts.map +1 -0
  91. package/dist/tui/create-issue-session-tui-host.test.js +133 -0
  92. package/dist/tui/create-issue-session-tui-host.test.js.map +1 -0
  93. package/dist/tui/create-tui-telemetry-sink.d.ts +5 -0
  94. package/dist/tui/create-tui-telemetry-sink.d.ts.map +1 -0
  95. package/dist/tui/create-tui-telemetry-sink.js +18 -0
  96. package/dist/tui/create-tui-telemetry-sink.js.map +1 -0
  97. package/dist/tui/format-operator-context.d.ts +9 -0
  98. package/dist/tui/format-operator-context.d.ts.map +1 -0
  99. package/dist/tui/format-operator-context.js +17 -0
  100. package/dist/tui/format-operator-context.js.map +1 -0
  101. package/dist/tui/ime-text-input.d.ts +31 -0
  102. package/dist/tui/ime-text-input.d.ts.map +1 -0
  103. package/dist/tui/ime-text-input.js +111 -0
  104. package/dist/tui/ime-text-input.js.map +1 -0
  105. package/dist/tui/ime-text-input.test.d.ts +2 -0
  106. package/dist/tui/ime-text-input.test.d.ts.map +1 -0
  107. package/dist/tui/ime-text-input.test.js +62 -0
  108. package/dist/tui/ime-text-input.test.js.map +1 -0
  109. package/dist/tui/ink-test-keys.d.ts +22 -0
  110. package/dist/tui/ink-test-keys.d.ts.map +1 -0
  111. package/dist/tui/ink-test-keys.js +26 -0
  112. package/dist/tui/ink-test-keys.js.map +1 -0
  113. package/dist/tui/issue-session-tui.d.ts +8 -0
  114. package/dist/tui/issue-session-tui.d.ts.map +1 -0
  115. package/dist/tui/issue-session-tui.js +201 -0
  116. package/dist/tui/issue-session-tui.js.map +1 -0
  117. package/dist/tui/issue-session-tui.test.d.ts +2 -0
  118. package/dist/tui/issue-session-tui.test.d.ts.map +1 -0
  119. package/dist/tui/issue-session-tui.test.js +529 -0
  120. package/dist/tui/issue-session-tui.test.js.map +1 -0
  121. package/dist/tui/open-questions-pane.d.ts +32 -0
  122. package/dist/tui/open-questions-pane.d.ts.map +1 -0
  123. package/dist/tui/open-questions-pane.js +101 -0
  124. package/dist/tui/open-questions-pane.js.map +1 -0
  125. package/dist/tui/operator-input-key-reducer.d.ts +36 -0
  126. package/dist/tui/operator-input-key-reducer.d.ts.map +1 -0
  127. package/dist/tui/operator-input-key-reducer.js +141 -0
  128. package/dist/tui/operator-input-key-reducer.js.map +1 -0
  129. package/dist/tui/operator-input-layout.d.ts +29 -0
  130. package/dist/tui/operator-input-layout.d.ts.map +1 -0
  131. package/dist/tui/operator-input-layout.js +120 -0
  132. package/dist/tui/operator-input-layout.js.map +1 -0
  133. package/dist/tui/orchestration-pane-frame.d.ts +9 -0
  134. package/dist/tui/orchestration-pane-frame.d.ts.map +1 -0
  135. package/dist/tui/orchestration-pane-frame.js +27 -0
  136. package/dist/tui/orchestration-pane-frame.js.map +1 -0
  137. package/dist/tui/tui-layout-constants.d.ts +48 -0
  138. package/dist/tui/tui-layout-constants.d.ts.map +1 -0
  139. package/dist/tui/tui-layout-constants.js +48 -0
  140. package/dist/tui/tui-layout-constants.js.map +1 -0
  141. package/dist/tui/tui-view-model.d.ts +20 -0
  142. package/dist/tui/tui-view-model.d.ts.map +1 -0
  143. package/dist/tui/tui-view-model.js +69 -0
  144. package/dist/tui/tui-view-model.js.map +1 -0
  145. package/dist/tui/wrap-text-to-width.d.ts +14 -0
  146. package/dist/tui/wrap-text-to-width.d.ts.map +1 -0
  147. package/dist/tui/wrap-text-to-width.js +55 -0
  148. package/dist/tui/wrap-text-to-width.js.map +1 -0
  149. package/package.json +2 -2
@@ -0,0 +1,529 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
3
+ import { cleanup, render } from 'ink-testing-library';
4
+ import { IssueSessionTui } from './issue-session-tui.js';
5
+ import { createTuiViewModel } from './tui-view-model.js';
6
+ import { buildActivityLogDisplayLines } from './activity-log.js';
7
+ import { formatOperatorContextHint } from './format-operator-context.js';
8
+ import { flushInkStdin, INK_TEST_KEYS } from './ink-test-keys.js';
9
+ import { extractOrchestrationPaneFrameStats } from './orchestration-pane-frame.js';
10
+ import { resolveOpenQuestionsPaneLayout } from './open-questions-pane.js';
11
+ import { computeActivityLogLineCapacity, computeActivityPaneHeight, computeOrchestrationLogVisibleLineCount, computeOperatorInputCursorX, computeOperatorInputLineIndex, } from './compute-operator-input-cursor-y.js';
12
+ import { getPaneContentWidth, wrapTextToWidth } from './wrap-text-to-width.js';
13
+ import { MAIN_PANE_TITLE, OPEN_QUESTIONS_PANE_MIN_HEIGHT, OPERATOR_INPUT_CURSOR_Y_OFFSET, PANE_PADDING_X, ROUND_BORDER_WIDTH, } from './tui-layout-constants.js';
14
+ function findOperatorInputLine(lines) {
15
+ const operatorLineIndices = lines
16
+ .map((line, index) => (line.includes('operator>') ? index : -1))
17
+ .filter((index) => index >= 0);
18
+ const lineIndex = operatorLineIndices.at(-1) ?? -1;
19
+ const line = lines[lineIndex] ?? '';
20
+ const promptIndex = line.lastIndexOf('operator> ');
21
+ const inputStartX = promptIndex >= 0 ? promptIndex + 'operator> '.length : -1;
22
+ return { lineIndex, inputStartX };
23
+ }
24
+ function expectNoContentOnBorderLines(frame) {
25
+ for (const line of frame.split('\n')) {
26
+ if (line.startsWith('╭') || line.startsWith('╰') || line.startsWith('┌') || line.startsWith('└')) {
27
+ expect(line).not.toMatch(/\[(?:operator|conductor|implementer|reviewer)\]/);
28
+ expect(line).not.toMatch(/operator>/);
29
+ }
30
+ }
31
+ }
32
+ function fillScrollableHarnessLog(viewModel, count = 30) {
33
+ for (let index = 0; index < count; index++) {
34
+ viewModel.appendActivityLog('harness', `line-${index}`);
35
+ }
36
+ }
37
+ const SCROLL_HINT = 'PgUp/PgDn でスクロール';
38
+ function createOpenQuestion(overrides) {
39
+ return {
40
+ responseType: 'text',
41
+ source: 'conductor',
42
+ status: 'open',
43
+ askedAt: 1,
44
+ ...overrides,
45
+ };
46
+ }
47
+ function resolveOpenQuestionsPaneHeight(openQuestions, terminalRows = 24, terminalColumns = 80) {
48
+ return resolveOpenQuestionsPaneLayout({
49
+ openQuestions,
50
+ selectedIndex: 0,
51
+ contentWidth: getPaneContentWidth({
52
+ columns: terminalColumns,
53
+ paddingX: PANE_PADDING_X,
54
+ borderWidth: ROUND_BORDER_WIDTH,
55
+ }),
56
+ terminalRows,
57
+ }).paneHeight;
58
+ }
59
+ describe('IssueSessionTui', () => {
60
+ beforeEach(() => {
61
+ Object.defineProperty(process.stdout, 'rows', {
62
+ configurable: true,
63
+ value: 24,
64
+ });
65
+ Object.defineProperty(process.stdout, 'columns', {
66
+ configurable: true,
67
+ value: 80,
68
+ });
69
+ });
70
+ afterEach(() => {
71
+ cleanup();
72
+ vi.restoreAllMocks();
73
+ });
74
+ it('renders four panes with worker, session log, open questions, and input', () => {
75
+ const viewModel = createTuiViewModel();
76
+ viewModel.setDisplayState({
77
+ workers: {
78
+ implementer: { kind: 'implementer', status: 'running' },
79
+ },
80
+ conductorOutput: null,
81
+ openQuestions: [
82
+ {
83
+ id: 'inq-1',
84
+ question: 'Approve?',
85
+ responseType: 'text',
86
+ source: 'conductor',
87
+ status: 'open',
88
+ askedAt: 1,
89
+ },
90
+ ],
91
+ });
92
+ viewModel.appendActivityLog('operator', 'operator ping');
93
+ viewModel.appendActivityLog('conductor', 'conductor says hi');
94
+ const { lastFrame } = render(_jsx(IssueSessionTui, { viewModel: viewModel, onSubmit: () => { } }));
95
+ const frame = lastFrame() ?? '';
96
+ expect(frame).toContain('Workers');
97
+ expect(frame).toContain('implementer');
98
+ expect(frame).toContain('Orchestration');
99
+ expect(frame).toContain('[operator] operator ping');
100
+ expect(frame).toContain('[conductor] conductor says hi');
101
+ expect(frame).toContain('Open questions');
102
+ expect(frame).toContain('inq-1');
103
+ expect(frame).toContain('1/1');
104
+ expect(frame).toContain('Shift+↑↓で選択');
105
+ expect(frame).toContain('operator>');
106
+ });
107
+ it('shows post-loop hint in input area', () => {
108
+ const viewModel = createTuiViewModel();
109
+ viewModel.setPostLoopWaiting(true);
110
+ const { lastFrame } = render(_jsx(IssueSessionTui, { viewModel: viewModel, onSubmit: () => { } }));
111
+ expect(lastFrame() ?? '').toContain('post-loop 待機中');
112
+ });
113
+ it('aligns IME cursor coordinates with the rendered operator input line', () => {
114
+ const terminalRows = 24;
115
+ const terminalColumns = 80;
116
+ Object.defineProperty(process.stdout, 'columns', {
117
+ configurable: true,
118
+ get: () => terminalColumns,
119
+ });
120
+ Object.defineProperty(process.stdout, 'rows', {
121
+ configurable: true,
122
+ get: () => terminalRows,
123
+ });
124
+ const viewModel = createTuiViewModel();
125
+ viewModel.setOperatorContext({
126
+ conductorTurn: 1,
127
+ autonomousTurns: 0,
128
+ maxTurns: null,
129
+ openQuestions: [],
130
+ });
131
+ const operatorPrompt = 'operator> ';
132
+ const contentWidth = getPaneContentWidth({
133
+ columns: terminalColumns,
134
+ paddingX: PANE_PADDING_X,
135
+ borderWidth: ROUND_BORDER_WIDTH,
136
+ });
137
+ const contextHint = formatOperatorContextHint(viewModel.getSnapshot().operatorContext);
138
+ const hintLineCount = wrapTextToWidth(contextHint, contentWidth).length;
139
+ const openQuestionsPaneHeight = OPEN_QUESTIONS_PANE_MIN_HEIGHT;
140
+ const expectedInputLineIndex = computeOperatorInputLineIndex({
141
+ terminalRows,
142
+ hintLineCount,
143
+ openQuestionsPaneHeight,
144
+ });
145
+ const expectedCursorX = computeOperatorInputCursorX(operatorPrompt);
146
+ const expectedCursorY = expectedInputLineIndex + OPERATOR_INPUT_CURSOR_Y_OFFSET;
147
+ const { lastFrame } = render(_jsx(IssueSessionTui, { viewModel: viewModel, onSubmit: () => { } }));
148
+ const lines = (lastFrame() ?? '').split('\n');
149
+ const { lineIndex, inputStartX } = findOperatorInputLine(lines);
150
+ expect(lineIndex).toBeGreaterThanOrEqual(0);
151
+ expect(inputStartX).toBe(expectedCursorX);
152
+ expect(lineIndex).toBe(expectedInputLineIndex);
153
+ expect(expectedCursorY).toBe(lineIndex + OPERATOR_INPUT_CURSOR_Y_OFFSET);
154
+ expect(lines).toHaveLength(terminalRows);
155
+ });
156
+ it('aligns IME cursor coordinates when context hint wraps on a narrow terminal', () => {
157
+ const terminalRows = 24;
158
+ const terminalColumns = 40;
159
+ Object.defineProperty(process.stdout, 'columns', {
160
+ configurable: true,
161
+ get: () => terminalColumns,
162
+ });
163
+ Object.defineProperty(process.stdout, 'rows', {
164
+ configurable: true,
165
+ get: () => terminalRows,
166
+ });
167
+ const viewModel = createTuiViewModel();
168
+ viewModel.setOperatorContext({
169
+ conductorTurn: 1,
170
+ autonomousTurns: 0,
171
+ maxTurns: null,
172
+ openQuestions: [],
173
+ });
174
+ const operatorPrompt = 'operator> ';
175
+ const contentWidth = getPaneContentWidth({
176
+ columns: terminalColumns,
177
+ paddingX: PANE_PADDING_X,
178
+ borderWidth: ROUND_BORDER_WIDTH,
179
+ });
180
+ const contextHint = formatOperatorContextHint(viewModel.getSnapshot().operatorContext);
181
+ const hintLineCount = wrapTextToWidth(contextHint, contentWidth).length;
182
+ const openQuestionsPaneHeight = OPEN_QUESTIONS_PANE_MIN_HEIGHT;
183
+ const expectedInputLineIndex = computeOperatorInputLineIndex({
184
+ terminalRows,
185
+ hintLineCount,
186
+ openQuestionsPaneHeight,
187
+ });
188
+ const expectedCursorX = computeOperatorInputCursorX(operatorPrompt);
189
+ const expectedCursorY = expectedInputLineIndex + OPERATOR_INPUT_CURSOR_Y_OFFSET;
190
+ const { lastFrame } = render(_jsx(IssueSessionTui, { viewModel: viewModel, onSubmit: () => { } }));
191
+ const lines = (lastFrame() ?? '').split('\n');
192
+ const { lineIndex, inputStartX } = findOperatorInputLine(lines);
193
+ expect(hintLineCount).toBeGreaterThan(1);
194
+ expect(lineIndex).toBeGreaterThanOrEqual(0);
195
+ expect(inputStartX).toBe(expectedCursorX);
196
+ expect(lineIndex).toBe(expectedInputLineIndex);
197
+ expect(expectedCursorY).toBe(lineIndex + OPERATOR_INPUT_CURSOR_Y_OFFSET);
198
+ expect(lines).toHaveLength(terminalRows);
199
+ });
200
+ it('shows conductor thinking during in-flight send then idle on completion', () => {
201
+ const viewModel = createTuiViewModel();
202
+ viewModel.setDisplayState({
203
+ workers: {
204
+ conductor: { kind: 'conductor', status: 'running' },
205
+ implementer: { kind: 'implementer', status: 'idle' },
206
+ },
207
+ conductorOutput: null,
208
+ openQuestions: [],
209
+ });
210
+ const { lastFrame: thinkingFrame, unmount: unmountThinking } = render(_jsx(IssueSessionTui, { viewModel: viewModel, onSubmit: () => { } }));
211
+ expect(thinkingFrame() ?? '').toContain('conductor: thinking');
212
+ unmountThinking();
213
+ viewModel.setDisplayState({
214
+ workers: {
215
+ conductor: { kind: 'conductor', status: 'idle' },
216
+ implementer: { kind: 'implementer', status: 'idle' },
217
+ },
218
+ conductorOutput: 'done',
219
+ openQuestions: [],
220
+ });
221
+ const { lastFrame: idleFrame } = render(_jsx(IssueSessionTui, { viewModel: viewModel, onSubmit: () => { } }));
222
+ expect(idleFrame() ?? '').toContain('conductor: idle');
223
+ expect(idleFrame() ?? '').not.toContain('conductor: thinking');
224
+ });
225
+ it('does not bleed activity log text onto pane border lines', () => {
226
+ const terminalRows = 24;
227
+ const terminalColumns = 80;
228
+ Object.defineProperty(process.stdout, 'columns', {
229
+ configurable: true,
230
+ get: () => terminalColumns,
231
+ });
232
+ Object.defineProperty(process.stdout, 'rows', {
233
+ configurable: true,
234
+ get: () => terminalRows,
235
+ });
236
+ const viewModel = createTuiViewModel();
237
+ viewModel.setDisplayState({
238
+ workers: {
239
+ conductor: { kind: 'conductor', status: 'running' },
240
+ implementer: { kind: 'implementer', status: 'running' },
241
+ reviewer: { kind: 'reviewer', status: 'idle' },
242
+ },
243
+ conductorOutput: null,
244
+ openQuestions: [
245
+ {
246
+ id: 'inq-1',
247
+ question: 'Approve?',
248
+ responseType: 'text',
249
+ source: 'conductor',
250
+ status: 'open',
251
+ askedAt: 1,
252
+ },
253
+ ],
254
+ });
255
+ viewModel.setOperatorContext({
256
+ conductorTurn: 1,
257
+ autonomousTurns: 0,
258
+ maxTurns: null,
259
+ openQuestions: [],
260
+ });
261
+ for (let i = 0; i < 12; i++) {
262
+ viewModel.appendActivityLog('conductor', `activity line ${i} with some longer text`);
263
+ }
264
+ const { lastFrame } = render(_jsx(IssueSessionTui, { viewModel: viewModel, onSubmit: () => { } }));
265
+ const frame = lastFrame() ?? '';
266
+ expect(frame).toContain('Workers');
267
+ expectNoContentOnBorderLines(frame);
268
+ expect(frame.split('\n')).toHaveLength(terminalRows);
269
+ });
270
+ it('shows empty-state placeholders when no session activity yet', () => {
271
+ const viewModel = createTuiViewModel();
272
+ const { lastFrame } = render(_jsx(IssueSessionTui, { viewModel: viewModel, onSubmit: () => { } }));
273
+ const frame = lastFrame() ?? '';
274
+ expect(frame).toContain('(待機中)');
275
+ expect(frame).toContain('(活動ログなし)');
276
+ expect(frame).toContain('(未回答なし)');
277
+ });
278
+ it('renders all activity log label kinds with distinct markers', () => {
279
+ const viewModel = createTuiViewModel();
280
+ viewModel.appendActivityLog('operator', 'op');
281
+ viewModel.appendActivityLog('harness', 'tel');
282
+ viewModel.appendActivityLog('observation', 'obs');
283
+ viewModel.appendActivityLog('conductor', 'cond');
284
+ const { lastFrame } = render(_jsx(IssueSessionTui, { viewModel: viewModel, onSubmit: () => { } }));
285
+ const frame = lastFrame() ?? '';
286
+ expect(frame).toContain('[operator] op');
287
+ expect(frame).toContain('[harness] tel');
288
+ expect(frame).toContain('[observation] obs');
289
+ expect(frame).toContain('[conductor] cond');
290
+ });
291
+ it('keeps orchestration title visible when log pane is full', () => {
292
+ const viewModel = createTuiViewModel();
293
+ fillScrollableHarnessLog(viewModel, 100);
294
+ const { lastFrame } = render(_jsx(IssueSessionTui, { viewModel: viewModel, onSubmit: () => { } }));
295
+ expect(lastFrame() ?? '').toContain('Orchestration');
296
+ });
297
+ it('fills orchestration pane when scroll hint wraps the title', async () => {
298
+ Object.defineProperty(process.stdout, 'columns', {
299
+ configurable: true,
300
+ value: 40,
301
+ });
302
+ Object.defineProperty(process.stdout, 'rows', {
303
+ configurable: true,
304
+ value: 24,
305
+ });
306
+ const viewModel = createTuiViewModel();
307
+ fillScrollableHarnessLog(viewModel, 50);
308
+ const { stdin, lastFrame, unmount } = render(_jsx(IssueSessionTui, { viewModel: viewModel, onSubmit: () => { } }));
309
+ stdin.write(INK_TEST_KEYS.pageUp);
310
+ await flushInkStdin();
311
+ const capacity = computeOrchestrationLogVisibleLineCount(computeActivityPaneHeight({
312
+ terminalRows: 24,
313
+ hintLineCount: 1,
314
+ openQuestionsPaneHeight: OPEN_QUESTIONS_PANE_MIN_HEIGHT,
315
+ }), wrapTextToWidth(`${MAIN_PANE_TITLE} (PgUp/PgDn でスクロール · 最新へは End · 入力中は Ctrl+PgUp/PgDn)`, getPaneContentWidth({
316
+ columns: 40,
317
+ paddingX: PANE_PADDING_X,
318
+ borderWidth: ROUND_BORDER_WIDTH,
319
+ })).length);
320
+ const stats = extractOrchestrationPaneFrameStats(lastFrame() ?? '');
321
+ expect(lastFrame() ?? '').toContain(SCROLL_HINT);
322
+ expect(stats.logRows.length).toBeGreaterThanOrEqual(capacity);
323
+ expect(stats.blankRows).toHaveLength(0);
324
+ unmount();
325
+ });
326
+ it('fills orchestration pane log rows without unused inner blank lines', () => {
327
+ for (const terminalRows of [24, 40, 50]) {
328
+ Object.defineProperty(process.stdout, 'rows', {
329
+ configurable: true,
330
+ value: terminalRows,
331
+ });
332
+ const viewModel = createTuiViewModel();
333
+ fillScrollableHarnessLog(viewModel, 100);
334
+ const { lastFrame, unmount } = render(_jsx(IssueSessionTui, { viewModel: viewModel, onSubmit: () => { } }));
335
+ const capacity = computeActivityLogLineCapacity({
336
+ terminalRows,
337
+ hintLineCount: 1,
338
+ openQuestionsPaneHeight: OPEN_QUESTIONS_PANE_MIN_HEIGHT,
339
+ });
340
+ const stats = extractOrchestrationPaneFrameStats(lastFrame() ?? '');
341
+ expect(capacity).toBeGreaterThan(0);
342
+ expect(stats.logRows.length).toBeGreaterThanOrEqual(capacity);
343
+ expect(stats.blankRows).toHaveLength(0);
344
+ unmount();
345
+ }
346
+ });
347
+ it('windowing hides older log lines when orchestration pane is full', () => {
348
+ const viewModel = createTuiViewModel();
349
+ for (let index = 0; index < 30; index++) {
350
+ viewModel.appendActivityLog('harness', `line-${index}`);
351
+ }
352
+ const { lastFrame } = render(_jsx(IssueSessionTui, { viewModel: viewModel, onSubmit: () => { } }));
353
+ const frame = lastFrame() ?? '';
354
+ expect(frame).toContain('[harness] line-29');
355
+ expect(frame).not.toContain('[harness] line-0');
356
+ });
357
+ it('renders multi-line activity body at full width without label-column indent', () => {
358
+ Object.defineProperty(process.stdout, 'columns', {
359
+ configurable: true,
360
+ value: 30,
361
+ });
362
+ const viewModel = createTuiViewModel();
363
+ viewModel.appendActivityLog('conductor', 'alpha beta gamma');
364
+ const { lastFrame } = render(_jsx(IssueSessionTui, { viewModel: viewModel, onSubmit: () => { } }));
365
+ const frame = lastFrame() ?? '';
366
+ const continuationIndent = ' '.repeat('[conductor] '.length);
367
+ expect(frame).toContain('[conductor]');
368
+ expect(frame).not.toContain(`${continuationIndent}alpha`);
369
+ expect(frame).not.toContain(`${continuationIndent}beta`);
370
+ });
371
+ it('keeps one-line entries as inline label and body', () => {
372
+ const viewModel = createTuiViewModel();
373
+ viewModel.appendActivityLog('operator', 'ping');
374
+ const { lastFrame } = render(_jsx(IssueSessionTui, { viewModel: viewModel, onSubmit: () => { } }));
375
+ expect(lastFrame() ?? '').toContain('[operator] ping');
376
+ });
377
+ it('uses manual wrap only (display line count matches wrap helper)', () => {
378
+ const viewModel = createTuiViewModel();
379
+ viewModel.appendActivityLog('conductor', 'word '.repeat(30));
380
+ const contentWidth = 76;
381
+ const expectedLines = buildActivityLogDisplayLines(viewModel.getSnapshot().activityLog, contentWidth).length;
382
+ render(_jsx(IssueSessionTui, { viewModel: viewModel, onSubmit: () => { } }));
383
+ expect(expectedLines).toBeGreaterThan(1);
384
+ });
385
+ it('renders multi-line operator input in activity log', () => {
386
+ const viewModel = createTuiViewModel();
387
+ viewModel.appendActivityLog('operator', 'first line\nsecond line');
388
+ const { lastFrame } = render(_jsx(IssueSessionTui, { viewModel: viewModel, onSubmit: () => { } }));
389
+ const frame = lastFrame() ?? '';
390
+ expect(frame).toContain('[operator]');
391
+ expect(frame).toContain('first line');
392
+ expect(frame).toContain('second line');
393
+ });
394
+ describe('open questions selection (stdin integration)', () => {
395
+ it('cycles selection with Shift+arrow keys', async () => {
396
+ const viewModel = createTuiViewModel();
397
+ viewModel.setDisplayState({
398
+ workers: {},
399
+ conductorOutput: null,
400
+ openQuestions: [
401
+ createOpenQuestion({ id: 'inq-1', question: 'First question' }),
402
+ createOpenQuestion({ id: 'inq-2', question: 'Second question' }),
403
+ ],
404
+ });
405
+ const { stdin, lastFrame } = render(_jsx(IssueSessionTui, { viewModel: viewModel, onSubmit: () => { } }));
406
+ expect(lastFrame() ?? '').toContain('▸ inq-1');
407
+ stdin.write(INK_TEST_KEYS.shiftDownArrow);
408
+ await flushInkStdin();
409
+ const frame = lastFrame() ?? '';
410
+ expect(frame).toContain('2/2');
411
+ expect(frame).toContain('▸ inq-2');
412
+ });
413
+ it('does not change selection on plain arrow keys', async () => {
414
+ const viewModel = createTuiViewModel();
415
+ viewModel.setDisplayState({
416
+ workers: {},
417
+ conductorOutput: null,
418
+ openQuestions: [
419
+ createOpenQuestion({ id: 'inq-1', question: 'First question' }),
420
+ createOpenQuestion({ id: 'inq-2', question: 'Second question' }),
421
+ ],
422
+ });
423
+ const { stdin, lastFrame } = render(_jsx(IssueSessionTui, { viewModel: viewModel, onSubmit: () => { } }));
424
+ stdin.write(INK_TEST_KEYS.downArrow);
425
+ await flushInkStdin();
426
+ expect(lastFrame() ?? '').toContain('▸ inq-1');
427
+ expect(lastFrame() ?? '').not.toContain('2/2');
428
+ });
429
+ it('submits selected question answer with targetOpenQuestionId', async () => {
430
+ const viewModel = createTuiViewModel();
431
+ viewModel.setDisplayState({
432
+ workers: {},
433
+ conductorOutput: null,
434
+ openQuestions: [
435
+ createOpenQuestion({ id: 'inq-1', question: 'First' }),
436
+ createOpenQuestion({ id: 'inq-2', question: 'Second' }),
437
+ ],
438
+ });
439
+ let submitted = '';
440
+ let submitOptions;
441
+ const { stdin, lastFrame } = render(_jsx(IssueSessionTui, { viewModel: viewModel, onSubmit: (text, options) => {
442
+ submitted = text;
443
+ submitOptions = options;
444
+ } }));
445
+ stdin.write(INK_TEST_KEYS.shiftDownArrow);
446
+ await flushInkStdin();
447
+ expect(lastFrame() ?? '').toContain('▸ inq-2');
448
+ stdin.write('approved');
449
+ await flushInkStdin();
450
+ stdin.write('\r');
451
+ await flushInkStdin();
452
+ expect(submitted).toBe('approved');
453
+ expect(submitOptions).toEqual({ targetOpenQuestionId: 'inq-2' });
454
+ });
455
+ it('grows open questions pane for long selected question text', () => {
456
+ const viewModel = createTuiViewModel();
457
+ viewModel.setDisplayState({
458
+ workers: {},
459
+ conductorOutput: null,
460
+ openQuestions: [
461
+ createOpenQuestion({
462
+ id: 'inq-long',
463
+ question: 'word '.repeat(30),
464
+ context: 'context '.repeat(10),
465
+ }),
466
+ ],
467
+ });
468
+ const { lastFrame } = render(_jsx(IssueSessionTui, { viewModel: viewModel, onSubmit: () => { } }));
469
+ const paneHeight = resolveOpenQuestionsPaneHeight(viewModel.getSnapshot().displayState.openQuestions);
470
+ expect(paneHeight).toBeGreaterThan(OPEN_QUESTIONS_PANE_MIN_HEIGHT);
471
+ expect(lastFrame() ?? '').toContain('context context');
472
+ });
473
+ });
474
+ describe('orchestration pane scroll (stdin integration)', () => {
475
+ it('scrolls to older lines on PgUp when input is empty and shows scroll hint', async () => {
476
+ const viewModel = createTuiViewModel();
477
+ fillScrollableHarnessLog(viewModel);
478
+ const { stdin, lastFrame } = render(_jsx(IssueSessionTui, { viewModel: viewModel, onSubmit: () => { } }));
479
+ const pinnedFrame = lastFrame() ?? '';
480
+ expect(pinnedFrame).toContain('[harness] line-29');
481
+ expect(pinnedFrame).not.toContain('[harness] line-16');
482
+ expect(pinnedFrame).not.toContain(SCROLL_HINT);
483
+ stdin.write(INK_TEST_KEYS.pageUp);
484
+ await flushInkStdin();
485
+ const scrolledFrame = lastFrame() ?? '';
486
+ expect(scrolledFrame).toContain(SCROLL_HINT);
487
+ expect(scrolledFrame).toContain('[harness] line-16');
488
+ expect(scrolledFrame).not.toContain('[harness] line-29');
489
+ });
490
+ it('returns to latest lines on End and clears scroll hint', async () => {
491
+ const viewModel = createTuiViewModel();
492
+ fillScrollableHarnessLog(viewModel);
493
+ const { stdin, lastFrame } = render(_jsx(IssueSessionTui, { viewModel: viewModel, onSubmit: () => { } }));
494
+ stdin.write(INK_TEST_KEYS.pageUp);
495
+ await flushInkStdin();
496
+ expect(lastFrame() ?? '').toContain(SCROLL_HINT);
497
+ stdin.write(INK_TEST_KEYS.end);
498
+ await flushInkStdin();
499
+ const restoredFrame = lastFrame() ?? '';
500
+ expect(restoredFrame).toContain('[harness] line-29');
501
+ expect(restoredFrame).not.toContain(SCROLL_HINT);
502
+ });
503
+ it('does not scroll on plain PgUp when input has text; Ctrl+PgUp scrolls without changing input', async () => {
504
+ const viewModel = createTuiViewModel();
505
+ fillScrollableHarnessLog(viewModel);
506
+ const { stdin, lastFrame } = render(_jsx(IssueSessionTui, { viewModel: viewModel, onSubmit: () => { } }));
507
+ stdin.write('typed');
508
+ await flushInkStdin();
509
+ const typedFrame = lastFrame() ?? '';
510
+ expect(typedFrame).toContain('typed');
511
+ expect(typedFrame).toContain('[harness] line-29');
512
+ expect(typedFrame).not.toContain(SCROLL_HINT);
513
+ stdin.write(INK_TEST_KEYS.pageUp);
514
+ await flushInkStdin();
515
+ const plainPageUpFrame = lastFrame() ?? '';
516
+ expect(plainPageUpFrame).toContain('typed');
517
+ expect(plainPageUpFrame).toContain('[harness] line-29');
518
+ expect(plainPageUpFrame).not.toContain(SCROLL_HINT);
519
+ stdin.write(INK_TEST_KEYS.ctrlPageUp);
520
+ await flushInkStdin();
521
+ const ctrlPageUpFrame = lastFrame() ?? '';
522
+ expect(ctrlPageUpFrame).toContain('typed');
523
+ expect(ctrlPageUpFrame).toContain(SCROLL_HINT);
524
+ expect(ctrlPageUpFrame).toContain('[harness] line-16');
525
+ expect(ctrlPageUpFrame).not.toContain('[harness] line-29');
526
+ });
527
+ });
528
+ });
529
+ //# sourceMappingURL=issue-session-tui.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue-session-tui.test.js","sourceRoot":"","sources":["../../src/tui/issue-session-tui.test.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { OpenQuestion } from '@agents-ensemble/core';
2
+ export interface OpenQuestionListItemRender {
3
+ id: string;
4
+ lines: string[];
5
+ isSelected: boolean;
6
+ compact: boolean;
7
+ }
8
+ export interface OpenQuestionsPaneLayout {
9
+ paneHeight: number;
10
+ titleLineCount: number;
11
+ titleText: string;
12
+ contentLineCount: number;
13
+ items: OpenQuestionListItemRender[];
14
+ selectedIndex: number;
15
+ }
16
+ /** 端末行数から Open questions 本文の最大表示行数を算出する。 */
17
+ export declare function computeMaxOpenQuestionsDisplayLines(terminalRows: number): number;
18
+ export declare function formatOpenQuestionsPaneTitle(selectedIndex: number, totalCount: number, contentWidth: number): {
19
+ titleText: string;
20
+ titleLineCount: number;
21
+ };
22
+ export declare function buildOpenQuestionListItems(openQuestions: OpenQuestion[], selectedIndex: number, contentWidth: number): OpenQuestionListItemRender[];
23
+ export declare function countOpenQuestionsDisplayLines(items: OpenQuestionListItemRender[]): number;
24
+ export declare function resolveOpenQuestionsPaneLayout(params: {
25
+ openQuestions: OpenQuestion[];
26
+ selectedIndex: number;
27
+ contentWidth: number;
28
+ terminalRows: number;
29
+ }): OpenQuestionsPaneLayout;
30
+ export declare function clampOpenQuestionSelectionIndex(selectedIndex: number, questionCount: number): number;
31
+ export declare function advanceOpenQuestionSelection(selectedIndex: number, direction: 'up' | 'down', questionCount: number): number;
32
+ //# sourceMappingURL=open-questions-pane.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open-questions-pane.d.ts","sourceRoot":"","sources":["../../src/tui/open-questions-pane.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAU1D,MAAM,WAAW,0BAA0B;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,KAAK,EAAE,0BAA0B,EAAE,CAAC;IACpC,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,4CAA4C;AAC5C,wBAAgB,mCAAmC,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAGhF;AAED,wBAAgB,4BAA4B,CAC1C,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,GACnB;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAU/C;AAmBD,wBAAgB,0BAA0B,CACxC,aAAa,EAAE,YAAY,EAAE,EAC7B,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,GACnB,0BAA0B,EAAE,CAc9B;AAED,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,0BAA0B,EAAE,GAAG,MAAM,CAE1F;AAED,wBAAgB,8BAA8B,CAAC,MAAM,EAAE;IACrD,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB,GAAG,uBAAuB,CAuD1B;AAED,wBAAgB,+BAA+B,CAC7C,aAAa,EAAE,MAAM,EACrB,aAAa,EAAE,MAAM,GACpB,MAAM,CAKR;AAED,wBAAgB,4BAA4B,CAC1C,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,IAAI,GAAG,MAAM,EACxB,aAAa,EAAE,MAAM,GACpB,MAAM,CAQR"}