@agents-ensemble/cli 0.6.4 → 0.7.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.
- package/README.md +36 -3
- package/config.example.yaml +13 -0
- 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/inline-markdown.d.ts +3 -1
- package/dist/inline-markdown.d.ts.map +1 -1
- package/dist/inline-markdown.js +232 -33
- package/dist/inline-markdown.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 +64 -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/activity-log.d.ts +8 -0
- package/dist/tui/activity-log.d.ts.map +1 -1
- package/dist/tui/activity-log.js +16 -0
- package/dist/tui/activity-log.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 +44 -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 +6 -1
- package/dist/tui/issue-session-tui-stream.d.ts.map +1 -1
- package/dist/tui/issue-session-tui-stream.js +55 -17
- package/dist/tui/issue-session-tui-stream.js.map +1 -1
- package/dist/tui/issue-session-tui-stream.test.js +345 -11
- package/dist/tui/issue-session-tui-stream.test.js.map +1 -1
- package/dist/tui/issue-session-tui.d.ts +11 -5
- package/dist/tui/issue-session-tui.d.ts.map +1 -1
- package/dist/tui/issue-session-tui.js +60 -30
- package/dist/tui/issue-session-tui.js.map +1 -1
- package/dist/tui/issue-session-tui.test.js +268 -30
- package/dist/tui/issue-session-tui.test.js.map +1 -1
- package/dist/tui/open-questions-pane.d.ts.map +1 -1
- package/dist/tui/open-questions-pane.js +30 -12
- package/dist/tui/open-questions-pane.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/stream-scrollback.d.ts +29 -0
- package/dist/tui/stream-scrollback.d.ts.map +1 -0
- package/dist/tui/stream-scrollback.js +35 -0
- package/dist/tui/stream-scrollback.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 +11 -6
- package/dist/tui/tui-layout-constants.d.ts.map +1 -1
- package/dist/tui/tui-layout-constants.js +11 -6
- package/dist/tui/tui-layout-constants.js.map +1 -1
- package/dist/tui/tui-resize-recovery.d.ts +24 -0
- package/dist/tui/tui-resize-recovery.d.ts.map +1 -0
- package/dist/tui/tui-resize-recovery.js +34 -0
- package/dist/tui/tui-resize-recovery.js.map +1 -0
- package/dist/tui/tui-terminal-size.d.ts +45 -0
- package/dist/tui/tui-terminal-size.d.ts.map +1 -0
- package/dist/tui/tui-terminal-size.js +195 -0
- package/dist/tui/tui-terminal-size.js.map +1 -0
- package/dist/tui/tui-view-model.d.ts +2 -0
- package/dist/tui/tui-view-model.d.ts.map +1 -1
- package/dist/tui/tui-view-model.js +7 -0
- package/dist/tui/tui-view-model.js.map +1 -1
- package/dist/tui/wrap-text-to-width.d.ts.map +1 -1
- package/dist/tui/wrap-text-to-width.js +4 -1
- package/dist/tui/wrap-text-to-width.js.map +1 -1
- package/docs/config.md +67 -3
- package/docs/settings.md +17 -4
- package/package.json +2 -2
|
@@ -27,16 +27,21 @@ export const WORKER_PANE_HEIGHT = 6;
|
|
|
27
27
|
* 未回答 0 件時や本文が短いときの下限。
|
|
28
28
|
*/
|
|
29
29
|
export const OPEN_QUESTIONS_PANE_MIN_HEIGHT = 3;
|
|
30
|
-
/**
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
30
|
+
/**
|
|
31
|
+
* Open questions ペイン本文の表示行数上限(端末行数に対する比率)。
|
|
32
|
+
*
|
|
33
|
+
* 選択中 question の折り返し行と非選択 question の compact 行を
|
|
34
|
+
* 80x24 程度の端末で同時に表示できるよう、従来の 35% から引き上げる。
|
|
35
|
+
*/
|
|
36
|
+
export const OPEN_QUESTIONS_PANE_MAX_HEIGHT_RATIO = 0.6;
|
|
37
|
+
/** Open questions ペイン本文の表示行数の絶対上限(通常端末の本文行数に合わせる)。 */
|
|
38
|
+
export const OPEN_QUESTIONS_PANE_MAX_DISPLAY_LINES = 14;
|
|
34
39
|
/** Open questions ペインタイトルに付与する選択操作ヒント。 */
|
|
35
40
|
export const OPEN_QUESTIONS_SELECTION_HINT = ' — Shift+↑↓で選択';
|
|
36
41
|
/** Open questions がないときに Operator input へ表示する任意入力 prompt。 */
|
|
37
|
-
export const OPERATOR_INPUT_DISCRETIONARY_HINT = '任意のタイミングで入力 · /exit で終了';
|
|
42
|
+
export const OPERATOR_INPUT_DISCRETIONARY_HINT = '任意のタイミングで入力 · /reconnect で再接続 · /exit で終了';
|
|
38
43
|
/** post-loop 待機中に Operator input へ表示する追加入力 prompt。 */
|
|
39
|
-
export const OPERATOR_INPUT_POST_LOOP_HINT = '追加指示を入力するか /exit で終了';
|
|
44
|
+
export const OPERATOR_INPUT_POST_LOOP_HINT = '追加指示を入力するか /reconnect で再接続 · /exit で終了';
|
|
40
45
|
/** 終了処理中に Operator input へ表示する prompt。 */
|
|
41
46
|
export const OPERATOR_INPUT_SHUTTING_DOWN_HINT = '終了しています…';
|
|
42
47
|
/** 入力ペインの枠線(上下)行数。`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
|
|
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;;;;;GAKG;AACH,MAAM,CAAC,MAAM,oCAAoC,GAAG,GAAG,CAAC;AAExD,sDAAsD;AACtD,MAAM,CAAC,MAAM,qCAAqC,GAAG,EAAE,CAAC;AAExD,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,24 @@
|
|
|
1
|
+
import type { TuiResizeSettledEvent } from './tui-terminal-size.js';
|
|
2
|
+
/**
|
|
3
|
+
* Reset the primary screen and its scrollback before Ink renders a settled
|
|
4
|
+
* shrink. The activity log is replayed from the in-memory view model after
|
|
5
|
+
* this sequence.
|
|
6
|
+
*
|
|
7
|
+
* Ink's logical line-count erasure cannot recover rows that the terminal
|
|
8
|
+
* reflowed into scrollback. The stream layout opts into this recovery because
|
|
9
|
+
* it retains the complete activity log; pane mode keeps its bounded-window
|
|
10
|
+
* policy.
|
|
11
|
+
*/
|
|
12
|
+
export declare const TUI_FULL_REDRAW_SEQUENCE = "\u001B[3J\u001B[2J\u001B[H";
|
|
13
|
+
export interface TuiResizeRecoveryOptions {
|
|
14
|
+
enabled?: boolean;
|
|
15
|
+
clearInk: () => void;
|
|
16
|
+
write: (data: string) => void;
|
|
17
|
+
requestActivityLogReplay: () => void;
|
|
18
|
+
}
|
|
19
|
+
export interface TuiResizeRecovery {
|
|
20
|
+
recover: (event: TuiResizeSettledEvent) => boolean;
|
|
21
|
+
dispose: () => void;
|
|
22
|
+
}
|
|
23
|
+
export declare function createTuiResizeRecovery(options: TuiResizeRecoveryOptions): TuiResizeRecovery;
|
|
24
|
+
//# sourceMappingURL=tui-resize-recovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui-resize-recovery.d.ts","sourceRoot":"","sources":["../../src/tui/tui-resize-recovery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAEpE;;;;;;;;;GASG;AACH,eAAO,MAAM,wBAAwB,+BAA+B,CAAC;AAErE,MAAM,WAAW,wBAAwB;IACvC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,wBAAwB,EAAE,MAAM,IAAI,CAAC;CACtC;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,OAAO,CAAC;IACnD,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,wBAAwB,GAChC,iBAAiB,CAyBnB"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reset the primary screen and its scrollback before Ink renders a settled
|
|
3
|
+
* shrink. The activity log is replayed from the in-memory view model after
|
|
4
|
+
* this sequence.
|
|
5
|
+
*
|
|
6
|
+
* Ink's logical line-count erasure cannot recover rows that the terminal
|
|
7
|
+
* reflowed into scrollback. The stream layout opts into this recovery because
|
|
8
|
+
* it retains the complete activity log; pane mode keeps its bounded-window
|
|
9
|
+
* policy.
|
|
10
|
+
*/
|
|
11
|
+
export const TUI_FULL_REDRAW_SEQUENCE = '\u001b[3J\u001b[2J\u001b[H';
|
|
12
|
+
export function createTuiResizeRecovery(options) {
|
|
13
|
+
let disposed = false;
|
|
14
|
+
const enabled = options.enabled ?? true;
|
|
15
|
+
return {
|
|
16
|
+
recover(event) {
|
|
17
|
+
if (disposed ||
|
|
18
|
+
!enabled ||
|
|
19
|
+
event.next.columns >= event.previous.columns) {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
// Reset Ink's logical frame first. The terminal reset below then removes
|
|
23
|
+
// physical rows that Ink could not count after terminal reflow.
|
|
24
|
+
options.clearInk();
|
|
25
|
+
options.write(TUI_FULL_REDRAW_SEQUENCE);
|
|
26
|
+
options.requestActivityLogReplay();
|
|
27
|
+
return true;
|
|
28
|
+
},
|
|
29
|
+
dispose() {
|
|
30
|
+
disposed = true;
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=tui-resize-recovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui-resize-recovery.js","sourceRoot":"","sources":["../../src/tui/tui-resize-recovery.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,4BAA4B,CAAC;AAcrE,MAAM,UAAU,uBAAuB,CACrC,OAAiC;IAEjC,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC;IAExC,OAAO;QACL,OAAO,CAAC,KAAK;YACX,IACE,QAAQ;gBACR,CAAC,OAAO;gBACR,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,EAC5C,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC;YAED,yEAAyE;YACzE,gEAAgE;YAChE,OAAO,CAAC,QAAQ,EAAE,CAAC;YACnB,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;YACxC,OAAO,CAAC,wBAAwB,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO;YACL,QAAQ,GAAG,IAAI,CAAC;QAClB,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export declare const TUI_RESIZE_SETTLE_MS = 100;
|
|
2
|
+
/**
|
|
3
|
+
* iTerm2 + tmux can emit separate SIGWINCH events while a pane is being
|
|
4
|
+
* dragged. Keep width decreases pending for longer than the normal settle
|
|
5
|
+
* window so those intermediate widths do not trigger a live-frame redraw.
|
|
6
|
+
*/
|
|
7
|
+
export declare const TUI_RESIZE_SHRINK_COALESCE_MS = 250;
|
|
8
|
+
export interface TuiTerminalSize {
|
|
9
|
+
readonly columns: number;
|
|
10
|
+
readonly rows: number;
|
|
11
|
+
}
|
|
12
|
+
export interface TuiResizeSettledEvent {
|
|
13
|
+
readonly previous: TuiTerminalSize;
|
|
14
|
+
readonly next: TuiTerminalSize;
|
|
15
|
+
}
|
|
16
|
+
export interface TuiTerminalSizeStore {
|
|
17
|
+
getSnapshot: () => TuiTerminalSize;
|
|
18
|
+
subscribe: (listener: () => void) => () => void;
|
|
19
|
+
dispose: () => void;
|
|
20
|
+
}
|
|
21
|
+
type TuiResizeSource = Pick<NodeJS.WriteStream, 'columns' | 'rows' | 'on' | 'off'>;
|
|
22
|
+
export declare function readTuiTerminalSize(stdout: Pick<NodeJS.WriteStream, 'columns' | 'rows'>): TuiTerminalSize;
|
|
23
|
+
export declare function createTuiTerminalSizeStore(stdout?: TuiResizeSource, settleMs?: number, onSettled?: (size: TuiTerminalSize) => void, shrinkCoalesceMs?: number): TuiTerminalSizeStore;
|
|
24
|
+
export interface TuiResizeController {
|
|
25
|
+
readonly stdout: NodeJS.WriteStream;
|
|
26
|
+
readonly terminalSize: TuiTerminalSizeStore;
|
|
27
|
+
dispose: () => void;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Ink listens to stdout.resize independently of React. Delay that notification
|
|
31
|
+
* until the same settled snapshot used by the TUI has been rendered, so Ink
|
|
32
|
+
* does not serialize an old-width frame between SIGWINCH bursts.
|
|
33
|
+
*
|
|
34
|
+
* Ink 7 decides whether to emit clearTerminal by comparing the previous frame
|
|
35
|
+
* height with the current viewport. On a terminal shrink, that comparison can
|
|
36
|
+
* classify the old frame as fullscreen even when it did not fill the old
|
|
37
|
+
* viewport. Keep Ink's private viewport columns and rows at high-water marks
|
|
38
|
+
* while the TUI uses the actual settled size from terminalSize; this prevents
|
|
39
|
+
* the renderer's fullscreen-clear fallback and width-decrease handling from
|
|
40
|
+
* erasing scrollback on shrink.
|
|
41
|
+
*/
|
|
42
|
+
export declare function createTuiResizeController(stdout?: NodeJS.WriteStream, settleMs?: number, onSettled?: (event: TuiResizeSettledEvent) => void): TuiResizeController;
|
|
43
|
+
export declare function useTuiTerminalSize(externalStore?: TuiTerminalSizeStore): TuiTerminalSize;
|
|
44
|
+
export {};
|
|
45
|
+
//# 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;;;;GAIG;AACH,eAAO,MAAM,6BAA6B,MAAM,CAAC;AAEjD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;CAChC;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,EAC3C,gBAAgB,GAAE,MAAsC,GACvD,oBAAoB,CAkFtB;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;;;;;;;;;;;;GAYG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,GAAE,MAAM,CAAC,WAA4B,EAC3C,QAAQ,GAAE,MAA6B,EACvC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,IAAI,GACjD,mBAAmB,CAsFrB;AAED,wBAAgB,kBAAkB,CAChC,aAAa,CAAC,EAAE,oBAAoB,GACnC,eAAe,CAqBjB"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { useEffect, useMemo, useSyncExternalStore } from 'react';
|
|
2
|
+
export const TUI_RESIZE_SETTLE_MS = 100;
|
|
3
|
+
/**
|
|
4
|
+
* iTerm2 + tmux can emit separate SIGWINCH events while a pane is being
|
|
5
|
+
* dragged. Keep width decreases pending for longer than the normal settle
|
|
6
|
+
* window so those intermediate widths do not trigger a live-frame redraw.
|
|
7
|
+
*/
|
|
8
|
+
export const TUI_RESIZE_SHRINK_COALESCE_MS = 250;
|
|
9
|
+
function resolveDimension(value, fallback) {
|
|
10
|
+
return typeof value === 'number' && Number.isFinite(value) && value > 0
|
|
11
|
+
? Math.floor(value)
|
|
12
|
+
: fallback;
|
|
13
|
+
}
|
|
14
|
+
export function readTuiTerminalSize(stdout) {
|
|
15
|
+
return {
|
|
16
|
+
columns: resolveDimension(stdout.columns, 80),
|
|
17
|
+
rows: resolveDimension(stdout.rows, 24),
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function sameSize(left, right) {
|
|
21
|
+
return left.columns === right.columns && left.rows === right.rows;
|
|
22
|
+
}
|
|
23
|
+
export function createTuiTerminalSizeStore(stdout = process.stdout, settleMs = TUI_RESIZE_SETTLE_MS, onSettled, shrinkCoalesceMs = TUI_RESIZE_SHRINK_COALESCE_MS) {
|
|
24
|
+
let snapshot = readTuiTerminalSize(stdout);
|
|
25
|
+
let observedSize = snapshot;
|
|
26
|
+
let settleTimer;
|
|
27
|
+
let settleMode = 'normal';
|
|
28
|
+
let disposed = false;
|
|
29
|
+
const subscribers = new Set();
|
|
30
|
+
const settleResize = () => {
|
|
31
|
+
settleTimer = undefined;
|
|
32
|
+
if (disposed) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const next = readTuiTerminalSize(stdout);
|
|
36
|
+
if (sameSize(snapshot, next)) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
snapshot = next;
|
|
40
|
+
onSettled?.(snapshot);
|
|
41
|
+
for (const subscriber of [...subscribers]) {
|
|
42
|
+
subscriber();
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
const onResize = () => {
|
|
46
|
+
if (disposed) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const next = readTuiTerminalSize(stdout);
|
|
50
|
+
const columnsIncreased = next.columns > observedSize.columns;
|
|
51
|
+
const rowsChanged = next.rows !== observedSize.rows;
|
|
52
|
+
const continuingShrink = settleMode === 'shrink' &&
|
|
53
|
+
next.columns === observedSize.columns &&
|
|
54
|
+
next.rows === snapshot.rows &&
|
|
55
|
+
next.columns < snapshot.columns;
|
|
56
|
+
const columnsDecreased = !rowsChanged &&
|
|
57
|
+
!columnsIncreased &&
|
|
58
|
+
(next.columns < observedSize.columns || continuingShrink);
|
|
59
|
+
observedSize = next;
|
|
60
|
+
settleMode = columnsDecreased ? 'shrink' : 'normal';
|
|
61
|
+
if (settleTimer !== undefined) {
|
|
62
|
+
clearTimeout(settleTimer);
|
|
63
|
+
}
|
|
64
|
+
settleTimer = setTimeout(settleResize, Math.max(0, columnsDecreased ? Math.max(settleMs, shrinkCoalesceMs) : settleMs));
|
|
65
|
+
};
|
|
66
|
+
stdout.on('resize', onResize);
|
|
67
|
+
return {
|
|
68
|
+
getSnapshot: () => snapshot,
|
|
69
|
+
subscribe: (listener) => {
|
|
70
|
+
if (disposed) {
|
|
71
|
+
return () => { };
|
|
72
|
+
}
|
|
73
|
+
subscribers.add(listener);
|
|
74
|
+
return () => {
|
|
75
|
+
subscribers.delete(listener);
|
|
76
|
+
};
|
|
77
|
+
},
|
|
78
|
+
dispose: () => {
|
|
79
|
+
if (disposed) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
disposed = true;
|
|
83
|
+
stdout.off('resize', onResize);
|
|
84
|
+
if (settleTimer !== undefined) {
|
|
85
|
+
clearTimeout(settleTimer);
|
|
86
|
+
settleTimer = undefined;
|
|
87
|
+
}
|
|
88
|
+
subscribers.clear();
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Ink listens to stdout.resize independently of React. Delay that notification
|
|
94
|
+
* until the same settled snapshot used by the TUI has been rendered, so Ink
|
|
95
|
+
* does not serialize an old-width frame between SIGWINCH bursts.
|
|
96
|
+
*
|
|
97
|
+
* Ink 7 decides whether to emit clearTerminal by comparing the previous frame
|
|
98
|
+
* height with the current viewport. On a terminal shrink, that comparison can
|
|
99
|
+
* classify the old frame as fullscreen even when it did not fill the old
|
|
100
|
+
* viewport. Keep Ink's private viewport columns and rows at high-water marks
|
|
101
|
+
* while the TUI uses the actual settled size from terminalSize; this prevents
|
|
102
|
+
* the renderer's fullscreen-clear fallback and width-decrease handling from
|
|
103
|
+
* erasing scrollback on shrink.
|
|
104
|
+
*/
|
|
105
|
+
export function createTuiResizeController(stdout = process.stdout, settleMs = TUI_RESIZE_SETTLE_MS, onSettled) {
|
|
106
|
+
const resizeListeners = new Set();
|
|
107
|
+
let disposed = false;
|
|
108
|
+
let inkViewportColumns = readTuiTerminalSize(stdout).columns;
|
|
109
|
+
let inkViewportRows = readTuiTerminalSize(stdout).rows;
|
|
110
|
+
let settledSize = readTuiTerminalSize(stdout);
|
|
111
|
+
const terminalSize = createTuiTerminalSizeStore(stdout, settleMs, (size) => {
|
|
112
|
+
if (disposed) {
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
const previous = settledSize;
|
|
116
|
+
settledSize = size;
|
|
117
|
+
// Keep Ink's width at a high-water mark while the TUI uses the settled
|
|
118
|
+
// physical width. Ink's width-decrease handler clears its previous frame;
|
|
119
|
+
// when that frame already wrapped at the new terminal width, its logical
|
|
120
|
+
// line count can be smaller than the physical line count and push output
|
|
121
|
+
// into scrollback. Grow events still raise the mark and notify Ink.
|
|
122
|
+
inkViewportColumns = Math.max(inkViewportColumns, size.columns);
|
|
123
|
+
inkViewportRows = Math.max(inkViewportRows, size.rows);
|
|
124
|
+
onSettled?.({ previous, next: size });
|
|
125
|
+
queueMicrotask(() => {
|
|
126
|
+
if (disposed) {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
for (const listener of [...resizeListeners]) {
|
|
130
|
+
listener();
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
const resizeAwareStdout = new Proxy(stdout, {
|
|
135
|
+
get(target, property, receiver) {
|
|
136
|
+
if (property === 'columns' || property === 'rows') {
|
|
137
|
+
return property === 'rows'
|
|
138
|
+
? inkViewportRows
|
|
139
|
+
: inkViewportColumns;
|
|
140
|
+
}
|
|
141
|
+
if (property === 'on' || property === 'addListener') {
|
|
142
|
+
return (event, listener) => {
|
|
143
|
+
if (event === 'resize') {
|
|
144
|
+
resizeListeners.add(listener);
|
|
145
|
+
return resizeAwareStdout;
|
|
146
|
+
}
|
|
147
|
+
const method = Reflect.get(target, property, target);
|
|
148
|
+
return method.call(target, event, listener);
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
if (property === 'off' || property === 'removeListener') {
|
|
152
|
+
return (event, listener) => {
|
|
153
|
+
if (event === 'resize') {
|
|
154
|
+
resizeListeners.delete(listener);
|
|
155
|
+
return resizeAwareStdout;
|
|
156
|
+
}
|
|
157
|
+
const method = Reflect.get(target, property, target);
|
|
158
|
+
return method.call(target, event, listener);
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
const value = Reflect.get(target, property, receiver);
|
|
162
|
+
return typeof value === 'function' ? value.bind(target) : value;
|
|
163
|
+
},
|
|
164
|
+
});
|
|
165
|
+
const controller = {
|
|
166
|
+
stdout: resizeAwareStdout,
|
|
167
|
+
terminalSize,
|
|
168
|
+
dispose: () => {
|
|
169
|
+
if (disposed) {
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
disposed = true;
|
|
173
|
+
terminalSize.dispose();
|
|
174
|
+
resizeListeners.clear();
|
|
175
|
+
},
|
|
176
|
+
};
|
|
177
|
+
return controller;
|
|
178
|
+
}
|
|
179
|
+
export function useTuiTerminalSize(externalStore) {
|
|
180
|
+
const ownedStore = useMemo(() => (externalStore ? undefined : createTuiTerminalSizeStore()), [externalStore]);
|
|
181
|
+
const store = externalStore ?? ownedStore;
|
|
182
|
+
useEffect(() => {
|
|
183
|
+
if (!ownedStore) {
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
return () => {
|
|
187
|
+
ownedStore.dispose();
|
|
188
|
+
};
|
|
189
|
+
}, [ownedStore]);
|
|
190
|
+
if (!store) {
|
|
191
|
+
throw new Error('TUI terminal size store is unavailable');
|
|
192
|
+
}
|
|
193
|
+
return useSyncExternalStore(store.subscribe, store.getSnapshot, store.getSnapshot);
|
|
194
|
+
}
|
|
195
|
+
//# 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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"}
|
|
@@ -4,6 +4,7 @@ import { type ActivityLogEntry, type ActivityLogLabel } from './activity-log.js'
|
|
|
4
4
|
export interface TuiViewSnapshot {
|
|
5
5
|
displayState: SessionDisplayState;
|
|
6
6
|
activityLog: ActivityLogEntry[];
|
|
7
|
+
activityLogGeneration: number;
|
|
7
8
|
postLoopWaiting: boolean;
|
|
8
9
|
shuttingDown: boolean;
|
|
9
10
|
operatorContext: OperatorInputContext | undefined;
|
|
@@ -22,6 +23,7 @@ export interface TuiViewModel {
|
|
|
22
23
|
setDisplayState: (state: SessionDisplayState) => void;
|
|
23
24
|
appendActivityLog: (label: ActivityLogLabel, text: string) => void;
|
|
24
25
|
appendActivityLogSeparator: () => void;
|
|
26
|
+
requestActivityLogReplay: () => void;
|
|
25
27
|
setPostLoopWaiting: (waiting: boolean) => void;
|
|
26
28
|
setShuttingDown: (shuttingDown: boolean) => void;
|
|
27
29
|
setOperatorContext: (context: OperatorInputContext | undefined) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tui-view-model.d.ts","sourceRoot":"","sources":["../../src/tui/tui-view-model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAE/E,OAAO,EAGL,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACtB,MAAM,mBAAmB,CAAC;AAG3B,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,mBAAmB,CAAC;IAClC,WAAW,EAAE,gBAAgB,EAAE,CAAC;IAChC,eAAe,EAAE,OAAO,CAAC;IACzB,YAAY,EAAE,OAAO,CAAC;IACtB,eAAe,EAAE,oBAAoB,GAAG,SAAS,CAAC;CACnD;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,eAAe,GACxB,eAAe,CAAC,cAAc,CAAC,CAAC,eAAe,CAAC,CAElD;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAC;IAChD,WAAW,EAAE,MAAM,eAAe,CAAC;IACnC,eAAe,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACtD,iBAAiB,EAAE,CAAC,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACnE,0BAA0B,EAAE,MAAM,IAAI,CAAC;IACvC,kBAAkB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/C,eAAe,EAAE,CAAC,YAAY,EAAE,OAAO,KAAK,IAAI,CAAC;IACjD,kBAAkB,EAAE,CAAC,OAAO,EAAE,oBAAoB,GAAG,SAAS,KAAK,IAAI,CAAC;CACzE;AAED,wBAAgB,kBAAkB,CAAC,OAAO,GAAE;IAC1C,6EAA6E;IAC7E,qBAAqB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC,GAAG,YAAY,
|
|
1
|
+
{"version":3,"file":"tui-view-model.d.ts","sourceRoot":"","sources":["../../src/tui/tui-view-model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAE/E,OAAO,EAGL,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACtB,MAAM,mBAAmB,CAAC;AAG3B,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,mBAAmB,CAAC;IAClC,WAAW,EAAE,gBAAgB,EAAE,CAAC;IAChC,qBAAqB,EAAE,MAAM,CAAC;IAC9B,eAAe,EAAE,OAAO,CAAC;IACzB,YAAY,EAAE,OAAO,CAAC;IACtB,eAAe,EAAE,oBAAoB,GAAG,SAAS,CAAC;CACnD;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,eAAe,GACxB,eAAe,CAAC,cAAc,CAAC,CAAC,eAAe,CAAC,CAElD;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAC;IAChD,WAAW,EAAE,MAAM,eAAe,CAAC;IACnC,eAAe,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACtD,iBAAiB,EAAE,CAAC,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACnE,0BAA0B,EAAE,MAAM,IAAI,CAAC;IACvC,wBAAwB,EAAE,MAAM,IAAI,CAAC;IACrC,kBAAkB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/C,eAAe,EAAE,CAAC,YAAY,EAAE,OAAO,KAAK,IAAI,CAAC;IACjD,kBAAkB,EAAE,CAAC,OAAO,EAAE,oBAAoB,GAAG,SAAS,KAAK,IAAI,CAAC;CACzE;AAED,wBAAgB,kBAAkB,CAAC,OAAO,GAAE;IAC1C,6EAA6E;IAC7E,qBAAqB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC,GAAG,YAAY,CAgGpB"}
|
|
@@ -17,12 +17,14 @@ export function createTuiViewModel(options = {}) {
|
|
|
17
17
|
: options.activityLogWindowSize;
|
|
18
18
|
let displayState = INITIAL_SESSION_DISPLAY_STATE;
|
|
19
19
|
let activityLog = [];
|
|
20
|
+
let activityLogGeneration = 0;
|
|
20
21
|
let postLoopWaiting = false;
|
|
21
22
|
let shuttingDown = false;
|
|
22
23
|
let operatorContext;
|
|
23
24
|
let snapshot = {
|
|
24
25
|
displayState,
|
|
25
26
|
activityLog,
|
|
27
|
+
activityLogGeneration,
|
|
26
28
|
postLoopWaiting,
|
|
27
29
|
shuttingDown,
|
|
28
30
|
operatorContext,
|
|
@@ -32,6 +34,7 @@ export function createTuiViewModel(options = {}) {
|
|
|
32
34
|
snapshot = {
|
|
33
35
|
displayState,
|
|
34
36
|
activityLog,
|
|
37
|
+
activityLogGeneration,
|
|
35
38
|
postLoopWaiting,
|
|
36
39
|
shuttingDown,
|
|
37
40
|
operatorContext,
|
|
@@ -77,6 +80,10 @@ export function createTuiViewModel(options = {}) {
|
|
|
77
80
|
: appendActivityLogEntry(activityLog, entry, activityLogWindowSize);
|
|
78
81
|
notify();
|
|
79
82
|
},
|
|
83
|
+
requestActivityLogReplay() {
|
|
84
|
+
activityLogGeneration += 1;
|
|
85
|
+
notify();
|
|
86
|
+
},
|
|
80
87
|
setPostLoopWaiting(waiting) {
|
|
81
88
|
if (postLoopWaiting === waiting) {
|
|
82
89
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tui-view-model.js","sourceRoot":"","sources":["../../src/tui/tui-view-model.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,6BAA6B,EAAE,MAAM,qCAAqC,CAAC;AACpF,OAAO,EACL,wBAAwB,EACxB,sBAAsB,GAGvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"tui-view-model.js","sourceRoot":"","sources":["../../src/tui/tui-view-model.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wrap-text-to-width.d.ts","sourceRoot":"","sources":["../../src/tui/wrap-text-to-width.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,kBAAkB,EAClB,qBAAqB,EACtB,MAAM,uBAAuB,CAAC;AAE/B,uCAAuC;AACvC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GAAG,MAAM,CAIT;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAmBrE;AAED,yDAAyD;AACzD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAwBtE;
|
|
1
|
+
{"version":3,"file":"wrap-text-to-width.d.ts","sourceRoot":"","sources":["../../src/tui/wrap-text-to-width.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,kBAAkB,EAClB,qBAAqB,EACtB,MAAM,uBAAuB,CAAC;AAE/B,uCAAuC;AACvC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GAAG,MAAM,CAIT;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAmBrE;AAED,yDAAyD;AACzD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAwBtE;AAwID;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,qBAAqB,EAAE,EACjC,KAAK,EAAE,MAAM,GACZ,kBAAkB,EAAE,CAQtB"}
|
|
@@ -59,7 +59,8 @@ function appendStyledSegment(segments, text, character) {
|
|
|
59
59
|
const previous = segments.at(-1);
|
|
60
60
|
if (previous &&
|
|
61
61
|
Boolean(previous.bold) === Boolean(character.bold) &&
|
|
62
|
-
Boolean(previous.code) === Boolean(character.code)
|
|
62
|
+
Boolean(previous.code) === Boolean(character.code) &&
|
|
63
|
+
previous.href === character.href) {
|
|
63
64
|
previous.text += text;
|
|
64
65
|
return;
|
|
65
66
|
}
|
|
@@ -67,6 +68,7 @@ function appendStyledSegment(segments, text, character) {
|
|
|
67
68
|
text,
|
|
68
69
|
...(character.bold ? { bold: true } : {}),
|
|
69
70
|
...(character.code ? { code: true } : {}),
|
|
71
|
+
...(character.href !== undefined ? { href: character.href } : {}),
|
|
70
72
|
});
|
|
71
73
|
}
|
|
72
74
|
function styledCharactersToSegments(characters) {
|
|
@@ -89,6 +91,7 @@ function toStyledCharacterLines(segments) {
|
|
|
89
91
|
width: stringWidth(character),
|
|
90
92
|
...(segment.bold ? { bold: true } : {}),
|
|
91
93
|
...(segment.code ? { code: true } : {}),
|
|
94
|
+
...(segment.href !== undefined ? { href: segment.href } : {}),
|
|
92
95
|
});
|
|
93
96
|
}
|
|
94
97
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wrap-text-to-width.js","sourceRoot":"","sources":["../../src/tui/wrap-text-to-width.ts"],"names":[],"mappings":"AAAA,OAAO,WAAW,MAAM,cAAc,CAAC;AAMvC,uCAAuC;AACvC,MAAM,UAAU,mBAAmB,CAAC,OAInC;IACC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC;IACvC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC;IAC7C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,OAAO,GAAG,WAAW,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC;AACnE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,KAAa;IACzD,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACd,OAAO,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;IACD,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;QAChB,OAAO,CAAC,EAAE,CAAC,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,IAAI,SAAS,GAAG,SAAS,CAAC;QAC1B,OAAO,WAAW,CAAC,SAAS,CAAC,GAAG,KAAK,EAAE,CAAC;YACtC,MAAM,OAAO,GAAG,kBAAkB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YACrD,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;YACxC,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC;QACnD,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACxB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,KAAa;IAC5D,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QAClD,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC;YAC/C,OAAO,GAAG,KAAK,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,MAAM;QACR,CAAC;IACH,CAAC;IAED,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;QAClB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACrC,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,SAAS,GAAG,CAAC,IAAI,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC;QACrE,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;
|
|
1
|
+
{"version":3,"file":"wrap-text-to-width.js","sourceRoot":"","sources":["../../src/tui/wrap-text-to-width.ts"],"names":[],"mappings":"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"}
|
package/docs/config.md
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
> **正本:** `.ensemble/config.yaml` の配置・書き方・スキーマと conductor MCP 設定。本書以外の設定層の一覧・解決パターンは [settings.md](settings.md) を参照します。
|
|
4
4
|
|
|
5
|
-
`.ensemble/config.yaml` は harness 横断の設定の正本。team-profile(`profile.yaml`)や conductor
|
|
5
|
+
`.ensemble/config.yaml` は harness 横断の設定の正本。team-profile(`profile.yaml`)や conductor backend の認証とは別系統。
|
|
6
6
|
|
|
7
|
-
conductor
|
|
7
|
+
conductor に渡す MCP 設定もこの config.yaml とは別の JSON ファイルで管理する(下記の [Conductor MCP 設定](#conductor-mcp-設定mcpjson) を参照)。
|
|
8
8
|
|
|
9
9
|
## 配置と解決順
|
|
10
10
|
|
|
@@ -27,6 +27,8 @@ CLI 明示指定 > 環境変数 > project .ensemble/config.yaml > user ~/.ensemb
|
|
|
27
27
|
|
|
28
28
|
`loadEnsembleConfig(repoRoot)` は user → project の順で merge した `EnsembleConfig` を返す。各 `resolve*Setting` はその merged config を **config 層**として参照する。
|
|
29
29
|
|
|
30
|
+
`conductor.backend` はこの共通順序の例外です。CLI / 環境変数による上書きはなく、選択した profile の `profile.conductor.backend` > user / project の deep merge 済み `config.conductor.backend` > `cursor` の順で解決します。
|
|
31
|
+
|
|
30
32
|
`ensemble issue` 起動時(GitHub monitor / Issue コンテキスト取得より前)に config を読み込む。
|
|
31
33
|
|
|
32
34
|
## テンプレート
|
|
@@ -48,7 +50,12 @@ profile:
|
|
|
48
50
|
default: implementer-and-reviewer # ENSEMBLE_DEFAULT_PROFILE 相当
|
|
49
51
|
|
|
50
52
|
conductor:
|
|
53
|
+
backend: pi # cursor(既定) | pi
|
|
51
54
|
model: default # CONDUCTOR_MODEL_ID 相当
|
|
55
|
+
pi:
|
|
56
|
+
# 任意。省略時は ~/.ensemble/pi と <repoRoot>/.ensemble/pi
|
|
57
|
+
agentDir: ~/.ensemble/pi
|
|
58
|
+
projectDir: .ensemble/pi
|
|
52
59
|
|
|
53
60
|
acp:
|
|
54
61
|
defaultPreset: cursor # ENSEMBLE_DEFAULT_ACP_CLI 相当
|
|
@@ -82,6 +89,9 @@ tui:
|
|
|
82
89
|
|------|------|-----------|-----------|
|
|
83
90
|
| `profile.default` | 既定 team profile(名前またはパス) | `--profile` | `ENSEMBLE_DEFAULT_PROFILE` |
|
|
84
91
|
| `conductor.model` | conductor モデル id | `--model` | `CONDUCTOR_MODEL_ID` |
|
|
92
|
+
| `conductor.backend` | conductor LLM backend(`cursor` / `pi`) | — | — |
|
|
93
|
+
| `conductor.pi.agentDir` | Pi user resource root のパス上書き | — | — |
|
|
94
|
+
| `conductor.pi.projectDir` | Pi project resource root のパス上書き | — | — |
|
|
85
95
|
| `acp.defaultPreset` | worker ACP built-in preset | `--default-acp-cli` 等 | `ENSEMBLE_DEFAULT_ACP_CLI` |
|
|
86
96
|
| `session.worktree` | worker workspace モード | `--worktree` | — |
|
|
87
97
|
| `session.maxTurns.tty` / `nonTty` | 自律ターン上限 | `--max-turns` / `--no-max-turns` | — |
|
|
@@ -95,6 +105,56 @@ tui:
|
|
|
95
105
|
|
|
96
106
|
profile / worker に `acp` がある worker は `--default-acp-*` / config `acp.defaultPreset` より **profile 側が優先**(従来どおり)。
|
|
97
107
|
|
|
108
|
+
### Pi resource root
|
|
109
|
+
|
|
110
|
+
`conductor.backend: pi` のとき、Pi の標準ファイル名・ディレクトリを次の 2 層から解決します。プロジェクト層がユーザ層を上書きします。
|
|
111
|
+
|
|
112
|
+
| 層 | 既定パス |
|
|
113
|
+
|----|----------|
|
|
114
|
+
| ユーザ | `~/.ensemble/pi/` |
|
|
115
|
+
| プロジェクト | `<repoRoot>/.ensemble/pi/` |
|
|
116
|
+
|
|
117
|
+
`conductor.pi.agentDir` / `conductor.pi.projectDir` は resource root のパスだけを上書きします。相対パスは `<repoRoot>` 基準、`~` はユーザ home 基準です。各 root の Pi 標準 resource を次のように解決します。
|
|
118
|
+
|
|
119
|
+
- `settings.json` / `auth.json`: user → project の deep merge。credential は provider 単位で project entry を優先します。
|
|
120
|
+
- `models.json`: Pi 標準の `providers` / `models` / built-in `modelOverrides` / request headers を model 解決へ反映します。
|
|
121
|
+
- `extensions/`: ExtensionAPI の tool を読み込み、fixed harness tools → MCP bridge → local extension の順で追加します。同名の harness/MCP tool は上書きしません。
|
|
122
|
+
- `skills/`: `SKILL.md` を読み込み、model invocation が有効な skill 本文を compiled system prompt の後ろに追加します。`/skill:<name>` で明示的に展開できます。
|
|
123
|
+
- `prompts/`: Markdown template を読み込み、`/name args` の user prompt を Pi 標準の引数置換で展開します。
|
|
124
|
+
- `themes/`: Pi 標準 JSON として読み込み、project 同名を優先します。conductor は headless `pi-agent-core` のため TUI renderer がなく、theme の色・表示設定はモデル入出力には適用しません。
|
|
125
|
+
|
|
126
|
+
#### `settings.json` の headless 対応範囲
|
|
127
|
+
|
|
128
|
+
conductor は `pi-agent-core` を直接使い、`pi-coding-agent` の設定適用器・TUI・package manager は起動しません。そのため `settings.json` は Pi 標準のファイル名と resource path の意味を保ちますが、headless conductor が実際に参照するキーだけを契約とします。
|
|
129
|
+
|
|
130
|
+
実際に効くキーは次のとおりです。
|
|
131
|
+
|
|
132
|
+
| キー | headless conductor での意味 |
|
|
133
|
+
|------|----------------------------|
|
|
134
|
+
| `defaultProvider` / `defaultModel` | 明示的な `provider/model` がない場合のモデル選択。`model` / `modelId` は conductor の互換 alias として同じ選択に使います。 |
|
|
135
|
+
| `apiKey` / `apiKeys` | `auth.json` に provider credential がない場合の認証 fallback。 |
|
|
136
|
+
| `extensions` / `skills` / `prompts` / `themes` | 各 resource root を基準に追加で読む path。通常の `extensions/` 等の discovery と併用します。 |
|
|
137
|
+
|
|
138
|
+
Pi の `settings.md` にあるが headless conductor が適用しないキーは、拒否せず警告なしで無視します。
|
|
139
|
+
|
|
140
|
+
| 無視するキー(または prefix) | 適用されない挙動 |
|
|
141
|
+
|------------------------------|------------------|
|
|
142
|
+
| `defaultThinkingLevel` / `modelThinkingLevels` / `thinkingBudgets` / `enabledModels` | thinking level、budget、model cycling の設定 |
|
|
143
|
+
| `hideThinkingBlock` / `showCacheMissNotices` / `cacheWarming` / `steeringMode` / `followUpMode` | transcript 表示、cache、対話キューの設定 |
|
|
144
|
+
| `defaultTools` / `codemode.*` | Pi built-in coding tools の選択。conductor は harness / MCP / local extension の tool loadout を使います。 |
|
|
145
|
+
| `packages` | Pi package の install・解決。package が提供する resource は自動導入しません。 |
|
|
146
|
+
| `enableSkillCommands` | skill command の登録 toggle。読み込んだ skill の `/skill:<name>` 展開可否はこのキーで変更できません。 |
|
|
147
|
+
| `sessionDir` / `compaction.*` / `branchSummary.*` | Pi の session・compact・branch summary。session は harness の `.ensemble/pi/sessions/` が管理します。 |
|
|
148
|
+
| `theme` / `quietStartup` / `tuiMode` / `fullscreen*` / `terminal.*` / `images.*` / `markdown.*` | headless conductor の TUI・terminal 表示 |
|
|
149
|
+
| `transport` / `httpProxy` / `httpIdleTimeoutMs` / `websocketConnectTimeoutMs` / `retry.*` / `shellPath` / `shellCommandPrefix` / `npmCommand` | Pi coding-agent の network、shell、package runtime |
|
|
150
|
+
| `collapseChangelog` / `enableInstallTelemetry` / `enableAnalytics` / `warnings.*` | coding-agent の update、telemetry、UI warning |
|
|
151
|
+
|
|
152
|
+
表にない未対応キーも同じく無視します。`models.json`、`auth.json`、`extensions/`、`skills/`、`prompts/`、`themes/` の対応範囲は上記 resource の説明どおりです。
|
|
153
|
+
|
|
154
|
+
conductor の system prompt の基底は modular-prompt のコンパイル結果です。`.ensemble/pi/SYSTEM.md` / `APPEND_SYSTEM.md`(または resource root の同名ファイル)は conductor には読み込みません。
|
|
155
|
+
|
|
156
|
+
`.ensemble/` は既存のリポジトリ共通 gitignore 方針で無視されるため、Pi のローカル設定・認証・extension はコミットしません。
|
|
157
|
+
|
|
98
158
|
### GitHub 認証トークンの解決順
|
|
99
159
|
|
|
100
160
|
`resolveGitHubAuthToken({ config })`(`@agents-ensemble/core`):
|
|
@@ -149,7 +209,11 @@ MCP 設定は次の 2 層から読み込み、`mcpServers` のサーバー名単
|
|
|
149
209
|
}
|
|
150
210
|
```
|
|
151
211
|
|
|
152
|
-
|
|
212
|
+
解決済み設定は conductor の両 backend に同じ map として渡す。Cursor SDK では `Agent.create` / `Agent.resume` の inline MCP として、Pi では harness 内蔵 MCP bridge が MCP client と Pi `AgentTool` に変換して使う。この bridge は Pi の ExtensionAPI extension をロードするものではなく、`@agents-ensemble/core` 内で `@modelcontextprotocol/sdk` client を接続する in-process thin bridge である。どちらも `resume` と認証・transport エラーからの in-process reconnect で同じ設定を再注入する。Pi は MCP 設定がある場合、session 開始前に全サーバーへ接続して tools を発見するため、接続または bridge の読み込みに失敗したら起動を fail する。
|
|
213
|
+
|
|
214
|
+
設定値の `${env:...}` や `${workspaceFolder}` などの展開は Cursor SDK では SDK に任せ、Pi bridge では起動時の process environment と conductor cwd を使って同じ参照を展開する。Pi bridge は `stdio` / `http`(Streamable HTTP)/ `sse`、`env`、`cwd`、`headers` を扱う。Cursor SDK が提供する OAuth 対話(`auth` 定義)は Pi bridge の制限により未対応で、該当定義は明確なエラーにする。`.cursor/mcp.json` や `.pi/mcp.json` へのコピー・symlink、`settings.json` の書き換えは行わず、ACP worker にはこの設定を渡さない。Pi MCP tools は `mcp_<server>_<tool>` という衝突回避済みの名前で表示され、resources/prompts の専用 API は今回の bridge の対象外とする。Pi MCP tool の `callTool` 例外または MCP `isError` は成功結果に変換せず、`AgentTool.execute` の throw として model loop に伝える。Pi では extension の読み込み有無にかかわらず、harness tools と解決済み MCP bridge tools が conductor の tool loadout に含まれる。
|
|
215
|
+
|
|
216
|
+
Pi bridge は `@modelcontextprotocol/sdk@1.30.0` を core に同梱する。依存が欠落した環境で MCP 設定を持つ Pi backend を起動した場合は、インストールすべき固定バージョンを含むエラーで停止する。MCP 未設定時は bridge をロードせず、両 backend とも従来どおり MCP なしで起動する。
|
|
153
217
|
|
|
154
218
|
JSON が不正、または `mcpServers` / サーバー定義の形式が不正な場合は、そのファイルを `[mcp]` 警告とともにスキップする。もう一方の層が有効ならそちらは引き続き読み込み、両方をスキップした場合は MCP なしで起動する。MCP のホットリロードは行わないため、変更後は新しいセッションを開始する。
|
|
155
219
|
|