@agents-ensemble/cli 0.3.0 → 0.4.0

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 (83) hide show
  1. package/dist/format-profiles-list.d.ts.map +1 -1
  2. package/dist/format-profiles-list.js +18 -1
  3. package/dist/format-profiles-list.js.map +1 -1
  4. package/dist/index.js +7 -1
  5. package/dist/index.js.map +1 -1
  6. package/dist/issue-command.d.ts +3 -0
  7. package/dist/issue-command.d.ts.map +1 -1
  8. package/dist/issue-command.js +14 -0
  9. package/dist/issue-command.js.map +1 -1
  10. package/dist/session-log-lines.js +1 -1
  11. package/dist/session-log-lines.js.map +1 -1
  12. package/dist/tui/compute-operator-input-cursor-y.d.ts +3 -3
  13. package/dist/tui/compute-operator-input-cursor-y.d.ts.map +1 -1
  14. package/dist/tui/compute-operator-input-cursor-y.js +5 -5
  15. package/dist/tui/compute-operator-input-cursor-y.js.map +1 -1
  16. package/dist/tui/create-issue-session-tui-host.test.js +2 -2
  17. package/dist/tui/create-issue-session-tui-host.test.js.map +1 -1
  18. package/dist/tui/ink-test-keys.d.ts +2 -2
  19. package/dist/tui/ink-test-keys.d.ts.map +1 -1
  20. package/dist/tui/ink-test-keys.js +2 -2
  21. package/dist/tui/ink-test-keys.js.map +1 -1
  22. package/dist/tui/issue-session-tui.d.ts.map +1 -1
  23. package/dist/tui/issue-session-tui.js +10 -13
  24. package/dist/tui/issue-session-tui.js.map +1 -1
  25. package/dist/tui/issue-session-tui.test.js +22 -12
  26. package/dist/tui/issue-session-tui.test.js.map +1 -1
  27. package/dist/tui/open-questions-pane.d.ts +1 -3
  28. package/dist/tui/open-questions-pane.d.ts.map +1 -1
  29. package/dist/tui/open-questions-pane.js +7 -12
  30. package/dist/tui/open-questions-pane.js.map +1 -1
  31. package/dist/tui/operator-input-layout.d.ts +2 -0
  32. package/dist/tui/operator-input-layout.d.ts.map +1 -1
  33. package/dist/tui/operator-input-layout.js +9 -0
  34. package/dist/tui/operator-input-layout.js.map +1 -1
  35. package/dist/tui/operator-text-area.d.ts +27 -0
  36. package/dist/tui/operator-text-area.d.ts.map +1 -0
  37. package/dist/tui/operator-text-area.js +31 -0
  38. package/dist/tui/operator-text-area.js.map +1 -0
  39. package/dist/tui/operator-text-area.test-double.d.ts +3 -0
  40. package/dist/tui/operator-text-area.test-double.d.ts.map +1 -0
  41. package/dist/tui/operator-text-area.test-double.js +78 -0
  42. package/dist/tui/operator-text-area.test-double.js.map +1 -0
  43. package/dist/tui/operator-text-area.test-stub.d.ts +16 -0
  44. package/dist/tui/operator-text-area.test-stub.d.ts.map +1 -0
  45. package/dist/tui/operator-text-area.test-stub.js +64 -0
  46. package/dist/tui/operator-text-area.test-stub.js.map +1 -0
  47. package/dist/tui/operator-text-area.test.d.ts +2 -0
  48. package/dist/tui/operator-text-area.test.d.ts.map +1 -0
  49. package/dist/tui/operator-text-area.test.js +105 -0
  50. package/dist/tui/operator-text-area.test.js.map +1 -0
  51. package/dist/tui/orchestration-pane-frame.d.ts +10 -1
  52. package/dist/tui/orchestration-pane-frame.d.ts.map +1 -1
  53. package/dist/tui/orchestration-pane-frame.js +26 -14
  54. package/dist/tui/orchestration-pane-frame.js.map +1 -1
  55. package/dist/tui/titled-border-line.d.ts +33 -0
  56. package/dist/tui/titled-border-line.d.ts.map +1 -0
  57. package/dist/tui/titled-border-line.js +62 -0
  58. package/dist/tui/titled-border-line.js.map +1 -0
  59. package/dist/tui/titled-border-pane.d.ts +16 -0
  60. package/dist/tui/titled-border-pane.d.ts.map +1 -0
  61. package/dist/tui/titled-border-pane.ink.test.d.ts +2 -0
  62. package/dist/tui/titled-border-pane.ink.test.d.ts.map +1 -0
  63. package/dist/tui/titled-border-pane.ink.test.js +23 -0
  64. package/dist/tui/titled-border-pane.ink.test.js.map +1 -0
  65. package/dist/tui/titled-border-pane.js +16 -0
  66. package/dist/tui/titled-border-pane.js.map +1 -0
  67. package/dist/tui/tui-layout-constants.d.ts +9 -5
  68. package/dist/tui/tui-layout-constants.d.ts.map +1 -1
  69. package/dist/tui/tui-layout-constants.js +9 -5
  70. package/dist/tui/tui-layout-constants.js.map +1 -1
  71. package/package.json +6 -3
  72. package/dist/tui/ime-text-input.d.ts +0 -31
  73. package/dist/tui/ime-text-input.d.ts.map +0 -1
  74. package/dist/tui/ime-text-input.js +0 -111
  75. package/dist/tui/ime-text-input.js.map +0 -1
  76. package/dist/tui/ime-text-input.test.d.ts +0 -2
  77. package/dist/tui/ime-text-input.test.d.ts.map +0 -1
  78. package/dist/tui/ime-text-input.test.js +0 -62
  79. package/dist/tui/ime-text-input.test.js.map +0 -1
  80. package/dist/tui/operator-input-key-reducer.d.ts +0 -36
  81. package/dist/tui/operator-input-key-reducer.d.ts.map +0 -1
  82. package/dist/tui/operator-input-key-reducer.js +0 -141
  83. package/dist/tui/operator-input-key-reducer.js.map +0 -1
@@ -0,0 +1,105 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
3
+ vi.mock('react-ink-textarea', async () => {
4
+ const { TestTextArea } = await import('./operator-text-area.test-stub.js');
5
+ return { TextArea: TestTextArea };
6
+ });
7
+ import { isValidElement, useState } from 'react';
8
+ import { cleanup, render } from 'ink-testing-library';
9
+ import { OperatorTextArea } from './operator-text-area.js';
10
+ import { textAreaSpy } from './operator-text-area.test-stub.js';
11
+ import { flushInkStdin, INK_TEST_KEYS } from './ink-test-keys.js';
12
+ import { computeOperatorInputLayout, logicalPositionToOffset, mapCursorOffsetToDisplayPosition, sliceVisibleInputDisplayLines, } from './operator-input-layout.js';
13
+ function ControlledInput({ initialValue, contentWidth = 30, maxDisplayLines = 5, promptPrefix = '', onValueChange, }) {
14
+ const [value, setValue] = useState(initialValue);
15
+ return (_jsx(OperatorTextArea, { value: value, onChange: (nextValue) => {
16
+ setValue(nextValue);
17
+ onValueChange?.(nextValue);
18
+ }, contentWidth: contentWidth, promptPrefix: promptPrefix, maxDisplayLines: maxDisplayLines }));
19
+ }
20
+ describe('OperatorTextArea (production wrapper)', () => {
21
+ beforeEach(() => {
22
+ textAreaSpy.mockClear();
23
+ });
24
+ afterEach(() => {
25
+ cleanup();
26
+ });
27
+ it('passes react-ink-textarea props for viewport and handlers', () => {
28
+ const onChange = vi.fn();
29
+ const onSubmit = vi.fn();
30
+ render(_jsx(OperatorTextArea, { value: "hello", onChange: onChange, onSubmit: onSubmit, contentWidth: 40, maxDisplayLines: 4 }));
31
+ expect(textAreaSpy).toHaveBeenCalled();
32
+ const props = textAreaSpy.mock.calls.at(-1)?.[0];
33
+ expect(props?.viewportLines).toBe(4);
34
+ expect(props?.initialLineCount).toBe(1);
35
+ expect(props?.linePrefix).toBeUndefined();
36
+ expect(props?.onChange).toBe(onChange);
37
+ expect(props?.onSubmit).toBeTypeOf('function');
38
+ props?.onSubmit?.('hello');
39
+ expect(onSubmit).toHaveBeenCalledWith('hello');
40
+ expect(props?.cursorStart).toBeUndefined();
41
+ });
42
+ it('forwards cursorStart to TextArea when promptPrefix is set', () => {
43
+ render(_jsx(OperatorTextArea, { value: "", onChange: () => { }, contentWidth: 40, promptPrefix: "> ", maxDisplayLines: 4, cursorStart: { x: 5, y: 20 } }));
44
+ const props = textAreaSpy.mock.calls.at(-1)?.[0];
45
+ expect(props?.cursorStart).toEqual({ x: 3, y: 20 });
46
+ expect(props?.linePrefix).toBeTypeOf('function');
47
+ const prefixNode = props?.linePrefix?.({
48
+ lineNumber: 0,
49
+ totalLines: 1,
50
+ isActiveLine: true,
51
+ isVirtualLine: false,
52
+ isContinuationLine: false,
53
+ continuationIndex: 0,
54
+ isLastChunkOfLine: true,
55
+ });
56
+ expect(isValidElement(prefixNode)).toBe(true);
57
+ });
58
+ it('moves cursor up across explicit newlines via arrow keys', async () => {
59
+ let latestValue = 'hello\nworld';
60
+ const { stdin } = render(_jsx(ControlledInput, { initialValue: latestValue, onValueChange: (value) => {
61
+ latestValue = value;
62
+ } }));
63
+ stdin.write(INK_TEST_KEYS.upArrow);
64
+ await flushInkStdin();
65
+ stdin.write(INK_TEST_KEYS.home);
66
+ await flushInkStdin();
67
+ stdin.write('X');
68
+ await flushInkStdin();
69
+ expect(latestValue).toBe('Xhello\nworld');
70
+ });
71
+ it('forwards TextArea onChange for explicit newline insertion', () => {
72
+ const onChange = vi.fn();
73
+ render(_jsx(OperatorTextArea, { value: "helloworld", onChange: onChange, contentWidth: 30, maxDisplayLines: 5 }));
74
+ const props = textAreaSpy.mock.calls.at(-1)?.[0];
75
+ props?.onChange?.('hello\nworld');
76
+ expect(onChange).toHaveBeenCalledWith('hello\nworld');
77
+ });
78
+ it('keeps cursor line visible when scrolling past maxDisplayLines', async () => {
79
+ const contentWidth = 10;
80
+ const promptWidth = 0;
81
+ const longValue = 'line\n'.repeat(8).trimEnd();
82
+ const layout = computeOperatorInputLayout(longValue, contentWidth, promptWidth);
83
+ const maxDisplayLines = 3;
84
+ const cursorLine = layout.displayLines.length - 1;
85
+ const { scrollOffset } = sliceVisibleInputDisplayLines(layout.displayLines, maxDisplayLines, cursorLine);
86
+ expect(scrollOffset).toBeGreaterThan(0);
87
+ expect(cursorLine).toBeLessThan(scrollOffset + maxDisplayLines);
88
+ const { stdin } = render(_jsx(ControlledInput, { initialValue: longValue, contentWidth: contentWidth, maxDisplayLines: maxDisplayLines }));
89
+ stdin.write(INK_TEST_KEYS.home);
90
+ await flushInkStdin();
91
+ const { scrollOffset: topScroll } = sliceVisibleInputDisplayLines(layout.displayLines, maxDisplayLines, 0);
92
+ expect(topScroll).toBe(0);
93
+ });
94
+ it('maps logical cursor position to display coordinates for wrapped input', () => {
95
+ const value = 'hello\nworld';
96
+ const contentWidth = 30;
97
+ const promptWidth = 0;
98
+ const cursorOffset = logicalPositionToOffset(value, 1, 2);
99
+ const position = mapCursorOffsetToDisplayPosition(value, cursorOffset, contentWidth, promptWidth);
100
+ expect(cursorOffset).toBe(8);
101
+ expect(position.displayLineIndex).toBe(1);
102
+ expect(position.columnInLine).toBe(2);
103
+ });
104
+ });
105
+ //# sourceMappingURL=operator-text-area.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operator-text-area.test.js","sourceRoot":"","sources":["../../src/tui/operator-text-area.test.tsx"],"names":[],"mappings":"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"}
@@ -1,9 +1,18 @@
1
+ export interface TuiPaneFrameStats {
2
+ innerRows: string[];
3
+ contentRows: string[];
4
+ blankRows: string[];
5
+ titleOnBorder: boolean;
6
+ }
7
+ /** Ink フレーム文字列から指定タイトルを持つペイン内側の行を抽出する。 */
8
+ export declare function extractTuiPaneFrameStats(frame: string, titleMarker: string): TuiPaneFrameStats;
9
+ /** @deprecated {@link extractTuiPaneFrameStats} を使用 */
1
10
  export interface OrchestrationPaneFrameStats {
2
11
  innerRows: string[];
3
12
  logRows: string[];
4
13
  blankRows: string[];
5
14
  titleRows: string[];
6
15
  }
7
- /** Ink フレーム文字列から Orchestration ペイン内側の行を抽出する。 */
16
+ /** @deprecated {@link extractTuiPaneFrameStats} を使用 */
8
17
  export declare function extractOrchestrationPaneFrameStats(frame: string): OrchestrationPaneFrameStats;
9
18
  //# sourceMappingURL=orchestration-pane-frame.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"orchestration-pane-frame.d.ts","sourceRoot":"","sources":["../../src/tui/orchestration-pane-frame.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,0CAA0C;AAC1C,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,GAClB,iBAAiB,CAgCnB;AAED,uDAAuD;AACvD,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,uDAAuD;AACvD,wBAAgB,kCAAkC,CAAC,KAAK,EAAE,MAAM,GAAG,2BAA2B,CAY7F"}
@@ -1,27 +1,39 @@
1
- import { MAIN_PANE_TITLE } from './tui-layout-constants.js';
2
- /** Ink フレーム文字列から Orchestration ペイン内側の行を抽出する。 */
3
- export function extractOrchestrationPaneFrameStats(frame) {
1
+ /** Ink フレーム文字列から指定タイトルを持つペイン内側の行を抽出する。 */
2
+ export function extractTuiPaneFrameStats(frame, titleMarker) {
4
3
  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: [] };
4
+ const topBorderIndex = lines.findIndex((line) => (line.startsWith('╭') || line.startsWith('┌')) && line.includes(titleMarker));
5
+ if (topBorderIndex < 0) {
6
+ return { innerRows: [], contentRows: [], blankRows: [], titleOnBorder: false };
8
7
  }
9
8
  const innerRows = [];
10
- for (let index = titleIndex; index < lines.length; index++) {
9
+ for (let index = topBorderIndex + 1; index < lines.length; index++) {
11
10
  const line = lines[index] ?? '';
12
- if (line.startsWith('╰')) {
11
+ if (line.startsWith('╰') || line.startsWith('└')) {
13
12
  break;
14
13
  }
15
- if (line.startsWith('╭') && index > titleIndex) {
14
+ if ((line.startsWith('╭') || line.startsWith('┌')) && index > topBorderIndex) {
16
15
  break;
17
16
  }
18
- if (line.startsWith('│')) {
17
+ if (line.startsWith('│') || line.startsWith('┃')) {
19
18
  innerRows.push(line);
20
19
  }
21
20
  }
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 };
21
+ const titleOnBorder = (lines[topBorderIndex] ?? '').includes(titleMarker);
22
+ const titleRows = innerRows.filter((line) => line.includes(titleMarker));
23
+ const contentRows = innerRows.filter((line) => !titleRows.includes(line));
24
+ const blankRows = innerRows.filter((line) => line.replace(/[│┃]/g, '').trim().length === 0);
25
+ return { innerRows, contentRows, blankRows, titleOnBorder };
26
+ }
27
+ /** @deprecated {@link extractTuiPaneFrameStats} を使用 */
28
+ export function extractOrchestrationPaneFrameStats(frame) {
29
+ const stats = extractTuiPaneFrameStats(frame, 'Orchestration');
30
+ const logRows = stats.contentRows.filter((line) => /\[(?:operator|conductor|harness|observation)\]/.test(line));
31
+ const titleRows = stats.titleOnBorder ? [] : stats.innerRows.filter((line) => line.includes('Orchestration'));
32
+ return {
33
+ innerRows: stats.innerRows,
34
+ logRows,
35
+ blankRows: stats.blankRows,
36
+ titleRows,
37
+ };
26
38
  }
27
39
  //# sourceMappingURL=orchestration-pane-frame.js.map
@@ -1 +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"}
1
+ {"version":3,"file":"orchestration-pane-frame.js","sourceRoot":"","sources":["../../src/tui/orchestration-pane-frame.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ export type TuiBorderStyle = 'round' | 'single';
2
+ export interface TuiBorderChars {
3
+ tl: string;
4
+ tr: string;
5
+ bl: string;
6
+ br: string;
7
+ h: string;
8
+ v: string;
9
+ }
10
+ export declare function getTuiBorderChars(style: TuiBorderStyle): TuiBorderChars;
11
+ export interface TitledTopBorderParts {
12
+ left: string;
13
+ title: string;
14
+ right: string;
15
+ }
16
+ /**
17
+ * 上枠線にタイトルを埋め込んだ行を組み立てる。
18
+ * 形式: `╭─ Title ─────────────╮`(タイトル前後に隙間)。
19
+ * suffix はタイトル直後に付与し、幅不足時は suffix から省略する。
20
+ */
21
+ export declare function buildTitledTopBorderParts(params: {
22
+ title: string;
23
+ suffix?: string;
24
+ totalWidth: number;
25
+ borderStyle: TuiBorderStyle;
26
+ }): TitledTopBorderParts;
27
+ export declare function buildTitledTopBorderLine(params: {
28
+ title: string;
29
+ suffix?: string;
30
+ totalWidth: number;
31
+ borderStyle: TuiBorderStyle;
32
+ }): string;
33
+ //# sourceMappingURL=titled-border-line.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"titled-border-line.d.ts","sourceRoot":"","sources":["../../src/tui/titled-border-line.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEhD,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,cAAc,GAAG,cAAc,CAIvE;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,cAAc,CAAC;CAC7B,GAAG,oBAAoB,CAoDvB;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,cAAc,CAAC;CAC7B,GAAG,MAAM,CAGT"}
@@ -0,0 +1,62 @@
1
+ import stringWidth from 'string-width';
2
+ export function getTuiBorderChars(style) {
3
+ return style === 'round'
4
+ ? { tl: '╭', tr: '╮', bl: '╰', br: '╯', h: '─', v: '│' }
5
+ : { tl: '┌', tr: '┐', bl: '└', br: '┘', h: '─', v: '│' };
6
+ }
7
+ /**
8
+ * 上枠線にタイトルを埋め込んだ行を組み立てる。
9
+ * 形式: `╭─ Title ─────────────╮`(タイトル前後に隙間)。
10
+ * suffix はタイトル直後に付与し、幅不足時は suffix から省略する。
11
+ */
12
+ export function buildTitledTopBorderParts(params) {
13
+ const { title, borderStyle } = params;
14
+ const suffix = params.suffix ?? '';
15
+ const chars = getTuiBorderChars(borderStyle);
16
+ const totalWidth = Math.max(4, params.totalWidth);
17
+ const buildLine = (label) => {
18
+ const left = `${chars.tl}${chars.h} `;
19
+ const separator = ` ${chars.h}`;
20
+ const labelWidth = stringWidth(label);
21
+ const fixedWidth = stringWidth(left) + labelWidth + stringWidth(separator) + stringWidth(chars.tr);
22
+ if (fixedWidth > totalWidth) {
23
+ return null;
24
+ }
25
+ const fillCount = totalWidth - fixedWidth;
26
+ const right = `${separator}${chars.h.repeat(Math.max(0, fillCount))}${chars.tr}`;
27
+ return { left, title: label, right };
28
+ };
29
+ const fullLabel = `${title}${suffix}`;
30
+ const full = buildLine(fullLabel);
31
+ if (full) {
32
+ return full;
33
+ }
34
+ if (suffix.length > 0) {
35
+ for (let length = suffix.length; length > 0; length--) {
36
+ const truncatedSuffix = `${suffix.slice(0, length - 1)}…`;
37
+ const partial = buildLine(`${title}${truncatedSuffix}`);
38
+ if (partial) {
39
+ return partial;
40
+ }
41
+ }
42
+ }
43
+ for (let length = title.length; length > 0; length--) {
44
+ const truncatedTitle = length < title.length ? `${title.slice(0, length - 1)}…` : title;
45
+ const minimal = buildLine(truncatedTitle);
46
+ if (minimal) {
47
+ return minimal;
48
+ }
49
+ }
50
+ const left = chars.tl;
51
+ const fillCount = Math.max(0, totalWidth - stringWidth(left) - stringWidth(chars.tr));
52
+ return {
53
+ left,
54
+ title: '',
55
+ right: `${chars.h.repeat(fillCount)}${chars.tr}`,
56
+ };
57
+ }
58
+ export function buildTitledTopBorderLine(params) {
59
+ const parts = buildTitledTopBorderParts(params);
60
+ return `${parts.left}${parts.title}${parts.right}`;
61
+ }
62
+ //# sourceMappingURL=titled-border-line.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"titled-border-line.js","sourceRoot":"","sources":["../../src/tui/titled-border-line.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { type BoxProps } from 'ink';
2
+ import type { ReactNode } from 'react';
3
+ import { type TuiBorderStyle } from './titled-border-line.js';
4
+ export interface TitledBorderPaneProps {
5
+ title: string;
6
+ titleSuffix?: string;
7
+ borderStyle: TuiBorderStyle;
8
+ borderColor?: BoxProps['borderColor'];
9
+ height: number;
10
+ paddingX?: number;
11
+ titleBold?: boolean;
12
+ children: ReactNode;
13
+ }
14
+ /** 上枠線にタイトルを埋め込んだ Ink ペイン。内側タイトル行は持たない。 */
15
+ export declare function TitledBorderPane({ title, titleSuffix, borderStyle, borderColor, height, paddingX, titleBold, children, }: TitledBorderPaneProps): import("react/jsx-runtime").JSX.Element;
16
+ //# sourceMappingURL=titled-border-pane.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"titled-border-pane.d.ts","sourceRoot":"","sources":["../../src/tui/titled-border-pane.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAEL,KAAK,cAAc,EACpB,MAAM,yBAAyB,CAAC;AAEjC,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,cAAc,CAAC;IAC5B,WAAW,CAAC,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,2CAA2C;AAC3C,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,WAAW,EACX,WAAW,EACX,WAAW,EACX,MAAM,EACN,QAAY,EACZ,SAAgB,EAChB,QAAQ,GACT,EAAE,qBAAqB,2CAqCvB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=titled-border-pane.ink.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"titled-border-pane.ink.test.d.ts","sourceRoot":"","sources":["../../src/tui/titled-border-pane.ink.test.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,23 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { describe, expect, it } from 'vitest';
3
+ import { Text } from 'ink';
4
+ import { render } from 'ink-testing-library';
5
+ import { TitledBorderPane } from './titled-border-pane.js';
6
+ describe('TitledBorderPane', () => {
7
+ it('renders embedded title on top border', () => {
8
+ Object.defineProperty(process.stdout, 'columns', {
9
+ configurable: true,
10
+ value: 40,
11
+ });
12
+ Object.defineProperty(process.stdout, 'rows', {
13
+ configurable: true,
14
+ value: 10,
15
+ });
16
+ const { lastFrame } = render(_jsx(TitledBorderPane, { title: "Workers", borderStyle: "round", height: 5, children: _jsx(Text, { children: "hello" }) }));
17
+ const frame = lastFrame() ?? '';
18
+ expect(frame).toContain('Workers');
19
+ expect(frame).toContain('hello');
20
+ expect(frame).not.toMatch(/^│ Workers/m);
21
+ });
22
+ });
23
+ //# sourceMappingURL=titled-border-pane.ink.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"titled-border-pane.ink.test.js","sourceRoot":"","sources":["../../src/tui/titled-border-pane.ink.test.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAC3B,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE;YAC/C,YAAY,EAAE,IAAI;YAClB,KAAK,EAAE,EAAE;SACV,CAAC,CAAC;QACH,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE;YAC5C,YAAY,EAAE,IAAI;YAClB,KAAK,EAAE,EAAE;SACV,CAAC,CAAC;QAEH,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAC1B,KAAC,gBAAgB,IAAC,KAAK,EAAC,SAAS,EAAC,WAAW,EAAC,OAAO,EAAC,MAAM,EAAE,CAAC,YAC7D,KAAC,IAAI,wBAAa,GACD,CACpB,CAAC;QAEF,MAAM,KAAK,GAAG,SAAS,EAAE,IAAI,EAAE,CAAC;QAChC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACnC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACjC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ import { buildTitledTopBorderParts, } from './titled-border-line.js';
4
+ /** 上枠線にタイトルを埋め込んだ Ink ペイン。内側タイトル行は持たない。 */
5
+ export function TitledBorderPane({ title, titleSuffix, borderStyle, borderColor, height, paddingX = 1, titleBold = true, children, }) {
6
+ const totalWidth = process.stdout.columns ?? 80;
7
+ const parts = buildTitledTopBorderParts({
8
+ title,
9
+ suffix: titleSuffix,
10
+ totalWidth,
11
+ borderStyle,
12
+ });
13
+ const bodyHeight = Math.max(1, height - 1);
14
+ return (_jsxs(Box, { flexDirection: "column", height: height, overflow: "hidden", children: [_jsxs(Text, { children: [_jsx(Text, { color: borderColor, children: parts.left }), titleBold ? (_jsx(Text, { bold: true, color: borderColor, children: parts.title })) : (_jsx(Text, { color: borderColor, children: parts.title })), _jsx(Text, { color: borderColor, children: parts.right })] }), _jsx(Box, { flexGrow: 1, flexDirection: "column", borderStyle: borderStyle, borderTop: false, borderColor: borderColor, paddingX: paddingX, height: bodyHeight, overflow: "hidden", children: children })] }));
15
+ }
16
+ //# sourceMappingURL=titled-border-pane.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"titled-border-pane.js","sourceRoot":"","sources":["../../src/tui/titled-border-pane.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAiB,MAAM,KAAK,CAAC;AAE/C,OAAO,EACL,yBAAyB,GAE1B,MAAM,yBAAyB,CAAC;AAajC,2CAA2C;AAC3C,MAAM,UAAU,gBAAgB,CAAC,EAC/B,KAAK,EACL,WAAW,EACX,WAAW,EACX,WAAW,EACX,MAAM,EACN,QAAQ,GAAG,CAAC,EACZ,SAAS,GAAG,IAAI,EAChB,QAAQ,GACc;IACtB,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;IAChD,MAAM,KAAK,GAAG,yBAAyB,CAAC;QACtC,KAAK;QACL,MAAM,EAAE,WAAW;QACnB,UAAU;QACV,WAAW;KACZ,CAAC,CAAC;IACH,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;IAE3C,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAC,QAAQ,aAC3D,MAAC,IAAI,eACH,KAAC,IAAI,IAAC,KAAK,EAAE,WAAW,YAAG,KAAK,CAAC,IAAI,GAAQ,EAC5C,SAAS,CAAC,CAAC,CAAC,CACX,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAE,WAAW,YAC1B,KAAK,CAAC,KAAK,GACP,CACR,CAAC,CAAC,CAAC,CACF,KAAC,IAAI,IAAC,KAAK,EAAE,WAAW,YAAG,KAAK,CAAC,KAAK,GAAQ,CAC/C,EACD,KAAC,IAAI,IAAC,KAAK,EAAE,WAAW,YAAG,KAAK,CAAC,KAAK,GAAQ,IACzC,EACP,KAAC,GAAG,IACF,QAAQ,EAAE,CAAC,EACX,aAAa,EAAC,QAAQ,EACtB,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,KAAK,EAChB,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAC,QAAQ,YAEhB,QAAQ,GACL,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -8,13 +8,19 @@ export declare const PANE_BORDER_ROWS = 2;
8
8
  export declare const ROUND_BORDER_WIDTH = 2;
9
9
  /** メインペイン(Orchestration)の UI ラベル。conductor 対話とオーケストレーション状況の統合表示。 */
10
10
  export declare const MAIN_PANE_TITLE = "Orchestration";
11
- /** Worker 状態ペインの固定高さ(枠線込み。タイトル + サマリ 3 行)。 */
11
+ /** Workers ペインの UI ラベル。 */
12
+ export declare const WORKER_PANE_TITLE = "Workers";
13
+ /** Open questions ペインの UI ラベル(件数・選択ヒントは呼び出し側で付与)。 */
14
+ export declare const OPEN_QUESTIONS_PANE_TITLE = "Open questions";
15
+ /** Operator input ペインの UI ラベル。 */
16
+ export declare const INPUT_PANE_TITLE = "Operator input";
17
+ /** Worker 状態ペインの固定高さ(枠線込み。タイトルは上枠線埋め込み + サマリ 4 行)。 */
12
18
  export declare const WORKER_PANE_HEIGHT = 6;
13
19
  /**
14
- * Open questions ペインの最小高さ(枠線込み。タイトル + 本文 1 行)。
20
+ * Open questions ペインの最小高さ(枠線込み。タイトルは上枠線埋め込み + 本文 1 行)。
15
21
  * 未回答 0 件時や本文が短いときの下限。
16
22
  */
17
- export declare const OPEN_QUESTIONS_PANE_MIN_HEIGHT = 4;
23
+ export declare const OPEN_QUESTIONS_PANE_MIN_HEIGHT = 3;
18
24
  /** Open questions ペイン本文の表示行数上限(端末行数に対する比率)。 */
19
25
  export declare const OPEN_QUESTIONS_PANE_MAX_HEIGHT_RATIO = 0.35;
20
26
  /** Open questions ペイン本文の表示行数の絶対上限。 */
@@ -43,6 +49,4 @@ export declare const INPUT_PANE_MAX_HEIGHT_RATIO = 0.35;
43
49
  export declare const INPUT_PANE_MAX_DISPLAY_LINES = 10;
44
50
  /** 入力ペインの最小表示行数(空入力時)。 */
45
51
  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
52
  //# sourceMappingURL=tui-layout-constants.d.ts.map
@@ -1 +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"}
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,2BAA2B;AAC3B,eAAO,MAAM,iBAAiB,YAAY,CAAC;AAE3C,qDAAqD;AACrD,eAAO,MAAM,yBAAyB,mBAAmB,CAAC;AAE1D,kCAAkC;AAClC,eAAO,MAAM,gBAAgB,mBAAmB,CAAC;AAEjD,sDAAsD;AACtD,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"}
@@ -8,13 +8,19 @@ export const PANE_BORDER_ROWS = 2;
8
8
  export const ROUND_BORDER_WIDTH = 2;
9
9
  /** メインペイン(Orchestration)の UI ラベル。conductor 対話とオーケストレーション状況の統合表示。 */
10
10
  export const MAIN_PANE_TITLE = 'Orchestration';
11
- /** Worker 状態ペインの固定高さ(枠線込み。タイトル + サマリ 3 行)。 */
11
+ /** Workers ペインの UI ラベル。 */
12
+ export const WORKER_PANE_TITLE = 'Workers';
13
+ /** Open questions ペインの UI ラベル(件数・選択ヒントは呼び出し側で付与)。 */
14
+ export const OPEN_QUESTIONS_PANE_TITLE = 'Open questions';
15
+ /** Operator input ペインの UI ラベル。 */
16
+ export const INPUT_PANE_TITLE = 'Operator input';
17
+ /** Worker 状態ペインの固定高さ(枠線込み。タイトルは上枠線埋め込み + サマリ 4 行)。 */
12
18
  export const WORKER_PANE_HEIGHT = 6;
13
19
  /**
14
- * Open questions ペインの最小高さ(枠線込み。タイトル + 本文 1 行)。
20
+ * Open questions ペインの最小高さ(枠線込み。タイトルは上枠線埋め込み + 本文 1 行)。
15
21
  * 未回答 0 件時や本文が短いときの下限。
16
22
  */
17
- export const OPEN_QUESTIONS_PANE_MIN_HEIGHT = 4;
23
+ export const OPEN_QUESTIONS_PANE_MIN_HEIGHT = 3;
18
24
  /** Open questions ペイン本文の表示行数上限(端末行数に対する比率)。 */
19
25
  export const OPEN_QUESTIONS_PANE_MAX_HEIGHT_RATIO = 0.35;
20
26
  /** Open questions ペイン本文の表示行数の絶対上限。 */
@@ -43,6 +49,4 @@ export const INPUT_PANE_MAX_HEIGHT_RATIO = 0.35;
43
49
  export const INPUT_PANE_MAX_DISPLAY_LINES = 10;
44
50
  /** 入力ペインの最小表示行数(空入力時)。 */
45
51
  export const INPUT_PANE_MIN_DISPLAY_LINES = 1;
46
- /** Orchestration ペインのタイトル行数(`MAIN_PANE_TITLE` 単独行。hint は呼び出し側で加算)。 */
47
- export const ORCHESTRATION_PANE_TITLE_ROWS = 1;
48
52
  //# sourceMappingURL=tui-layout-constants.js.map
@@ -1 +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"}
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,2BAA2B;AAC3B,MAAM,CAAC,MAAM,iBAAiB,GAAG,SAAS,CAAC;AAE3C,qDAAqD;AACrD,MAAM,CAAC,MAAM,yBAAyB,GAAG,gBAAgB,CAAC;AAE1D,kCAAkC;AAClC,MAAM,CAAC,MAAM,gBAAgB,GAAG,gBAAgB,CAAC;AAEjD,sDAAsD;AACtD,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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agents-ensemble/cli",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "type": "module",
5
5
  "description": "ensemble CLI — Issue-based agent orchestration",
6
6
  "bin": {
@@ -9,12 +9,14 @@
9
9
  "main": "dist/index.js",
10
10
  "types": "dist/index.d.ts",
11
11
  "dependencies": {
12
+ "ansi-styles": "6.2.3",
12
13
  "chalk": "5.3.0",
13
14
  "commander": "14.0.1",
14
15
  "ink": "7.1.1",
15
16
  "react": "19.2.0",
17
+ "react-ink-textarea": "npm:@otolab/react-ink-textarea@0.4.1-otolab.0",
16
18
  "string-width": "8.1.0",
17
- "@agents-ensemble/core": "0.3.0"
19
+ "@agents-ensemble/core": "0.4.0"
18
20
  },
19
21
  "devDependencies": {
20
22
  "@types/js-yaml": "4.0.9",
@@ -45,6 +47,7 @@
45
47
  "build": "tsc --build",
46
48
  "test:e2e": "vitest run --config vitest.config.e2e.ts",
47
49
  "test": "vitest",
48
- "test:run": "vitest run"
50
+ "test:run": "vitest run",
51
+ "postinstall": "test -f node_modules/react-ink-textarea/dist/index.js || pnpm exec tsc -p node_modules/react-ink-textarea/tsconfig.json"
49
52
  }
50
53
  }
@@ -1,31 +0,0 @@
1
- export interface ImeTextInputProps {
2
- readonly value: string;
3
- readonly placeholder?: string;
4
- readonly focus?: boolean;
5
- readonly mask?: string;
6
- readonly highlightPastedText?: boolean;
7
- readonly showCursor?: boolean;
8
- readonly onChange: (value: string) => void;
9
- readonly onSubmit?: (value: string) => void;
10
- /** ペイン内コンテンツ幅(折り返し計算用)。 */
11
- readonly contentWidth: number;
12
- /** 1 行目先頭のプロンプト(例: `operator> `)。 */
13
- readonly promptPrefix?: string;
14
- /** 入力欄に表示できる最大行数(末尾追従)。 */
15
- readonly maxDisplayLines: number;
16
- readonly onDisplayLineCountChange?: (lineCount: number) => void;
17
- /**
18
- * Ink 出力原点からの入力テキスト開始位置。IME 変換窓を実カーソルに合わせる。
19
- * `x` は同一行上のラベル幅(例: `operator> `)、`y` は入力テキスト 1 行目。
20
- */
21
- readonly cursorStart?: {
22
- readonly x?: number;
23
- readonly y: number;
24
- };
25
- }
26
- /**
27
- * `ink-text-input` 相当 + Ink `useCursor` による IME カーソル配置。
28
- * 上流 [ink-text-input#93](https://github.com/vadimdemedes/ink-text-input/pull/93) 未マージのため自前実装。
29
- */
30
- export declare function ImeTextInput({ value: originalValue, placeholder, focus, mask, highlightPastedText, showCursor, onChange, onSubmit, contentWidth, promptPrefix, maxDisplayLines, onDisplayLineCountChange, cursorStart, }: ImeTextInputProps): import("react/jsx-runtime").JSX.Element;
31
- //# sourceMappingURL=ime-text-input.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ime-text-input.d.ts","sourceRoot":"","sources":["../../src/tui/ime-text-input.tsx"],"names":[],"mappings":"AAWA,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IACvC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,2BAA2B;IAC3B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,qCAAqC;IACrC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,2BAA2B;IAC3B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAChE;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE;QAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACpE;AAqCD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EAAE,aAAa,EACpB,WAAgB,EAChB,KAAY,EACZ,IAAI,EACJ,mBAA2B,EAC3B,UAAiB,EACjB,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,YAAiB,EACjB,eAAe,EACf,wBAAwB,EACxB,WAAW,GACZ,EAAE,iBAAiB,2CAkJnB"}