@agents-ensemble/cli 0.6.3 → 0.6.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/async-operator-input.js +1 -1
- package/dist/async-operator-input.js.map +1 -1
- package/dist/display/session-display-reducer.d.ts.map +1 -1
- package/dist/display/session-display-reducer.js +0 -11
- package/dist/display/session-display-reducer.js.map +1 -1
- package/dist/issue-command.d.ts.map +1 -1
- package/dist/issue-command.js +8 -4
- package/dist/issue-command.js.map +1 -1
- package/dist/prompt-operator-input.d.ts +1 -1
- package/dist/prompt-operator-input.d.ts.map +1 -1
- package/dist/prompt-operator-input.js +1 -1
- package/dist/prompt-operator-input.js.map +1 -1
- package/dist/session-log-lines.d.ts.map +1 -1
- package/dist/session-log-lines.js +51 -8
- package/dist/session-log-lines.js.map +1 -1
- package/dist/session-sinks.d.ts.map +1 -1
- package/dist/session-sinks.js +2 -10
- package/dist/session-sinks.js.map +1 -1
- package/dist/tui/compute-operator-input-cursor-y.d.ts +4 -0
- package/dist/tui/compute-operator-input-cursor-y.d.ts.map +1 -1
- package/dist/tui/compute-operator-input-cursor-y.js +4 -2
- package/dist/tui/compute-operator-input-cursor-y.js.map +1 -1
- package/dist/tui/create-issue-session-tui-host.d.ts.map +1 -1
- package/dist/tui/create-issue-session-tui-host.js +19 -8
- package/dist/tui/create-issue-session-tui-host.js.map +1 -1
- package/dist/tui/create-issue-session-tui-host.test.js +19 -5
- package/dist/tui/create-issue-session-tui-host.test.js.map +1 -1
- package/dist/tui/issue-session-tui-stream.d.ts +3 -1
- package/dist/tui/issue-session-tui-stream.d.ts.map +1 -1
- package/dist/tui/issue-session-tui-stream.js +11 -9
- package/dist/tui/issue-session-tui-stream.js.map +1 -1
- package/dist/tui/issue-session-tui-stream.test.js +36 -11
- package/dist/tui/issue-session-tui-stream.test.js.map +1 -1
- package/dist/tui/issue-session-tui.d.ts +7 -3
- package/dist/tui/issue-session-tui.d.ts.map +1 -1
- package/dist/tui/issue-session-tui.js +37 -21
- package/dist/tui/issue-session-tui.js.map +1 -1
- package/dist/tui/issue-session-tui.test.js +124 -22
- package/dist/tui/issue-session-tui.test.js.map +1 -1
- package/dist/tui/pane-layout.d.ts +22 -0
- package/dist/tui/pane-layout.d.ts.map +1 -0
- package/dist/tui/pane-layout.js +74 -0
- package/dist/tui/pane-layout.js.map +1 -0
- package/dist/tui/titled-border-pane.d.ts +2 -1
- package/dist/tui/titled-border-pane.d.ts.map +1 -1
- package/dist/tui/titled-border-pane.js +2 -2
- package/dist/tui/titled-border-pane.js.map +1 -1
- package/dist/tui/tui-layout-constants.d.ts +2 -2
- package/dist/tui/tui-layout-constants.d.ts.map +1 -1
- package/dist/tui/tui-layout-constants.js +2 -2
- package/dist/tui/tui-layout-constants.js.map +1 -1
- package/dist/tui/tui-terminal-size.d.ts +34 -0
- package/dist/tui/tui-terminal-size.d.ts.map +1 -0
- package/dist/tui/tui-terminal-size.js +163 -0
- package/dist/tui/tui-terminal-size.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { INPUT_PANE_BORDER_ROWS, PANE_BORDER_ROWS, WORKER_PANE_HEIGHT, } from './tui-layout-constants.js';
|
|
2
|
+
// A titled pane needs a title row and a bottom border row. Keep one content row
|
|
3
|
+
// for the activity pane whenever the other panes have enough spare height, but
|
|
4
|
+
// allow it to compact to the frame-only minimum before clipping the input.
|
|
5
|
+
const MIN_TITLED_PANE_HEIGHT = PANE_BORDER_ROWS;
|
|
6
|
+
const MIN_ACTIVITY_PANE_HEIGHT = PANE_BORDER_ROWS;
|
|
7
|
+
const PREFERRED_ACTIVITY_PANE_HEIGHT = PANE_BORDER_ROWS + 1;
|
|
8
|
+
const MIN_INPUT_PANE_HEIGHT = INPUT_PANE_BORDER_ROWS + 1;
|
|
9
|
+
function shrinkHeight(current, minimum, amount) {
|
|
10
|
+
const reducible = Math.max(0, current - minimum);
|
|
11
|
+
const reduction = Math.min(reducible, amount);
|
|
12
|
+
return { height: current - reduction, remaining: amount - reduction };
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Fits the pane layout into the already-reserved live frame.
|
|
16
|
+
*
|
|
17
|
+
* The activity pane is the flexible region. On short terminals, reduce the
|
|
18
|
+
* worker pane first, then the activity pane's spare content row, before
|
|
19
|
+
* compacting open questions or input. This prevents a height=1 titled pane
|
|
20
|
+
* from rendering only a stray bottom border without hiding the input row.
|
|
21
|
+
*/
|
|
22
|
+
export function resolvePaneHeights(params) {
|
|
23
|
+
const frameLimit = Math.max(1, Math.floor(params.liveFrameRows));
|
|
24
|
+
let workerPaneHeight = Math.max(MIN_TITLED_PANE_HEIGHT, params.workerPaneHeight ?? WORKER_PANE_HEIGHT);
|
|
25
|
+
let activityPaneHeight = Math.max(PREFERRED_ACTIVITY_PANE_HEIGHT, Math.floor(params.activityPaneHeight));
|
|
26
|
+
let openQuestionsPaneHeight = params.openQuestionsPaneHeight > 0
|
|
27
|
+
? Math.max(MIN_TITLED_PANE_HEIGHT, Math.floor(params.openQuestionsPaneHeight))
|
|
28
|
+
: 0;
|
|
29
|
+
let inputPaneHeight = Math.max(MIN_INPUT_PANE_HEIGHT, Math.floor(params.inputPaneHeight));
|
|
30
|
+
let overflow = workerPaneHeight +
|
|
31
|
+
activityPaneHeight +
|
|
32
|
+
openQuestionsPaneHeight +
|
|
33
|
+
inputPaneHeight -
|
|
34
|
+
frameLimit;
|
|
35
|
+
if (overflow > 0) {
|
|
36
|
+
const shrunk = shrinkHeight(workerPaneHeight, MIN_TITLED_PANE_HEIGHT, overflow);
|
|
37
|
+
workerPaneHeight = shrunk.height;
|
|
38
|
+
overflow = shrunk.remaining;
|
|
39
|
+
}
|
|
40
|
+
if (overflow > 0) {
|
|
41
|
+
const shrunk = shrinkHeight(activityPaneHeight, MIN_ACTIVITY_PANE_HEIGHT, overflow);
|
|
42
|
+
activityPaneHeight = shrunk.height;
|
|
43
|
+
overflow = shrunk.remaining;
|
|
44
|
+
}
|
|
45
|
+
if (overflow > 0 && openQuestionsPaneHeight > 0) {
|
|
46
|
+
const shrunk = shrinkHeight(openQuestionsPaneHeight, MIN_TITLED_PANE_HEIGHT, overflow);
|
|
47
|
+
openQuestionsPaneHeight = shrunk.height;
|
|
48
|
+
overflow = shrunk.remaining;
|
|
49
|
+
}
|
|
50
|
+
if (overflow > 0) {
|
|
51
|
+
const shrunk = shrinkHeight(inputPaneHeight, MIN_INPUT_PANE_HEIGHT, overflow);
|
|
52
|
+
inputPaneHeight = shrunk.height;
|
|
53
|
+
overflow = shrunk.remaining;
|
|
54
|
+
}
|
|
55
|
+
// Reallocate all remaining rows to the activity pane after compacting the
|
|
56
|
+
// fixed panes. The normal short-terminal case keeps one content row; when
|
|
57
|
+
// necessary, the activity pane remains at its frame-only two-row minimum.
|
|
58
|
+
activityPaneHeight = Math.max(MIN_TITLED_PANE_HEIGHT, frameLimit -
|
|
59
|
+
workerPaneHeight -
|
|
60
|
+
openQuestionsPaneHeight -
|
|
61
|
+
inputPaneHeight);
|
|
62
|
+
// If the terminal is smaller than every pane minimum, the root clips the
|
|
63
|
+
// content, but each titled pane still receives a non-broken frame height.
|
|
64
|
+
if (overflow > 0) {
|
|
65
|
+
activityPaneHeight = Math.max(MIN_TITLED_PANE_HEIGHT, activityPaneHeight - overflow);
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
workerPaneHeight,
|
|
69
|
+
activityPaneHeight,
|
|
70
|
+
openQuestionsPaneHeight,
|
|
71
|
+
inputPaneHeight,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=pane-layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pane-layout.js","sourceRoot":"","sources":["../../src/tui/pane-layout.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,10 +11,11 @@ export interface TitledBorderPaneProps {
|
|
|
11
11
|
borderStyle: TuiBorderStyle;
|
|
12
12
|
borderColor?: BoxProps['borderColor'];
|
|
13
13
|
height: number;
|
|
14
|
+
terminalColumns?: number;
|
|
14
15
|
paddingX?: number;
|
|
15
16
|
titleBold?: boolean;
|
|
16
17
|
children: ReactNode;
|
|
17
18
|
}
|
|
18
19
|
/** 上枠線にタイトルを埋め込んだ Ink ペイン。内側タイトル行は持たない。 */
|
|
19
|
-
export declare function TitledBorderPane({ title, titleSuffix, titleRight, titleRightIssueUrl, titleRightLinkMode, borderStyle, borderColor, height, paddingX, titleBold, children, }: TitledBorderPaneProps): import("react/jsx-runtime").JSX.Element;
|
|
20
|
+
export declare function TitledBorderPane({ title, titleSuffix, titleRight, titleRightIssueUrl, titleRightLinkMode, borderStyle, borderColor, height, terminalColumns, paddingX, titleBold, children, }: TitledBorderPaneProps): import("react/jsx-runtime").JSX.Element;
|
|
20
21
|
//# sourceMappingURL=titled-border-pane.d.ts.map
|
|
@@ -1 +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;AAEvC,OAAO,EAGL,KAAK,aAAa,EACnB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAEL,KAAK,cAAc,EACpB,MAAM,yBAAyB,CAAC;AAEjC,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,kBAAkB,CAAC,EAAE,aAAa,CAAC;IACnC,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;AAoBD,2CAA2C;AAC3C,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,WAAW,EACX,UAAU,EACV,kBAAkB,EAClB,kBAA4B,EAC5B,WAAW,EACX,WAAW,EACX,MAAM,EACN,QAAY,EACZ,SAAgB,EAChB,QAAQ,GACT,EAAE,qBAAqB,2CA0EvB"}
|
|
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;AAEvC,OAAO,EAGL,KAAK,aAAa,EACnB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAEL,KAAK,cAAc,EACpB,MAAM,yBAAyB,CAAC;AAEjC,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,kBAAkB,CAAC,EAAE,aAAa,CAAC;IACnC,WAAW,EAAE,cAAc,CAAC;IAC5B,WAAW,CAAC,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAoBD,2CAA2C;AAC3C,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,WAAW,EACX,UAAU,EACV,kBAAkB,EAClB,kBAA4B,EAC5B,WAAW,EACX,WAAW,EACX,MAAM,EACN,eAAe,EACf,QAAY,EACZ,SAAgB,EAChB,QAAQ,GACT,EAAE,qBAAqB,2CA0EvB"}
|
|
@@ -14,8 +14,8 @@ function renderTitleRight(params) {
|
|
|
14
14
|
return _jsx(Text, { color: borderColor, children: titleRight });
|
|
15
15
|
}
|
|
16
16
|
/** 上枠線にタイトルを埋め込んだ Ink ペイン。内側タイトル行は持たない。 */
|
|
17
|
-
export function TitledBorderPane({ title, titleSuffix, titleRight, titleRightIssueUrl, titleRightLinkMode = 'label', borderStyle, borderColor, height, paddingX = 1, titleBold = true, children, }) {
|
|
18
|
-
const totalWidth = process.stdout.columns ?? 80;
|
|
17
|
+
export function TitledBorderPane({ title, titleSuffix, titleRight, titleRightIssueUrl, titleRightLinkMode = 'label', borderStyle, borderColor, height, terminalColumns, paddingX = 1, titleBold = true, children, }) {
|
|
18
|
+
const totalWidth = terminalColumns ?? process.stdout.columns ?? 80;
|
|
19
19
|
const titleRightText = titleRightIssueUrl && titleRightLinkMode === 'url'
|
|
20
20
|
? formatIssueReference(titleRightIssueUrl, 'url')
|
|
21
21
|
: titleRight;
|
|
@@ -1 +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,WAAW,MAAM,cAAc,CAAC;AACvC,OAAO,EACL,oBAAoB,EACpB,cAAc,GAEf,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,yBAAyB,GAE1B,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"titled-border-pane.js","sourceRoot":"","sources":["../../src/tui/titled-border-pane.tsx"],"names":[],"mappings":"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"}
|
|
@@ -34,9 +34,9 @@ export declare const OPEN_QUESTIONS_PANE_MAX_DISPLAY_LINES = 8;
|
|
|
34
34
|
/** Open questions ペインタイトルに付与する選択操作ヒント。 */
|
|
35
35
|
export declare const OPEN_QUESTIONS_SELECTION_HINT = " \u2014 Shift+\u2191\u2193\u3067\u9078\u629E";
|
|
36
36
|
/** Open questions がないときに Operator input へ表示する任意入力 prompt。 */
|
|
37
|
-
export declare const OPERATOR_INPUT_DISCRETIONARY_HINT = "\u4EFB\u610F\u306E\u30BF\u30A4\u30DF\u30F3\u30B0\u3067\u5165\u529B \u00B7 /exit \u3067\u7D42\u4E86";
|
|
37
|
+
export declare const OPERATOR_INPUT_DISCRETIONARY_HINT = "\u4EFB\u610F\u306E\u30BF\u30A4\u30DF\u30F3\u30B0\u3067\u5165\u529B \u00B7 /reconnect \u3067\u518D\u63A5\u7D9A \u00B7 /exit \u3067\u7D42\u4E86";
|
|
38
38
|
/** post-loop 待機中に Operator input へ表示する追加入力 prompt。 */
|
|
39
|
-
export declare const OPERATOR_INPUT_POST_LOOP_HINT = "\u8FFD\u52A0\u6307\u793A\u3092\u5165\u529B\u3059\u308B\u304B /exit \u3067\u7D42\u4E86";
|
|
39
|
+
export declare const OPERATOR_INPUT_POST_LOOP_HINT = "\u8FFD\u52A0\u6307\u793A\u3092\u5165\u529B\u3059\u308B\u304B /reconnect \u3067\u518D\u63A5\u7D9A \u00B7 /exit \u3067\u7D42\u4E86";
|
|
40
40
|
/** 終了処理中に Operator input へ表示する prompt。 */
|
|
41
41
|
export declare const OPERATOR_INPUT_SHUTTING_DOWN_HINT = "\u7D42\u4E86\u3057\u3066\u3044\u307E\u3059\u2026";
|
|
42
42
|
/** 入力ペインの枠線(上下)行数。`PANE_BORDER_ROWS` と同値。 */
|
|
@@ -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,2BAA2B;AAC3B,eAAO,MAAM,iBAAiB,YAAY,CAAC;AAE3C,qDAAqD;AACrD,eAAO,MAAM,yBAAyB,mBAAmB,CAAC;AAE1D,kCAAkC;AAClC,eAAO,MAAM,gBAAgB,mBAAmB,CAAC;AAEjD,kDAAkD;AAClD,eAAO,MAAM,uBAAuB,SAAS,CAAC;AAE9C,mCAAmC;AACnC,eAAO,MAAM,qBAAqB,SAAS,CAAC;AAE5C,4CAA4C;AAC5C,eAAO,MAAM,uBAAuB,SAAS,CAAC;AAE9C,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,6DAA6D;AAC7D,eAAO,MAAM,iCAAiC,
|
|
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,kDAAkD;AAClD,eAAO,MAAM,uBAAuB,SAAS,CAAC;AAE9C,mCAAmC;AACnC,eAAO,MAAM,qBAAqB,SAAS,CAAC;AAE5C,4CAA4C;AAC5C,eAAO,MAAM,uBAAuB,SAAS,CAAC;AAE9C,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,6DAA6D;AAC7D,eAAO,MAAM,iCAAiC,kJACD,CAAC;AAE9C,sDAAsD;AACtD,eAAO,MAAM,6BAA6B,qIACA,CAAC;AAE3C,0CAA0C;AAC1C,eAAO,MAAM,iCAAiC,qDAAa,CAAC;AAE5D,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"}
|
|
@@ -34,9 +34,9 @@ export const OPEN_QUESTIONS_PANE_MAX_DISPLAY_LINES = 8;
|
|
|
34
34
|
/** Open questions ペインタイトルに付与する選択操作ヒント。 */
|
|
35
35
|
export const OPEN_QUESTIONS_SELECTION_HINT = ' — Shift+↑↓で選択';
|
|
36
36
|
/** Open questions がないときに Operator input へ表示する任意入力 prompt。 */
|
|
37
|
-
export const OPERATOR_INPUT_DISCRETIONARY_HINT = '任意のタイミングで入力 · /exit で終了';
|
|
37
|
+
export const OPERATOR_INPUT_DISCRETIONARY_HINT = '任意のタイミングで入力 · /reconnect で再接続 · /exit で終了';
|
|
38
38
|
/** post-loop 待機中に Operator input へ表示する追加入力 prompt。 */
|
|
39
|
-
export const OPERATOR_INPUT_POST_LOOP_HINT = '追加指示を入力するか /exit で終了';
|
|
39
|
+
export const OPERATOR_INPUT_POST_LOOP_HINT = '追加指示を入力するか /reconnect で再接続 · /exit で終了';
|
|
40
40
|
/** 終了処理中に Operator input へ表示する prompt。 */
|
|
41
41
|
export const OPERATOR_INPUT_SHUTTING_DOWN_HINT = '終了しています…';
|
|
42
42
|
/** 入力ペインの枠線(上下)行数。`PANE_BORDER_ROWS` と同値。 */
|
|
@@ -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,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,kDAAkD;AAClD,MAAM,CAAC,MAAM,uBAAuB,GAAG,MAAM,CAAC;AAE9C,mCAAmC;AACnC,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAC;AAE5C,4CAA4C;AAC5C,MAAM,CAAC,MAAM,uBAAuB,GAAG,MAAM,CAAC;AAE9C,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,6DAA6D;AAC7D,MAAM,CAAC,MAAM,iCAAiC,
|
|
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,kDAAkD;AAClD,MAAM,CAAC,MAAM,uBAAuB,GAAG,MAAM,CAAC;AAE9C,mCAAmC;AACnC,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAC;AAE5C,4CAA4C;AAC5C,MAAM,CAAC,MAAM,uBAAuB,GAAG,MAAM,CAAC;AAE9C,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,6DAA6D;AAC7D,MAAM,CAAC,MAAM,iCAAiC,GAC5C,2CAA2C,CAAC;AAE9C,sDAAsD;AACtD,MAAM,CAAC,MAAM,6BAA6B,GACxC,wCAAwC,CAAC;AAE3C,0CAA0C;AAC1C,MAAM,CAAC,MAAM,iCAAiC,GAAG,UAAU,CAAC;AAE5D,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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export declare const TUI_RESIZE_SETTLE_MS = 100;
|
|
2
|
+
export interface TuiTerminalSize {
|
|
3
|
+
readonly columns: number;
|
|
4
|
+
readonly rows: number;
|
|
5
|
+
}
|
|
6
|
+
export interface TuiTerminalSizeStore {
|
|
7
|
+
getSnapshot: () => TuiTerminalSize;
|
|
8
|
+
subscribe: (listener: () => void) => () => void;
|
|
9
|
+
dispose: () => void;
|
|
10
|
+
}
|
|
11
|
+
type TuiResizeSource = Pick<NodeJS.WriteStream, 'columns' | 'rows' | 'on' | 'off'>;
|
|
12
|
+
export declare function readTuiTerminalSize(stdout: Pick<NodeJS.WriteStream, 'columns' | 'rows'>): TuiTerminalSize;
|
|
13
|
+
export declare function createTuiTerminalSizeStore(stdout?: TuiResizeSource, settleMs?: number, onSettled?: (size: TuiTerminalSize) => void): TuiTerminalSizeStore;
|
|
14
|
+
export interface TuiResizeController {
|
|
15
|
+
readonly stdout: NodeJS.WriteStream;
|
|
16
|
+
readonly terminalSize: TuiTerminalSizeStore;
|
|
17
|
+
dispose: () => void;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Ink listens to stdout.resize independently of React. Delay that notification
|
|
21
|
+
* until the same settled snapshot used by the TUI has been rendered, so Ink
|
|
22
|
+
* does not serialize an old-width frame between SIGWINCH bursts.
|
|
23
|
+
*
|
|
24
|
+
* Ink 7 decides whether to emit clearTerminal by comparing the previous frame
|
|
25
|
+
* height with the current viewport. On a terminal shrink, that comparison can
|
|
26
|
+
* classify the old frame as fullscreen even when it did not fill the old
|
|
27
|
+
* viewport. Keep Ink's private viewport row value at a high-water mark while
|
|
28
|
+
* the TUI uses the actual settled rows from terminalSize; this prevents the
|
|
29
|
+
* renderer's fullscreen-clear fallback from erasing scrollback on shrink.
|
|
30
|
+
*/
|
|
31
|
+
export declare function createTuiResizeController(stdout?: NodeJS.WriteStream, settleMs?: number): TuiResizeController;
|
|
32
|
+
export declare function useTuiTerminalSize(externalStore?: TuiTerminalSizeStore): TuiTerminalSize;
|
|
33
|
+
export {};
|
|
34
|
+
//# sourceMappingURL=tui-terminal-size.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui-terminal-size.d.ts","sourceRoot":"","sources":["../../src/tui/tui-terminal-size.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,oBAAoB,MAAM,CAAC;AAExC,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,eAAe,CAAC;IACnC,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAC;IAChD,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,KAAK,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,SAAS,GAAG,MAAM,GAAG,IAAI,GAAG,KAAK,CAAC,CAAC;AASnF,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,SAAS,GAAG,MAAM,CAAC,GACnD,eAAe,CAKjB;AAMD,wBAAgB,0BAA0B,CACxC,MAAM,GAAE,eAAgC,EACxC,QAAQ,GAAE,MAA6B,EACvC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,GAC1C,oBAAoB,CA4DtB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC;IACpC,QAAQ,CAAC,YAAY,EAAE,oBAAoB,CAAC;IAC5C,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,GAAE,MAAM,CAAC,WAA4B,EAC3C,QAAQ,GAAE,MAA6B,GACtC,mBAAmB,CA2ErB;AAED,wBAAgB,kBAAkB,CAChC,aAAa,CAAC,EAAE,oBAAoB,GACnC,eAAe,CAqBjB"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { useEffect, useMemo, useSyncExternalStore } from 'react';
|
|
2
|
+
export const TUI_RESIZE_SETTLE_MS = 100;
|
|
3
|
+
function resolveDimension(value, fallback) {
|
|
4
|
+
return typeof value === 'number' && Number.isFinite(value) && value > 0
|
|
5
|
+
? Math.floor(value)
|
|
6
|
+
: fallback;
|
|
7
|
+
}
|
|
8
|
+
export function readTuiTerminalSize(stdout) {
|
|
9
|
+
return {
|
|
10
|
+
columns: resolveDimension(stdout.columns, 80),
|
|
11
|
+
rows: resolveDimension(stdout.rows, 24),
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
function sameSize(left, right) {
|
|
15
|
+
return left.columns === right.columns && left.rows === right.rows;
|
|
16
|
+
}
|
|
17
|
+
export function createTuiTerminalSizeStore(stdout = process.stdout, settleMs = TUI_RESIZE_SETTLE_MS, onSettled) {
|
|
18
|
+
let snapshot = readTuiTerminalSize(stdout);
|
|
19
|
+
let settleTimer;
|
|
20
|
+
let disposed = false;
|
|
21
|
+
const subscribers = new Set();
|
|
22
|
+
const settleResize = () => {
|
|
23
|
+
settleTimer = undefined;
|
|
24
|
+
if (disposed) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const next = readTuiTerminalSize(stdout);
|
|
28
|
+
if (sameSize(snapshot, next)) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
snapshot = next;
|
|
32
|
+
for (const subscriber of [...subscribers]) {
|
|
33
|
+
subscriber();
|
|
34
|
+
}
|
|
35
|
+
onSettled?.(snapshot);
|
|
36
|
+
};
|
|
37
|
+
const onResize = () => {
|
|
38
|
+
if (disposed) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
if (settleTimer !== undefined) {
|
|
42
|
+
clearTimeout(settleTimer);
|
|
43
|
+
}
|
|
44
|
+
settleTimer = setTimeout(settleResize, Math.max(0, settleMs));
|
|
45
|
+
};
|
|
46
|
+
stdout.on('resize', onResize);
|
|
47
|
+
return {
|
|
48
|
+
getSnapshot: () => snapshot,
|
|
49
|
+
subscribe: (listener) => {
|
|
50
|
+
if (disposed) {
|
|
51
|
+
return () => { };
|
|
52
|
+
}
|
|
53
|
+
subscribers.add(listener);
|
|
54
|
+
return () => {
|
|
55
|
+
subscribers.delete(listener);
|
|
56
|
+
};
|
|
57
|
+
},
|
|
58
|
+
dispose: () => {
|
|
59
|
+
if (disposed) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
disposed = true;
|
|
63
|
+
stdout.off('resize', onResize);
|
|
64
|
+
if (settleTimer !== undefined) {
|
|
65
|
+
clearTimeout(settleTimer);
|
|
66
|
+
settleTimer = undefined;
|
|
67
|
+
}
|
|
68
|
+
subscribers.clear();
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Ink listens to stdout.resize independently of React. Delay that notification
|
|
74
|
+
* until the same settled snapshot used by the TUI has been rendered, so Ink
|
|
75
|
+
* does not serialize an old-width frame between SIGWINCH bursts.
|
|
76
|
+
*
|
|
77
|
+
* Ink 7 decides whether to emit clearTerminal by comparing the previous frame
|
|
78
|
+
* height with the current viewport. On a terminal shrink, that comparison can
|
|
79
|
+
* classify the old frame as fullscreen even when it did not fill the old
|
|
80
|
+
* viewport. Keep Ink's private viewport row value at a high-water mark while
|
|
81
|
+
* the TUI uses the actual settled rows from terminalSize; this prevents the
|
|
82
|
+
* renderer's fullscreen-clear fallback from erasing scrollback on shrink.
|
|
83
|
+
*/
|
|
84
|
+
export function createTuiResizeController(stdout = process.stdout, settleMs = TUI_RESIZE_SETTLE_MS) {
|
|
85
|
+
const resizeListeners = new Set();
|
|
86
|
+
let disposed = false;
|
|
87
|
+
let inkViewportRows = readTuiTerminalSize(stdout).rows;
|
|
88
|
+
const terminalSize = createTuiTerminalSizeStore(stdout, settleMs, (size) => {
|
|
89
|
+
if (disposed) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
inkViewportRows = Math.max(inkViewportRows, size.rows);
|
|
93
|
+
queueMicrotask(() => {
|
|
94
|
+
if (disposed) {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
for (const listener of [...resizeListeners]) {
|
|
98
|
+
listener();
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
const resizeAwareStdout = new Proxy(stdout, {
|
|
103
|
+
get(target, property, receiver) {
|
|
104
|
+
if (property === 'columns' || property === 'rows') {
|
|
105
|
+
return property === 'rows'
|
|
106
|
+
? inkViewportRows
|
|
107
|
+
: terminalSize.getSnapshot().columns;
|
|
108
|
+
}
|
|
109
|
+
if (property === 'on' || property === 'addListener') {
|
|
110
|
+
return (event, listener) => {
|
|
111
|
+
if (event === 'resize') {
|
|
112
|
+
resizeListeners.add(listener);
|
|
113
|
+
return resizeAwareStdout;
|
|
114
|
+
}
|
|
115
|
+
const method = Reflect.get(target, property, target);
|
|
116
|
+
return method.call(target, event, listener);
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
if (property === 'off' || property === 'removeListener') {
|
|
120
|
+
return (event, listener) => {
|
|
121
|
+
if (event === 'resize') {
|
|
122
|
+
resizeListeners.delete(listener);
|
|
123
|
+
return resizeAwareStdout;
|
|
124
|
+
}
|
|
125
|
+
const method = Reflect.get(target, property, target);
|
|
126
|
+
return method.call(target, event, listener);
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
const value = Reflect.get(target, property, receiver);
|
|
130
|
+
return typeof value === 'function' ? value.bind(target) : value;
|
|
131
|
+
},
|
|
132
|
+
});
|
|
133
|
+
const controller = {
|
|
134
|
+
stdout: resizeAwareStdout,
|
|
135
|
+
terminalSize,
|
|
136
|
+
dispose: () => {
|
|
137
|
+
if (disposed) {
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
disposed = true;
|
|
141
|
+
terminalSize.dispose();
|
|
142
|
+
resizeListeners.clear();
|
|
143
|
+
},
|
|
144
|
+
};
|
|
145
|
+
return controller;
|
|
146
|
+
}
|
|
147
|
+
export function useTuiTerminalSize(externalStore) {
|
|
148
|
+
const ownedStore = useMemo(() => (externalStore ? undefined : createTuiTerminalSizeStore()), [externalStore]);
|
|
149
|
+
const store = externalStore ?? ownedStore;
|
|
150
|
+
useEffect(() => {
|
|
151
|
+
if (!ownedStore) {
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
return () => {
|
|
155
|
+
ownedStore.dispose();
|
|
156
|
+
};
|
|
157
|
+
}, [ownedStore]);
|
|
158
|
+
if (!store) {
|
|
159
|
+
throw new Error('TUI terminal size store is unavailable');
|
|
160
|
+
}
|
|
161
|
+
return useSyncExternalStore(store.subscribe, store.getSnapshot, store.getSnapshot);
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=tui-terminal-size.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui-terminal-size.js","sourceRoot":"","sources":["../../src/tui/tui-terminal-size.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agents-ensemble/cli",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.5",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "ensemble CLI — Issue-based agent orchestration",
|
|
6
6
|
"bin": {
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"react": "19.2.0",
|
|
18
18
|
"react-ink-textarea": "npm:@otolab/react-ink-textarea@0.4.1-otolab.3",
|
|
19
19
|
"string-width": "8.1.0",
|
|
20
|
-
"@agents-ensemble/core": "0.6.
|
|
20
|
+
"@agents-ensemble/core": "0.6.5"
|
|
21
21
|
},
|
|
22
22
|
"devDependencies": {
|
|
23
23
|
"@types/js-yaml": "4.0.9",
|