@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.
Files changed (149) hide show
  1. package/dist/async-operator-input.d.ts +6 -0
  2. package/dist/async-operator-input.d.ts.map +1 -0
  3. package/dist/async-operator-input.js +58 -0
  4. package/dist/async-operator-input.js.map +1 -0
  5. package/dist/display/create-session-display-sink.d.ts +9 -0
  6. package/dist/display/create-session-display-sink.d.ts.map +1 -0
  7. package/dist/display/create-session-display-sink.js +31 -0
  8. package/dist/display/create-session-display-sink.js.map +1 -0
  9. package/dist/display/select-session-display-backend.d.ts +11 -0
  10. package/dist/display/select-session-display-backend.d.ts.map +1 -0
  11. package/dist/display/select-session-display-backend.js +16 -0
  12. package/dist/display/select-session-display-backend.js.map +1 -0
  13. package/dist/display/session-display-backend.d.ts +7 -0
  14. package/dist/display/session-display-backend.d.ts.map +1 -0
  15. package/dist/display/session-display-backend.js +2 -0
  16. package/dist/display/session-display-backend.js.map +1 -0
  17. package/dist/display/session-display-reducer.d.ts +6 -0
  18. package/dist/display/session-display-reducer.d.ts.map +1 -0
  19. package/dist/display/session-display-reducer.js +74 -0
  20. package/dist/display/session-display-reducer.js.map +1 -0
  21. package/dist/display/session-display-state.d.ts +14 -0
  22. package/dist/display/session-display-state.d.ts.map +1 -0
  23. package/dist/display/session-display-state.js +6 -0
  24. package/dist/display/session-display-state.js.map +1 -0
  25. package/dist/display/string-session-display-backend.d.ts +8 -0
  26. package/dist/display/string-session-display-backend.d.ts.map +1 -0
  27. package/dist/display/string-session-display-backend.js +18 -0
  28. package/dist/display/string-session-display-backend.js.map +1 -0
  29. package/dist/display/stub-session-display-backend.d.ts +15 -0
  30. package/dist/display/stub-session-display-backend.d.ts.map +1 -0
  31. package/dist/display/stub-session-display-backend.js +17 -0
  32. package/dist/display/stub-session-display-backend.js.map +1 -0
  33. package/dist/format-models-list.d.ts +9 -0
  34. package/dist/format-models-list.d.ts.map +1 -0
  35. package/dist/format-models-list.js +17 -0
  36. package/dist/format-models-list.js.map +1 -0
  37. package/dist/format-session-summary.d.ts +4 -0
  38. package/dist/format-session-summary.d.ts.map +1 -0
  39. package/dist/format-session-summary.js +25 -0
  40. package/dist/format-session-summary.js.map +1 -0
  41. package/dist/index.d.ts +3 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +124 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/issue-command.d.ts +38 -0
  46. package/dist/issue-command.d.ts.map +1 -0
  47. package/dist/issue-command.js +117 -0
  48. package/dist/issue-command.js.map +1 -0
  49. package/dist/parse-worktree-mode.d.ts +4 -0
  50. package/dist/parse-worktree-mode.d.ts.map +1 -0
  51. package/dist/parse-worktree-mode.js +10 -0
  52. package/dist/parse-worktree-mode.js.map +1 -0
  53. package/dist/prompt-human-inquiry.d.ts +3 -0
  54. package/dist/prompt-human-inquiry.d.ts.map +1 -0
  55. package/dist/prompt-human-inquiry.js +29 -0
  56. package/dist/prompt-human-inquiry.js.map +1 -0
  57. package/dist/prompt-operator-input.d.ts +7 -0
  58. package/dist/prompt-operator-input.d.ts.map +1 -0
  59. package/dist/prompt-operator-input.js +51 -0
  60. package/dist/prompt-operator-input.js.map +1 -0
  61. package/dist/prompt-permission.d.ts +4 -0
  62. package/dist/prompt-permission.d.ts.map +1 -0
  63. package/dist/prompt-permission.js +8 -0
  64. package/dist/prompt-permission.js.map +1 -0
  65. package/dist/resolve-cli-max-turns.d.ts +8 -0
  66. package/dist/resolve-cli-max-turns.d.ts.map +1 -0
  67. package/dist/resolve-cli-max-turns.js +13 -0
  68. package/dist/resolve-cli-max-turns.js.map +1 -0
  69. package/dist/session-log-lines.d.ts +10 -0
  70. package/dist/session-log-lines.d.ts.map +1 -0
  71. package/dist/session-log-lines.js +121 -0
  72. package/dist/session-log-lines.js.map +1 -0
  73. package/dist/session-sinks.d.ts +20 -0
  74. package/dist/session-sinks.d.ts.map +1 -0
  75. package/dist/session-sinks.js +67 -0
  76. package/dist/session-sinks.js.map +1 -0
  77. package/dist/tui/activity-log.d.ts +32 -0
  78. package/dist/tui/activity-log.d.ts.map +1 -0
  79. package/dist/tui/activity-log.js +79 -0
  80. package/dist/tui/activity-log.js.map +1 -0
  81. package/dist/tui/compute-operator-input-cursor-y.d.ts +48 -0
  82. package/dist/tui/compute-operator-input-cursor-y.d.ts.map +1 -0
  83. package/dist/tui/compute-operator-input-cursor-y.js +52 -0
  84. package/dist/tui/compute-operator-input-cursor-y.js.map +1 -0
  85. package/dist/tui/create-issue-session-tui-host.d.ts +12 -0
  86. package/dist/tui/create-issue-session-tui-host.d.ts.map +1 -0
  87. package/dist/tui/create-issue-session-tui-host.js +88 -0
  88. package/dist/tui/create-issue-session-tui-host.js.map +1 -0
  89. package/dist/tui/create-issue-session-tui-host.test.d.ts +2 -0
  90. package/dist/tui/create-issue-session-tui-host.test.d.ts.map +1 -0
  91. package/dist/tui/create-issue-session-tui-host.test.js +133 -0
  92. package/dist/tui/create-issue-session-tui-host.test.js.map +1 -0
  93. package/dist/tui/create-tui-telemetry-sink.d.ts +5 -0
  94. package/dist/tui/create-tui-telemetry-sink.d.ts.map +1 -0
  95. package/dist/tui/create-tui-telemetry-sink.js +18 -0
  96. package/dist/tui/create-tui-telemetry-sink.js.map +1 -0
  97. package/dist/tui/format-operator-context.d.ts +9 -0
  98. package/dist/tui/format-operator-context.d.ts.map +1 -0
  99. package/dist/tui/format-operator-context.js +17 -0
  100. package/dist/tui/format-operator-context.js.map +1 -0
  101. package/dist/tui/ime-text-input.d.ts +31 -0
  102. package/dist/tui/ime-text-input.d.ts.map +1 -0
  103. package/dist/tui/ime-text-input.js +111 -0
  104. package/dist/tui/ime-text-input.js.map +1 -0
  105. package/dist/tui/ime-text-input.test.d.ts +2 -0
  106. package/dist/tui/ime-text-input.test.d.ts.map +1 -0
  107. package/dist/tui/ime-text-input.test.js +62 -0
  108. package/dist/tui/ime-text-input.test.js.map +1 -0
  109. package/dist/tui/ink-test-keys.d.ts +22 -0
  110. package/dist/tui/ink-test-keys.d.ts.map +1 -0
  111. package/dist/tui/ink-test-keys.js +26 -0
  112. package/dist/tui/ink-test-keys.js.map +1 -0
  113. package/dist/tui/issue-session-tui.d.ts +8 -0
  114. package/dist/tui/issue-session-tui.d.ts.map +1 -0
  115. package/dist/tui/issue-session-tui.js +201 -0
  116. package/dist/tui/issue-session-tui.js.map +1 -0
  117. package/dist/tui/issue-session-tui.test.d.ts +2 -0
  118. package/dist/tui/issue-session-tui.test.d.ts.map +1 -0
  119. package/dist/tui/issue-session-tui.test.js +529 -0
  120. package/dist/tui/issue-session-tui.test.js.map +1 -0
  121. package/dist/tui/open-questions-pane.d.ts +32 -0
  122. package/dist/tui/open-questions-pane.d.ts.map +1 -0
  123. package/dist/tui/open-questions-pane.js +101 -0
  124. package/dist/tui/open-questions-pane.js.map +1 -0
  125. package/dist/tui/operator-input-key-reducer.d.ts +36 -0
  126. package/dist/tui/operator-input-key-reducer.d.ts.map +1 -0
  127. package/dist/tui/operator-input-key-reducer.js +141 -0
  128. package/dist/tui/operator-input-key-reducer.js.map +1 -0
  129. package/dist/tui/operator-input-layout.d.ts +29 -0
  130. package/dist/tui/operator-input-layout.d.ts.map +1 -0
  131. package/dist/tui/operator-input-layout.js +120 -0
  132. package/dist/tui/operator-input-layout.js.map +1 -0
  133. package/dist/tui/orchestration-pane-frame.d.ts +9 -0
  134. package/dist/tui/orchestration-pane-frame.d.ts.map +1 -0
  135. package/dist/tui/orchestration-pane-frame.js +27 -0
  136. package/dist/tui/orchestration-pane-frame.js.map +1 -0
  137. package/dist/tui/tui-layout-constants.d.ts +48 -0
  138. package/dist/tui/tui-layout-constants.d.ts.map +1 -0
  139. package/dist/tui/tui-layout-constants.js +48 -0
  140. package/dist/tui/tui-layout-constants.js.map +1 -0
  141. package/dist/tui/tui-view-model.d.ts +20 -0
  142. package/dist/tui/tui-view-model.d.ts.map +1 -0
  143. package/dist/tui/tui-view-model.js +69 -0
  144. package/dist/tui/tui-view-model.js.map +1 -0
  145. package/dist/tui/wrap-text-to-width.d.ts +14 -0
  146. package/dist/tui/wrap-text-to-width.d.ts.map +1 -0
  147. package/dist/tui/wrap-text-to-width.js +55 -0
  148. package/dist/tui/wrap-text-to-width.js.map +1 -0
  149. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=session-display-backend.js.map
@@ -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":"AACA,OAAO,EACL,6BAA6B,GAG9B,MAAM,4BAA4B,CAAC;AAEpC,SAAS,eAAe,CACtB,KAA0B,EAC1B,IAAY,EACZ,IAAY,EACZ,MAA2B;IAE3B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,OAAO,EAAE,IAAI,KAAK,IAAI,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QACxD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO;QACL,GAAG,KAAK;QACR,OAAO,EAAE;YACP,GAAG,KAAK,CAAC,OAAO;YAChB,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;SACzB;KACF,CAAC;AACJ,CAAC;AAED,SAAS,2BAA2B,CAAC,OAAe;IAClD,OAAO,iBAAiB,OAAO,sBAAsB,CAAC;AACxD,CAAC;AAED,8CAA8C;AAC9C,MAAM,UAAU,kBAAkB,CAChC,KAA0B,EAC1B,KAAsB;IAEtB,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,+BAA+B;YAClC,OAAO,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACnE,KAAK,iCAAiC;YACpC,OAAO,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAChE,KAAK,8BAA8B;YACjC,OAAO,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAClE,KAAK,wBAAwB;YAC3B,OAAO,eAAe,CAAC,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;QACrE,KAAK,cAAc;YACjB,OAAO,eAAe,CACpB,KAAK,EACL,KAAK,CAAC,QAAQ,CAAC,IAAI,EACnB,KAAK,CAAC,QAAQ,CAAC,IAAI,EACnB,MAAM,CACP,CAAC;QACJ,KAAK,eAAe;YAClB,OAAO,eAAe,CACpB,KAAK,EACL,KAAK,CAAC,OAAO,CAAC,IAAI,EAClB,KAAK,CAAC,OAAO,CAAC,IAAI,EAClB,QAAQ,CACT,CAAC;QACJ,KAAK,gBAAgB,CAAC,CAAC,CAAC;YACtB,IAAI,SAAS,GAAG,eAAe,CAAC,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;YACzE,IAAI,KAAK,CAAC,MAAM,KAAK,UAAU,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;gBACxD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;gBACnC,IAAI,SAAS,CAAC,eAAe,KAAK,MAAM,EAAE,CAAC;oBACzC,OAAO,SAAS,CAAC;gBACnB,CAAC;gBACD,OAAO,EAAE,GAAG,SAAS,EAAE,eAAe,EAAE,MAAM,EAAE,CAAC;YACnD,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;gBAC7B,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,EAAE,OAAO,IAAI,eAAe,CAAC;gBACvD,MAAM,MAAM,GAAG,2BAA2B,CAAC,MAAM,CAAC,CAAC;gBACnD,IAAI,SAAS,CAAC,eAAe,KAAK,MAAM,EAAE,CAAC;oBACzC,OAAO,SAAS,CAAC;gBACnB,CAAC;gBACD,OAAO,EAAE,GAAG,SAAS,EAAE,eAAe,EAAE,MAAM,EAAE,CAAC;YACnD,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,KAAK,wBAAwB,CAAC,CAAC,CAAC;YAC9B,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBACrC,OAAO,KAAK,CAAC;YACf,CAAC;YACD,IAAI,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;gBAC9E,OAAO,KAAK,CAAC;YACf,CAAC;YACD,OAAO;gBACL,GAAG,KAAK;gBACR,aAAa,EAAE,CAAC,GAAG,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,QAAQ,CAAC;aACxD,CAAC;QACJ,CAAC;QACD,KAAK,qBAAqB;YACxB,OAAO;gBACL,GAAG,KAAK;gBACR,aAAa,EAAE,KAAK,CAAC,aAAa,CAAC,MAAM,CACvC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,KAAK,KAAK,CAAC,MAAM,CAAC,QAAQ,CAC1D;aACF,CAAC;QACJ;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAED,OAAO,EAAE,6BAA6B,EAAE,CAAC"}
@@ -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,6 @@
1
+ export const INITIAL_SESSION_DISPLAY_STATE = {
2
+ workers: {},
3
+ conductorOutput: null,
4
+ openQuestions: [],
5
+ };
6
+ //# sourceMappingURL=session-display-state.js.map
@@ -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,4 @@
1
+ import type { SessionSummary } from '@agents-ensemble/core';
2
+ /** CLI 終了時 JSON(e2e / スクリプト向け SessionSummary)。 */
3
+ export declare function formatIssueSessionSummaryJson(summary: SessionSummary): string;
4
+ //# sourceMappingURL=format-session-summary.d.ts.map
@@ -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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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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"}