@xyagent/cli 0.0.1 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/agentlink +551 -176
- package/bin/agentlink-agent +0 -0
- package/bin/agentlink-mcp-stdio +0 -0
- package/package.json +4 -2
- package/src/core.mjs +26 -0
- package/src-ext/bin.mjs +0 -1
- package/src-ext/commands/agent.mjs +0 -11
- package/src-ext/core/agentlinkToolsBootstrap.mjs +1 -1
- package/src-ext/core/autoTunnelDetector.mjs +6 -1
- package/src-ext/core/autoTunnelWiring.mjs +1 -1
- package/src-ext/core/bridgeSelfUninstall.mjs +1 -1
- package/src-ext/core/relayWorker.mjs +1 -1
- package/src-ext/core/scanDeeplink.mjs +67 -0
- package/src-ext/core/scanPairFlow.mjs +28 -0
- package/src-ext/core/scanQrRenderer.mjs +40 -0
- package/src-ext/core/unifiedDispatchHandler.mjs +3 -3
- package/src-ext/core/usageReporter.mjs +1 -2
- package/src-ext/openclaw-plugin/envelope-builder.cjs +2 -2
- package/src-ext/openclaw-plugin/todoTranslatorUtils.cjs +1 -1
- package/src-ext/runtime/_shared/relayObjectToBlock.mjs +9 -11
- package/src-ext/runtime/_shared/todoTranslatorUtils.mjs +1 -1
- package/src-ext/runtime/claude/launcher.mjs +0 -6
- package/src-ext/runtime/openclaw/buildOpenclawDaemonInput.mjs +0 -6
- package/src-shared/envelope_builder.mjs +2 -2
- package/src-ext/runtime/picoclaw/constants.mjs +0 -39
- package/src-ext/runtime/picoclaw/handleRequest.mjs +0 -289
- package/src-ext/runtime/picoclaw/index.mjs +0 -314
- package/src-ext/runtime/picoclaw/pairFlow.mjs +0 -224
- package/src-ext/runtime/picoclaw/state.mjs +0 -78
- package/src-ext/runtime/picoclaw/todoTranslator.mjs +0 -67
- package/src-ext/runtime/picoclaw/translator.mjs +0 -272
- package/src-ext/runtime/picoclaw/wsClient.mjs +0 -129
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
// PicoClaw daemon WebSocket 客户端。
|
|
2
|
-
//
|
|
3
|
-
// PicoClaw daemon 默认监听 127.0.0.1:18790,WS 路径 /pico/ws。
|
|
4
|
-
// 鉴权 3 种方式(picoclaw 自身支持):
|
|
5
|
-
// 1. Authorization: Bearer <token> (服务端 / Node `ws` 包可用)
|
|
6
|
-
// 2. Sec-WebSocket-Protocol "token.<value>" (浏览器 / Node 22 内置 WebSocket 用这条)
|
|
7
|
-
// 3. query 参数 ?token=<value>(picoclaw 必须开启 AllowTokenQuery)
|
|
8
|
-
//
|
|
9
|
-
// 这里走 #2 子协议 — Node 22 内置 WebSocket 不支持自定义 header,但支持
|
|
10
|
-
// 第二参数 protocols。`@xyagent/cli` 之前没有任何 npm 依赖,我们保持零依赖,
|
|
11
|
-
// 直接用 globalThis.WebSocket(Node ≥21 内置)。
|
|
12
|
-
//
|
|
13
|
-
// 通讯使用 PicoMessage:
|
|
14
|
-
// { type, id, session_id, timestamp, payload }
|
|
15
|
-
//
|
|
16
|
-
// CLI 端只需:
|
|
17
|
-
// send(msg) —— 发消息(JSON 序列化)
|
|
18
|
-
// onMessage(fn) —— 收消息回调
|
|
19
|
-
// onClose(fn) —— 断开回调(自动重连由调用方决定)
|
|
20
|
-
// close() —— 主动关闭
|
|
21
|
-
|
|
22
|
-
import {
|
|
23
|
-
PICOCLAW_TOKEN,
|
|
24
|
-
PICOCLAW_WS_URL,
|
|
25
|
-
} from "./constants.mjs";
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* 建一个 PicoClaw 连接。
|
|
29
|
-
* @returns {Promise<PicoclawConn>}
|
|
30
|
-
*/
|
|
31
|
-
export function connect({ url, token, log }) {
|
|
32
|
-
const target = url || PICOCLAW_WS_URL;
|
|
33
|
-
const bearer = token || PICOCLAW_TOKEN;
|
|
34
|
-
return new Promise((resolve, reject) => {
|
|
35
|
-
const subprotocol = `token.${bearer}`;
|
|
36
|
-
const WS = globalThis.WebSocket;
|
|
37
|
-
if (!WS) {
|
|
38
|
-
reject(new Error("global WebSocket not available; require Node >= 21"));
|
|
39
|
-
return;
|
|
40
|
-
}
|
|
41
|
-
const ws = new WS(target, [subprotocol]);
|
|
42
|
-
let settled = false;
|
|
43
|
-
ws.addEventListener("open", () => {
|
|
44
|
-
if (settled) return;
|
|
45
|
-
settled = true;
|
|
46
|
-
resolve(makeConn(ws, log, target));
|
|
47
|
-
});
|
|
48
|
-
ws.addEventListener("error", (ev) => {
|
|
49
|
-
if (settled) return;
|
|
50
|
-
settled = true;
|
|
51
|
-
const msg = (ev && ev.message) || "ws error";
|
|
52
|
-
reject(new Error(String(msg)));
|
|
53
|
-
});
|
|
54
|
-
ws.addEventListener("close", (ev) => {
|
|
55
|
-
if (settled) return;
|
|
56
|
-
settled = true;
|
|
57
|
-
reject(new Error(`picoclaw ws closed before open: code=${ev?.code}`));
|
|
58
|
-
});
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
function makeConn(ws, log, target) {
|
|
63
|
-
/** @type {Set<(msg:any)=>void>} */
|
|
64
|
-
const messageHandlers = new Set();
|
|
65
|
-
/** @type {Set<(reason:string)=>void>} */
|
|
66
|
-
const closeHandlers = new Set();
|
|
67
|
-
|
|
68
|
-
ws.addEventListener("message", (ev) => {
|
|
69
|
-
let parsed;
|
|
70
|
-
try {
|
|
71
|
-
const data = typeof ev.data === "string" ? ev.data : Buffer.from(ev.data).toString("utf8");
|
|
72
|
-
parsed = JSON.parse(data);
|
|
73
|
-
} catch (err) {
|
|
74
|
-
if (log) log.warn("picoclaw.ws.parse.err", "bad pico message", { err: String(err?.message || err) });
|
|
75
|
-
return;
|
|
76
|
-
}
|
|
77
|
-
for (const h of messageHandlers) {
|
|
78
|
-
try { h(parsed); } catch (err) {
|
|
79
|
-
if (log) log.warn("picoclaw.ws.handler.err", "handler threw", { err: String(err?.message || err) });
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
});
|
|
83
|
-
ws.addEventListener("close", (ev) => {
|
|
84
|
-
if (log) log.info("picoclaw.ws.closed", "ws closed", { code: ev?.code, reason: String(ev?.reason || "") });
|
|
85
|
-
for (const h of closeHandlers) {
|
|
86
|
-
try { h(`code=${ev?.code}`); } catch {}
|
|
87
|
-
}
|
|
88
|
-
});
|
|
89
|
-
ws.addEventListener("error", (ev) => {
|
|
90
|
-
if (log) log.warn("picoclaw.ws.err", "ws error", { err: String(ev?.message || "ws error") });
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
if (log) log.info("picoclaw.ws.open", "connected", { url: target });
|
|
94
|
-
|
|
95
|
-
return {
|
|
96
|
-
send(picoMessage) {
|
|
97
|
-
if (ws.readyState !== 1 /* OPEN */) {
|
|
98
|
-
throw new Error(`picoclaw ws not open: state=${ws.readyState}`);
|
|
99
|
-
}
|
|
100
|
-
ws.send(JSON.stringify(picoMessage));
|
|
101
|
-
},
|
|
102
|
-
onMessage(fn) { messageHandlers.add(fn); return () => messageHandlers.delete(fn); },
|
|
103
|
-
onClose(fn) { closeHandlers.add(fn); return () => closeHandlers.delete(fn); },
|
|
104
|
-
close(reason) {
|
|
105
|
-
try { ws.close(1000, reason || "client close"); } catch {}
|
|
106
|
-
},
|
|
107
|
-
get readyState() { return ws.readyState; },
|
|
108
|
-
get url() { return target; },
|
|
109
|
-
};
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
/**
|
|
113
|
-
* 构造 message.send 帧(用户消息进入 PicoClaw)。
|
|
114
|
-
*
|
|
115
|
-
* @param {{sessionId:string, content:string, requestId?:string}} arg
|
|
116
|
-
*/
|
|
117
|
-
export function buildMessageSend({ sessionId, content, requestId }) {
|
|
118
|
-
return {
|
|
119
|
-
type: "message.send",
|
|
120
|
-
id: requestId || randomID(),
|
|
121
|
-
session_id: sessionId,
|
|
122
|
-
timestamp: Date.now(),
|
|
123
|
-
payload: { content: String(content || "") },
|
|
124
|
-
};
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
function randomID() {
|
|
128
|
-
return Math.random().toString(36).slice(2, 10) + Date.now().toString(36);
|
|
129
|
-
}
|