@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,101 @@
1
+ import { wrapTextToWidth } from './wrap-text-to-width.js';
2
+ import { OPEN_QUESTIONS_PANE_MAX_DISPLAY_LINES, OPEN_QUESTIONS_PANE_MAX_HEIGHT_RATIO, OPEN_QUESTIONS_PANE_MIN_HEIGHT, OPEN_QUESTIONS_SELECTION_HINT, PANE_BORDER_ROWS, } from './tui-layout-constants.js';
3
+ /** 端末行数から Open questions 本文の最大表示行数を算出する。 */
4
+ export function computeMaxOpenQuestionsDisplayLines(terminalRows) {
5
+ const ratioCap = Math.floor(terminalRows * OPEN_QUESTIONS_PANE_MAX_HEIGHT_RATIO);
6
+ return Math.max(1, Math.min(OPEN_QUESTIONS_PANE_MAX_DISPLAY_LINES, ratioCap));
7
+ }
8
+ export function formatOpenQuestionsPaneTitle(selectedIndex, totalCount, contentWidth) {
9
+ if (totalCount === 0) {
10
+ return { titleText: 'Open questions', titleLineCount: 1 };
11
+ }
12
+ const titleText = `Open questions (${selectedIndex + 1}/${totalCount}${OPEN_QUESTIONS_SELECTION_HINT})`;
13
+ return {
14
+ titleText,
15
+ titleLineCount: wrapTextToWidth(titleText, contentWidth).length,
16
+ };
17
+ }
18
+ function buildSelectedQuestionItem(question, contentWidth) {
19
+ const header = `▸ ${question.id} [${question.responseType}] ${question.question}`;
20
+ const lines = [...wrapTextToWidth(header, contentWidth)];
21
+ if (question.context) {
22
+ lines.push(...wrapTextToWidth(` ${question.context}`, contentWidth));
23
+ }
24
+ return {
25
+ id: question.id,
26
+ lines,
27
+ isSelected: true,
28
+ compact: false,
29
+ };
30
+ }
31
+ export function buildOpenQuestionListItems(openQuestions, selectedIndex, contentWidth) {
32
+ return openQuestions.map((question, index) => {
33
+ if (index === selectedIndex) {
34
+ return buildSelectedQuestionItem(question, contentWidth);
35
+ }
36
+ const header = ` ${question.id} [${question.responseType}] ${question.question}`;
37
+ return {
38
+ id: question.id,
39
+ lines: [wrapTextToWidth(header, contentWidth)[0] ?? header],
40
+ isSelected: false,
41
+ compact: true,
42
+ };
43
+ });
44
+ }
45
+ export function countOpenQuestionsDisplayLines(items) {
46
+ return items.reduce((sum, item) => sum + item.lines.length, 0);
47
+ }
48
+ export function resolveOpenQuestionsPaneLayout(params) {
49
+ const totalCount = params.openQuestions.length;
50
+ const selectedIndex = clampOpenQuestionSelectionIndex(params.selectedIndex, totalCount);
51
+ const { titleText, titleLineCount } = formatOpenQuestionsPaneTitle(selectedIndex, totalCount, params.contentWidth);
52
+ if (totalCount === 0) {
53
+ return {
54
+ paneHeight: OPEN_QUESTIONS_PANE_MIN_HEIGHT,
55
+ titleLineCount,
56
+ titleText,
57
+ contentLineCount: 1,
58
+ items: [],
59
+ selectedIndex: 0,
60
+ };
61
+ }
62
+ const maxContentLines = computeMaxOpenQuestionsDisplayLines(params.terminalRows);
63
+ const fullItems = buildOpenQuestionListItems(params.openQuestions, selectedIndex, params.contentWidth);
64
+ let items = fullItems;
65
+ let contentLineCount = Math.max(1, countOpenQuestionsDisplayLines(fullItems));
66
+ if (contentLineCount > maxContentLines) {
67
+ const selectedQuestion = params.openQuestions[selectedIndex];
68
+ if (selectedQuestion) {
69
+ items = [buildSelectedQuestionItem(selectedQuestion, params.contentWidth)];
70
+ contentLineCount = Math.min(maxContentLines, Math.max(1, countOpenQuestionsDisplayLines(items)));
71
+ }
72
+ else {
73
+ contentLineCount = maxContentLines;
74
+ }
75
+ }
76
+ const paneHeight = Math.max(OPEN_QUESTIONS_PANE_MIN_HEIGHT, PANE_BORDER_ROWS + titleLineCount + contentLineCount);
77
+ return {
78
+ paneHeight,
79
+ titleLineCount,
80
+ titleText,
81
+ contentLineCount,
82
+ items,
83
+ selectedIndex,
84
+ };
85
+ }
86
+ export function clampOpenQuestionSelectionIndex(selectedIndex, questionCount) {
87
+ if (questionCount <= 0) {
88
+ return 0;
89
+ }
90
+ return Math.max(0, Math.min(selectedIndex, questionCount - 1));
91
+ }
92
+ export function advanceOpenQuestionSelection(selectedIndex, direction, questionCount) {
93
+ if (questionCount <= 0) {
94
+ return 0;
95
+ }
96
+ if (direction === 'up') {
97
+ return selectedIndex <= 0 ? questionCount - 1 : selectedIndex - 1;
98
+ }
99
+ return selectedIndex >= questionCount - 1 ? 0 : selectedIndex + 1;
100
+ }
101
+ //# sourceMappingURL=open-questions-pane.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open-questions-pane.js","sourceRoot":"","sources":["../../src/tui/open-questions-pane.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ export interface OperatorInputKeyState {
2
+ readonly cursorOffset: number;
3
+ readonly cursorWidth: number;
4
+ }
5
+ export interface OperatorInputKeyAction {
6
+ readonly type: 'move' | 'insert' | 'newline' | 'delete' | 'submit' | 'ignore';
7
+ readonly cursorOffset?: number;
8
+ readonly cursorWidth?: number;
9
+ readonly value?: string;
10
+ }
11
+ export interface OperatorInputKeyPress {
12
+ readonly input: string;
13
+ readonly key: {
14
+ readonly return?: boolean;
15
+ readonly shift?: boolean;
16
+ readonly upArrow?: boolean;
17
+ readonly downArrow?: boolean;
18
+ readonly leftArrow?: boolean;
19
+ readonly rightArrow?: boolean;
20
+ readonly home?: boolean;
21
+ readonly end?: boolean;
22
+ readonly backspace?: boolean;
23
+ readonly delete?: boolean;
24
+ readonly pageUp?: boolean;
25
+ readonly pageDown?: boolean;
26
+ readonly ctrl?: boolean;
27
+ readonly tab?: boolean;
28
+ };
29
+ }
30
+ /** `ImeTextInput` の `useInput` 分岐を React 非依存で検証可能にする。 */
31
+ export declare function reduceOperatorInputKeyPress(value: string, state: OperatorInputKeyState, press: OperatorInputKeyPress, options: {
32
+ readonly contentWidth: number;
33
+ readonly promptWidth: number;
34
+ readonly showCursor: boolean;
35
+ }): OperatorInputKeyAction;
36
+ //# sourceMappingURL=operator-input-key-reducer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operator-input-key-reducer.d.ts","sourceRoot":"","sources":["../../src/tui/operator-input-key-reducer.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,IAAI,EACT,MAAM,GACN,QAAQ,GACR,SAAS,GACT,QAAQ,GACR,QAAQ,GACR,QAAQ,CAAC;IACb,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE;QACZ,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;QAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;QACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;QAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;QAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;QAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;QAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;QACxB,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;QACvB,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;QAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;QAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;QAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;QAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;QACxB,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;KACxB,CAAC;CACH;AAmHD,yDAAyD;AACzD,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,qBAAqB,EAC5B,KAAK,EAAE,qBAAqB,EAC5B,OAAO,EAAE;IACP,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B,GACA,sBAAsB,CAkIxB"}
@@ -0,0 +1,141 @@
1
+ import stringWidth from 'string-width';
2
+ import { computeOperatorInputLayout, mapCursorOffsetToDisplayPosition, mapDisplayPositionToCursorOffset, } from './operator-input-layout.js';
3
+ function moveCursorLeft(value, cursorOffset, contentWidth, promptWidth) {
4
+ const position = mapCursorOffsetToDisplayPosition(value, cursorOffset, contentWidth, promptWidth);
5
+ const layout = computeOperatorInputLayout(value, contentWidth, promptWidth);
6
+ const lineStart = layout.lineStartOffsets[position.displayLineIndex] ?? 0;
7
+ if (cursorOffset > lineStart) {
8
+ const previousOffset = cursorOffset - 1;
9
+ const previousPosition = mapCursorOffsetToDisplayPosition(value, previousOffset, contentWidth, promptWidth);
10
+ if (previousPosition.displayLineIndex === position.displayLineIndex) {
11
+ return previousOffset;
12
+ }
13
+ }
14
+ if (position.displayLineIndex > 0) {
15
+ const previousLine = layout.displayLines[position.displayLineIndex - 1] ?? '';
16
+ return mapDisplayPositionToCursorOffset(value, position.displayLineIndex - 1, stringWidth(previousLine), contentWidth, promptWidth);
17
+ }
18
+ return 0;
19
+ }
20
+ function moveCursorRight(value, cursorOffset, contentWidth, promptWidth) {
21
+ const position = mapCursorOffsetToDisplayPosition(value, cursorOffset, contentWidth, promptWidth);
22
+ const layout = computeOperatorInputLayout(value, contentWidth, promptWidth);
23
+ const lineText = layout.displayLines[position.displayLineIndex] ?? '';
24
+ const lineEnd = (layout.lineStartOffsets[position.displayLineIndex] ?? 0) + lineText.length;
25
+ if (cursorOffset < lineEnd) {
26
+ const nextOffset = cursorOffset + 1;
27
+ const nextPosition = mapCursorOffsetToDisplayPosition(value, nextOffset, contentWidth, promptWidth);
28
+ if (nextPosition.displayLineIndex === position.displayLineIndex) {
29
+ return nextOffset;
30
+ }
31
+ }
32
+ if (position.displayLineIndex < layout.displayLines.length - 1) {
33
+ return mapDisplayPositionToCursorOffset(value, position.displayLineIndex + 1, 0, contentWidth, promptWidth);
34
+ }
35
+ return value.length;
36
+ }
37
+ function moveCursorVertically(value, cursorOffset, contentWidth, promptWidth, direction) {
38
+ const position = mapCursorOffsetToDisplayPosition(value, cursorOffset, contentWidth, promptWidth);
39
+ const layout = computeOperatorInputLayout(value, contentWidth, promptWidth);
40
+ const nextLineIndex = position.displayLineIndex + direction;
41
+ if (nextLineIndex < 0 || nextLineIndex >= layout.displayLines.length) {
42
+ return cursorOffset;
43
+ }
44
+ return mapDisplayPositionToCursorOffset(value, nextLineIndex, position.columnInLine, contentWidth, promptWidth);
45
+ }
46
+ /** `ImeTextInput` の `useInput` 分岐を React 非依存で検証可能にする。 */
47
+ export function reduceOperatorInputKeyPress(value, state, press, options) {
48
+ const { key, input } = press;
49
+ const { contentWidth, promptWidth, showCursor } = options;
50
+ const { cursorOffset, cursorWidth } = state;
51
+ if (key.pageUp ||
52
+ key.pageDown ||
53
+ (key.ctrl && input === 'c') ||
54
+ key.tab ||
55
+ (key.shift && key.tab)) {
56
+ return { type: 'ignore' };
57
+ }
58
+ if (key.return && !key.shift) {
59
+ return { type: 'submit' };
60
+ }
61
+ if (key.return && key.shift) {
62
+ const nextValue = value.slice(0, cursorOffset) + '\n' + value.slice(cursorOffset);
63
+ return {
64
+ type: 'newline',
65
+ value: nextValue,
66
+ cursorOffset: cursorOffset + 1,
67
+ cursorWidth: 0,
68
+ };
69
+ }
70
+ if (!showCursor) {
71
+ return { type: 'ignore' };
72
+ }
73
+ if (key.upArrow) {
74
+ return {
75
+ type: 'move',
76
+ cursorOffset: moveCursorVertically(value, cursorOffset, contentWidth, promptWidth, -1),
77
+ cursorWidth: 0,
78
+ };
79
+ }
80
+ if (key.downArrow) {
81
+ return {
82
+ type: 'move',
83
+ cursorOffset: moveCursorVertically(value, cursorOffset, contentWidth, promptWidth, 1),
84
+ cursorWidth: 0,
85
+ };
86
+ }
87
+ if (key.home) {
88
+ const position = mapCursorOffsetToDisplayPosition(value, cursorOffset, contentWidth, promptWidth);
89
+ return {
90
+ type: 'move',
91
+ cursorOffset: mapDisplayPositionToCursorOffset(value, position.displayLineIndex, 0, contentWidth, promptWidth),
92
+ cursorWidth: 0,
93
+ };
94
+ }
95
+ if (key.end) {
96
+ const position = mapCursorOffsetToDisplayPosition(value, cursorOffset, contentWidth, promptWidth);
97
+ const layout = computeOperatorInputLayout(value, contentWidth, promptWidth);
98
+ const lineText = layout.displayLines[position.displayLineIndex] ?? '';
99
+ return {
100
+ type: 'move',
101
+ cursorOffset: mapDisplayPositionToCursorOffset(value, position.displayLineIndex, stringWidth(lineText), contentWidth, promptWidth),
102
+ cursorWidth: 0,
103
+ };
104
+ }
105
+ if (key.leftArrow) {
106
+ return {
107
+ type: 'move',
108
+ cursorOffset: moveCursorLeft(value, cursorOffset, contentWidth, promptWidth),
109
+ cursorWidth: 0,
110
+ };
111
+ }
112
+ if (key.rightArrow) {
113
+ return {
114
+ type: 'move',
115
+ cursorOffset: moveCursorRight(value, cursorOffset, contentWidth, promptWidth),
116
+ cursorWidth: 0,
117
+ };
118
+ }
119
+ if (key.backspace || key.delete) {
120
+ if (cursorOffset <= 0) {
121
+ return { type: 'ignore' };
122
+ }
123
+ return {
124
+ type: 'delete',
125
+ value: value.slice(0, cursorOffset - 1) + value.slice(cursorOffset),
126
+ cursorOffset: cursorOffset - 1,
127
+ cursorWidth: 0,
128
+ };
129
+ }
130
+ if (input) {
131
+ const nextValue = value.slice(0, cursorOffset) + input + value.slice(cursorOffset);
132
+ return {
133
+ type: 'insert',
134
+ value: nextValue,
135
+ cursorOffset: cursorOffset + input.length,
136
+ cursorWidth: input.length > 1 ? input.length : 0,
137
+ };
138
+ }
139
+ return { type: 'ignore' };
140
+ }
141
+ //# sourceMappingURL=operator-input-key-reducer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operator-input-key-reducer.js","sourceRoot":"","sources":["../../src/tui/operator-input-key-reducer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ export interface OperatorInputDisplayPosition {
2
+ readonly displayLineIndex: number;
3
+ readonly columnInLine: number;
4
+ }
5
+ export interface OperatorInputLayout {
6
+ readonly displayLines: string[];
7
+ readonly lineStartOffsets: number[];
8
+ }
9
+ /** 先頭・末尾の空白行のみ除去。行内空白と本文中の改行は保持する。 */
10
+ export declare function trimBlankLinesOnly(text: string): string;
11
+ /** 端末行数から入力欄の最大表示行数を算出する。 */
12
+ export declare function computeMaxInputDisplayLines(terminalRows: number): number;
13
+ /** 表示行と各行の value 内開始 offset を同時に算出する。 */
14
+ export declare function computeOperatorInputLayout(value: string, contentWidth: number, promptWidth: number): OperatorInputLayout;
15
+ /**
16
+ * オペレータ入力の表示行を算出する。
17
+ * 1 行目はプロンプト幅分だけ狭く折り返し、2 行目以降はペイン全幅を使う。
18
+ */
19
+ export declare function computeOperatorInputDisplayLines(value: string, contentWidth: number, promptWidth: number): string[];
20
+ /** 入力文字列内のカーソル offset を表示行・列に変換する。 */
21
+ export declare function mapCursorOffsetToDisplayPosition(value: string, cursorOffset: number, contentWidth: number, promptWidth: number): OperatorInputDisplayPosition;
22
+ /** 表示行インデックスと列から value 内のカーソル offset を逆算する。 */
23
+ export declare function mapDisplayPositionToCursorOffset(value: string, displayLineIndex: number, columnInLine: number, contentWidth: number, promptWidth: number): number;
24
+ /** 末尾追従用に表示する行スライスを返す。カーソル行が常に可視範囲に入るよう scrollOffset を調整する。 */
25
+ export declare function sliceVisibleInputDisplayLines(displayLines: string[], maxVisibleLines: number, cursorDisplayLineIndex?: number): {
26
+ visibleLines: string[];
27
+ scrollOffset: number;
28
+ };
29
+ //# sourceMappingURL=operator-input-layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operator-input-layout.d.ts","sourceRoot":"","sources":["../../src/tui/operator-input-layout.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;IAChC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,EAAE,CAAC;CACrC;AAED,sCAAsC;AACtC,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAWvD;AAED,6BAA6B;AAC7B,wBAAgB,2BAA2B,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAMxE;AAED,yCAAyC;AACzC,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,GAClB,mBAAmB,CAyCrB;AAED;;;GAGG;AACH,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,GAClB,MAAM,EAAE,CAEV;AAED,sCAAsC;AACtC,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,GAClB,4BAA4B,CAwB9B;AAED,+CAA+C;AAC/C,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,MAAM,EACb,gBAAgB,EAAE,MAAM,EACxB,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,GAClB,MAAM,CAqBR;AAED,+DAA+D;AAC/D,wBAAgB,6BAA6B,CAC3C,YAAY,EAAE,MAAM,EAAE,EACtB,eAAe,EAAE,MAAM,EACvB,sBAAsB,CAAC,EAAE,MAAM,GAC9B;IAAE,YAAY,EAAE,MAAM,EAAE,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAkBlD"}
@@ -0,0 +1,120 @@
1
+ import stringWidth from 'string-width';
2
+ import { findWrapBreakIndex } from './wrap-text-to-width.js';
3
+ import { INPUT_PANE_MAX_DISPLAY_LINES, INPUT_PANE_MAX_HEIGHT_RATIO, INPUT_PANE_MIN_DISPLAY_LINES, } from './tui-layout-constants.js';
4
+ /** 先頭・末尾の空白行のみ除去。行内空白と本文中の改行は保持する。 */
5
+ export function trimBlankLinesOnly(text) {
6
+ const lines = text.split('\n');
7
+ let start = 0;
8
+ let end = lines.length;
9
+ while (start < end && lines[start]?.trim() === '') {
10
+ start++;
11
+ }
12
+ while (end > start && lines[end - 1]?.trim() === '') {
13
+ end--;
14
+ }
15
+ return lines.slice(start, end).join('\n');
16
+ }
17
+ /** 端末行数から入力欄の最大表示行数を算出する。 */
18
+ export function computeMaxInputDisplayLines(terminalRows) {
19
+ const ratioCap = Math.floor(terminalRows * INPUT_PANE_MAX_HEIGHT_RATIO);
20
+ return Math.max(INPUT_PANE_MIN_DISPLAY_LINES, Math.min(INPUT_PANE_MAX_DISPLAY_LINES, ratioCap));
21
+ }
22
+ /** 表示行と各行の value 内開始 offset を同時に算出する。 */
23
+ export function computeOperatorInputLayout(value, contentWidth, promptWidth) {
24
+ const displayLines = [];
25
+ const lineStartOffsets = [];
26
+ const firstLineWidth = Math.max(1, contentWidth - promptWidth);
27
+ const paragraphs = value.split('\n');
28
+ let absoluteOffset = 0;
29
+ for (let paragraphIndex = 0; paragraphIndex < paragraphs.length; paragraphIndex++) {
30
+ const paragraph = paragraphs[paragraphIndex] ?? '';
31
+ const paragraphStart = absoluteOffset;
32
+ let remaining = paragraph;
33
+ if (remaining.length === 0) {
34
+ lineStartOffsets.push(paragraphStart);
35
+ displayLines.push('');
36
+ }
37
+ else {
38
+ while (remaining.length > 0) {
39
+ const availableWidth = displayLines.length === 0 ? firstLineWidth : contentWidth;
40
+ const lineStartInParagraph = paragraph.length - remaining.length;
41
+ if (stringWidth(remaining) <= availableWidth) {
42
+ lineStartOffsets.push(paragraphStart + lineStartInParagraph);
43
+ displayLines.push(remaining);
44
+ remaining = '';
45
+ }
46
+ else {
47
+ const breakAt = findWrapBreakIndex(remaining, availableWidth);
48
+ lineStartOffsets.push(paragraphStart + lineStartInParagraph);
49
+ displayLines.push(remaining.slice(0, breakAt));
50
+ remaining = remaining.slice(breakAt).trimStart();
51
+ }
52
+ }
53
+ }
54
+ absoluteOffset = paragraphStart + paragraph.length + 1;
55
+ }
56
+ if (displayLines.length === 0) {
57
+ displayLines.push('');
58
+ lineStartOffsets.push(0);
59
+ }
60
+ return { displayLines, lineStartOffsets };
61
+ }
62
+ /**
63
+ * オペレータ入力の表示行を算出する。
64
+ * 1 行目はプロンプト幅分だけ狭く折り返し、2 行目以降はペイン全幅を使う。
65
+ */
66
+ export function computeOperatorInputDisplayLines(value, contentWidth, promptWidth) {
67
+ return computeOperatorInputLayout(value, contentWidth, promptWidth).displayLines;
68
+ }
69
+ /** 入力文字列内のカーソル offset を表示行・列に変換する。 */
70
+ export function mapCursorOffsetToDisplayPosition(value, cursorOffset, contentWidth, promptWidth) {
71
+ const clampedOffset = Math.max(0, Math.min(cursorOffset, value.length));
72
+ const { displayLines, lineStartOffsets } = computeOperatorInputLayout(value, contentWidth, promptWidth);
73
+ let displayLineIndex = 0;
74
+ for (let index = lineStartOffsets.length - 1; index >= 0; index--) {
75
+ const lineStart = lineStartOffsets[index] ?? 0;
76
+ if (clampedOffset >= lineStart) {
77
+ displayLineIndex = index;
78
+ break;
79
+ }
80
+ }
81
+ const lineStart = lineStartOffsets[displayLineIndex] ?? 0;
82
+ const textBeforeCursor = value.slice(lineStart, clampedOffset);
83
+ const lineText = displayLines[displayLineIndex] ?? '';
84
+ return {
85
+ displayLineIndex,
86
+ columnInLine: Math.min(stringWidth(textBeforeCursor), stringWidth(lineText)),
87
+ };
88
+ }
89
+ /** 表示行インデックスと列から value 内のカーソル offset を逆算する。 */
90
+ export function mapDisplayPositionToCursorOffset(value, displayLineIndex, columnInLine, contentWidth, promptWidth) {
91
+ const { displayLines, lineStartOffsets } = computeOperatorInputLayout(value, contentWidth, promptWidth);
92
+ const clampedLineIndex = Math.max(0, Math.min(displayLineIndex, displayLines.length - 1));
93
+ const lineText = displayLines[clampedLineIndex] ?? '';
94
+ const targetColumn = Math.min(Math.max(0, columnInLine), stringWidth(lineText));
95
+ const lineStart = lineStartOffsets[clampedLineIndex] ?? 0;
96
+ let width = 0;
97
+ for (let index = 1; index <= lineText.length; index++) {
98
+ const nextWidth = stringWidth(lineText.slice(0, index));
99
+ if (nextWidth >= targetColumn) {
100
+ return lineStart + index - (nextWidth > targetColumn ? 1 : 0);
101
+ }
102
+ width = nextWidth;
103
+ }
104
+ return lineStart + lineText.length;
105
+ }
106
+ /** 末尾追従用に表示する行スライスを返す。カーソル行が常に可視範囲に入るよう scrollOffset を調整する。 */
107
+ export function sliceVisibleInputDisplayLines(displayLines, maxVisibleLines, cursorDisplayLineIndex) {
108
+ if (displayLines.length <= maxVisibleLines) {
109
+ return { visibleLines: displayLines, scrollOffset: 0 };
110
+ }
111
+ const maxScrollOffset = displayLines.length - maxVisibleLines;
112
+ const scrollOffset = cursorDisplayLineIndex === undefined
113
+ ? maxScrollOffset
114
+ : Math.min(Math.max(0, cursorDisplayLineIndex - maxVisibleLines + 1), maxScrollOffset);
115
+ return {
116
+ visibleLines: displayLines.slice(scrollOffset, scrollOffset + maxVisibleLines),
117
+ scrollOffset,
118
+ };
119
+ }
120
+ //# sourceMappingURL=operator-input-layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operator-input-layout.js","sourceRoot":"","sources":["../../src/tui/operator-input-layout.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export interface OrchestrationPaneFrameStats {
2
+ innerRows: string[];
3
+ logRows: string[];
4
+ blankRows: string[];
5
+ titleRows: string[];
6
+ }
7
+ /** Ink フレーム文字列から Orchestration ペイン内側の行を抽出する。 */
8
+ export declare function extractOrchestrationPaneFrameStats(frame: string): OrchestrationPaneFrameStats;
9
+ //# sourceMappingURL=orchestration-pane-frame.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestration-pane-frame.d.ts","sourceRoot":"","sources":["../../src/tui/orchestration-pane-frame.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,2BAA2B;IAC1C,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,gDAAgD;AAChD,wBAAgB,kCAAkC,CAAC,KAAK,EAAE,MAAM,GAAG,2BAA2B,CAgC7F"}
@@ -0,0 +1,27 @@
1
+ import { MAIN_PANE_TITLE } from './tui-layout-constants.js';
2
+ /** Ink フレーム文字列から Orchestration ペイン内側の行を抽出する。 */
3
+ export function extractOrchestrationPaneFrameStats(frame) {
4
+ const lines = frame.split('\n');
5
+ const titleIndex = lines.findIndex((line) => line.startsWith('│') && line.includes(MAIN_PANE_TITLE));
6
+ if (titleIndex < 0) {
7
+ return { innerRows: [], logRows: [], blankRows: [], titleRows: [] };
8
+ }
9
+ const innerRows = [];
10
+ for (let index = titleIndex; index < lines.length; index++) {
11
+ const line = lines[index] ?? '';
12
+ if (line.startsWith('╰')) {
13
+ break;
14
+ }
15
+ if (line.startsWith('╭') && index > titleIndex) {
16
+ break;
17
+ }
18
+ if (line.startsWith('│')) {
19
+ innerRows.push(line);
20
+ }
21
+ }
22
+ const titleRows = innerRows.filter((line) => line.includes(MAIN_PANE_TITLE));
23
+ const logRows = innerRows.filter((line) => /\[(?:operator|conductor|harness|observation)\]/.test(line));
24
+ const blankRows = innerRows.filter((line) => line.startsWith('│') && line.replace(/│/g, '').trim().length === 0);
25
+ return { innerRows, logRows, blankRows, titleRows };
26
+ }
27
+ //# sourceMappingURL=orchestration-pane-frame.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestration-pane-frame.js","sourceRoot":"","sources":["../../src/tui/orchestration-pane-frame.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAS5D,gDAAgD;AAChD,MAAM,UAAU,kCAAkC,CAAC,KAAa;IAC9D,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,UAAU,GAAG,KAAK,CAAC,SAAS,CAChC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,CACjE,CAAC;IACF,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IACtE,CAAC;IAED,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,KAAK,IAAI,KAAK,GAAG,UAAU,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QAC3D,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAChC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM;QACR,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,GAAG,UAAU,EAAE,CAAC;YAC/C,MAAM;QACR,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC;IAC7E,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CACxC,gDAAgD,CAAC,IAAI,CAAC,IAAI,CAAC,CAC5D,CAAC;IACF,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAChC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,CAC7E,CAAC;IAEF,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;AACtD,CAAC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Ink `Box` の `height` は Yoga border-box(枠線を含む総行数)。
3
+ * `borderStyle` 指定時は上下各 1 行が枠線として height 内に収まる。
4
+ */
5
+ /** 枠線ありペインの上下枠線行数(`borderStyle` 指定時)。 */
6
+ export declare const PANE_BORDER_ROWS = 2;
7
+ /** round 枠線の表示幅(左右各 1 列)。 */
8
+ export declare const ROUND_BORDER_WIDTH = 2;
9
+ /** メインペイン(Orchestration)の UI ラベル。conductor 対話とオーケストレーション状況の統合表示。 */
10
+ export declare const MAIN_PANE_TITLE = "Orchestration";
11
+ /** Worker 状態ペインの固定高さ(枠線込み。タイトル + サマリ 3 行)。 */
12
+ export declare const WORKER_PANE_HEIGHT = 6;
13
+ /**
14
+ * Open questions ペインの最小高さ(枠線込み。タイトル + 本文 1 行)。
15
+ * 未回答 0 件時や本文が短いときの下限。
16
+ */
17
+ export declare const OPEN_QUESTIONS_PANE_MIN_HEIGHT = 4;
18
+ /** Open questions ペイン本文の表示行数上限(端末行数に対する比率)。 */
19
+ export declare const OPEN_QUESTIONS_PANE_MAX_HEIGHT_RATIO = 0.35;
20
+ /** Open questions ペイン本文の表示行数の絶対上限。 */
21
+ export declare const OPEN_QUESTIONS_PANE_MAX_DISPLAY_LINES = 8;
22
+ /** Open questions ペインタイトルに付与する選択操作ヒント。 */
23
+ export declare const OPEN_QUESTIONS_SELECTION_HINT = " \u2014 Shift+\u2191\u2193\u3067\u9078\u629E";
24
+ /** 入力ペインの枠線(上下)行数。`PANE_BORDER_ROWS` と同値。 */
25
+ export declare const INPUT_PANE_BORDER_ROWS = 2;
26
+ /** ペイン内水平 padding(`paddingX`)。 */
27
+ export declare const PANE_PADDING_X = 1;
28
+ /** 入力ペイン左枠線の列幅(`borderStyle="single"` の左 `│`)。 */
29
+ export declare const INPUT_PANE_LEFT_BORDER_COLUMNS = 1;
30
+ /**
31
+ * 入力ペイン左端からテキストコンテンツ開始までの列数(左枠線 + `paddingX`)。
32
+ * `useCursor` の X は Ink 出力原点からの絶対列であり、このオフセットを含める。
33
+ */
34
+ export declare const INPUT_PANE_LEFT_COLUMNS: number;
35
+ /**
36
+ * Ink `useCursor` の Y 補正。`log-update` の `visibleLineCount` が描画行数より 1 大きい場合、
37
+ * 実カーソルが入力行より 1 行上にずれる(オペレータ手動確認 iTerm2+tmux)。
38
+ */
39
+ export declare const OPERATOR_INPUT_CURSOR_Y_OFFSET = 1;
40
+ /** 入力ペインの表示行数上限(端末行数に対する比率)。 */
41
+ export declare const INPUT_PANE_MAX_HEIGHT_RATIO = 0.35;
42
+ /** 入力ペインの表示行数の絶対上限。 */
43
+ export declare const INPUT_PANE_MAX_DISPLAY_LINES = 10;
44
+ /** 入力ペインの最小表示行数(空入力時)。 */
45
+ export declare const INPUT_PANE_MIN_DISPLAY_LINES = 1;
46
+ /** Orchestration ペインのタイトル行数(`MAIN_PANE_TITLE` 単独行。hint は呼び出し側で加算)。 */
47
+ export declare const ORCHESTRATION_PANE_TITLE_ROWS = 1;
48
+ //# sourceMappingURL=tui-layout-constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui-layout-constants.d.ts","sourceRoot":"","sources":["../../src/tui/tui-layout-constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,yCAAyC;AACzC,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAElC,6BAA6B;AAC7B,eAAO,MAAM,kBAAkB,IAAI,CAAC;AAEpC,oEAAoE;AACpE,eAAO,MAAM,eAAe,kBAAkB,CAAC;AAE/C,8CAA8C;AAC9C,eAAO,MAAM,kBAAkB,IAAI,CAAC;AAEpC;;;GAGG;AACH,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAEhD,+CAA+C;AAC/C,eAAO,MAAM,oCAAoC,OAAO,CAAC;AAEzD,sCAAsC;AACtC,eAAO,MAAM,qCAAqC,IAAI,CAAC;AAEvD,0CAA0C;AAC1C,eAAO,MAAM,6BAA6B,iDAAmB,CAAC;AAE9D,6CAA6C;AAC7C,eAAO,MAAM,sBAAsB,IAAmB,CAAC;AAEvD,kCAAkC;AAClC,eAAO,MAAM,cAAc,IAAI,CAAC;AAEhC,kDAAkD;AAClD,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAEhD;;;GAGG;AACH,eAAO,MAAM,uBAAuB,QAAkD,CAAC;AAEvF;;;GAGG;AACH,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAEhD,gCAAgC;AAChC,eAAO,MAAM,2BAA2B,OAAO,CAAC;AAEhD,uBAAuB;AACvB,eAAO,MAAM,4BAA4B,KAAK,CAAC;AAE/C,0BAA0B;AAC1B,eAAO,MAAM,4BAA4B,IAAI,CAAC;AAE9C,sEAAsE;AACtE,eAAO,MAAM,6BAA6B,IAAI,CAAC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Ink `Box` の `height` は Yoga border-box(枠線を含む総行数)。
3
+ * `borderStyle` 指定時は上下各 1 行が枠線として height 内に収まる。
4
+ */
5
+ /** 枠線ありペインの上下枠線行数(`borderStyle` 指定時)。 */
6
+ export const PANE_BORDER_ROWS = 2;
7
+ /** round 枠線の表示幅(左右各 1 列)。 */
8
+ export const ROUND_BORDER_WIDTH = 2;
9
+ /** メインペイン(Orchestration)の UI ラベル。conductor 対話とオーケストレーション状況の統合表示。 */
10
+ export const MAIN_PANE_TITLE = 'Orchestration';
11
+ /** Worker 状態ペインの固定高さ(枠線込み。タイトル + サマリ 3 行)。 */
12
+ export const WORKER_PANE_HEIGHT = 6;
13
+ /**
14
+ * Open questions ペインの最小高さ(枠線込み。タイトル + 本文 1 行)。
15
+ * 未回答 0 件時や本文が短いときの下限。
16
+ */
17
+ export const OPEN_QUESTIONS_PANE_MIN_HEIGHT = 4;
18
+ /** Open questions ペイン本文の表示行数上限(端末行数に対する比率)。 */
19
+ export const OPEN_QUESTIONS_PANE_MAX_HEIGHT_RATIO = 0.35;
20
+ /** Open questions ペイン本文の表示行数の絶対上限。 */
21
+ export const OPEN_QUESTIONS_PANE_MAX_DISPLAY_LINES = 8;
22
+ /** Open questions ペインタイトルに付与する選択操作ヒント。 */
23
+ export const OPEN_QUESTIONS_SELECTION_HINT = ' — Shift+↑↓で選択';
24
+ /** 入力ペインの枠線(上下)行数。`PANE_BORDER_ROWS` と同値。 */
25
+ export const INPUT_PANE_BORDER_ROWS = PANE_BORDER_ROWS;
26
+ /** ペイン内水平 padding(`paddingX`)。 */
27
+ export const PANE_PADDING_X = 1;
28
+ /** 入力ペイン左枠線の列幅(`borderStyle="single"` の左 `│`)。 */
29
+ export const INPUT_PANE_LEFT_BORDER_COLUMNS = 1;
30
+ /**
31
+ * 入力ペイン左端からテキストコンテンツ開始までの列数(左枠線 + `paddingX`)。
32
+ * `useCursor` の X は Ink 出力原点からの絶対列であり、このオフセットを含める。
33
+ */
34
+ export const INPUT_PANE_LEFT_COLUMNS = INPUT_PANE_LEFT_BORDER_COLUMNS + PANE_PADDING_X;
35
+ /**
36
+ * Ink `useCursor` の Y 補正。`log-update` の `visibleLineCount` が描画行数より 1 大きい場合、
37
+ * 実カーソルが入力行より 1 行上にずれる(オペレータ手動確認 iTerm2+tmux)。
38
+ */
39
+ export const OPERATOR_INPUT_CURSOR_Y_OFFSET = 1;
40
+ /** 入力ペインの表示行数上限(端末行数に対する比率)。 */
41
+ export const INPUT_PANE_MAX_HEIGHT_RATIO = 0.35;
42
+ /** 入力ペインの表示行数の絶対上限。 */
43
+ export const INPUT_PANE_MAX_DISPLAY_LINES = 10;
44
+ /** 入力ペインの最小表示行数(空入力時)。 */
45
+ export const INPUT_PANE_MIN_DISPLAY_LINES = 1;
46
+ /** Orchestration ペインのタイトル行数(`MAIN_PANE_TITLE` 単独行。hint は呼び出し側で加算)。 */
47
+ export const ORCHESTRATION_PANE_TITLE_ROWS = 1;
48
+ //# sourceMappingURL=tui-layout-constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui-layout-constants.js","sourceRoot":"","sources":["../../src/tui/tui-layout-constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,yCAAyC;AACzC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAElC,6BAA6B;AAC7B,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAEpC,oEAAoE;AACpE,MAAM,CAAC,MAAM,eAAe,GAAG,eAAe,CAAC;AAE/C,8CAA8C;AAC9C,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAEpC;;;GAGG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,CAAC;AAEhD,+CAA+C;AAC/C,MAAM,CAAC,MAAM,oCAAoC,GAAG,IAAI,CAAC;AAEzD,sCAAsC;AACtC,MAAM,CAAC,MAAM,qCAAqC,GAAG,CAAC,CAAC;AAEvD,0CAA0C;AAC1C,MAAM,CAAC,MAAM,6BAA6B,GAAG,gBAAgB,CAAC;AAE9D,6CAA6C;AAC7C,MAAM,CAAC,MAAM,sBAAsB,GAAG,gBAAgB,CAAC;AAEvD,kCAAkC;AAClC,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC;AAEhC,kDAAkD;AAClD,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,CAAC;AAEhD;;;GAGG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,8BAA8B,GAAG,cAAc,CAAC;AAEvF;;;GAGG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,CAAC;AAEhD,gCAAgC;AAChC,MAAM,CAAC,MAAM,2BAA2B,GAAG,IAAI,CAAC;AAEhD,uBAAuB;AACvB,MAAM,CAAC,MAAM,4BAA4B,GAAG,EAAE,CAAC;AAE/C,0BAA0B;AAC1B,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,CAAC;AAE9C,sEAAsE;AACtE,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,CAAC"}