@agentmeshhq/agent 0.4.18 → 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/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__/injector.test.js +47 -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.js +121 -2
- package/dist/__tests__/relay.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__/token-rejection-recovery.test.js +52 -0
- package/dist/__tests__/token-rejection-recovery.test.js.map +1 -1
- package/dist/__tests__/watcher-queue.test.js +7 -2
- package/dist/__tests__/watcher-queue.test.js.map +1 -1
- 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/index.js +9 -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 +3 -0
- package/dist/cli/relay.js +149 -1
- 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 +16 -0
- 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 +3 -3
- package/dist/core/chat-output-parser.js +35 -19
- package/dist/core/chat-output-parser.js.map +1 -1
- package/dist/core/chat-output-parser.test.js +21 -0
- package/dist/core/chat-output-parser.test.js.map +1 -1
- 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/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/workspace.js +10 -2
- package/dist/core/daemon/workspace.js.map +1 -1
- package/dist/core/daemon.d.ts +10 -1
- package/dist/core/daemon.js +155 -18
- 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 +107 -49
- 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/tmux-runtime.d.ts +1 -0
- package/dist/core/tmux-runtime.js +4 -1
- package/dist/core/tmux-runtime.js.map +1 -1
- package/dist/core/tmux.js +5 -0
- 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 +1 -1
|
@@ -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>;
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime Adapter Registry
|
|
3
|
+
*
|
|
4
|
+
* Manages available runtime adapters and provides selection
|
|
5
|
+
* based on runner type and capabilities.
|
|
6
|
+
*/
|
|
7
|
+
import { opencodeAdapter } from "./adapters/opencode.js";
|
|
8
|
+
import { tmuxFallbackAdapter } from "./adapters/tmux-fallback.js";
|
|
9
|
+
/**
|
|
10
|
+
* Registry of available runtime adapters
|
|
11
|
+
*/
|
|
12
|
+
export class AdapterRegistry {
|
|
13
|
+
adapters = new Map();
|
|
14
|
+
fallbackAdapter;
|
|
15
|
+
constructor() {
|
|
16
|
+
// Register built-in adapters
|
|
17
|
+
this.register(opencodeAdapter);
|
|
18
|
+
// Set fallback
|
|
19
|
+
this.fallbackAdapter = tmuxFallbackAdapter;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Register a new adapter
|
|
23
|
+
*/
|
|
24
|
+
register(adapter) {
|
|
25
|
+
this.adapters.set(adapter.id, adapter);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Get adapter by ID
|
|
29
|
+
*/
|
|
30
|
+
get(id) {
|
|
31
|
+
return this.adapters.get(id);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Get all registered adapters
|
|
35
|
+
*/
|
|
36
|
+
getAll() {
|
|
37
|
+
return Array.from(this.adapters.values());
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Get the fallback adapter
|
|
41
|
+
*/
|
|
42
|
+
getFallback() {
|
|
43
|
+
return this.fallbackAdapter;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Select the best adapter for a given session
|
|
47
|
+
*/
|
|
48
|
+
async selectAdapter(sessionName) {
|
|
49
|
+
// Try specialized adapters first (in priority order)
|
|
50
|
+
for (const adapter of this.adapters.values()) {
|
|
51
|
+
if (await adapter.canHandle(sessionName)) {
|
|
52
|
+
return adapter;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// Fall back to generic tmux adapter
|
|
56
|
+
if (await this.fallbackAdapter.canHandle(sessionName)) {
|
|
57
|
+
return this.fallbackAdapter;
|
|
58
|
+
}
|
|
59
|
+
throw new Error(`No adapter available for session: ${sessionName}`);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Detect runner type and recommend adapter
|
|
63
|
+
*/
|
|
64
|
+
async detectRunner(sessionName) {
|
|
65
|
+
// Check if session exists
|
|
66
|
+
const fallbackCanHandle = await this.fallbackAdapter.canHandle(sessionName);
|
|
67
|
+
if (!fallbackCanHandle) {
|
|
68
|
+
return {
|
|
69
|
+
runnerType: "unknown",
|
|
70
|
+
structuredEventsAvailable: false,
|
|
71
|
+
recommendedAdapter: "none",
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
// Try to detect specific runner
|
|
75
|
+
for (const adapter of this.adapters.values()) {
|
|
76
|
+
if (await adapter.canHandle(sessionName)) {
|
|
77
|
+
return {
|
|
78
|
+
runnerType: adapter.supportedRunners[0] || "unknown",
|
|
79
|
+
structuredEventsAvailable: adapter.supportsStructuredEvents,
|
|
80
|
+
recommendedAdapter: adapter.id,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// Generic tmux session
|
|
85
|
+
return {
|
|
86
|
+
runnerType: "tmux",
|
|
87
|
+
structuredEventsAvailable: false,
|
|
88
|
+
recommendedAdapter: this.fallbackAdapter.id,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/** Global registry instance */
|
|
93
|
+
export const adapterRegistry = new AdapterRegistry();
|
|
94
|
+
/**
|
|
95
|
+
* Get the global adapter registry
|
|
96
|
+
*/
|
|
97
|
+
export function getAdapterRegistry() {
|
|
98
|
+
return adapterRegistry;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Select adapter for session (convenience function)
|
|
102
|
+
*/
|
|
103
|
+
export async function selectAdapter(sessionName) {
|
|
104
|
+
return adapterRegistry.selectAdapter(sessionName);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Detect runner for session (convenience function)
|
|
108
|
+
*/
|
|
109
|
+
export async function detectRunner(sessionName) {
|
|
110
|
+
return adapterRegistry.detectRunner(sessionName);
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/runtime/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapter Registry Tests
|
|
3
|
+
*/
|
|
4
|
+
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
5
|
+
import { TmuxFallbackAdapter } from "./adapters/tmux-fallback.js";
|
|
6
|
+
import { AdapterRegistry, detectRunner, selectAdapter } from "./registry.js";
|
|
7
|
+
// Mock the tmux module
|
|
8
|
+
vi.mock("../../core/tmux.js", () => ({
|
|
9
|
+
sessionExists: vi.fn((name) => name.includes("test")),
|
|
10
|
+
sendKeys: vi.fn(() => true),
|
|
11
|
+
captureSessionOutput: vi.fn(() => "test output"),
|
|
12
|
+
getSessionName: vi.fn((name) => `agentmesh-${name}`),
|
|
13
|
+
}));
|
|
14
|
+
describe("AdapterRegistry", () => {
|
|
15
|
+
let registry;
|
|
16
|
+
beforeEach(() => {
|
|
17
|
+
registry = new AdapterRegistry();
|
|
18
|
+
});
|
|
19
|
+
describe("registration", () => {
|
|
20
|
+
it("should register adapters", () => {
|
|
21
|
+
const customAdapter = new TmuxFallbackAdapter();
|
|
22
|
+
registry.register(customAdapter);
|
|
23
|
+
expect(registry.get("tmux-fallback")).toBeDefined();
|
|
24
|
+
});
|
|
25
|
+
it("should return all registered adapters", () => {
|
|
26
|
+
const adapters = registry.getAll();
|
|
27
|
+
expect(adapters.length).toBeGreaterThanOrEqual(1); // At least opencode
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
describe("fallback adapter", () => {
|
|
31
|
+
it("should have a fallback adapter", () => {
|
|
32
|
+
const fallback = registry.getFallback();
|
|
33
|
+
expect(fallback).toBeDefined();
|
|
34
|
+
expect(fallback.id).toBe("tmux-fallback");
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
describe("selectAdapter", () => {
|
|
38
|
+
it("should return fallback for generic session", async () => {
|
|
39
|
+
const adapter = await registry.selectAdapter("agentmesh-test");
|
|
40
|
+
expect(adapter).toBeDefined();
|
|
41
|
+
});
|
|
42
|
+
it("should throw error for non-existent session", async () => {
|
|
43
|
+
await expect(registry.selectAdapter("agentmesh-nonexistent")).rejects.toThrow();
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
describe("detectRunner", () => {
|
|
47
|
+
it("should detect tmux session", async () => {
|
|
48
|
+
const result = await registry.detectRunner("agentmesh-test");
|
|
49
|
+
expect(result.runnerType).toBeDefined();
|
|
50
|
+
expect(result.recommendedAdapter).toBeDefined();
|
|
51
|
+
});
|
|
52
|
+
it("should return unknown for non-existent session", async () => {
|
|
53
|
+
const result = await registry.detectRunner("agentmesh-nonexistent");
|
|
54
|
+
expect(result.runnerType).toBe("unknown");
|
|
55
|
+
expect(result.recommendedAdapter).toBe("none");
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
describe("convenience functions", () => {
|
|
60
|
+
it("selectAdapter should work with global registry", async () => {
|
|
61
|
+
const adapter = await selectAdapter("agentmesh-test");
|
|
62
|
+
expect(adapter).toBeDefined();
|
|
63
|
+
});
|
|
64
|
+
it("detectRunner should work with global registry", async () => {
|
|
65
|
+
const result = await detectRunner("agentmesh-test");
|
|
66
|
+
expect(result.runnerType).toBeDefined();
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
//# sourceMappingURL=registry.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.test.js","sourceRoot":"","sources":["../../src/runtime/registry.test.ts"],"names":[],"mappings":"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"}
|