@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.
Files changed (89) hide show
  1. package/bin/agent-relay-broker-darwin-arm64 +0 -0
  2. package/bin/agent-relay-broker-darwin-x64 +0 -0
  3. package/bin/agent-relay-broker-linux-arm64 +0 -0
  4. package/bin/agent-relay-broker-linux-x64 +0 -0
  5. package/dist/cli-registry.d.ts +42 -0
  6. package/dist/cli-registry.d.ts.map +1 -0
  7. package/dist/cli-registry.js +126 -0
  8. package/dist/cli-registry.js.map +1 -0
  9. package/dist/cli-resolver.d.ts +30 -0
  10. package/dist/cli-resolver.d.ts.map +1 -0
  11. package/dist/cli-resolver.js +132 -0
  12. package/dist/cli-resolver.js.map +1 -0
  13. package/dist/index.d.ts +2 -0
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +2 -0
  16. package/dist/index.js.map +1 -1
  17. package/dist/spawn-from-env.d.ts.map +1 -1
  18. package/dist/spawn-from-env.js +6 -15
  19. package/dist/spawn-from-env.js.map +1 -1
  20. package/dist/workflows/__tests__/cli-session-collector.test.d.ts +2 -0
  21. package/dist/workflows/__tests__/cli-session-collector.test.d.ts.map +1 -0
  22. package/dist/workflows/__tests__/cli-session-collector.test.js +54 -0
  23. package/dist/workflows/__tests__/cli-session-collector.test.js.map +1 -0
  24. package/dist/workflows/__tests__/collectors/claude.test.d.ts +2 -0
  25. package/dist/workflows/__tests__/collectors/claude.test.d.ts.map +1 -0
  26. package/dist/workflows/__tests__/collectors/claude.test.js +85 -0
  27. package/dist/workflows/__tests__/collectors/claude.test.js.map +1 -0
  28. package/dist/workflows/__tests__/collectors/codex.test.d.ts +2 -0
  29. package/dist/workflows/__tests__/collectors/codex.test.d.ts.map +1 -0
  30. package/dist/workflows/__tests__/collectors/codex.test.js +67 -0
  31. package/dist/workflows/__tests__/collectors/codex.test.js.map +1 -0
  32. package/dist/workflows/__tests__/collectors/opencode.test.d.ts +2 -0
  33. package/dist/workflows/__tests__/collectors/opencode.test.d.ts.map +1 -0
  34. package/dist/workflows/__tests__/collectors/opencode.test.js +119 -0
  35. package/dist/workflows/__tests__/collectors/opencode.test.js.map +1 -0
  36. package/dist/workflows/__tests__/run-summary-table.test.d.ts +2 -0
  37. package/dist/workflows/__tests__/run-summary-table.test.d.ts.map +1 -0
  38. package/dist/workflows/__tests__/run-summary-table.test.js +130 -0
  39. package/dist/workflows/__tests__/run-summary-table.test.js.map +1 -0
  40. package/dist/workflows/__tests__/step-cwd.test.d.ts +2 -0
  41. package/dist/workflows/__tests__/step-cwd.test.d.ts.map +1 -0
  42. package/dist/workflows/__tests__/step-cwd.test.js +42 -0
  43. package/dist/workflows/__tests__/step-cwd.test.js.map +1 -0
  44. package/dist/workflows/builder.d.ts +7 -0
  45. package/dist/workflows/builder.d.ts.map +1 -1
  46. package/dist/workflows/builder.js +40 -5
  47. package/dist/workflows/builder.js.map +1 -1
  48. package/dist/workflows/cli-session-collector.d.ts +39 -0
  49. package/dist/workflows/cli-session-collector.d.ts.map +1 -0
  50. package/dist/workflows/cli-session-collector.js +23 -0
  51. package/dist/workflows/cli-session-collector.js.map +1 -0
  52. package/dist/workflows/cli.js +228 -48
  53. package/dist/workflows/cli.js.map +1 -1
  54. package/dist/workflows/collectors/claude.d.ts +6 -0
  55. package/dist/workflows/collectors/claude.d.ts.map +1 -0
  56. package/dist/workflows/collectors/claude.js +330 -0
  57. package/dist/workflows/collectors/claude.js.map +1 -0
  58. package/dist/workflows/collectors/codex.d.ts +18 -0
  59. package/dist/workflows/collectors/codex.d.ts.map +1 -0
  60. package/dist/workflows/collectors/codex.js +265 -0
  61. package/dist/workflows/collectors/codex.js.map +1 -0
  62. package/dist/workflows/collectors/opencode.d.ts +6 -0
  63. package/dist/workflows/collectors/opencode.d.ts.map +1 -0
  64. package/dist/workflows/collectors/opencode.js +204 -0
  65. package/dist/workflows/collectors/opencode.js.map +1 -0
  66. package/dist/workflows/default-logger.d.ts +9 -0
  67. package/dist/workflows/default-logger.d.ts.map +1 -0
  68. package/dist/workflows/default-logger.js +104 -0
  69. package/dist/workflows/default-logger.js.map +1 -0
  70. package/dist/workflows/index.d.ts +4 -0
  71. package/dist/workflows/index.d.ts.map +1 -1
  72. package/dist/workflows/index.js +4 -0
  73. package/dist/workflows/index.js.map +1 -1
  74. package/dist/workflows/listr-renderer.d.ts +26 -0
  75. package/dist/workflows/listr-renderer.d.ts.map +1 -0
  76. package/dist/workflows/listr-renderer.js +232 -0
  77. package/dist/workflows/listr-renderer.js.map +1 -0
  78. package/dist/workflows/run-summary-table.d.ts +4 -0
  79. package/dist/workflows/run-summary-table.d.ts.map +1 -0
  80. package/dist/workflows/run-summary-table.js +98 -0
  81. package/dist/workflows/run-summary-table.js.map +1 -0
  82. package/dist/workflows/runner.d.ts +12 -1
  83. package/dist/workflows/runner.d.ts.map +1 -1
  84. package/dist/workflows/runner.js +107 -71
  85. package/dist/workflows/runner.js.map +1 -1
  86. package/dist/workflows/types.d.ts +2 -0
  87. package/dist/workflows/types.d.ts.map +1 -1
  88. package/dist/workflows/types.js.map +1 -1
  89. 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
@@ -11,4 +11,6 @@ export * from './shadow.js';
11
11
  export * from './relay-adapter.js';
12
12
  export * from './workflows/index.js';
13
13
  export * from './spawn-from-env.js';
14
+ export * from './cli-registry.js';
15
+ export * from './cli-resolver.js';
14
16
  //# sourceMappingURL=index.d.ts.map
@@ -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
@@ -10,4 +10,6 @@ export * from './shadow.js';
10
10
  export * from './relay-adapter.js';
11
11
  export * from './workflows/index.js';
12
12
  export * from './spawn-from-env.js';
13
+ export * from './cli-registry.js';
14
+ export * from './cli-resolver.js';
13
15
  //# sourceMappingURL=index.js.map
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;AAMH,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;AAiCD;;;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"}
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"}
@@ -12,25 +12,16 @@
12
12
  * ```
13
13
  */
14
14
  import { AgentRelay } from "./relay.js";
15
- /** SDK-owned bypass flag mapping. Cloud must NOT duplicate these. */
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 baseCli = cli.includes(":") ? cli.split(":")[0] : cli;
33
- return BYPASS_FLAGS[baseCli];
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":"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"}
1
+ {"version":3,"file":"spawn-from-env.js","sourceRoot":"","sources":["../src/spawn-from-env.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cli-session-collector.test.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=claude.test.d.ts.map
@@ -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":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxE,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,QAAQ,GAAa,EAAE,CAAC;AAC9B,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AAEtC,SAAS,WAAW,CAAC,MAAc;IACjC,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;IACxD,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnB,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,iBAAiB,CAAC,WAAmB;IAC5C,OAAO,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAe,EAAE,GAAW,EAAE,SAAiB;IAC1E,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACjD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/E,SAAS,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE7C,MAAM,SAAS,GAAG,kBAAkB,CAAC;IACrC,aAAa,CACX,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,EACtC;QACE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI,EAAE,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC;QACxG,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;KACvD,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;IAEF,aAAa,CACX,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,SAAS,QAAQ,CAAC,EAC7C;QACE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iCAAiC,EAAE,CAAC;QACzE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAClD,IAAI,CAAC,SAAS,CAAC;YACb,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE;gBACP,KAAK,EAAE,iBAAiB;gBACxB,QAAQ,EAAE,WAAW;gBACrB,KAAK,EAAE;oBACL,YAAY,EAAE,EAAE;oBAChB,aAAa,EAAE,EAAE;oBACjB,uBAAuB,EAAE,CAAC;iBAC3B;gBACD,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC;aAC7C;SACF,CAAC;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;IAEF,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,KAAK,UAAU,uBAAuB,CAAC,OAAe;IACpD,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC;IAC3B,EAAE,CAAC,YAAY,EAAE,CAAC;IAClB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,4BAA4B,CAAC,CAAC;IAC1D,OAAO,MAAM,CAAC,mBAAmB,CAAC;AACpC,CAAC;AAED,SAAS,CAAC,GAAG,EAAE;IACb,EAAE,CAAC,YAAY,EAAE,CAAC;IAClB,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,YAAY,CAAC;IAChC,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QACjF,MAAM,OAAO,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC;QAC5C,MAAM,GAAG,GAAG,eAAe,CAAC;QAC5B,MAAM,SAAS,GAAG,MAAM,CAAC;QACzB,MAAM,SAAS,GAAG,mBAAmB,CAAC,OAAO,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;QAC/D,MAAM,mBAAmB,GAAG,MAAM,uBAAuB,CAAC,OAAO,CAAC,CAAC;QAEnE,MAAM,MAAM,GAAG,MAAM,IAAI,mBAAmB,EAAE,CAAC,OAAO,CAAC;YACrD,GAAG,EAAE,QAAQ;YACb,GAAG;YACH,SAAS,EAAE,SAAS,GAAG,GAAG;YAC1B,WAAW,EAAE,SAAS,GAAG,KAAK;SAC/B,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC9B,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC3C,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;QACxE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAChE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;QACxF,MAAM,OAAO,GAAG,WAAW,CAAC,oBAAoB,CAAC,CAAC;QAClD,MAAM,mBAAmB,GAAG,MAAM,uBAAuB,CAAC,OAAO,CAAC,CAAC;QAEnE,MAAM,CAAC,IAAI,mBAAmB,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=codex.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.test.d.ts","sourceRoot":"","sources":["../../../../src/workflows/__tests__/collectors/codex.test.ts"],"names":[],"mappings":""}