echo-cli-agent 0.1.7 → 0.1.9

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 (53) hide show
  1. package/README.md +11 -2
  2. package/dist/src/dispatch/dispatcher.d.ts +19 -3
  3. package/dist/src/dispatch/dispatcher.js +98 -4
  4. package/dist/src/dispatch/dispatcher.js.map +1 -1
  5. package/dist/src/health/server.d.ts +5 -1
  6. package/dist/src/health/server.js +8 -1
  7. package/dist/src/health/server.js.map +1 -1
  8. package/dist/src/index.js +8 -3
  9. package/dist/src/index.js.map +1 -1
  10. package/dist/src/providers/codex.js +25 -0
  11. package/dist/src/providers/codex.js.map +1 -1
  12. package/dist/src/providers/detection.d.ts +11 -0
  13. package/dist/src/providers/detection.js +96 -0
  14. package/dist/src/providers/detection.js.map +1 -0
  15. package/dist/src/providers/registry.d.ts +23 -0
  16. package/dist/src/providers/registry.js +59 -29
  17. package/dist/src/providers/registry.js.map +1 -1
  18. package/dist/src/runtime/agent-runtime.js +22 -10
  19. package/dist/src/runtime/agent-runtime.js.map +1 -1
  20. package/dist/src/session/session-manager.d.ts +41 -2
  21. package/dist/src/session/session-manager.js +178 -34
  22. package/dist/src/session/session-manager.js.map +1 -1
  23. package/dist/src/session/terminal-line-sanitizer.d.ts +7 -0
  24. package/dist/src/session/terminal-line-sanitizer.js +21 -0
  25. package/dist/src/session/terminal-line-sanitizer.js.map +1 -0
  26. package/dist/src/session/terminal-tail-buffer.d.ts +70 -0
  27. package/dist/src/session/terminal-tail-buffer.js +149 -0
  28. package/dist/src/session/terminal-tail-buffer.js.map +1 -0
  29. package/dist/src/shared/cli-detection-types.d.ts +19 -0
  30. package/dist/src/shared/cli-detection-types.js +2 -0
  31. package/dist/src/shared/cli-detection-types.js.map +1 -0
  32. package/dist/src/shared/node-cli-command-resolution.d.ts +8 -0
  33. package/dist/src/shared/node-cli-command-resolution.js +11 -1
  34. package/dist/src/shared/node-cli-command-resolution.js.map +1 -1
  35. package/dist/src/transport/taskmcp-client.d.ts +3 -1
  36. package/dist/src/transport/taskmcp-client.js +4 -0
  37. package/dist/src/transport/taskmcp-client.js.map +1 -1
  38. package/dist/src/types/protocol.d.ts +53 -1
  39. package/dist/src/types/protocol.js +33 -1
  40. package/dist/src/types/protocol.js.map +1 -1
  41. package/dist/tests/cli-detection.test.d.ts +1 -0
  42. package/dist/tests/cli-detection.test.js +62 -0
  43. package/dist/tests/cli-detection.test.js.map +1 -0
  44. package/dist/tests/providers.test.js +1 -0
  45. package/dist/tests/providers.test.js.map +1 -1
  46. package/dist/tests/session-manager.test.d.ts +1 -0
  47. package/dist/tests/session-manager.test.js +115 -0
  48. package/dist/tests/session-manager.test.js.map +1 -0
  49. package/dist/tests/terminal-tail-buffer.test.d.ts +1 -0
  50. package/dist/tests/terminal-tail-buffer.test.js +68 -0
  51. package/dist/tests/terminal-tail-buffer.test.js.map +1 -0
  52. package/package.json +1 -1
  53. package/scripts/service.mjs +25 -0
@@ -0,0 +1,96 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { hydrateShellPath, mergePathSegments } from '../runtime/cli/hydrate-shell-path.js';
3
+ import { getProviderDetectionProbeCommands, PROVIDER_CONFIGS, resolveDetectedProviderCommands } from './registry.js';
4
+ import { resolveCliCommandDetailed } from '../shared/node-cli-command-resolution.js';
5
+ function probeVersion(path, args) {
6
+ if (args.length === 0)
7
+ return Promise.resolve({});
8
+ return new Promise((resolve) => {
9
+ const child = spawn(path, [...args], { stdio: ['ignore', 'pipe', 'pipe'], shell: false });
10
+ let stdout = '';
11
+ let stderr = '';
12
+ let settled = false;
13
+ let timer;
14
+ const finish = (result) => {
15
+ if (settled)
16
+ return;
17
+ settled = true;
18
+ if (timer)
19
+ clearTimeout(timer);
20
+ resolve(result);
21
+ };
22
+ timer = setTimeout(() => {
23
+ child.kill('SIGKILL');
24
+ finish({ detail: 'version probe timeout' });
25
+ }, 5_000);
26
+ child.stdout.on('data', (chunk) => { stdout += chunk.toString(); });
27
+ child.stderr.on('data', (chunk) => { stderr += chunk.toString(); });
28
+ child.on('error', (error) => finish({ detail: error.message }));
29
+ child.on('close', (code) => {
30
+ const detail = (stdout || stderr || `exit ${code ?? 'unknown'}`).trim().slice(0, 200);
31
+ const version = stdout.split(/\r?\n/).map((line) => line.trim()).find(Boolean);
32
+ finish(version ? { version, detail } : { detail });
33
+ });
34
+ });
35
+ }
36
+ export class CliDetectionService {
37
+ snapshot;
38
+ pending;
39
+ async detect(forceRefresh = false) {
40
+ if (this.pending)
41
+ return this.pending;
42
+ if (!forceRefresh && this.snapshot)
43
+ return this.snapshot;
44
+ this.pending = this.detectNow(forceRefresh).finally(() => {
45
+ this.pending = undefined;
46
+ });
47
+ return this.pending;
48
+ }
49
+ async detectNow(forceRefresh) {
50
+ const hydration = await hydrateShellPath({ force: forceRefresh });
51
+ const addedPathSegments = hydration.ok ? mergePathSegments(hydration.segments) : [];
52
+ const commands = getProviderDetectionProbeCommands();
53
+ const resolved = new Map(commands.map((command) => [command, resolveCliCommandDetailed(command)]));
54
+ const foundCommands = new Set(commands.filter((command) => resolved.get(command)?.found));
55
+ const detected = resolveDetectedProviderCommands(foundCommands);
56
+ const providers = await Promise.all(PROVIDER_CONFIGS.map(async (config) => {
57
+ const matchedDetectionCommand = detected.get(config.id);
58
+ const result = matchedDetectionCommand ? resolved.get(matchedDetectionCommand) : undefined;
59
+ const executablePath = result?.found ? result.path : undefined;
60
+ const installed = Boolean(executablePath);
61
+ const unsupported = config.detectUnsupportedRuntimes?.includes(process.platform) ?? false;
62
+ const diagnostic = executablePath ? await probeVersion(executablePath, config.versionArguments ?? []) : {};
63
+ const detail = installed
64
+ ? diagnostic.detail
65
+ : unsupported
66
+ ? 'unsupported runtime'
67
+ : config.detectRequiredCommands?.length
68
+ ? 'command or required command not found'
69
+ : 'command not found';
70
+ return {
71
+ id: config.id,
72
+ installed,
73
+ available: installed,
74
+ ...(matchedDetectionCommand ? { matchedDetectionCommand } : {}),
75
+ ...(result?.path ? { resolvedPath: result.path } : {}),
76
+ ...(diagnostic.version ? { version: diagnostic.version } : {}),
77
+ ...(detail ? { detail } : {})
78
+ };
79
+ }));
80
+ this.snapshot = {
81
+ providers,
82
+ detectedIds: providers.filter((provider) => provider.installed).map((provider) => provider.id),
83
+ addedPathSegments,
84
+ shellHydrationOk: hydration.ok,
85
+ pathSource: hydration.ok ? 'shell_hydrated' : 'process_path',
86
+ pathFailureReason: hydration.failureReason,
87
+ refreshedAt: new Date().toISOString()
88
+ };
89
+ return this.snapshot;
90
+ }
91
+ }
92
+ export const cliDetection = new CliDetectionService();
93
+ export function providerCapabilityIds(snapshot) {
94
+ return snapshot.detectedIds;
95
+ }
96
+ //# sourceMappingURL=detection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detection.js","sourceRoot":"","sources":["../../../src/providers/detection.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,27 @@
1
1
  import type { AgentProvider } from './provider.js';
2
+ export type ProviderRuntime = NodeJS.Platform | 'wsl';
3
+ export type ProviderConfig = {
4
+ id: string;
5
+ aliases: readonly string[];
6
+ detectCmd: string;
7
+ detectCmdAliases?: readonly string[];
8
+ detectRequiredCommands?: readonly string[];
9
+ detectUnsupportedRuntimes?: readonly ProviderRuntime[];
10
+ implementation: AgentProvider;
11
+ versionArguments?: readonly string[];
12
+ };
13
+ export declare const PROVIDER_CONFIGS: readonly ProviderConfig[];
14
+ export type ProviderDetectionCommand = {
15
+ id: string;
16
+ cmd: string;
17
+ requiredCommands?: readonly string[];
18
+ unsupportedRuntimes?: readonly ProviderRuntime[];
19
+ };
20
+ export declare const PROVIDER_DETECTION_COMMANDS: ProviderDetectionCommand[];
21
+ export declare function providerConfig(idOrAlias: string): ProviderConfig;
22
+ export declare function buildProviderDetectionCommands(configs: readonly ProviderConfig[]): ProviderDetectionCommand[];
23
+ export declare function getProviderDetectionProbeCommands(commands?: readonly ProviderDetectionCommand[], runtime?: ProviderRuntime): string[];
24
+ export declare function resolveDetectedProviderCommands(foundCommands: ReadonlySet<string>, commands?: readonly ProviderDetectionCommand[], runtime?: ProviderRuntime): Map<string, string>;
2
25
  export declare function resolveProvider(agentType: string): AgentProvider;
3
26
  export declare function probeProviders(): Array<{
4
27
  id: string;
@@ -1,14 +1,52 @@
1
- import { spawnSync } from 'node:child_process';
2
1
  import { claudeProvider } from './claude.js';
3
2
  import { codexProvider } from './codex.js';
4
3
  import { kiroProvider } from './kiro.js';
5
- import { resolveCliCommand } from '../shared/node-cli-command-resolution.js';
6
- const providers = new Map([
7
- ['claude', claudeProvider],
8
- ['claude-code', claudeProvider],
9
- ['codex', codexProvider],
10
- ['kiro', kiroProvider]
11
- ]);
4
+ import { resolveCliCommandDetailed } from '../shared/node-cli-command-resolution.js';
5
+ export const PROVIDER_CONFIGS = [
6
+ { id: 'claude', aliases: ['claude-code'], detectCmd: 'claude', implementation: claudeProvider, versionArguments: ['--version'] },
7
+ { id: 'codex', aliases: [], detectCmd: 'codex', implementation: codexProvider, versionArguments: ['--version'] },
8
+ { id: 'kiro', aliases: ['kiro-cli'], detectCmd: 'kiro-cli', implementation: kiroProvider, versionArguments: ['--version'] }
9
+ ];
10
+ export const PROVIDER_DETECTION_COMMANDS = buildProviderDetectionCommands(PROVIDER_CONFIGS);
11
+ const providers = new Map(PROVIDER_CONFIGS.flatMap((config) => [config.id, ...config.aliases].map((alias) => [alias, config.implementation])));
12
+ export function providerConfig(idOrAlias) {
13
+ const normalized = idOrAlias.trim().toLowerCase();
14
+ const config = PROVIDER_CONFIGS.find((item) => item.id === normalized || item.aliases.includes(normalized));
15
+ if (!config)
16
+ throw new Error(`unsupported agent type: ${idOrAlias}`);
17
+ return config;
18
+ }
19
+ export function buildProviderDetectionCommands(configs) {
20
+ return configs.flatMap((config) => [config.detectCmd, ...(config.detectCmdAliases ?? [])].map((cmd) => ({
21
+ id: config.id,
22
+ cmd,
23
+ ...(config.detectRequiredCommands?.length
24
+ ? { requiredCommands: config.detectRequiredCommands }
25
+ : {}),
26
+ ...(config.detectUnsupportedRuntimes?.length
27
+ ? { unsupportedRuntimes: config.detectUnsupportedRuntimes }
28
+ : {})
29
+ })));
30
+ }
31
+ export function getProviderDetectionProbeCommands(commands = PROVIDER_DETECTION_COMMANDS, runtime = process.platform) {
32
+ return [...new Set(commands
33
+ .filter((command) => !command.unsupportedRuntimes?.includes(runtime))
34
+ .flatMap((command) => [command.cmd, ...(command.requiredCommands ?? [])]))];
35
+ }
36
+ export function resolveDetectedProviderCommands(foundCommands, commands = PROVIDER_DETECTION_COMMANDS, runtime = process.platform) {
37
+ const detected = new Map();
38
+ for (const command of commands) {
39
+ if (command.unsupportedRuntimes?.includes(runtime))
40
+ continue;
41
+ if (!foundCommands.has(command.cmd))
42
+ continue;
43
+ if (!(command.requiredCommands ?? []).every((required) => foundCommands.has(required)))
44
+ continue;
45
+ if (!detected.has(command.id))
46
+ detected.set(command.id, command.cmd);
47
+ }
48
+ return detected;
49
+ }
12
50
  export function resolveProvider(agentType) {
13
51
  const provider = providers.get(agentType.toLowerCase());
14
52
  if (!provider)
@@ -16,28 +54,20 @@ export function resolveProvider(agentType) {
16
54
  return provider;
17
55
  }
18
56
  export function probeProviders() {
19
- return [claudeProvider, codexProvider, kiroProvider].map((provider) => {
20
- const executableName = provider.id === 'claude'
21
- ? 'claude'
22
- : provider.id === 'codex'
23
- ? 'codex'
24
- : 'kiro-cli';
25
- const executable = resolveCliCommand(executableName);
26
- const result = spawnSync(executable, provider.versionArguments(), {
27
- encoding: 'utf8',
28
- timeout: 5_000,
29
- shell: false
30
- });
31
- const detail = result.error
32
- ? result.error.message
33
- : (result.stdout || result.stderr || `exit ${result.status ?? 'unknown'}`).trim().slice(0, 200);
34
- const version = (result.stdout || '').split(/\r?\n/).map((line) => line.trim()).find(Boolean);
57
+ const resolved = new Map(getProviderDetectionProbeCommands().map((command) => [
58
+ command,
59
+ resolveCliCommandDetailed(command)
60
+ ]));
61
+ const found = new Set([...resolved].filter(([, result]) => result.found).map(([command]) => command));
62
+ const detected = resolveDetectedProviderCommands(found);
63
+ return PROVIDER_CONFIGS.map((config) => {
64
+ const matchedCommand = detected.get(config.id);
65
+ const result = matchedCommand ? resolved.get(matchedCommand) : undefined;
35
66
  return {
36
- id: provider.id,
37
- available: result.status === 0,
38
- ...(result.status === 0 && executable !== executableName ? { path: executable } : {}),
39
- ...(version ? { version } : {}),
40
- detail
67
+ id: config.id,
68
+ available: Boolean(result?.found),
69
+ ...(result?.path ? { path: result.path } : {}),
70
+ detail: result?.found ? 'filesystem detection' : 'command not found'
41
71
  };
42
72
  });
43
73
  }
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/providers/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAExC,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAA;AAE5E,MAAM,SAAS,GAAG,IAAI,GAAG,CAAwB;IAC/C,CAAC,QAAQ,EAAE,cAAc,CAAC;IAC1B,CAAC,aAAa,EAAE,cAAc,CAAC;IAC/B,CAAC,OAAO,EAAE,aAAa,CAAC;IACxB,CAAC,MAAM,EAAE,YAAY,CAAC;CACvB,CAAC,CAAA;AAEF,MAAM,UAAU,eAAe,CAAC,SAAiB;IAC/C,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAA;IACvD,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,SAAS,EAAE,CAAC,CAAA;IACtE,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,CAAC,cAAc,EAAE,aAAa,EAAE,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;QACpE,MAAM,cAAc,GAAG,QAAQ,CAAC,EAAE,KAAK,QAAQ;YAC7C,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,QAAQ,CAAC,EAAE,KAAK,OAAO;gBACvB,CAAC,CAAC,OAAO;gBACT,CAAC,CAAC,UAAU,CAAA;QAChB,MAAM,UAAU,GAAG,iBAAiB,CAAC,cAAc,CAAC,CAAA;QACpD,MAAM,MAAM,GAAG,SAAS,CAAC,UAAU,EAAE,QAAQ,CAAC,gBAAgB,EAAE,EAAE;YAChE,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,KAAK;SACb,CAAC,CAAA;QACF,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK;YACzB,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO;YACtB,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,QAAQ,MAAM,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;QACjG,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC7F,OAAO;YACL,EAAE,EAAE,QAAQ,CAAC,EAAE;YACf,SAAS,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;YAC9B,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,KAAK,cAAc,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrF,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/B,MAAM;SACP,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/providers/registry.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,20 @@
1
1
  import { Dispatcher } from '../dispatch/dispatcher.js';
2
2
  import { HealthServer } from '../health/server.js';
3
3
  import { createDiagnosticLogger } from '../logging/diagnostic-log.js';
4
- import { probeProviders } from '../providers/registry.js';
4
+ import { cliDetection } from '../providers/detection.js';
5
+ import { providerConfig } from '../providers/registry.js';
5
6
  import { SessionManager } from '../session/session-manager.js';
6
7
  import { StateStore } from '../state/state-store.js';
7
8
  import { TaskMcpClient } from '../transport/taskmcp-client.js';
8
- import { hydrateShellPath, mergePathSegments } from './cli/hydrate-shell-path.js';
9
9
  export function selectCapabilities(configured, probes) {
10
- const explicit = [...new Set(configured.map((value) => value.trim().toLowerCase()).filter(Boolean))];
10
+ const explicit = [...new Set(configured.map((value) => {
11
+ try {
12
+ return providerConfig(value).id;
13
+ }
14
+ catch {
15
+ return value.trim().toLowerCase();
16
+ }
17
+ }).filter(Boolean))];
11
18
  if (explicit.length > 0)
12
19
  return explicit;
13
20
  return [...new Set(probes.filter((probe) => probe.available).map((probe) => probe.id.trim().toLowerCase()).filter(Boolean))];
@@ -29,15 +36,19 @@ export class AgentRuntime {
29
36
  this.state = new StateStore(config.stateFile);
30
37
  }
31
38
  async start() {
32
- const hydration = await hydrateShellPath();
33
- if (hydration.ok)
34
- mergePathSegments(hydration.segments);
35
- this.config.capabilities = selectCapabilities(this.config.capabilities, probeProviders());
39
+ const configuredCapabilities = [...this.config.capabilities];
40
+ let currentDetection = await cliDetection.detect();
41
+ this.config.capabilities = selectCapabilities(configuredCapabilities, currentDetection.providers);
42
+ const refreshDetection = async (refresh) => {
43
+ currentDetection = await cliDetection.detect(refresh);
44
+ this.config.capabilities = selectCapabilities(configuredCapabilities, currentDetection.providers);
45
+ return currentDetection;
46
+ };
36
47
  await this.state.initialize();
37
48
  const deviceId = this.config.deviceId;
38
49
  this.sessions = new SessionManager(this.config, this.state, this.logger);
39
50
  this.client = new TaskMcpClient(this.config, deviceId, this.logger);
40
- const dispatcher = new Dispatcher(this.sessions, this.state, this.client, this.logger, this.config);
51
+ const dispatcher = new Dispatcher(this.sessions, this.state, this.client, this.logger, this.config, refreshDetection);
41
52
  this.client.on('message', (message) => dispatcher.accept(message));
42
53
  this.health = new HealthServer(this.config.healthHost, this.config.healthPort, () => ({
43
54
  deviceId,
@@ -46,8 +57,9 @@ export class AgentRuntime {
46
57
  activeSessions: this.sessions?.activeCount ?? 0,
47
58
  storedRuns: this.state.snapshot().runs,
48
59
  startedAt: this.startedAt,
49
- runs: this.state.recentRuns()
50
- }), this.config.logFile, this.logger);
60
+ runs: this.state.recentRuns(),
61
+ detection: currentDetection
62
+ }), this.config.logFile, this.logger, refreshDetection);
51
63
  await this.health.start();
52
64
  this.client.start();
53
65
  this.logger.info('agent-started', {
@@ -1 +1 @@
1
- {"version":3,"file":"agent-runtime.js","sourceRoot":"","sources":["../../../src/runtime/agent-runtime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-runtime.js","sourceRoot":"","sources":["../../../src/runtime/agent-runtime.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,27 @@ import type { AgentConfig } from '../config.js';
2
2
  import type { DiagnosticLogger } from '../logging/diagnostic-log.js';
3
3
  import type { CliWindowRecord, StateStore } from '../state/state-store.js';
4
4
  import type { AgentCliRequest, DeliveryResult } from '../types/protocol.js';
5
+ import { type TerminalTailReadOptions } from './terminal-tail-buffer.js';
6
+ export type TerminalTailQuery = {
7
+ runId?: string;
8
+ taskId?: string;
9
+ agentType?: string;
10
+ };
11
+ export type TerminalTailSnapshot = {
12
+ runId: string;
13
+ sessionId: string;
14
+ agentType: string;
15
+ lines: string[];
16
+ startCursor: number;
17
+ nextCursor: number;
18
+ oldestCursor: number;
19
+ latestCursor: number;
20
+ hasMore: boolean;
21
+ truncated: boolean;
22
+ limited: boolean;
23
+ idleMs: number | undefined;
24
+ markers: string[];
25
+ };
5
26
  export type CliProcessExit = {
6
27
  exitCode: number;
7
28
  signal?: number;
@@ -23,16 +44,34 @@ export declare class SessionManager {
23
44
  constructor(config: AgentConfig, state: StateStore, logger: DiagnosticLogger);
24
45
  get activeCount(): number;
25
46
  /**
26
- * Register a named local window before its first prompt. The server task id is
27
- * the only routing key; a provider-native session id remains optional.
47
+ * Register a stable local window before its first prompt. This mirrors Orca's
48
+ * host-owned terminal identity: the provider-native session id is learned only
49
+ * after the CLI has actually started and emitted it.
28
50
  */
29
51
  createWindow(request: AgentCliRequest): Promise<CliWindowRecord>;
30
52
  listWindows(agentType?: string): CliWindowRecord[];
31
53
  deliver(request: AgentCliRequest, hooks: DeliveryHooks): Promise<DeliveryResult>;
32
54
  dispose(): void;
55
+ /**
56
+ * Read the newest terminal rows of a live session, or page backwards from a
57
+ * cursor a previous read returned. Nothing is persisted and nothing is logged:
58
+ * the rows are sanitized, handed to the caller, and forgotten.
59
+ *
60
+ * A run id is matched first. Sessions outlive a single run, so a task plus
61
+ * agent type still resolves after a later prompt has taken over the session.
62
+ */
63
+ peekOutput(query: TerminalTailQuery, options?: TerminalTailReadOptions): TerminalTailSnapshot | undefined;
64
+ private findSession;
65
+ /**
66
+ * Look for the provider-native session id in a bounded rolling window instead
67
+ * of the retained tail. CLIs print the id during startup, so the window is
68
+ * released after the first hit rather than re-scanned for the whole session.
69
+ */
70
+ private discoverProviderSession;
33
71
  /** Stop the PTY that owns the requested remote run. */
34
72
  cancelRun(runId: string): boolean;
35
73
  private writePrompt;
74
+ private waitForProviderSession;
36
75
  private waitForStartupOutput;
37
76
  private autoApproveTrustPrompt;
38
77
  private outputMarkers;