@agent-relay/sdk 3.2.9 → 3.2.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/agent-relay-broker-darwin-arm64 +0 -0
- package/bin/agent-relay-broker-darwin-x64 +0 -0
- package/bin/agent-relay-broker-linux-arm64 +0 -0
- package/bin/agent-relay-broker-linux-x64 +0 -0
- package/dist/cli-registry.d.ts +42 -0
- package/dist/cli-registry.d.ts.map +1 -0
- package/dist/cli-registry.js +126 -0
- package/dist/cli-registry.js.map +1 -0
- package/dist/cli-resolver.d.ts +30 -0
- package/dist/cli-resolver.d.ts.map +1 -0
- package/dist/cli-resolver.js +132 -0
- package/dist/cli-resolver.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/spawn-from-env.d.ts.map +1 -1
- package/dist/spawn-from-env.js +6 -15
- package/dist/spawn-from-env.js.map +1 -1
- package/dist/workflows/__tests__/cli-session-collector.test.d.ts +2 -0
- package/dist/workflows/__tests__/cli-session-collector.test.d.ts.map +1 -0
- package/dist/workflows/__tests__/cli-session-collector.test.js +54 -0
- package/dist/workflows/__tests__/cli-session-collector.test.js.map +1 -0
- package/dist/workflows/__tests__/collectors/claude.test.d.ts +2 -0
- package/dist/workflows/__tests__/collectors/claude.test.d.ts.map +1 -0
- package/dist/workflows/__tests__/collectors/claude.test.js +85 -0
- package/dist/workflows/__tests__/collectors/claude.test.js.map +1 -0
- package/dist/workflows/__tests__/collectors/codex.test.d.ts +2 -0
- package/dist/workflows/__tests__/collectors/codex.test.d.ts.map +1 -0
- package/dist/workflows/__tests__/collectors/codex.test.js +67 -0
- package/dist/workflows/__tests__/collectors/codex.test.js.map +1 -0
- package/dist/workflows/__tests__/collectors/opencode.test.d.ts +2 -0
- package/dist/workflows/__tests__/collectors/opencode.test.d.ts.map +1 -0
- package/dist/workflows/__tests__/collectors/opencode.test.js +119 -0
- package/dist/workflows/__tests__/collectors/opencode.test.js.map +1 -0
- package/dist/workflows/__tests__/run-summary-table.test.d.ts +2 -0
- package/dist/workflows/__tests__/run-summary-table.test.d.ts.map +1 -0
- package/dist/workflows/__tests__/run-summary-table.test.js +130 -0
- package/dist/workflows/__tests__/run-summary-table.test.js.map +1 -0
- package/dist/workflows/__tests__/step-cwd.test.d.ts +2 -0
- package/dist/workflows/__tests__/step-cwd.test.d.ts.map +1 -0
- package/dist/workflows/__tests__/step-cwd.test.js +42 -0
- package/dist/workflows/__tests__/step-cwd.test.js.map +1 -0
- package/dist/workflows/builder.d.ts +7 -0
- package/dist/workflows/builder.d.ts.map +1 -1
- package/dist/workflows/builder.js +40 -5
- package/dist/workflows/builder.js.map +1 -1
- package/dist/workflows/cli-session-collector.d.ts +39 -0
- package/dist/workflows/cli-session-collector.d.ts.map +1 -0
- package/dist/workflows/cli-session-collector.js +23 -0
- package/dist/workflows/cli-session-collector.js.map +1 -0
- package/dist/workflows/cli.js +228 -48
- package/dist/workflows/cli.js.map +1 -1
- package/dist/workflows/collectors/claude.d.ts +6 -0
- package/dist/workflows/collectors/claude.d.ts.map +1 -0
- package/dist/workflows/collectors/claude.js +330 -0
- package/dist/workflows/collectors/claude.js.map +1 -0
- package/dist/workflows/collectors/codex.d.ts +18 -0
- package/dist/workflows/collectors/codex.d.ts.map +1 -0
- package/dist/workflows/collectors/codex.js +265 -0
- package/dist/workflows/collectors/codex.js.map +1 -0
- package/dist/workflows/collectors/opencode.d.ts +6 -0
- package/dist/workflows/collectors/opencode.d.ts.map +1 -0
- package/dist/workflows/collectors/opencode.js +204 -0
- package/dist/workflows/collectors/opencode.js.map +1 -0
- package/dist/workflows/default-logger.d.ts +9 -0
- package/dist/workflows/default-logger.d.ts.map +1 -0
- package/dist/workflows/default-logger.js +104 -0
- package/dist/workflows/default-logger.js.map +1 -0
- package/dist/workflows/index.d.ts +4 -0
- package/dist/workflows/index.d.ts.map +1 -1
- package/dist/workflows/index.js +4 -0
- package/dist/workflows/index.js.map +1 -1
- package/dist/workflows/listr-renderer.d.ts +26 -0
- package/dist/workflows/listr-renderer.d.ts.map +1 -0
- package/dist/workflows/listr-renderer.js +232 -0
- package/dist/workflows/listr-renderer.js.map +1 -0
- package/dist/workflows/run-summary-table.d.ts +4 -0
- package/dist/workflows/run-summary-table.d.ts.map +1 -0
- package/dist/workflows/run-summary-table.js +98 -0
- package/dist/workflows/run-summary-table.js.map +1 -0
- package/dist/workflows/runner.d.ts +12 -1
- package/dist/workflows/runner.d.ts.map +1 -1
- package/dist/workflows/runner.js +107 -71
- package/dist/workflows/runner.js.map +1 -1
- package/dist/workflows/types.d.ts +2 -0
- package/dist/workflows/types.d.ts.map +1 -1
- package/dist/workflows/types.js.map +1 -1
- package/package.json +4 -2
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Consolidated CLI registry — single source of truth for all supported
|
|
3
|
+
* agent CLI metadata: binary names, non-interactive args, bypass flags,
|
|
4
|
+
* and well-known install paths.
|
|
5
|
+
*
|
|
6
|
+
* Consumers: runner.ts (buildNonInteractiveCommand, resolveCursorCli),
|
|
7
|
+
* spawn-from-env.ts (BYPASS_FLAGS), cli-resolver.ts (path resolution).
|
|
8
|
+
*
|
|
9
|
+
* NOTE: The Rust PTY spawner (src/pty.rs) maintains its own PATH fallback.
|
|
10
|
+
* When updating `COMMON_SEARCH_PATHS` here, also update the Rust fallback
|
|
11
|
+
* in `resolve_command_path()` at src/pty.rs:53-67.
|
|
12
|
+
*/
|
|
13
|
+
import type { AgentCli } from './workflows/types.js';
|
|
14
|
+
export interface CliDefinition {
|
|
15
|
+
/** Binary name(s) to try, in order of preference */
|
|
16
|
+
binaries: string[];
|
|
17
|
+
/** Build non-interactive mode args for a one-shot task */
|
|
18
|
+
nonInteractiveArgs: (task: string, extraArgs?: string[]) => string[];
|
|
19
|
+
/** Bypass flag for auto-approve / unattended mode */
|
|
20
|
+
bypassFlag?: string;
|
|
21
|
+
/** Bypass flag aliases (alternative forms accepted by the CLI) */
|
|
22
|
+
bypassAliases?: string[];
|
|
23
|
+
/** Extra install paths to check beyond PATH (resolved relative to $HOME) */
|
|
24
|
+
searchPaths?: string[];
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Common install directories checked when PATH is empty or incomplete.
|
|
28
|
+
* Paths containing `~` are expanded at resolution time.
|
|
29
|
+
*
|
|
30
|
+
* Keep in sync with the Rust fallback in src/pty.rs `resolve_command_path()`.
|
|
31
|
+
*/
|
|
32
|
+
export declare const COMMON_SEARCH_PATHS: string[];
|
|
33
|
+
/**
|
|
34
|
+
* Get the CLI definition for a given CLI identifier.
|
|
35
|
+
* Handles `cli:model` variants (e.g. `claude:opus`) by extracting the base CLI.
|
|
36
|
+
*/
|
|
37
|
+
export declare function getCliDefinition(cli: string): CliDefinition | undefined;
|
|
38
|
+
/**
|
|
39
|
+
* Get the full registry (read-only).
|
|
40
|
+
*/
|
|
41
|
+
export declare function getCliRegistry(): Readonly<Record<AgentCli, CliDefinition>>;
|
|
42
|
+
//# sourceMappingURL=cli-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-registry.d.ts","sourceRoot":"","sources":["../src/cli-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAIrD,MAAM,WAAW,aAAa;IAC5B,oDAAoD;IACpD,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,0DAA0D;IAC1D,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,KAAK,MAAM,EAAE,CAAC;IACrE,qDAAqD;IACrD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kEAAkE;IAClE,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAID;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,UAQ/B,CAAC;AAuFF;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAGvE;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAE1E"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Consolidated CLI registry — single source of truth for all supported
|
|
3
|
+
* agent CLI metadata: binary names, non-interactive args, bypass flags,
|
|
4
|
+
* and well-known install paths.
|
|
5
|
+
*
|
|
6
|
+
* Consumers: runner.ts (buildNonInteractiveCommand, resolveCursorCli),
|
|
7
|
+
* spawn-from-env.ts (BYPASS_FLAGS), cli-resolver.ts (path resolution).
|
|
8
|
+
*
|
|
9
|
+
* NOTE: The Rust PTY spawner (src/pty.rs) maintains its own PATH fallback.
|
|
10
|
+
* When updating `COMMON_SEARCH_PATHS` here, also update the Rust fallback
|
|
11
|
+
* in `resolve_command_path()` at src/pty.rs:53-67.
|
|
12
|
+
*/
|
|
13
|
+
// ── Well-known install paths ───────────────────────────────────────────────
|
|
14
|
+
/**
|
|
15
|
+
* Common install directories checked when PATH is empty or incomplete.
|
|
16
|
+
* Paths containing `~` are expanded at resolution time.
|
|
17
|
+
*
|
|
18
|
+
* Keep in sync with the Rust fallback in src/pty.rs `resolve_command_path()`.
|
|
19
|
+
*/
|
|
20
|
+
export const COMMON_SEARCH_PATHS = [
|
|
21
|
+
'~/.local/bin',
|
|
22
|
+
'~/.opencode/bin',
|
|
23
|
+
'~/.claude/local',
|
|
24
|
+
'/usr/local/bin',
|
|
25
|
+
'/usr/bin',
|
|
26
|
+
'/bin',
|
|
27
|
+
'/opt/homebrew/bin',
|
|
28
|
+
];
|
|
29
|
+
// ── Registry ───────────────────────────────────────────────────────────────
|
|
30
|
+
const CLI_REGISTRY = {
|
|
31
|
+
claude: {
|
|
32
|
+
binaries: ['claude'],
|
|
33
|
+
nonInteractiveArgs: (task, extra = []) => [
|
|
34
|
+
'-p',
|
|
35
|
+
'--dangerously-skip-permissions',
|
|
36
|
+
task,
|
|
37
|
+
...extra,
|
|
38
|
+
],
|
|
39
|
+
bypassFlag: '--dangerously-skip-permissions',
|
|
40
|
+
searchPaths: ['~/.claude/local'],
|
|
41
|
+
},
|
|
42
|
+
codex: {
|
|
43
|
+
binaries: ['codex'],
|
|
44
|
+
nonInteractiveArgs: (task, extra = []) => ['exec', task, ...extra],
|
|
45
|
+
bypassFlag: '--dangerously-bypass-approvals-and-sandbox',
|
|
46
|
+
bypassAliases: ['--full-auto'],
|
|
47
|
+
searchPaths: ['~/.local/bin'],
|
|
48
|
+
},
|
|
49
|
+
gemini: {
|
|
50
|
+
binaries: ['gemini'],
|
|
51
|
+
nonInteractiveArgs: (task, extra = []) => ['-p', task, ...extra],
|
|
52
|
+
bypassFlag: '--yolo',
|
|
53
|
+
bypassAliases: ['-y'],
|
|
54
|
+
},
|
|
55
|
+
opencode: {
|
|
56
|
+
binaries: ['opencode'],
|
|
57
|
+
nonInteractiveArgs: (task, extra = []) => ['--prompt', task, ...extra],
|
|
58
|
+
searchPaths: ['~/.opencode/bin'],
|
|
59
|
+
},
|
|
60
|
+
droid: {
|
|
61
|
+
binaries: ['droid'],
|
|
62
|
+
nonInteractiveArgs: (task, extra = []) => ['exec', task, ...extra],
|
|
63
|
+
},
|
|
64
|
+
aider: {
|
|
65
|
+
binaries: ['aider'],
|
|
66
|
+
nonInteractiveArgs: (task, extra = []) => [
|
|
67
|
+
'--message',
|
|
68
|
+
task,
|
|
69
|
+
'--yes-always',
|
|
70
|
+
'--no-git',
|
|
71
|
+
...extra,
|
|
72
|
+
],
|
|
73
|
+
},
|
|
74
|
+
goose: {
|
|
75
|
+
binaries: ['goose'],
|
|
76
|
+
nonInteractiveArgs: (task, extra = []) => [
|
|
77
|
+
'run',
|
|
78
|
+
'--text',
|
|
79
|
+
task,
|
|
80
|
+
'--no-session',
|
|
81
|
+
...extra,
|
|
82
|
+
],
|
|
83
|
+
},
|
|
84
|
+
'cursor-agent': {
|
|
85
|
+
binaries: ['cursor-agent'],
|
|
86
|
+
nonInteractiveArgs: (task, extra = []) => [
|
|
87
|
+
'--force',
|
|
88
|
+
'-p',
|
|
89
|
+
task,
|
|
90
|
+
...extra,
|
|
91
|
+
],
|
|
92
|
+
},
|
|
93
|
+
agent: {
|
|
94
|
+
binaries: ['agent'],
|
|
95
|
+
nonInteractiveArgs: (task, extra = []) => [
|
|
96
|
+
'--force',
|
|
97
|
+
'-p',
|
|
98
|
+
task,
|
|
99
|
+
...extra,
|
|
100
|
+
],
|
|
101
|
+
},
|
|
102
|
+
cursor: {
|
|
103
|
+
binaries: ['cursor-agent', 'agent'],
|
|
104
|
+
nonInteractiveArgs: (task, extra = []) => [
|
|
105
|
+
'--force',
|
|
106
|
+
'-p',
|
|
107
|
+
task,
|
|
108
|
+
...extra,
|
|
109
|
+
],
|
|
110
|
+
},
|
|
111
|
+
};
|
|
112
|
+
/**
|
|
113
|
+
* Get the CLI definition for a given CLI identifier.
|
|
114
|
+
* Handles `cli:model` variants (e.g. `claude:opus`) by extracting the base CLI.
|
|
115
|
+
*/
|
|
116
|
+
export function getCliDefinition(cli) {
|
|
117
|
+
const baseCli = cli.includes(':') ? cli.split(':')[0] : cli;
|
|
118
|
+
return CLI_REGISTRY[baseCli];
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Get the full registry (read-only).
|
|
122
|
+
*/
|
|
123
|
+
export function getCliRegistry() {
|
|
124
|
+
return CLI_REGISTRY;
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=cli-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-registry.js","sourceRoot":"","sources":["../src/cli-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI binary resolver — finds the actual binary path for a given agent CLI.
|
|
3
|
+
*
|
|
4
|
+
* Checks PATH first, then falls back to well-known install directories
|
|
5
|
+
* from the CLI registry. Results are memoized.
|
|
6
|
+
*/
|
|
7
|
+
import type { AgentCli } from './workflows/types.js';
|
|
8
|
+
export interface ResolvedCli {
|
|
9
|
+
/** The binary name that was found */
|
|
10
|
+
binary: string;
|
|
11
|
+
/** The full path to the binary */
|
|
12
|
+
path: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Clear the resolution cache. Useful for testing or after PATH changes.
|
|
16
|
+
*/
|
|
17
|
+
export declare function clearResolveCache(): void;
|
|
18
|
+
/**
|
|
19
|
+
* Resolve a CLI to its binary path. Checks PATH via `which`, then falls
|
|
20
|
+
* back to well-known install directories from the CLI registry.
|
|
21
|
+
*
|
|
22
|
+
* Results are memoized. Returns `undefined` if the binary cannot be found.
|
|
23
|
+
*/
|
|
24
|
+
export declare function resolveCli(cli: AgentCli): Promise<ResolvedCli | undefined>;
|
|
25
|
+
/**
|
|
26
|
+
* Synchronous version of `resolveCli`. Uses `which` via execFileSync
|
|
27
|
+
* and synchronous fs.accessSync. Prefer the async version when possible.
|
|
28
|
+
*/
|
|
29
|
+
export declare function resolveCliSync(cli: AgentCli): ResolvedCli | undefined;
|
|
30
|
+
//# sourceMappingURL=cli-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-resolver.d.ts","sourceRoot":"","sources":["../src/cli-resolver.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAOrD,MAAM,WAAW,WAAW;IAC1B,qCAAqC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;CACd;AAOD;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAExC;AAaD;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CA4ChF;AAID;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,QAAQ,GAAG,WAAW,GAAG,SAAS,CA8CrE"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI binary resolver — finds the actual binary path for a given agent CLI.
|
|
3
|
+
*
|
|
4
|
+
* Checks PATH first, then falls back to well-known install directories
|
|
5
|
+
* from the CLI registry. Results are memoized.
|
|
6
|
+
*/
|
|
7
|
+
import { execFile } from 'node:child_process';
|
|
8
|
+
import { access, constants } from 'node:fs/promises';
|
|
9
|
+
import { accessSync, constants as constantsSync } from 'node:fs';
|
|
10
|
+
import { join } from 'node:path';
|
|
11
|
+
import { homedir } from 'node:os';
|
|
12
|
+
import { promisify } from 'node:util';
|
|
13
|
+
import { getCliDefinition, COMMON_SEARCH_PATHS } from './cli-registry.js';
|
|
14
|
+
const execFileAsync = promisify(execFile);
|
|
15
|
+
// ── Memoization ────────────────────────────────────────────────────────────
|
|
16
|
+
// null sentinel means "looked up, not found" — avoids repeating expensive searches
|
|
17
|
+
const resolveCache = new Map();
|
|
18
|
+
/**
|
|
19
|
+
* Clear the resolution cache. Useful for testing or after PATH changes.
|
|
20
|
+
*/
|
|
21
|
+
export function clearResolveCache() {
|
|
22
|
+
resolveCache.clear();
|
|
23
|
+
}
|
|
24
|
+
// ── Path expansion ─────────────────────────────────────────────────────────
|
|
25
|
+
function expandHome(p) {
|
|
26
|
+
if (p.startsWith('~/')) {
|
|
27
|
+
return join(homedir(), p.slice(2));
|
|
28
|
+
}
|
|
29
|
+
return p;
|
|
30
|
+
}
|
|
31
|
+
// ── Async resolver ─────────────────────────────────────────────────────────
|
|
32
|
+
/**
|
|
33
|
+
* Resolve a CLI to its binary path. Checks PATH via `which`, then falls
|
|
34
|
+
* back to well-known install directories from the CLI registry.
|
|
35
|
+
*
|
|
36
|
+
* Results are memoized. Returns `undefined` if the binary cannot be found.
|
|
37
|
+
*/
|
|
38
|
+
export async function resolveCli(cli) {
|
|
39
|
+
if (resolveCache.has(cli)) {
|
|
40
|
+
return resolveCache.get(cli) ?? undefined;
|
|
41
|
+
}
|
|
42
|
+
const def = getCliDefinition(cli);
|
|
43
|
+
if (!def)
|
|
44
|
+
return undefined;
|
|
45
|
+
for (const binary of def.binaries) {
|
|
46
|
+
// Try PATH first via `which`
|
|
47
|
+
try {
|
|
48
|
+
const { stdout } = await execFileAsync('which', [binary]);
|
|
49
|
+
const path = stdout.trim();
|
|
50
|
+
if (path) {
|
|
51
|
+
const result = { binary, path };
|
|
52
|
+
resolveCache.set(cli, result);
|
|
53
|
+
return result;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
// not in PATH
|
|
58
|
+
}
|
|
59
|
+
// Try well-known install directories (CLI-specific + common)
|
|
60
|
+
const searchDirs = [...(def.searchPaths ?? []), ...COMMON_SEARCH_PATHS];
|
|
61
|
+
const seen = new Set();
|
|
62
|
+
for (const dir of searchDirs) {
|
|
63
|
+
const expanded = expandHome(dir);
|
|
64
|
+
if (seen.has(expanded))
|
|
65
|
+
continue;
|
|
66
|
+
seen.add(expanded);
|
|
67
|
+
const candidate = join(expanded, binary);
|
|
68
|
+
try {
|
|
69
|
+
await access(candidate, constants.X_OK);
|
|
70
|
+
const result = { binary, path: candidate };
|
|
71
|
+
resolveCache.set(cli, result);
|
|
72
|
+
return result;
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// not found here
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
resolveCache.set(cli, null);
|
|
80
|
+
return undefined;
|
|
81
|
+
}
|
|
82
|
+
// ── Sync resolver (for hot paths that can't be async) ──────────────────────
|
|
83
|
+
/**
|
|
84
|
+
* Synchronous version of `resolveCli`. Uses `which` via execFileSync
|
|
85
|
+
* and synchronous fs.accessSync. Prefer the async version when possible.
|
|
86
|
+
*/
|
|
87
|
+
export function resolveCliSync(cli) {
|
|
88
|
+
if (resolveCache.has(cli)) {
|
|
89
|
+
return resolveCache.get(cli) ?? undefined;
|
|
90
|
+
}
|
|
91
|
+
const def = getCliDefinition(cli);
|
|
92
|
+
if (!def)
|
|
93
|
+
return undefined;
|
|
94
|
+
const { execFileSync } = require('node:child_process');
|
|
95
|
+
for (const binary of def.binaries) {
|
|
96
|
+
// Try PATH first via `which`
|
|
97
|
+
try {
|
|
98
|
+
const stdout = execFileSync('which', [binary], { stdio: ['pipe', 'pipe', 'ignore'] });
|
|
99
|
+
const path = stdout.toString().trim();
|
|
100
|
+
if (path) {
|
|
101
|
+
const result = { binary, path };
|
|
102
|
+
resolveCache.set(cli, result);
|
|
103
|
+
return result;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
// not in PATH
|
|
108
|
+
}
|
|
109
|
+
// Try well-known install directories
|
|
110
|
+
const searchDirs = [...(def.searchPaths ?? []), ...COMMON_SEARCH_PATHS];
|
|
111
|
+
const seen = new Set();
|
|
112
|
+
for (const dir of searchDirs) {
|
|
113
|
+
const expanded = expandHome(dir);
|
|
114
|
+
if (seen.has(expanded))
|
|
115
|
+
continue;
|
|
116
|
+
seen.add(expanded);
|
|
117
|
+
const candidate = join(expanded, binary);
|
|
118
|
+
try {
|
|
119
|
+
accessSync(candidate, constantsSync.X_OK);
|
|
120
|
+
const result = { binary, path: candidate };
|
|
121
|
+
resolveCache.set(cli, result);
|
|
122
|
+
return result;
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
// not found here
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
resolveCache.set(cli, null);
|
|
130
|
+
return undefined;
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=cli-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-resolver.js","sourceRoot":"","sources":["../src/cli-resolver.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACpE,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACtE,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACpE,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACtE,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAEpE,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAEpE,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spawn-from-env.d.ts","sourceRoot":"","sources":["../src/spawn-from-env.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;
|
|
1
|
+
{"version":3,"file":"spawn-from-env.d.ts","sourceRoot":"","sources":["../src/spawn-from-env.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0DAA0D;IAC1D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,6CAA6C;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4CAA4C;IAC5C,4BAA4B,CAAC,EAAE,MAAM,CAAC;CACvC;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,oDAAoD;IACpD,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACzC,2BAA2B;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2BAA2B;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAqBD;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GACpD,aAAa,CA6Bf;AAqBD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,aAAa,GAAG,iBAAiB,CAiC1E;AAID;;;;;;;;;;;;;GAaG;AACH,wBAAsB,YAAY,CAChC,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,kBAAkB,CAAC,CAwD7B"}
|
package/dist/spawn-from-env.js
CHANGED
|
@@ -12,25 +12,16 @@
|
|
|
12
12
|
* ```
|
|
13
13
|
*/
|
|
14
14
|
import { AgentRelay } from "./relay.js";
|
|
15
|
-
|
|
16
|
-
const BYPASS_FLAGS = {
|
|
17
|
-
claude: { flag: "--dangerously-skip-permissions" },
|
|
18
|
-
codex: {
|
|
19
|
-
flag: "--dangerously-bypass-approvals-and-sandbox",
|
|
20
|
-
aliases: ["--full-auto"],
|
|
21
|
-
},
|
|
22
|
-
gemini: {
|
|
23
|
-
flag: "--yolo",
|
|
24
|
-
aliases: ["-y"],
|
|
25
|
-
},
|
|
26
|
-
};
|
|
15
|
+
import { getCliDefinition } from "./cli-registry.js";
|
|
27
16
|
/**
|
|
28
|
-
* Resolve bypass flag config for a CLI.
|
|
17
|
+
* Resolve bypass flag config for a CLI from the consolidated registry.
|
|
29
18
|
* Handles `claude:model` variants (e.g. `claude:opus`).
|
|
30
19
|
*/
|
|
31
20
|
function getBypassFlagConfig(cli) {
|
|
32
|
-
const
|
|
33
|
-
|
|
21
|
+
const def = getCliDefinition(cli);
|
|
22
|
+
if (!def?.bypassFlag)
|
|
23
|
+
return undefined;
|
|
24
|
+
return { flag: def.bypassFlag, aliases: def.bypassAliases };
|
|
34
25
|
}
|
|
35
26
|
// ── Env Parsing ────────────────────────────────────────────────────────────
|
|
36
27
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spawn-from-env.js","sourceRoot":"","sources":["../src/spawn-from-env.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"spawn-from-env.js","sourceRoot":"","sources":["../src/spawn-from-env.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAsDrD;;;GAGG;AACH,SAAS,mBAAmB,CAAC,GAAW;IACtC,MAAM,GAAG,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,CAAC,GAAG,EAAE,UAAU;QAAE,OAAO,SAAS,CAAC;IACvC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,GAAG,CAAC,aAAa,EAAE,CAAC;AAC9D,CAAC;AAED,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,UAAU,aAAa,CAC3B,MAA0C,OAAO,CAAC,GAAG;IAErD,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC;IAClC,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC;IAChC,MAAM,aAAa,GAAG,GAAG,CAAC,aAAa,CAAC;IAExC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,CAAC,UAAU;QAAE,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC5C,IAAI,CAAC,SAAS;QAAE,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC1C,IAAI,CAAC,aAAa;QAAE,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAElD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CACb,4DAA4D,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACjF,CAAC;IACJ,CAAC;IAED,OAAO;QACL,UAAU,EAAE,UAAW;QACvB,SAAS,EAAE,SAAU;QACrB,aAAa,EAAE,aAAc;QAC7B,UAAU,EAAE,GAAG,CAAC,UAAU,IAAI,SAAS;QACvC,UAAU,EAAE,GAAG,CAAC,UAAU,IAAI,SAAS;QACvC,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,SAAS;QACrC,cAAc,EAAE,GAAG,CAAC,cAAc,IAAI,SAAS;QAC/C,cAAc,EAAE,GAAG,CAAC,cAAc,IAAI,SAAS;QAC/C,kBAAkB,EAAE,GAAG,CAAC,kBAAkB,IAAI,SAAS;QACvD,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,SAAS;QACzC,4BAA4B,EAAE,GAAG,CAAC,4BAA4B,IAAI,SAAS;KAC5E,CAAC;AACJ,CAAC;AAED,8EAA8E;AAE9E;;GAEG;AACH,SAAS,SAAS,CAAC,GAAuB;IACxC,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACnC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;gBAAE,OAAO,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACvD,CAAC;QAAC,MAAM,CAAC;YACP,kCAAkC;QACpC,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC9C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAoB;IACrD,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,KAAK,CAAC,cAAc;QACnC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC;aAC5B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACpB,MAAM,CAAC,OAAO,CAAC;QACpB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAEhB,MAAM,aAAa,GAAG,KAAK,CAAC,4BAA4B,KAAK,GAAG,CAAC;IACjE,MAAM,YAAY,GAAG,mBAAmB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAE1D,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,MAAM,IAAI,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC;IAC5B,MAAM,YAAY,GAAG,YAAY;QAC/B,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,YAAY,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QACtD,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,gBAAgB,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAE5E,IAAI,YAAY,IAAI,CAAC,aAAa,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxD,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAC7B,aAAa,GAAG,IAAI,CAAC;IACvB,CAAC;IAED,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,UAAU;QACtB,GAAG,EAAE,KAAK,CAAC,SAAS;QACpB,IAAI;QACJ,QAAQ;QACR,IAAI,EAAE,KAAK,CAAC,UAAU;QACtB,GAAG,EAAE,KAAK,CAAC,SAAS;QACpB,KAAK,EAAE,KAAK,CAAC,WAAW;QACxB,aAAa;KACd,CAAC;AACJ,CAAC;AAED,8EAA8E;AAE9E;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,UAA+B,EAAE;IAEjC,MAAM,GAAG,GACP,OAAO,CAAC,GAAG,IAAK,OAAO,CAAC,GAA0C,CAAC;IACrE,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAE1C,OAAO,CAAC,GAAG,CACT,yCAAyC,MAAM,CAAC,IAAI,QAAQ,MAAM,CAAC,GAAG,GAAG;QACvE,YAAY,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,aAAa,EAAE,CACzE,CAAC;IACF,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CACT,0BAA0B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAC9F,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC;QAC3B,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,MAAM,CAAC,kBAAkB;QAC3D,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,UAAU,MAAM,CAAC,IAAI,EAAE;QACzD,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,GAAG,EAAE,MAAM,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE;QAChC,GAAG,EAAE,GAAwB;KAC9B,CAAC,CAAC;IAEH,KAAK,CAAC,cAAc,GAAG,CAAC,KAAK,EAAE,EAAE;QAC/B,OAAO,CAAC,GAAG,CAAC,mCAAmC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAC/D,CAAC,CAAC;IACF,KAAK,CAAC,YAAY,GAAG,CAAC,KAAK,EAAE,EAAE;QAC7B,OAAO,CAAC,GAAG,CAAC,iCAAiC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC,CAAC;IACF,KAAK,CAAC,aAAa,GAAG,CAAC,KAAK,EAAE,EAAE;QAC9B,OAAO,CAAC,GAAG,CACT,kCAAkC,KAAK,CAAC,IAAI,GAAG;YAC7C,QAAQ,KAAK,CAAC,QAAQ,IAAI,MAAM,WAAW,KAAK,CAAC,UAAU,IAAI,MAAM,EAAE,CAC1E,CAAC;IACJ,CAAC,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC;YACjC,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,IAAI,EAAE,MAAM,CAAC,IAAI;SAClB,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,WAAW,EAAE,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,iCAAiC,UAAU,EAAE,CAAC,CAAC;QAE3D,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;IAClD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,GAAG,CAAC,CAAC;QAC9C,MAAM,GAAG,CAAC;IACZ,CAAC;YAAS,CAAC;QACT,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC;IACzB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-session-collector.test.d.ts","sourceRoot":"","sources":["../../../src/workflows/__tests__/cli-session-collector.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import { mkdtempSync, rmSync } from 'node:fs';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { collectCliSession } from '../cli-session-collector.js';
|
|
6
|
+
const tempDirs = [];
|
|
7
|
+
const originalHome = process.env.HOME;
|
|
8
|
+
function makeTempDir(prefix) {
|
|
9
|
+
const dir = mkdtempSync(path.join(os.tmpdir(), prefix));
|
|
10
|
+
tempDirs.push(dir);
|
|
11
|
+
return dir;
|
|
12
|
+
}
|
|
13
|
+
async function importCollectorsWithHome(homeDir) {
|
|
14
|
+
process.env.HOME = homeDir;
|
|
15
|
+
vi.resetModules();
|
|
16
|
+
const [claudeModule, opencodeModule] = await Promise.all([
|
|
17
|
+
import('../collectors/claude.js'),
|
|
18
|
+
import('../collectors/opencode.js'),
|
|
19
|
+
]);
|
|
20
|
+
return {
|
|
21
|
+
ClaudeCodeCollector: claudeModule.ClaudeCodeCollector,
|
|
22
|
+
OpenCodeCollector: opencodeModule.OpenCodeCollector,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
afterEach(() => {
|
|
26
|
+
vi.resetModules();
|
|
27
|
+
process.env.HOME = originalHome;
|
|
28
|
+
while (tempDirs.length > 0) {
|
|
29
|
+
rmSync(tempDirs.pop(), { recursive: true, force: true });
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
describe('cli-session-collector', () => {
|
|
33
|
+
it('returns null for an unknown CLI', async () => {
|
|
34
|
+
const report = await collectCliSession({
|
|
35
|
+
cli: 'gemini',
|
|
36
|
+
cwd: '/tmp/project',
|
|
37
|
+
startedAt: 1000,
|
|
38
|
+
completedAt: 2000,
|
|
39
|
+
});
|
|
40
|
+
expect(report).toBeNull();
|
|
41
|
+
});
|
|
42
|
+
it('reports canCollect=false when configured data stores do not exist', async () => {
|
|
43
|
+
const homeDir = makeTempDir('cli-session-collector-empty-home-');
|
|
44
|
+
const { ClaudeCodeCollector, OpenCodeCollector } = await importCollectorsWithHome(homeDir);
|
|
45
|
+
const { CodexCollector } = await import('../collectors/codex.js');
|
|
46
|
+
expect(new ClaudeCodeCollector().canCollect()).toBe(false);
|
|
47
|
+
expect(new OpenCodeCollector().canCollect()).toBe(false);
|
|
48
|
+
expect(new CodexCollector({
|
|
49
|
+
historyPath: path.join(homeDir, 'missing-history.jsonl'),
|
|
50
|
+
statePath: path.join(homeDir, 'missing-state.sqlite'),
|
|
51
|
+
}).canCollect()).toBe(false);
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
//# sourceMappingURL=cli-session-collector.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-session-collector.test.js","sourceRoot":"","sources":["../../../src/workflows/__tests__/cli-session-collector.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.test.d.ts","sourceRoot":"","sources":["../../../../src/workflows/__tests__/collectors/claude.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
const tempDirs = [];
|
|
6
|
+
const originalHome = process.env.HOME;
|
|
7
|
+
function makeTempDir(prefix) {
|
|
8
|
+
const dir = mkdtempSync(path.join(os.tmpdir(), prefix));
|
|
9
|
+
tempDirs.push(dir);
|
|
10
|
+
return dir;
|
|
11
|
+
}
|
|
12
|
+
function encodeProjectPath(projectPath) {
|
|
13
|
+
return projectPath.replace(/\//g, '--').replace(/^-+/, '');
|
|
14
|
+
}
|
|
15
|
+
function createClaudeFixture(homeDir, cwd, timestamp) {
|
|
16
|
+
const claudeHome = path.join(homeDir, '.claude');
|
|
17
|
+
const projectsRoot = path.join(claudeHome, 'projects', encodeProjectPath(cwd));
|
|
18
|
+
mkdirSync(projectsRoot, { recursive: true });
|
|
19
|
+
const sessionId = 'session-claude-1';
|
|
20
|
+
writeFileSync(path.join(claudeHome, 'history.jsonl'), [
|
|
21
|
+
JSON.stringify({ timestamp: timestamp - 1000, project: '/other/project', sessionId: 'ignored-session' }),
|
|
22
|
+
JSON.stringify({ timestamp, project: cwd, sessionId }),
|
|
23
|
+
].join('\n'));
|
|
24
|
+
writeFileSync(path.join(projectsRoot, `${sessionId}.jsonl`), [
|
|
25
|
+
JSON.stringify({ type: 'user', text: 'Investigate the failing command' }),
|
|
26
|
+
JSON.stringify({ type: 'tool_use', name: 'bash' }),
|
|
27
|
+
JSON.stringify({
|
|
28
|
+
type: 'assistant',
|
|
29
|
+
message: {
|
|
30
|
+
model: 'claude-sonnet-4',
|
|
31
|
+
provider: 'anthropic',
|
|
32
|
+
usage: {
|
|
33
|
+
input_tokens: 42,
|
|
34
|
+
output_tokens: 24,
|
|
35
|
+
cache_read_input_tokens: 7,
|
|
36
|
+
},
|
|
37
|
+
content: [{ text: 'Final concise summary' }],
|
|
38
|
+
},
|
|
39
|
+
}),
|
|
40
|
+
].join('\n'));
|
|
41
|
+
return sessionId;
|
|
42
|
+
}
|
|
43
|
+
async function importCollectorWithHome(homeDir) {
|
|
44
|
+
process.env.HOME = homeDir;
|
|
45
|
+
vi.resetModules();
|
|
46
|
+
const module = await import('../../collectors/claude.js');
|
|
47
|
+
return module.ClaudeCodeCollector;
|
|
48
|
+
}
|
|
49
|
+
afterEach(() => {
|
|
50
|
+
vi.resetModules();
|
|
51
|
+
process.env.HOME = originalHome;
|
|
52
|
+
while (tempDirs.length > 0) {
|
|
53
|
+
rmSync(tempDirs.pop(), { recursive: true, force: true });
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
describe('ClaudeCodeCollector', () => {
|
|
57
|
+
it('matches by project path and timestamp and reads the session jsonl', async () => {
|
|
58
|
+
const homeDir = makeTempDir('claude-home-');
|
|
59
|
+
const cwd = '/repo/project';
|
|
60
|
+
const timestamp = 50_000;
|
|
61
|
+
const sessionId = createClaudeFixture(homeDir, cwd, timestamp);
|
|
62
|
+
const ClaudeCodeCollector = await importCollectorWithHome(homeDir);
|
|
63
|
+
const report = await new ClaudeCodeCollector().collect({
|
|
64
|
+
cli: 'claude',
|
|
65
|
+
cwd,
|
|
66
|
+
startedAt: timestamp - 100,
|
|
67
|
+
completedAt: timestamp + 2_000,
|
|
68
|
+
});
|
|
69
|
+
expect(report).not.toBeNull();
|
|
70
|
+
expect(report?.sessionId).toBe(sessionId);
|
|
71
|
+
expect(report?.model).toBe('claude-sonnet-4');
|
|
72
|
+
expect(report?.provider).toBe('anthropic');
|
|
73
|
+
expect(report?.tokens).toEqual({ input: 42, output: 24, cacheRead: 7 });
|
|
74
|
+
expect(report?.turns).toBe(1);
|
|
75
|
+
expect(report?.toolCalls).toEqual([{ name: 'bash', count: 1 }]);
|
|
76
|
+
expect(report?.summary).toBe('Final concise summary');
|
|
77
|
+
expect(report?.finalStatus).toBe('completed');
|
|
78
|
+
});
|
|
79
|
+
it('returns false from canCollect when history and project files are missing', async () => {
|
|
80
|
+
const homeDir = makeTempDir('claude-empty-home-');
|
|
81
|
+
const ClaudeCodeCollector = await importCollectorWithHome(homeDir);
|
|
82
|
+
expect(new ClaudeCodeCollector().canCollect()).toBe(false);
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
//# sourceMappingURL=claude.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.test.js","sourceRoot":"","sources":["../../../../src/workflows/__tests__/collectors/claude.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.test.d.ts","sourceRoot":"","sources":["../../../../src/workflows/__tests__/collectors/codex.test.ts"],"names":[],"mappings":""}
|