@plateforme-ai/lobster 2026.6.12

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 (219) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +353 -0
  3. package/VISION.md +249 -0
  4. package/bin/clawd.invoke.js +18 -0
  5. package/bin/lobster.js +24 -0
  6. package/bin/openclaw.invoke.js +21 -0
  7. package/dist/src/cli.js +793 -0
  8. package/dist/src/cli.js.map +1 -0
  9. package/dist/src/commands/commands_list.js +49 -0
  10. package/dist/src/commands/commands_list.js.map +1 -0
  11. package/dist/src/commands/registry.js +66 -0
  12. package/dist/src/commands/registry.js.map +1 -0
  13. package/dist/src/commands/stdlib/approve.js +77 -0
  14. package/dist/src/commands/stdlib/approve.js.map +1 -0
  15. package/dist/src/commands/stdlib/ask.js +171 -0
  16. package/dist/src/commands/stdlib/ask.js.map +1 -0
  17. package/dist/src/commands/stdlib/dedupe.js +55 -0
  18. package/dist/src/commands/stdlib/dedupe.js.map +1 -0
  19. package/dist/src/commands/stdlib/diff_last.js +35 -0
  20. package/dist/src/commands/stdlib/diff_last.js.map +1 -0
  21. package/dist/src/commands/stdlib/email_triage.js +279 -0
  22. package/dist/src/commands/stdlib/email_triage.js.map +1 -0
  23. package/dist/src/commands/stdlib/exec.js +130 -0
  24. package/dist/src/commands/stdlib/exec.js.map +1 -0
  25. package/dist/src/commands/stdlib/gog_gmail_search.js +94 -0
  26. package/dist/src/commands/stdlib/gog_gmail_search.js.map +1 -0
  27. package/dist/src/commands/stdlib/gog_gmail_send.js +104 -0
  28. package/dist/src/commands/stdlib/gog_gmail_send.js.map +1 -0
  29. package/dist/src/commands/stdlib/group_by.js +59 -0
  30. package/dist/src/commands/stdlib/group_by.js.map +1 -0
  31. package/dist/src/commands/stdlib/head.js +34 -0
  32. package/dist/src/commands/stdlib/head.js.map +1 -0
  33. package/dist/src/commands/stdlib/json.js +20 -0
  34. package/dist/src/commands/stdlib/json.js.map +1 -0
  35. package/dist/src/commands/stdlib/llm_invoke.js +758 -0
  36. package/dist/src/commands/stdlib/llm_invoke.js.map +1 -0
  37. package/dist/src/commands/stdlib/llm_task_invoke.js +2 -0
  38. package/dist/src/commands/stdlib/llm_task_invoke.js.map +1 -0
  39. package/dist/src/commands/stdlib/map.js +104 -0
  40. package/dist/src/commands/stdlib/map.js.map +1 -0
  41. package/dist/src/commands/stdlib/openclaw_invoke.js +136 -0
  42. package/dist/src/commands/stdlib/openclaw_invoke.js.map +1 -0
  43. package/dist/src/commands/stdlib/pick.js +45 -0
  44. package/dist/src/commands/stdlib/pick.js.map +1 -0
  45. package/dist/src/commands/stdlib/sort.js +86 -0
  46. package/dist/src/commands/stdlib/sort.js.map +1 -0
  47. package/dist/src/commands/stdlib/state.js +76 -0
  48. package/dist/src/commands/stdlib/state.js.map +1 -0
  49. package/dist/src/commands/stdlib/table.js +57 -0
  50. package/dist/src/commands/stdlib/table.js.map +1 -0
  51. package/dist/src/commands/stdlib/template.js +126 -0
  52. package/dist/src/commands/stdlib/template.js.map +1 -0
  53. package/dist/src/commands/stdlib/where.js +81 -0
  54. package/dist/src/commands/stdlib/where.js.map +1 -0
  55. package/dist/src/commands/types.js +2 -0
  56. package/dist/src/commands/types.js.map +1 -0
  57. package/dist/src/commands/workflows/workflows_list.js +24 -0
  58. package/dist/src/commands/workflows/workflows_list.js.map +1 -0
  59. package/dist/src/commands/workflows/workflows_run.js +74 -0
  60. package/dist/src/commands/workflows/workflows_run.js.map +1 -0
  61. package/dist/src/core/cost_tracker.js +119 -0
  62. package/dist/src/core/cost_tracker.js.map +1 -0
  63. package/dist/src/core/filters.js +102 -0
  64. package/dist/src/core/filters.js.map +1 -0
  65. package/dist/src/core/index.js +7 -0
  66. package/dist/src/core/index.js.map +1 -0
  67. package/dist/src/core/retry.js +89 -0
  68. package/dist/src/core/retry.js.map +1 -0
  69. package/dist/src/core/tool_runtime.js +289 -0
  70. package/dist/src/core/tool_runtime.js.map +1 -0
  71. package/dist/src/input_request.js +430 -0
  72. package/dist/src/input_request.js.map +1 -0
  73. package/dist/src/parser.js +145 -0
  74. package/dist/src/parser.js.map +1 -0
  75. package/dist/src/pipeline_resume_state.js +186 -0
  76. package/dist/src/pipeline_resume_state.js.map +1 -0
  77. package/dist/src/read_line.js +50 -0
  78. package/dist/src/read_line.js.map +1 -0
  79. package/dist/src/recipes/github/index.js +16 -0
  80. package/dist/src/recipes/github/index.js.map +1 -0
  81. package/dist/src/recipes/github/pr-monitor.js +248 -0
  82. package/dist/src/recipes/github/pr-monitor.js.map +1 -0
  83. package/dist/src/recipes/github/stages/pr-view.js +107 -0
  84. package/dist/src/recipes/github/stages/pr-view.js.map +1 -0
  85. package/dist/src/recipes/index.js +7 -0
  86. package/dist/src/recipes/index.js.map +1 -0
  87. package/dist/src/recipes/registry.js +30 -0
  88. package/dist/src/recipes/registry.js.map +1 -0
  89. package/dist/src/renderers/json.js +13 -0
  90. package/dist/src/renderers/json.js.map +1 -0
  91. package/dist/src/resume.js +179 -0
  92. package/dist/src/resume.js.map +1 -0
  93. package/dist/src/runtime.js +230 -0
  94. package/dist/src/runtime.js.map +1 -0
  95. package/dist/src/sdk/Lobster.js +402 -0
  96. package/dist/src/sdk/Lobster.js.map +1 -0
  97. package/dist/src/sdk/index.js +25 -0
  98. package/dist/src/sdk/index.js.map +1 -0
  99. package/dist/src/sdk/primitives/approve.js +47 -0
  100. package/dist/src/sdk/primitives/approve.js.map +1 -0
  101. package/dist/src/sdk/primitives/diff.js +156 -0
  102. package/dist/src/sdk/primitives/diff.js.map +1 -0
  103. package/dist/src/sdk/primitives/exec.js +167 -0
  104. package/dist/src/sdk/primitives/exec.js.map +1 -0
  105. package/dist/src/sdk/primitives/state.js +203 -0
  106. package/dist/src/sdk/primitives/state.js.map +1 -0
  107. package/dist/src/sdk/runtime.js +131 -0
  108. package/dist/src/sdk/runtime.js.map +1 -0
  109. package/dist/src/sdk/token.js +9 -0
  110. package/dist/src/sdk/token.js.map +1 -0
  111. package/dist/src/shell.js +39 -0
  112. package/dist/src/shell.js.map +1 -0
  113. package/dist/src/state/store.js +337 -0
  114. package/dist/src/state/store.js.map +1 -0
  115. package/dist/src/token.js +15 -0
  116. package/dist/src/token.js.map +1 -0
  117. package/dist/src/validation.js +38 -0
  118. package/dist/src/validation.js.map +1 -0
  119. package/dist/src/workflows/file.js +2405 -0
  120. package/dist/src/workflows/file.js.map +1 -0
  121. package/dist/src/workflows/github_pr_monitor.js +167 -0
  122. package/dist/src/workflows/github_pr_monitor.js.map +1 -0
  123. package/dist/src/workflows/graph.js +234 -0
  124. package/dist/src/workflows/graph.js.map +1 -0
  125. package/dist/src/workflows/registry.js +57 -0
  126. package/dist/src/workflows/registry.js.map +1 -0
  127. package/dist/test/approval_id.test.js +171 -0
  128. package/dist/test/approval_id.test.js.map +1 -0
  129. package/dist/test/approve_preview.test.js +38 -0
  130. package/dist/test/approve_preview.test.js.map +1 -0
  131. package/dist/test/clawd_invoke.test.js +124 -0
  132. package/dist/test/clawd_invoke.test.js.map +1 -0
  133. package/dist/test/clawd_invoke_legacy.test.js +63 -0
  134. package/dist/test/clawd_invoke_legacy.test.js.map +1 -0
  135. package/dist/test/cli_run_file_args_json.test.js +27 -0
  136. package/dist/test/cli_run_file_args_json.test.js.map +1 -0
  137. package/dist/test/commands_list.test.js +44 -0
  138. package/dist/test/commands_list.test.js.map +1 -0
  139. package/dist/test/condition_comparison.test.js +127 -0
  140. package/dist/test/condition_comparison.test.js.map +1 -0
  141. package/dist/test/core_tool_runtime.test.js +160 -0
  142. package/dist/test/core_tool_runtime.test.js.map +1 -0
  143. package/dist/test/cost_tracker.test.js +231 -0
  144. package/dist/test/cost_tracker.test.js.map +1 -0
  145. package/dist/test/dedupe.test.js +48 -0
  146. package/dist/test/dedupe.test.js.map +1 -0
  147. package/dist/test/diff_last.test.js +70 -0
  148. package/dist/test/diff_last.test.js.map +1 -0
  149. package/dist/test/doctor.test.js +19 -0
  150. package/dist/test/doctor.test.js.map +1 -0
  151. package/dist/test/dry_run.test.js +502 -0
  152. package/dist/test/dry_run.test.js.map +1 -0
  153. package/dist/test/email_triage.test.js +296 -0
  154. package/dist/test/email_triage.test.js.map +1 -0
  155. package/dist/test/exec_stdin.test.js +43 -0
  156. package/dist/test/exec_stdin.test.js.map +1 -0
  157. package/dist/test/for_each.test.js +228 -0
  158. package/dist/test/for_each.test.js.map +1 -0
  159. package/dist/test/github_pr_notify_format.test.js +19 -0
  160. package/dist/test/github_pr_notify_format.test.js.map +1 -0
  161. package/dist/test/github_pr_summary.test.js +41 -0
  162. package/dist/test/github_pr_summary.test.js.map +1 -0
  163. package/dist/test/group_by.test.js +43 -0
  164. package/dist/test/group_by.test.js.map +1 -0
  165. package/dist/test/llm_invoke.test.js +166 -0
  166. package/dist/test/llm_invoke.test.js.map +1 -0
  167. package/dist/test/llm_task_invoke.test.js +416 -0
  168. package/dist/test/llm_task_invoke.test.js.map +1 -0
  169. package/dist/test/map.test.js +41 -0
  170. package/dist/test/map.test.js.map +1 -0
  171. package/dist/test/multi_approval_resume.test.js +48 -0
  172. package/dist/test/multi_approval_resume.test.js.map +1 -0
  173. package/dist/test/on_error.test.js +151 -0
  174. package/dist/test/on_error.test.js.map +1 -0
  175. package/dist/test/openclaw_invoke_alias.test.js +13 -0
  176. package/dist/test/openclaw_invoke_alias.test.js.map +1 -0
  177. package/dist/test/parallel.test.js +184 -0
  178. package/dist/test/parallel.test.js.map +1 -0
  179. package/dist/test/parser.test.js +39 -0
  180. package/dist/test/parser.test.js.map +1 -0
  181. package/dist/test/read_line.test.js +25 -0
  182. package/dist/test/read_line.test.js.map +1 -0
  183. package/dist/test/request_input.test.js +946 -0
  184. package/dist/test/request_input.test.js.map +1 -0
  185. package/dist/test/resume.test.js +82 -0
  186. package/dist/test/resume.test.js.map +1 -0
  187. package/dist/test/sdk_lobster.test.js +177 -0
  188. package/dist/test/sdk_lobster.test.js.map +1 -0
  189. package/dist/test/shell.test.js +31 -0
  190. package/dist/test/shell.test.js.map +1 -0
  191. package/dist/test/sort.test.js +51 -0
  192. package/dist/test/sort.test.js.map +1 -0
  193. package/dist/test/state.test.js +336 -0
  194. package/dist/test/state.test.js.map +1 -0
  195. package/dist/test/step_retry.test.js +254 -0
  196. package/dist/test/step_retry.test.js.map +1 -0
  197. package/dist/test/step_timeout.test.js +154 -0
  198. package/dist/test/step_timeout.test.js.map +1 -0
  199. package/dist/test/template.test.js +46 -0
  200. package/dist/test/template.test.js.map +1 -0
  201. package/dist/test/template_filters.test.js +107 -0
  202. package/dist/test/template_filters.test.js.map +1 -0
  203. package/dist/test/tool_envelope_version.test.js +15 -0
  204. package/dist/test/tool_envelope_version.test.js.map +1 -0
  205. package/dist/test/tool_mode.test.js +83 -0
  206. package/dist/test/tool_mode.test.js.map +1 -0
  207. package/dist/test/validation.test.js +28 -0
  208. package/dist/test/validation.test.js.map +1 -0
  209. package/dist/test/workflow_args_env.test.js +41 -0
  210. package/dist/test/workflow_args_env.test.js.map +1 -0
  211. package/dist/test/workflow_composition.test.js +238 -0
  212. package/dist/test/workflow_composition.test.js.map +1 -0
  213. package/dist/test/workflow_file.test.js +1399 -0
  214. package/dist/test/workflow_file.test.js.map +1 -0
  215. package/dist/test/workflow_graph.test.js +97 -0
  216. package/dist/test/workflow_graph.test.js.map +1 -0
  217. package/dist/test/workflows.test.js +32 -0
  218. package/dist/test/workflows.test.js.map +1 -0
  219. package/package.json +75 -0
@@ -0,0 +1,402 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { runPipelineInternal } from "./runtime.js";
3
+ import { encodeToken, decodeToken } from "./token.js";
4
+ import { compileCached } from "../validation.js";
5
+ import { validateCommandInputState } from "../input_request.js";
6
+ import { deleteStateJson, readStateJson, writeStateJson } from "../state/store.js";
7
+ /**
8
+ * @typedef {Object} LobsterResult
9
+ * @property {boolean} ok - Whether the workflow completed successfully
10
+ * @property {'ok' | 'needs_approval' | 'needs_input' | 'cancelled' | 'error'} status - Workflow status
11
+ * @property {any[]} output - Output items from the workflow
12
+ * @property {Object|null} requiresApproval - Approval request if halted
13
+ * @property {string} [requiresApproval.prompt] - Approval prompt
14
+ * @property {any[]} [requiresApproval.items] - Items pending approval
15
+ * @property {string} [requiresApproval.resumeToken] - Token to resume workflow
16
+ * @property {Object|null} requiresInput - Input request if halted
17
+ * @property {string} [requiresInput.prompt] - Input prompt
18
+ * @property {Object} [requiresInput.responseSchema] - JSON Schema for response
19
+ * @property {any} [requiresInput.subject] - Subject shown to the human
20
+ * @property {string} [requiresInput.resumeToken] - Token to resume workflow
21
+ * @property {Object} [error] - Error details if failed
22
+ */
23
+ /**
24
+ * @typedef {Object} LobsterOptions
25
+ * @property {Object} [env] - Environment variables
26
+ * @property {string} [stateDir] - State directory override
27
+ */
28
+ export class Lobster {
29
+ #stages = [];
30
+ #options = {};
31
+ #meta = null;
32
+ constructor(options = {}) {
33
+ this.#options = {
34
+ env: options.env ?? process.env,
35
+ stateDir: options.stateDir,
36
+ };
37
+ }
38
+ pipe(stage) {
39
+ if (typeof stage !== "function" && typeof stage?.run !== "function") {
40
+ throw new Error("Stage must be a function or have a run() method");
41
+ }
42
+ this.#stages.push(stage);
43
+ return this;
44
+ }
45
+ meta(meta) {
46
+ this.#meta = meta;
47
+ return this;
48
+ }
49
+ getMeta() {
50
+ return this.#meta;
51
+ }
52
+ async run(initialInput = []) {
53
+ const ctx = {
54
+ env: this.#options.env,
55
+ stateDir: this.#options.stateDir,
56
+ mode: "sdk",
57
+ };
58
+ try {
59
+ const result = await runPipelineInternal({
60
+ stages: this.#stages,
61
+ ctx,
62
+ input: initialInput,
63
+ });
64
+ if (result.halted &&
65
+ result.items.length === 1 &&
66
+ result.items[0]?.type === "approval_request") {
67
+ const approval = result.items[0];
68
+ const resumeToken = encodeToken({
69
+ protocolVersion: 1,
70
+ v: 1,
71
+ stageIndex: result.haltedAt?.index ?? -1,
72
+ resumeAtIndex: (result.haltedAt?.index ?? -1) + 1,
73
+ items: approval.items,
74
+ prompt: approval.prompt,
75
+ });
76
+ return {
77
+ ok: true,
78
+ status: "needs_approval",
79
+ output: [],
80
+ requiresApproval: {
81
+ prompt: approval.prompt,
82
+ items: approval.items,
83
+ resumeToken,
84
+ },
85
+ requiresInput: null,
86
+ };
87
+ }
88
+ if (result.halted && result.items.length === 1 && result.items[0]?.type === "input_request") {
89
+ const input = result.items[0];
90
+ const resumeMode = input.commandInput ? "same_stage" : "next_stage";
91
+ const resumeAtIndex = resumeMode === "same_stage"
92
+ ? (result.haltedAt?.index ?? -1)
93
+ : (result.haltedAt?.index ?? -1) + 1;
94
+ const stateKey = resumeMode === "same_stage"
95
+ ? await saveSdkCommandInputResumeState(this.#options, {
96
+ resumeAtIndex,
97
+ items: input.items ?? [],
98
+ inputSchema: input.responseSchema,
99
+ ...(input.subject !== undefined ? { inputSubject: input.subject } : null),
100
+ commandInput: input.commandInput,
101
+ })
102
+ : undefined;
103
+ const resumeToken = encodeToken({
104
+ protocolVersion: 1,
105
+ v: 1,
106
+ stageIndex: result.haltedAt?.index ?? -1,
107
+ resumeAtIndex,
108
+ resumeMode,
109
+ ...(resumeMode === "same_stage"
110
+ ? { stateKey }
111
+ : { items: [], inputSchema: input.responseSchema }),
112
+ inputSubject: input.subject,
113
+ });
114
+ return {
115
+ ok: true,
116
+ status: "needs_input",
117
+ output: [],
118
+ requiresApproval: null,
119
+ requiresInput: {
120
+ prompt: input.prompt,
121
+ responseSchema: input.responseSchema,
122
+ defaults: input.defaults,
123
+ subject: input.subject,
124
+ resumeToken,
125
+ },
126
+ };
127
+ }
128
+ return {
129
+ ok: true,
130
+ status: "ok",
131
+ output: result.items,
132
+ requiresApproval: null,
133
+ requiresInput: null,
134
+ };
135
+ }
136
+ catch (err) {
137
+ return {
138
+ ok: false,
139
+ status: "error",
140
+ output: [],
141
+ requiresApproval: null,
142
+ requiresInput: null,
143
+ error: {
144
+ type: "runtime_error",
145
+ message: err?.message ?? String(err),
146
+ },
147
+ };
148
+ }
149
+ }
150
+ async resume(token, options = {}) {
151
+ const { approved, response, cancel } = options;
152
+ const intentCount = Number(typeof approved === "boolean") +
153
+ Number(response !== undefined) +
154
+ Number(cancel === true);
155
+ if (intentCount > 1) {
156
+ throw new Error("resume accepts only one of approved, response, or cancel");
157
+ }
158
+ if (intentCount === 0) {
159
+ throw new Error("resume requires approved, response, or cancel");
160
+ }
161
+ const payload = decodeSdkResumePayload(token);
162
+ let sdkCommandInputState;
163
+ if (payload.resumeMode === "same_stage") {
164
+ sdkCommandInputState = await loadSdkCommandInputResumeState(this.#options, payload.stateKey);
165
+ }
166
+ if (cancel === true) {
167
+ if (payload.resumeMode === "same_stage") {
168
+ await deleteStateJson({ env: sdkStateEnv(this.#options), key: payload.stateKey });
169
+ }
170
+ return {
171
+ ok: true,
172
+ status: "cancelled",
173
+ output: [],
174
+ requiresApproval: null,
175
+ requiresInput: null,
176
+ };
177
+ }
178
+ const expectsInput = payload.inputSchema !== undefined || payload.resumeMode === "same_stage";
179
+ if (expectsInput) {
180
+ if (approved !== undefined) {
181
+ throw new Error("resume token expects an input response, not approved");
182
+ }
183
+ if (response === undefined) {
184
+ throw new Error("resume token expects response");
185
+ }
186
+ }
187
+ else {
188
+ if (response !== undefined) {
189
+ throw new Error("resume token expects approved=true|false, not response");
190
+ }
191
+ if (typeof approved !== "boolean") {
192
+ throw new Error("resume token expects approved=true|false");
193
+ }
194
+ if (approved === false) {
195
+ return {
196
+ ok: true,
197
+ status: "cancelled",
198
+ output: [],
199
+ requiresApproval: null,
200
+ requiresInput: null,
201
+ };
202
+ }
203
+ }
204
+ const resumeIndex = sdkCommandInputState?.resumeAtIndex ?? payload.resumeAtIndex ?? 0;
205
+ let resumeItems = sdkCommandInputState?.items ?? payload.items ?? [];
206
+ let requestInputResume;
207
+ if (response !== undefined) {
208
+ const schema = sdkCommandInputState?.inputSchema ?? payload.inputSchema;
209
+ if (schema === undefined) {
210
+ throw new Error("resume token does not support input responses");
211
+ }
212
+ let validator;
213
+ try {
214
+ validator = compileCached(schema);
215
+ }
216
+ catch {
217
+ throw new Error("resume token input schema is invalid");
218
+ }
219
+ const ok = validator(response);
220
+ if (!ok) {
221
+ const first = validator.errors?.[0];
222
+ throw new Error(`response does not match schema at ${first?.instancePath || "/"}: ${first?.message || "invalid"}`);
223
+ }
224
+ if (payload.resumeMode === "same_stage") {
225
+ resumeItems = sdkCommandInputState.items;
226
+ requestInputResume = {
227
+ state: sdkCommandInputState.commandInput,
228
+ response,
229
+ onConsumed: async () => {
230
+ await deleteStateJson({ env: sdkStateEnv(this.#options), key: payload.stateKey });
231
+ },
232
+ };
233
+ }
234
+ else {
235
+ resumeItems = [response];
236
+ }
237
+ }
238
+ const remainingStages = this.#stages.slice(resumeIndex);
239
+ const ctx = {
240
+ env: this.#options.env,
241
+ stateDir: this.#options.stateDir,
242
+ mode: "sdk",
243
+ };
244
+ try {
245
+ const result = await runPipelineInternal({
246
+ stages: remainingStages,
247
+ ctx,
248
+ input: resumeItems,
249
+ requestInputResume,
250
+ });
251
+ if (result.halted &&
252
+ result.items.length === 1 &&
253
+ result.items[0]?.type === "approval_request") {
254
+ const approval = result.items[0];
255
+ const resumeToken = encodeToken({
256
+ protocolVersion: 1,
257
+ v: 1,
258
+ stageIndex: resumeIndex + (result.haltedAt?.index ?? 0),
259
+ resumeAtIndex: resumeIndex + (result.haltedAt?.index ?? 0) + 1,
260
+ items: approval.items,
261
+ prompt: approval.prompt,
262
+ });
263
+ return {
264
+ ok: true,
265
+ status: "needs_approval",
266
+ output: [],
267
+ requiresApproval: {
268
+ prompt: approval.prompt,
269
+ items: approval.items,
270
+ resumeToken,
271
+ },
272
+ requiresInput: null,
273
+ };
274
+ }
275
+ if (result.halted && result.items.length === 1 && result.items[0]?.type === "input_request") {
276
+ const input = result.items[0];
277
+ const inputStageIndex = resumeIndex + (result.haltedAt?.index ?? 0);
278
+ const resumeMode = input.commandInput ? "same_stage" : "next_stage";
279
+ const stateKey = resumeMode === "same_stage"
280
+ ? await saveSdkCommandInputResumeState(this.#options, {
281
+ resumeAtIndex: inputStageIndex,
282
+ items: input.items ?? [],
283
+ inputSchema: input.responseSchema,
284
+ ...(input.subject !== undefined ? { inputSubject: input.subject } : null),
285
+ commandInput: input.commandInput,
286
+ })
287
+ : undefined;
288
+ const resumeToken = encodeToken({
289
+ protocolVersion: 1,
290
+ v: 1,
291
+ stageIndex: inputStageIndex,
292
+ resumeAtIndex: resumeMode === "same_stage" ? inputStageIndex : inputStageIndex + 1,
293
+ resumeMode,
294
+ ...(resumeMode === "same_stage"
295
+ ? { stateKey }
296
+ : { items: [], inputSchema: input.responseSchema }),
297
+ inputSubject: input.subject,
298
+ });
299
+ return {
300
+ ok: true,
301
+ status: "needs_input",
302
+ output: [],
303
+ requiresApproval: null,
304
+ requiresInput: {
305
+ prompt: input.prompt,
306
+ responseSchema: input.responseSchema,
307
+ defaults: input.defaults,
308
+ subject: input.subject,
309
+ resumeToken,
310
+ },
311
+ };
312
+ }
313
+ return {
314
+ ok: true,
315
+ status: "ok",
316
+ output: result.items,
317
+ requiresApproval: null,
318
+ requiresInput: null,
319
+ };
320
+ }
321
+ catch (err) {
322
+ return {
323
+ ok: false,
324
+ status: "error",
325
+ output: [],
326
+ requiresApproval: null,
327
+ requiresInput: null,
328
+ error: {
329
+ type: "runtime_error",
330
+ message: err?.message ?? String(err),
331
+ },
332
+ };
333
+ }
334
+ }
335
+ clone() {
336
+ const cloned = new Lobster(this.#options);
337
+ cloned.#stages = [...this.#stages];
338
+ cloned.#meta = this.#meta ? { ...this.#meta } : null;
339
+ return cloned;
340
+ }
341
+ }
342
+ function decodeSdkResumePayload(token) {
343
+ const payload = decodeToken(token);
344
+ if (!payload || typeof payload !== "object") {
345
+ throw new Error("Invalid token");
346
+ }
347
+ const data = payload;
348
+ if (data.protocolVersion !== 1 || data.v !== 1) {
349
+ throw new Error("Invalid token");
350
+ }
351
+ if (typeof data.resumeAtIndex !== "number" ||
352
+ !Number.isInteger(data.resumeAtIndex) ||
353
+ data.resumeAtIndex < 0) {
354
+ throw new Error("Invalid token");
355
+ }
356
+ if (data.items !== undefined && !Array.isArray(data.items)) {
357
+ throw new Error("Invalid token");
358
+ }
359
+ if (data.resumeMode !== undefined &&
360
+ (typeof data.resumeMode !== "string" || !["next_stage", "same_stage"].includes(data.resumeMode))) {
361
+ throw new Error("Invalid token");
362
+ }
363
+ if (data.resumeMode === "same_stage") {
364
+ if (typeof data.stateKey !== "string" || data.stateKey.length === 0) {
365
+ throw new Error("Invalid token");
366
+ }
367
+ }
368
+ else if (data.stateKey !== undefined) {
369
+ throw new Error("Invalid token");
370
+ }
371
+ if (data.commandInput !== undefined)
372
+ throw new Error("Invalid token");
373
+ return data;
374
+ }
375
+ function sdkStateEnv(options) {
376
+ return options.stateDir
377
+ ? { ...(options.env ?? process.env), LOBSTER_STATE_DIR: options.stateDir }
378
+ : (options.env ?? process.env);
379
+ }
380
+ async function saveSdkCommandInputResumeState(options, state) {
381
+ const stateKey = `sdk_resume_${randomUUID()}`;
382
+ await writeStateJson({ env: sdkStateEnv(options), key: stateKey, value: state });
383
+ return stateKey;
384
+ }
385
+ async function loadSdkCommandInputResumeState(options, stateKey) {
386
+ const stored = await readStateJson({ env: sdkStateEnv(options), key: stateKey });
387
+ if (!stored || typeof stored !== "object")
388
+ throw new Error("SDK resume state not found");
389
+ const data = stored;
390
+ if (typeof data.resumeAtIndex !== "number" ||
391
+ !Number.isInteger(data.resumeAtIndex) ||
392
+ data.resumeAtIndex < 0) {
393
+ throw new Error("Invalid SDK resume state");
394
+ }
395
+ if (!Array.isArray(data.items))
396
+ throw new Error("Invalid SDK resume state");
397
+ if (data.inputSchema === undefined)
398
+ throw new Error("Invalid SDK resume state");
399
+ data.commandInput = validateCommandInputState(data.commandInput);
400
+ return data;
401
+ }
402
+ //# sourceMappingURL=Lobster.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Lobster.js","sourceRoot":"","sources":["../../../src/sdk/Lobster.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Lobster SDK - Workflow runtime for AI agents
3
+ *
4
+ * @example
5
+ * import { Lobster, approve, exec } from 'lobster-sdk';
6
+ *
7
+ * const workflow = new Lobster()
8
+ * .pipe(exec('gh pr view 123 --repo owner/repo --json title,url'))
9
+ * .pipe(items => items.filter(e => e.unread))
10
+ * .pipe(approve({ prompt: 'Process these emails?' }))
11
+ * .pipe(async function* (items) {
12
+ * for (const item of items) {
13
+ * yield { ...item, processed: true };
14
+ * }
15
+ * });
16
+ *
17
+ * const result = await workflow.run();
18
+ */
19
+ export { Lobster } from "./Lobster.js";
20
+ export { approve } from "./primitives/approve.js";
21
+ export { exec } from "./primitives/exec.js";
22
+ export { stateGet, stateSet, state } from "./primitives/state.js";
23
+ export { diffLast } from "./primitives/diff.js";
24
+ export { runPipeline } from "./runtime.js";
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/sdk/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Approve primitive - Creates a hard halt point requiring human approval
3
+ *
4
+ * @example
5
+ * import { Lobster, approve } from 'lobster-sdk';
6
+ *
7
+ * new Lobster()
8
+ * .pipe(fetchEmails())
9
+ * .pipe(approve({ prompt: 'Send these replies?' }))
10
+ * .pipe(sendReplies())
11
+ */
12
+ /**
13
+ * Create an approval stage
14
+ *
15
+ * @param {Object} [options]
16
+ * @param {string} [options.prompt='Approve?'] - Prompt to show user
17
+ * @param {boolean} [options.preview=true] - Include items in approval request
18
+ * @returns {Object} Stage object with run method
19
+ */
20
+ export function approve(options = {}) {
21
+ const prompt = options.prompt ?? "Approve?";
22
+ const preview = options.preview !== false;
23
+ return {
24
+ type: "approve",
25
+ prompt,
26
+ async run({ input, ctx: _ctx }) {
27
+ // Collect all items
28
+ const items = [];
29
+ for await (const item of input) {
30
+ items.push(item);
31
+ }
32
+ // In SDK mode, always emit approval request and halt
33
+ return {
34
+ halt: true,
35
+ output: (async function* () {
36
+ yield {
37
+ type: "approval_request",
38
+ prompt,
39
+ items: preview ? items : [],
40
+ itemCount: items.length,
41
+ };
42
+ })(),
43
+ };
44
+ },
45
+ };
46
+ }
47
+ //# sourceMappingURL=approve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approve.js","sourceRoot":"","sources":["../../../../src/sdk/primitives/approve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH;;;;;;;GAOG;AACH,MAAM,UAAU,OAAO,CAAC,OAAO,GAAQ,EAAE;IACvC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,UAAU,CAAC;IAC5C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,KAAK,KAAK,CAAC;IAE1C,OAAO;QACL,IAAI,EAAE,SAAS;QACf,MAAM;QAEN,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE;YAC5B,oBAAoB;YACpB,MAAM,KAAK,GAAG,EAAE,CAAC;YACjB,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBAC/B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,CAAC;YAED,qDAAqD;YACrD,OAAO;gBACL,IAAI,EAAE,IAAI;gBACV,MAAM,EAAE,CAAC,KAAK,SAAS,CAAC;oBACtB,MAAM;wBACJ,IAAI,EAAE,kBAAkB;wBACxB,MAAM;wBACN,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;wBAC3B,SAAS,EAAE,KAAK,CAAC,MAAM;qBACxB,CAAC;gBACJ,CAAC,CAAC,EAAE;aACL,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,156 @@
1
+ /**
2
+ * Diff primitive - Compare current value against last stored value
3
+ *
4
+ * @example
5
+ * import { Lobster, diffLast } from 'lobster-sdk';
6
+ *
7
+ * new Lobster()
8
+ * .pipe(fetchPRStatus())
9
+ * .pipe(diffLast('pr-123'))
10
+ * .pipe(result => {
11
+ * if (result.changed) {
12
+ * console.log('PR changed!', result.changes);
13
+ * }
14
+ * });
15
+ */
16
+ import { promises as fsp } from "node:fs";
17
+ import os from "node:os";
18
+ import path from "node:path";
19
+ import { ensureDirectory, isJsonSyntaxError, writeFileAtomic } from "../../state/store.js";
20
+ /**
21
+ * Get the state directory
22
+ * @param {Object} ctx
23
+ * @returns {string}
24
+ */
25
+ function getStateDir(ctx) {
26
+ return (ctx?.stateDir ||
27
+ (ctx?.env?.LOBSTER_STATE_DIR && String(ctx.env.LOBSTER_STATE_DIR).trim()) ||
28
+ path.join(os.homedir(), ".lobster", "state"));
29
+ }
30
+ /**
31
+ * Convert a key to a safe file path
32
+ * @param {string} stateDir
33
+ * @param {string} key
34
+ * @returns {string}
35
+ */
36
+ function keyToPath(stateDir, key) {
37
+ const safe = String(key)
38
+ .toLowerCase()
39
+ .replace(/[^a-z0-9._-]+/g, "_")
40
+ .replace(/_+/g, "_")
41
+ .replace(/^_+|_+$/g, "");
42
+ if (!safe)
43
+ throw new Error("state key is empty/invalid");
44
+ return path.join(stateDir, `${safe}.json`);
45
+ }
46
+ /**
47
+ * Stable JSON stringify for comparison
48
+ * @param {any} value
49
+ * @returns {string}
50
+ */
51
+ function stableStringify(value) {
52
+ return JSON.stringify(value, (_k, v) => {
53
+ if (v && typeof v === "object" && !Array.isArray(v)) {
54
+ return Object.fromEntries(Object.keys(v)
55
+ .sort()
56
+ .map((k) => [k, v[k]]));
57
+ }
58
+ return v;
59
+ });
60
+ }
61
+ /**
62
+ * Create a diff.last stage
63
+ *
64
+ * Compares the input against the last stored value for the given key,
65
+ * stores the new value, and outputs a diff result.
66
+ *
67
+ * @param {string} key - State key to compare against
68
+ * @param {Object} [options]
69
+ * @param {boolean} [options.changesOnly=false] - If true, suppress output when unchanged
70
+ * @returns {Object} Stage object with run method
71
+ */
72
+ export function diffLast(key, options = {}) {
73
+ if (!key)
74
+ throw new Error("diffLast requires a key");
75
+ const changesOnly = options.changesOnly === true;
76
+ return {
77
+ type: "diff.last",
78
+ key,
79
+ async run({ input, ctx }) {
80
+ // Collect all input items
81
+ const items = [];
82
+ for await (const item of input) {
83
+ items.push(item);
84
+ }
85
+ const value = items.length === 1 ? items[0] : items;
86
+ const stateDir = getStateDir(ctx);
87
+ const filePath = keyToPath(stateDir, key);
88
+ // Read previous value
89
+ let before = null;
90
+ try {
91
+ const text = await fsp.readFile(filePath, "utf8");
92
+ before = JSON.parse(text);
93
+ }
94
+ catch (err) {
95
+ if (err?.code !== "ENOENT" && !isJsonSyntaxError(err)) {
96
+ throw err;
97
+ }
98
+ }
99
+ // Compare
100
+ const changed = stableStringify(before) !== stableStringify(value);
101
+ // Store new value
102
+ await ensureDirectory(stateDir);
103
+ await writeFileAtomic(filePath, JSON.stringify(value, null, 2) + "\n");
104
+ // Build result
105
+ const result = {
106
+ kind: "diff.last",
107
+ key,
108
+ changed,
109
+ before,
110
+ after: value,
111
+ };
112
+ // If changesOnly and no change, output suppressed marker
113
+ if (changesOnly && !changed) {
114
+ return {
115
+ output: (async function* () {
116
+ yield { kind: "diff.last", key, changed: false, suppressed: true };
117
+ })(),
118
+ };
119
+ }
120
+ return {
121
+ output: (async function* () {
122
+ yield result;
123
+ })(),
124
+ };
125
+ },
126
+ };
127
+ }
128
+ /**
129
+ * Diff and store directly (not as a pipeline stage)
130
+ * @param {string} key
131
+ * @param {any} value
132
+ * @param {Object} [ctx]
133
+ * @returns {Promise<{before: any, after: any, changed: boolean}>}
134
+ */
135
+ export async function diffAndStoreValue(key, value, ctx = {}) {
136
+ const stateDir = getStateDir(ctx);
137
+ const filePath = keyToPath(stateDir, key);
138
+ // Read previous value
139
+ let before = null;
140
+ try {
141
+ const text = await fsp.readFile(filePath, "utf8");
142
+ before = JSON.parse(text);
143
+ }
144
+ catch (err) {
145
+ if (err?.code !== "ENOENT" && !isJsonSyntaxError(err)) {
146
+ throw err;
147
+ }
148
+ }
149
+ // Compare
150
+ const changed = stableStringify(before) !== stableStringify(value);
151
+ // Store new value
152
+ await ensureDirectory(stateDir);
153
+ await writeFileAtomic(filePath, JSON.stringify(value, null, 2) + "\n");
154
+ return { before, after: value, changed };
155
+ }
156
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../../../src/sdk/primitives/diff.ts"],"names":[],"mappings":"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"}