@wishee-ai/openclaw-connector 1.0.1 → 1.0.3
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/binding.js +6 -6
- package/dist/binding.js.map +1 -1
- package/dist/connector.js +26 -6
- package/dist/connector.js.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/task-correlation.js +39 -0
- package/dist/task-correlation.js.map +1 -0
- package/openclaw.plugin.json +2 -2
- package/package.json +49 -11
package/dist/binding.js
CHANGED
|
@@ -8,7 +8,7 @@ import path from "node:path";
|
|
|
8
8
|
const BINDING_DIR = path.join(process.env.HOME || "/tmp", ".openclaw", "openclaw-connector");
|
|
9
9
|
const BINDING_FILE = path.join(BINDING_DIR, "binding.json");
|
|
10
10
|
const DEFAULT_BRIDGE_URL = "wss://ai-bridge.wishee.com.cn/ws";
|
|
11
|
-
const
|
|
11
|
+
const BIND_DEEPLINK_BASE = "wishee://openclaw/bind";
|
|
12
12
|
/**
|
|
13
13
|
* Load or create the binding state.
|
|
14
14
|
* Generates a new clawId + secret on first run.
|
|
@@ -53,13 +53,13 @@ export function markBound(state) {
|
|
|
53
53
|
fs.writeFileSync(BINDING_FILE, JSON.stringify(state, null, 2));
|
|
54
54
|
}
|
|
55
55
|
/**
|
|
56
|
-
* Build the binding
|
|
56
|
+
* Build the binding deeplink encoded into the QR code. Scanning it with the
|
|
57
|
+
* WISHEE app opens the app, which reads clawId/secret and registers the
|
|
58
|
+
* binding against the bridge — no intermediate web page involved.
|
|
57
59
|
*/
|
|
58
60
|
export function getBindUrl(state) {
|
|
59
|
-
const
|
|
60
|
-
|
|
61
|
-
url.searchParams.set("secret", state.secret);
|
|
62
|
-
return url.toString();
|
|
61
|
+
const params = new URLSearchParams({ clawId: state.clawId, secret: state.secret });
|
|
62
|
+
return `${BIND_DEEPLINK_BASE}?${params.toString()}`;
|
|
63
63
|
}
|
|
64
64
|
/**
|
|
65
65
|
* Display QR code in terminal for binding.
|
package/dist/binding.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"binding.js","sourceRoot":"","sources":["../src/binding.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAS7B,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAC3B,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,MAAM,EAC1B,WAAW,EACX,oBAAoB,CACrB,CAAC;AACF,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;AAE5D,MAAM,kBAAkB,GAAG,kCAAkC,CAAC;AAC9D,MAAM,
|
|
1
|
+
{"version":3,"file":"binding.js","sourceRoot":"","sources":["../src/binding.ts"],"names":[],"mappings":"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"}
|
package/dist/connector.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Outbound WebSocket client that connects this OpenClaw instance to the
|
|
2
|
+
* Outbound WebSocket client that connects this OpenClaw instance to the WISHEE bridge.
|
|
3
3
|
*
|
|
4
4
|
* Lifecycle:
|
|
5
5
|
* 1. Load/create binding state (clawId + secret)
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
import WebSocket from "ws";
|
|
13
13
|
import { loadOrCreateBinding, markBound, showBindingQR } from "./binding.js";
|
|
14
14
|
import { fetchTaskResult } from "./task-result.js";
|
|
15
|
+
import { RunCorrelator, isCompletionLifecycleEnd } from "./task-correlation.js";
|
|
15
16
|
// ── State ──────────────────────────────────────────────────────
|
|
16
17
|
let ws = null;
|
|
17
18
|
let closed = false;
|
|
@@ -21,6 +22,12 @@ let unsubAgentEvents = null;
|
|
|
21
22
|
let unsubTranscript = null;
|
|
22
23
|
let bindingState = null;
|
|
23
24
|
let pluginApi = null;
|
|
25
|
+
/**
|
|
26
|
+
* Maps a sessionKey to the runId the bridge originally dispatched. A
|
|
27
|
+
* `sessions_yield` ends the dispatched run and the real answer resumes under a
|
|
28
|
+
* new runId on the SAME session, so we report the result under the original.
|
|
29
|
+
*/
|
|
30
|
+
const correlator = new RunCorrelator();
|
|
24
31
|
// ── Public API ─────────────────────────────────────────────────
|
|
25
32
|
export async function startConnector(api, ctx) {
|
|
26
33
|
pluginApi = api;
|
|
@@ -33,11 +40,15 @@ export async function startConnector(api, ctx) {
|
|
|
33
40
|
}
|
|
34
41
|
// Subscribe to agent events
|
|
35
42
|
unsubAgentEvents = api.runtime.events.onAgentEvent((evt) => {
|
|
43
|
+
// A resumed turn (after sessions_yield) runs under a NEW runId on the same
|
|
44
|
+
// session; remap it back to the originally dispatched runId so the bridge
|
|
45
|
+
// can tie the result to the task it started.
|
|
46
|
+
const outboundRunId = correlator.resolve(evt.sessionKey, evt.runId);
|
|
36
47
|
sendEvent({
|
|
37
48
|
type: "event",
|
|
38
49
|
event: "agent",
|
|
39
50
|
payload: {
|
|
40
|
-
runId:
|
|
51
|
+
runId: outboundRunId,
|
|
41
52
|
stream: evt.stream,
|
|
42
53
|
data: evt.data,
|
|
43
54
|
ts: evt.ts,
|
|
@@ -45,12 +56,13 @@ export async function startConnector(api, ctx) {
|
|
|
45
56
|
sessionKey: evt.sessionKey,
|
|
46
57
|
},
|
|
47
58
|
});
|
|
48
|
-
//
|
|
49
|
-
|
|
59
|
+
// Fetch the task result only on a genuine completion. A yielded lifecycle
|
|
60
|
+
// end is a pause while a sub-agent runs — not a result.
|
|
61
|
+
if (isCompletionLifecycleEnd(evt.stream, evt.data)) {
|
|
50
62
|
const sessionKey = evt.sessionKey;
|
|
51
63
|
if (sessionKey) {
|
|
52
64
|
setTimeout(() => {
|
|
53
|
-
void fetchAndSendTaskResult(
|
|
65
|
+
void fetchAndSendTaskResult(outboundRunId, sessionKey, ctx.logger);
|
|
54
66
|
}, 500);
|
|
55
67
|
}
|
|
56
68
|
}
|
|
@@ -172,12 +184,16 @@ async function handleRpcRequest(req, logger) {
|
|
|
172
184
|
switch (method) {
|
|
173
185
|
case "chat.send": {
|
|
174
186
|
const p = params;
|
|
175
|
-
|
|
187
|
+
const runResult = await subagent.run({
|
|
176
188
|
sessionKey: p.sessionKey,
|
|
177
189
|
message: p.message,
|
|
178
190
|
deliver: p.deliver,
|
|
179
191
|
idempotencyKey: p.idempotencyKey,
|
|
180
192
|
});
|
|
193
|
+
// Remember which runId belongs to this session so a later resumed turn
|
|
194
|
+
// (different runId, same session) is reported under this one.
|
|
195
|
+
correlator.remember(p.sessionKey, runResult.runId);
|
|
196
|
+
result = runResult;
|
|
181
197
|
break;
|
|
182
198
|
}
|
|
183
199
|
case "chat.history": {
|
|
@@ -243,10 +259,14 @@ async function fetchAndSendTaskResult(runId, sessionKey, logger) {
|
|
|
243
259
|
const subagent = pluginApi?.runtime.subagent;
|
|
244
260
|
if (!subagent)
|
|
245
261
|
return;
|
|
262
|
+
// `runId` here is already the originally dispatched runId (resolved by the
|
|
263
|
+
// caller), so the task-result frame is reported under the task the bridge started.
|
|
246
264
|
const frame = await fetchTaskResult(subagent, runId, sessionKey, logger);
|
|
247
265
|
if (frame) {
|
|
248
266
|
sendEvent(frame);
|
|
249
267
|
logger.info(`[connector] Sent task-result for runId=${runId}`);
|
|
268
|
+
// The task is delivered; drop the mapping so the next dispatch starts clean.
|
|
269
|
+
correlator.forget(sessionKey);
|
|
250
270
|
}
|
|
251
271
|
}
|
|
252
272
|
//# sourceMappingURL=connector.js.map
|
package/dist/connector.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connector.js","sourceRoot":"","sources":["../src/connector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,SAAS,MAAM,IAAI,CAAC;AAC3B,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAAE,aAAa,EAAqB,MAAM,cAAc,CAAC;AAChG,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"connector.js","sourceRoot":"","sources":["../src/connector.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -2,8 +2,8 @@ import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
|
|
|
2
2
|
import { startConnector, stopConnector } from "./connector.js";
|
|
3
3
|
export default definePluginEntry({
|
|
4
4
|
id: "openclaw-connector",
|
|
5
|
-
name: "
|
|
6
|
-
description: "Connects this OpenClaw instance to
|
|
5
|
+
name: "WISHEE OpenClaw Connector",
|
|
6
|
+
description: "Connects this OpenClaw instance to the WISHEE bridge via reverse WebSocket",
|
|
7
7
|
register(api) {
|
|
8
8
|
api.registerService({
|
|
9
9
|
id: "openclaw-connector",
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/D,eAAe,iBAAiB,CAAC;IAC/B,EAAE,EAAE,oBAAoB;IACxB,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/D,eAAe,iBAAiB,CAAC;IAC/B,EAAE,EAAE,oBAAoB;IACxB,IAAI,EAAE,2BAA2B;IACjC,WAAW,EAAE,4EAA4E;IACzF,QAAQ,CAAC,GAAG;QACV,GAAG,CAAC,eAAe,CAAC;YAClB,EAAE,EAAE,oBAAoB;YACxB,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,cAAc,CAAC,GAAU,EAAE,GAAG,CAAC;YAC/C,IAAI,EAAE,GAAG,EAAE,CAAC,aAAa,EAAE;SAC5B,CAAC,CAAC;IACL,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Correlation helpers for the yield→resume task lifecycle.
|
|
3
|
+
*
|
|
4
|
+
* When the bridge dispatches a task via chat.send, the OpenClaw run adopts the
|
|
5
|
+
* idempotencyKey as its runId. If the orchestrator calls `sessions_yield`, that
|
|
6
|
+
* run ENDS (with `data.yielded === true`) and the real answer arrives later
|
|
7
|
+
* under a brand-new runId generated by the wake path. The only field stable
|
|
8
|
+
* across that boundary is the `sessionKey`, so we map sessionKey → the original
|
|
9
|
+
* dispatched runId and report the eventual result under it.
|
|
10
|
+
*/
|
|
11
|
+
export class RunCorrelator {
|
|
12
|
+
bySession = new Map();
|
|
13
|
+
/** Record the runId the bridge dispatched for a session. */
|
|
14
|
+
remember(sessionKey, runId) {
|
|
15
|
+
this.bySession.set(sessionKey, runId);
|
|
16
|
+
}
|
|
17
|
+
/** Map an event's session back to the original dispatched runId, else fall back. */
|
|
18
|
+
resolve(sessionKey, fallbackRunId) {
|
|
19
|
+
if (sessionKey && this.bySession.has(sessionKey)) {
|
|
20
|
+
return this.bySession.get(sessionKey);
|
|
21
|
+
}
|
|
22
|
+
return fallbackRunId;
|
|
23
|
+
}
|
|
24
|
+
forget(sessionKey) {
|
|
25
|
+
this.bySession.delete(sessionKey);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* A lifecycle "end" only means the task is DONE when it is not a yield.
|
|
30
|
+
* A yielded end is a pause while a spawned sub-agent runs — the real answer
|
|
31
|
+
* comes in a later resumed turn — so it must not trigger result delivery.
|
|
32
|
+
*/
|
|
33
|
+
export function isCompletionLifecycleEnd(stream, data) {
|
|
34
|
+
if (stream !== "lifecycle" || !data) {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
return data.phase === "end" && data.yielded !== true;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=task-correlation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-correlation.js","sourceRoot":"","sources":["../src/task-correlation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,OAAO,aAAa;IAChB,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE9C,4DAA4D;IAC5D,QAAQ,CAAC,UAAkB,EAAE,KAAa;QACxC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IACxC,CAAC;IAED,oFAAoF;IACpF,OAAO,CAAC,UAA8B,EAAE,aAAqB;QAC3D,IAAI,UAAU,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YACjD,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAE,CAAC;QACzC,CAAC;QACD,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,MAAM,CAAC,UAAkB;QACvB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACpC,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CACtC,MAA0B,EAC1B,IAAyC;IAEzC,IAAI,MAAM,KAAK,WAAW,IAAI,CAAC,IAAI,EAAE,CAAC;QACpC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,KAAK,KAAK,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC;AACvD,CAAC"}
|
package/openclaw.plugin.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "openclaw-connector",
|
|
3
|
-
"name": "
|
|
4
|
-
"description": "Connects this OpenClaw instance to
|
|
3
|
+
"name": "WISHEE OpenClaw Connector",
|
|
4
|
+
"description": "Connects this OpenClaw instance to the WISHEE bridge via reverse WebSocket",
|
|
5
5
|
"activation": {
|
|
6
6
|
"onStartup": true
|
|
7
7
|
},
|
package/package.json
CHANGED
|
@@ -1,17 +1,55 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wishee-ai/openclaw-connector",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"type": "module",
|
|
5
|
-
"description": "Connect OpenClaw to
|
|
5
|
+
"description": "Connect OpenClaw to the WISHEE bridge via reverse WebSocket",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
|
-
"exports": {
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"import": "./dist/index.js"
|
|
10
|
+
}
|
|
11
|
+
},
|
|
12
|
+
"files": [
|
|
13
|
+
"dist",
|
|
14
|
+
"openclaw.plugin.json"
|
|
15
|
+
],
|
|
16
|
+
"scripts": {
|
|
17
|
+
"clean": "rm -rf dist",
|
|
18
|
+
"prebuild": "npm run clean",
|
|
19
|
+
"build": "tsc",
|
|
20
|
+
"test": "vitest run",
|
|
21
|
+
"prepublishOnly": "npm run build"
|
|
22
|
+
},
|
|
10
23
|
"license": "MIT",
|
|
11
|
-
"keywords": [
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
24
|
+
"keywords": [
|
|
25
|
+
"openclaw",
|
|
26
|
+
"wishee",
|
|
27
|
+
"connector",
|
|
28
|
+
"bridge"
|
|
29
|
+
],
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"qrcode-terminal": "^0.12.0",
|
|
32
|
+
"ws": "^8.18.0"
|
|
33
|
+
},
|
|
34
|
+
"devDependencies": {
|
|
35
|
+
"@types/node": "^22.0.0",
|
|
36
|
+
"@types/qrcode-terminal": "^0.12.0",
|
|
37
|
+
"@types/ws": "^8.5.0",
|
|
38
|
+
"openclaw": "^2026.6.10",
|
|
39
|
+
"typescript": "^5.7.0",
|
|
40
|
+
"vitest": "^4.1.9"
|
|
41
|
+
},
|
|
42
|
+
"peerDependencies": {
|
|
43
|
+
"openclaw": ">=2026.3.0"
|
|
44
|
+
},
|
|
45
|
+
"peerDependenciesMeta": {
|
|
46
|
+
"openclaw": {
|
|
47
|
+
"optional": true
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
"openclaw": {
|
|
51
|
+
"extensions": [
|
|
52
|
+
"./dist/index.js"
|
|
53
|
+
]
|
|
54
|
+
}
|
|
17
55
|
}
|