@openclaw/lobster 2026.9.8 → 2026.10.1-beta.2

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.
Files changed (141) hide show
  1. package/README.md +10 -9
  2. package/dist/index.js +45 -39
  3. package/node_modules/@clawdbot/lobster/README.md +4 -0
  4. package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/head.js +4 -2
  5. package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/head.js.map +1 -1
  6. package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/llm_invoke.js +35 -12
  7. package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/llm_invoke.js.map +1 -1
  8. package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/map.js +13 -1
  9. package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/map.js.map +1 -1
  10. package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/pick.js +1 -4
  11. package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/pick.js.map +1 -1
  12. package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/table.js +3 -5
  13. package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/table.js.map +1 -1
  14. package/node_modules/@clawdbot/lobster/package.json +7 -7
  15. package/package.json +5 -5
  16. package/node_modules/@clawdbot/lobster/dist/test/approval_id.test.js +0 -171
  17. package/node_modules/@clawdbot/lobster/dist/test/approval_id.test.js.map +0 -1
  18. package/node_modules/@clawdbot/lobster/dist/test/approve_preview.test.js +0 -38
  19. package/node_modules/@clawdbot/lobster/dist/test/approve_preview.test.js.map +0 -1
  20. package/node_modules/@clawdbot/lobster/dist/test/bin_smoke.test.js +0 -25
  21. package/node_modules/@clawdbot/lobster/dist/test/bin_smoke.test.js.map +0 -1
  22. package/node_modules/@clawdbot/lobster/dist/test/cancellation.test.js +0 -5171
  23. package/node_modules/@clawdbot/lobster/dist/test/cancellation.test.js.map +0 -1
  24. package/node_modules/@clawdbot/lobster/dist/test/clawd_invoke.test.js +0 -146
  25. package/node_modules/@clawdbot/lobster/dist/test/clawd_invoke.test.js.map +0 -1
  26. package/node_modules/@clawdbot/lobster/dist/test/clawd_invoke_legacy.test.js +0 -63
  27. package/node_modules/@clawdbot/lobster/dist/test/clawd_invoke_legacy.test.js.map +0 -1
  28. package/node_modules/@clawdbot/lobster/dist/test/cli_run_errors.test.js +0 -53
  29. package/node_modules/@clawdbot/lobster/dist/test/cli_run_errors.test.js.map +0 -1
  30. package/node_modules/@clawdbot/lobster/dist/test/cli_run_file_args_json.test.js +0 -27
  31. package/node_modules/@clawdbot/lobster/dist/test/cli_run_file_args_json.test.js.map +0 -1
  32. package/node_modules/@clawdbot/lobster/dist/test/command_arguments.test.js +0 -82
  33. package/node_modules/@clawdbot/lobster/dist/test/command_arguments.test.js.map +0 -1
  34. package/node_modules/@clawdbot/lobster/dist/test/commands_list.test.js +0 -44
  35. package/node_modules/@clawdbot/lobster/dist/test/commands_list.test.js.map +0 -1
  36. package/node_modules/@clawdbot/lobster/dist/test/condition_comparison.test.js +0 -127
  37. package/node_modules/@clawdbot/lobster/dist/test/condition_comparison.test.js.map +0 -1
  38. package/node_modules/@clawdbot/lobster/dist/test/core_tool_runtime.test.js +0 -160
  39. package/node_modules/@clawdbot/lobster/dist/test/core_tool_runtime.test.js.map +0 -1
  40. package/node_modules/@clawdbot/lobster/dist/test/cost_tracker.test.js +0 -1993
  41. package/node_modules/@clawdbot/lobster/dist/test/cost_tracker.test.js.map +0 -1
  42. package/node_modules/@clawdbot/lobster/dist/test/dedupe.test.js +0 -48
  43. package/node_modules/@clawdbot/lobster/dist/test/dedupe.test.js.map +0 -1
  44. package/node_modules/@clawdbot/lobster/dist/test/diff_last.test.js +0 -70
  45. package/node_modules/@clawdbot/lobster/dist/test/diff_last.test.js.map +0 -1
  46. package/node_modules/@clawdbot/lobster/dist/test/doctor.test.js +0 -19
  47. package/node_modules/@clawdbot/lobster/dist/test/doctor.test.js.map +0 -1
  48. package/node_modules/@clawdbot/lobster/dist/test/dry_run.test.js +0 -502
  49. package/node_modules/@clawdbot/lobster/dist/test/dry_run.test.js.map +0 -1
  50. package/node_modules/@clawdbot/lobster/dist/test/email_triage.test.js +0 -296
  51. package/node_modules/@clawdbot/lobster/dist/test/email_triage.test.js.map +0 -1
  52. package/node_modules/@clawdbot/lobster/dist/test/exec_stdin.test.js +0 -43
  53. package/node_modules/@clawdbot/lobster/dist/test/exec_stdin.test.js.map +0 -1
  54. package/node_modules/@clawdbot/lobster/dist/test/for_each.test.js +0 -482
  55. package/node_modules/@clawdbot/lobster/dist/test/for_each.test.js.map +0 -1
  56. package/node_modules/@clawdbot/lobster/dist/test/github_pr_notify_format.test.js +0 -19
  57. package/node_modules/@clawdbot/lobster/dist/test/github_pr_notify_format.test.js.map +0 -1
  58. package/node_modules/@clawdbot/lobster/dist/test/github_pr_summary.test.js +0 -41
  59. package/node_modules/@clawdbot/lobster/dist/test/github_pr_summary.test.js.map +0 -1
  60. package/node_modules/@clawdbot/lobster/dist/test/github_pr_view.test.js +0 -176
  61. package/node_modules/@clawdbot/lobster/dist/test/github_pr_view.test.js.map +0 -1
  62. package/node_modules/@clawdbot/lobster/dist/test/gog_gmail_send.test.js +0 -100
  63. package/node_modules/@clawdbot/lobster/dist/test/gog_gmail_send.test.js.map +0 -1
  64. package/node_modules/@clawdbot/lobster/dist/test/group_by.test.js +0 -43
  65. package/node_modules/@clawdbot/lobster/dist/test/group_by.test.js.map +0 -1
  66. package/node_modules/@clawdbot/lobster/dist/test/helpers/node_shell_fixture.js +0 -17
  67. package/node_modules/@clawdbot/lobster/dist/test/helpers/node_shell_fixture.js.map +0 -1
  68. package/node_modules/@clawdbot/lobster/dist/test/helpers/wait_for_pid.js +0 -19
  69. package/node_modules/@clawdbot/lobster/dist/test/helpers/wait_for_pid.js.map +0 -1
  70. package/node_modules/@clawdbot/lobster/dist/test/http_response_body_cap.test.js +0 -318
  71. package/node_modules/@clawdbot/lobster/dist/test/http_response_body_cap.test.js.map +0 -1
  72. package/node_modules/@clawdbot/lobster/dist/test/llm_invoke.test.js +0 -1113
  73. package/node_modules/@clawdbot/lobster/dist/test/llm_invoke.test.js.map +0 -1
  74. package/node_modules/@clawdbot/lobster/dist/test/llm_task_invoke.test.js +0 -519
  75. package/node_modules/@clawdbot/lobster/dist/test/llm_task_invoke.test.js.map +0 -1
  76. package/node_modules/@clawdbot/lobster/dist/test/map.test.js +0 -41
  77. package/node_modules/@clawdbot/lobster/dist/test/map.test.js.map +0 -1
  78. package/node_modules/@clawdbot/lobster/dist/test/multi_approval_resume.test.js +0 -48
  79. package/node_modules/@clawdbot/lobster/dist/test/multi_approval_resume.test.js.map +0 -1
  80. package/node_modules/@clawdbot/lobster/dist/test/on_error.test.js +0 -151
  81. package/node_modules/@clawdbot/lobster/dist/test/on_error.test.js.map +0 -1
  82. package/node_modules/@clawdbot/lobster/dist/test/openclaw_agent.test.js +0 -169
  83. package/node_modules/@clawdbot/lobster/dist/test/openclaw_agent.test.js.map +0 -1
  84. package/node_modules/@clawdbot/lobster/dist/test/openclaw_dispatch_retry.test.js +0 -96
  85. package/node_modules/@clawdbot/lobster/dist/test/openclaw_dispatch_retry.test.js.map +0 -1
  86. package/node_modules/@clawdbot/lobster/dist/test/openclaw_invoke_alias.test.js +0 -13
  87. package/node_modules/@clawdbot/lobster/dist/test/openclaw_invoke_alias.test.js.map +0 -1
  88. package/node_modules/@clawdbot/lobster/dist/test/parallel.test.js +0 -184
  89. package/node_modules/@clawdbot/lobster/dist/test/parallel.test.js.map +0 -1
  90. package/node_modules/@clawdbot/lobster/dist/test/parser.test.js +0 -96
  91. package/node_modules/@clawdbot/lobster/dist/test/parser.test.js.map +0 -1
  92. package/node_modules/@clawdbot/lobster/dist/test/pipeline_resume_state.test.js +0 -65
  93. package/node_modules/@clawdbot/lobster/dist/test/pipeline_resume_state.test.js.map +0 -1
  94. package/node_modules/@clawdbot/lobster/dist/test/process_output_limit.test.js +0 -175
  95. package/node_modules/@clawdbot/lobster/dist/test/process_output_limit.test.js.map +0 -1
  96. package/node_modules/@clawdbot/lobster/dist/test/read_line.test.js +0 -79
  97. package/node_modules/@clawdbot/lobster/dist/test/read_line.test.js.map +0 -1
  98. package/node_modules/@clawdbot/lobster/dist/test/release_changelog.test.js +0 -39
  99. package/node_modules/@clawdbot/lobster/dist/test/release_changelog.test.js.map +0 -1
  100. package/node_modules/@clawdbot/lobster/dist/test/request_input.test.js +0 -946
  101. package/node_modules/@clawdbot/lobster/dist/test/request_input.test.js.map +0 -1
  102. package/node_modules/@clawdbot/lobster/dist/test/resume.test.js +0 -82
  103. package/node_modules/@clawdbot/lobster/dist/test/resume.test.js.map +0 -1
  104. package/node_modules/@clawdbot/lobster/dist/test/sdk_exec.test.js +0 -248
  105. package/node_modules/@clawdbot/lobster/dist/test/sdk_exec.test.js.map +0 -1
  106. package/node_modules/@clawdbot/lobster/dist/test/sdk_lobster.test.js +0 -177
  107. package/node_modules/@clawdbot/lobster/dist/test/sdk_lobster.test.js.map +0 -1
  108. package/node_modules/@clawdbot/lobster/dist/test/shell.test.js +0 -31
  109. package/node_modules/@clawdbot/lobster/dist/test/shell.test.js.map +0 -1
  110. package/node_modules/@clawdbot/lobster/dist/test/sort.test.js +0 -51
  111. package/node_modules/@clawdbot/lobster/dist/test/sort.test.js.map +0 -1
  112. package/node_modules/@clawdbot/lobster/dist/test/state.test.js +0 -919
  113. package/node_modules/@clawdbot/lobster/dist/test/state.test.js.map +0 -1
  114. package/node_modules/@clawdbot/lobster/dist/test/step_retry.test.js +0 -254
  115. package/node_modules/@clawdbot/lobster/dist/test/step_retry.test.js.map +0 -1
  116. package/node_modules/@clawdbot/lobster/dist/test/step_stdin_epipe.test.js +0 -44
  117. package/node_modules/@clawdbot/lobster/dist/test/step_stdin_epipe.test.js.map +0 -1
  118. package/node_modules/@clawdbot/lobster/dist/test/step_timeout.test.js +0 -220
  119. package/node_modules/@clawdbot/lobster/dist/test/step_timeout.test.js.map +0 -1
  120. package/node_modules/@clawdbot/lobster/dist/test/template.test.js +0 -46
  121. package/node_modules/@clawdbot/lobster/dist/test/template.test.js.map +0 -1
  122. package/node_modules/@clawdbot/lobster/dist/test/template_filters.test.js +0 -144
  123. package/node_modules/@clawdbot/lobster/dist/test/template_filters.test.js.map +0 -1
  124. package/node_modules/@clawdbot/lobster/dist/test/tool_envelope_version.test.js +0 -15
  125. package/node_modules/@clawdbot/lobster/dist/test/tool_envelope_version.test.js.map +0 -1
  126. package/node_modules/@clawdbot/lobster/dist/test/tool_mode.test.js +0 -83
  127. package/node_modules/@clawdbot/lobster/dist/test/tool_mode.test.js.map +0 -1
  128. package/node_modules/@clawdbot/lobster/dist/test/validation.test.js +0 -28
  129. package/node_modules/@clawdbot/lobster/dist/test/validation.test.js.map +0 -1
  130. package/node_modules/@clawdbot/lobster/dist/test/where.test.js +0 -94
  131. package/node_modules/@clawdbot/lobster/dist/test/where.test.js.map +0 -1
  132. package/node_modules/@clawdbot/lobster/dist/test/workflow_args_env.test.js +0 -43
  133. package/node_modules/@clawdbot/lobster/dist/test/workflow_args_env.test.js.map +0 -1
  134. package/node_modules/@clawdbot/lobster/dist/test/workflow_composition.test.js +0 -238
  135. package/node_modules/@clawdbot/lobster/dist/test/workflow_composition.test.js.map +0 -1
  136. package/node_modules/@clawdbot/lobster/dist/test/workflow_file.test.js +0 -2045
  137. package/node_modules/@clawdbot/lobster/dist/test/workflow_file.test.js.map +0 -1
  138. package/node_modules/@clawdbot/lobster/dist/test/workflow_graph.test.js +0 -107
  139. package/node_modules/@clawdbot/lobster/dist/test/workflow_graph.test.js.map +0 -1
  140. package/node_modules/@clawdbot/lobster/dist/test/workflows.test.js +0 -32
  141. 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":"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"}
@@ -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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"}