@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,482 +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 { PassThrough } from "node:stream";
7
- import { createDefaultRegistry } from "../src/commands/registry.js";
8
- import { loadWorkflowFile, runWorkflowFile } from "../src/workflows/file.js";
9
- async function runWorkflow(workflow) {
10
- const tmpDir = await fsp.mkdtemp(path.join(os.tmpdir(), "lobster-foreach-"));
11
- const stateDir = path.join(tmpDir, "state");
12
- const filePath = path.join(tmpDir, "workflow.lobster");
13
- await fsp.writeFile(filePath, JSON.stringify(workflow, null, 2), "utf8");
14
- return runWorkflowFile({
15
- filePath,
16
- ctx: {
17
- stdin: process.stdin,
18
- stdout: process.stdout,
19
- stderr: process.stderr,
20
- env: { ...process.env, LOBSTER_STATE_DIR: stateDir },
21
- mode: "tool",
22
- registry: createDefaultRegistry(),
23
- },
24
- });
25
- }
26
- test("for_each iterates items and collects per-iteration results", async () => {
27
- const result = await runWorkflow({
28
- steps: [
29
- {
30
- id: "data",
31
- command: 'node -e "process.stdout.write(JSON.stringify([{name:\\"a\\"},{name:\\"b\\"}]))"',
32
- },
33
- {
34
- id: "loop",
35
- for_each: "$data.json",
36
- steps: [
37
- {
38
- id: "transform",
39
- command: 'node -e "process.stdout.write(JSON.stringify({upper: process.env.NAME.toUpperCase()}))"',
40
- env: { NAME: "$item.json.name" },
41
- },
42
- ],
43
- },
44
- ],
45
- });
46
- assert.equal(result.status, "ok");
47
- const output = result.output;
48
- assert.equal(output.length, 2);
49
- assert.equal(output[0].index, 0);
50
- assert.equal(output[1].index, 1);
51
- assert.equal(output[0].transform.upper, "A");
52
- assert.equal(output[1].transform.upper, "B");
53
- });
54
- test("for_each supports custom item_var and index_var", async () => {
55
- const result = await runWorkflow({
56
- steps: [
57
- { id: "vals", command: 'node -e "process.stdout.write(JSON.stringify([10,20]))"' },
58
- {
59
- id: "loop",
60
- for_each: "$vals.json",
61
- item_var: "num",
62
- index_var: "idx",
63
- steps: [
64
- {
65
- id: "emit",
66
- command: 'node -e "process.stdout.write(JSON.stringify({num:$num.json,idx:$idx.json}))"',
67
- },
68
- ],
69
- },
70
- ],
71
- });
72
- assert.equal(result.status, "ok");
73
- assert.deepEqual(result.output, [
74
- { num: 10, idx: 0, emit: { num: 10, idx: 0 } },
75
- { num: 20, idx: 1, emit: { num: 20, idx: 1 } },
76
- ]);
77
- });
78
- test("for_each pipeline sub-steps reject command-level requestInput", async () => {
79
- await assert.rejects(() => runWorkflow({
80
- steps: [
81
- { id: "vals", command: 'node -e "process.stdout.write(JSON.stringify([1]))"' },
82
- {
83
- id: "loop",
84
- for_each: "$vals.json",
85
- steps: [
86
- {
87
- id: "review",
88
- pipeline: "ask --prompt 'Review?'",
89
- },
90
- ],
91
- },
92
- ],
93
- }), /requestInput is not supported in this pipeline context/);
94
- });
95
- test("for_each throws when source is not an array", async () => {
96
- await assert.rejects(() => runWorkflow({
97
- steps: [
98
- { id: "data", command: 'node -e "process.stdout.write(JSON.stringify({x:1}))"' },
99
- { id: "loop", for_each: "$data.json", steps: [{ id: "x", command: "echo hi" }] },
100
- ],
101
- }), /for_each: expected array/);
102
- });
103
- test("for_each validation rejects empty sub-step list", async () => {
104
- const tmpDir = await fsp.mkdtemp(path.join(os.tmpdir(), "lobster-foreach-"));
105
- const filePath = path.join(tmpDir, "bad.lobster");
106
- await fsp.writeFile(filePath, JSON.stringify({
107
- steps: [{ id: "loop", for_each: "$x.json", steps: [] }],
108
- }), "utf8");
109
- await assert.rejects(() => loadWorkflowFile(filePath), /for_each requires a non-empty steps array/);
110
- });
111
- test("for_each validation rejects run/command/pipeline/workflow/parallel on loop step", async () => {
112
- const tmpDir = await fsp.mkdtemp(path.join(os.tmpdir(), "lobster-foreach-"));
113
- const filePath = path.join(tmpDir, "bad.lobster");
114
- await fsp.writeFile(filePath, JSON.stringify({
115
- steps: [
116
- {
117
- id: "loop",
118
- for_each: "$x.json",
119
- run: "echo no",
120
- steps: [{ id: "s", command: "echo hi" }],
121
- },
122
- ],
123
- }), "utf8");
124
- await assert.rejects(() => loadWorkflowFile(filePath), /for_each cannot also define run, command, pipeline, workflow, or parallel/);
125
- });
126
- test("for_each validation rejects approval/input in sub-steps", async () => {
127
- const tmpDir = await fsp.mkdtemp(path.join(os.tmpdir(), "lobster-foreach-"));
128
- const filePath = path.join(tmpDir, "bad.lobster");
129
- await fsp.writeFile(filePath, JSON.stringify({
130
- steps: [
131
- {
132
- id: "loop",
133
- for_each: "$x.json",
134
- steps: [{ id: "s", command: "echo hi", approval: true }],
135
- },
136
- ],
137
- }), "utf8");
138
- await assert.rejects(() => loadWorkflowFile(filePath), /cannot contain approval or input/);
139
- });
140
- test("for_each validation rejects duplicate sub-step ids", async () => {
141
- const tmpDir = await fsp.mkdtemp(path.join(os.tmpdir(), "lobster-foreach-"));
142
- const filePath = path.join(tmpDir, "bad.lobster");
143
- await fsp.writeFile(filePath, JSON.stringify({
144
- steps: [
145
- {
146
- id: "loop",
147
- for_each: "$x.json",
148
- steps: [
149
- { id: "dup", command: "echo a" },
150
- { id: "dup", command: "echo b" },
151
- ],
152
- },
153
- ],
154
- }), "utf8");
155
- await assert.rejects(() => loadWorkflowFile(filePath), /duplicate for_each sub-step id/);
156
- });
157
- test("for_each validation rejects item_var/index_var collisions", async () => {
158
- const tmpDir = await fsp.mkdtemp(path.join(os.tmpdir(), "lobster-foreach-"));
159
- const filePath = path.join(tmpDir, "bad.lobster");
160
- await fsp.writeFile(filePath, JSON.stringify({
161
- steps: [
162
- {
163
- id: "loop",
164
- for_each: "$x.json",
165
- item_var: "x",
166
- index_var: "x",
167
- steps: [{ id: "s", command: "echo hi" }],
168
- },
169
- ],
170
- }), "utf8");
171
- await assert.rejects(() => loadWorkflowFile(filePath), /item_var and index_var cannot be the same/);
172
- });
173
- test("for_each pause_ms and batch_size are accepted and executable", async () => {
174
- const result = await runWorkflow({
175
- steps: [
176
- { id: "vals", command: 'node -e "process.stdout.write(JSON.stringify([1,2,3]))"' },
177
- {
178
- id: "loop",
179
- for_each: "$vals.json",
180
- batch_size: 2,
181
- pause_ms: 10,
182
- steps: [
183
- { id: "emit", command: 'node -e "process.stdout.write(JSON.stringify({v:$item.json}))"' },
184
- ],
185
- },
186
- ],
187
- });
188
- assert.equal(result.status, "ok");
189
- assert.equal(result.output.length, 3);
190
- });
191
- test("for_each dry-run renders loop structure", async () => {
192
- const workflow = {
193
- steps: [
194
- { id: "vals", command: 'node -e "process.stdout.write(JSON.stringify([1,2]))"' },
195
- {
196
- id: "loop",
197
- for_each: "$vals.json",
198
- batch_size: 2,
199
- steps: [{ id: "emit", command: "echo hi" }],
200
- },
201
- ],
202
- };
203
- const tmpDir = await fsp.mkdtemp(path.join(os.tmpdir(), "lobster-foreach-"));
204
- const stateDir = path.join(tmpDir, "state");
205
- const filePath = path.join(tmpDir, "workflow.lobster");
206
- await fsp.writeFile(filePath, JSON.stringify(workflow, null, 2), "utf8");
207
- const stderr = new PassThrough();
208
- let out = "";
209
- stderr.on("data", (d) => {
210
- out += String(d);
211
- });
212
- await runWorkflowFile({
213
- filePath,
214
- ctx: {
215
- stdin: process.stdin,
216
- stdout: process.stdout,
217
- stderr,
218
- env: { ...process.env, LOBSTER_STATE_DIR: stateDir },
219
- mode: "tool",
220
- dryRun: true,
221
- registry: createDefaultRegistry(),
222
- },
223
- });
224
- assert.match(out, /\[for_each\]/);
225
- assert.match(out, /sub-steps: 1/);
226
- assert.match(out, /batch_size: 2/);
227
- });
228
- async function writeNodeCommand(tmpDir, name, source) {
229
- const filePath = path.join(tmpDir, name);
230
- await fsp.writeFile(filePath, source, "utf8");
231
- return `node ${filePath.split(path.sep).join("/")}`;
232
- }
233
- async function runWorkflowWithIo(workflow) {
234
- const tmpDir = await fsp.mkdtemp(path.join(os.tmpdir(), "lobster-foreach-"));
235
- const stateDir = path.join(tmpDir, "state");
236
- const filePath = path.join(tmpDir, "workflow.lobster");
237
- await fsp.writeFile(filePath, JSON.stringify(workflow, null, 2), "utf8");
238
- const stderr = new PassThrough();
239
- const chunks = [];
240
- stderr.on("data", (chunk) => chunks.push(String(chunk)));
241
- const result = await runWorkflowFile({
242
- filePath,
243
- ctx: {
244
- stdin: process.stdin,
245
- stdout: process.stdout,
246
- stderr,
247
- env: { ...process.env, LOBSTER_STATE_DIR: stateDir },
248
- mode: "tool",
249
- registry: createDefaultRegistry(),
250
- },
251
- });
252
- return { result, stderrOutput: chunks.join("") };
253
- }
254
- for (const pipeline of [false, true]) {
255
- test(`for_each timeout_ms aborts a hanging ${pipeline ? "pipeline" : "shell"} child`, async (t) => {
256
- const tmpDir = await fsp.mkdtemp(path.join(os.tmpdir(), "lobster-foreach-timeout-"));
257
- t.after(() => fsp.rm(tmpDir, { recursive: true, force: true }));
258
- const dataCmd = await writeNodeCommand(tmpDir, "data.js", "process.stdout.write(JSON.stringify([1]));\n");
259
- const hangCmd = await writeNodeCommand(tmpDir, "hang.js", "setTimeout(() => {}, 5000);\n");
260
- await assert.rejects(() => runWorkflow({
261
- steps: [
262
- { id: "data", command: dataCmd },
263
- {
264
- id: "loop",
265
- for_each: "$data.json",
266
- timeout_ms: 200,
267
- steps: [
268
- pipeline
269
- ? { id: "slow", pipeline: `exec ${hangCmd}` }
270
- : { id: "slow", command: hangCmd },
271
- ],
272
- },
273
- ],
274
- }), /timed out after 200ms/);
275
- });
276
- }
277
- test("for_each timeout_ms with on_error continue records error and continues", async () => {
278
- const tmpDir = await fsp.mkdtemp(path.join(os.tmpdir(), "lobster-foreach-timeout-continue-"));
279
- const dataCmd = await writeNodeCommand(tmpDir, "data.js", "process.stdout.write(JSON.stringify([1]));\n");
280
- const hangCmd = await writeNodeCommand(tmpDir, "hang.js", "setTimeout(() => {}, 5000);\n");
281
- const checkCmd = await writeNodeCommand(tmpDir, "check.js", "process.stdout.write(JSON.stringify({saw: process.env.SAW}));\n");
282
- const result = await runWorkflow({
283
- steps: [
284
- { id: "data", command: dataCmd },
285
- {
286
- id: "loop",
287
- for_each: "$data.json",
288
- timeout_ms: 200,
289
- on_error: "continue",
290
- steps: [{ id: "slow", command: hangCmd }],
291
- },
292
- {
293
- id: "check",
294
- command: checkCmd,
295
- env: { SAW: "$loop.error" },
296
- },
297
- ],
298
- });
299
- assert.equal(result.status, "ok");
300
- assert.deepEqual(result.output, [{ saw: "true" }]);
301
- });
302
- test("for_each on_error continue records a child command failure and continues", async () => {
303
- const tmpDir = await fsp.mkdtemp(path.join(os.tmpdir(), "lobster-foreach-onerror-"));
304
- const dataCmd = await writeNodeCommand(tmpDir, "data.js", "process.stdout.write(JSON.stringify([1]));\n");
305
- const failCmd = await writeNodeCommand(tmpDir, "fail.js", "process.exit(1);\n");
306
- const checkCmd = await writeNodeCommand(tmpDir, "check.js", "process.stdout.write(JSON.stringify({saw: process.env.SAW}));\n");
307
- const result = await runWorkflow({
308
- steps: [
309
- { id: "data", command: dataCmd },
310
- {
311
- id: "loop",
312
- for_each: "$data.json",
313
- on_error: "continue",
314
- steps: [{ id: "fail", command: failCmd }],
315
- },
316
- {
317
- id: "check",
318
- command: checkCmd,
319
- env: { SAW: "$loop.error" },
320
- },
321
- ],
322
- });
323
- assert.equal(result.status, "ok");
324
- assert.deepEqual(result.output, [{ saw: "true" }]);
325
- });
326
- test("for_each retry retries a failing child and then succeeds", async () => {
327
- const tmpDir = await fsp.mkdtemp(path.join(os.tmpdir(), "lobster-foreach-retry-"));
328
- const counterFile = path.join(tmpDir, "counter");
329
- await fsp.writeFile(counterFile, "0", "utf8");
330
- const dataCmd = await writeNodeCommand(tmpDir, "data.js", "process.stdout.write(JSON.stringify([1]));\n");
331
- const flakyCmd = await writeNodeCommand(tmpDir, "flaky.js", [
332
- 'const fs = require("fs");',
333
- `const p = ${JSON.stringify(counterFile)};`,
334
- 'const c = Number(fs.readFileSync(p, "utf8")) + 1;',
335
- "fs.writeFileSync(p, String(c));",
336
- "if (c < 3) process.exit(1);",
337
- "process.stdout.write(JSON.stringify({ attempt: c }));",
338
- "",
339
- ].join("\n"));
340
- const { result, stderrOutput } = await runWorkflowWithIo({
341
- steps: [
342
- { id: "data", command: dataCmd },
343
- {
344
- id: "loop",
345
- for_each: "$data.json",
346
- retry: { max: 3, delay_ms: 20 },
347
- steps: [{ id: "flaky", command: flakyCmd }],
348
- },
349
- ],
350
- });
351
- assert.equal(result.status, "ok");
352
- assert.deepEqual(result.output, [{ item: 1, index: 0, flaky: { attempt: 3 } }]);
353
- assert.ok(stderrOutput.includes("[RETRY]"), "should log retry attempts");
354
- });
355
- test("for_each cost_limit stop does not retry a child that already exceeded the budget", async () => {
356
- const tmpDir = await fsp.mkdtemp(path.join(os.tmpdir(), "lobster-foreach-cost-stop-"));
357
- const counterFile = path.join(tmpDir, "counter");
358
- await fsp.writeFile(counterFile, "0", "utf8");
359
- const dataCmd = await writeNodeCommand(tmpDir, "data.js", "process.stdout.write(JSON.stringify([1, 2]));\n");
360
- const spendCmd = await writeNodeCommand(tmpDir, "spend.js", [
361
- 'const fs = require("fs");',
362
- `const p = ${JSON.stringify(counterFile)};`,
363
- 'const c = Number(fs.readFileSync(p, "utf8")) + 1;',
364
- "fs.writeFileSync(p, String(c));",
365
- "process.stdout.write(JSON.stringify({model:'gpt-4o',usage:{inputTokens:1000,outputTokens:1000}}));",
366
- "",
367
- ].join("\n"));
368
- await assert.rejects(() => runWorkflowWithIo({
369
- cost_limit: { max_usd: 0.01, action: "stop" },
370
- steps: [
371
- { id: "data", command: dataCmd },
372
- {
373
- id: "loop",
374
- for_each: "$data.json",
375
- retry: { max: 3, delay_ms: 20 },
376
- steps: [{ id: "spend", command: spendCmd }],
377
- },
378
- ],
379
- }), /Cost limit exceeded/);
380
- assert.equal(await fsp.readFile(counterFile, "utf8"), "1");
381
- });
382
- test("for_each dry-run renders timeout, retry, and on_error", async () => {
383
- const workflow = {
384
- steps: [
385
- { id: "vals", command: 'node -e "process.stdout.write(JSON.stringify([1]))"' },
386
- {
387
- id: "loop",
388
- for_each: "$vals.json",
389
- timeout_ms: 1500,
390
- on_error: "continue",
391
- retry: { max: 3, backoff: "fixed", delay_ms: 100 },
392
- steps: [{ id: "emit", command: "echo hi" }],
393
- },
394
- ],
395
- };
396
- const tmpDir = await fsp.mkdtemp(path.join(os.tmpdir(), "lobster-foreach-"));
397
- const stateDir = path.join(tmpDir, "state");
398
- const filePath = path.join(tmpDir, "workflow.lobster");
399
- await fsp.writeFile(filePath, JSON.stringify(workflow, null, 2), "utf8");
400
- const stderr = new PassThrough();
401
- let out = "";
402
- stderr.on("data", (d) => {
403
- out += String(d);
404
- });
405
- await runWorkflowFile({
406
- filePath,
407
- ctx: {
408
- stdin: process.stdin,
409
- stdout: process.stdout,
410
- stderr,
411
- env: { ...process.env, LOBSTER_STATE_DIR: stateDir },
412
- mode: "tool",
413
- dryRun: true,
414
- registry: createDefaultRegistry(),
415
- },
416
- });
417
- assert.match(out, /\[for_each\]/);
418
- assert.match(out, /timeout: 1500ms/);
419
- assert.match(out, /on_error: continue/);
420
- assert.match(out, /retry: up to 3 attempts/);
421
- });
422
- test("for_each retries restart at the first item after a later item fails", async (t) => {
423
- const dir = await fsp.mkdtemp(path.join(os.tmpdir(), "lobster-foreach-restart-"));
424
- t.after(() => fsp.rm(dir, { recursive: true, force: true }));
425
- const history = path.join(dir, "history.json");
426
- const command = await writeNodeCommand(dir, "flaky.cjs", `
427
- const fs = require("node:fs");
428
- const file = ${JSON.stringify(history)};
429
- const history = fs.existsSync(file) ? JSON.parse(fs.readFileSync(file, "utf8")) : [];
430
- const item = Number(process.env.ITEM);
431
- history.push(item);
432
- fs.writeFileSync(file, JSON.stringify(history));
433
- if (history.length === 2) process.exit(1);
434
- console.log(item);
435
- `);
436
- const result = await runWorkflow({
437
- steps: [
438
- { id: "data", run: "node -e \"console.log('[1,2]')\"" },
439
- {
440
- id: "loop",
441
- for_each: "$data.json",
442
- retry: { max: 2, delay_ms: 1 },
443
- steps: [{ id: "child", run: command, env: { ITEM: "$item.json" } }],
444
- },
445
- ],
446
- });
447
- assert.equal(result.status, "ok");
448
- assert.deepEqual(JSON.parse(await fsp.readFile(history, "utf8")), [1, 2, 1, 2]);
449
- assert.deepEqual(result.output, [
450
- { item: 1, index: 0, child: 1 },
451
- { item: 2, index: 1, child: 2 },
452
- ]);
453
- });
454
- for (const customNames of [false, true]) {
455
- test(`for_each resolves loop environment per item with ${customNames ? "custom" : "default"} names`, async () => {
456
- const itemVar = customNames ? "value" : "item";
457
- const indexVar = customNames ? "position" : "index";
458
- const result = await runWorkflow({
459
- steps: [
460
- { id: "data", run: "node -e \"console.log('[10,20]')\"" },
461
- {
462
- id: "loop",
463
- for_each: "$data.json",
464
- item_var: itemVar,
465
- index_var: indexVar,
466
- env: { ITEM: `$${itemVar}.json`, INDEX: `$${indexVar}.json` },
467
- steps: [
468
- {
469
- id: "read",
470
- run: 'node -e "console.log(JSON.stringify({item:process.env.ITEM,index:process.env.INDEX}))"',
471
- },
472
- ],
473
- },
474
- ],
475
- });
476
- assert.deepEqual(result.output, [
477
- { [itemVar]: 10, [indexVar]: 0, read: { item: "10", index: "0" } },
478
- { [itemVar]: 20, [indexVar]: 1, read: { item: "20", index: "1" } },
479
- ]);
480
- });
481
- }
482
- //# sourceMappingURL=for_each.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"for_each.test.js","sourceRoot":"","sources":["../../test/for_each.test.ts"],"names":[],"mappings":"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"}
@@ -1,19 +0,0 @@
1
- import test from "node:test";
2
- import assert from "node:assert/strict";
3
- import { buildPrChangeSummary } from "../src/workflows/github_pr_monitor.js";
4
- function formatLikeWorkflow({ repo, pr, after, before }) {
5
- const summary = buildPrChangeSummary(before, after);
6
- const fields = summary.changedFields.length ? ` (${summary.changedFields.join(", ")})` : "";
7
- const title = after?.title ? `: ${after.title}` : "";
8
- const url = after?.url ? ` ${after.url}` : "";
9
- return `PR updated: ${repo}#${pr}${title}${fields}.${url}`.replace(/\s+/g, " ").trim();
10
- }
11
- test("notify message includes repo/pr and changed fields", () => {
12
- const before = { number: 1, title: "A", url: "u", state: "OPEN", updatedAt: "t1" };
13
- const after = { ...before, title: "B", updatedAt: "t2" };
14
- const msg = formatLikeWorkflow({ repo: "o/r", pr: 1, before, after });
15
- assert.ok(msg.includes("o/r#1"));
16
- assert.ok(msg.includes("title"));
17
- assert.ok(msg.includes("updatedAt"));
18
- });
19
- //# sourceMappingURL=github_pr_notify_format.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"github_pr_notify_format.test.js","sourceRoot":"","sources":["../../test/github_pr_notify_format.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAE7E,SAAS,kBAAkB,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;IACtD,MAAM,OAAO,GAAG,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5F,MAAM,KAAK,GAAG,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACrD,MAAM,GAAG,GAAG,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9C,OAAO,eAAe,IAAI,IAAI,EAAE,GAAG,KAAK,GAAG,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AACxF,CAAC;AAED,IAAI,CAAC,oDAAoD,EAAE,GAAG,EAAE;IAC/D,MAAM,MAAM,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACnF,MAAM,KAAK,GAAG,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAEzD,MAAM,GAAG,GAAG,kBAAkB,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACtE,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;AACtC,CAAC,CAAC,CAAC"}
@@ -1,41 +0,0 @@
1
- import test from "node:test";
2
- import assert from "node:assert/strict";
3
- import { buildPrChangeSummary } from "../src/workflows/github_pr_monitor.js";
4
- const build = buildPrChangeSummary;
5
- test("buildPrChangeSummary reports all fields on first snapshot", () => {
6
- const after = {
7
- number: 1,
8
- title: "A",
9
- url: "u",
10
- state: "OPEN",
11
- isDraft: false,
12
- mergeable: "MERGEABLE",
13
- reviewDecision: "REVIEW_REQUIRED",
14
- updatedAt: "t1",
15
- baseRefName: "main",
16
- headRefName: "feat",
17
- };
18
- const res = build(null, after);
19
- assert.ok(res.changedFields.length > 0);
20
- assert.equal(res.changes.title.to, "A");
21
- });
22
- test("buildPrChangeSummary only includes changed fields", () => {
23
- const before = {
24
- number: 1,
25
- title: "A",
26
- url: "u",
27
- state: "OPEN",
28
- isDraft: false,
29
- mergeable: "MERGEABLE",
30
- reviewDecision: null,
31
- updatedAt: "t1",
32
- baseRefName: "main",
33
- headRefName: "feat",
34
- };
35
- const after = { ...before, title: "B", updatedAt: "t2" };
36
- const res = build(before, after);
37
- assert.deepEqual(res.changedFields.sort(), ["title", "updatedAt"].sort());
38
- assert.equal(res.changes.title.from, "A");
39
- assert.equal(res.changes.title.to, "B");
40
- });
41
- //# sourceMappingURL=github_pr_summary.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"github_pr_summary.test.js","sourceRoot":"","sources":["../../test/github_pr_summary.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAE7E,MAAM,KAAK,GAAG,oBAA2B,CAAC;AAE1C,IAAI,CAAC,2DAA2D,EAAE,GAAG,EAAE;IACtE,MAAM,KAAK,GAAG;QACb,MAAM,EAAE,CAAC;QACT,KAAK,EAAE,GAAG;QACV,GAAG,EAAE,GAAG;QACR,KAAK,EAAE,MAAM;QACb,OAAO,EAAE,KAAK;QACd,SAAS,EAAE,WAAW;QACtB,cAAc,EAAE,iBAAiB;QACjC,SAAS,EAAE,IAAI;QACf,WAAW,EAAE,MAAM;QACnB,WAAW,EAAE,MAAM;KACnB,CAAC;IAEF,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC/B,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACxC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;AACzC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mDAAmD,EAAE,GAAG,EAAE;IAC9D,MAAM,MAAM,GAAG;QACd,MAAM,EAAE,CAAC;QACT,KAAK,EAAE,GAAG;QACV,GAAG,EAAE,GAAG;QACR,KAAK,EAAE,MAAM;QACb,OAAO,EAAE,KAAK;QACd,SAAS,EAAE,WAAW;QACtB,cAAc,EAAE,IAAI;QACpB,SAAS,EAAE,IAAI;QACf,WAAW,EAAE,MAAM;QACnB,WAAW,EAAE,MAAM;KACnB,CAAC;IACF,MAAM,KAAK,GAAG,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAEzD,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACjC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1E,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC1C,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;AACzC,CAAC,CAAC,CAAC"}