@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,6 @@
|
|
|
1
|
+
import type { OperatorInputBindingApi } from '@agents-ensemble/core';
|
|
2
|
+
/** open question 追加時に TTY プロンプト直前の案内を更新する。 */
|
|
3
|
+
export declare function notifyOperatorInputReprompt(): void;
|
|
4
|
+
/** TTY 向け: 行入力を非ブロッキングで `submit` へ渡す。 */
|
|
5
|
+
export declare function bindAsyncOperatorInput(api: OperatorInputBindingApi): () => void;
|
|
6
|
+
//# sourceMappingURL=async-operator-input.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"async-operator-input.d.ts","sourceRoot":"","sources":["../src/async-operator-input.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,uBAAuB,EAAwB,MAAM,uBAAuB,CAAC;AAM3F,8CAA8C;AAC9C,wBAAgB,2BAA2B,IAAI,IAAI,CAElD;AAmBD,yCAAyC;AACzC,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,uBAAuB,GAAG,MAAM,IAAI,CA0C/E"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import * as readline from 'node:readline/promises';
|
|
2
|
+
import { stdin as input, stderr, stdout as output } from 'node:process';
|
|
3
|
+
const OPERATOR_MESSAGE_ENV = 'ENSEMBLE_OPERATOR_MESSAGE';
|
|
4
|
+
let activeReprompt;
|
|
5
|
+
/** open question 追加時に TTY プロンプト直前の案内を更新する。 */
|
|
6
|
+
export function notifyOperatorInputReprompt() {
|
|
7
|
+
activeReprompt?.();
|
|
8
|
+
}
|
|
9
|
+
function writeBeforePrompt(context) {
|
|
10
|
+
const { openQuestions } = context;
|
|
11
|
+
if (openQuestions.length === 0) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
stderr.write('\nオペレータの入力が必要です:\n');
|
|
15
|
+
stderr.write('未回答のオペレータ質問:\n');
|
|
16
|
+
for (const question of openQuestions) {
|
|
17
|
+
stderr.write(`- ${question.id} [${question.responseType}] ${question.question}\n`);
|
|
18
|
+
if (question.context) {
|
|
19
|
+
stderr.write(` ${question.context}\n`);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/** TTY 向け: 行入力を非ブロッキングで `submit` へ渡す。 */
|
|
24
|
+
export function bindAsyncOperatorInput(api) {
|
|
25
|
+
const fromEnv = process.env[OPERATOR_MESSAGE_ENV]?.trim();
|
|
26
|
+
if (fromEnv) {
|
|
27
|
+
api.submit(fromEnv);
|
|
28
|
+
return () => { };
|
|
29
|
+
}
|
|
30
|
+
if (!input.isTTY) {
|
|
31
|
+
return () => { };
|
|
32
|
+
}
|
|
33
|
+
stderr.write('\nオペレータ入力: 任意のタイミングで入力して Enter。conductor は継続します(/exit で終了)。\n');
|
|
34
|
+
const rl = readline.createInterface({ input, output, terminal: true });
|
|
35
|
+
rl.setPrompt('operator> ');
|
|
36
|
+
const showPrompt = () => {
|
|
37
|
+
writeBeforePrompt(api.getContext());
|
|
38
|
+
rl.prompt();
|
|
39
|
+
};
|
|
40
|
+
const onLine = (line) => {
|
|
41
|
+
const trimmed = line.trim();
|
|
42
|
+
if (trimmed) {
|
|
43
|
+
api.submit(trimmed);
|
|
44
|
+
}
|
|
45
|
+
showPrompt();
|
|
46
|
+
};
|
|
47
|
+
rl.on('line', onLine);
|
|
48
|
+
activeReprompt = showPrompt;
|
|
49
|
+
showPrompt();
|
|
50
|
+
return () => {
|
|
51
|
+
if (activeReprompt === showPrompt) {
|
|
52
|
+
activeReprompt = undefined;
|
|
53
|
+
}
|
|
54
|
+
rl.off('line', onLine);
|
|
55
|
+
rl.close();
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=async-operator-input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"async-operator-input.js","sourceRoot":"","sources":["../src/async-operator-input.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,KAAK,IAAI,KAAK,EAAE,MAAM,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,cAAc,CAAC;AAGxE,MAAM,oBAAoB,GAAG,2BAA2B,CAAC;AAEzD,IAAI,cAAwC,CAAC;AAE7C,8CAA8C;AAC9C,MAAM,UAAU,2BAA2B;IACzC,cAAc,EAAE,EAAE,CAAC;AACrB,CAAC;AAED,SAAS,iBAAiB,CAAC,OAA6B;IACtD,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC;IAClC,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO;IACT,CAAC;IACD,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACnC,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAC/B,KAAK,MAAM,QAAQ,IAAI,aAAa,EAAE,CAAC;QACrC,MAAM,CAAC,KAAK,CACV,KAAK,QAAQ,CAAC,EAAE,KAAK,QAAQ,CAAC,YAAY,KAAK,QAAQ,CAAC,QAAQ,IAAI,CACrE,CAAC;QACF,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACrB,MAAM,CAAC,KAAK,CAAC,KAAK,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;AACH,CAAC;AAED,yCAAyC;AACzC,MAAM,UAAU,sBAAsB,CAAC,GAA4B;IACjE,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE,IAAI,EAAE,CAAC;IAC1D,IAAI,OAAO,EAAE,CAAC;QACZ,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACpB,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACjB,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,CAAC,KAAK,CACV,+DAA+D,CAChE,CAAC;IAEF,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACvE,EAAE,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IAE3B,MAAM,UAAU,GAAG,GAAG,EAAE;QACtB,iBAAiB,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QACpC,EAAE,CAAC,MAAM,EAAE,CAAC;IACd,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,OAAO,EAAE,CAAC;YACZ,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACtB,CAAC;QACD,UAAU,EAAE,CAAC;IACf,CAAC,CAAC;IAEF,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtB,cAAc,GAAG,UAAU,CAAC;IAC5B,UAAU,EAAE,CAAC;IAEb,OAAO,GAAG,EAAE;QACV,IAAI,cAAc,KAAK,UAAU,EAAE,CAAC;YAClC,cAAc,GAAG,SAAS,CAAC;QAC7B,CAAC;QACD,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACvB,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { SessionLogSink } from '@agents-ensemble/core';
|
|
2
|
+
import type { SessionDisplayBackend } from './session-display-backend.js';
|
|
3
|
+
export interface CreateSessionDisplaySinkOptions {
|
|
4
|
+
backend: SessionDisplayBackend;
|
|
5
|
+
onOpenQuestionEnqueued?: () => void;
|
|
6
|
+
}
|
|
7
|
+
/** `SessionLogEvent` → reducer → `SessionDisplayBackend` の表示 sink。 */
|
|
8
|
+
export declare function createSessionDisplaySink(options: CreateSessionDisplaySinkOptions): SessionLogSink;
|
|
9
|
+
//# sourceMappingURL=create-session-display-sink.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-session-display-sink.d.ts","sourceRoot":"","sources":["../../src/display/create-session-display-sink.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAmB,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE7E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAG1E,MAAM,WAAW,+BAA+B;IAC9C,OAAO,EAAE,qBAAqB,CAAC;IAC/B,sBAAsB,CAAC,EAAE,MAAM,IAAI,CAAC;CACrC;AAiBD,sEAAsE;AACtE,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,+BAA+B,GACvC,cAAc,CAiBhB"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { reduceDisplayState } from './session-display-reducer.js';
|
|
2
|
+
import { INITIAL_SESSION_DISPLAY_STATE } from './session-display-state.js';
|
|
3
|
+
function shouldRender(event) {
|
|
4
|
+
return (event.type === 'operator.input' ||
|
|
5
|
+
event.type === 'conductor.send.started' ||
|
|
6
|
+
event.type === 'conductor.send' ||
|
|
7
|
+
event.type === 'harness.worker.prompt.started' ||
|
|
8
|
+
event.type === 'harness.worker.prompt.completed' ||
|
|
9
|
+
event.type === 'harness.worker.prompt.failed' ||
|
|
10
|
+
event.type === 'worker.round' ||
|
|
11
|
+
event.type === 'worker.failed' ||
|
|
12
|
+
event.type === 'open.question.enqueued' ||
|
|
13
|
+
event.type === 'escalation.recorded');
|
|
14
|
+
}
|
|
15
|
+
/** `SessionLogEvent` → reducer → `SessionDisplayBackend` の表示 sink。 */
|
|
16
|
+
export function createSessionDisplaySink(options) {
|
|
17
|
+
let state = INITIAL_SESSION_DISPLAY_STATE;
|
|
18
|
+
return (event) => {
|
|
19
|
+
const previousState = state;
|
|
20
|
+
const nextState = reduceDisplayState(state, event);
|
|
21
|
+
const stateChanged = nextState !== previousState;
|
|
22
|
+
state = nextState;
|
|
23
|
+
if (stateChanged || shouldRender(event)) {
|
|
24
|
+
options.backend.render(state, previousState, event);
|
|
25
|
+
}
|
|
26
|
+
if (event.type === 'open.question.enqueued') {
|
|
27
|
+
options.onOpenQuestionEnqueued?.();
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=create-session-display-sink.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-session-display-sink.js","sourceRoot":"","sources":["../../src/display/create-session-display-sink.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAElE,OAAO,EAAE,6BAA6B,EAAE,MAAM,4BAA4B,CAAC;AAO3E,SAAS,YAAY,CAAC,KAAsB;IAC1C,OAAO,CACL,KAAK,CAAC,IAAI,KAAK,gBAAgB;QAC/B,KAAK,CAAC,IAAI,KAAK,wBAAwB;QACvC,KAAK,CAAC,IAAI,KAAK,gBAAgB;QAC/B,KAAK,CAAC,IAAI,KAAK,+BAA+B;QAC9C,KAAK,CAAC,IAAI,KAAK,iCAAiC;QAChD,KAAK,CAAC,IAAI,KAAK,8BAA8B;QAC7C,KAAK,CAAC,IAAI,KAAK,cAAc;QAC7B,KAAK,CAAC,IAAI,KAAK,eAAe;QAC9B,KAAK,CAAC,IAAI,KAAK,wBAAwB;QACvC,KAAK,CAAC,IAAI,KAAK,qBAAqB,CACrC,CAAC;AACJ,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,wBAAwB,CACtC,OAAwC;IAExC,IAAI,KAAK,GAAG,6BAA6B,CAAC;IAE1C,OAAO,CAAC,KAAK,EAAE,EAAE;QACf,MAAM,aAAa,GAAG,KAAK,CAAC;QAC5B,MAAM,SAAS,GAAG,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACnD,MAAM,YAAY,GAAG,SAAS,KAAK,aAAa,CAAC;QACjD,KAAK,GAAG,SAAS,CAAC;QAElB,IAAI,YAAY,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;YACxC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;QACtD,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,KAAK,wBAAwB,EAAE,CAAC;YAC5C,OAAO,CAAC,sBAAsB,EAAE,EAAE,CAAC;QACrC,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { SessionDisplayBackend } from './session-display-backend.js';
|
|
2
|
+
import { createStringSessionDisplayBackend } from './string-session-display-backend.js';
|
|
3
|
+
import type { StringSessionDisplayBackendOptions } from './string-session-display-backend.js';
|
|
4
|
+
import { createStubSessionDisplayBackend } from './stub-session-display-backend.js';
|
|
5
|
+
export interface SelectSessionDisplayBackendOptions extends StringSessionDisplayBackendOptions {
|
|
6
|
+
interactive: boolean;
|
|
7
|
+
}
|
|
8
|
+
/** interactive / 非 TTY に応じて表示 backend を選ぶ。非 interactive は no-op(harness / observation のみ)。 */
|
|
9
|
+
export declare function selectSessionDisplayBackend(options: SelectSessionDisplayBackendOptions): SessionDisplayBackend;
|
|
10
|
+
export { createStubSessionDisplayBackend, createStringSessionDisplayBackend };
|
|
11
|
+
//# sourceMappingURL=select-session-display-backend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select-session-display-backend.d.ts","sourceRoot":"","sources":["../../src/display/select-session-display-backend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,iCAAiC,EAAE,MAAM,qCAAqC,CAAC;AACxF,OAAO,KAAK,EAAE,kCAAkC,EAAE,MAAM,qCAAqC,CAAC;AAC9F,OAAO,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAC;AAEpF,MAAM,WAAW,kCACf,SAAQ,kCAAkC;IAC1C,WAAW,EAAE,OAAO,CAAC;CACtB;AAMD,8FAA8F;AAC9F,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,kCAAkC,GAC1C,qBAAqB,CAOvB;AAED,OAAO,EAAE,+BAA+B,EAAE,iCAAiC,EAAE,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { createStringSessionDisplayBackend } from './string-session-display-backend.js';
|
|
2
|
+
import { createStubSessionDisplayBackend } from './stub-session-display-backend.js';
|
|
3
|
+
const noopBackend = {
|
|
4
|
+
render() { },
|
|
5
|
+
};
|
|
6
|
+
/** interactive / 非 TTY に応じて表示 backend を選ぶ。非 interactive は no-op(harness / observation のみ)。 */
|
|
7
|
+
export function selectSessionDisplayBackend(options) {
|
|
8
|
+
if (options.interactive) {
|
|
9
|
+
return createStringSessionDisplayBackend({
|
|
10
|
+
writeStdout: options.writeStdout,
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
return noopBackend;
|
|
14
|
+
}
|
|
15
|
+
export { createStubSessionDisplayBackend, createStringSessionDisplayBackend };
|
|
16
|
+
//# sourceMappingURL=select-session-display-backend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select-session-display-backend.js","sourceRoot":"","sources":["../../src/display/select-session-display-backend.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iCAAiC,EAAE,MAAM,qCAAqC,CAAC;AAExF,OAAO,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAC;AAOpF,MAAM,WAAW,GAA0B;IACzC,MAAM,KAAI,CAAC;CACZ,CAAC;AAEF,8FAA8F;AAC9F,MAAM,UAAU,2BAA2B,CACzC,OAA2C;IAE3C,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QACxB,OAAO,iCAAiC,CAAC;YACvC,WAAW,EAAE,OAAO,CAAC,WAAW;SACjC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,OAAO,EAAE,+BAA+B,EAAE,iCAAiC,EAAE,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { SessionLogEvent } from '@agents-ensemble/core';
|
|
2
|
+
import type { SessionDisplayState } from './session-display-state.js';
|
|
3
|
+
/** 表示 state を出力先へ反映する。harness テレメトリは state 外で別 sink が担当する。 */
|
|
4
|
+
export interface SessionDisplayBackend {
|
|
5
|
+
render(state: SessionDisplayState, previousState: SessionDisplayState, event: SessionLogEvent): void;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=session-display-backend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-display-backend.d.ts","sourceRoot":"","sources":["../../src/display/session-display-backend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,8DAA8D;AAC9D,MAAM,WAAW,qBAAqB;IACpC,MAAM,CACJ,KAAK,EAAE,mBAAmB,EAC1B,aAAa,EAAE,mBAAmB,EAClC,KAAK,EAAE,eAAe,GACrB,IAAI,CAAC;CACT"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-display-backend.js","sourceRoot":"","sources":["../../src/display/session-display-backend.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { SessionLogEvent } from '@agents-ensemble/core';
|
|
2
|
+
import { INITIAL_SESSION_DISPLAY_STATE, type SessionDisplayState } from './session-display-state.js';
|
|
3
|
+
/** `SessionLogEvent` から表示 state を純関数で更新する。 */
|
|
4
|
+
export declare function reduceDisplayState(state: SessionDisplayState, event: SessionLogEvent): SessionDisplayState;
|
|
5
|
+
export { INITIAL_SESSION_DISPLAY_STATE };
|
|
6
|
+
//# sourceMappingURL=session-display-reducer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-display-reducer.d.ts","sourceRoot":"","sources":["../../src/display/session-display-reducer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EACL,6BAA6B,EAC7B,KAAK,mBAAmB,EAEzB,MAAM,4BAA4B,CAAC;AA0BpC,8CAA8C;AAC9C,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,mBAAmB,EAC1B,KAAK,EAAE,eAAe,GACrB,mBAAmB,CAiErB;AAED,OAAO,EAAE,6BAA6B,EAAE,CAAC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { INITIAL_SESSION_DISPLAY_STATE, } from './session-display-state.js';
|
|
2
|
+
function setWorkerStatus(state, name, kind, status) {
|
|
3
|
+
const current = state.workers[name];
|
|
4
|
+
if (current?.kind === kind && current.status === status) {
|
|
5
|
+
return state;
|
|
6
|
+
}
|
|
7
|
+
return {
|
|
8
|
+
...state,
|
|
9
|
+
workers: {
|
|
10
|
+
...state.workers,
|
|
11
|
+
[name]: { kind, status },
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
function formatConductorErrorMessage(message) {
|
|
16
|
+
return `応答を生成できませんでした(${message})。\n別の聞き方で再入力してください。`;
|
|
17
|
+
}
|
|
18
|
+
/** `SessionLogEvent` から表示 state を純関数で更新する。 */
|
|
19
|
+
export function reduceDisplayState(state, event) {
|
|
20
|
+
switch (event.type) {
|
|
21
|
+
case 'harness.worker.prompt.started':
|
|
22
|
+
return setWorkerStatus(state, event.name, event.kind, 'running');
|
|
23
|
+
case 'harness.worker.prompt.completed':
|
|
24
|
+
return setWorkerStatus(state, event.name, event.kind, 'idle');
|
|
25
|
+
case 'harness.worker.prompt.failed':
|
|
26
|
+
return setWorkerStatus(state, event.name, event.kind, 'failed');
|
|
27
|
+
case 'conductor.send.started':
|
|
28
|
+
return setWorkerStatus(state, 'conductor', 'conductor', 'running');
|
|
29
|
+
case 'worker.round':
|
|
30
|
+
return setWorkerStatus(state, event.dispatch.name, event.dispatch.kind, 'idle');
|
|
31
|
+
case 'worker.failed':
|
|
32
|
+
return setWorkerStatus(state, event.failure.name, event.failure.kind, 'failed');
|
|
33
|
+
case 'conductor.send': {
|
|
34
|
+
let nextState = setWorkerStatus(state, 'conductor', 'conductor', 'idle');
|
|
35
|
+
if (event.status === 'finished' && event.result?.trim()) {
|
|
36
|
+
const output = event.result.trim();
|
|
37
|
+
if (nextState.conductorOutput === output) {
|
|
38
|
+
return nextState;
|
|
39
|
+
}
|
|
40
|
+
return { ...nextState, conductorOutput: output };
|
|
41
|
+
}
|
|
42
|
+
if (event.status === 'error') {
|
|
43
|
+
const detail = event.error?.message ?? 'unknown error';
|
|
44
|
+
const output = formatConductorErrorMessage(detail);
|
|
45
|
+
if (nextState.conductorOutput === output) {
|
|
46
|
+
return nextState;
|
|
47
|
+
}
|
|
48
|
+
return { ...nextState, conductorOutput: output };
|
|
49
|
+
}
|
|
50
|
+
return nextState;
|
|
51
|
+
}
|
|
52
|
+
case 'open.question.enqueued': {
|
|
53
|
+
if (event.question.status !== 'open') {
|
|
54
|
+
return state;
|
|
55
|
+
}
|
|
56
|
+
if (state.openQuestions.some((question) => question.id === event.question.id)) {
|
|
57
|
+
return state;
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
...state,
|
|
61
|
+
openQuestions: [...state.openQuestions, event.question],
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
case 'escalation.recorded':
|
|
65
|
+
return {
|
|
66
|
+
...state,
|
|
67
|
+
openQuestions: state.openQuestions.filter((question) => question.question !== event.record.question),
|
|
68
|
+
};
|
|
69
|
+
default:
|
|
70
|
+
return state;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
export { INITIAL_SESSION_DISPLAY_STATE };
|
|
74
|
+
//# sourceMappingURL=session-display-reducer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-display-reducer.js","sourceRoot":"","sources":["../../src/display/session-display-reducer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { OpenQuestion } from '@agents-ensemble/core';
|
|
2
|
+
export type WorkerDisplayStatus = 'idle' | 'running' | 'failed';
|
|
3
|
+
export interface WorkerDisplayState {
|
|
4
|
+
kind: string;
|
|
5
|
+
status: WorkerDisplayStatus;
|
|
6
|
+
}
|
|
7
|
+
/** #54 最小 UI の表示ペイン用 state(入力欄は含めない)。 */
|
|
8
|
+
export interface SessionDisplayState {
|
|
9
|
+
workers: Record<string, WorkerDisplayState>;
|
|
10
|
+
conductorOutput: string | null;
|
|
11
|
+
openQuestions: OpenQuestion[];
|
|
12
|
+
}
|
|
13
|
+
export declare const INITIAL_SESSION_DISPLAY_STATE: SessionDisplayState;
|
|
14
|
+
//# sourceMappingURL=session-display-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-display-state.d.ts","sourceRoot":"","sources":["../../src/display/session-display-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEhE,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,mBAAmB,CAAC;CAC7B;AAED,yCAAyC;AACzC,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAC5C,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,aAAa,EAAE,YAAY,EAAE,CAAC;CAC/B;AAED,eAAO,MAAM,6BAA6B,EAAE,mBAI3C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-display-state.js","sourceRoot":"","sources":["../../src/display/session-display-state.ts"],"names":[],"mappings":"AAgBA,MAAM,CAAC,MAAM,6BAA6B,GAAwB;IAChE,OAAO,EAAE,EAAE;IACX,eAAe,EAAE,IAAI;IACrB,aAAa,EAAE,EAAE;CAClB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { SessionDisplayBackend } from './session-display-backend.js';
|
|
2
|
+
export interface StringSessionDisplayBackendOptions {
|
|
3
|
+
/** デフォルト: `process.stdout.write` */
|
|
4
|
+
writeStdout?: (text: string) => void;
|
|
5
|
+
}
|
|
6
|
+
/** TTY 向け: `createDialogueSink` で stdout 対話を出力。state は TUI 用に reducer が更新する。 */
|
|
7
|
+
export declare function createStringSessionDisplayBackend(options?: StringSessionDisplayBackendOptions): SessionDisplayBackend;
|
|
8
|
+
//# sourceMappingURL=string-session-display-backend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"string-session-display-backend.d.ts","sourceRoot":"","sources":["../../src/display/string-session-display-backend.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAE1E,MAAM,WAAW,kCAAkC;IACjD,oCAAoC;IACpC,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC;AAQD,gFAAgF;AAChF,wBAAgB,iCAAiC,CAC/C,OAAO,GAAE,kCAAuC,GAC/C,qBAAqB,CAWvB"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { stdout } from 'node:process';
|
|
2
|
+
import { createDialogueSink } from '../session-sinks.js';
|
|
3
|
+
function isDialogueEvent(event) {
|
|
4
|
+
return event.type === 'operator.input' || event.type === 'conductor.send';
|
|
5
|
+
}
|
|
6
|
+
/** TTY 向け: `createDialogueSink` で stdout 対話を出力。state は TUI 用に reducer が更新する。 */
|
|
7
|
+
export function createStringSessionDisplayBackend(options = {}) {
|
|
8
|
+
const writeStdout = options.writeStdout ?? ((text) => stdout.write(text));
|
|
9
|
+
const dialogueSink = createDialogueSink({ writeStdout });
|
|
10
|
+
return {
|
|
11
|
+
render(_state, _previousState, event) {
|
|
12
|
+
if (isDialogueEvent(event)) {
|
|
13
|
+
dialogueSink(event);
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=string-session-display-backend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"string-session-display-backend.js","sourceRoot":"","sources":["../../src/display/string-session-display-backend.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAQzD,SAAS,eAAe,CACtB,KAAsB;IAEtB,OAAO,KAAK,CAAC,IAAI,KAAK,gBAAgB,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,CAAC;AAC5E,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,iCAAiC,CAC/C,UAA8C,EAAE;IAEhD,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1E,MAAM,YAAY,GAAG,kBAAkB,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;IAEzD,OAAO;QACL,MAAM,CAAC,MAAM,EAAE,cAAc,EAAE,KAAK;YAClC,IAAI,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3B,YAAY,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { SessionLogEvent } from '@agents-ensemble/core';
|
|
2
|
+
import type { SessionDisplayBackend } from './session-display-backend.js';
|
|
3
|
+
import type { SessionDisplayState } from './session-display-state.js';
|
|
4
|
+
export interface StubSessionDisplayBackend {
|
|
5
|
+
backend: SessionDisplayBackend;
|
|
6
|
+
getState(): SessionDisplayState;
|
|
7
|
+
getRenders(): Array<{
|
|
8
|
+
state: SessionDisplayState;
|
|
9
|
+
previousState: SessionDisplayState;
|
|
10
|
+
event: SessionLogEvent;
|
|
11
|
+
}>;
|
|
12
|
+
}
|
|
13
|
+
/** テスト用: `render` 呼び出しと最終 state を記録する。 */
|
|
14
|
+
export declare function createStubSessionDisplayBackend(): StubSessionDisplayBackend;
|
|
15
|
+
//# sourceMappingURL=stub-session-display-backend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stub-session-display-backend.d.ts","sourceRoot":"","sources":["../../src/display/stub-session-display-backend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAGtE,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,qBAAqB,CAAC;IAC/B,QAAQ,IAAI,mBAAmB,CAAC;IAChC,UAAU,IAAI,KAAK,CAAC;QAClB,KAAK,EAAE,mBAAmB,CAAC;QAC3B,aAAa,EAAE,mBAAmB,CAAC;QACnC,KAAK,EAAE,eAAe,CAAC;KACxB,CAAC,CAAC;CACJ;AAED,0CAA0C;AAC1C,wBAAgB,+BAA+B,IAAI,yBAAyB,CAgB3E"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { INITIAL_SESSION_DISPLAY_STATE } from './session-display-state.js';
|
|
2
|
+
/** テスト用: `render` 呼び出しと最終 state を記録する。 */
|
|
3
|
+
export function createStubSessionDisplayBackend() {
|
|
4
|
+
let state = INITIAL_SESSION_DISPLAY_STATE;
|
|
5
|
+
const renders = [];
|
|
6
|
+
return {
|
|
7
|
+
backend: {
|
|
8
|
+
render(nextState, previousState, event) {
|
|
9
|
+
renders.push({ state: nextState, previousState, event });
|
|
10
|
+
state = nextState;
|
|
11
|
+
},
|
|
12
|
+
},
|
|
13
|
+
getState: () => state,
|
|
14
|
+
getRenders: () => [...renders],
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=stub-session-display-backend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stub-session-display-backend.js","sourceRoot":"","sources":["../../src/display/stub-session-display-backend.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,6BAA6B,EAAE,MAAM,4BAA4B,CAAC;AAY3E,0CAA0C;AAC1C,MAAM,UAAU,+BAA+B;IAC7C,IAAI,KAAK,GAAG,6BAA6B,CAAC;IAC1C,MAAM,OAAO,GAED,EAAE,CAAC;IAEf,OAAO;QACL,OAAO,EAAE;YACP,MAAM,CAAC,SAAS,EAAE,aAAa,EAAE,KAAK;gBACpC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC;gBACzD,KAAK,GAAG,SAAS,CAAC;YACpB,CAAC;SACF;QACD,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK;QACrB,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC;KAC/B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface ModelsListEntry {
|
|
2
|
+
id: string;
|
|
3
|
+
displayName: string;
|
|
4
|
+
description?: string;
|
|
5
|
+
aliases?: string[];
|
|
6
|
+
}
|
|
7
|
+
export declare function formatModelsListText(models: ModelsListEntry[]): string;
|
|
8
|
+
export declare function formatModelsListJson(models: ModelsListEntry[]): string;
|
|
9
|
+
//# sourceMappingURL=format-models-list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-models-list.d.ts","sourceRoot":"","sources":["../src/format-models-list.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,CAUtE;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,CAWtE"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export function formatModelsListText(models) {
|
|
2
|
+
if (models.length === 0) {
|
|
3
|
+
return '(利用可能なモデルはありません)';
|
|
4
|
+
}
|
|
5
|
+
const idWidth = Math.max(2, ...models.map((model) => model.id.length));
|
|
6
|
+
const lines = models.map((model) => `${model.id.padEnd(idWidth)} ${model.displayName}`);
|
|
7
|
+
return lines.join('\n');
|
|
8
|
+
}
|
|
9
|
+
export function formatModelsListJson(models) {
|
|
10
|
+
return JSON.stringify(models.map((model) => ({
|
|
11
|
+
id: model.id,
|
|
12
|
+
displayName: model.displayName,
|
|
13
|
+
...(model.description ? { description: model.description } : {}),
|
|
14
|
+
...(model.aliases?.length ? { aliases: model.aliases } : {}),
|
|
15
|
+
})), null, 2);
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=format-models-list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-models-list.js","sourceRoot":"","sources":["../src/format-models-list.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,oBAAoB,CAAC,MAAyB;IAC5D,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IACvE,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CACtB,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,KAAK,CAAC,WAAW,EAAE,CAC/D,CAAC;IACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAyB;IAC5D,OAAO,IAAI,CAAC,SAAS,CACnB,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACrB,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC7D,CAAC,CAAC,EACH,IAAI,EACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-session-summary.d.ts","sourceRoot":"","sources":["../src/format-session-summary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,kDAAkD;AAClD,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CA0B7E"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/** CLI 終了時 JSON(e2e / スクリプト向け SessionSummary)。 */
|
|
2
|
+
export function formatIssueSessionSummaryJson(summary) {
|
|
3
|
+
return JSON.stringify({
|
|
4
|
+
agentId: summary.agentId,
|
|
5
|
+
issueUrl: summary.issueUrl,
|
|
6
|
+
repoRoot: summary.repoRoot,
|
|
7
|
+
sendCount: summary.sendCount,
|
|
8
|
+
stopReason: summary.stopReason,
|
|
9
|
+
lastRunStatus: summary.lastRunStatus,
|
|
10
|
+
lastResult: summary.lastResult,
|
|
11
|
+
lastError: summary.lastError,
|
|
12
|
+
workerDispatchCount: summary.workerDispatches.length,
|
|
13
|
+
workerFailureCount: summary.workerFailures.length,
|
|
14
|
+
escalationCount: summary.escalations.length,
|
|
15
|
+
openQuestionCount: summary.openQuestions.length,
|
|
16
|
+
workerResponses: summary.workerDispatches.map((dispatch) => ({
|
|
17
|
+
name: dispatch.name,
|
|
18
|
+
kind: dispatch.kind,
|
|
19
|
+
source: dispatch.source ?? 'conductor',
|
|
20
|
+
responseText: dispatch.promptResult.responseText,
|
|
21
|
+
stopReason: dispatch.promptResult.stopReason,
|
|
22
|
+
})),
|
|
23
|
+
}, null, 2);
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=format-session-summary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-session-summary.js","sourceRoot":"","sources":["../src/format-session-summary.ts"],"names":[],"mappings":"AAEA,kDAAkD;AAClD,MAAM,UAAU,6BAA6B,CAAC,OAAuB;IACnE,OAAO,IAAI,CAAC,SAAS,CACnB;QACE,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,mBAAmB,EAAE,OAAO,CAAC,gBAAgB,CAAC,MAAM;QACpD,kBAAkB,EAAE,OAAO,CAAC,cAAc,CAAC,MAAM;QACjD,eAAe,EAAE,OAAO,CAAC,WAAW,CAAC,MAAM;QAC3C,iBAAiB,EAAE,OAAO,CAAC,aAAa,CAAC,MAAM;QAC/C,eAAe,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAC3D,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,MAAM,EAAE,QAAQ,CAAC,MAAM,IAAI,WAAW;YACtC,YAAY,EAAE,QAAQ,CAAC,YAAY,CAAC,YAAY;YAChD,UAAU,EAAE,QAAQ,CAAC,YAAY,CAAC,UAAU;SAC7C,CAAC,CAAC;KACJ,EACD,IAAI,EACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
import { Command } from 'commander';
|
|
4
|
+
import { getConductorAuthStatus, listConductorModels, loginConductor, logoutConductor, resolveIssueUrl, } from '@agents-ensemble/core';
|
|
5
|
+
import { executeIssueCommand } from './issue-command.js';
|
|
6
|
+
import { formatModelsListJson, formatModelsListText } from './format-models-list.js';
|
|
7
|
+
import { formatIssueSessionSummaryJson } from './format-session-summary.js';
|
|
8
|
+
const program = new Command();
|
|
9
|
+
program
|
|
10
|
+
.name('ensemble')
|
|
11
|
+
.description('Issue-based agent orchestration')
|
|
12
|
+
.version('0.0.0');
|
|
13
|
+
program
|
|
14
|
+
.command('issue')
|
|
15
|
+
.description('Start conductor orchestration for a GitHub Issue')
|
|
16
|
+
.argument('<issue-url>', 'GitHub Issue URL or number (e.g. 31, #31)')
|
|
17
|
+
.option('--repo-root <path>', 'Path to the local git clone for worker worktrees', process.cwd())
|
|
18
|
+
.option('--conductor-cwd <path>', 'Workspace for the conductor SDK agent', process.cwd())
|
|
19
|
+
.option('--resume <agentId>', 'Resume a previous conductor agent')
|
|
20
|
+
.option('--continue', 'Resume the latest session for this issue (uses sidecar with newest updatedAt)')
|
|
21
|
+
.option('--profile <name>', 'Profile name or path (default: bundled default; name resolves bundled then cwd profiles/<name>/)')
|
|
22
|
+
.option('--model <id>', 'Conductor model id (default: default)')
|
|
23
|
+
.option('--max-turns <n>', 'Maximum conductor autonomous turns (0 = unlimited; default: unlimited on TTY, 5 otherwise)', (value) => Number.parseInt(value, 10))
|
|
24
|
+
.option('--no-max-turns', 'Disable autonomous turn limit')
|
|
25
|
+
.option('--no-wait', 'Exit immediately when the autonomous loop completes (TTY default: wait for /exit)')
|
|
26
|
+
.option('--worktree <mode>', 'Worker workspace: isolated (default, per-issue worktree) or in-repo (main worktree)', 'isolated')
|
|
27
|
+
.option('--no-github-monitor', 'Disable GitHub Issue / PR update monitoring')
|
|
28
|
+
.option('--github-monitor-debounce-ms <n>', 'Debounce interval for GitHub update notifications (default: 30000)', (value) => Number.parseInt(value, 10))
|
|
29
|
+
.action(async (issueRef, options) => {
|
|
30
|
+
try {
|
|
31
|
+
const repoRoot = resolve(options.repoRoot);
|
|
32
|
+
const issueUrl = await resolveIssueUrl(issueRef, repoRoot);
|
|
33
|
+
const result = await executeIssueCommand(issueUrl, options);
|
|
34
|
+
console.log(formatIssueSessionSummaryJson(result));
|
|
35
|
+
if (result.stopReason === 'error') {
|
|
36
|
+
process.exit(2);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
console.error(error instanceof Error ? error.message : error);
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
const auth = program.command('auth').description('Conductor (SDK) authentication');
|
|
45
|
+
auth
|
|
46
|
+
.command('login')
|
|
47
|
+
.description('Browser login for conductor. Stores credentials in ~/.cursor/sdk/auth.json')
|
|
48
|
+
.action(async () => {
|
|
49
|
+
try {
|
|
50
|
+
const result = await loginConductor();
|
|
51
|
+
const who = result.email ?? 'unknown';
|
|
52
|
+
console.log(`Logged in as ${who}`);
|
|
53
|
+
console.log(`API key expires: ${new Date(result.apiKeyExpiresAtMs).toISOString()}`);
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
console.error(error instanceof Error ? error.message : error);
|
|
57
|
+
process.exit(1);
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
auth
|
|
61
|
+
.command('logout')
|
|
62
|
+
.description('Clear stored conductor (SDK) credentials from ~/.cursor/sdk/auth.json')
|
|
63
|
+
.action(async () => {
|
|
64
|
+
try {
|
|
65
|
+
await logoutConductor();
|
|
66
|
+
console.log('SDK: logged out');
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
console.error(error instanceof Error ? error.message : error);
|
|
70
|
+
process.exit(1);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
auth
|
|
74
|
+
.command('status')
|
|
75
|
+
.description('Show conductor (SDK) authentication status')
|
|
76
|
+
.action(async () => {
|
|
77
|
+
try {
|
|
78
|
+
const status = await getConductorAuthStatus();
|
|
79
|
+
if (status.status === 'logged-in') {
|
|
80
|
+
const who = status.email ?? 'unknown';
|
|
81
|
+
const expires = status.apiKeyExpiresAtMs
|
|
82
|
+
? new Date(status.apiKeyExpiresAtMs).toISOString()
|
|
83
|
+
: 'unknown';
|
|
84
|
+
console.log(`SDK: logged in as ${who} (expires ${expires})`);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
console.log('SDK: logged out');
|
|
88
|
+
}
|
|
89
|
+
if (process.env.CURSOR_API_KEY) {
|
|
90
|
+
console.log('CURSOR_API_KEY: set');
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
console.log('CURSOR_API_KEY: unset');
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
console.error(error instanceof Error ? error.message : error);
|
|
98
|
+
process.exit(1);
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
const models = program
|
|
102
|
+
.command('models')
|
|
103
|
+
.description('Conductor (SDK) model catalog');
|
|
104
|
+
models
|
|
105
|
+
.command('list')
|
|
106
|
+
.description('List models available to the authenticated conductor account')
|
|
107
|
+
.option('--json', 'Output JSON')
|
|
108
|
+
.action(async (options) => {
|
|
109
|
+
try {
|
|
110
|
+
const catalog = await listConductorModels();
|
|
111
|
+
if (options.json) {
|
|
112
|
+
console.log(formatModelsListJson(catalog));
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
console.log(formatModelsListText(catalog));
|
|
116
|
+
console.error('\n注: 一覧は API カタログです。team 設定で実行時にブロックされる場合があります。');
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
console.error(error instanceof Error ? error.message : error);
|
|
120
|
+
process.exit(1);
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
program.parse();
|
|
124
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|