@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.
- package/LICENSE +21 -0
- package/dist/__tests__/attach.test.d.ts +1 -0
- package/dist/__tests__/attach.test.js +200 -0
- package/dist/__tests__/attach.test.js.map +1 -0
- package/dist/__tests__/auth-guard.integration.test.js +1 -1
- package/dist/__tests__/auth-guard.integration.test.js.map +1 -1
- package/dist/__tests__/auth-guard.test.js +3 -3
- package/dist/__tests__/auth-guard.test.js.map +1 -1
- package/dist/__tests__/bootstrap.test.js +23 -0
- package/dist/__tests__/bootstrap.test.js.map +1 -1
- package/dist/__tests__/daemon-hub-resilience.test.js +2 -2
- package/dist/__tests__/daemon-hub-resilience.test.js.map +1 -1
- package/dist/__tests__/evicted-cleanup.test.js.map +1 -1
- package/dist/__tests__/injection-verify.test.d.ts +1 -0
- package/dist/__tests__/injection-verify.test.js +93 -0
- package/dist/__tests__/injection-verify.test.js.map +1 -0
- package/dist/__tests__/injector.test.js +124 -4
- package/dist/__tests__/injector.test.js.map +1 -1
- package/dist/__tests__/list.test.d.ts +1 -0
- package/dist/__tests__/list.test.js +62 -0
- package/dist/__tests__/list.test.js.map +1 -0
- package/dist/__tests__/opencode-serve.test.d.ts +1 -0
- package/dist/__tests__/opencode-serve.test.js +54 -0
- package/dist/__tests__/opencode-serve.test.js.map +1 -0
- package/dist/__tests__/opencode-session-policy.test.d.ts +1 -0
- package/dist/__tests__/opencode-session-policy.test.js +61 -0
- package/dist/__tests__/opencode-session-policy.test.js.map +1 -0
- package/dist/__tests__/opencode-session.test.d.ts +1 -0
- package/dist/__tests__/opencode-session.test.js +178 -0
- package/dist/__tests__/opencode-session.test.js.map +1 -0
- package/dist/__tests__/registry.register.test.js +16 -0
- package/dist/__tests__/registry.register.test.js.map +1 -1
- package/dist/__tests__/relay.test.d.ts +1 -0
- package/dist/__tests__/relay.test.js +136 -0
- package/dist/__tests__/relay.test.js.map +1 -0
- package/dist/__tests__/runner.test.js +17 -0
- package/dist/__tests__/runner.test.js.map +1 -1
- package/dist/__tests__/session-recovery.test.js +214 -11
- package/dist/__tests__/session-recovery.test.js.map +1 -1
- package/dist/__tests__/shared-resource-guards.test.js +1 -4
- package/dist/__tests__/shared-resource-guards.test.js.map +1 -1
- package/dist/__tests__/start-team-id.test.js +22 -0
- package/dist/__tests__/start-team-id.test.js.map +1 -1
- package/dist/__tests__/startup-diagnostics.test.d.ts +1 -0
- package/dist/__tests__/startup-diagnostics.test.js +250 -0
- package/dist/__tests__/startup-diagnostics.test.js.map +1 -0
- package/dist/__tests__/tmux-runtime.test.js +13 -0
- package/dist/__tests__/tmux-runtime.test.js.map +1 -1
- package/dist/__tests__/token-rejection-recovery.test.js +52 -0
- package/dist/__tests__/token-rejection-recovery.test.js.map +1 -1
- package/dist/__tests__/watcher-queue.test.d.ts +1 -0
- package/dist/__tests__/watcher-queue.test.js +90 -0
- package/dist/__tests__/watcher-queue.test.js.map +1 -0
- package/dist/__tests__/watcher-state.test.d.ts +1 -0
- package/dist/__tests__/watcher-state.test.js +159 -0
- package/dist/__tests__/watcher-state.test.js.map +1 -0
- package/dist/cli/attach.d.ts +1 -1
- package/dist/cli/attach.js +125 -2
- package/dist/cli/attach.js.map +1 -1
- package/dist/cli/auth.js.map +1 -1
- package/dist/cli/commands.d.ts +32 -0
- package/dist/cli/commands.js +165 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/index.js +97 -4
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/list.js +26 -2
- package/dist/cli/list.js.map +1 -1
- package/dist/cli/relay.d.ts +4 -0
- package/dist/cli/relay.js +165 -3
- package/dist/cli/relay.js.map +1 -1
- package/dist/cli/start.d.ts +9 -1
- package/dist/cli/start.js +8 -0
- package/dist/cli/start.js.map +1 -1
- package/dist/cli/status.js +21 -8
- package/dist/cli/status.js.map +1 -1
- package/dist/cli/test.js +12 -1
- package/dist/cli/test.js.map +1 -1
- package/dist/config/schema.d.ts +17 -1
- package/dist/core/auth-guard.js +2 -2
- package/dist/core/auth-guard.js.map +1 -1
- package/dist/core/chat-output-parser.d.ts +24 -0
- package/dist/core/chat-output-parser.js +150 -0
- package/dist/core/chat-output-parser.js.map +1 -0
- package/dist/core/chat-output-parser.test.d.ts +7 -0
- package/dist/core/chat-output-parser.test.js +151 -0
- package/dist/core/chat-output-parser.test.js.map +1 -0
- package/dist/core/daemon/bootstrap.d.ts +8 -0
- package/dist/core/daemon/bootstrap.js +6 -1
- package/dist/core/daemon/bootstrap.js.map +1 -1
- package/dist/core/daemon/crash-log.js +5 -0
- package/dist/core/daemon/crash-log.js.map +1 -1
- package/dist/core/daemon/injection-verify.d.ts +25 -0
- package/dist/core/daemon/injection-verify.js +94 -0
- package/dist/core/daemon/injection-verify.js.map +1 -0
- package/dist/core/daemon/roles.d.ts +2 -2
- package/dist/core/daemon/roles.js +3 -0
- package/dist/core/daemon/roles.js.map +1 -1
- package/dist/core/daemon/session-recovery.d.ts +18 -1
- package/dist/core/daemon/session-recovery.js +89 -5
- package/dist/core/daemon/session-recovery.js.map +1 -1
- package/dist/core/daemon/startup-diagnostics.d.ts +76 -0
- package/dist/core/daemon/startup-diagnostics.js +277 -0
- package/dist/core/daemon/startup-diagnostics.js.map +1 -0
- package/dist/core/daemon/state.d.ts +8 -0
- package/dist/core/daemon/state.js +8 -0
- package/dist/core/daemon/state.js.map +1 -1
- package/dist/core/daemon/tmux-session.d.ts +4 -0
- package/dist/core/daemon/tmux-session.js +9 -1
- package/dist/core/daemon/tmux-session.js.map +1 -1
- package/dist/core/daemon/watcher-loop.d.ts +27 -0
- package/dist/core/daemon/watcher-loop.js +134 -0
- package/dist/core/daemon/watcher-loop.js.map +1 -0
- package/dist/core/daemon/watcher-queue.d.ts +33 -0
- package/dist/core/daemon/watcher-queue.js +71 -0
- package/dist/core/daemon/watcher-queue.js.map +1 -0
- package/dist/core/daemon/watcher-state.d.ts +66 -0
- package/dist/core/daemon/watcher-state.js +151 -0
- package/dist/core/daemon/watcher-state.js.map +1 -0
- package/dist/core/daemon/workspace.js +10 -2
- package/dist/core/daemon/workspace.js.map +1 -1
- package/dist/core/daemon.d.ts +22 -1
- package/dist/core/daemon.js +289 -20
- package/dist/core/daemon.js.map +1 -1
- package/dist/core/handoff-sla.js +1 -1
- package/dist/core/handoff-sla.js.map +1 -1
- package/dist/core/injector.d.ts +2 -0
- package/dist/core/injector.js +227 -32
- package/dist/core/injector.js.map +1 -1
- package/dist/core/opencode-serve.d.ts +26 -0
- package/dist/core/opencode-serve.js +97 -0
- package/dist/core/opencode-serve.js.map +1 -0
- package/dist/core/opencode-session-policy.d.ts +10 -0
- package/dist/core/opencode-session-policy.js +10 -0
- package/dist/core/opencode-session-policy.js.map +1 -0
- package/dist/core/opencode-session.d.ts +12 -0
- package/dist/core/opencode-session.js +165 -0
- package/dist/core/opencode-session.js.map +1 -0
- package/dist/core/registry.d.ts +2 -1
- package/dist/core/registry.js +3 -2
- package/dist/core/registry.js.map +1 -1
- package/dist/core/runner/build.js +7 -31
- package/dist/core/runner/build.js.map +1 -1
- package/dist/core/runner/detect.js +2 -8
- package/dist/core/runner/detect.js.map +1 -1
- package/dist/core/runner/index.d.ts +3 -1
- package/dist/core/runner/index.js +2 -0
- package/dist/core/runner/index.js.map +1 -1
- package/dist/core/runner/kimi-models.d.ts +4 -0
- package/dist/core/runner/kimi-models.js +24 -0
- package/dist/core/runner/kimi-models.js.map +1 -0
- package/dist/core/runner/registry.d.ts +3 -0
- package/dist/core/runner/registry.js +75 -0
- package/dist/core/runner/registry.js.map +1 -0
- package/dist/core/runner/types.d.ts +17 -1
- package/dist/core/tmux-runtime.d.ts +2 -1
- package/dist/core/tmux-runtime.js +17 -1
- package/dist/core/tmux-runtime.js.map +1 -1
- package/dist/core/tmux.d.ts +4 -0
- package/dist/core/tmux.js +54 -11
- package/dist/core/tmux.js.map +1 -1
- package/dist/runtime/adapters/opencode.d.ts +63 -0
- package/dist/runtime/adapters/opencode.js +358 -0
- package/dist/runtime/adapters/opencode.js.map +1 -0
- package/dist/runtime/adapters/tmux-fallback.d.ts +23 -0
- package/dist/runtime/adapters/tmux-fallback.js +148 -0
- package/dist/runtime/adapters/tmux-fallback.js.map +1 -0
- package/dist/runtime/adapters/tmux-fallback.test.d.ts +4 -0
- package/dist/runtime/adapters/tmux-fallback.test.js +91 -0
- package/dist/runtime/adapters/tmux-fallback.test.js.map +1 -0
- package/dist/runtime/index.d.ts +146 -0
- package/dist/runtime/index.js +191 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/registry.d.ts +53 -0
- package/dist/runtime/registry.js +112 -0
- package/dist/runtime/registry.js.map +1 -0
- package/dist/runtime/registry.test.d.ts +4 -0
- package/dist/runtime/registry.test.js +69 -0
- package/dist/runtime/registry.test.js.map +1 -0
- package/dist/runtime/types.d.ts +158 -0
- package/dist/runtime/types.js +8 -0
- package/dist/runtime/types.js.map +1 -0
- 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,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":"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"}
|
|
@@ -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":"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"}
|
|
@@ -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>;
|