@openclaw/lobster 2026.9.7 → 2026.10.1-beta.1
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/README.md +10 -9
- package/dist/index.js +45 -39
- package/node_modules/@clawdbot/lobster/README.md +4 -0
- package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/head.js +4 -2
- package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/head.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/llm_invoke.js +35 -12
- package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/llm_invoke.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/map.js +13 -1
- package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/map.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/pick.js +1 -4
- package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/pick.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/table.js +3 -5
- package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/table.js.map +1 -1
- package/node_modules/@clawdbot/lobster/package.json +7 -7
- package/package.json +5 -5
- package/node_modules/@clawdbot/lobster/dist/test/approval_id.test.js +0 -171
- package/node_modules/@clawdbot/lobster/dist/test/approval_id.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/approve_preview.test.js +0 -38
- package/node_modules/@clawdbot/lobster/dist/test/approve_preview.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/bin_smoke.test.js +0 -25
- package/node_modules/@clawdbot/lobster/dist/test/bin_smoke.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/cancellation.test.js +0 -5171
- package/node_modules/@clawdbot/lobster/dist/test/cancellation.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/clawd_invoke.test.js +0 -146
- package/node_modules/@clawdbot/lobster/dist/test/clawd_invoke.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/clawd_invoke_legacy.test.js +0 -63
- package/node_modules/@clawdbot/lobster/dist/test/clawd_invoke_legacy.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/cli_run_errors.test.js +0 -53
- package/node_modules/@clawdbot/lobster/dist/test/cli_run_errors.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/cli_run_file_args_json.test.js +0 -27
- package/node_modules/@clawdbot/lobster/dist/test/cli_run_file_args_json.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/command_arguments.test.js +0 -82
- package/node_modules/@clawdbot/lobster/dist/test/command_arguments.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/commands_list.test.js +0 -44
- package/node_modules/@clawdbot/lobster/dist/test/commands_list.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/condition_comparison.test.js +0 -127
- package/node_modules/@clawdbot/lobster/dist/test/condition_comparison.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/core_tool_runtime.test.js +0 -160
- package/node_modules/@clawdbot/lobster/dist/test/core_tool_runtime.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/cost_tracker.test.js +0 -1993
- package/node_modules/@clawdbot/lobster/dist/test/cost_tracker.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/dedupe.test.js +0 -48
- package/node_modules/@clawdbot/lobster/dist/test/dedupe.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/diff_last.test.js +0 -70
- package/node_modules/@clawdbot/lobster/dist/test/diff_last.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/doctor.test.js +0 -19
- package/node_modules/@clawdbot/lobster/dist/test/doctor.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/dry_run.test.js +0 -502
- package/node_modules/@clawdbot/lobster/dist/test/dry_run.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/email_triage.test.js +0 -296
- package/node_modules/@clawdbot/lobster/dist/test/email_triage.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/exec_stdin.test.js +0 -43
- package/node_modules/@clawdbot/lobster/dist/test/exec_stdin.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/for_each.test.js +0 -482
- package/node_modules/@clawdbot/lobster/dist/test/for_each.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/github_pr_notify_format.test.js +0 -19
- package/node_modules/@clawdbot/lobster/dist/test/github_pr_notify_format.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/github_pr_summary.test.js +0 -41
- package/node_modules/@clawdbot/lobster/dist/test/github_pr_summary.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/github_pr_view.test.js +0 -176
- package/node_modules/@clawdbot/lobster/dist/test/github_pr_view.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/gog_gmail_send.test.js +0 -100
- package/node_modules/@clawdbot/lobster/dist/test/gog_gmail_send.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/group_by.test.js +0 -43
- package/node_modules/@clawdbot/lobster/dist/test/group_by.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/helpers/node_shell_fixture.js +0 -17
- package/node_modules/@clawdbot/lobster/dist/test/helpers/node_shell_fixture.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/helpers/wait_for_pid.js +0 -19
- package/node_modules/@clawdbot/lobster/dist/test/helpers/wait_for_pid.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/http_response_body_cap.test.js +0 -318
- package/node_modules/@clawdbot/lobster/dist/test/http_response_body_cap.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/llm_invoke.test.js +0 -1113
- package/node_modules/@clawdbot/lobster/dist/test/llm_invoke.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/llm_task_invoke.test.js +0 -519
- package/node_modules/@clawdbot/lobster/dist/test/llm_task_invoke.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/map.test.js +0 -41
- package/node_modules/@clawdbot/lobster/dist/test/map.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/multi_approval_resume.test.js +0 -48
- package/node_modules/@clawdbot/lobster/dist/test/multi_approval_resume.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/on_error.test.js +0 -151
- package/node_modules/@clawdbot/lobster/dist/test/on_error.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/openclaw_agent.test.js +0 -169
- package/node_modules/@clawdbot/lobster/dist/test/openclaw_agent.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/openclaw_dispatch_retry.test.js +0 -96
- package/node_modules/@clawdbot/lobster/dist/test/openclaw_dispatch_retry.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/openclaw_invoke_alias.test.js +0 -13
- package/node_modules/@clawdbot/lobster/dist/test/openclaw_invoke_alias.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/parallel.test.js +0 -184
- package/node_modules/@clawdbot/lobster/dist/test/parallel.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/parser.test.js +0 -96
- package/node_modules/@clawdbot/lobster/dist/test/parser.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/pipeline_resume_state.test.js +0 -65
- package/node_modules/@clawdbot/lobster/dist/test/pipeline_resume_state.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/process_output_limit.test.js +0 -175
- package/node_modules/@clawdbot/lobster/dist/test/process_output_limit.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/read_line.test.js +0 -79
- package/node_modules/@clawdbot/lobster/dist/test/read_line.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/release_changelog.test.js +0 -39
- package/node_modules/@clawdbot/lobster/dist/test/release_changelog.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/request_input.test.js +0 -946
- package/node_modules/@clawdbot/lobster/dist/test/request_input.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/resume.test.js +0 -82
- package/node_modules/@clawdbot/lobster/dist/test/resume.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/sdk_exec.test.js +0 -248
- package/node_modules/@clawdbot/lobster/dist/test/sdk_exec.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/sdk_lobster.test.js +0 -177
- package/node_modules/@clawdbot/lobster/dist/test/sdk_lobster.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/shell.test.js +0 -31
- package/node_modules/@clawdbot/lobster/dist/test/shell.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/sort.test.js +0 -51
- package/node_modules/@clawdbot/lobster/dist/test/sort.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/state.test.js +0 -919
- package/node_modules/@clawdbot/lobster/dist/test/state.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/step_retry.test.js +0 -254
- package/node_modules/@clawdbot/lobster/dist/test/step_retry.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/step_stdin_epipe.test.js +0 -44
- package/node_modules/@clawdbot/lobster/dist/test/step_stdin_epipe.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/step_timeout.test.js +0 -220
- package/node_modules/@clawdbot/lobster/dist/test/step_timeout.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/template.test.js +0 -46
- package/node_modules/@clawdbot/lobster/dist/test/template.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/template_filters.test.js +0 -144
- package/node_modules/@clawdbot/lobster/dist/test/template_filters.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/tool_envelope_version.test.js +0 -15
- package/node_modules/@clawdbot/lobster/dist/test/tool_envelope_version.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/tool_mode.test.js +0 -83
- package/node_modules/@clawdbot/lobster/dist/test/tool_mode.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/validation.test.js +0 -28
- package/node_modules/@clawdbot/lobster/dist/test/validation.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/where.test.js +0 -94
- package/node_modules/@clawdbot/lobster/dist/test/where.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/workflow_args_env.test.js +0 -43
- package/node_modules/@clawdbot/lobster/dist/test/workflow_args_env.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/workflow_composition.test.js +0 -238
- package/node_modules/@clawdbot/lobster/dist/test/workflow_composition.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/workflow_file.test.js +0 -2045
- package/node_modules/@clawdbot/lobster/dist/test/workflow_file.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/workflow_graph.test.js +0 -107
- package/node_modules/@clawdbot/lobster/dist/test/workflow_graph.test.js.map +0 -1
- package/node_modules/@clawdbot/lobster/dist/test/workflows.test.js +0 -32
- package/node_modules/@clawdbot/lobster/dist/test/workflows.test.js.map +0 -1
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
import test from "node:test";
|
|
2
|
-
import assert from "node:assert/strict";
|
|
3
|
-
import http from "node:http";
|
|
4
|
-
import { createDefaultRegistry } from "../src/commands/registry.js";
|
|
5
|
-
function streamOf(items) {
|
|
6
|
-
return (async function* () {
|
|
7
|
-
for (const item of items)
|
|
8
|
-
yield item;
|
|
9
|
-
})();
|
|
10
|
-
}
|
|
11
|
-
test("openclaw.invoke posts to /tools/invoke and returns JSON", async () => {
|
|
12
|
-
const server = http.createServer((req, res) => {
|
|
13
|
-
if (req.method !== "POST" || req.url !== "/tools/invoke") {
|
|
14
|
-
res.writeHead(404);
|
|
15
|
-
res.end("not found");
|
|
16
|
-
return;
|
|
17
|
-
}
|
|
18
|
-
let body = "";
|
|
19
|
-
req.setEncoding("utf8");
|
|
20
|
-
req.on("data", (d) => (body += d));
|
|
21
|
-
req.on("end", () => {
|
|
22
|
-
const parsed = JSON.parse(body);
|
|
23
|
-
assert.equal(parsed.tool, "demo");
|
|
24
|
-
assert.equal(parsed.action, "ping");
|
|
25
|
-
res.writeHead(200, { "content-type": "application/json" });
|
|
26
|
-
res.end(JSON.stringify({ ok: true, result: [{ ok: true, echo: parsed.args }] }));
|
|
27
|
-
});
|
|
28
|
-
});
|
|
29
|
-
await new Promise((resolve) => server.listen(0, () => resolve()));
|
|
30
|
-
const addr = server.address();
|
|
31
|
-
const port = typeof addr === "string" || addr == null ? 0 : addr.port;
|
|
32
|
-
try {
|
|
33
|
-
const registry = createDefaultRegistry();
|
|
34
|
-
const cmd = registry.get("openclaw.invoke");
|
|
35
|
-
const result = await cmd.run({
|
|
36
|
-
input: streamOf([]),
|
|
37
|
-
args: {
|
|
38
|
-
_: [],
|
|
39
|
-
url: `http://127.0.0.1:${port}`,
|
|
40
|
-
tool: "demo",
|
|
41
|
-
action: "ping",
|
|
42
|
-
"args-json": '{"hello":"world"}',
|
|
43
|
-
},
|
|
44
|
-
ctx: {
|
|
45
|
-
stdin: process.stdin,
|
|
46
|
-
stdout: process.stdout,
|
|
47
|
-
stderr: process.stderr,
|
|
48
|
-
env: process.env,
|
|
49
|
-
registry,
|
|
50
|
-
mode: "tool",
|
|
51
|
-
render: { json() { }, lines() { } },
|
|
52
|
-
},
|
|
53
|
-
});
|
|
54
|
-
const items = [];
|
|
55
|
-
for await (const it of result.output)
|
|
56
|
-
items.push(it);
|
|
57
|
-
assert.deepEqual(items, [{ ok: true, echo: { hello: "world" } }]);
|
|
58
|
-
}
|
|
59
|
-
finally {
|
|
60
|
-
server.close();
|
|
61
|
-
}
|
|
62
|
-
});
|
|
63
|
-
test("openclaw.invoke --each maps input items into tool args", async () => {
|
|
64
|
-
const seen = [];
|
|
65
|
-
const server = http.createServer((req, res) => {
|
|
66
|
-
if (req.method !== "POST" || req.url !== "/tools/invoke") {
|
|
67
|
-
res.writeHead(404);
|
|
68
|
-
res.end("not found");
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
let body = "";
|
|
72
|
-
req.setEncoding("utf8");
|
|
73
|
-
req.on("data", (d) => (body += d));
|
|
74
|
-
req.on("end", () => {
|
|
75
|
-
const parsed = JSON.parse(body);
|
|
76
|
-
seen.push({ call: seen.length + 1, args: parsed.args });
|
|
77
|
-
res.writeHead(200, { "content-type": "application/json" });
|
|
78
|
-
res.end(JSON.stringify({ ok: true, result: [{ ok: true, call: seen.length }] }));
|
|
79
|
-
});
|
|
80
|
-
});
|
|
81
|
-
await new Promise((resolve) => server.listen(0, () => resolve()));
|
|
82
|
-
const addr = server.address();
|
|
83
|
-
const port = typeof addr === "string" || addr == null ? 0 : addr.port;
|
|
84
|
-
try {
|
|
85
|
-
const registry = createDefaultRegistry();
|
|
86
|
-
const cmd = registry.get("openclaw.invoke");
|
|
87
|
-
const result = await cmd.run({
|
|
88
|
-
input: streamOf(["a", "b"]),
|
|
89
|
-
args: {
|
|
90
|
-
_: [],
|
|
91
|
-
url: `http://127.0.0.1:${port}`,
|
|
92
|
-
tool: "demo",
|
|
93
|
-
action: "ping",
|
|
94
|
-
each: true,
|
|
95
|
-
"item-key": "message",
|
|
96
|
-
"args-json": '{"channel":"test"}',
|
|
97
|
-
},
|
|
98
|
-
ctx: {
|
|
99
|
-
stdin: process.stdin,
|
|
100
|
-
stdout: process.stdout,
|
|
101
|
-
stderr: process.stderr,
|
|
102
|
-
env: process.env,
|
|
103
|
-
registry,
|
|
104
|
-
mode: "tool",
|
|
105
|
-
render: { json() { }, lines() { } },
|
|
106
|
-
},
|
|
107
|
-
});
|
|
108
|
-
const items = [];
|
|
109
|
-
for await (const it of result.output)
|
|
110
|
-
items.push(it);
|
|
111
|
-
assert.deepEqual(items, [
|
|
112
|
-
{ ok: true, call: 1 },
|
|
113
|
-
{ ok: true, call: 2 },
|
|
114
|
-
]);
|
|
115
|
-
assert.deepEqual(seen, [
|
|
116
|
-
{ call: 1, args: { channel: "test", message: "a" } },
|
|
117
|
-
{ call: 2, args: { channel: "test", message: "b" } },
|
|
118
|
-
]);
|
|
119
|
-
}
|
|
120
|
-
finally {
|
|
121
|
-
server.close();
|
|
122
|
-
}
|
|
123
|
-
});
|
|
124
|
-
test("openclaw.invoke refuses env tokens for non-local URLs", async () => {
|
|
125
|
-
const registry = createDefaultRegistry();
|
|
126
|
-
const cmd = registry.get("openclaw.invoke");
|
|
127
|
-
await assert.rejects(cmd.run({
|
|
128
|
-
input: streamOf([]),
|
|
129
|
-
args: {
|
|
130
|
-
_: [],
|
|
131
|
-
url: "https://example.com",
|
|
132
|
-
tool: "demo",
|
|
133
|
-
action: "ping",
|
|
134
|
-
},
|
|
135
|
-
ctx: {
|
|
136
|
-
stdin: process.stdin,
|
|
137
|
-
stdout: process.stdout,
|
|
138
|
-
stderr: process.stderr,
|
|
139
|
-
env: { ...process.env, OPENCLAW_TOKEN: "secret" },
|
|
140
|
-
registry,
|
|
141
|
-
mode: "tool",
|
|
142
|
-
render: { json() { }, lines() { } },
|
|
143
|
-
},
|
|
144
|
-
}), /refuses to send OPENCLAW_TOKEN\/CLAWD_TOKEN to non-local --url/);
|
|
145
|
-
});
|
|
146
|
-
//# sourceMappingURL=clawd_invoke.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"clawd_invoke.test.js","sourceRoot":"","sources":["../../test/clawd_invoke.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAEpE,SAAS,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,KAAK,SAAS,CAAC;QACtB,KAAK,MAAM,IAAI,IAAI,KAAK;YAAE,MAAM,IAAI,CAAC;IACtC,CAAC,CAAC,EAAE,CAAC;AACN,CAAC;AAED,IAAI,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;IAC1E,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QAC7C,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,GAAG,CAAC,GAAG,KAAK,eAAe,EAAE,CAAC;YAC1D,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACnB,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACrB,OAAO;QACR,CAAC;QAED,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACxB,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;QACnC,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;YAClB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAChC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAClC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACpC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAClF,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACxE,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;IAC9B,MAAM,IAAI,GAAG,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IAEtE,IAAI,CAAC;QACJ,MAAM,QAAQ,GAAG,qBAAqB,EAAE,CAAC;QACzC,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAE5C,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC;YAC5B,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;YACnB,IAAI,EAAE;gBACL,CAAC,EAAE,EAAE;gBACL,GAAG,EAAE,oBAAoB,IAAI,EAAE;gBAC/B,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,MAAM;gBACd,WAAW,EAAE,mBAAmB;aAChC;YACD,GAAG,EAAE;gBACJ,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,QAAQ;gBACR,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,EAAE,IAAI,KAAI,CAAC,EAAE,KAAK,KAAI,CAAC,EAAE;aACjC;SACD,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,EAAE,CAAC;QACjB,IAAI,KAAK,EAAE,MAAM,EAAE,IAAI,MAAM,CAAC,MAAM;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrD,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IACnE,CAAC;YAAS,CAAC;QACV,MAAM,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC;AACF,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;IACzE,MAAM,IAAI,GAA2C,EAAE,CAAC;IACxD,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QAC7C,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,GAAG,CAAC,GAAG,KAAK,eAAe,EAAE,CAAC;YAC1D,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACnB,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACrB,OAAO;QACR,CAAC;QAED,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACxB,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;QACnC,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;YAClB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAChC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YACxD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAClF,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACxE,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;IAC9B,MAAM,IAAI,GAAG,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IAEtE,IAAI,CAAC;QACJ,MAAM,QAAQ,GAAG,qBAAqB,EAAE,CAAC;QACzC,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAE5C,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC;YAC5B,KAAK,EAAE,QAAQ,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAC3B,IAAI,EAAE;gBACL,CAAC,EAAE,EAAE;gBACL,GAAG,EAAE,oBAAoB,IAAI,EAAE;gBAC/B,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,IAAI;gBACV,UAAU,EAAE,SAAS;gBACrB,WAAW,EAAE,oBAAoB;aACjC;YACD,GAAG,EAAE;gBACJ,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,QAAQ;gBACR,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,EAAE,IAAI,KAAI,CAAC,EAAE,KAAK,KAAI,CAAC,EAAE;aACjC;SACD,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,EAAE,CAAC;QACjB,IAAI,KAAK,EAAE,MAAM,EAAE,IAAI,MAAM,CAAC,MAAM;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrD,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE;YACvB,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE;YACrB,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE;SACrB,CAAC,CAAC;QACH,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE;YACtB,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE;YACpD,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE;SACpD,CAAC,CAAC;IACJ,CAAC;YAAS,CAAC;QACV,MAAM,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC;AACF,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;IACxE,MAAM,QAAQ,GAAG,qBAAqB,EAAE,CAAC;IACzC,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAE5C,MAAM,MAAM,CAAC,OAAO,CACnB,GAAG,CAAC,GAAG,CAAC;QACP,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;QACnB,IAAI,EAAE;YACL,CAAC,EAAE,EAAE;YACL,GAAG,EAAE,qBAAqB;YAC1B,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,MAAM;SACd;QACD,GAAG,EAAE;YACJ,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,cAAc,EAAE,QAAQ,EAAE;YACjD,QAAQ;YACR,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,EAAE,IAAI,KAAI,CAAC,EAAE,KAAK,KAAI,CAAC,EAAE;SACjC;KACD,CAAC,EACF,gEAAgE,CAChE,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import test from "node:test";
|
|
2
|
-
import assert from "node:assert/strict";
|
|
3
|
-
import http from "node:http";
|
|
4
|
-
import { createDefaultRegistry } from "../src/commands/registry.js";
|
|
5
|
-
function streamOf(items) {
|
|
6
|
-
return (async function* () {
|
|
7
|
-
for (const item of items)
|
|
8
|
-
yield item;
|
|
9
|
-
})();
|
|
10
|
-
}
|
|
11
|
-
test("openclaw.invoke accepts legacy raw JSON response", async () => {
|
|
12
|
-
const server = http.createServer((req, res) => {
|
|
13
|
-
if (req.method !== "POST" || req.url !== "/tools/invoke") {
|
|
14
|
-
res.writeHead(404);
|
|
15
|
-
res.end("not found");
|
|
16
|
-
return;
|
|
17
|
-
}
|
|
18
|
-
let body = "";
|
|
19
|
-
req.setEncoding("utf8");
|
|
20
|
-
req.on("data", (d) => (body += d));
|
|
21
|
-
req.on("end", () => {
|
|
22
|
-
const parsed = JSON.parse(body);
|
|
23
|
-
assert.equal(parsed.tool, "demo");
|
|
24
|
-
assert.equal(parsed.action, "ping");
|
|
25
|
-
res.writeHead(200, { "content-type": "application/json" });
|
|
26
|
-
res.end(JSON.stringify([{ ok: true, legacy: true, echo: parsed.args }]));
|
|
27
|
-
});
|
|
28
|
-
});
|
|
29
|
-
await new Promise((resolve) => server.listen(0, () => resolve()));
|
|
30
|
-
const addr = server.address();
|
|
31
|
-
const port = typeof addr === "string" || addr == null ? 0 : addr.port;
|
|
32
|
-
try {
|
|
33
|
-
const registry = createDefaultRegistry();
|
|
34
|
-
const cmd = registry.get("openclaw.invoke");
|
|
35
|
-
const result = await cmd.run({
|
|
36
|
-
input: streamOf([]),
|
|
37
|
-
args: {
|
|
38
|
-
_: [],
|
|
39
|
-
url: `http://127.0.0.1:${port}`,
|
|
40
|
-
tool: "demo",
|
|
41
|
-
action: "ping",
|
|
42
|
-
"args-json": '{"hello":"world"}',
|
|
43
|
-
},
|
|
44
|
-
ctx: {
|
|
45
|
-
stdin: process.stdin,
|
|
46
|
-
stdout: process.stdout,
|
|
47
|
-
stderr: process.stderr,
|
|
48
|
-
env: process.env,
|
|
49
|
-
registry,
|
|
50
|
-
mode: "tool",
|
|
51
|
-
render: { json() { }, lines() { } },
|
|
52
|
-
},
|
|
53
|
-
});
|
|
54
|
-
const items = [];
|
|
55
|
-
for await (const it of result.output)
|
|
56
|
-
items.push(it);
|
|
57
|
-
assert.deepEqual(items, [{ ok: true, legacy: true, echo: { hello: "world" } }]);
|
|
58
|
-
}
|
|
59
|
-
finally {
|
|
60
|
-
server.close();
|
|
61
|
-
}
|
|
62
|
-
});
|
|
63
|
-
//# sourceMappingURL=clawd_invoke_legacy.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"clawd_invoke_legacy.test.js","sourceRoot":"","sources":["../../test/clawd_invoke_legacy.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
import test from "node:test";
|
|
2
|
-
import assert from "node:assert/strict";
|
|
3
|
-
import { spawnSync } from "node:child_process";
|
|
4
|
-
import { mkdtemp, rm, writeFile } from "node:fs/promises";
|
|
5
|
-
import { join } from "node:path";
|
|
6
|
-
import { tmpdir } from "node:os";
|
|
7
|
-
for (const kind of ["missing", "directory", "extension"]) {
|
|
8
|
-
test(`tool run reports ${kind} workflow target errors as JSON`, async () => {
|
|
9
|
-
const dir = await mkdtemp(join(tmpdir(), "lobster-target-error-"));
|
|
10
|
-
try {
|
|
11
|
-
const target = kind === "directory"
|
|
12
|
-
? dir
|
|
13
|
-
: join(dir, kind === "extension" ? "workflow.txt" : "missing.lobster");
|
|
14
|
-
if (kind === "extension")
|
|
15
|
-
await writeFile(target, JSON.stringify({ steps: [{ id: "ok", run: "echo ok" }] }));
|
|
16
|
-
const result = spawnSync(process.execPath, ["bin/lobster.js", "run", "--mode", "tool", "--file", target], { encoding: "utf8" });
|
|
17
|
-
assert.equal(result.status, 2);
|
|
18
|
-
const envelope = JSON.parse(result.stdout);
|
|
19
|
-
assert.equal(envelope.protocolVersion, 1);
|
|
20
|
-
assert.equal(envelope.ok, false);
|
|
21
|
-
assert.equal(envelope.error.type, "parse_error");
|
|
22
|
-
assert.match(envelope.error.message, kind === "missing" ? /ENOENT/ : kind === "directory" ? /not a file/ : /must end in/);
|
|
23
|
-
assert.equal(result.stderr, "");
|
|
24
|
-
}
|
|
25
|
-
finally {
|
|
26
|
-
await rm(dir, { recursive: true, force: true });
|
|
27
|
-
}
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
test("human run reports missing workflow without an uncaught stack", async () => {
|
|
31
|
-
const dir = await mkdtemp(join(tmpdir(), "lobster-human-error-"));
|
|
32
|
-
try {
|
|
33
|
-
const result = spawnSync(process.execPath, ["bin/lobster.js", "run", "--file", join(dir, "missing.json")], { encoding: "utf8" });
|
|
34
|
-
assert.equal(result.status, 2);
|
|
35
|
-
assert.equal(result.stdout, "");
|
|
36
|
-
assert.match(result.stderr, /^Parse error: .*ENOENT/);
|
|
37
|
-
assert.doesNotMatch(result.stderr, /at async|node:internal/);
|
|
38
|
-
}
|
|
39
|
-
finally {
|
|
40
|
-
await rm(dir, { recursive: true, force: true });
|
|
41
|
-
}
|
|
42
|
-
});
|
|
43
|
-
for (const flag of ["--help", "-h"]) {
|
|
44
|
-
test(`graph ${flag} shows graph-specific options`, () => {
|
|
45
|
-
const result = spawnSync(process.execPath, ["bin/lobster.js", "graph", flag], {
|
|
46
|
-
encoding: "utf8",
|
|
47
|
-
});
|
|
48
|
-
assert.equal(result.status, 0);
|
|
49
|
-
assert.match(result.stdout, /--format\s+Output format: mermaid \(default\), dot, ascii/);
|
|
50
|
-
assert.equal(result.stderr, "");
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
//# sourceMappingURL=cli_run_errors.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli_run_errors.test.js","sourceRoot":"","sources":["../../test/cli_run_errors.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import test from "node:test";
|
|
2
|
-
import assert from "node:assert/strict";
|
|
3
|
-
import { promises as fsp } from "node:fs";
|
|
4
|
-
import path from "node:path";
|
|
5
|
-
import os from "node:os";
|
|
6
|
-
import { spawnSync } from "node:child_process";
|
|
7
|
-
function runLobster(args, opts) {
|
|
8
|
-
const res = spawnSync(process.execPath, [path.join("bin", "lobster.js"), ...args], {
|
|
9
|
-
cwd: path.resolve("."),
|
|
10
|
-
env: { ...process.env, ...(opts?.env ?? undefined) },
|
|
11
|
-
encoding: "utf8",
|
|
12
|
-
});
|
|
13
|
-
return res;
|
|
14
|
-
}
|
|
15
|
-
test("cli: run --file passes --args-json into workflow args", async () => {
|
|
16
|
-
const tmpDir = await fsp.mkdtemp(path.join(os.tmpdir(), "lobster-cli-"));
|
|
17
|
-
const filePath = path.join(tmpDir, "workflow.lobster");
|
|
18
|
-
// Print both template-substituted arg and env-injected arg (LOBSTER_ARG_TASK)
|
|
19
|
-
// so we catch regressions in either path.
|
|
20
|
-
const workflow = `name: test\nargs:\n task:\n default: ""\nsteps:\n - id: s\n command: >\n node -e "process.stdout.write(JSON.stringify({task: '\${task}', env: process.env.LOBSTER_ARG_TASK}))"\n`;
|
|
21
|
-
await fsp.writeFile(filePath, workflow, "utf8");
|
|
22
|
-
const res = runLobster(["run", "--file", filePath, "--args-json", '{"task":"test"}']);
|
|
23
|
-
assert.equal(res.status, 0, `expected exit 0, got ${res.status}\nstdout=${res.stdout}\nstderr=${res.stderr}`);
|
|
24
|
-
const parsed = JSON.parse(String(res.stdout).trim());
|
|
25
|
-
assert.deepEqual(parsed, [{ task: "test", env: "test" }]);
|
|
26
|
-
});
|
|
27
|
-
//# sourceMappingURL=cli_run_file_args_json.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli_run_file_args_json.test.js","sourceRoot":"","sources":["../../test/cli_run_file_args_json.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,QAAQ,IAAI,GAAG,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,SAAS,UAAU,CAAC,IAAc,EAAE,IAAmD;IACtF,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,YAAY,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE;QAClF,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;QACtB,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,IAAI,SAAS,CAAC,EAAE;QACpD,QAAQ,EAAE,MAAM;KAChB,CAAC,CAAC;IACH,OAAO,GAAG,CAAC;AACZ,CAAC;AAED,IAAI,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;IACxE,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC;IACzE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAEvD,8EAA8E;IAC9E,0CAA0C;IAC1C,MAAM,QAAQ,GAAG,+LAA+L,CAAC;IAEjN,MAAM,GAAG,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAEhD,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAEtF,MAAM,CAAC,KAAK,CACX,GAAG,CAAC,MAAM,EACV,CAAC,EACD,wBAAwB,GAAG,CAAC,MAAM,YAAY,GAAG,CAAC,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,CAChF,CAAC;IAEF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACrD,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC,CAAC,CAAC"}
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import test from "node:test";
|
|
2
|
-
import assert from "node:assert/strict";
|
|
3
|
-
import { execFile } from "node:child_process";
|
|
4
|
-
import { createServer } from "node:http";
|
|
5
|
-
import { promisify } from "node:util";
|
|
6
|
-
import { parsePipeline } from "../src/parser.js";
|
|
7
|
-
import { Lobster, exec } from "../src/sdk/index.js";
|
|
8
|
-
const runFile = promisify(execFile);
|
|
9
|
-
const argvScript = "console.log(JSON.stringify(process.argv.slice(1)))";
|
|
10
|
-
const argvCommand = `${JSON.stringify(process.execPath)} -e '${argvScript}' "" tail`;
|
|
11
|
-
test("pipeline parsing preserves empty positional arguments", () => {
|
|
12
|
-
assert.deepEqual(parsePipeline(`exec node "" ' ' '' tail`)[0].args._, [
|
|
13
|
-
"node",
|
|
14
|
-
"",
|
|
15
|
-
" ",
|
|
16
|
-
"",
|
|
17
|
-
"tail",
|
|
18
|
-
]);
|
|
19
|
-
});
|
|
20
|
-
test("pipeline parsing preserves an empty quoted option value", () => {
|
|
21
|
-
const args = parsePipeline(`custom --value "" tail`)[0].args;
|
|
22
|
-
assert.equal(args["value"], "");
|
|
23
|
-
assert.deepEqual(args._, ["tail"]);
|
|
24
|
-
});
|
|
25
|
-
test("built CLI passes explicit empty arguments to a child process", async () => {
|
|
26
|
-
const { stdout } = await runFile(process.execPath, [
|
|
27
|
-
"bin/lobster.js",
|
|
28
|
-
"run",
|
|
29
|
-
"--mode",
|
|
30
|
-
"tool",
|
|
31
|
-
`exec --json ${argvCommand}`,
|
|
32
|
-
]);
|
|
33
|
-
assert.deepEqual(JSON.parse(stdout).output, ["", "tail"]);
|
|
34
|
-
});
|
|
35
|
-
test("SDK exec passes explicit empty arguments to a child process", async () => {
|
|
36
|
-
const result = await new Lobster().pipe(exec(argvCommand)).run();
|
|
37
|
-
assert.equal(result.ok, true, JSON.stringify(result));
|
|
38
|
-
assert.deepEqual(result.output, ["", "tail"]);
|
|
39
|
-
});
|
|
40
|
-
for (const alias of ["openclaw.invoke", "clawd.invoke"]) {
|
|
41
|
-
test(`${alias} shim preserves punctuation and literal pipeline characters`, async () => {
|
|
42
|
-
const expected = {
|
|
43
|
-
text: 'O\'Malley says "hello"\nnext line',
|
|
44
|
-
path: "C:\\folder\\",
|
|
45
|
-
literal: "$HOME `id` | head",
|
|
46
|
-
empty: "",
|
|
47
|
-
};
|
|
48
|
-
const requests = [];
|
|
49
|
-
const server = createServer(async (req, res) => {
|
|
50
|
-
let body = "";
|
|
51
|
-
for await (const chunk of req)
|
|
52
|
-
body += chunk;
|
|
53
|
-
const payload = JSON.parse(body);
|
|
54
|
-
requests.push(payload.args);
|
|
55
|
-
res.setHeader("content-type", "application/json");
|
|
56
|
-
res.end(JSON.stringify({ ok: true, result: [payload.args] }));
|
|
57
|
-
});
|
|
58
|
-
await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve));
|
|
59
|
-
try {
|
|
60
|
-
const address = server.address();
|
|
61
|
-
assert.ok(address && typeof address === "object");
|
|
62
|
-
const { stdout } = await runFile(process.execPath, [
|
|
63
|
-
`bin/${alias}.js`,
|
|
64
|
-
"--url",
|
|
65
|
-
`http://127.0.0.1:${address.port}`,
|
|
66
|
-
"--tool",
|
|
67
|
-
"proof",
|
|
68
|
-
"--action",
|
|
69
|
-
"read",
|
|
70
|
-
"--args-json",
|
|
71
|
-
JSON.stringify(expected),
|
|
72
|
-
], { env: { ...process.env, OPENCLAW_TOKEN: "", CLAWD_TOKEN: "" } });
|
|
73
|
-
assert.deepEqual(JSON.parse(stdout), [expected]);
|
|
74
|
-
assert.deepEqual(requests, [expected]);
|
|
75
|
-
}
|
|
76
|
-
finally {
|
|
77
|
-
server.closeAllConnections();
|
|
78
|
-
await new Promise((resolve) => server.close(() => resolve()));
|
|
79
|
-
}
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
//# sourceMappingURL=command_arguments.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"command_arguments.test.js","sourceRoot":"","sources":["../../test/command_arguments.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import test from "node:test";
|
|
2
|
-
import assert from "node:assert/strict";
|
|
3
|
-
import { createDefaultRegistry } from "../src/commands/registry.js";
|
|
4
|
-
function streamOf(items) {
|
|
5
|
-
return (async function* () {
|
|
6
|
-
for (const item of items)
|
|
7
|
-
yield item;
|
|
8
|
-
})();
|
|
9
|
-
}
|
|
10
|
-
test("commands.list returns command inventory including stdlib + workflows", async () => {
|
|
11
|
-
const registry = createDefaultRegistry();
|
|
12
|
-
const cmd = registry.get("commands.list");
|
|
13
|
-
assert.ok(cmd, "commands.list should be registered");
|
|
14
|
-
const res = await cmd.run({
|
|
15
|
-
input: streamOf([]),
|
|
16
|
-
args: { _: [] },
|
|
17
|
-
ctx: {
|
|
18
|
-
stdin: process.stdin,
|
|
19
|
-
stdout: process.stdout,
|
|
20
|
-
stderr: process.stderr,
|
|
21
|
-
env: process.env,
|
|
22
|
-
registry,
|
|
23
|
-
mode: "tool",
|
|
24
|
-
render: { json() { }, lines() { } },
|
|
25
|
-
},
|
|
26
|
-
});
|
|
27
|
-
const items = [];
|
|
28
|
-
for await (const it of res.output)
|
|
29
|
-
items.push(it);
|
|
30
|
-
const names = items.map((x) => x.name).sort();
|
|
31
|
-
// A couple representative commands we always expect.
|
|
32
|
-
assert.ok(names.includes("exec"));
|
|
33
|
-
assert.ok(names.includes("json"));
|
|
34
|
-
assert.ok(names.includes("llm.invoke"));
|
|
35
|
-
assert.ok(names.includes("workflows.list"));
|
|
36
|
-
assert.ok(names.includes("commands.list"));
|
|
37
|
-
const self = items.find((x) => x.name === "commands.list");
|
|
38
|
-
assert.ok(self);
|
|
39
|
-
assert.equal(typeof self.description, "string");
|
|
40
|
-
assert.ok(self.description.length > 0);
|
|
41
|
-
// Schema should be present for commands that declare it.
|
|
42
|
-
assert.ok(self.argsSchema);
|
|
43
|
-
});
|
|
44
|
-
//# sourceMappingURL=commands_list.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"commands_list.test.js","sourceRoot":"","sources":["../../test/commands_list.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAEpE,SAAS,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,KAAK,SAAS,CAAC;QACtB,KAAK,MAAM,IAAI,IAAI,KAAK;YAAE,MAAM,IAAI,CAAC;IACtC,CAAC,CAAC,EAAE,CAAC;AACN,CAAC;AAED,IAAI,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;IACvF,MAAM,QAAQ,GAAG,qBAAqB,EAAE,CAAC;IACzC,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC1C,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,oCAAoC,CAAC,CAAC;IAErD,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC;QACzB,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;QACnB,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE;QACf,GAAG,EAAE;YACJ,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,QAAQ;YACR,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,EAAE,IAAI,KAAI,CAAC,EAAE,KAAK,KAAI,CAAC,EAAE;SACjC;KACD,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,EAAE,CAAC;IACjB,IAAI,KAAK,EAAE,MAAM,EAAE,IAAI,GAAG,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAElD,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IAE9C,qDAAqD;IACrD,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAClC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAClC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;IACxC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC5C,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC;IAE3C,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,eAAe,CAAC,CAAC;IAC3D,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;IAChB,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAChD,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACvC,yDAAyD;IACzD,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AAC5B,CAAC,CAAC,CAAC"}
|
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
import test from "node:test";
|
|
2
|
-
import assert from "node:assert/strict";
|
|
3
|
-
import { promises as fsp } from "node:fs";
|
|
4
|
-
import os from "node:os";
|
|
5
|
-
import path from "node:path";
|
|
6
|
-
import { runWorkflowFile } from "../src/workflows/file.js";
|
|
7
|
-
async function runWorkflow(workflow) {
|
|
8
|
-
const tmpDir = await fsp.mkdtemp(path.join(os.tmpdir(), "lobster-cond-"));
|
|
9
|
-
const stateDir = path.join(tmpDir, "state");
|
|
10
|
-
const filePath = path.join(tmpDir, "workflow.lobster");
|
|
11
|
-
await fsp.writeFile(filePath, JSON.stringify(workflow, null, 2), "utf8");
|
|
12
|
-
return runWorkflowFile({
|
|
13
|
-
filePath,
|
|
14
|
-
ctx: {
|
|
15
|
-
stdin: process.stdin,
|
|
16
|
-
stdout: process.stdout,
|
|
17
|
-
stderr: process.stderr,
|
|
18
|
-
env: { ...process.env, LOBSTER_STATE_DIR: stateDir },
|
|
19
|
-
mode: "tool",
|
|
20
|
-
},
|
|
21
|
-
});
|
|
22
|
-
}
|
|
23
|
-
test("condition > works with numbers", async () => {
|
|
24
|
-
const result = await runWorkflow({
|
|
25
|
-
steps: [
|
|
26
|
-
{ id: "data", command: 'node -e "process.stdout.write(JSON.stringify({count:5}))"' },
|
|
27
|
-
{ id: "check", command: 'echo "big"', when: "$data.json.count > 3" },
|
|
28
|
-
],
|
|
29
|
-
});
|
|
30
|
-
assert.equal(result.status, "ok");
|
|
31
|
-
assert.deepEqual(result.output, ["big\n"]);
|
|
32
|
-
});
|
|
33
|
-
test("condition > skips when false", async () => {
|
|
34
|
-
const result = await runWorkflow({
|
|
35
|
-
steps: [
|
|
36
|
-
{ id: "data", command: 'node -e "process.stdout.write(JSON.stringify({count:1}))"' },
|
|
37
|
-
{ id: "check", command: 'echo "big"', when: "$data.json.count > 3" },
|
|
38
|
-
{ id: "fallback", command: 'echo "small"' },
|
|
39
|
-
],
|
|
40
|
-
});
|
|
41
|
-
assert.equal(result.status, "ok");
|
|
42
|
-
assert.deepEqual(result.output, ["small\n"]);
|
|
43
|
-
});
|
|
44
|
-
test("condition < works", async () => {
|
|
45
|
-
const result = await runWorkflow({
|
|
46
|
-
steps: [
|
|
47
|
-
{ id: "data", command: 'node -e "process.stdout.write(JSON.stringify({val:2}))"' },
|
|
48
|
-
{ id: "check", command: 'echo "low"', when: "$data.json.val < 10" },
|
|
49
|
-
],
|
|
50
|
-
});
|
|
51
|
-
assert.equal(result.status, "ok");
|
|
52
|
-
assert.deepEqual(result.output, ["low\n"]);
|
|
53
|
-
});
|
|
54
|
-
test("condition >= works at boundary", async () => {
|
|
55
|
-
const result = await runWorkflow({
|
|
56
|
-
steps: [
|
|
57
|
-
{ id: "data", command: 'node -e "process.stdout.write(JSON.stringify({val:5}))"' },
|
|
58
|
-
{ id: "check", command: 'echo "yes"', when: "$data.json.val >= 5" },
|
|
59
|
-
],
|
|
60
|
-
});
|
|
61
|
-
assert.equal(result.status, "ok");
|
|
62
|
-
assert.deepEqual(result.output, ["yes\n"]);
|
|
63
|
-
});
|
|
64
|
-
test("condition <= works at boundary", async () => {
|
|
65
|
-
const result = await runWorkflow({
|
|
66
|
-
steps: [
|
|
67
|
-
{ id: "data", command: 'node -e "process.stdout.write(JSON.stringify({val:5}))"' },
|
|
68
|
-
{ id: "check", command: 'echo "yes"', when: "$data.json.val <= 5" },
|
|
69
|
-
],
|
|
70
|
-
});
|
|
71
|
-
assert.equal(result.status, "ok");
|
|
72
|
-
assert.deepEqual(result.output, ["yes\n"]);
|
|
73
|
-
});
|
|
74
|
-
test("comparison operators combine with boolean operators", async () => {
|
|
75
|
-
const result = await runWorkflow({
|
|
76
|
-
steps: [
|
|
77
|
-
{ id: "data", command: 'node -e "process.stdout.write(JSON.stringify({a:5,b:20}))"' },
|
|
78
|
-
{ id: "check", command: 'echo "in range"', when: "$data.json.a >= 1 && $data.json.b < 100" },
|
|
79
|
-
],
|
|
80
|
-
});
|
|
81
|
-
assert.equal(result.status, "ok");
|
|
82
|
-
assert.deepEqual(result.output, ["in range\n"]);
|
|
83
|
-
});
|
|
84
|
-
test("comparison with non-numeric string returns false", async () => {
|
|
85
|
-
const result = await runWorkflow({
|
|
86
|
-
steps: [
|
|
87
|
-
{ id: "data", command: 'node -e "process.stdout.write(JSON.stringify({val:\\"hello\\"}))"' },
|
|
88
|
-
{ id: "check", command: 'echo "yes"', when: "$data.json.val > 3" },
|
|
89
|
-
{ id: "fallback", command: 'echo "no"' },
|
|
90
|
-
],
|
|
91
|
-
});
|
|
92
|
-
assert.equal(result.status, "ok");
|
|
93
|
-
assert.deepEqual(result.output, ["no\n"]);
|
|
94
|
-
});
|
|
95
|
-
test("comparison rejects boolean as non-numeric", async () => {
|
|
96
|
-
const result = await runWorkflow({
|
|
97
|
-
steps: [
|
|
98
|
-
{ id: "data", command: 'node -e "process.stdout.write(JSON.stringify({val:true}))"' },
|
|
99
|
-
{ id: "check", command: 'echo "yes"', when: "$data.json.val > 0" },
|
|
100
|
-
{ id: "fallback", command: 'echo "no"' },
|
|
101
|
-
],
|
|
102
|
-
});
|
|
103
|
-
assert.equal(result.status, "ok");
|
|
104
|
-
assert.deepEqual(result.output, ["no\n"]);
|
|
105
|
-
});
|
|
106
|
-
test("comparison rejects null as non-numeric", async () => {
|
|
107
|
-
const result = await runWorkflow({
|
|
108
|
-
steps: [
|
|
109
|
-
{ id: "data", command: 'node -e "process.stdout.write(JSON.stringify({val:null}))"' },
|
|
110
|
-
{ id: "check", command: 'echo "yes"', when: "$data.json.val >= 0" },
|
|
111
|
-
{ id: "fallback", command: 'echo "no"' },
|
|
112
|
-
],
|
|
113
|
-
});
|
|
114
|
-
assert.equal(result.status, "ok");
|
|
115
|
-
assert.deepEqual(result.output, ["no\n"]);
|
|
116
|
-
});
|
|
117
|
-
test("existing == and != still work with new operators", async () => {
|
|
118
|
-
const result = await runWorkflow({
|
|
119
|
-
steps: [
|
|
120
|
-
{ id: "data", command: 'node -e "process.stdout.write(JSON.stringify({status:\\"ok\\"}))"' },
|
|
121
|
-
{ id: "check", command: 'echo "good"', when: '$data.json.status == "ok"' },
|
|
122
|
-
],
|
|
123
|
-
});
|
|
124
|
-
assert.equal(result.status, "ok");
|
|
125
|
-
assert.deepEqual(result.output, ["good\n"]);
|
|
126
|
-
});
|
|
127
|
-
//# sourceMappingURL=condition_comparison.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"condition_comparison.test.js","sourceRoot":"","sources":["../../test/condition_comparison.test.ts"],"names":[],"mappings":"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"}
|