@agents-ensemble/cli 0.0.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/async-operator-input.d.ts +6 -0
- package/dist/async-operator-input.d.ts.map +1 -0
- package/dist/async-operator-input.js +58 -0
- package/dist/async-operator-input.js.map +1 -0
- package/dist/display/create-session-display-sink.d.ts +9 -0
- package/dist/display/create-session-display-sink.d.ts.map +1 -0
- package/dist/display/create-session-display-sink.js +31 -0
- package/dist/display/create-session-display-sink.js.map +1 -0
- package/dist/display/select-session-display-backend.d.ts +11 -0
- package/dist/display/select-session-display-backend.d.ts.map +1 -0
- package/dist/display/select-session-display-backend.js +16 -0
- package/dist/display/select-session-display-backend.js.map +1 -0
- package/dist/display/session-display-backend.d.ts +7 -0
- package/dist/display/session-display-backend.d.ts.map +1 -0
- package/dist/display/session-display-backend.js +2 -0
- package/dist/display/session-display-backend.js.map +1 -0
- package/dist/display/session-display-reducer.d.ts +6 -0
- package/dist/display/session-display-reducer.d.ts.map +1 -0
- package/dist/display/session-display-reducer.js +74 -0
- package/dist/display/session-display-reducer.js.map +1 -0
- package/dist/display/session-display-state.d.ts +14 -0
- package/dist/display/session-display-state.d.ts.map +1 -0
- package/dist/display/session-display-state.js +6 -0
- package/dist/display/session-display-state.js.map +1 -0
- package/dist/display/string-session-display-backend.d.ts +8 -0
- package/dist/display/string-session-display-backend.d.ts.map +1 -0
- package/dist/display/string-session-display-backend.js +18 -0
- package/dist/display/string-session-display-backend.js.map +1 -0
- package/dist/display/stub-session-display-backend.d.ts +15 -0
- package/dist/display/stub-session-display-backend.d.ts.map +1 -0
- package/dist/display/stub-session-display-backend.js +17 -0
- package/dist/display/stub-session-display-backend.js.map +1 -0
- package/dist/format-models-list.d.ts +9 -0
- package/dist/format-models-list.d.ts.map +1 -0
- package/dist/format-models-list.js +17 -0
- package/dist/format-models-list.js.map +1 -0
- package/dist/format-session-summary.d.ts +4 -0
- package/dist/format-session-summary.d.ts.map +1 -0
- package/dist/format-session-summary.js +25 -0
- package/dist/format-session-summary.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +124 -0
- package/dist/index.js.map +1 -0
- package/dist/issue-command.d.ts +38 -0
- package/dist/issue-command.d.ts.map +1 -0
- package/dist/issue-command.js +117 -0
- package/dist/issue-command.js.map +1 -0
- package/dist/parse-worktree-mode.d.ts +4 -0
- package/dist/parse-worktree-mode.d.ts.map +1 -0
- package/dist/parse-worktree-mode.js +10 -0
- package/dist/parse-worktree-mode.js.map +1 -0
- package/dist/prompt-human-inquiry.d.ts +3 -0
- package/dist/prompt-human-inquiry.d.ts.map +1 -0
- package/dist/prompt-human-inquiry.js +29 -0
- package/dist/prompt-human-inquiry.js.map +1 -0
- package/dist/prompt-operator-input.d.ts +7 -0
- package/dist/prompt-operator-input.d.ts.map +1 -0
- package/dist/prompt-operator-input.js +51 -0
- package/dist/prompt-operator-input.js.map +1 -0
- package/dist/prompt-permission.d.ts +4 -0
- package/dist/prompt-permission.d.ts.map +1 -0
- package/dist/prompt-permission.js +8 -0
- package/dist/prompt-permission.js.map +1 -0
- package/dist/resolve-cli-max-turns.d.ts +8 -0
- package/dist/resolve-cli-max-turns.d.ts.map +1 -0
- package/dist/resolve-cli-max-turns.js +13 -0
- package/dist/resolve-cli-max-turns.js.map +1 -0
- package/dist/session-log-lines.d.ts +10 -0
- package/dist/session-log-lines.d.ts.map +1 -0
- package/dist/session-log-lines.js +121 -0
- package/dist/session-log-lines.js.map +1 -0
- package/dist/session-sinks.d.ts +20 -0
- package/dist/session-sinks.d.ts.map +1 -0
- package/dist/session-sinks.js +67 -0
- package/dist/session-sinks.js.map +1 -0
- package/dist/tui/activity-log.d.ts +32 -0
- package/dist/tui/activity-log.d.ts.map +1 -0
- package/dist/tui/activity-log.js +79 -0
- package/dist/tui/activity-log.js.map +1 -0
- package/dist/tui/compute-operator-input-cursor-y.d.ts +48 -0
- package/dist/tui/compute-operator-input-cursor-y.d.ts.map +1 -0
- package/dist/tui/compute-operator-input-cursor-y.js +52 -0
- package/dist/tui/compute-operator-input-cursor-y.js.map +1 -0
- package/dist/tui/create-issue-session-tui-host.d.ts +12 -0
- package/dist/tui/create-issue-session-tui-host.d.ts.map +1 -0
- package/dist/tui/create-issue-session-tui-host.js +88 -0
- package/dist/tui/create-issue-session-tui-host.js.map +1 -0
- package/dist/tui/create-issue-session-tui-host.test.d.ts +2 -0
- package/dist/tui/create-issue-session-tui-host.test.d.ts.map +1 -0
- package/dist/tui/create-issue-session-tui-host.test.js +133 -0
- package/dist/tui/create-issue-session-tui-host.test.js.map +1 -0
- package/dist/tui/create-tui-telemetry-sink.d.ts +5 -0
- package/dist/tui/create-tui-telemetry-sink.d.ts.map +1 -0
- package/dist/tui/create-tui-telemetry-sink.js +18 -0
- package/dist/tui/create-tui-telemetry-sink.js.map +1 -0
- package/dist/tui/format-operator-context.d.ts +9 -0
- package/dist/tui/format-operator-context.d.ts.map +1 -0
- package/dist/tui/format-operator-context.js +17 -0
- package/dist/tui/format-operator-context.js.map +1 -0
- package/dist/tui/ime-text-input.d.ts +31 -0
- package/dist/tui/ime-text-input.d.ts.map +1 -0
- package/dist/tui/ime-text-input.js +111 -0
- package/dist/tui/ime-text-input.js.map +1 -0
- package/dist/tui/ime-text-input.test.d.ts +2 -0
- package/dist/tui/ime-text-input.test.d.ts.map +1 -0
- package/dist/tui/ime-text-input.test.js +62 -0
- package/dist/tui/ime-text-input.test.js.map +1 -0
- package/dist/tui/ink-test-keys.d.ts +22 -0
- package/dist/tui/ink-test-keys.d.ts.map +1 -0
- package/dist/tui/ink-test-keys.js +26 -0
- package/dist/tui/ink-test-keys.js.map +1 -0
- package/dist/tui/issue-session-tui.d.ts +8 -0
- package/dist/tui/issue-session-tui.d.ts.map +1 -0
- package/dist/tui/issue-session-tui.js +201 -0
- package/dist/tui/issue-session-tui.js.map +1 -0
- package/dist/tui/issue-session-tui.test.d.ts +2 -0
- package/dist/tui/issue-session-tui.test.d.ts.map +1 -0
- package/dist/tui/issue-session-tui.test.js +529 -0
- package/dist/tui/issue-session-tui.test.js.map +1 -0
- package/dist/tui/open-questions-pane.d.ts +32 -0
- package/dist/tui/open-questions-pane.d.ts.map +1 -0
- package/dist/tui/open-questions-pane.js +101 -0
- package/dist/tui/open-questions-pane.js.map +1 -0
- package/dist/tui/operator-input-key-reducer.d.ts +36 -0
- package/dist/tui/operator-input-key-reducer.d.ts.map +1 -0
- package/dist/tui/operator-input-key-reducer.js +141 -0
- package/dist/tui/operator-input-key-reducer.js.map +1 -0
- package/dist/tui/operator-input-layout.d.ts +29 -0
- package/dist/tui/operator-input-layout.d.ts.map +1 -0
- package/dist/tui/operator-input-layout.js +120 -0
- package/dist/tui/operator-input-layout.js.map +1 -0
- package/dist/tui/orchestration-pane-frame.d.ts +9 -0
- package/dist/tui/orchestration-pane-frame.d.ts.map +1 -0
- package/dist/tui/orchestration-pane-frame.js +27 -0
- package/dist/tui/orchestration-pane-frame.js.map +1 -0
- package/dist/tui/tui-layout-constants.d.ts +48 -0
- package/dist/tui/tui-layout-constants.d.ts.map +1 -0
- package/dist/tui/tui-layout-constants.js +48 -0
- package/dist/tui/tui-layout-constants.js.map +1 -0
- package/dist/tui/tui-view-model.d.ts +20 -0
- package/dist/tui/tui-view-model.d.ts.map +1 -0
- package/dist/tui/tui-view-model.js +69 -0
- package/dist/tui/tui-view-model.js.map +1 -0
- package/dist/tui/wrap-text-to-width.d.ts +14 -0
- package/dist/tui/wrap-text-to-width.d.ts.map +1 -0
- package/dist/tui/wrap-text-to-width.js +55 -0
- package/dist/tui/wrap-text-to-width.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export type ActivityLogLabel = 'operator' | 'harness' | 'conductor' | 'observation';
|
|
2
|
+
/** 活動ログ内の空行セパレータ(conductor 本文前など)。 */
|
|
3
|
+
export type ActivityLogSeparatorLabel = 'separator';
|
|
4
|
+
export type ActivityLogEntryLabel = ActivityLogLabel | ActivityLogSeparatorLabel;
|
|
5
|
+
export interface ActivityLogEntry {
|
|
6
|
+
label: ActivityLogEntryLabel;
|
|
7
|
+
text: string;
|
|
8
|
+
}
|
|
9
|
+
type ActivityLogInkColor = 'cyan' | 'yellow' | 'magenta';
|
|
10
|
+
/** Ink `Text` の `color`。operator は入力欄と同じデフォルト(undefined)。 */
|
|
11
|
+
export declare const ACTIVITY_LOG_LABEL_COLORS: Record<ActivityLogLabel, ActivityLogInkColor | undefined>;
|
|
12
|
+
/** 活動ログ 1 行の表示型。折り返し 1 行は inline、2 行以上は label-row + body-row。 */
|
|
13
|
+
export type ActivityLogDisplayLineLayout = 'separator' | 'inline' | 'label-row' | 'body-row';
|
|
14
|
+
export interface ActivityLogDisplayLine {
|
|
15
|
+
label: ActivityLogEntryLabel;
|
|
16
|
+
text: string;
|
|
17
|
+
layout: ActivityLogDisplayLineLayout;
|
|
18
|
+
}
|
|
19
|
+
export declare function formatActivityLogLabelPrefix(label: ActivityLogLabel): string;
|
|
20
|
+
/** メインペインのスクロール遡り用。表示行は `buildActivityLogDisplayLines` で別途展開。 */
|
|
21
|
+
export declare const ACTIVITY_LOG_WINDOW_SIZE = 300;
|
|
22
|
+
export type ActivityLogScrollAction = 'pageUp' | 'pageDown' | 'home' | 'end';
|
|
23
|
+
/** `linesFromBottom=0` が最新追従。PgUp で増加(過去へ)、End で 0 に復帰。 */
|
|
24
|
+
export declare function advanceActivityLogScrollOffset(linesFromBottom: number, action: ActivityLogScrollAction, pageSize: number, maxLinesFromBottom: number): number;
|
|
25
|
+
export declare function appendActivityLogEntry(entries: ActivityLogEntry[], entry: ActivityLogEntry, windowSize?: number): ActivityLogEntry[];
|
|
26
|
+
export declare function formatActivityLogLine(entry: ActivityLogEntry): string;
|
|
27
|
+
/** 折り返し済みの表示行に展開。1 行なら `[label] 本文`、2 行以上なら `[label]` 単独行 + 本文左端。 */
|
|
28
|
+
export declare function buildActivityLogDisplayLines(entries: ActivityLogEntry[], contentWidth: number): ActivityLogDisplayLine[];
|
|
29
|
+
/** 表示行配列から可視範囲を切り出す。`linesFromBottom=0` が最新追従。 */
|
|
30
|
+
export declare function sliceActivityLogDisplayLines(lines: ActivityLogDisplayLine[], visibleCount: number, linesFromBottom: number): ActivityLogDisplayLine[];
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=activity-log.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activity-log.d.ts","sourceRoot":"","sources":["../../src/tui/activity-log.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,SAAS,GAAG,WAAW,GAAG,aAAa,CAAC;AAEpF,sCAAsC;AACtC,MAAM,MAAM,yBAAyB,GAAG,WAAW,CAAC;AAEpD,MAAM,MAAM,qBAAqB,GAAG,gBAAgB,GAAG,yBAAyB,CAAC;AAEjF,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,qBAAqB,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,KAAK,mBAAmB,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEzD,6DAA6D;AAC7D,eAAO,MAAM,yBAAyB,EAAE,MAAM,CAC5C,gBAAgB,EAChB,mBAAmB,GAAG,SAAS,CAMhC,CAAC;AAEF,iEAAiE;AACjE,MAAM,MAAM,4BAA4B,GACpC,WAAW,GACX,QAAQ,GACR,WAAW,GACX,UAAU,CAAC;AAEf,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,qBAAqB,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,4BAA4B,CAAC;CACtC;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,CAE5E;AAED,iEAAiE;AACjE,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAE5C,MAAM,MAAM,uBAAuB,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,GAAG,KAAK,CAAC;AAE7E,2DAA2D;AAC3D,wBAAgB,8BAA8B,CAC5C,eAAe,EAAE,MAAM,EACvB,MAAM,EAAE,uBAAuB,EAC/B,QAAQ,EAAE,MAAM,EAChB,kBAAkB,EAAE,MAAM,GACzB,MAAM,CAWR;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,gBAAgB,EAAE,EAC3B,KAAK,EAAE,gBAAgB,EACvB,UAAU,GAAE,MAAiC,GAC5C,gBAAgB,EAAE,CAMpB;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,CAKrE;AAED,qEAAqE;AACrE,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,gBAAgB,EAAE,EAC3B,YAAY,EAAE,MAAM,GACnB,sBAAsB,EAAE,CA8B1B;AAED,kDAAkD;AAClD,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,sBAAsB,EAAE,EAC/B,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,MAAM,GACtB,sBAAsB,EAAE,CAU1B"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { wrapTextToWidth } from './wrap-text-to-width.js';
|
|
2
|
+
/** Ink `Text` の `color`。operator は入力欄と同じデフォルト(undefined)。 */
|
|
3
|
+
export const ACTIVITY_LOG_LABEL_COLORS = {
|
|
4
|
+
operator: undefined,
|
|
5
|
+
conductor: 'cyan',
|
|
6
|
+
harness: 'yellow',
|
|
7
|
+
observation: 'magenta',
|
|
8
|
+
};
|
|
9
|
+
export function formatActivityLogLabelPrefix(label) {
|
|
10
|
+
return `[${label}] `;
|
|
11
|
+
}
|
|
12
|
+
/** メインペインのスクロール遡り用。表示行は `buildActivityLogDisplayLines` で別途展開。 */
|
|
13
|
+
export const ACTIVITY_LOG_WINDOW_SIZE = 300;
|
|
14
|
+
/** `linesFromBottom=0` が最新追従。PgUp で増加(過去へ)、End で 0 に復帰。 */
|
|
15
|
+
export function advanceActivityLogScrollOffset(linesFromBottom, action, pageSize, maxLinesFromBottom) {
|
|
16
|
+
switch (action) {
|
|
17
|
+
case 'pageUp':
|
|
18
|
+
return Math.min(linesFromBottom + pageSize, maxLinesFromBottom);
|
|
19
|
+
case 'pageDown':
|
|
20
|
+
return Math.max(0, linesFromBottom - pageSize);
|
|
21
|
+
case 'home':
|
|
22
|
+
return maxLinesFromBottom;
|
|
23
|
+
case 'end':
|
|
24
|
+
return 0;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export function appendActivityLogEntry(entries, entry, windowSize = ACTIVITY_LOG_WINDOW_SIZE) {
|
|
28
|
+
const next = [...entries, entry];
|
|
29
|
+
if (next.length <= windowSize) {
|
|
30
|
+
return next;
|
|
31
|
+
}
|
|
32
|
+
return next.slice(-windowSize);
|
|
33
|
+
}
|
|
34
|
+
export function formatActivityLogLine(entry) {
|
|
35
|
+
if (entry.label === 'separator') {
|
|
36
|
+
return '';
|
|
37
|
+
}
|
|
38
|
+
return `[${entry.label}] ${entry.text}`;
|
|
39
|
+
}
|
|
40
|
+
/** 折り返し済みの表示行に展開。1 行なら `[label] 本文`、2 行以上なら `[label]` 単独行 + 本文左端。 */
|
|
41
|
+
export function buildActivityLogDisplayLines(entries, contentWidth) {
|
|
42
|
+
const lines = [];
|
|
43
|
+
for (const entry of entries) {
|
|
44
|
+
if (entry.label === 'separator') {
|
|
45
|
+
lines.push({ label: 'separator', text: '', layout: 'separator' });
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
const bodyLines = wrapTextToWidth(entry.text, contentWidth);
|
|
49
|
+
if (bodyLines.length <= 1) {
|
|
50
|
+
lines.push({
|
|
51
|
+
label: entry.label,
|
|
52
|
+
text: bodyLines[0] ?? '',
|
|
53
|
+
layout: 'inline',
|
|
54
|
+
});
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
lines.push({ label: entry.label, text: '', layout: 'label-row' });
|
|
58
|
+
for (const bodyLine of bodyLines) {
|
|
59
|
+
lines.push({
|
|
60
|
+
label: entry.label,
|
|
61
|
+
text: bodyLine,
|
|
62
|
+
layout: 'body-row',
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return lines;
|
|
67
|
+
}
|
|
68
|
+
/** 表示行配列から可視範囲を切り出す。`linesFromBottom=0` が最新追従。 */
|
|
69
|
+
export function sliceActivityLogDisplayLines(lines, visibleCount, linesFromBottom) {
|
|
70
|
+
if (lines.length === 0 || visibleCount < 1) {
|
|
71
|
+
return [];
|
|
72
|
+
}
|
|
73
|
+
const maxOffset = Math.max(0, lines.length - visibleCount);
|
|
74
|
+
const offset = Math.min(Math.max(0, linesFromBottom), maxOffset);
|
|
75
|
+
const end = lines.length - offset;
|
|
76
|
+
const start = Math.max(0, end - visibleCount);
|
|
77
|
+
return lines.slice(start, end);
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=activity-log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activity-log.js","sourceRoot":"","sources":["../../src/tui/activity-log.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/** 入力ペインの総行数(枠線 + ヒント行 + 入力行)。Ink `Box` の `height` に渡す値。 */
|
|
2
|
+
export declare function computeInputPaneHeight(params: {
|
|
3
|
+
hintLineCount: number;
|
|
4
|
+
inputDisplayLineCount?: number;
|
|
5
|
+
}): number;
|
|
6
|
+
/** Orchestration メインペインの行数。全ペイン高さの合計が端末行数と一致するよう逆算。 */
|
|
7
|
+
export declare function computeActivityPaneHeight(params: {
|
|
8
|
+
terminalRows: number;
|
|
9
|
+
hintLineCount: number;
|
|
10
|
+
inputDisplayLineCount?: number;
|
|
11
|
+
openQuestionsPaneHeight: number;
|
|
12
|
+
}): number;
|
|
13
|
+
/** Orchestration ペイン内に表示できる活動ログ行数。 */
|
|
14
|
+
export declare function computeOrchestrationLogVisibleLineCount(paneHeight: number, titleLineCount?: number): number;
|
|
15
|
+
/** 端末行数から Orchestration ペインの活動ログ行キャパシティ(タイトル 1 行想定)。 */
|
|
16
|
+
export declare function computeActivityLogLineCapacity(params: {
|
|
17
|
+
terminalRows: number;
|
|
18
|
+
hintLineCount: number;
|
|
19
|
+
inputDisplayLineCount?: number;
|
|
20
|
+
openQuestionsPaneHeight: number;
|
|
21
|
+
}): number;
|
|
22
|
+
/**
|
|
23
|
+
* オペレータ入力カーソルの X 座標(Ink 出力原点から 0 始まり、カーソル offset 0)。
|
|
24
|
+
* 入力ペインの左枠線・padding とプロンプト幅を含む。
|
|
25
|
+
*/
|
|
26
|
+
export declare function computeOperatorInputCursorX(operatorPrompt: string): number;
|
|
27
|
+
/**
|
|
28
|
+
* オペレータ入力行の Y 座標(Ink `useCursor` 向け。Ink 出力原点から 0 始まり)。
|
|
29
|
+
*
|
|
30
|
+
* 描画フレーム上の入力行インデックスに {@link OPERATOR_INPUT_CURSOR_Y_OFFSET} を加算する。
|
|
31
|
+
* Ink `log-update` の `visibleLineCount` と実入力行の差を補正(オペレータ手動確認 iTerm2+tmux)。
|
|
32
|
+
*/
|
|
33
|
+
export declare function computeOperatorInputCursorY(params: {
|
|
34
|
+
terminalRows: number;
|
|
35
|
+
hintLineCount: number;
|
|
36
|
+
inputDisplayLineCount?: number;
|
|
37
|
+
openQuestionsPaneHeight: number;
|
|
38
|
+
cursorLineOffset?: number;
|
|
39
|
+
}): number;
|
|
40
|
+
/** 描画フレーム上のオペレータ入力行インデックス(`useCursor` の Y 補正前)。 */
|
|
41
|
+
export declare function computeOperatorInputLineIndex(params: {
|
|
42
|
+
terminalRows: number;
|
|
43
|
+
hintLineCount: number;
|
|
44
|
+
inputDisplayLineCount?: number;
|
|
45
|
+
openQuestionsPaneHeight: number;
|
|
46
|
+
cursorLineOffset?: number;
|
|
47
|
+
}): number;
|
|
48
|
+
//# sourceMappingURL=compute-operator-input-cursor-y.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compute-operator-input-cursor-y.d.ts","sourceRoot":"","sources":["../../src/tui/compute-operator-input-cursor-y.ts"],"names":[],"mappings":"AAUA,4DAA4D;AAC5D,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAC7C,aAAa,EAAE,MAAM,CAAC;IACtB,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC,GAAG,MAAM,CAGT;AAED,uDAAuD;AACvD,wBAAgB,yBAAyB,CAAC,MAAM,EAAE;IAChD,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,uBAAuB,EAAE,MAAM,CAAC;CACjC,GAAG,MAAM,CAUT;AAED,sCAAsC;AACtC,wBAAgB,uCAAuC,CACrD,UAAU,EAAE,MAAM,EAClB,cAAc,GAAE,MAAsC,GACrD,MAAM,CAER;AAED,wDAAwD;AACxD,wBAAgB,8BAA8B,CAAC,MAAM,EAAE;IACrD,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,uBAAuB,EAAE,MAAM,CAAC;CACjC,GAAG,MAAM,CAGT;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAE1E;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE;IAClD,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,uBAAuB,EAAE,MAAM,CAAC;IAChC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,GAAG,MAAM,CAWT;AAED,mDAAmD;AACnD,wBAAgB,6BAA6B,CAAC,MAAM,EAAE;IACpD,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,uBAAuB,EAAE,MAAM,CAAC;IAChC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,GAAG,MAAM,CAET"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import stringWidth from 'string-width';
|
|
2
|
+
import { INPUT_PANE_BORDER_ROWS, INPUT_PANE_LEFT_COLUMNS, OPERATOR_INPUT_CURSOR_Y_OFFSET, ORCHESTRATION_PANE_TITLE_ROWS, PANE_BORDER_ROWS, WORKER_PANE_HEIGHT, } from './tui-layout-constants.js';
|
|
3
|
+
/** 入力ペインの総行数(枠線 + ヒント行 + 入力行)。Ink `Box` の `height` に渡す値。 */
|
|
4
|
+
export function computeInputPaneHeight(params) {
|
|
5
|
+
const inputDisplayLineCount = Math.max(1, params.inputDisplayLineCount ?? 1);
|
|
6
|
+
return INPUT_PANE_BORDER_ROWS + params.hintLineCount + inputDisplayLineCount;
|
|
7
|
+
}
|
|
8
|
+
/** Orchestration メインペインの行数。全ペイン高さの合計が端末行数と一致するよう逆算。 */
|
|
9
|
+
export function computeActivityPaneHeight(params) {
|
|
10
|
+
return (params.terminalRows -
|
|
11
|
+
WORKER_PANE_HEIGHT -
|
|
12
|
+
params.openQuestionsPaneHeight -
|
|
13
|
+
computeInputPaneHeight({
|
|
14
|
+
hintLineCount: params.hintLineCount,
|
|
15
|
+
inputDisplayLineCount: params.inputDisplayLineCount,
|
|
16
|
+
}));
|
|
17
|
+
}
|
|
18
|
+
/** Orchestration ペイン内に表示できる活動ログ行数。 */
|
|
19
|
+
export function computeOrchestrationLogVisibleLineCount(paneHeight, titleLineCount = ORCHESTRATION_PANE_TITLE_ROWS) {
|
|
20
|
+
return Math.max(1, paneHeight - PANE_BORDER_ROWS - titleLineCount);
|
|
21
|
+
}
|
|
22
|
+
/** 端末行数から Orchestration ペインの活動ログ行キャパシティ(タイトル 1 行想定)。 */
|
|
23
|
+
export function computeActivityLogLineCapacity(params) {
|
|
24
|
+
const activityPaneHeight = computeActivityPaneHeight(params);
|
|
25
|
+
return computeOrchestrationLogVisibleLineCount(activityPaneHeight);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* オペレータ入力カーソルの X 座標(Ink 出力原点から 0 始まり、カーソル offset 0)。
|
|
29
|
+
* 入力ペインの左枠線・padding とプロンプト幅を含む。
|
|
30
|
+
*/
|
|
31
|
+
export function computeOperatorInputCursorX(operatorPrompt) {
|
|
32
|
+
return INPUT_PANE_LEFT_COLUMNS + stringWidth(operatorPrompt);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* オペレータ入力行の Y 座標(Ink `useCursor` 向け。Ink 出力原点から 0 始まり)。
|
|
36
|
+
*
|
|
37
|
+
* 描画フレーム上の入力行インデックスに {@link OPERATOR_INPUT_CURSOR_Y_OFFSET} を加算する。
|
|
38
|
+
* Ink `log-update` の `visibleLineCount` と実入力行の差を補正(オペレータ手動確認 iTerm2+tmux)。
|
|
39
|
+
*/
|
|
40
|
+
export function computeOperatorInputCursorY(params) {
|
|
41
|
+
const panesAboveInput = WORKER_PANE_HEIGHT +
|
|
42
|
+
computeActivityPaneHeight(params) +
|
|
43
|
+
params.openQuestionsPaneHeight;
|
|
44
|
+
const cursorLineOffset = params.cursorLineOffset ?? 0;
|
|
45
|
+
const inputLineIndex = panesAboveInput + PANE_BORDER_ROWS / 2 + params.hintLineCount + cursorLineOffset;
|
|
46
|
+
return inputLineIndex + OPERATOR_INPUT_CURSOR_Y_OFFSET;
|
|
47
|
+
}
|
|
48
|
+
/** 描画フレーム上のオペレータ入力行インデックス(`useCursor` の Y 補正前)。 */
|
|
49
|
+
export function computeOperatorInputLineIndex(params) {
|
|
50
|
+
return computeOperatorInputCursorY(params) - OPERATOR_INPUT_CURSOR_Y_OFFSET;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=compute-operator-input-cursor-y.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compute-operator-input-cursor-y.js","sourceRoot":"","sources":["../../src/tui/compute-operator-input-cursor-y.ts"],"names":[],"mappings":"AAAA,OAAO,WAAW,MAAM,cAAc,CAAC;AACvC,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,8BAA8B,EAC9B,6BAA6B,EAC7B,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,2BAA2B,CAAC;AAEnC,4DAA4D;AAC5D,MAAM,UAAU,sBAAsB,CAAC,MAGtC;IACC,MAAM,qBAAqB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,qBAAqB,IAAI,CAAC,CAAC,CAAC;IAC7E,OAAO,sBAAsB,GAAG,MAAM,CAAC,aAAa,GAAG,qBAAqB,CAAC;AAC/E,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,yBAAyB,CAAC,MAKzC;IACC,OAAO,CACL,MAAM,CAAC,YAAY;QACnB,kBAAkB;QAClB,MAAM,CAAC,uBAAuB;QAC9B,sBAAsB,CAAC;YACrB,aAAa,EAAE,MAAM,CAAC,aAAa;YACnC,qBAAqB,EAAE,MAAM,CAAC,qBAAqB;SACpD,CAAC,CACH,CAAC;AACJ,CAAC;AAED,sCAAsC;AACtC,MAAM,UAAU,uCAAuC,CACrD,UAAkB,EAClB,iBAAyB,6BAA6B;IAEtD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,gBAAgB,GAAG,cAAc,CAAC,CAAC;AACrE,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,8BAA8B,CAAC,MAK9C;IACC,MAAM,kBAAkB,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAC7D,OAAO,uCAAuC,CAAC,kBAAkB,CAAC,CAAC;AACrE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,2BAA2B,CAAC,cAAsB;IAChE,OAAO,uBAAuB,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC;AAC/D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,2BAA2B,CAAC,MAM3C;IACC,MAAM,eAAe,GACnB,kBAAkB;QAClB,yBAAyB,CAAC,MAAM,CAAC;QACjC,MAAM,CAAC,uBAAuB,CAAC;IAEjC,MAAM,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,IAAI,CAAC,CAAC;IACtD,MAAM,cAAc,GAClB,eAAe,GAAG,gBAAgB,GAAG,CAAC,GAAG,MAAM,CAAC,aAAa,GAAG,gBAAgB,CAAC;IAEnF,OAAO,cAAc,GAAG,8BAA8B,CAAC;AACzD,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,6BAA6B,CAAC,MAM7C;IACC,OAAO,2BAA2B,CAAC,MAAM,CAAC,GAAG,8BAA8B,CAAC;AAC9E,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { OperatorInputBinding, SessionLogSink } from '@agents-ensemble/core';
|
|
2
|
+
import type { SessionDisplayBackend } from '../display/session-display-backend.js';
|
|
3
|
+
export interface IssueSessionTuiHost {
|
|
4
|
+
displayBackend: SessionDisplayBackend;
|
|
5
|
+
telemetrySink: SessionLogSink;
|
|
6
|
+
bindOperatorInput: OperatorInputBinding;
|
|
7
|
+
notifyReprompt: () => void;
|
|
8
|
+
dispose: () => void;
|
|
9
|
+
}
|
|
10
|
+
/** TTY 向け Ink TUI を起動し、表示 backend とオペレータ入力 binding を返す。 */
|
|
11
|
+
export declare function createIssueSessionTuiHost(): IssueSessionTuiHost;
|
|
12
|
+
//# sourceMappingURL=create-issue-session-tui-host.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-issue-session-tui-host.d.ts","sourceRoot":"","sources":["../../src/tui/create-issue-session-tui-host.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,oBAAoB,EAGpB,cAAc,EACf,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AASnF,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,qBAAqB,CAAC;IACtC,aAAa,EAAE,cAAc,CAAC;IAC9B,iBAAiB,EAAE,oBAAoB,CAAC;IACxC,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AA6DD,2DAA2D;AAC3D,wBAAgB,yBAAyB,IAAI,mBAAmB,CA4C/D"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { render } from 'ink';
|
|
3
|
+
import { formatConductorActivityBody } from '../session-log-lines.js';
|
|
4
|
+
import { IssueSessionTui } from './issue-session-tui.js';
|
|
5
|
+
import { createTuiViewModel } from './tui-view-model.js';
|
|
6
|
+
import { createTuiTelemetrySink } from './create-tui-telemetry-sink.js';
|
|
7
|
+
import { trimBlankLinesOnly } from './operator-input-layout.js';
|
|
8
|
+
const OPERATOR_MESSAGE_ENV = 'ENSEMBLE_OPERATOR_MESSAGE';
|
|
9
|
+
function createInkDisplayBackend(viewModel) {
|
|
10
|
+
return {
|
|
11
|
+
render(state, _previousState, event) {
|
|
12
|
+
viewModel.setDisplayState(state);
|
|
13
|
+
if (event.type === 'operator.input') {
|
|
14
|
+
viewModel.appendActivityLog('operator', event.text);
|
|
15
|
+
}
|
|
16
|
+
const conductorBody = formatConductorActivityBody(event);
|
|
17
|
+
if (conductorBody) {
|
|
18
|
+
viewModel.appendActivityLogSeparator();
|
|
19
|
+
viewModel.appendActivityLog('conductor', conductorBody);
|
|
20
|
+
viewModel.appendActivityLogSeparator();
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function createBindTuiOperatorInput(viewModel, onSubmitRef, apiRef) {
|
|
26
|
+
return (api) => {
|
|
27
|
+
const fromEnv = process.env[OPERATOR_MESSAGE_ENV]?.trim();
|
|
28
|
+
if (fromEnv) {
|
|
29
|
+
api.submit(fromEnv);
|
|
30
|
+
return () => { };
|
|
31
|
+
}
|
|
32
|
+
if (!process.stdin.isTTY) {
|
|
33
|
+
return () => { };
|
|
34
|
+
}
|
|
35
|
+
apiRef.current = api;
|
|
36
|
+
onSubmitRef.current = (text, options) => {
|
|
37
|
+
const trimmed = trimBlankLinesOnly(text);
|
|
38
|
+
if (trimmed) {
|
|
39
|
+
api.submit(trimmed, options);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
viewModel.setOperatorContext(api.getContext());
|
|
43
|
+
return () => {
|
|
44
|
+
apiRef.current = undefined;
|
|
45
|
+
if (onSubmitRef.current) {
|
|
46
|
+
onSubmitRef.current = undefined;
|
|
47
|
+
}
|
|
48
|
+
viewModel.setOperatorContext(undefined);
|
|
49
|
+
};
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/** TTY 向け Ink TUI を起動し、表示 backend とオペレータ入力 binding を返す。 */
|
|
53
|
+
export function createIssueSessionTuiHost() {
|
|
54
|
+
const viewModel = createTuiViewModel();
|
|
55
|
+
const onSubmitRef = {
|
|
56
|
+
current: undefined,
|
|
57
|
+
};
|
|
58
|
+
const apiRef = {
|
|
59
|
+
current: undefined,
|
|
60
|
+
};
|
|
61
|
+
const ink = render(_jsx(IssueSessionTui, { viewModel: viewModel, onSubmit: (text, options) => {
|
|
62
|
+
onSubmitRef.current?.(text, options);
|
|
63
|
+
} }));
|
|
64
|
+
const inkDisplayBackend = createInkDisplayBackend(viewModel);
|
|
65
|
+
const bindOperatorInput = createBindTuiOperatorInput(viewModel, onSubmitRef, apiRef);
|
|
66
|
+
const telemetrySink = createTuiTelemetrySink(viewModel);
|
|
67
|
+
return {
|
|
68
|
+
displayBackend: {
|
|
69
|
+
render(state, previousState, event) {
|
|
70
|
+
inkDisplayBackend.render(state, previousState, event);
|
|
71
|
+
if (apiRef.current) {
|
|
72
|
+
viewModel.setOperatorContext(apiRef.current.getContext());
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
telemetrySink,
|
|
77
|
+
bindOperatorInput,
|
|
78
|
+
notifyReprompt: () => {
|
|
79
|
+
if (apiRef.current) {
|
|
80
|
+
viewModel.setOperatorContext(apiRef.current.getContext());
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
dispose: () => {
|
|
84
|
+
ink.unmount();
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=create-issue-session-tui-host.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-issue-session-tui-host.js","sourceRoot":"","sources":["../../src/tui/create-issue-session-tui-host.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-issue-session-tui-host.test.d.ts","sourceRoot":"","sources":["../../src/tui/create-issue-session-tui-host.test.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
+
const { mockUnmount, mockRender } = vi.hoisted(() => {
|
|
3
|
+
const mockUnmount = vi.fn();
|
|
4
|
+
const mockRender = vi.fn(() => ({ unmount: mockUnmount }));
|
|
5
|
+
return { mockUnmount, mockRender };
|
|
6
|
+
});
|
|
7
|
+
vi.mock('ink', () => ({
|
|
8
|
+
render: mockRender,
|
|
9
|
+
Box: ({ children }) => children,
|
|
10
|
+
Text: ({ children }) => children,
|
|
11
|
+
useCursor: () => ({ setCursorPosition: vi.fn() }),
|
|
12
|
+
useInput: vi.fn(),
|
|
13
|
+
}));
|
|
14
|
+
vi.mock('./ime-text-input.js', () => ({
|
|
15
|
+
ImeTextInput: () => null,
|
|
16
|
+
}));
|
|
17
|
+
import { createIssueSessionTuiHost } from './create-issue-session-tui-host.js';
|
|
18
|
+
import { INITIAL_SESSION_DISPLAY_STATE } from '../display/session-display-state.js';
|
|
19
|
+
describe('createIssueSessionTuiHost', () => {
|
|
20
|
+
beforeEach(() => {
|
|
21
|
+
mockRender.mockClear();
|
|
22
|
+
mockUnmount.mockClear();
|
|
23
|
+
Object.defineProperty(process.stdin, 'isTTY', {
|
|
24
|
+
configurable: true,
|
|
25
|
+
value: true,
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
afterEach(() => {
|
|
29
|
+
const previous = process.env.ENSEMBLE_OPERATOR_MESSAGE;
|
|
30
|
+
delete process.env.ENSEMBLE_OPERATOR_MESSAGE;
|
|
31
|
+
if (previous !== undefined) {
|
|
32
|
+
process.env.ENSEMBLE_OPERATOR_MESSAGE = previous;
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
it('starts Ink render and exposes display backend with activity log', () => {
|
|
36
|
+
const host = createIssueSessionTuiHost();
|
|
37
|
+
expect(mockRender).toHaveBeenCalledTimes(1);
|
|
38
|
+
expect(host.telemetrySink).toBeTypeOf('function');
|
|
39
|
+
host.displayBackend.render(INITIAL_SESSION_DISPLAY_STATE, INITIAL_SESSION_DISPLAY_STATE, {
|
|
40
|
+
type: 'operator.input',
|
|
41
|
+
conductorTurn: 1,
|
|
42
|
+
text: 'hello',
|
|
43
|
+
});
|
|
44
|
+
host.displayBackend.render({
|
|
45
|
+
...INITIAL_SESSION_DISPLAY_STATE,
|
|
46
|
+
conductorOutput: 'ok',
|
|
47
|
+
}, INITIAL_SESSION_DISPLAY_STATE, {
|
|
48
|
+
type: 'conductor.send',
|
|
49
|
+
sendCount: 1,
|
|
50
|
+
runId: 'run-1',
|
|
51
|
+
status: 'finished',
|
|
52
|
+
result: 'ok',
|
|
53
|
+
workerDispatches: 0,
|
|
54
|
+
workerFailures: 0,
|
|
55
|
+
});
|
|
56
|
+
host.telemetrySink({
|
|
57
|
+
type: 'harness.worker.prompt.started',
|
|
58
|
+
name: 'implementer',
|
|
59
|
+
kind: 'implementer',
|
|
60
|
+
workerId: 'worker-1',
|
|
61
|
+
source: 'harness',
|
|
62
|
+
});
|
|
63
|
+
host.dispose();
|
|
64
|
+
expect(mockUnmount).toHaveBeenCalledTimes(1);
|
|
65
|
+
});
|
|
66
|
+
it('bindOperatorInput submits via Ink host without blocking', () => {
|
|
67
|
+
const host = createIssueSessionTuiHost();
|
|
68
|
+
const submit = vi.fn(() => true);
|
|
69
|
+
const getContext = vi.fn(() => ({
|
|
70
|
+
conductorTurn: 1,
|
|
71
|
+
autonomousTurns: 0,
|
|
72
|
+
maxTurns: 0,
|
|
73
|
+
openQuestions: [],
|
|
74
|
+
}));
|
|
75
|
+
const dispose = host.bindOperatorInput({ submit, getContext });
|
|
76
|
+
host.displayBackend.render(INITIAL_SESSION_DISPLAY_STATE, INITIAL_SESSION_DISPLAY_STATE, {
|
|
77
|
+
type: 'operator.input',
|
|
78
|
+
conductorTurn: 1,
|
|
79
|
+
text: 'via binding',
|
|
80
|
+
});
|
|
81
|
+
expect(submit).not.toHaveBeenCalled();
|
|
82
|
+
dispose?.();
|
|
83
|
+
host.dispose();
|
|
84
|
+
});
|
|
85
|
+
it('submits ENSEMBLE_OPERATOR_MESSAGE once without Ink input', () => {
|
|
86
|
+
const previous = process.env.ENSEMBLE_OPERATOR_MESSAGE;
|
|
87
|
+
process.env.ENSEMBLE_OPERATOR_MESSAGE = 'from env';
|
|
88
|
+
const host = createIssueSessionTuiHost();
|
|
89
|
+
const submit = vi.fn(() => true);
|
|
90
|
+
host.bindOperatorInput({
|
|
91
|
+
submit,
|
|
92
|
+
getContext: () => ({
|
|
93
|
+
conductorTurn: 1,
|
|
94
|
+
autonomousTurns: 0,
|
|
95
|
+
maxTurns: 0,
|
|
96
|
+
openQuestions: [],
|
|
97
|
+
}),
|
|
98
|
+
});
|
|
99
|
+
expect(submit).toHaveBeenCalledWith('from env');
|
|
100
|
+
host.dispose();
|
|
101
|
+
process.env.ENSEMBLE_OPERATOR_MESSAGE = previous;
|
|
102
|
+
});
|
|
103
|
+
it('notifyReprompt refreshes operator context from getContext', () => {
|
|
104
|
+
delete process.env.ENSEMBLE_OPERATOR_MESSAGE;
|
|
105
|
+
const host = createIssueSessionTuiHost();
|
|
106
|
+
const getContext = vi.fn(() => ({
|
|
107
|
+
conductorTurn: 3,
|
|
108
|
+
autonomousTurns: 1,
|
|
109
|
+
maxTurns: 5,
|
|
110
|
+
openQuestions: [
|
|
111
|
+
{
|
|
112
|
+
id: 'inq-9',
|
|
113
|
+
question: 'Need input',
|
|
114
|
+
responseType: 'text',
|
|
115
|
+
source: 'conductor',
|
|
116
|
+
status: 'open',
|
|
117
|
+
askedAt: 1,
|
|
118
|
+
},
|
|
119
|
+
],
|
|
120
|
+
}));
|
|
121
|
+
const dispose = host.bindOperatorInput({
|
|
122
|
+
submit: vi.fn(() => true),
|
|
123
|
+
getContext,
|
|
124
|
+
});
|
|
125
|
+
expect(dispose).toBeTypeOf('function');
|
|
126
|
+
getContext.mockClear();
|
|
127
|
+
host.notifyReprompt();
|
|
128
|
+
expect(getContext).toHaveBeenCalledTimes(1);
|
|
129
|
+
dispose?.();
|
|
130
|
+
host.dispose();
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
//# sourceMappingURL=create-issue-session-tui-host.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-issue-session-tui-host.test.js","sourceRoot":"","sources":["../../src/tui/create-issue-session-tui-host.test.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { SessionLogSink } from '@agents-ensemble/core';
|
|
2
|
+
import type { TuiViewModel } from './tui-view-model.js';
|
|
3
|
+
/** TTY Ink 時: harness / observation を stderr ではなく Orchestration メインペインへ送る sink。 */
|
|
4
|
+
export declare function createTuiTelemetrySink(viewModel: TuiViewModel): SessionLogSink;
|
|
5
|
+
//# sourceMappingURL=create-tui-telemetry-sink.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-tui-telemetry-sink.d.ts","sourceRoot":"","sources":["../../src/tui/create-tui-telemetry-sink.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAK5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,mFAAmF;AACnF,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,YAAY,GAAG,cAAc,CAgB9E"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { formatHarnessLogBody, formatObservationLogBody, } from '../session-log-lines.js';
|
|
2
|
+
/** TTY Ink 時: harness / observation を stderr ではなく Orchestration メインペインへ送る sink。 */
|
|
3
|
+
export function createTuiTelemetrySink(viewModel) {
|
|
4
|
+
return (event) => {
|
|
5
|
+
const harnessBody = formatHarnessLogBody(event);
|
|
6
|
+
if (harnessBody) {
|
|
7
|
+
viewModel.appendActivityLog('harness', harnessBody);
|
|
8
|
+
}
|
|
9
|
+
const observationBody = formatObservationLogBody(event);
|
|
10
|
+
if (observationBody) {
|
|
11
|
+
viewModel.appendActivityLog('observation', observationBody);
|
|
12
|
+
}
|
|
13
|
+
if (event.type === 'session.post_loop_wait') {
|
|
14
|
+
viewModel.setPostLoopWaiting(true);
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=create-tui-telemetry-sink.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-tui-telemetry-sink.js","sourceRoot":"","sources":["../../src/tui/create-tui-telemetry-sink.ts"],"names":[],"mappings":"AACA,OAAO,EACL,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,yBAAyB,CAAC;AAGjC,mFAAmF;AACnF,MAAM,UAAU,sBAAsB,CAAC,SAAuB;IAC5D,OAAO,CAAC,KAAK,EAAE,EAAE;QACf,MAAM,WAAW,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAChD,IAAI,WAAW,EAAE,CAAC;YAChB,SAAS,CAAC,iBAAiB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QACtD,CAAC;QAED,MAAM,eAAe,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;QACxD,IAAI,eAAe,EAAE,CAAC;YACpB,SAAS,CAAC,iBAAiB,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;QAC9D,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,KAAK,wBAAwB,EAAE,CAAC;YAC5C,SAAS,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACrC,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { OperatorInputContext } from '@agents-ensemble/core';
|
|
2
|
+
export interface OpenQuestionSelectionContext {
|
|
3
|
+
id: string;
|
|
4
|
+
index: number;
|
|
5
|
+
total: number;
|
|
6
|
+
}
|
|
7
|
+
/** 入力欄直上に表示するオペレータ向けコンテキスト行。 */
|
|
8
|
+
export declare function formatOperatorContextHint(context: OperatorInputContext | undefined, selection?: OpenQuestionSelectionContext): string;
|
|
9
|
+
//# sourceMappingURL=format-operator-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-operator-context.d.ts","sourceRoot":"","sources":["../../src/tui/format-operator-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAMlE,MAAM,WAAW,4BAA4B;IAC3C,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,gCAAgC;AAChC,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,oBAAoB,GAAG,SAAS,EACzC,SAAS,CAAC,EAAE,4BAA4B,GACvC,MAAM,CAaR"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
function formatMaxTurnsLabel(maxTurns) {
|
|
2
|
+
return maxTurns === null ? '∞' : String(maxTurns);
|
|
3
|
+
}
|
|
4
|
+
/** 入力欄直上に表示するオペレータ向けコンテキスト行。 */
|
|
5
|
+
export function formatOperatorContextHint(context, selection) {
|
|
6
|
+
if (!context) {
|
|
7
|
+
return 'operator> ';
|
|
8
|
+
}
|
|
9
|
+
if (context.openQuestions.length > 0) {
|
|
10
|
+
if (selection) {
|
|
11
|
+
return `${selection.id} (${selection.index + 1}/${selection.total}) への回答 — Shift+↑↓で選択 · Enter で送信`;
|
|
12
|
+
}
|
|
13
|
+
return 'open question あり — Shift+↑↓で選択して回答';
|
|
14
|
+
}
|
|
15
|
+
return `自律ターン ${context.autonomousTurns}/${formatMaxTurnsLabel(context.maxTurns)} — 任意のタイミングで入力(/exit で終了)`;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=format-operator-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-operator-context.js","sourceRoot":"","sources":["../../src/tui/format-operator-context.ts"],"names":[],"mappings":"AAEA,SAAS,mBAAmB,CAAC,QAAuB;IAClD,OAAO,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AACpD,CAAC;AAQD,gCAAgC;AAChC,MAAM,UAAU,yBAAyB,CACvC,OAAyC,EACzC,SAAwC;IAExC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrC,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,GAAG,SAAS,CAAC,EAAE,KAAK,SAAS,CAAC,KAAK,GAAG,CAAC,IAAI,SAAS,CAAC,KAAK,kCAAkC,CAAC;QACtG,CAAC;QACD,OAAO,oCAAoC,CAAC;IAC9C,CAAC;IAED,OAAO,SAAS,OAAO,CAAC,eAAe,IAAI,mBAAmB,CAAC,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAAC;AAC9G,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|