@agents-ensemble/cli 0.0.0 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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,38 @@
1
+ import { findLatestSessionSidecarForIssue, loadProfile, runIssueSession, SessionLogger, type ConductorSessionResult } from '@agents-ensemble/core';
2
+ import { isOperatorInputInteractive, isOperatorInputTty } from './prompt-operator-input.js';
3
+ export interface IssueCommandOptions {
4
+ repoRoot: string;
5
+ conductorCwd: string;
6
+ resume?: string;
7
+ continue?: boolean;
8
+ profile?: string;
9
+ model?: string;
10
+ maxTurns?: number;
11
+ noMaxTurns?: boolean;
12
+ noWait?: boolean;
13
+ worktree: string;
14
+ /** commander の `--no-github-monitor` 用。false で監視無効。 */
15
+ githubMonitor?: boolean;
16
+ githubMonitorDebounceMs?: number;
17
+ }
18
+ export interface IssueCommandDeps {
19
+ isOperatorInputInteractive?: typeof isOperatorInputInteractive;
20
+ isOperatorInputTty?: typeof isOperatorInputTty;
21
+ runIssueSession?: typeof runIssueSession;
22
+ loadProfile?: typeof loadProfile;
23
+ SessionLogger?: typeof SessionLogger;
24
+ findLatestSessionSidecarForIssue?: typeof findLatestSessionSidecarForIssue;
25
+ }
26
+ export interface ResolveResumeAgentIdResult {
27
+ resumeAgentId?: string;
28
+ continuedFromSidecar?: string;
29
+ }
30
+ /** `--resume` / `--continue` から `runIssueSession` に渡す `resumeAgentId` を解決する。 */
31
+ export declare function resolveResumeAgentIdFromOptions(options: Pick<IssueCommandOptions, 'resume' | 'continue'>, context: {
32
+ issueUrl: string;
33
+ repoRoot: string;
34
+ }, deps?: Pick<IssueCommandDeps, 'findLatestSessionSidecarForIssue'>): Promise<ResolveResumeAgentIdResult>;
35
+ /** `ensemble issue` の CLI オプションから `runIssueSession` に渡す `maxTurns` を決定する。 */
36
+ export declare function resolveIssueSessionMaxTurns(options: Pick<IssueCommandOptions, 'maxTurns' | 'noMaxTurns'>, interactive: boolean): number;
37
+ export declare function executeIssueCommand(issueUrl: string, options: IssueCommandOptions, deps?: IssueCommandDeps): Promise<ConductorSessionResult>;
38
+ //# sourceMappingURL=issue-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue-command.d.ts","sourceRoot":"","sources":["../src/issue-command.ts"],"names":[],"mappings":"AACA,OAAO,EACL,gCAAgC,EAChC,WAAW,EAEX,eAAe,EACf,aAAa,EACb,KAAK,sBAAsB,EAC5B,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,0BAA0B,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAQ5F,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,uBAAuB,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,gBAAgB;IAC/B,0BAA0B,CAAC,EAAE,OAAO,0BAA0B,CAAC;IAC/D,kBAAkB,CAAC,EAAE,OAAO,kBAAkB,CAAC;IAC/C,eAAe,CAAC,EAAE,OAAO,eAAe,CAAC;IACzC,WAAW,CAAC,EAAE,OAAO,WAAW,CAAC;IACjC,aAAa,CAAC,EAAE,OAAO,aAAa,CAAC;IACrC,gCAAgC,CAAC,EAAE,OAAO,gCAAgC,CAAC;CAC5E;AAED,MAAM,WAAW,0BAA0B;IACzC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,gFAAgF;AAChF,wBAAsB,+BAA+B,CACnD,OAAO,EAAE,IAAI,CAAC,mBAAmB,EAAE,QAAQ,GAAG,UAAU,CAAC,EACzD,OAAO,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,EAC/C,IAAI,GAAE,IAAI,CAAC,gBAAgB,EAAE,kCAAkC,CAAM,GACpE,OAAO,CAAC,0BAA0B,CAAC,CA2BrC;AAED,6EAA6E;AAC7E,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,IAAI,CAAC,mBAAmB,EAAE,UAAU,GAAG,YAAY,CAAC,EAC7D,WAAW,EAAE,OAAO,GACnB,MAAM,CAMR;AAED,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,mBAAmB,EAC5B,IAAI,GAAE,gBAAqB,GAC1B,OAAO,CAAC,sBAAsB,CAAC,CAmFjC"}
@@ -0,0 +1,117 @@
1
+ import { resolve } from 'node:path';
2
+ import { findLatestSessionSidecarForIssue, loadProfile, resolveConductorModelId, runIssueSession, SessionLogger, } from '@agents-ensemble/core';
3
+ import { bindAsyncOperatorInput, notifyOperatorInputReprompt } from './async-operator-input.js';
4
+ import { isOperatorInputInteractive, isOperatorInputTty } from './prompt-operator-input.js';
5
+ import { parseWorktreeMode } from './parse-worktree-mode.js';
6
+ import { resolveCliMaxTurns } from './resolve-cli-max-turns.js';
7
+ import { createSessionDisplaySink } from './display/create-session-display-sink.js';
8
+ import { selectSessionDisplayBackend } from './display/select-session-display-backend.js';
9
+ import { createHarnessSink, createObservationSink } from './session-sinks.js';
10
+ import { createIssueSessionTuiHost } from './tui/create-issue-session-tui-host.js';
11
+ /** `--resume` / `--continue` から `runIssueSession` に渡す `resumeAgentId` を解決する。 */
12
+ export async function resolveResumeAgentIdFromOptions(options, context, deps = {}) {
13
+ if (options.resume && options.continue) {
14
+ throw new Error('Cannot use --continue and --resume together');
15
+ }
16
+ if (options.resume) {
17
+ return { resumeAgentId: options.resume };
18
+ }
19
+ if (!options.continue) {
20
+ return {};
21
+ }
22
+ const findLatest = deps.findLatestSessionSidecarForIssue ?? findLatestSessionSidecarForIssue;
23
+ const sidecar = await findLatest({
24
+ repoRoot: context.repoRoot,
25
+ issueUrl: context.issueUrl,
26
+ });
27
+ if (!sidecar) {
28
+ throw new Error(`No session sidecar found for issue ${context.issueUrl}. Start a new session without --continue.`);
29
+ }
30
+ return {
31
+ resumeAgentId: sidecar.conductorAgentId,
32
+ continuedFromSidecar: sidecar.conductorAgentId,
33
+ };
34
+ }
35
+ /** `ensemble issue` の CLI オプションから `runIssueSession` に渡す `maxTurns` を決定する。 */
36
+ export function resolveIssueSessionMaxTurns(options, interactive) {
37
+ return resolveCliMaxTurns({
38
+ interactive,
39
+ noMaxTurns: options.noMaxTurns,
40
+ maxTurns: options.maxTurns,
41
+ });
42
+ }
43
+ export async function executeIssueCommand(issueUrl, options, deps = {}) {
44
+ const isInteractive = deps.isOperatorInputInteractive ?? isOperatorInputInteractive;
45
+ const isTty = deps.isOperatorInputTty ?? isOperatorInputTty;
46
+ const runSession = deps.runIssueSession ?? runIssueSession;
47
+ const loadProfileFn = deps.loadProfile ?? loadProfile;
48
+ const SessionLoggerCtor = deps.SessionLogger ?? SessionLogger;
49
+ const workerWorktreeMode = parseWorktreeMode(options.worktree);
50
+ const { profile, profilePath } = await loadProfileFn({
51
+ profile: options.profile,
52
+ cwd: resolve(options.repoRoot),
53
+ });
54
+ const repoRoot = resolve(options.repoRoot);
55
+ const { resumeAgentId, continuedFromSidecar } = await resolveResumeAgentIdFromOptions(options, { issueUrl, repoRoot }, deps);
56
+ const interactive = isInteractive();
57
+ const useTui = interactive && isTty();
58
+ const tuiHost = useTui ? createIssueSessionTuiHost() : undefined;
59
+ const sessionLogger = new SessionLoggerCtor({ issueUrl, repoRoot });
60
+ if (useTui) {
61
+ sessionLogger.subscribe(tuiHost.telemetrySink);
62
+ }
63
+ else {
64
+ sessionLogger.subscribe(createHarnessSink());
65
+ sessionLogger.subscribe(createObservationSink());
66
+ }
67
+ sessionLogger.subscribe(createSessionDisplaySink({
68
+ backend: tuiHost?.displayBackend ??
69
+ selectSessionDisplayBackend({ interactive: interactive && !useTui }),
70
+ onOpenQuestionEnqueued: tuiHost?.notifyReprompt ?? notifyOperatorInputReprompt,
71
+ }));
72
+ if (workerWorktreeMode === 'in_repo') {
73
+ sessionLogger.emit({ type: 'session.worktree.notice', mode: workerWorktreeMode });
74
+ }
75
+ if (continuedFromSidecar) {
76
+ sessionLogger.emit({
77
+ type: 'session.continue',
78
+ conductorAgentId: continuedFromSidecar,
79
+ });
80
+ }
81
+ const maxTurns = resolveIssueSessionMaxTurns(options, interactive);
82
+ try {
83
+ return await runSession({
84
+ issueUrl,
85
+ repoRoot,
86
+ conductorCwd: resolve(options.conductorCwd),
87
+ resumeAgentId,
88
+ profile,
89
+ profilePath,
90
+ modelId: resolveConductorModelId(options.model),
91
+ maxTurns,
92
+ workerWorktreeMode,
93
+ sessionLogger,
94
+ ...(options.githubMonitor === false
95
+ ? { disableGitHubMonitor: true }
96
+ : {}),
97
+ ...(options.githubMonitorDebounceMs !== undefined
98
+ ? { githubMonitorDebounceMs: options.githubMonitorDebounceMs }
99
+ : {}),
100
+ ...(interactive
101
+ ? {
102
+ bindOperatorInput: tuiHost?.bindOperatorInput ?? bindAsyncOperatorInput,
103
+ continueOnConductorError: true,
104
+ ...(isTty() && !options.noWait
105
+ ? {
106
+ waitForOperatorExit: true,
107
+ }
108
+ : {}),
109
+ }
110
+ : {}),
111
+ });
112
+ }
113
+ finally {
114
+ tuiHost?.dispose();
115
+ }
116
+ }
117
+ //# sourceMappingURL=issue-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue-command.js","sourceRoot":"","sources":["../src/issue-command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { WorkerWorktreeMode } from '@agents-ensemble/core';
2
+ /** CLI `--worktree` 引数を `WorkerWorktreeMode` に変換する。 */
3
+ export declare function parseWorktreeMode(value: string): WorkerWorktreeMode;
4
+ //# sourceMappingURL=parse-worktree-mode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-worktree-mode.d.ts","sourceRoot":"","sources":["../src/parse-worktree-mode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,uDAAuD;AACvD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,kBAAkB,CAOnE"}
@@ -0,0 +1,10 @@
1
+ /** CLI `--worktree` 引数を `WorkerWorktreeMode` に変換する。 */
2
+ export function parseWorktreeMode(value) {
3
+ const normalized = value.trim().toLowerCase().replace(/_/g, '-');
4
+ if (normalized === 'isolated')
5
+ return 'isolated';
6
+ if (normalized === 'in-repo')
7
+ return 'in_repo';
8
+ throw new Error(`Invalid --worktree: ${value}. Use isolated (default) or in-repo.`);
9
+ }
10
+ //# sourceMappingURL=parse-worktree-mode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-worktree-mode.js","sourceRoot":"","sources":["../src/parse-worktree-mode.ts"],"names":[],"mappings":"AAEA,uDAAuD;AACvD,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACjE,IAAI,UAAU,KAAK,UAAU;QAAE,OAAO,UAAU,CAAC;IACjD,IAAI,UAAU,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC/C,MAAM,IAAI,KAAK,CACb,uBAAuB,KAAK,sCAAsC,CACnE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type HumanInquiryRequest, type HumanInquiryResponse } from '@agents-ensemble/core';
2
+ export declare function promptHumanInquiry(request: HumanInquiryRequest): Promise<HumanInquiryResponse>;
3
+ //# sourceMappingURL=prompt-human-inquiry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-human-inquiry.d.ts","sourceRoot":"","sources":["../src/prompt-human-inquiry.ts"],"names":[],"mappings":"AAEA,OAAO,EAKL,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EAC1B,MAAM,uBAAuB,CAAC;AAE/B,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,oBAAoB,CAAC,CA2B/B"}
@@ -0,0 +1,29 @@
1
+ import * as readline from 'node:readline/promises';
2
+ import { stdin as input, stdout as output } from 'node:process';
3
+ import { EscalationUnavailableError, resolveHumanInquiryFromEnv, escalationUnavailableMessage, } from '@agents-ensemble/core';
4
+ export async function promptHumanInquiry(request) {
5
+ const fromEnv = resolveHumanInquiryFromEnv(request);
6
+ if (fromEnv) {
7
+ return fromEnv;
8
+ }
9
+ if (!input.isTTY) {
10
+ throw new EscalationUnavailableError(escalationUnavailableMessage());
11
+ }
12
+ const rl = readline.createInterface({ input, output });
13
+ try {
14
+ if (request.context) {
15
+ output.write(`\n${request.context}\n\n`);
16
+ }
17
+ if (request.responseType === 'yes_no') {
18
+ const answer = await rl.question(`${request.question} [y/N]: `);
19
+ const approved = answer.trim().toLowerCase().startsWith('y');
20
+ return { answer: answer.trim(), approved };
21
+ }
22
+ const answer = await rl.question(`${request.question}\n> `);
23
+ return { answer: answer.trim() };
24
+ }
25
+ finally {
26
+ rl.close();
27
+ }
28
+ }
29
+ //# sourceMappingURL=prompt-human-inquiry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-human-inquiry.js","sourceRoot":"","sources":["../src/prompt-human-inquiry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,KAAK,IAAI,KAAK,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAEL,0BAA0B,EAC1B,0BAA0B,EAC1B,4BAA4B,GAG7B,MAAM,uBAAuB,CAAC;AAE/B,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAA4B;IAE5B,MAAM,OAAO,GAAG,0BAA0B,CAAC,OAAO,CAAC,CAAC;IACpD,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,IAAI,0BAA0B,CAAC,4BAA4B,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACvD,IAAI,CAAC;QACH,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,OAAO,MAAM,CAAC,CAAC;QAC3C,CAAC;QAED,IAAI,OAAO,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;YACtC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,QAAQ,UAAU,CAAC,CAAC;YAChE,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC;QAC7C,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,QAAQ,MAAM,CAAC,CAAC;QAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;IACnC,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { OperatorInputContext } from '@agents-ensemble/core';
2
+ /** TTY または `ENSEMBLE_OPERATOR_MESSAGE` でオペレータ入力が実際に届く環境か。 */
3
+ export declare function isOperatorInputInteractive(): boolean;
4
+ /** post-loop 待機を有効にできる TTY 入力か(`ENSEMBLE_OPERATOR_MESSAGE` 単発注入は除外)。 */
5
+ export declare function isOperatorInputTty(): boolean;
6
+ export declare function promptOperatorInput(context: OperatorInputContext): Promise<string | undefined>;
7
+ //# sourceMappingURL=prompt-operator-input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-operator-input.d.ts","sourceRoot":"","sources":["../src/prompt-operator-input.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAIlE,6DAA6D;AAC7D,wBAAgB,0BAA0B,IAAI,OAAO,CAKpD;AAED,wEAAwE;AACxE,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C;AAMD,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAsC7B"}
@@ -0,0 +1,51 @@
1
+ import * as readline from 'node:readline/promises';
2
+ import { stdin as input, stdout as output } from 'node:process';
3
+ const OPERATOR_MESSAGE_ENV = 'ENSEMBLE_OPERATOR_MESSAGE';
4
+ /** TTY または `ENSEMBLE_OPERATOR_MESSAGE` でオペレータ入力が実際に届く環境か。 */
5
+ export function isOperatorInputInteractive() {
6
+ if (process.env[OPERATOR_MESSAGE_ENV]?.trim()) {
7
+ return true;
8
+ }
9
+ return process.stdin.isTTY ?? false;
10
+ }
11
+ /** post-loop 待機を有効にできる TTY 入力か(`ENSEMBLE_OPERATOR_MESSAGE` 単発注入は除外)。 */
12
+ export function isOperatorInputTty() {
13
+ return process.stdin.isTTY ?? false;
14
+ }
15
+ function formatMaxTurnsLabel(maxTurns) {
16
+ return maxTurns === null ? '∞' : String(maxTurns);
17
+ }
18
+ export async function promptOperatorInput(context) {
19
+ const fromEnv = process.env[OPERATOR_MESSAGE_ENV]?.trim();
20
+ if (fromEnv) {
21
+ return fromEnv;
22
+ }
23
+ if (!input.isTTY) {
24
+ return undefined;
25
+ }
26
+ if (context.openQuestions.length > 0) {
27
+ output.write('\n未回答のオペレータ質問:\n');
28
+ for (const question of context.openQuestions) {
29
+ output.write(`- ${question.id} [${question.responseType}] ${question.question}\n`);
30
+ if (question.context) {
31
+ output.write(` ${question.context}\n`);
32
+ }
33
+ }
34
+ }
35
+ else {
36
+ output.write(`\n自律ターン: ${context.autonomousTurns}/${formatMaxTurnsLabel(context.maxTurns)}(オペレータ入力でリセット)\n`);
37
+ }
38
+ const rl = readline.createInterface({ input, output });
39
+ try {
40
+ const prompt = context.openQuestions.length > 0
41
+ ? '\nオペレータ入力(空でスキップ。未回答 1 件ならそのまま回答):\n> '
42
+ : '\nオペレータ入力(空でスキップ。自由な指示も可):\n> ';
43
+ const answer = await rl.question(prompt);
44
+ const trimmed = answer.trim();
45
+ return trimmed || undefined;
46
+ }
47
+ finally {
48
+ rl.close();
49
+ }
50
+ }
51
+ //# sourceMappingURL=prompt-operator-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-operator-input.js","sourceRoot":"","sources":["../src/prompt-operator-input.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,KAAK,IAAI,KAAK,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,cAAc,CAAC;AAGhE,MAAM,oBAAoB,GAAG,2BAA2B,CAAC;AAEzD,6DAA6D;AAC7D,MAAM,UAAU,0BAA0B;IACxC,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC;QAC9C,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC;AACtC,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,kBAAkB;IAChC,OAAO,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC;AACtC,CAAC;AAED,SAAS,mBAAmB,CAAC,QAAuB;IAClD,OAAO,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAA6B;IAE7B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE,IAAI,EAAE,CAAC;IAC1D,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACjB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrC,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACjC,KAAK,MAAM,QAAQ,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YAC7C,MAAM,CAAC,KAAK,CACV,KAAK,QAAQ,CAAC,EAAE,KAAK,QAAQ,CAAC,YAAY,KAAK,QAAQ,CAAC,QAAQ,IAAI,CACrE,CAAC;YACF,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACrB,MAAM,CAAC,KAAK,CAAC,KAAK,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,KAAK,CACV,YAAY,OAAO,CAAC,eAAe,IAAI,mBAAmB,CAAC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAC/F,CAAC;IACJ,CAAC;IAED,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACvD,IAAI,CAAC;QACH,MAAM,MAAM,GACV,OAAO,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;YAC9B,CAAC,CAAC,wCAAwC;YAC1C,CAAC,CAAC,gCAAgC,CAAC;QACvC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QAC9B,OAAO,OAAO,IAAI,SAAS,CAAC;IAC9B,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { allowOnce, deny, type PermissionRequest } from '@agents-ensemble/core';
2
+ export declare function promptPermissionDecision(request: PermissionRequest): Promise<import("@agents-ensemble/core").PermissionDecision>;
3
+ export { allowOnce, deny };
4
+ //# sourceMappingURL=prompt-permission.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-permission.d.ts","sourceRoot":"","sources":["../src/prompt-permission.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EAET,IAAI,EACJ,KAAK,iBAAiB,EACvB,MAAM,uBAAuB,CAAC;AAK/B,wBAAsB,wBAAwB,CAAC,OAAO,EAAE,iBAAiB,+DAExE;AAED,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { allowOnce, createPermissionAskHandler, deny, } from '@agents-ensemble/core';
2
+ import { promptHumanInquiry } from './prompt-human-inquiry.js';
3
+ const permissionAsk = createPermissionAskHandler(promptHumanInquiry);
4
+ export async function promptPermissionDecision(request) {
5
+ return permissionAsk(request);
6
+ }
7
+ export { allowOnce, deny };
8
+ //# sourceMappingURL=prompt-permission.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-permission.js","sourceRoot":"","sources":["../src/prompt-permission.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,0BAA0B,EAC1B,IAAI,GAEL,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/D,MAAM,aAAa,GAAG,0BAA0B,CAAC,kBAAkB,CAAC,CAAC;AAErE,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,OAA0B;IACvE,OAAO,aAAa,CAAC,OAAO,CAAC,CAAC;AAChC,CAAC;AAED,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC"}
@@ -0,0 +1,8 @@
1
+ export interface ResolveCliMaxTurnsInput {
2
+ interactive: boolean;
3
+ noMaxTurns?: boolean;
4
+ maxTurns?: number;
5
+ }
6
+ /** CLI の `--max-turns` / `--no-max-turns` と TTY 有無から `maxTurns` を決定する。 */
7
+ export declare function resolveCliMaxTurns(input: ResolveCliMaxTurnsInput): number;
8
+ //# sourceMappingURL=resolve-cli-max-turns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-cli-max-turns.d.ts","sourceRoot":"","sources":["../src/resolve-cli-max-turns.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,0EAA0E;AAC1E,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,GAAG,MAAM,CAQzE"}
@@ -0,0 +1,13 @@
1
+ /** `packages/core` の `DEFAULT_MAX_ISSUE_TURNS` と同期。 */
2
+ const NON_INTERACTIVE_DEFAULT_MAX_TURNS = 5;
3
+ /** CLI の `--max-turns` / `--no-max-turns` と TTY 有無から `maxTurns` を決定する。 */
4
+ export function resolveCliMaxTurns(input) {
5
+ if (input.noMaxTurns) {
6
+ return 0;
7
+ }
8
+ if (input.maxTurns !== undefined) {
9
+ return input.maxTurns;
10
+ }
11
+ return input.interactive ? 0 : NON_INTERACTIVE_DEFAULT_MAX_TURNS;
12
+ }
13
+ //# sourceMappingURL=resolve-cli-max-turns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-cli-max-turns.js","sourceRoot":"","sources":["../src/resolve-cli-max-turns.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,MAAM,iCAAiC,GAAG,CAAC,CAAC;AAQ5C,0EAA0E;AAC1E,MAAM,UAAU,kBAAkB,CAAC,KAA8B;IAC/D,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACrB,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,KAAK,CAAC,QAAQ,CAAC;IACxB,CAAC;IACD,OAAO,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,iCAAiC,CAAC;AACnE,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { type SessionLogEvent } from '@agents-ensemble/core';
2
+ /** harness sink と TUI 活動ログで共有する行本文(prefix なし)。 */
3
+ export declare function formatHarnessLogBody(event: SessionLogEvent): string | undefined;
4
+ /** observation sink と TUI 活動ログで共有する行本文(prefix なし)。 */
5
+ export declare function formatObservationLogBody(event: SessionLogEvent): string | undefined;
6
+ /** 非 TTY observation sink 向けの stderr 1 行(prefix 付き。auth recovery は hint をそのまま)。 */
7
+ export declare function formatObservationStderrLine(event: SessionLogEvent): string | undefined;
8
+ /** TUI 活動ログ向け conductor 応答本文。 */
9
+ export declare function formatConductorActivityBody(event: SessionLogEvent): string | undefined;
10
+ //# sourceMappingURL=session-log-lines.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-log-lines.d.ts","sourceRoot":"","sources":["../src/session-log-lines.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,uBAAuB,CAAC;AAE/B,kDAAkD;AAClD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,GAAG,SAAS,CAyD/E;AAED,sDAAsD;AACtD,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,GAAG,SAAS,CAmBnF;AAED,mFAAmF;AACnF,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,GAAG,SAAS,CAyBtF;AAED,iCAAiC;AACjC,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,GAAG,SAAS,CAYtF"}
@@ -0,0 +1,121 @@
1
+ import { formatPermissionSummaryForOperator, } from '@agents-ensemble/core';
2
+ /** harness sink と TUI 活動ログで共有する行本文(prefix なし)。 */
3
+ export function formatHarnessLogBody(event) {
4
+ switch (event.type) {
5
+ case 'harness.worktree':
6
+ return `worktree path=${event.path} branch=${event.branch} mode=${event.mode}`;
7
+ case 'harness.worktree.removed':
8
+ return `worktree.removed path=${event.path} branch=${event.branch}`;
9
+ case 'harness.worktree.remove_skipped':
10
+ return `worktree.remove_skipped path=${event.path} branch=${event.branch} reason=${event.reason}`;
11
+ case 'harness.worktree.remove_failed':
12
+ return `worktree.remove_failed path=${event.path} branch=${event.branch} error=${event.error}`;
13
+ case 'harness.worker.prompt.started':
14
+ return `worker.prompt.started name=${event.name} kind=${event.kind} source=${event.source}`;
15
+ case 'harness.worker.prompt.completed':
16
+ return `worker.prompt.completed name=${event.name} kind=${event.kind} source=${event.source} stopReason=${event.stopReason}`;
17
+ case 'harness.worker.prompt.failed':
18
+ return `worker.prompt.failed name=${event.name} kind=${event.kind} source=${event.source} error=${event.error}`;
19
+ case 'operator.input':
20
+ return `operator.input turn=${event.conductorTurn} bytes=${event.text.length}`;
21
+ case 'conductor.send.started': {
22
+ let line = `conductor.send.started n=${event.sendCount}`;
23
+ if (event.dispatchSource) {
24
+ line += ` source=${event.dispatchSource}`;
25
+ }
26
+ return line;
27
+ }
28
+ case 'conductor.send.progress':
29
+ return `conductor.send.progress n=${event.sendCount} runId=${event.runId} tool=${event.tool}`;
30
+ case 'permission.pending':
31
+ return formatPermissionSummaryForOperator(event.permission, {
32
+ workerLabel: event.workerLabel,
33
+ });
34
+ case 'conductor.send': {
35
+ let line = `conductor.send n=${event.sendCount} status=${event.status} workerDone=${event.workerDispatches} workerFailed=${event.workerFailures}`;
36
+ if (event.status === 'error' && event.error) {
37
+ line += ` error=${event.error.message}`;
38
+ }
39
+ return line;
40
+ }
41
+ case 'worker.round':
42
+ return `worker.round name=${event.dispatch.name} kind=${event.dispatch.kind} source=${event.dispatch.source ?? 'conductor'} stopReason=${event.dispatch.promptResult.stopReason} path=${event.dispatch.worktree.path}`;
43
+ case 'worker.failed':
44
+ return `worker.failed name=${event.failure.name} kind=${event.failure.kind} error=${event.failure.error}`;
45
+ case 'worker.process.stderr': {
46
+ const name = event.workerName ? ` name=${event.workerName}` : '';
47
+ return `worker.stderr${name} ${event.line}`;
48
+ }
49
+ case 'session.stop':
50
+ return `session.stop reason=${event.stopReason}`;
51
+ case 'harness.github.update':
52
+ return `github.update items=${event.itemCount}`;
53
+ case 'harness.github.monitor_error':
54
+ return `github.monitor_error ${event.message}`;
55
+ case 'harness.warning':
56
+ return `warning: ${event.message}`;
57
+ default:
58
+ return undefined;
59
+ }
60
+ }
61
+ /** observation sink と TUI 活動ログで共有する行本文(prefix なし)。 */
62
+ export function formatObservationLogBody(event) {
63
+ switch (event.type) {
64
+ case 'open.question.enqueued':
65
+ return `${event.question.id} [${event.question.responseType}] ${event.question.question}`;
66
+ case 'escalation.recorded':
67
+ return `${event.record.question} → ${event.record.answer}`;
68
+ case 'session.worktree.notice':
69
+ return '特別モード: メイン worktree で直接作業します(isolated worktree は作りません)';
70
+ case 'session.continue':
71
+ return `resuming session: conductorAgentId=${event.conductorAgentId}`;
72
+ case 'session.post_loop_wait':
73
+ return '自律作業が一段落しました。追加の指示を入力するか、/exit で終了してください。';
74
+ case 'conductor.auth.recovery':
75
+ return event.hint;
76
+ case 'conductor.auth.reconnect':
77
+ return `[auth] conductor 再接続を試行 agentId=${event.agentId}`;
78
+ default:
79
+ return undefined;
80
+ }
81
+ }
82
+ /** 非 TTY observation sink 向けの stderr 1 行(prefix 付き。auth recovery は hint をそのまま)。 */
83
+ export function formatObservationStderrLine(event) {
84
+ if (event.type === 'conductor.auth.recovery' || event.type === 'conductor.auth.reconnect') {
85
+ const body = formatObservationLogBody(event);
86
+ return body;
87
+ }
88
+ const body = formatObservationLogBody(event);
89
+ if (!body) {
90
+ return undefined;
91
+ }
92
+ switch (event.type) {
93
+ case 'open.question.enqueued':
94
+ return `[open question] ${body}`;
95
+ case 'escalation.recorded':
96
+ return `[operator answer] ${body}`;
97
+ case 'session.worktree.notice':
98
+ return `[worktree] ${body}`;
99
+ case 'session.continue':
100
+ return `[continue] ${body}`;
101
+ case 'session.post_loop_wait':
102
+ return `\n${body}\n`;
103
+ default:
104
+ return undefined;
105
+ }
106
+ }
107
+ /** TUI 活動ログ向け conductor 応答本文。 */
108
+ export function formatConductorActivityBody(event) {
109
+ if (event.type !== 'conductor.send') {
110
+ return undefined;
111
+ }
112
+ if (event.status === 'finished' && event.result?.trim()) {
113
+ return event.result.trim();
114
+ }
115
+ if (event.status === 'error') {
116
+ const detail = event.error?.message ?? 'unknown error';
117
+ return `応答を生成できませんでした(${detail})。別の聞き方で再入力してください。`;
118
+ }
119
+ return undefined;
120
+ }
121
+ //# sourceMappingURL=session-log-lines.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-log-lines.js","sourceRoot":"","sources":["../src/session-log-lines.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { SessionLogSink } from '@agents-ensemble/core';
2
+ export interface HarnessSinkOptions {
3
+ /** デフォルト: `console.error` */
4
+ writeStderr?: (message: string) => void;
5
+ }
6
+ /** harness テレメトリ(開発者向け)。stderr に統一 prefix で出す。 */
7
+ export declare function createHarnessSink(options?: HarnessSinkOptions): SessionLogSink;
8
+ export interface DialogueSinkOptions {
9
+ /** デフォルト: `process.stdout.write` */
10
+ writeStdout?: (text: string) => void;
11
+ }
12
+ /** オペレータ↔conductor の見える会話。TTY 時のみ有効にすること。 */
13
+ export declare function createDialogueSink(options?: DialogueSinkOptions): SessionLogSink;
14
+ export interface ObservationSinkOptions {
15
+ /** デフォルト: `console.error` */
16
+ writeStderr?: (message: string) => void;
17
+ }
18
+ /** セッション観測(open question / エスカレーション / CLI 通知)。stderr に prefix 付きで出す。 */
19
+ export declare function createObservationSink(options?: ObservationSinkOptions): SessionLogSink;
20
+ //# sourceMappingURL=session-sinks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-sinks.d.ts","sourceRoot":"","sources":["../src/session-sinks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAQ5D,MAAM,WAAW,kBAAkB;IACjC,6BAA6B;IAC7B,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAED,kDAAkD;AAClD,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,kBAAuB,GAAG,cAAc,CASlF;AAED,MAAM,WAAW,mBAAmB;IAClC,oCAAoC;IACpC,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC;AAED,6CAA6C;AAC7C,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,mBAAwB,GAAG,cAAc,CA4CpF;AAED,MAAM,WAAW,sBAAsB;IACrC,6BAA6B;IAC7B,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAED,wEAAwE;AACxE,wBAAgB,qBAAqB,CACnC,OAAO,GAAE,sBAA2B,GACnC,cAAc,CAShB"}
@@ -0,0 +1,67 @@
1
+ import { isConductorAuthError } from '@agents-ensemble/core';
2
+ import { stdout } from 'node:process';
3
+ import { formatHarnessLogBody, formatObservationStderrLine, } from './session-log-lines.js';
4
+ /** harness テレメトリ(開発者向け)。stderr に統一 prefix で出す。 */
5
+ export function createHarnessSink(options = {}) {
6
+ const writeStderr = options.writeStderr ?? ((message) => console.error(message));
7
+ return (event) => {
8
+ const body = formatHarnessLogBody(event);
9
+ if (body) {
10
+ writeStderr(`[harness] ${body}`);
11
+ }
12
+ };
13
+ }
14
+ /** オペレータ↔conductor の見える会話。TTY 時のみ有効にすること。 */
15
+ export function createDialogueSink(options = {}) {
16
+ const writeStdout = options.writeStdout ?? ((text) => stdout.write(text));
17
+ return (event) => {
18
+ switch (event.type) {
19
+ case 'operator.input':
20
+ writeStdout(`\noperator> ${event.text}\n`);
21
+ break;
22
+ case 'conductor.send':
23
+ if (event.status === 'finished' && event.result?.trim()) {
24
+ writeStdout(`\nconductor> ${event.result.trim()}\n`);
25
+ }
26
+ else if (event.status === 'error') {
27
+ const detail = event.error?.message ?? 'unknown error';
28
+ if (isConductorAuthError(detail)) {
29
+ writeStdout('\nconductor> 認証エラーが発生しました。stderr の [auth] 手順に従って再認証してください。\n');
30
+ }
31
+ else {
32
+ writeStdout(`\nconductor> 応答を生成できませんでした(${detail})。\n別の聞き方で再入力してください。\n`);
33
+ }
34
+ }
35
+ break;
36
+ case 'harness.worktree':
37
+ case 'harness.worktree.removed':
38
+ case 'harness.worktree.remove_skipped':
39
+ case 'harness.worktree.remove_failed':
40
+ case 'harness.worker.prompt.started':
41
+ case 'harness.worker.prompt.completed':
42
+ case 'harness.worker.prompt.failed':
43
+ case 'worker.round':
44
+ case 'worker.failed':
45
+ case 'worker.process.stderr':
46
+ case 'session.stop':
47
+ case 'open.question.enqueued':
48
+ case 'escalation.recorded':
49
+ case 'session.worktree.notice':
50
+ case 'session.continue':
51
+ case 'session.post_loop_wait':
52
+ case 'conductor.auth.recovery':
53
+ break;
54
+ }
55
+ };
56
+ }
57
+ /** セッション観測(open question / エスカレーション / CLI 通知)。stderr に prefix 付きで出す。 */
58
+ export function createObservationSink(options = {}) {
59
+ const writeStderr = options.writeStderr ?? ((message) => console.error(message));
60
+ return (event) => {
61
+ const line = formatObservationStderrLine(event);
62
+ if (line) {
63
+ writeStderr(line);
64
+ }
65
+ };
66
+ }
67
+ //# sourceMappingURL=session-sinks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-sinks.js","sourceRoot":"","sources":["../src/session-sinks.ts"],"names":[],"mappings":"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"}