@beeos-ai/device-agent 0.9.3 → 0.9.7
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/adapters/transport-bridge-ws.d.ts +12 -0
- package/dist/adapters/transport-bridge-ws.js +27 -3
- package/dist/adapters/transport-bridge-ws.js.map +1 -1
- package/dist/agent-runtime/core.d.ts +1 -1
- package/dist/agent-runtime/core.js +41 -0
- package/dist/agent-runtime/core.js.map +1 -1
- package/dist/app/session-manager.d.ts +14 -11
- package/dist/app/session-manager.js +8 -9
- package/dist/app/session-manager.js.map +1 -1
- package/dist/bootstrap.js +140 -11
- package/dist/bootstrap.js.map +1 -1
- package/dist/chat.js +11 -1
- package/dist/chat.js.map +1 -1
- package/dist/config/loader.js +3 -0
- package/dist/config/loader.js.map +1 -1
- package/dist/config/schema.d.ts +3 -0
- package/dist/config/schema.js +65 -21
- package/dist/config/schema.js.map +1 -1
- package/dist/fleet/adapters/process/node-process-manager.d.ts +115 -13
- package/dist/fleet/adapters/process/node-process-manager.js +412 -64
- package/dist/fleet/adapters/process/node-process-manager.js.map +1 -1
- package/dist/fleet/adapters/state/port-allocator.d.ts +12 -0
- package/dist/fleet/adapters/state/port-allocator.js +39 -5
- package/dist/fleet/adapters/state/port-allocator.js.map +1 -1
- package/dist/fleet/domain/events.d.ts +23 -1
- package/dist/fleet/domain/fsm.d.ts +13 -1
- package/dist/fleet/domain/fsm.js +70 -0
- package/dist/fleet/domain/fsm.js.map +1 -1
- package/dist/fleet/supervisor.js +30 -0
- package/dist/fleet/supervisor.js.map +1 -1
- package/dist/health/adb-track-devices.d.ts +103 -0
- package/dist/health/adb-track-devices.js +171 -0
- package/dist/health/adb-track-devices.js.map +1 -0
- package/dist/health/health-reporter.d.ts +67 -0
- package/dist/health/health-reporter.js +123 -0
- package/dist/health/health-reporter.js.map +1 -0
- package/dist/health/index.d.ts +6 -0
- package/dist/health/index.js +4 -0
- package/dist/health/index.js.map +1 -0
- package/dist/health/mcp-health-monitor.d.ts +190 -0
- package/dist/health/mcp-health-monitor.js +267 -0
- package/dist/health/mcp-health-monitor.js.map +1 -0
- package/dist/inbound/cli/main.js +10 -3
- package/dist/inbound/cli/main.js.map +1 -1
- package/dist/inbound/cli/run-command.js +24 -2
- package/dist/inbound/cli/run-command.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp-client/action-mapping.d.ts +45 -0
- package/dist/mcp-client/action-mapping.js +224 -0
- package/dist/mcp-client/action-mapping.js.map +1 -0
- package/dist/mcp-client/autospawn.d.ts +15 -2
- package/dist/mcp-client/autospawn.js +82 -4
- package/dist/mcp-client/autospawn.js.map +1 -1
- package/dist/mcp-client/client.d.ts +134 -38
- package/dist/mcp-client/client.js +394 -87
- package/dist/mcp-client/client.js.map +1 -1
- package/dist/mcp-client/index.d.ts +5 -3
- package/dist/mcp-client/index.js +2 -1
- package/dist/mcp-client/index.js.map +1 -1
- package/dist/mcp-client/inproc.d.ts +2 -2
- package/dist/mcp-client/inproc.js.map +1 -1
- package/dist/mcp-client/runtime.d.ts +124 -21
- package/dist/mcp-client/runtime.js +18 -7
- package/dist/mcp-client/runtime.js.map +1 -1
- package/dist/messaging/token-provider.d.ts +15 -14
- package/dist/messaging/token-provider.js +16 -16
- package/dist/messaging/token-provider.js.map +1 -1
- package/dist/model/adapters/autoglm.js +44 -45
- package/dist/model/adapters/autoglm.js.map +1 -1
- package/dist/model/adapters/guiowl.js +3 -2
- package/dist/model/adapters/guiowl.js.map +1 -1
- package/dist/model/adapters/maiui.js +80 -53
- package/dist/model/adapters/maiui.js.map +1 -1
- package/dist/model/adapters/qwenvl.js +147 -51
- package/dist/model/adapters/qwenvl.js.map +1 -1
- package/dist/model/adapters/tool-call.js +13 -3
- package/dist/model/adapters/tool-call.js.map +1 -1
- package/dist/model/adapters/uitars.js +80 -84
- package/dist/model/adapters/uitars.js.map +1 -1
- package/dist/plugins/acp/index.d.ts +35 -0
- package/dist/plugins/acp/index.js +121 -0
- package/dist/plugins/acp/index.js.map +1 -1
- package/dist/plugins/message-bus/busy-reply.d.ts +5 -5
- package/dist/plugins/message-bus/busy-reply.js +30 -9
- package/dist/plugins/message-bus/busy-reply.js.map +1 -1
- package/dist/plugins/message-bus/cancel.d.ts +5 -11
- package/dist/plugins/message-bus/cancel.js +8 -14
- package/dist/plugins/message-bus/cancel.js.map +1 -1
- package/dist/plugins/message-bus/inbound.d.ts +18 -25
- package/dist/plugins/message-bus/inbound.js +23 -55
- package/dist/plugins/message-bus/inbound.js.map +1 -1
- package/dist/plugins/message-bus/index.d.ts +25 -44
- package/dist/plugins/message-bus/index.js +70 -111
- package/dist/plugins/message-bus/index.js.map +1 -1
- package/dist/plugins/message-bus/ms-channel-notifier.d.ts +24 -37
- package/dist/plugins/message-bus/ms-channel-notifier.js +39 -59
- package/dist/plugins/message-bus/ms-channel-notifier.js.map +1 -1
- package/dist/ports/transport.d.ts +11 -0
- package/dist/resources/parsers.js +17 -0
- package/dist/resources/parsers.js.map +1 -1
- package/package.json +4 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-call.js","sourceRoot":"","sources":["../../../src/model/adapters/tool-call.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"tool-call.js","sourceRoot":"","sources":["../../../src/model/adapters/tool-call.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,107 +1,75 @@
|
|
|
1
1
|
import { ModelAdapter, registerAdapter } from "./base.js";
|
|
2
2
|
// UITars / Doubao-1.5-UI-TARS adapter
|
|
3
|
-
//
|
|
3
|
+
// Aligned with ClawGUI prompts_uitars.py (PHONE_USE_DOUBAO template)
|
|
4
|
+
//
|
|
5
|
+
// Message structure (mirrors ClawGUI exactly):
|
|
6
|
+
// First turn : [user(text=systemPrompt+task, image)] — no system role
|
|
7
|
+
// Subsequent : [...context, user(image only)]
|
|
8
|
+
// assistant : raw model output appended by updateContext
|
|
9
|
+
// Image window: max 5 (pruned in updateContext)
|
|
10
|
+
//
|
|
4
11
|
// Coordinate system: smart_resize (normalized to IMAGE_FACTOR=28 grid)
|
|
5
12
|
const MAX_IMAGES = 5;
|
|
6
|
-
|
|
7
|
-
|
|
13
|
+
function buildSystemPrompt(task, lang) {
|
|
14
|
+
const language = lang === "cn" ? "Chinese" : "English";
|
|
15
|
+
return `You are a GUI agent. You are given a task and your action history, with screenshots. You need to perform the next action to complete the task.
|
|
8
16
|
|
|
9
|
-
Output
|
|
10
|
-
|
|
11
|
-
|
|
17
|
+
## Output Format
|
|
18
|
+
\`\`\`
|
|
19
|
+
Thought: ...
|
|
20
|
+
Action: ...
|
|
21
|
+
\`\`\`
|
|
12
22
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
- finish(message='...')
|
|
23
|
+
## Action Space
|
|
24
|
+
click(point='<point>x1 y1</point>')
|
|
25
|
+
long_press(point='<point>x1 y1</point>')
|
|
26
|
+
type(content='') #If you want to submit your input, use "\\n" at the end of \`content\`.
|
|
27
|
+
scroll(point='<point>x1 y1</point>', direction='down or up or right or left')
|
|
28
|
+
open_app(app_name='')
|
|
29
|
+
drag(start_point='<point>x1 y1</point>', end_point='<point>x2 y2</point>')
|
|
30
|
+
press_home()
|
|
31
|
+
press_back()
|
|
32
|
+
finished(content='xxx') # Use escape characters \\', \\", and \\n in content part to ensure we can parse the content in normal python string format.
|
|
24
33
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
34
|
+
## Note
|
|
35
|
+
- Use ${language} in \`Thought\` part.
|
|
36
|
+
- Write a small plan and finally summarize your next action (with its target element) in one sentence in \`Thought\` part.
|
|
28
37
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
可用动作:
|
|
34
|
-
- click(point='<point>x y</point>')
|
|
35
|
-
- long_press(point='<point>x y</point>')
|
|
36
|
-
- double_click(point='<point>x y</point>')
|
|
37
|
-
- type(content='text')
|
|
38
|
-
- scroll(point='<point>x y</point>', direction='up|down|left|right', dist='short|medium|long')
|
|
39
|
-
- press_back()
|
|
40
|
-
- press_home()
|
|
41
|
-
- open_app(app_name='App')
|
|
42
|
-
- wait()
|
|
43
|
-
- finish(message='...')
|
|
44
|
-
|
|
45
|
-
坐标为 smart_resize 空间(相对于缩放后的图像网格)。`;
|
|
38
|
+
## User Instruction
|
|
39
|
+
${task}`;
|
|
40
|
+
}
|
|
46
41
|
class UITarsAdapter extends ModelAdapter {
|
|
47
42
|
name = "uitars";
|
|
48
43
|
patterns = [/uitars/, /ui[-_]?tars/, /doubao.*ui/, /ui.*tars/];
|
|
49
|
-
// Sliding window of recent image URLs (data:* or signed https). Kept
|
|
50
|
-
// for parity with the reference agent's MAX_IMAGES window — currently
|
|
51
|
-
// not replayed into the prompt because the live `context` already
|
|
52
|
-
// carries vision parts; future turn-rewinding logic will read this.
|
|
53
|
-
imageHistory = [];
|
|
54
44
|
buildMessages(task, screenInfo, context, isFirst, lang) {
|
|
55
|
-
const systemPrompt = lang === "cn" ? SYSTEM_PROMPT_CN : SYSTEM_PROMPT_EN;
|
|
56
|
-
if (screenInfo.imageRef) {
|
|
57
|
-
this.imageHistory.push(screenInfo.imageRef.url);
|
|
58
|
-
if (this.imageHistory.length > MAX_IMAGES) {
|
|
59
|
-
this.imageHistory.shift();
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
const msgs = [{ role: "system", content: systemPrompt }];
|
|
63
45
|
if (isFirst) {
|
|
64
|
-
|
|
46
|
+
// System prompt embedded in the first user message (no system role).
|
|
47
|
+
// Text first, image second — matches ClawGUI.
|
|
48
|
+
const content = [
|
|
49
|
+
{ type: "text", text: buildSystemPrompt(task, lang) },
|
|
50
|
+
];
|
|
65
51
|
if (screenInfo.imageRef) {
|
|
66
52
|
content.push({ type: "image_url", image_url: { url: screenInfo.imageRef.url } });
|
|
67
53
|
}
|
|
68
|
-
|
|
69
|
-
msgs.push({ role: "user", content });
|
|
54
|
+
return [{ role: "user", content }];
|
|
70
55
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
if (Array.isArray(m.content)) {
|
|
76
|
-
const textParts = m.content
|
|
77
|
-
.filter((p) => p.type === "text");
|
|
78
|
-
const stripped = textParts.length === 1 && typeof textParts[0].text === "string"
|
|
79
|
-
? textParts[0].text
|
|
80
|
-
: textParts;
|
|
81
|
-
return { ...m, content: stripped };
|
|
82
|
-
}
|
|
83
|
-
return m;
|
|
84
|
-
});
|
|
85
|
-
msgs.push(...textOnlyContext);
|
|
86
|
-
const content = [];
|
|
87
|
-
if (screenInfo.imageRef) {
|
|
88
|
-
content.push({ type: "image_url", image_url: { url: screenInfo.imageRef.url } });
|
|
89
|
-
}
|
|
90
|
-
content.push({ type: "text", text: "Current screen. What is the next action?" });
|
|
91
|
-
msgs.push({ role: "user", content });
|
|
56
|
+
// Subsequent turns: append image-only user message to accumulated context.
|
|
57
|
+
const content = [];
|
|
58
|
+
if (screenInfo.imageRef) {
|
|
59
|
+
content.push({ type: "image_url", image_url: { url: screenInfo.imageRef.url } });
|
|
92
60
|
}
|
|
93
|
-
return
|
|
61
|
+
return [...context, { role: "user", content }];
|
|
94
62
|
}
|
|
95
63
|
parseResponse(raw) {
|
|
96
64
|
const [thinking, actionStr] = splitThoughtAction(raw);
|
|
97
65
|
return parseUITarsAction(actionStr, thinking);
|
|
98
66
|
}
|
|
99
|
-
updateContext(context, response,
|
|
67
|
+
updateContext(context, response, _parsed) {
|
|
100
68
|
context.push({ role: "assistant", content: response.rawContent });
|
|
101
|
-
return context;
|
|
69
|
+
return pruneImages(context, MAX_IMAGES);
|
|
102
70
|
}
|
|
103
71
|
clearHistory() {
|
|
104
|
-
|
|
72
|
+
// Context is reset externally (OpenAIAdapter clears on new run).
|
|
105
73
|
}
|
|
106
74
|
}
|
|
107
75
|
registerAdapter(new UITarsAdapter());
|
|
@@ -114,7 +82,6 @@ function splitThoughtAction(raw) {
|
|
|
114
82
|
return [thinking, action];
|
|
115
83
|
}
|
|
116
84
|
function parsePoint(s) {
|
|
117
|
-
// <point>x y</point> or plain "x y"
|
|
118
85
|
const m = s.match(/<point>\s*(\d+(?:\.\d+)?)\s+(\d+(?:\.\d+)?)\s*<\/point>/) ??
|
|
119
86
|
s.match(/(\d+(?:\.\d+)?)\s+(\d+(?:\.\d+)?)/);
|
|
120
87
|
if (!m)
|
|
@@ -129,7 +96,8 @@ function parseUITarsAction(s, thinking) {
|
|
|
129
96
|
const make = (actionType, params, shouldFinish = false, finishMessage = null) => ({ actionType, params, thinking, coordSystem: "smart_resize", shouldFinish, finishMessage });
|
|
130
97
|
const trimmed = s.replace(/^```[a-z]*\s*/i, "").replace(/```$/, "").trim();
|
|
131
98
|
if (trimmed.startsWith("finish")) {
|
|
132
|
-
|
|
99
|
+
// Handles both finish(message=...) and finished(content=...)
|
|
100
|
+
const msg = parseKeyword(trimmed, "content") ?? parseKeyword(trimmed, "message") ?? trimmed;
|
|
133
101
|
return make("finish", { message: msg }, true, msg);
|
|
134
102
|
}
|
|
135
103
|
if (trimmed.startsWith("click")) {
|
|
@@ -150,6 +118,13 @@ function parseUITarsAction(s, thinking) {
|
|
|
150
118
|
if (pt)
|
|
151
119
|
return make("double_tap", { x: pt[0], y: pt[1] });
|
|
152
120
|
}
|
|
121
|
+
if (trimmed.startsWith("drag")) {
|
|
122
|
+
const startStr = parseKeyword(trimmed, "start_point") ?? "";
|
|
123
|
+
const endStr = parseKeyword(trimmed, "end_point") ?? "";
|
|
124
|
+
const start = parsePoint(startStr) ?? [500, 300];
|
|
125
|
+
const end = parsePoint(endStr) ?? [500, 700];
|
|
126
|
+
return make("swipe", { start_x: start[0], start_y: start[1], end_x: end[0], end_y: end[1] });
|
|
127
|
+
}
|
|
153
128
|
if (trimmed.startsWith("type")) {
|
|
154
129
|
const text = parseKeyword(trimmed, "content") ?? parseKeyword(trimmed, "text") ?? "";
|
|
155
130
|
return make("type", { text });
|
|
@@ -158,11 +133,12 @@ function parseUITarsAction(s, thinking) {
|
|
|
158
133
|
const pointStr = parseKeyword(trimmed, "point") ?? "";
|
|
159
134
|
const pt = parsePoint(pointStr) ?? [500, 500];
|
|
160
135
|
const dir = parseKeyword(trimmed, "direction") ?? "down";
|
|
161
|
-
const
|
|
162
|
-
const distMap = { short: 200, medium: 400, long: 700 };
|
|
163
|
-
const dist = distMap[distStr] ?? 400;
|
|
136
|
+
const dist = 300;
|
|
164
137
|
const [sx, sy] = [pt[0], pt[1]];
|
|
165
|
-
const [ex, ey] = dir === "up" ? [sx, sy
|
|
138
|
+
const [ex, ey] = dir === "up" ? [sx, sy + dist] :
|
|
139
|
+
dir === "down" ? [sx, sy - dist] :
|
|
140
|
+
dir === "left" ? [sx + dist, sy] :
|
|
141
|
+
[sx - dist, sy];
|
|
166
142
|
return make("swipe", { start_x: sx, start_y: sy, end_x: ex, end_y: ey });
|
|
167
143
|
}
|
|
168
144
|
if (trimmed.startsWith("press_back"))
|
|
@@ -177,4 +153,24 @@ function parseUITarsAction(s, thinking) {
|
|
|
177
153
|
return make("wait", { duration_seconds: 2 });
|
|
178
154
|
return make("wait", { duration_seconds: 2 });
|
|
179
155
|
}
|
|
156
|
+
function pruneImages(context, keepCount) {
|
|
157
|
+
let imageCount = 0;
|
|
158
|
+
for (let i = context.length - 1; i >= 0; i--) {
|
|
159
|
+
const msg = context[i];
|
|
160
|
+
if (Array.isArray(msg.content)) {
|
|
161
|
+
const parts = msg.content;
|
|
162
|
+
const hasImage = parts.some((p) => p.type === "image_url");
|
|
163
|
+
if (hasImage) {
|
|
164
|
+
imageCount++;
|
|
165
|
+
if (imageCount > keepCount) {
|
|
166
|
+
context[i] = {
|
|
167
|
+
...msg,
|
|
168
|
+
content: parts.filter((p) => p.type !== "image_url"),
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return context;
|
|
175
|
+
}
|
|
180
176
|
//# sourceMappingURL=uitars.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uitars.js","sourceRoot":"","sources":["../../../src/model/adapters/uitars.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE1D,sCAAsC;AACtC,
|
|
1
|
+
{"version":3,"file":"uitars.js","sourceRoot":"","sources":["../../../src/model/adapters/uitars.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,6 +29,7 @@
|
|
|
29
29
|
* is passed; in that mode only the http-debug plugin is useful.
|
|
30
30
|
*/
|
|
31
31
|
import { deriveFixedSessionId } from "../../app/fixed-session-id.js";
|
|
32
|
+
import { McpClient } from "../../mcp-client/index.js";
|
|
32
33
|
import type { IMcpRuntime } from "../../mcp-client/runtime.js";
|
|
33
34
|
import type { IBridgeTransport } from "../../ports/transport.js";
|
|
34
35
|
import type { AgentPlugin, PluginContext } from "../../ports/plugin.js";
|
|
@@ -47,6 +48,36 @@ export interface AcpPluginOptions {
|
|
|
47
48
|
};
|
|
48
49
|
/** Optional pre-built transport (used by tests for mock injection). */
|
|
49
50
|
transportOverride?: IBridgeTransport;
|
|
51
|
+
/**
|
|
52
|
+
* Optional HTTP MCP client. When provided, the plugin spins up a
|
|
53
|
+
* MCPHealthMonitor + HealthReporter pair that publishes
|
|
54
|
+
* `device/health` notifications over the Bridge transport so the
|
|
55
|
+
* control plane can render device-level connectivity in the
|
|
56
|
+
* web/desktop/mobile UIs (instance.connectivity_reason field).
|
|
57
|
+
*
|
|
58
|
+
* Pass `null` (or omit) to opt out — non-fleet single-process /
|
|
59
|
+
* in-process MCP installations don't benefit because they share
|
|
60
|
+
* a process with their device adapter and there's no separate
|
|
61
|
+
* MCP server health to monitor.
|
|
62
|
+
*/
|
|
63
|
+
mcpClient?: McpClient | null;
|
|
64
|
+
/**
|
|
65
|
+
* MCP HTTP endpoint URL string. Used by the active probe (60s
|
|
66
|
+
* `initialize` JSON-RPC) inside the health monitor. Falls back to
|
|
67
|
+
* the McpClient's default URL when omitted; only really needed when
|
|
68
|
+
* the McpClient was constructed with a non-default `baseUrl`.
|
|
69
|
+
*/
|
|
70
|
+
mcpEndpoint?: string;
|
|
71
|
+
/**
|
|
72
|
+
* Optional ADB serial of the target Android device. When provided
|
|
73
|
+
* (Android self-hosted path), the plugin spins up an
|
|
74
|
+
* `AdbTrackDevices` push source wired into MCPHealthMonitor so USB
|
|
75
|
+
* unplug events propagate to the cluster within ~2-3s instead of
|
|
76
|
+
* waiting for the 60s active probe. Empty / undefined disables the
|
|
77
|
+
* push path (desktop / agentbay / openclaw paths fall back to the
|
|
78
|
+
* passive callResult + active probe combination).
|
|
79
|
+
*/
|
|
80
|
+
adbSerial?: string;
|
|
50
81
|
}
|
|
51
82
|
export declare class AcpPlugin implements AgentPlugin {
|
|
52
83
|
private readonly opts;
|
|
@@ -55,6 +86,10 @@ export declare class AcpPlugin implements AgentPlugin {
|
|
|
55
86
|
private transport;
|
|
56
87
|
private boundSid;
|
|
57
88
|
private unbind;
|
|
89
|
+
private healthMonitor;
|
|
90
|
+
private healthReporter;
|
|
91
|
+
private adbTracker;
|
|
92
|
+
private adbTrackerOnChange;
|
|
58
93
|
constructor(opts: AcpPluginOptions);
|
|
59
94
|
init(ctx: PluginContext): Promise<void>;
|
|
60
95
|
start(): Promise<void>;
|
|
@@ -30,11 +30,13 @@
|
|
|
30
30
|
*/
|
|
31
31
|
import { BridgeWsTransport } from "../../adapters/transport-bridge-ws.js";
|
|
32
32
|
import { deriveFixedSessionId } from "../../app/fixed-session-id.js";
|
|
33
|
+
import { AdbTrackDevices, HealthReporter, MCPHealthMonitor, } from "../../health/index.js";
|
|
33
34
|
import { AcpDeviceHandlers } from "../../inbound/acp/handlers/device.js";
|
|
34
35
|
import { AcpSessionHandlers } from "../../inbound/acp/handlers/session.js";
|
|
35
36
|
import { AcpSkillsHandlers } from "../../inbound/acp/handlers/skills.js";
|
|
36
37
|
import { AcpRouter, bindRouterToTransport } from "../../inbound/acp/router.js";
|
|
37
38
|
import { TransportSessionNotifier } from "../../inbound/acp/notifier.js";
|
|
39
|
+
import { resolveDefaultMcpUrl } from "../../mcp-client/index.js";
|
|
38
40
|
export class AcpPlugin {
|
|
39
41
|
opts;
|
|
40
42
|
name = "acp";
|
|
@@ -42,6 +44,10 @@ export class AcpPlugin {
|
|
|
42
44
|
transport = null;
|
|
43
45
|
boundSid = null;
|
|
44
46
|
unbind = null;
|
|
47
|
+
healthMonitor = null;
|
|
48
|
+
healthReporter = null;
|
|
49
|
+
adbTracker = null;
|
|
50
|
+
adbTrackerOnChange = null;
|
|
45
51
|
constructor(opts) {
|
|
46
52
|
this.opts = opts;
|
|
47
53
|
}
|
|
@@ -87,11 +93,86 @@ export class AcpPlugin {
|
|
|
87
93
|
});
|
|
88
94
|
this.transport = transport;
|
|
89
95
|
this.unbind = bindRouterToTransport(router, transport);
|
|
96
|
+
// Health-reporting plumbing — only activates when an HTTP McpClient
|
|
97
|
+
// is wired in by bootstrap. The pair publishes `device/health`
|
|
98
|
+
// notifications over the same transport (so they ride the same
|
|
99
|
+
// auth + reconnect machinery as session/update). The reporter
|
|
100
|
+
// listens for `transport.connected` and re-emits last-known state
|
|
101
|
+
// on every reconnect — without that, a state change that happens
|
|
102
|
+
// while the WS is down is silently dropped (see notifier.ts).
|
|
103
|
+
if (this.opts.mcpClient) {
|
|
104
|
+
const endpoint = new URL(this.opts.mcpEndpoint ?? resolveDefaultMcpUrl());
|
|
105
|
+
// Normalise bare-origin URLs to /mcp so the active probe hits the
|
|
106
|
+
// streamable HTTP endpoint, not a 404 root.
|
|
107
|
+
if (endpoint.pathname === "" || endpoint.pathname === "/") {
|
|
108
|
+
endpoint.pathname = "/mcp";
|
|
109
|
+
}
|
|
110
|
+
this.healthMonitor = new MCPHealthMonitor({
|
|
111
|
+
mcpEndpoint: endpoint,
|
|
112
|
+
mcpClient: this.opts.mcpClient,
|
|
113
|
+
});
|
|
114
|
+
this.healthReporter = new HealthReporter({
|
|
115
|
+
monitor: this.healthMonitor,
|
|
116
|
+
transport,
|
|
117
|
+
logger: log,
|
|
118
|
+
});
|
|
119
|
+
// Push source — when an ADB serial is configured (Android self-
|
|
120
|
+
// hosted path), wire `adb track-devices` events directly into the
|
|
121
|
+
// monitor via mark{Healthy,Unhealthy}. This bypasses the 60s
|
|
122
|
+
// active probe + 5s flap window so USB unplug propagates to the
|
|
123
|
+
// cluster in ~2-3s. Desktop / agentbay paths leave adbSerial
|
|
124
|
+
// empty and fall back to the passive callResult path.
|
|
125
|
+
if (this.opts.adbSerial) {
|
|
126
|
+
this.adbTracker = new AdbTrackDevices({
|
|
127
|
+
targetSerial: this.opts.adbSerial,
|
|
128
|
+
logger: log,
|
|
129
|
+
});
|
|
130
|
+
this.adbTrackerOnChange = (state) => {
|
|
131
|
+
if (!this.healthMonitor)
|
|
132
|
+
return;
|
|
133
|
+
if (state.ok)
|
|
134
|
+
this.healthMonitor.markHealthy();
|
|
135
|
+
else
|
|
136
|
+
this.healthMonitor.markUnhealthy(state.reason);
|
|
137
|
+
};
|
|
138
|
+
this.adbTracker.on("change", this.adbTrackerOnChange);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
90
141
|
}
|
|
91
142
|
async start() {
|
|
92
143
|
if (!this.transport)
|
|
93
144
|
return;
|
|
94
145
|
await this.transport.connect();
|
|
146
|
+
// Order: arm the active probe BEFORE priming so the periodic timer
|
|
147
|
+
// is already running by the time the first state lands. Prime is
|
|
148
|
+
// awaited so the very first `change` event is the ground-truth
|
|
149
|
+
// snapshot, not a guess — the bridge is connected at this point so
|
|
150
|
+
// the prime emission gets delivered immediately.
|
|
151
|
+
if (this.healthMonitor) {
|
|
152
|
+
this.healthMonitor.start();
|
|
153
|
+
// Settle window: give the transport's `connected` event a tick
|
|
154
|
+
// to propagate so flushOnReconnect doesn't fire before
|
|
155
|
+
// `last` is non-null. 1s is generous; the actual prime probe
|
|
156
|
+
// returns in <2s under normal conditions.
|
|
157
|
+
await new Promise((resolve) => setTimeout(resolve, 1_000));
|
|
158
|
+
await this.healthMonitor.primeInitialState().catch((err) => {
|
|
159
|
+
if (this.ctx) {
|
|
160
|
+
this.ctx.log.warn({ err: err instanceof Error ? err.message : String(err) }, "acp: health monitor primeInitialState failed (will retry on next probe)");
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
// Start the ADB push source AFTER monitor.primeInitialState — so the
|
|
165
|
+
// initial healthy/unhealthy snapshot lands first, and the
|
|
166
|
+
// first track-devices event (typically `adb_online` for the bound
|
|
167
|
+
// serial) becomes a markHealthy() that's correctly deduped by
|
|
168
|
+
// transition.equalState rather than an extra emission.
|
|
169
|
+
if (this.adbTracker) {
|
|
170
|
+
await this.adbTracker.start().catch((err) => {
|
|
171
|
+
if (this.ctx) {
|
|
172
|
+
this.ctx.log.warn({ err: err instanceof Error ? err.message : String(err) }, "acp: adb-track-devices failed to start (will retry internally)");
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
}
|
|
95
176
|
}
|
|
96
177
|
/**
|
|
97
178
|
* Visible for tests — exposes the sid this plugin binds to so test
|
|
@@ -100,6 +181,46 @@ export class AcpPlugin {
|
|
|
100
181
|
*/
|
|
101
182
|
static deriveFixedSessionId = deriveFixedSessionId;
|
|
102
183
|
async stop() {
|
|
184
|
+
// Tear down health plumbing first so its on-transport "connected"
|
|
185
|
+
// / on-monitor "change" handlers don't fire during the rest of
|
|
186
|
+
// teardown. Order: tracker → reporter → monitor (push source first
|
|
187
|
+
// so it can't push into a half-disposed monitor).
|
|
188
|
+
if (this.adbTracker) {
|
|
189
|
+
if (this.adbTrackerOnChange) {
|
|
190
|
+
try {
|
|
191
|
+
this.adbTracker.off("change", this.adbTrackerOnChange);
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
/* ignore */
|
|
195
|
+
}
|
|
196
|
+
this.adbTrackerOnChange = null;
|
|
197
|
+
}
|
|
198
|
+
try {
|
|
199
|
+
await this.adbTracker.dispose();
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
/* ignore */
|
|
203
|
+
}
|
|
204
|
+
this.adbTracker = null;
|
|
205
|
+
}
|
|
206
|
+
if (this.healthReporter) {
|
|
207
|
+
try {
|
|
208
|
+
this.healthReporter.dispose();
|
|
209
|
+
}
|
|
210
|
+
catch {
|
|
211
|
+
/* ignore */
|
|
212
|
+
}
|
|
213
|
+
this.healthReporter = null;
|
|
214
|
+
}
|
|
215
|
+
if (this.healthMonitor) {
|
|
216
|
+
try {
|
|
217
|
+
this.healthMonitor.dispose();
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
/* ignore */
|
|
221
|
+
}
|
|
222
|
+
this.healthMonitor = null;
|
|
223
|
+
}
|
|
103
224
|
if (this.boundSid && this.ctx) {
|
|
104
225
|
try {
|
|
105
226
|
this.ctx.sessionManager.unbindNotifier(this.boundSid);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/acp/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAC3E,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAC/E,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/acp/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,17 +10,17 @@
|
|
|
10
10
|
* `/wait` timeout.
|
|
11
11
|
*
|
|
12
12
|
* Type/payload alignment: uses the same `agent_reply` type that the
|
|
13
|
-
*
|
|
13
|
+
* MsChannelNotifier emits, with a `{ error }` body that matches
|
|
14
14
|
* `backend/pkg/chatinvoke/invoker.go::extractReplyFinal` (which reads
|
|
15
15
|
* `payload.error` first, falling back to `payload.text`).
|
|
16
16
|
*/
|
|
17
|
-
import type {
|
|
17
|
+
import type { MessageClient } from "@beeos-ai/message-sdk";
|
|
18
18
|
export interface BusyReplyRequest {
|
|
19
19
|
channelId: string;
|
|
20
20
|
inboundMessageId: string;
|
|
21
21
|
/**
|
|
22
22
|
* Session key derived from the rejected envelope (via
|
|
23
|
-
* `extractChatPrompt(
|
|
23
|
+
* `extractChatPrompt(msg).sessionKey`). Always set so the busy
|
|
24
24
|
* reply payload has the same `{ session_key, error }` shape as a
|
|
25
25
|
* regular `agent_reply`.
|
|
26
26
|
*/
|
|
@@ -30,9 +30,9 @@ export interface BusyReplyHandler {
|
|
|
30
30
|
replyBusy(req: BusyReplyRequest): Promise<void>;
|
|
31
31
|
}
|
|
32
32
|
export interface BusyReplyHandlerOptions {
|
|
33
|
-
|
|
33
|
+
client: MessageClient;
|
|
34
34
|
}
|
|
35
|
-
export declare class
|
|
35
|
+
export declare class MessageClientBusyReplyHandler implements BusyReplyHandler {
|
|
36
36
|
private readonly opts;
|
|
37
37
|
constructor(opts: BusyReplyHandlerOptions);
|
|
38
38
|
replyBusy(req: BusyReplyRequest): Promise<void>;
|
|
@@ -10,28 +10,49 @@
|
|
|
10
10
|
* `/wait` timeout.
|
|
11
11
|
*
|
|
12
12
|
* Type/payload alignment: uses the same `agent_reply` type that the
|
|
13
|
-
*
|
|
13
|
+
* MsChannelNotifier emits, with a `{ error }` body that matches
|
|
14
14
|
* `backend/pkg/chatinvoke/invoker.go::extractReplyFinal` (which reads
|
|
15
15
|
* `payload.error` first, falling back to `payload.text`).
|
|
16
16
|
*/
|
|
17
|
-
export class
|
|
17
|
+
export class MessageClientBusyReplyHandler {
|
|
18
18
|
opts;
|
|
19
19
|
constructor(opts) {
|
|
20
20
|
this.opts = opts;
|
|
21
21
|
}
|
|
22
22
|
async replyBusy(req) {
|
|
23
|
-
//
|
|
24
|
-
//
|
|
25
|
-
//
|
|
26
|
-
//
|
|
27
|
-
|
|
23
|
+
// Persistent v2 send — MS writes to channel_messages, fans out via
|
|
24
|
+
// Centrifugo. Caller's /wait long-poll has reconnect race windows;
|
|
25
|
+
// persistence is required so the busy reply isn't lost.
|
|
26
|
+
//
|
|
27
|
+
// Wire contract (PR7 — see agents/device-agent/docs/adr/006-agent-busy-contract.md):
|
|
28
|
+
// - `error` (string) — legacy field surfaced as
|
|
29
|
+
// TaskState.Error by chatinvoke's
|
|
30
|
+
// msgderive.extractError. Stable.
|
|
31
|
+
// - `error_code` (string) — structured machine-readable code.
|
|
32
|
+
// Callers prefer this over fragile
|
|
33
|
+
// `error.includes("agent_busy")`
|
|
34
|
+
// string matching. Stable; future
|
|
35
|
+
// busy variants will add new codes
|
|
36
|
+
// while keeping `error_code` as the
|
|
37
|
+
// switch-on field.
|
|
38
|
+
// - `text` (string) — human-readable explanation.
|
|
39
|
+
//
|
|
40
|
+
// `replyTo` is set so MS's single_shot logic
|
|
41
|
+
// (channel.SingleShot && reply_to != "") auto-closes the channel
|
|
42
|
+
// with reason="completed". Callers therefore observe
|
|
43
|
+
// TaskState.Status === TaskFailed (msgderive extracts the
|
|
44
|
+
// embedded `error` field), not TaskSucceeded, even though
|
|
45
|
+
// close_reason is technically "completed".
|
|
46
|
+
await this.opts.client.messages.send({
|
|
47
|
+
conversationId: req.channelId,
|
|
28
48
|
type: "agent_reply",
|
|
29
|
-
|
|
49
|
+
replyTo: req.inboundMessageId,
|
|
50
|
+
content: {
|
|
30
51
|
session_key: req.sessionKey,
|
|
31
52
|
error: "agent_busy",
|
|
53
|
+
error_code: "agent_busy",
|
|
32
54
|
text: "device-agent is processing another request — please retry once it completes.",
|
|
33
55
|
},
|
|
34
|
-
inReplyTo: req.inboundMessageId,
|
|
35
56
|
});
|
|
36
57
|
}
|
|
37
58
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"busy-reply.js","sourceRoot":"","sources":["../../../src/plugins/message-bus/busy-reply.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAwBH,MAAM,OAAO,
|
|
1
|
+
{"version":3,"file":"busy-reply.js","sourceRoot":"","sources":["../../../src/plugins/message-bus/busy-reply.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAwBH,MAAM,OAAO,6BAA6B;IACX;IAA7B,YAA6B,IAA6B;QAA7B,SAAI,GAAJ,IAAI,CAAyB;IAAG,CAAC;IAE9D,KAAK,CAAC,SAAS,CAAC,GAAqB;QACnC,mEAAmE;QACnE,mEAAmE;QACnE,wDAAwD;QACxD,EAAE;QACF,qFAAqF;QACrF,wDAAwD;QACxD,+DAA+D;QAC/D,+DAA+D;QAC/D,iEAAiE;QACjE,gEAAgE;QAChE,8DAA8D;QAC9D,+DAA+D;QAC/D,gEAAgE;QAChE,iEAAiE;QACjE,gDAAgD;QAChD,2DAA2D;QAC3D,EAAE;QACF,6CAA6C;QAC7C,iEAAiE;QACjE,qDAAqD;QACrD,0DAA0D;QAC1D,0DAA0D;QAC1D,2CAA2C;QAC3C,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;YACnC,cAAc,EAAE,GAAG,CAAC,SAAS;YAC7B,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,GAAG,CAAC,gBAAgB;YAC7B,OAAO,EAAE;gBACP,WAAW,EAAE,GAAG,CAAC,UAAU;gBAC3B,KAAK,EAAE,YAAY;gBACnB,UAAU,EAAE,YAAY;gBACxB,IAAI,EAAE,8EAA8E;aACrF;SACF,CAAC,CAAC;IACL,CAAC;CACF"}
|