@rk0429/agentic-relay 2.0.10 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +11 -318
  2. package/dist/application/spawn-agents-service.d.ts +20 -0
  3. package/dist/application/spawn-agents-service.js +222 -0
  4. package/dist/application/spawn-agents-service.js.map +1 -0
  5. package/dist/bin/relay.d.ts +2 -0
  6. package/dist/bin/relay.js +47 -0
  7. package/dist/bin/relay.js.map +1 -0
  8. package/dist/core/errors.d.ts +14 -0
  9. package/dist/core/errors.js +29 -0
  10. package/dist/core/errors.js.map +1 -0
  11. package/dist/core/types.d.ts +69 -0
  12. package/dist/core/types.js +10 -0
  13. package/dist/core/types.js.map +1 -0
  14. package/dist/domain/depth.d.ts +3 -0
  15. package/dist/domain/depth.js +31 -0
  16. package/dist/domain/depth.js.map +1 -0
  17. package/dist/domain/routing.d.ts +8 -0
  18. package/dist/domain/routing.js +58 -0
  19. package/dist/domain/routing.js.map +1 -0
  20. package/dist/index.d.ts +8 -0
  21. package/dist/index.js +9 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/infrastructure/backends/backend-registry.d.ts +20 -0
  24. package/dist/infrastructure/backends/backend-registry.js +86 -0
  25. package/dist/infrastructure/backends/backend-registry.js.map +1 -0
  26. package/dist/infrastructure/backends/cli-backend-executor.d.ts +12 -0
  27. package/dist/infrastructure/backends/cli-backend-executor.js +210 -0
  28. package/dist/infrastructure/backends/cli-backend-executor.js.map +1 -0
  29. package/dist/infrastructure/process/process-executor.d.ts +18 -0
  30. package/dist/infrastructure/process/process-executor.js +54 -0
  31. package/dist/infrastructure/process/process-executor.js.map +1 -0
  32. package/dist/infrastructure/store/relay-store.d.ts +14 -0
  33. package/dist/infrastructure/store/relay-store.js +68 -0
  34. package/dist/infrastructure/store/relay-store.js.map +1 -0
  35. package/dist/interfaces/mcp/relay-mcp-server.d.ts +7 -0
  36. package/dist/interfaces/mcp/relay-mcp-server.js +54 -0
  37. package/dist/interfaces/mcp/relay-mcp-server.js.map +1 -0
  38. package/package.json +18 -54
  39. package/LICENSE +0 -201
  40. package/dist/relay.mjs +0 -14131
@@ -0,0 +1,29 @@
1
+ export class RelayError extends Error {
2
+ code;
3
+ causeData;
4
+ constructor(code, message, causeData) {
5
+ super(message);
6
+ this.name = "RelayError";
7
+ this.code = code;
8
+ this.causeData = causeData;
9
+ }
10
+ }
11
+ export class ValidationError extends RelayError {
12
+ constructor(message, causeData) {
13
+ super("VALIDATION_ERROR", message, causeData);
14
+ this.name = "ValidationError";
15
+ }
16
+ }
17
+ export class DepthLimitError extends RelayError {
18
+ constructor(message) {
19
+ super("DEPTH_LIMIT_EXCEEDED", message);
20
+ this.name = "DepthLimitError";
21
+ }
22
+ }
23
+ export class BackendUnavailableError extends RelayError {
24
+ constructor(message, causeData) {
25
+ super("BACKEND_UNAVAILABLE", message, causeData);
26
+ this.name = "BackendUnavailableError";
27
+ }
28
+ }
29
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,UAAW,SAAQ,KAAK;IACnB,IAAI,CAAS;IACb,SAAS,CAAW;IAEpC,YAAY,IAAY,EAAE,OAAe,EAAE,SAAmB;QAC5D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,UAAU;IAC7C,YAAY,OAAe,EAAE,SAAmB;QAC9C,KAAK,CAAC,kBAAkB,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,UAAU;IAC7C,YAAY,OAAe;QACzB,KAAK,CAAC,sBAAsB,EAAE,OAAO,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED,MAAM,OAAO,uBAAwB,SAAQ,UAAU;IACrD,YAAY,OAAe,EAAE,SAAmB;QAC9C,KAAK,CAAC,qBAAqB,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QACjD,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IACxC,CAAC;CACF"}
@@ -0,0 +1,69 @@
1
+ export declare const BACKEND_TYPES: readonly ["claude", "codex", "gemini"];
2
+ export type BackendType = (typeof BACKEND_TYPES)[number];
3
+ export declare const TASK_TYPES: readonly ["orchestration", "research", "document_review", "code_writing", "document_writing", "code_review"];
4
+ export type TaskType = (typeof TASK_TYPES)[number];
5
+ export type ExecutionStatus = "success" | "error";
6
+ export interface SpawnAgentInput {
7
+ backend?: BackendType;
8
+ prompt: string;
9
+ task_id?: string;
10
+ task_type?: TaskType;
11
+ session_id?: string;
12
+ system_prompt?: string;
13
+ }
14
+ export interface SpawnAgentsInput {
15
+ agents: SpawnAgentInput[];
16
+ max_depth?: number;
17
+ }
18
+ export interface RoutingInfo {
19
+ resolved: BackendType;
20
+ fellBack: boolean;
21
+ fallbackReason?: string;
22
+ }
23
+ export interface HandoffInfo {
24
+ mode: "cross_backend_handoff";
25
+ source_session_id: string;
26
+ source_backend: BackendType;
27
+ response_path: string;
28
+ }
29
+ export interface SpawnAgentResult {
30
+ session_id: string;
31
+ backend: BackendType;
32
+ summary: string;
33
+ full_response_path: string;
34
+ status: ExecutionStatus;
35
+ routing: RoutingInfo;
36
+ handoff?: HandoffInfo;
37
+ }
38
+ export interface RelaySessionMetadata {
39
+ relaySessionId: string;
40
+ backend: BackendType;
41
+ backendSessionId: string;
42
+ cwd: string;
43
+ createdAt: string;
44
+ updatedAt: string;
45
+ handoffFrom?: HandoffInfo;
46
+ }
47
+ export interface LogEntry {
48
+ timestamp: string;
49
+ session_id: string;
50
+ task_id?: string;
51
+ backend: BackendType;
52
+ event_type: "agent_spawned" | "agent_completed" | "agent_failed" | "routing_fallback";
53
+ status: "running" | "success" | "error";
54
+ details?: Record<string, unknown>;
55
+ }
56
+ export interface SpawnExecutionRequest {
57
+ relaySessionId: string;
58
+ backend: BackendType;
59
+ prompt: string;
60
+ systemPrompt?: string;
61
+ backendSessionId?: string;
62
+ cwd: string;
63
+ env: NodeJS.ProcessEnv;
64
+ signal?: AbortSignal;
65
+ }
66
+ export interface BackendExecutionResult {
67
+ output: string;
68
+ backendSessionId: string;
69
+ }
@@ -0,0 +1,10 @@
1
+ export const BACKEND_TYPES = ["claude", "codex", "gemini"];
2
+ export const TASK_TYPES = [
3
+ "orchestration",
4
+ "research",
5
+ "document_review",
6
+ "code_writing",
7
+ "document_writing",
8
+ "code_review",
9
+ ];
10
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAU,CAAC;AAGpE,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,eAAe;IACf,UAAU;IACV,iBAAiB;IACjB,cAAc;IACd,kBAAkB;IAClB,aAAa;CACL,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function getCurrentDepth(env: NodeJS.ProcessEnv): number;
2
+ export declare function resolveMaxDepth(requestedMaxDepth: number | undefined, env: NodeJS.ProcessEnv): number;
3
+ export declare function validateDepth(currentDepth: number, maxDepth: number): void;
@@ -0,0 +1,31 @@
1
+ import { DepthLimitError, ValidationError } from "../core/errors.js";
2
+ const DEFAULT_MAX_DEPTH = 5;
3
+ export function getCurrentDepth(env) {
4
+ const raw = env.RELAY_CALL_DEPTH;
5
+ if (!raw) {
6
+ return 0;
7
+ }
8
+ const value = Number.parseInt(raw, 10);
9
+ if (!Number.isInteger(value) || value < 0) {
10
+ throw new ValidationError(`Invalid RELAY_CALL_DEPTH: ${raw}`);
11
+ }
12
+ return value;
13
+ }
14
+ export function resolveMaxDepth(requestedMaxDepth, env) {
15
+ const inheritedRaw = env.RELAY_MAX_DEPTH;
16
+ const inherited = inheritedRaw
17
+ ? Number.parseInt(inheritedRaw, 10)
18
+ : DEFAULT_MAX_DEPTH;
19
+ const requested = requestedMaxDepth ?? inherited;
20
+ const effective = Math.min(requested, inherited);
21
+ if (!Number.isInteger(effective) || effective <= 0) {
22
+ throw new ValidationError(`Invalid max_depth: ${requestedMaxDepth}`);
23
+ }
24
+ return effective;
25
+ }
26
+ export function validateDepth(currentDepth, maxDepth) {
27
+ if (currentDepth >= maxDepth) {
28
+ throw new DepthLimitError(`Call depth ${currentDepth} has reached the configured limit ${maxDepth}.`);
29
+ }
30
+ }
31
+ //# sourceMappingURL=depth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"depth.js","sourceRoot":"","sources":["../../src/domain/depth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAErE,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAE5B,MAAM,UAAU,eAAe,CAAC,GAAsB;IACpD,MAAM,GAAG,GAAG,GAAG,CAAC,gBAAgB,CAAC;IACjC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACvC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,eAAe,CAAC,6BAA6B,GAAG,EAAE,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,iBAAqC,EACrC,GAAsB;IAEtB,MAAM,YAAY,GAAG,GAAG,CAAC,eAAe,CAAC;IACzC,MAAM,SAAS,GAAG,YAAY;QAC5B,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,EAAE,EAAE,CAAC;QACnC,CAAC,CAAC,iBAAiB,CAAC;IACtB,MAAM,SAAS,GAAG,iBAAiB,IAAI,SAAS,CAAC;IACjD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAEjD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,eAAe,CAAC,sBAAsB,iBAAiB,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,YAAoB,EAAE,QAAgB;IAClE,IAAI,YAAY,IAAI,QAAQ,EAAE,CAAC;QAC7B,MAAM,IAAI,eAAe,CACvB,cAAc,YAAY,qCAAqC,QAAQ,GAAG,CAC3E,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { type BackendType, type RoutingInfo, type TaskType } from "../core/types.js";
2
+ export declare function assertValidBackend(backend: string | undefined): backend is BackendType;
3
+ export declare function assertValidTaskType(taskType: string | undefined): taskType is TaskType;
4
+ export declare function resolveBackend(options: {
5
+ explicitBackend?: string;
6
+ taskType?: string;
7
+ installedBackends: BackendType[];
8
+ }): RoutingInfo;
@@ -0,0 +1,58 @@
1
+ import { BACKEND_TYPES, TASK_TYPES, } from "../core/types.js";
2
+ import { BackendUnavailableError, ValidationError, } from "../core/errors.js";
3
+ const DEFAULT_ROUTING = {
4
+ orchestration: "claude",
5
+ document_writing: "claude",
6
+ code_review: "claude",
7
+ research: "codex",
8
+ document_review: "codex",
9
+ code_writing: "codex",
10
+ };
11
+ const FALLBACK_ORDER = ["claude", "codex", "gemini"];
12
+ export function assertValidBackend(backend) {
13
+ return backend !== undefined && BACKEND_TYPES.includes(backend);
14
+ }
15
+ export function assertValidTaskType(taskType) {
16
+ return taskType !== undefined && TASK_TYPES.includes(taskType);
17
+ }
18
+ export function resolveBackend(options) {
19
+ const { explicitBackend, taskType, installedBackends } = options;
20
+ if (installedBackends.length === 0) {
21
+ throw new BackendUnavailableError("No supported backend CLI is installed.");
22
+ }
23
+ if (explicitBackend !== undefined && !assertValidBackend(explicitBackend)) {
24
+ throw new ValidationError(`Unknown backend: ${explicitBackend}`);
25
+ }
26
+ if (taskType !== undefined && !assertValidTaskType(taskType)) {
27
+ throw new ValidationError(`Unknown task_type: ${taskType}`);
28
+ }
29
+ if (explicitBackend) {
30
+ if (!installedBackends.includes(explicitBackend)) {
31
+ throw new BackendUnavailableError(`Backend ${explicitBackend} is not installed.`);
32
+ }
33
+ return {
34
+ resolved: explicitBackend,
35
+ fellBack: false,
36
+ };
37
+ }
38
+ if (!taskType) {
39
+ throw new ValidationError("Either backend or task_type must be specified.");
40
+ }
41
+ const preferred = DEFAULT_ROUTING[taskType];
42
+ if (installedBackends.includes(preferred)) {
43
+ return {
44
+ resolved: preferred,
45
+ fellBack: false,
46
+ };
47
+ }
48
+ const fallback = FALLBACK_ORDER.find((candidate) => installedBackends.includes(candidate));
49
+ if (!fallback) {
50
+ throw new BackendUnavailableError("No installed backend is available.");
51
+ }
52
+ return {
53
+ resolved: fallback,
54
+ fellBack: true,
55
+ fallbackReason: `Preferred backend ${preferred} is not installed.`,
56
+ };
57
+ }
58
+ //# sourceMappingURL=routing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing.js","sourceRoot":"","sources":["../../src/domain/routing.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,UAAU,GAIX,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,uBAAuB,EACvB,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,eAAe,GAAkC;IACrD,aAAa,EAAE,QAAQ;IACvB,gBAAgB,EAAE,QAAQ;IAC1B,WAAW,EAAE,QAAQ;IACrB,QAAQ,EAAE,OAAO;IACjB,eAAe,EAAE,OAAO;IACxB,YAAY,EAAE,OAAO;CACtB,CAAC;AAEF,MAAM,cAAc,GAAkB,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;AAEpE,MAAM,UAAU,kBAAkB,CAChC,OAA2B;IAE3B,OAAO,OAAO,KAAK,SAAS,IAAI,aAAa,CAAC,QAAQ,CAAC,OAAsB,CAAC,CAAC;AACjF,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,QAA4B;IAE5B,OAAO,QAAQ,KAAK,SAAS,IAAI,UAAU,CAAC,QAAQ,CAAC,QAAoB,CAAC,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAI9B;IACC,MAAM,EAAE,eAAe,EAAE,QAAQ,EAAE,iBAAiB,EAAE,GAAG,OAAO,CAAC;IAEjE,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,uBAAuB,CAAC,wCAAwC,CAAC,CAAC;IAC9E,CAAC;IAED,IAAI,eAAe,KAAK,SAAS,IAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC,EAAE,CAAC;QAC1E,MAAM,IAAI,eAAe,CAAC,oBAAoB,eAAe,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7D,MAAM,IAAI,eAAe,CAAC,sBAAsB,QAAQ,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,eAAe,EAAE,CAAC;QACpB,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,uBAAuB,CAC/B,WAAW,eAAe,oBAAoB,CAC/C,CAAC;QACJ,CAAC;QAED,OAAO;YACL,QAAQ,EAAE,eAAe;YACzB,QAAQ,EAAE,KAAK;SAChB,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,eAAe,CAAC,gDAAgD,CAAC,CAAC;IAC9E,CAAC;IAED,MAAM,SAAS,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAI,iBAAiB,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1C,OAAO;YACL,QAAQ,EAAE,SAAS;YACnB,QAAQ,EAAE,KAAK;SAChB,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CACjD,iBAAiB,CAAC,QAAQ,CAAC,SAAS,CAAC,CACtC,CAAC;IAEF,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,uBAAuB,CAAC,oCAAoC,CAAC,CAAC;IAC1E,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,QAAQ;QAClB,QAAQ,EAAE,IAAI;QACd,cAAc,EAAE,qBAAqB,SAAS,oBAAoB;KACnE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ export * from "./application/spawn-agents-service.js";
2
+ export * from "./core/errors.js";
3
+ export * from "./core/types.js";
4
+ export * from "./infrastructure/backends/backend-registry.js";
5
+ export * from "./infrastructure/backends/cli-backend-executor.js";
6
+ export * from "./infrastructure/process/process-executor.js";
7
+ export * from "./infrastructure/store/relay-store.js";
8
+ export * from "./interfaces/mcp/relay-mcp-server.js";
package/dist/index.js ADDED
@@ -0,0 +1,9 @@
1
+ export * from "./application/spawn-agents-service.js";
2
+ export * from "./core/errors.js";
3
+ export * from "./core/types.js";
4
+ export * from "./infrastructure/backends/backend-registry.js";
5
+ export * from "./infrastructure/backends/cli-backend-executor.js";
6
+ export * from "./infrastructure/process/process-executor.js";
7
+ export * from "./infrastructure/store/relay-store.js";
8
+ export * from "./interfaces/mcp/relay-mcp-server.js";
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,uCAAuC,CAAC;AACtD,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,+CAA+C,CAAC;AAC9D,cAAc,mDAAmD,CAAC;AAClE,cAAc,8CAA8C,CAAC;AAC7D,cAAc,uCAAuC,CAAC;AACtD,cAAc,sCAAsC,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { BackendType } from "../../core/types.js";
2
+ export interface SubagentControlPolicy {
3
+ cliFlags: string[];
4
+ settingsOverrides?: Record<string, unknown>;
5
+ }
6
+ export interface BackendProfile {
7
+ type: BackendType;
8
+ command: string;
9
+ controlPolicy: SubagentControlPolicy;
10
+ }
11
+ export interface CommandAvailabilityChecker {
12
+ isAvailable(command: string): Promise<boolean>;
13
+ }
14
+ export declare class BackendRegistry {
15
+ private readonly checker;
16
+ private readonly commandOverrides;
17
+ constructor(checker?: CommandAvailabilityChecker, commandOverrides?: Partial<Record<BackendType, string>>);
18
+ getProfile(type: BackendType): BackendProfile;
19
+ detectInstalled(): Promise<BackendType[]>;
20
+ }
@@ -0,0 +1,86 @@
1
+ import { access } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { BACKEND_TYPES } from "../../core/types.js";
4
+ class PathCommandAvailabilityChecker {
5
+ async isAvailable(command) {
6
+ if (path.isAbsolute(command)) {
7
+ try {
8
+ await access(command);
9
+ return true;
10
+ }
11
+ catch {
12
+ return false;
13
+ }
14
+ }
15
+ const pathValue = process.env.PATH ?? "";
16
+ for (const segment of pathValue.split(path.delimiter)) {
17
+ if (!segment) {
18
+ continue;
19
+ }
20
+ const candidate = path.join(segment, command);
21
+ try {
22
+ await access(candidate);
23
+ return true;
24
+ }
25
+ catch {
26
+ continue;
27
+ }
28
+ }
29
+ return false;
30
+ }
31
+ }
32
+ export class BackendRegistry {
33
+ checker;
34
+ commandOverrides;
35
+ constructor(checker = new PathCommandAvailabilityChecker(), commandOverrides = {}) {
36
+ this.checker = checker;
37
+ this.commandOverrides = commandOverrides;
38
+ }
39
+ getProfile(type) {
40
+ return {
41
+ type,
42
+ command: this.commandOverrides[type] ?? type,
43
+ controlPolicy: getControlPolicy(type),
44
+ };
45
+ }
46
+ async detectInstalled() {
47
+ const installed = [];
48
+ for (const backend of BACKEND_TYPES) {
49
+ const profile = this.getProfile(backend);
50
+ if (await this.checker.isAvailable(profile.command)) {
51
+ installed.push(backend);
52
+ }
53
+ }
54
+ return installed;
55
+ }
56
+ }
57
+ function getControlPolicy(type) {
58
+ switch (type) {
59
+ case "claude":
60
+ return {
61
+ cliFlags: ["--disallowedTools", "Agent"],
62
+ };
63
+ case "codex":
64
+ return {
65
+ cliFlags: ["--disable", "multi_agent"],
66
+ };
67
+ case "gemini":
68
+ return {
69
+ cliFlags: [],
70
+ settingsOverrides: {
71
+ experimental: {
72
+ enableAgents: false,
73
+ },
74
+ agents: {
75
+ overrides: {
76
+ codebase_investigator: { enabled: false },
77
+ cli_help: { enabled: false },
78
+ generalist_agent: { enabled: false },
79
+ browser_agent: { enabled: false },
80
+ },
81
+ },
82
+ },
83
+ };
84
+ }
85
+ }
86
+ //# sourceMappingURL=backend-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend-registry.js","sourceRoot":"","sources":["../../../src/infrastructure/backends/backend-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAiBpD,MAAM,8BAA8B;IAClC,KAAK,CAAC,WAAW,CAAC,OAAe;QAC/B,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;gBACtB,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QAED,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;QACzC,KAAK,MAAM,OAAO,IAAI,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YACtD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,SAAS;YACX,CAAC;YAED,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC9C,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;gBACxB,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AAED,MAAM,OAAO,eAAe;IAEP;IACA;IAFnB,YACmB,UAAsC,IAAI,8BAA8B,EAAE,EAC1E,mBAAyD,EAAE;QAD3D,YAAO,GAAP,OAAO,CAAmE;QAC1E,qBAAgB,GAAhB,gBAAgB,CAA2C;IAC3E,CAAC;IAEG,UAAU,CAAC,IAAiB;QACjC,OAAO;YACL,IAAI;YACJ,OAAO,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,IAAI;YAC5C,aAAa,EAAE,gBAAgB,CAAC,IAAI,CAAC;SACtC,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,eAAe;QAC1B,MAAM,SAAS,GAAkB,EAAE,CAAC;QAEpC,KAAK,MAAM,OAAO,IAAI,aAAa,EAAE,CAAC;YACpC,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YACzC,IAAI,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBACpD,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;CACF;AAED,SAAS,gBAAgB,CAAC,IAAiB;IACzC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,QAAQ;YACX,OAAO;gBACL,QAAQ,EAAE,CAAC,mBAAmB,EAAE,OAAO,CAAC;aACzC,CAAC;QACJ,KAAK,OAAO;YACV,OAAO;gBACL,QAAQ,EAAE,CAAC,WAAW,EAAE,aAAa,CAAC;aACvC,CAAC;QACJ,KAAK,QAAQ;YACX,OAAO;gBACL,QAAQ,EAAE,EAAE;gBACZ,iBAAiB,EAAE;oBACjB,YAAY,EAAE;wBACZ,YAAY,EAAE,KAAK;qBACpB;oBACD,MAAM,EAAE;wBACN,SAAS,EAAE;4BACT,qBAAqB,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;4BACzC,QAAQ,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;4BAC5B,gBAAgB,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;4BACpC,aAAa,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;yBAClC;qBACF;iBACF;aACF,CAAC;IACN,CAAC;AACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { BackendExecutionResult, SpawnExecutionRequest } from "../../core/types.js";
2
+ import type { ProcessExecutor } from "../process/process-executor.js";
3
+ import { BackendRegistry } from "./backend-registry.js";
4
+ export declare class CliBackendExecutor {
5
+ private readonly backendRegistry;
6
+ private readonly processExecutor;
7
+ constructor(backendRegistry: BackendRegistry, processExecutor: ProcessExecutor);
8
+ execute(request: SpawnExecutionRequest): Promise<BackendExecutionResult>;
9
+ private executeClaude;
10
+ private executeCodex;
11
+ private executeGemini;
12
+ }
@@ -0,0 +1,210 @@
1
+ import { mkdtemp, readFile, rm, writeFile } from "node:fs/promises";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { RelayError } from "../../core/errors.js";
5
+ export class CliBackendExecutor {
6
+ backendRegistry;
7
+ processExecutor;
8
+ constructor(backendRegistry, processExecutor) {
9
+ this.backendRegistry = backendRegistry;
10
+ this.processExecutor = processExecutor;
11
+ }
12
+ async execute(request) {
13
+ const profile = this.backendRegistry.getProfile(request.backend);
14
+ const tempDir = await mkdtemp(path.join(os.tmpdir(), "agentic-relay-"));
15
+ try {
16
+ switch (request.backend) {
17
+ case "claude":
18
+ return await this.executeClaude(request, profile.command, profile.controlPolicy.cliFlags);
19
+ case "codex":
20
+ return await this.executeCodex(request, profile.command, profile.controlPolicy.cliFlags, tempDir);
21
+ case "gemini":
22
+ return await this.executeGemini(request, profile.command, profile.controlPolicy.settingsOverrides ?? {}, tempDir);
23
+ }
24
+ }
25
+ finally {
26
+ await rm(tempDir, { recursive: true, force: true });
27
+ }
28
+ }
29
+ async executeClaude(request, command, cliFlags) {
30
+ const args = request.backendSessionId
31
+ ? ["--resume", request.backendSessionId]
32
+ : ["--session-id", request.relaySessionId];
33
+ args.push("-p", request.prompt, "--output-format", "text", ...cliFlags);
34
+ if (request.systemPrompt) {
35
+ args.push("--append-system-prompt", request.systemPrompt);
36
+ }
37
+ const result = await this.processExecutor.execute({
38
+ command,
39
+ args,
40
+ cwd: request.cwd,
41
+ env: request.env,
42
+ signal: request.signal,
43
+ });
44
+ if (result.exitCode !== 0) {
45
+ throw new RelayError("BACKEND_EXECUTION_FAILED", result.stderr.trim() || result.stdout.trim() || "Claude execution failed.");
46
+ }
47
+ return {
48
+ output: result.stdout.trim(),
49
+ backendSessionId: request.backendSessionId ?? request.relaySessionId,
50
+ };
51
+ }
52
+ async executeCodex(request, command, cliFlags, tempDir) {
53
+ const outputFile = path.join(tempDir, "codex-last-message.txt");
54
+ const args = request.backendSessionId
55
+ ? ["exec", "resume", request.backendSessionId]
56
+ : ["exec"];
57
+ args.push("--json", "-o", outputFile, ...cliFlags, request.prompt);
58
+ const result = await this.processExecutor.execute({
59
+ command,
60
+ args,
61
+ cwd: request.cwd,
62
+ env: request.env,
63
+ signal: request.signal,
64
+ });
65
+ const output = await safeReadFile(outputFile);
66
+ if (result.exitCode !== 0) {
67
+ throw new RelayError("BACKEND_EXECUTION_FAILED", result.stderr.trim() || output.trim() || "Codex execution failed.");
68
+ }
69
+ const backendSessionId = request.backendSessionId ??
70
+ extractSessionId(result.stdout) ??
71
+ request.relaySessionId;
72
+ return {
73
+ output: output.trim() || extractText(result.stdout).trim(),
74
+ backendSessionId,
75
+ };
76
+ }
77
+ async executeGemini(request, command, settingsOverrides, tempDir) {
78
+ const settingsPath = path.join(tempDir, "gemini-settings.json");
79
+ await writeFile(settingsPath, `${JSON.stringify(settingsOverrides, null, 2)}\n`, "utf8");
80
+ const args = [];
81
+ if (request.backendSessionId) {
82
+ args.push("--resume", request.backendSessionId);
83
+ }
84
+ args.push("--prompt", applySystemPrompt(request.prompt, request.systemPrompt));
85
+ args.push("--output-format", "json");
86
+ const result = await this.processExecutor.execute({
87
+ command,
88
+ args,
89
+ cwd: request.cwd,
90
+ env: {
91
+ ...request.env,
92
+ GEMINI_CLI_SYSTEM_SETTINGS_PATH: settingsPath,
93
+ },
94
+ signal: request.signal,
95
+ });
96
+ if (result.exitCode !== 0) {
97
+ throw new RelayError("BACKEND_EXECUTION_FAILED", result.stderr.trim() || result.stdout.trim() || "Gemini execution failed.");
98
+ }
99
+ return {
100
+ output: extractText(result.stdout).trim(),
101
+ backendSessionId: request.backendSessionId ??
102
+ extractSessionId(result.stdout) ??
103
+ request.relaySessionId,
104
+ };
105
+ }
106
+ }
107
+ function applySystemPrompt(prompt, systemPrompt) {
108
+ if (!systemPrompt) {
109
+ return prompt;
110
+ }
111
+ return [
112
+ "System instruction:",
113
+ systemPrompt,
114
+ "",
115
+ "User prompt:",
116
+ prompt,
117
+ ].join("\n");
118
+ }
119
+ async function safeReadFile(filePath) {
120
+ try {
121
+ return await readFile(filePath, "utf8");
122
+ }
123
+ catch {
124
+ return "";
125
+ }
126
+ }
127
+ function extractSessionId(raw) {
128
+ for (const line of raw.split(/\r?\n/)) {
129
+ if (!line.trim()) {
130
+ continue;
131
+ }
132
+ try {
133
+ const parsed = JSON.parse(line);
134
+ const found = findFirstByKeys(parsed, [
135
+ "session_id",
136
+ "sessionId",
137
+ "thread_id",
138
+ "threadId",
139
+ "conversation_id",
140
+ "conversationId",
141
+ ]);
142
+ if (typeof found === "string" && found.length > 0) {
143
+ return found;
144
+ }
145
+ }
146
+ catch {
147
+ continue;
148
+ }
149
+ }
150
+ return undefined;
151
+ }
152
+ function extractText(raw) {
153
+ const lines = raw.split(/\r?\n/).filter((line) => line.trim().length > 0);
154
+ const chunks = [];
155
+ for (const line of lines) {
156
+ try {
157
+ const parsed = JSON.parse(line);
158
+ collectStrings(parsed, chunks, new Set(["text", "message", "output_text", "content"]));
159
+ }
160
+ catch {
161
+ chunks.push(line);
162
+ }
163
+ }
164
+ return chunks.join("\n").trim();
165
+ }
166
+ function findFirstByKeys(value, keys) {
167
+ if (!value || typeof value !== "object") {
168
+ return undefined;
169
+ }
170
+ if (Array.isArray(value)) {
171
+ for (const item of value) {
172
+ const found = findFirstByKeys(item, keys);
173
+ if (found !== undefined) {
174
+ return found;
175
+ }
176
+ }
177
+ return undefined;
178
+ }
179
+ for (const [key, child] of Object.entries(value)) {
180
+ if (keys.includes(key)) {
181
+ return child;
182
+ }
183
+ const found = findFirstByKeys(child, keys);
184
+ if (found !== undefined) {
185
+ return found;
186
+ }
187
+ }
188
+ return undefined;
189
+ }
190
+ function collectStrings(value, chunks, preferredKeys) {
191
+ if (typeof value === "string") {
192
+ chunks.push(value);
193
+ return;
194
+ }
195
+ if (!value || typeof value !== "object") {
196
+ return;
197
+ }
198
+ if (Array.isArray(value)) {
199
+ for (const item of value) {
200
+ collectStrings(item, chunks, preferredKeys);
201
+ }
202
+ return;
203
+ }
204
+ for (const [key, child] of Object.entries(value)) {
205
+ if (preferredKeys.has(key)) {
206
+ collectStrings(child, chunks, preferredKeys);
207
+ }
208
+ }
209
+ }
210
+ //# sourceMappingURL=cli-backend-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-backend-executor.js","sourceRoot":"","sources":["../../../src/infrastructure/backends/cli-backend-executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export interface ProcessExecutionInput {
2
+ command: string;
3
+ args: string[];
4
+ cwd: string;
5
+ env: NodeJS.ProcessEnv;
6
+ signal?: AbortSignal;
7
+ }
8
+ export interface ProcessExecutionOutput {
9
+ exitCode: number;
10
+ stdout: string;
11
+ stderr: string;
12
+ }
13
+ export interface ProcessExecutor {
14
+ execute(input: ProcessExecutionInput): Promise<ProcessExecutionOutput>;
15
+ }
16
+ export declare class ChildProcessExecutor implements ProcessExecutor {
17
+ execute(input: ProcessExecutionInput): Promise<ProcessExecutionOutput>;
18
+ }