@agentmeshhq/agent 0.4.16 → 0.4.20

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 (182) hide show
  1. package/LICENSE +21 -0
  2. package/dist/__tests__/attach.test.d.ts +1 -0
  3. package/dist/__tests__/attach.test.js +200 -0
  4. package/dist/__tests__/attach.test.js.map +1 -0
  5. package/dist/__tests__/auth-guard.integration.test.js +1 -1
  6. package/dist/__tests__/auth-guard.integration.test.js.map +1 -1
  7. package/dist/__tests__/auth-guard.test.js +3 -3
  8. package/dist/__tests__/auth-guard.test.js.map +1 -1
  9. package/dist/__tests__/bootstrap.test.js +23 -0
  10. package/dist/__tests__/bootstrap.test.js.map +1 -1
  11. package/dist/__tests__/daemon-hub-resilience.test.js +2 -2
  12. package/dist/__tests__/daemon-hub-resilience.test.js.map +1 -1
  13. package/dist/__tests__/evicted-cleanup.test.js.map +1 -1
  14. package/dist/__tests__/injection-verify.test.d.ts +1 -0
  15. package/dist/__tests__/injection-verify.test.js +93 -0
  16. package/dist/__tests__/injection-verify.test.js.map +1 -0
  17. package/dist/__tests__/injector.test.js +124 -4
  18. package/dist/__tests__/injector.test.js.map +1 -1
  19. package/dist/__tests__/list.test.d.ts +1 -0
  20. package/dist/__tests__/list.test.js +62 -0
  21. package/dist/__tests__/list.test.js.map +1 -0
  22. package/dist/__tests__/opencode-serve.test.d.ts +1 -0
  23. package/dist/__tests__/opencode-serve.test.js +54 -0
  24. package/dist/__tests__/opencode-serve.test.js.map +1 -0
  25. package/dist/__tests__/opencode-session-policy.test.d.ts +1 -0
  26. package/dist/__tests__/opencode-session-policy.test.js +61 -0
  27. package/dist/__tests__/opencode-session-policy.test.js.map +1 -0
  28. package/dist/__tests__/opencode-session.test.d.ts +1 -0
  29. package/dist/__tests__/opencode-session.test.js +178 -0
  30. package/dist/__tests__/opencode-session.test.js.map +1 -0
  31. package/dist/__tests__/registry.register.test.js +16 -0
  32. package/dist/__tests__/registry.register.test.js.map +1 -1
  33. package/dist/__tests__/relay.test.d.ts +1 -0
  34. package/dist/__tests__/relay.test.js +136 -0
  35. package/dist/__tests__/relay.test.js.map +1 -0
  36. package/dist/__tests__/runner.test.js +17 -0
  37. package/dist/__tests__/runner.test.js.map +1 -1
  38. package/dist/__tests__/session-recovery.test.js +214 -11
  39. package/dist/__tests__/session-recovery.test.js.map +1 -1
  40. package/dist/__tests__/shared-resource-guards.test.js +1 -4
  41. package/dist/__tests__/shared-resource-guards.test.js.map +1 -1
  42. package/dist/__tests__/start-team-id.test.js +22 -0
  43. package/dist/__tests__/start-team-id.test.js.map +1 -1
  44. package/dist/__tests__/startup-diagnostics.test.d.ts +1 -0
  45. package/dist/__tests__/startup-diagnostics.test.js +250 -0
  46. package/dist/__tests__/startup-diagnostics.test.js.map +1 -0
  47. package/dist/__tests__/tmux-runtime.test.js +13 -0
  48. package/dist/__tests__/tmux-runtime.test.js.map +1 -1
  49. package/dist/__tests__/token-rejection-recovery.test.js +52 -0
  50. package/dist/__tests__/token-rejection-recovery.test.js.map +1 -1
  51. package/dist/__tests__/watcher-queue.test.d.ts +1 -0
  52. package/dist/__tests__/watcher-queue.test.js +90 -0
  53. package/dist/__tests__/watcher-queue.test.js.map +1 -0
  54. package/dist/__tests__/watcher-state.test.d.ts +1 -0
  55. package/dist/__tests__/watcher-state.test.js +159 -0
  56. package/dist/__tests__/watcher-state.test.js.map +1 -0
  57. package/dist/cli/attach.d.ts +1 -1
  58. package/dist/cli/attach.js +125 -2
  59. package/dist/cli/attach.js.map +1 -1
  60. package/dist/cli/auth.js.map +1 -1
  61. package/dist/cli/commands.d.ts +32 -0
  62. package/dist/cli/commands.js +165 -0
  63. package/dist/cli/commands.js.map +1 -0
  64. package/dist/cli/index.js +97 -4
  65. package/dist/cli/index.js.map +1 -1
  66. package/dist/cli/list.js +26 -2
  67. package/dist/cli/list.js.map +1 -1
  68. package/dist/cli/relay.d.ts +4 -0
  69. package/dist/cli/relay.js +165 -3
  70. package/dist/cli/relay.js.map +1 -1
  71. package/dist/cli/start.d.ts +9 -1
  72. package/dist/cli/start.js +8 -0
  73. package/dist/cli/start.js.map +1 -1
  74. package/dist/cli/status.js +21 -8
  75. package/dist/cli/status.js.map +1 -1
  76. package/dist/cli/test.js +12 -1
  77. package/dist/cli/test.js.map +1 -1
  78. package/dist/config/schema.d.ts +17 -1
  79. package/dist/core/auth-guard.js +2 -2
  80. package/dist/core/auth-guard.js.map +1 -1
  81. package/dist/core/chat-output-parser.d.ts +24 -0
  82. package/dist/core/chat-output-parser.js +150 -0
  83. package/dist/core/chat-output-parser.js.map +1 -0
  84. package/dist/core/chat-output-parser.test.d.ts +7 -0
  85. package/dist/core/chat-output-parser.test.js +151 -0
  86. package/dist/core/chat-output-parser.test.js.map +1 -0
  87. package/dist/core/daemon/bootstrap.d.ts +8 -0
  88. package/dist/core/daemon/bootstrap.js +6 -1
  89. package/dist/core/daemon/bootstrap.js.map +1 -1
  90. package/dist/core/daemon/crash-log.js +5 -0
  91. package/dist/core/daemon/crash-log.js.map +1 -1
  92. package/dist/core/daemon/injection-verify.d.ts +25 -0
  93. package/dist/core/daemon/injection-verify.js +94 -0
  94. package/dist/core/daemon/injection-verify.js.map +1 -0
  95. package/dist/core/daemon/roles.d.ts +2 -2
  96. package/dist/core/daemon/roles.js +3 -0
  97. package/dist/core/daemon/roles.js.map +1 -1
  98. package/dist/core/daemon/session-recovery.d.ts +18 -1
  99. package/dist/core/daemon/session-recovery.js +89 -5
  100. package/dist/core/daemon/session-recovery.js.map +1 -1
  101. package/dist/core/daemon/startup-diagnostics.d.ts +76 -0
  102. package/dist/core/daemon/startup-diagnostics.js +277 -0
  103. package/dist/core/daemon/startup-diagnostics.js.map +1 -0
  104. package/dist/core/daemon/state.d.ts +8 -0
  105. package/dist/core/daemon/state.js +8 -0
  106. package/dist/core/daemon/state.js.map +1 -1
  107. package/dist/core/daemon/tmux-session.d.ts +4 -0
  108. package/dist/core/daemon/tmux-session.js +9 -1
  109. package/dist/core/daemon/tmux-session.js.map +1 -1
  110. package/dist/core/daemon/watcher-loop.d.ts +27 -0
  111. package/dist/core/daemon/watcher-loop.js +134 -0
  112. package/dist/core/daemon/watcher-loop.js.map +1 -0
  113. package/dist/core/daemon/watcher-queue.d.ts +33 -0
  114. package/dist/core/daemon/watcher-queue.js +71 -0
  115. package/dist/core/daemon/watcher-queue.js.map +1 -0
  116. package/dist/core/daemon/watcher-state.d.ts +66 -0
  117. package/dist/core/daemon/watcher-state.js +151 -0
  118. package/dist/core/daemon/watcher-state.js.map +1 -0
  119. package/dist/core/daemon/workspace.js +10 -2
  120. package/dist/core/daemon/workspace.js.map +1 -1
  121. package/dist/core/daemon.d.ts +22 -1
  122. package/dist/core/daemon.js +289 -20
  123. package/dist/core/daemon.js.map +1 -1
  124. package/dist/core/handoff-sla.js +1 -1
  125. package/dist/core/handoff-sla.js.map +1 -1
  126. package/dist/core/injector.d.ts +2 -0
  127. package/dist/core/injector.js +227 -32
  128. package/dist/core/injector.js.map +1 -1
  129. package/dist/core/opencode-serve.d.ts +26 -0
  130. package/dist/core/opencode-serve.js +97 -0
  131. package/dist/core/opencode-serve.js.map +1 -0
  132. package/dist/core/opencode-session-policy.d.ts +10 -0
  133. package/dist/core/opencode-session-policy.js +10 -0
  134. package/dist/core/opencode-session-policy.js.map +1 -0
  135. package/dist/core/opencode-session.d.ts +12 -0
  136. package/dist/core/opencode-session.js +165 -0
  137. package/dist/core/opencode-session.js.map +1 -0
  138. package/dist/core/registry.d.ts +2 -1
  139. package/dist/core/registry.js +3 -2
  140. package/dist/core/registry.js.map +1 -1
  141. package/dist/core/runner/build.js +7 -31
  142. package/dist/core/runner/build.js.map +1 -1
  143. package/dist/core/runner/detect.js +2 -8
  144. package/dist/core/runner/detect.js.map +1 -1
  145. package/dist/core/runner/index.d.ts +3 -1
  146. package/dist/core/runner/index.js +2 -0
  147. package/dist/core/runner/index.js.map +1 -1
  148. package/dist/core/runner/kimi-models.d.ts +4 -0
  149. package/dist/core/runner/kimi-models.js +24 -0
  150. package/dist/core/runner/kimi-models.js.map +1 -0
  151. package/dist/core/runner/registry.d.ts +3 -0
  152. package/dist/core/runner/registry.js +75 -0
  153. package/dist/core/runner/registry.js.map +1 -0
  154. package/dist/core/runner/types.d.ts +17 -1
  155. package/dist/core/tmux-runtime.d.ts +2 -1
  156. package/dist/core/tmux-runtime.js +17 -1
  157. package/dist/core/tmux-runtime.js.map +1 -1
  158. package/dist/core/tmux.d.ts +4 -0
  159. package/dist/core/tmux.js +54 -11
  160. package/dist/core/tmux.js.map +1 -1
  161. package/dist/runtime/adapters/opencode.d.ts +63 -0
  162. package/dist/runtime/adapters/opencode.js +358 -0
  163. package/dist/runtime/adapters/opencode.js.map +1 -0
  164. package/dist/runtime/adapters/tmux-fallback.d.ts +23 -0
  165. package/dist/runtime/adapters/tmux-fallback.js +148 -0
  166. package/dist/runtime/adapters/tmux-fallback.js.map +1 -0
  167. package/dist/runtime/adapters/tmux-fallback.test.d.ts +4 -0
  168. package/dist/runtime/adapters/tmux-fallback.test.js +91 -0
  169. package/dist/runtime/adapters/tmux-fallback.test.js.map +1 -0
  170. package/dist/runtime/index.d.ts +146 -0
  171. package/dist/runtime/index.js +191 -0
  172. package/dist/runtime/index.js.map +1 -0
  173. package/dist/runtime/registry.d.ts +53 -0
  174. package/dist/runtime/registry.js +112 -0
  175. package/dist/runtime/registry.js.map +1 -0
  176. package/dist/runtime/registry.test.d.ts +4 -0
  177. package/dist/runtime/registry.test.js +69 -0
  178. package/dist/runtime/registry.test.js.map +1 -0
  179. package/dist/runtime/types.d.ts +158 -0
  180. package/dist/runtime/types.js +8 -0
  181. package/dist/runtime/types.js.map +1 -0
  182. package/package.json +11 -12
@@ -0,0 +1,148 @@
1
+ /**
2
+ * Tmux Fallback Adapter
3
+ *
4
+ * Generic tmux-based adapter that works with any runner.
5
+ * Uses tmux capture-pane and regex parsing for output extraction.
6
+ */
7
+ import { extractLLMReply } from "../../core/chat-output-parser.js";
8
+ import { captureSessionOutput, sendKeys, sessionExists } from "../../core/tmux.js";
9
+ const DEFAULT_WAIT_OPTIONS = {
10
+ pollMs: 2000,
11
+ stableMs: 5000,
12
+ timeoutMs: 60000,
13
+ maxLines: 120,
14
+ };
15
+ /**
16
+ * Tmux fallback adapter - works with any runner via tmux capture
17
+ */
18
+ export class TmuxFallbackAdapter {
19
+ id = "tmux-fallback";
20
+ displayName = "Tmux Fallback";
21
+ supportedRunners = ["*"]; // Universal fallback
22
+ supportsStructuredEvents = false;
23
+ canHandle(sessionName) {
24
+ return sessionExists(sessionName);
25
+ }
26
+ injectInput(sessionName, request) {
27
+ return sendKeys(sessionName, request.content);
28
+ }
29
+ captureOutput(sessionName, request) {
30
+ const rawOutput = captureSessionOutput(sessionName, 120) || "";
31
+ switch (request.outputMode) {
32
+ case "raw":
33
+ return { mode: "raw", content: rawOutput };
34
+ case "structured": {
35
+ const cleaned = extractLLMReply(rawOutput);
36
+ const structured = {
37
+ content: cleaned,
38
+ rawOutput,
39
+ metadata: {
40
+ capturedAt: new Date().toISOString(),
41
+ linesCaptured: rawOutput.split("\n").length,
42
+ stabilizationMs: 0,
43
+ truncated: rawOutput.split("\n").length >= 120,
44
+ },
45
+ parsing: {
46
+ success: cleaned.length > 0,
47
+ parser: "tmux-regex",
48
+ error: cleaned.length === 0 ? "No LLM reply extracted" : undefined,
49
+ },
50
+ };
51
+ return { mode: "structured", data: structured };
52
+ }
53
+ default: {
54
+ const cleaned = extractLLMReply(rawOutput);
55
+ return { mode: "clean", content: cleaned };
56
+ }
57
+ }
58
+ }
59
+ async waitForOutput(sessionName, request, options) {
60
+ const opts = { ...DEFAULT_WAIT_OPTIONS, ...options };
61
+ const startTime = Date.now();
62
+ let lastSnapshot = captureSessionOutput(sessionName, opts.maxLines) || "";
63
+ let lastChangeAt = Date.now();
64
+ let stabilizedAt = null;
65
+ const baselineParsed = extractLLMReply(lastSnapshot).trim();
66
+ let lastParsed = baselineParsed;
67
+ let parsedChangedAt = null;
68
+ return new Promise((resolve) => {
69
+ const check = () => {
70
+ const elapsed = Date.now() - startTime;
71
+ const current = captureSessionOutput(sessionName, opts.maxLines) || "";
72
+ const parsed = extractLLMReply(current).trim();
73
+ if (current !== lastSnapshot) {
74
+ lastSnapshot = current;
75
+ lastChangeAt = Date.now();
76
+ stabilizedAt = null;
77
+ }
78
+ else if (!stabilizedAt) {
79
+ stabilizedAt = Date.now();
80
+ }
81
+ if (parsed !== lastParsed) {
82
+ lastParsed = parsed;
83
+ parsedChangedAt = Date.now();
84
+ }
85
+ else if (parsedChangedAt === null && parsed !== baselineParsed) {
86
+ parsedChangedAt = Date.now();
87
+ }
88
+ const stable = stabilizedAt && Date.now() - stabilizedAt >= opts.stableMs;
89
+ const timedOut = elapsed >= opts.timeoutMs;
90
+ const hasNewParsedOutput = parsed.length > 0 && parsed !== baselineParsed;
91
+ const parsedStable = parsedChangedAt !== null &&
92
+ Date.now() - parsedChangedAt >= Math.min(1200, Math.max(400, opts.stableMs / 2));
93
+ if (stable || timedOut) {
94
+ // For clean/structured capture, wait for actual parsed assistant output.
95
+ // A stable pane can still mean "input echoed, assistant not responded yet".
96
+ if (!timedOut && request.outputMode !== "raw" && !hasNewParsedOutput) {
97
+ stabilizedAt = null;
98
+ setTimeout(check, opts.pollMs);
99
+ return;
100
+ }
101
+ const stabilizationMs = stabilizedAt ? stabilizedAt - lastChangeAt : 0;
102
+ resolve(this.formatResponse(current, request, stabilizationMs, timedOut));
103
+ return;
104
+ }
105
+ // Fast-path for clean/structured: return once parsed output is new for
106
+ // this turn and stable, even when raw pane keeps changing.
107
+ if (!timedOut && request.outputMode !== "raw" && hasNewParsedOutput && parsedStable) {
108
+ const stabilizationMs = Date.now() - (parsedChangedAt ?? startTime);
109
+ resolve(this.formatResponse(current, request, stabilizationMs, false));
110
+ return;
111
+ }
112
+ setTimeout(check, opts.pollMs);
113
+ };
114
+ check();
115
+ });
116
+ }
117
+ formatResponse(rawOutput, request, stabilizationMs, _timedOut) {
118
+ const linesCaptured = rawOutput.split("\n").length;
119
+ const cleaned = extractLLMReply(rawOutput);
120
+ switch (request.outputMode) {
121
+ case "raw":
122
+ return { mode: "raw", content: rawOutput };
123
+ case "structured": {
124
+ const structured = {
125
+ content: cleaned,
126
+ rawOutput,
127
+ metadata: {
128
+ capturedAt: new Date().toISOString(),
129
+ linesCaptured,
130
+ stabilizationMs,
131
+ truncated: linesCaptured >= 120,
132
+ },
133
+ parsing: {
134
+ success: cleaned.length > 0,
135
+ parser: "tmux-regex",
136
+ error: cleaned.length === 0 ? "No LLM reply extracted" : undefined,
137
+ },
138
+ };
139
+ return { mode: "structured", data: structured };
140
+ }
141
+ default:
142
+ return { mode: "clean", content: cleaned };
143
+ }
144
+ }
145
+ }
146
+ /** Singleton instance */
147
+ export const tmuxFallbackAdapter = new TmuxFallbackAdapter();
148
+ //# sourceMappingURL=tmux-fallback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tmux-fallback.js","sourceRoot":"","sources":["../../../src/runtime/adapters/tmux-fallback.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Tmux Fallback Adapter Tests
3
+ */
4
+ export {};
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Tmux Fallback Adapter Tests
3
+ */
4
+ import { describe, expect, it, vi } from "vitest";
5
+ import { TmuxFallbackAdapter } from "./tmux-fallback.js";
6
+ // Mock the tmux module
7
+ vi.mock("../../core/tmux.js", () => ({
8
+ sessionExists: vi.fn(() => true),
9
+ sendKeys: vi.fn(() => true),
10
+ captureSessionOutput: vi.fn(() => "❯ Hello\n⏺ This is the LLM response\n❯ "),
11
+ getSessionName: vi.fn((name) => `agentmesh-${name}`),
12
+ }));
13
+ describe("TmuxFallbackAdapter", () => {
14
+ const adapter = new TmuxFallbackAdapter();
15
+ describe("basic properties", () => {
16
+ it("should have correct id and name", () => {
17
+ expect(adapter.id).toBe("tmux-fallback");
18
+ expect(adapter.displayName).toBe("Tmux Fallback");
19
+ });
20
+ it("should support all runners", () => {
21
+ expect(adapter.supportedRunners).toEqual(["*"]);
22
+ });
23
+ it("should not support structured events", () => {
24
+ expect(adapter.supportsStructuredEvents).toBe(false);
25
+ });
26
+ });
27
+ describe("canHandle", () => {
28
+ it("should return true for existing sessions", () => {
29
+ expect(adapter.canHandle("agentmesh-test")).toBe(true);
30
+ });
31
+ });
32
+ describe("captureOutput", () => {
33
+ const baseRequest = {
34
+ content: "Test message",
35
+ outputMode: "clean",
36
+ messageId: "msg_123",
37
+ workspace: "test-workspace",
38
+ agentId: "agent_456",
39
+ };
40
+ it("should return clean output by default", () => {
41
+ const response = adapter.captureOutput("agentmesh-test", baseRequest);
42
+ expect(response.mode).toBe("clean");
43
+ if (response.mode === "clean") {
44
+ expect(response.content).toBe("This is the LLM response");
45
+ }
46
+ });
47
+ it("should return raw output when requested", () => {
48
+ const request = { ...baseRequest, outputMode: "raw" };
49
+ const response = adapter.captureOutput("agentmesh-test", request);
50
+ expect(response.mode).toBe("raw");
51
+ if (response.mode === "raw") {
52
+ expect(response.content).toContain("❯ Hello");
53
+ expect(response.content).toContain("⏺ This is the LLM response");
54
+ }
55
+ });
56
+ it("should return structured output when requested", () => {
57
+ const request = { ...baseRequest, outputMode: "structured" };
58
+ const response = adapter.captureOutput("agentmesh-test", request);
59
+ expect(response.mode).toBe("structured");
60
+ if (response.mode === "structured") {
61
+ expect(response.data.content).toBe("This is the LLM response");
62
+ expect(response.data.rawOutput).toContain("❯ Hello");
63
+ expect(response.data.metadata.linesCaptured).toBeGreaterThan(0);
64
+ expect(response.data.parsing.parser).toBe("tmux-regex");
65
+ expect(response.data.parsing.success).toBe(true);
66
+ }
67
+ });
68
+ it("should handle empty output gracefully", () => {
69
+ const { captureSessionOutput } = require("../../core/tmux.js");
70
+ captureSessionOutput.mockReturnValueOnce("");
71
+ const response = adapter.captureOutput("agentmesh-test", baseRequest);
72
+ if (response.mode === "clean") {
73
+ expect(response.content).toBe("");
74
+ }
75
+ });
76
+ });
77
+ describe("injectInput", () => {
78
+ it("should send keys to session", () => {
79
+ const request = {
80
+ content: "Hello agent",
81
+ outputMode: "clean",
82
+ messageId: "msg_123",
83
+ workspace: "test-workspace",
84
+ agentId: "agent_456",
85
+ };
86
+ const result = adapter.injectInput("agentmesh-test", request);
87
+ expect(result).toBe(true);
88
+ });
89
+ });
90
+ });
91
+ //# sourceMappingURL=tmux-fallback.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tmux-fallback.test.js","sourceRoot":"","sources":["../../../src/runtime/adapters/tmux-fallback.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAElD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,uBAAuB;AACvB,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,GAAG,EAAE,CAAC,CAAC;IACnC,aAAa,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;IAChC,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;IAC3B,oBAAoB,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,yCAAyC,CAAC;IAC5E,cAAc,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,aAAa,IAAI,EAAE,CAAC;CAC7D,CAAC,CAAC,CAAC;AAEJ,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,MAAM,OAAO,GAAG,IAAI,mBAAmB,EAAE,CAAC;IAE1C,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YACzC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;YACpC,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;QACzB,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,MAAM,WAAW,GAAqB;YACpC,OAAO,EAAE,cAAc;YACvB,UAAU,EAAE,OAAO;YACnB,SAAS,EAAE,SAAS;YACpB,SAAS,EAAE,gBAAgB;YAC3B,OAAO,EAAE,WAAW;SACrB,CAAC;QAEF,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;YAEtE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACpC,IAAI,QAAQ,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC9B,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,OAAO,GAAG,EAAE,GAAG,WAAW,EAAE,UAAU,EAAE,KAAc,EAAE,CAAC;YAC/D,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;YAElE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAClC,IAAI,QAAQ,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;gBAC5B,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;gBAC9C,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;YACnE,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACxD,MAAM,OAAO,GAAG,EAAE,GAAG,WAAW,EAAE,UAAU,EAAE,YAAqB,EAAE,CAAC;YACtE,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;YAElE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACzC,IAAI,QAAQ,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBACnC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;gBAC/D,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;gBACrD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;gBAChE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBACxD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnD,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,MAAM,EAAE,oBAAoB,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;YAC/D,oBAAoB,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;YAE7C,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;YAEtE,IAAI,QAAQ,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC9B,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACpC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;YACrC,MAAM,OAAO,GAAqB;gBAChC,OAAO,EAAE,aAAa;gBACtB,UAAU,EAAE,OAAO;gBACnB,SAAS,EAAE,SAAS;gBACpB,SAAS,EAAE,gBAAgB;gBAC3B,OAAO,EAAE,WAAW;aACrB,CAAC;YAEF,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;YAC9D,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,146 @@
1
+ /**
2
+ * Runtime I/O Module
3
+ *
4
+ * Cross-runner runtime I/O contract for AgentMesh.
5
+ * Provides normalized event-based output instead of tmux pane scraping.
6
+ *
7
+ * Usage:
8
+ * import { runtimeChat } from './runtime/index.js';
9
+ *
10
+ * const response = await runtimeChat.injectAndWait(agentName, {
11
+ * content: "What is the status?",
12
+ * outputMode: "structured",
13
+ * messageId: "msg_123",
14
+ * workspace: "my-workspace",
15
+ * agentId: "agent_456"
16
+ * });
17
+ */
18
+ import { detectRunner, getAdapterRegistry, selectAdapter } from "./registry.js";
19
+ import type { ChatInputRequest, ChatOutputResponse, OutputMode, WaitForOutputOptions } from "./types.js";
20
+ export { OpenCodeAdapter, opencodeAdapter } from "./adapters/opencode.js";
21
+ export { TmuxFallbackAdapter, tmuxFallbackAdapter } from "./adapters/tmux-fallback.js";
22
+ export { detectRunner, getAdapterRegistry, selectAdapter } from "./registry.js";
23
+ export type { ChatInputRequest, ChatOutputResponse, OutputMode, RunnerDetectionResult, RuntimeAdapter, RuntimeEvent, RuntimeEventType, StructuredOutput, WaitForOutputOptions, } from "./types.js";
24
+ /**
25
+ * Runtime chat API
26
+ */
27
+ export declare const runtimeChat: {
28
+ /**
29
+ * Inject chat input into agent session
30
+ */
31
+ inject(agentName: string, request: ChatInputRequest): Promise<boolean>;
32
+ /**
33
+ * Capture current output from agent session
34
+ */
35
+ capture(agentName: string, request: ChatInputRequest): Promise<ChatOutputResponse>;
36
+ /**
37
+ * Wait for stable output from the current session state (does not inject input).
38
+ */
39
+ wait(agentName: string, request: ChatInputRequest, options?: WaitForOutputOptions): Promise<ChatOutputResponse>;
40
+ /**
41
+ * Inject input and wait for stable output
42
+ */
43
+ injectAndWait(agentName: string, request: ChatInputRequest, options?: WaitForOutputOptions): Promise<ChatOutputResponse>;
44
+ /**
45
+ * Quick chat with default options
46
+ */
47
+ quickChat(agentName: string, content: string, outputMode?: OutputMode, context?: {
48
+ messageId?: string;
49
+ workspace?: string;
50
+ agentId?: string;
51
+ }): Promise<string>;
52
+ };
53
+ /**
54
+ * Runtime control API (for terminal commands)
55
+ */
56
+ export declare const runtimeControl: {
57
+ /**
58
+ * Execute terminal command in agent session
59
+ */
60
+ execute(agentName: string, command: string, outputMode?: OutputMode): Promise<ChatOutputResponse>;
61
+ };
62
+ /**
63
+ * Utility functions
64
+ */
65
+ export declare const runtimeUtils: {
66
+ /**
67
+ * Detect runner type for agent
68
+ */
69
+ detectRunner(agentName: string): Promise<{
70
+ runnerType: string;
71
+ structuredEventsAvailable: boolean;
72
+ recommendedAdapter: string;
73
+ }>;
74
+ /**
75
+ * Check if agent session is available
76
+ */
77
+ isAvailable(agentName: string): Promise<boolean>;
78
+ /**
79
+ * Get adapter info for agent
80
+ */
81
+ getAdapterInfo(agentName: string): Promise<{
82
+ adapterId: string;
83
+ adapterName: string;
84
+ supportsStructuredEvents: boolean;
85
+ } | null>;
86
+ };
87
+ declare const _default: {
88
+ chat: {
89
+ /**
90
+ * Inject chat input into agent session
91
+ */
92
+ inject(agentName: string, request: ChatInputRequest): Promise<boolean>;
93
+ /**
94
+ * Capture current output from agent session
95
+ */
96
+ capture(agentName: string, request: ChatInputRequest): Promise<ChatOutputResponse>;
97
+ /**
98
+ * Wait for stable output from the current session state (does not inject input).
99
+ */
100
+ wait(agentName: string, request: ChatInputRequest, options?: WaitForOutputOptions): Promise<ChatOutputResponse>;
101
+ /**
102
+ * Inject input and wait for stable output
103
+ */
104
+ injectAndWait(agentName: string, request: ChatInputRequest, options?: WaitForOutputOptions): Promise<ChatOutputResponse>;
105
+ /**
106
+ * Quick chat with default options
107
+ */
108
+ quickChat(agentName: string, content: string, outputMode?: OutputMode, context?: {
109
+ messageId?: string;
110
+ workspace?: string;
111
+ agentId?: string;
112
+ }): Promise<string>;
113
+ };
114
+ control: {
115
+ /**
116
+ * Execute terminal command in agent session
117
+ */
118
+ execute(agentName: string, command: string, outputMode?: OutputMode): Promise<ChatOutputResponse>;
119
+ };
120
+ utils: {
121
+ /**
122
+ * Detect runner type for agent
123
+ */
124
+ detectRunner(agentName: string): Promise<{
125
+ runnerType: string;
126
+ structuredEventsAvailable: boolean;
127
+ recommendedAdapter: string;
128
+ }>;
129
+ /**
130
+ * Check if agent session is available
131
+ */
132
+ isAvailable(agentName: string): Promise<boolean>;
133
+ /**
134
+ * Get adapter info for agent
135
+ */
136
+ getAdapterInfo(agentName: string): Promise<{
137
+ adapterId: string;
138
+ adapterName: string;
139
+ supportsStructuredEvents: boolean;
140
+ } | null>;
141
+ };
142
+ getAdapterRegistry: typeof getAdapterRegistry;
143
+ selectAdapter: typeof selectAdapter;
144
+ detectRunner: typeof detectRunner;
145
+ };
146
+ export default _default;
@@ -0,0 +1,191 @@
1
+ /**
2
+ * Runtime I/O Module
3
+ *
4
+ * Cross-runner runtime I/O contract for AgentMesh.
5
+ * Provides normalized event-based output instead of tmux pane scraping.
6
+ *
7
+ * Usage:
8
+ * import { runtimeChat } from './runtime/index.js';
9
+ *
10
+ * const response = await runtimeChat.injectAndWait(agentName, {
11
+ * content: "What is the status?",
12
+ * outputMode: "structured",
13
+ * messageId: "msg_123",
14
+ * workspace: "my-workspace",
15
+ * agentId: "agent_456"
16
+ * });
17
+ */
18
+ import { getSessionName as getTmuxSessionName } from "../core/tmux.js";
19
+ import { detectRunner, getAdapterRegistry, selectAdapter } from "./registry.js";
20
+ export { OpenCodeAdapter, opencodeAdapter } from "./adapters/opencode.js";
21
+ // Re-export adapters
22
+ export { TmuxFallbackAdapter, tmuxFallbackAdapter } from "./adapters/tmux-fallback.js";
23
+ // Re-export registry functions
24
+ export { detectRunner, getAdapterRegistry, selectAdapter } from "./registry.js";
25
+ /**
26
+ * Runtime chat API
27
+ */
28
+ export const runtimeChat = {
29
+ /**
30
+ * Inject chat input into agent session
31
+ */
32
+ async inject(agentName, request) {
33
+ const sessionName = getSessionName(agentName);
34
+ const adapter = await selectAdapter(sessionName);
35
+ return adapter.injectInput(sessionName, request);
36
+ },
37
+ /**
38
+ * Capture current output from agent session
39
+ */
40
+ async capture(agentName, request) {
41
+ const sessionName = getSessionName(agentName);
42
+ const adapter = await selectAdapter(sessionName);
43
+ return adapter.captureOutput(sessionName, request);
44
+ },
45
+ /**
46
+ * Wait for stable output from the current session state (does not inject input).
47
+ */
48
+ async wait(agentName, request, options) {
49
+ const sessionName = getSessionName(agentName);
50
+ const adapter = await selectAdapter(sessionName);
51
+ return adapter.waitForOutput(sessionName, request, options);
52
+ },
53
+ /**
54
+ * Inject input and wait for stable output
55
+ */
56
+ async injectAndWait(agentName, request, options) {
57
+ const sessionName = getSessionName(agentName);
58
+ const adapter = await selectAdapter(sessionName);
59
+ const injected = await adapter.injectInput(sessionName, request);
60
+ if (!injected) {
61
+ return {
62
+ mode: "clean",
63
+ content: "[AgentMesh runtime] Failed to inject message - session unavailable",
64
+ };
65
+ }
66
+ return adapter.waitForOutput(sessionName, request, options);
67
+ },
68
+ /**
69
+ * Quick chat with default options
70
+ */
71
+ async quickChat(agentName, content, outputMode = "clean", context) {
72
+ const request = {
73
+ content,
74
+ outputMode,
75
+ messageId: context?.messageId || `quick_${Date.now()}`,
76
+ workspace: context?.workspace || "default",
77
+ agentId: context?.agentId || agentName,
78
+ };
79
+ const response = await this.injectAndWait(agentName, request);
80
+ switch (response.mode) {
81
+ case "raw":
82
+ return response.content;
83
+ case "structured":
84
+ return response.data.content;
85
+ default:
86
+ return response.content;
87
+ }
88
+ },
89
+ };
90
+ /**
91
+ * Runtime control API (for terminal commands)
92
+ */
93
+ export const runtimeControl = {
94
+ /**
95
+ * Execute terminal command in agent session
96
+ */
97
+ async execute(agentName, command, outputMode = "raw") {
98
+ const sessionName = getSessionName(agentName);
99
+ const adapter = await selectAdapter(sessionName);
100
+ const request = {
101
+ content: command,
102
+ outputMode,
103
+ messageId: `cmd_${Date.now()}`,
104
+ workspace: "default",
105
+ agentId: agentName,
106
+ };
107
+ const injected = await adapter.injectInput(sessionName, request);
108
+ if (!injected) {
109
+ return {
110
+ mode: outputMode,
111
+ content: outputMode === "structured" ? "" : "[AgentMesh runtime] Terminal unavailable",
112
+ ...(outputMode === "structured" && {
113
+ data: {
114
+ content: "",
115
+ rawOutput: "",
116
+ metadata: {
117
+ capturedAt: new Date().toISOString(),
118
+ linesCaptured: 0,
119
+ stabilizationMs: 0,
120
+ truncated: false,
121
+ },
122
+ parsing: {
123
+ success: false,
124
+ parser: "none",
125
+ error: "Terminal unavailable",
126
+ },
127
+ },
128
+ }),
129
+ };
130
+ }
131
+ return adapter.waitForOutput(sessionName, request);
132
+ },
133
+ };
134
+ /**
135
+ * Utility functions
136
+ */
137
+ export const runtimeUtils = {
138
+ /**
139
+ * Detect runner type for agent
140
+ */
141
+ async detectRunner(agentName) {
142
+ const sessionName = getSessionName(agentName);
143
+ return detectRunner(sessionName);
144
+ },
145
+ /**
146
+ * Check if agent session is available
147
+ */
148
+ async isAvailable(agentName) {
149
+ const sessionName = getSessionName(agentName);
150
+ try {
151
+ const adapter = await selectAdapter(sessionName);
152
+ return adapter.canHandle(sessionName);
153
+ }
154
+ catch {
155
+ return false;
156
+ }
157
+ },
158
+ /**
159
+ * Get adapter info for agent
160
+ */
161
+ async getAdapterInfo(agentName) {
162
+ const sessionName = getSessionName(agentName);
163
+ try {
164
+ const adapter = await selectAdapter(sessionName);
165
+ return {
166
+ adapterId: adapter.id,
167
+ adapterName: adapter.displayName,
168
+ supportsStructuredEvents: adapter.supportsStructuredEvents,
169
+ };
170
+ }
171
+ catch {
172
+ return null;
173
+ }
174
+ },
175
+ };
176
+ /**
177
+ * Get tmux session name for agent
178
+ */
179
+ function getSessionName(agentName) {
180
+ return getTmuxSessionName(agentName);
181
+ }
182
+ // Default export
183
+ export default {
184
+ chat: runtimeChat,
185
+ control: runtimeControl,
186
+ utils: runtimeUtils,
187
+ getAdapterRegistry,
188
+ selectAdapter,
189
+ detectRunner,
190
+ };
191
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,cAAc,IAAI,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAShF,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC1E,qBAAqB;AACrB,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvF,+BAA+B;AAC/B,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAchF;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,SAAiB,EAAE,OAAyB;QACvD,MAAM,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,WAAW,CAAC,CAAC;QACjD,OAAO,OAAO,CAAC,WAAW,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACnD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,SAAiB,EAAE,OAAyB;QACxD,MAAM,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,WAAW,CAAC,CAAC;QACjD,OAAO,OAAO,CAAC,aAAa,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACrD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CACR,SAAiB,EACjB,OAAyB,EACzB,OAA8B;QAE9B,MAAM,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,WAAW,CAAC,CAAC;QACjD,OAAO,OAAO,CAAC,aAAa,CAAC,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC9D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CACjB,SAAiB,EACjB,OAAyB,EACzB,OAA8B;QAE9B,MAAM,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,WAAW,CAAC,CAAC;QAEjD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACjE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO;gBACL,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,oEAAoE;aAC9E,CAAC;QACJ,CAAC;QAED,OAAO,OAAO,CAAC,aAAa,CAAC,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC9D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CACb,SAAiB,EACjB,OAAe,EACf,aAAyB,OAAO,EAChC,OAAsE;QAEtE,MAAM,OAAO,GAAqB;YAChC,OAAO;YACP,UAAU;YACV,SAAS,EAAE,OAAO,EAAE,SAAS,IAAI,SAAS,IAAI,CAAC,GAAG,EAAE,EAAE;YACtD,SAAS,EAAE,OAAO,EAAE,SAAS,IAAI,SAAS;YAC1C,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,SAAS;SACvC,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAE9D,QAAQ,QAAQ,CAAC,IAAI,EAAE,CAAC;YACtB,KAAK,KAAK;gBACR,OAAO,QAAQ,CAAC,OAAO,CAAC;YAC1B,KAAK,YAAY;gBACf,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;YAC/B;gBACE,OAAO,QAAQ,CAAC,OAAO,CAAC;QAC5B,CAAC;IACH,CAAC;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B;;OAEG;IACH,KAAK,CAAC,OAAO,CACX,SAAiB,EACjB,OAAe,EACf,aAAyB,KAAK;QAE9B,MAAM,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,WAAW,CAAC,CAAC;QAEjD,MAAM,OAAO,GAAqB;YAChC,OAAO,EAAE,OAAO;YAChB,UAAU;YACV,SAAS,EAAE,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE;YAC9B,SAAS,EAAE,SAAS;YACpB,OAAO,EAAE,SAAS;SACnB,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACjE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO;gBACL,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,UAAU,KAAK,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,0CAA0C;gBACtF,GAAG,CAAC,UAAU,KAAK,YAAY,IAAI;oBACjC,IAAI,EAAE;wBACJ,OAAO,EAAE,EAAE;wBACX,SAAS,EAAE,EAAE;wBACb,QAAQ,EAAE;4BACR,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;4BACpC,aAAa,EAAE,CAAC;4BAChB,eAAe,EAAE,CAAC;4BAClB,SAAS,EAAE,KAAK;yBACjB;wBACD,OAAO,EAAE;4BACP,OAAO,EAAE,KAAK;4BACd,MAAM,EAAE,MAAM;4BACd,KAAK,EAAE,sBAAsB;yBAC9B;qBACkB;iBACtB,CAAC;aACmB,CAAC;QAC1B,CAAC;QAED,OAAO,OAAO,CAAC,aAAa,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACrD,CAAC;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,SAAiB;QAKlC,MAAM,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;QAC9C,OAAO,YAAY,CAAC,WAAW,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,SAAiB;QACjC,MAAM,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;QAC9C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,WAAW,CAAC,CAAC;YACjD,OAAO,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,SAAiB;QAKpC,MAAM,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;QAC9C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,WAAW,CAAC,CAAC;YACjD,OAAO;gBACL,SAAS,EAAE,OAAO,CAAC,EAAE;gBACrB,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,wBAAwB,EAAE,OAAO,CAAC,wBAAwB;aAC3D,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;CACF,CAAC;AAEF;;GAEG;AACH,SAAS,cAAc,CAAC,SAAiB;IACvC,OAAO,kBAAkB,CAAC,SAAS,CAAC,CAAC;AACvC,CAAC;AAED,iBAAiB;AACjB,eAAe;IACb,IAAI,EAAE,WAAW;IACjB,OAAO,EAAE,cAAc;IACvB,KAAK,EAAE,YAAY;IACnB,kBAAkB;IAClB,aAAa;IACb,YAAY;CACb,CAAC"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Runtime Adapter Registry
3
+ *
4
+ * Manages available runtime adapters and provides selection
5
+ * based on runner type and capabilities.
6
+ */
7
+ import type { RunnerDetectionResult, RuntimeAdapter } from "./types.js";
8
+ /**
9
+ * Registry of available runtime adapters
10
+ */
11
+ export declare class AdapterRegistry {
12
+ private adapters;
13
+ private fallbackAdapter;
14
+ constructor();
15
+ /**
16
+ * Register a new adapter
17
+ */
18
+ register(adapter: RuntimeAdapter): void;
19
+ /**
20
+ * Get adapter by ID
21
+ */
22
+ get(id: string): RuntimeAdapter | undefined;
23
+ /**
24
+ * Get all registered adapters
25
+ */
26
+ getAll(): RuntimeAdapter[];
27
+ /**
28
+ * Get the fallback adapter
29
+ */
30
+ getFallback(): RuntimeAdapter;
31
+ /**
32
+ * Select the best adapter for a given session
33
+ */
34
+ selectAdapter(sessionName: string): Promise<RuntimeAdapter>;
35
+ /**
36
+ * Detect runner type and recommend adapter
37
+ */
38
+ detectRunner(sessionName: string): Promise<RunnerDetectionResult>;
39
+ }
40
+ /** Global registry instance */
41
+ export declare const adapterRegistry: AdapterRegistry;
42
+ /**
43
+ * Get the global adapter registry
44
+ */
45
+ export declare function getAdapterRegistry(): AdapterRegistry;
46
+ /**
47
+ * Select adapter for session (convenience function)
48
+ */
49
+ export declare function selectAdapter(sessionName: string): Promise<RuntimeAdapter>;
50
+ /**
51
+ * Detect runner for session (convenience function)
52
+ */
53
+ export declare function detectRunner(sessionName: string): Promise<RunnerDetectionResult>;