@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.
- package/LICENSE +21 -0
- package/README.md +353 -0
- package/VISION.md +249 -0
- package/bin/clawd.invoke.js +18 -0
- package/bin/lobster.js +24 -0
- package/bin/openclaw.invoke.js +21 -0
- package/dist/src/cli.js +793 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/commands/commands_list.js +49 -0
- package/dist/src/commands/commands_list.js.map +1 -0
- package/dist/src/commands/registry.js +66 -0
- package/dist/src/commands/registry.js.map +1 -0
- package/dist/src/commands/stdlib/approve.js +77 -0
- package/dist/src/commands/stdlib/approve.js.map +1 -0
- package/dist/src/commands/stdlib/ask.js +171 -0
- package/dist/src/commands/stdlib/ask.js.map +1 -0
- package/dist/src/commands/stdlib/dedupe.js +55 -0
- package/dist/src/commands/stdlib/dedupe.js.map +1 -0
- package/dist/src/commands/stdlib/diff_last.js +35 -0
- package/dist/src/commands/stdlib/diff_last.js.map +1 -0
- package/dist/src/commands/stdlib/email_triage.js +279 -0
- package/dist/src/commands/stdlib/email_triage.js.map +1 -0
- package/dist/src/commands/stdlib/exec.js +130 -0
- package/dist/src/commands/stdlib/exec.js.map +1 -0
- package/dist/src/commands/stdlib/gog_gmail_search.js +94 -0
- package/dist/src/commands/stdlib/gog_gmail_search.js.map +1 -0
- package/dist/src/commands/stdlib/gog_gmail_send.js +104 -0
- package/dist/src/commands/stdlib/gog_gmail_send.js.map +1 -0
- package/dist/src/commands/stdlib/group_by.js +59 -0
- package/dist/src/commands/stdlib/group_by.js.map +1 -0
- package/dist/src/commands/stdlib/head.js +34 -0
- package/dist/src/commands/stdlib/head.js.map +1 -0
- package/dist/src/commands/stdlib/json.js +20 -0
- package/dist/src/commands/stdlib/json.js.map +1 -0
- package/dist/src/commands/stdlib/llm_invoke.js +758 -0
- package/dist/src/commands/stdlib/llm_invoke.js.map +1 -0
- package/dist/src/commands/stdlib/llm_task_invoke.js +2 -0
- package/dist/src/commands/stdlib/llm_task_invoke.js.map +1 -0
- package/dist/src/commands/stdlib/map.js +104 -0
- package/dist/src/commands/stdlib/map.js.map +1 -0
- package/dist/src/commands/stdlib/openclaw_invoke.js +136 -0
- package/dist/src/commands/stdlib/openclaw_invoke.js.map +1 -0
- package/dist/src/commands/stdlib/pick.js +45 -0
- package/dist/src/commands/stdlib/pick.js.map +1 -0
- package/dist/src/commands/stdlib/sort.js +86 -0
- package/dist/src/commands/stdlib/sort.js.map +1 -0
- package/dist/src/commands/stdlib/state.js +76 -0
- package/dist/src/commands/stdlib/state.js.map +1 -0
- package/dist/src/commands/stdlib/table.js +57 -0
- package/dist/src/commands/stdlib/table.js.map +1 -0
- package/dist/src/commands/stdlib/template.js +126 -0
- package/dist/src/commands/stdlib/template.js.map +1 -0
- package/dist/src/commands/stdlib/where.js +81 -0
- package/dist/src/commands/stdlib/where.js.map +1 -0
- package/dist/src/commands/types.js +2 -0
- package/dist/src/commands/types.js.map +1 -0
- package/dist/src/commands/workflows/workflows_list.js +24 -0
- package/dist/src/commands/workflows/workflows_list.js.map +1 -0
- package/dist/src/commands/workflows/workflows_run.js +74 -0
- package/dist/src/commands/workflows/workflows_run.js.map +1 -0
- package/dist/src/core/cost_tracker.js +119 -0
- package/dist/src/core/cost_tracker.js.map +1 -0
- package/dist/src/core/filters.js +102 -0
- package/dist/src/core/filters.js.map +1 -0
- package/dist/src/core/index.js +7 -0
- package/dist/src/core/index.js.map +1 -0
- package/dist/src/core/retry.js +89 -0
- package/dist/src/core/retry.js.map +1 -0
- package/dist/src/core/tool_runtime.js +289 -0
- package/dist/src/core/tool_runtime.js.map +1 -0
- package/dist/src/input_request.js +430 -0
- package/dist/src/input_request.js.map +1 -0
- package/dist/src/parser.js +145 -0
- package/dist/src/parser.js.map +1 -0
- package/dist/src/pipeline_resume_state.js +186 -0
- package/dist/src/pipeline_resume_state.js.map +1 -0
- package/dist/src/read_line.js +50 -0
- package/dist/src/read_line.js.map +1 -0
- package/dist/src/recipes/github/index.js +16 -0
- package/dist/src/recipes/github/index.js.map +1 -0
- package/dist/src/recipes/github/pr-monitor.js +248 -0
- package/dist/src/recipes/github/pr-monitor.js.map +1 -0
- package/dist/src/recipes/github/stages/pr-view.js +107 -0
- package/dist/src/recipes/github/stages/pr-view.js.map +1 -0
- package/dist/src/recipes/index.js +7 -0
- package/dist/src/recipes/index.js.map +1 -0
- package/dist/src/recipes/registry.js +30 -0
- package/dist/src/recipes/registry.js.map +1 -0
- package/dist/src/renderers/json.js +13 -0
- package/dist/src/renderers/json.js.map +1 -0
- package/dist/src/resume.js +179 -0
- package/dist/src/resume.js.map +1 -0
- package/dist/src/runtime.js +230 -0
- package/dist/src/runtime.js.map +1 -0
- package/dist/src/sdk/Lobster.js +402 -0
- package/dist/src/sdk/Lobster.js.map +1 -0
- package/dist/src/sdk/index.js +25 -0
- package/dist/src/sdk/index.js.map +1 -0
- package/dist/src/sdk/primitives/approve.js +47 -0
- package/dist/src/sdk/primitives/approve.js.map +1 -0
- package/dist/src/sdk/primitives/diff.js +156 -0
- package/dist/src/sdk/primitives/diff.js.map +1 -0
- package/dist/src/sdk/primitives/exec.js +167 -0
- package/dist/src/sdk/primitives/exec.js.map +1 -0
- package/dist/src/sdk/primitives/state.js +203 -0
- package/dist/src/sdk/primitives/state.js.map +1 -0
- package/dist/src/sdk/runtime.js +131 -0
- package/dist/src/sdk/runtime.js.map +1 -0
- package/dist/src/sdk/token.js +9 -0
- package/dist/src/sdk/token.js.map +1 -0
- package/dist/src/shell.js +39 -0
- package/dist/src/shell.js.map +1 -0
- package/dist/src/state/store.js +337 -0
- package/dist/src/state/store.js.map +1 -0
- package/dist/src/token.js +15 -0
- package/dist/src/token.js.map +1 -0
- package/dist/src/validation.js +38 -0
- package/dist/src/validation.js.map +1 -0
- package/dist/src/workflows/file.js +2405 -0
- package/dist/src/workflows/file.js.map +1 -0
- package/dist/src/workflows/github_pr_monitor.js +167 -0
- package/dist/src/workflows/github_pr_monitor.js.map +1 -0
- package/dist/src/workflows/graph.js +234 -0
- package/dist/src/workflows/graph.js.map +1 -0
- package/dist/src/workflows/registry.js +57 -0
- package/dist/src/workflows/registry.js.map +1 -0
- package/dist/test/approval_id.test.js +171 -0
- package/dist/test/approval_id.test.js.map +1 -0
- package/dist/test/approve_preview.test.js +38 -0
- package/dist/test/approve_preview.test.js.map +1 -0
- package/dist/test/clawd_invoke.test.js +124 -0
- package/dist/test/clawd_invoke.test.js.map +1 -0
- package/dist/test/clawd_invoke_legacy.test.js +63 -0
- package/dist/test/clawd_invoke_legacy.test.js.map +1 -0
- package/dist/test/cli_run_file_args_json.test.js +27 -0
- package/dist/test/cli_run_file_args_json.test.js.map +1 -0
- package/dist/test/commands_list.test.js +44 -0
- package/dist/test/commands_list.test.js.map +1 -0
- package/dist/test/condition_comparison.test.js +127 -0
- package/dist/test/condition_comparison.test.js.map +1 -0
- package/dist/test/core_tool_runtime.test.js +160 -0
- package/dist/test/core_tool_runtime.test.js.map +1 -0
- package/dist/test/cost_tracker.test.js +231 -0
- package/dist/test/cost_tracker.test.js.map +1 -0
- package/dist/test/dedupe.test.js +48 -0
- package/dist/test/dedupe.test.js.map +1 -0
- package/dist/test/diff_last.test.js +70 -0
- package/dist/test/diff_last.test.js.map +1 -0
- package/dist/test/doctor.test.js +19 -0
- package/dist/test/doctor.test.js.map +1 -0
- package/dist/test/dry_run.test.js +502 -0
- package/dist/test/dry_run.test.js.map +1 -0
- package/dist/test/email_triage.test.js +296 -0
- package/dist/test/email_triage.test.js.map +1 -0
- package/dist/test/exec_stdin.test.js +43 -0
- package/dist/test/exec_stdin.test.js.map +1 -0
- package/dist/test/for_each.test.js +228 -0
- package/dist/test/for_each.test.js.map +1 -0
- package/dist/test/github_pr_notify_format.test.js +19 -0
- package/dist/test/github_pr_notify_format.test.js.map +1 -0
- package/dist/test/github_pr_summary.test.js +41 -0
- package/dist/test/github_pr_summary.test.js.map +1 -0
- package/dist/test/group_by.test.js +43 -0
- package/dist/test/group_by.test.js.map +1 -0
- package/dist/test/llm_invoke.test.js +166 -0
- package/dist/test/llm_invoke.test.js.map +1 -0
- package/dist/test/llm_task_invoke.test.js +416 -0
- package/dist/test/llm_task_invoke.test.js.map +1 -0
- package/dist/test/map.test.js +41 -0
- package/dist/test/map.test.js.map +1 -0
- package/dist/test/multi_approval_resume.test.js +48 -0
- package/dist/test/multi_approval_resume.test.js.map +1 -0
- package/dist/test/on_error.test.js +151 -0
- package/dist/test/on_error.test.js.map +1 -0
- package/dist/test/openclaw_invoke_alias.test.js +13 -0
- package/dist/test/openclaw_invoke_alias.test.js.map +1 -0
- package/dist/test/parallel.test.js +184 -0
- package/dist/test/parallel.test.js.map +1 -0
- package/dist/test/parser.test.js +39 -0
- package/dist/test/parser.test.js.map +1 -0
- package/dist/test/read_line.test.js +25 -0
- package/dist/test/read_line.test.js.map +1 -0
- package/dist/test/request_input.test.js +946 -0
- package/dist/test/request_input.test.js.map +1 -0
- package/dist/test/resume.test.js +82 -0
- package/dist/test/resume.test.js.map +1 -0
- package/dist/test/sdk_lobster.test.js +177 -0
- package/dist/test/sdk_lobster.test.js.map +1 -0
- package/dist/test/shell.test.js +31 -0
- package/dist/test/shell.test.js.map +1 -0
- package/dist/test/sort.test.js +51 -0
- package/dist/test/sort.test.js.map +1 -0
- package/dist/test/state.test.js +336 -0
- package/dist/test/state.test.js.map +1 -0
- package/dist/test/step_retry.test.js +254 -0
- package/dist/test/step_retry.test.js.map +1 -0
- package/dist/test/step_timeout.test.js +154 -0
- package/dist/test/step_timeout.test.js.map +1 -0
- package/dist/test/template.test.js +46 -0
- package/dist/test/template.test.js.map +1 -0
- package/dist/test/template_filters.test.js +107 -0
- package/dist/test/template_filters.test.js.map +1 -0
- package/dist/test/tool_envelope_version.test.js +15 -0
- package/dist/test/tool_envelope_version.test.js.map +1 -0
- package/dist/test/tool_mode.test.js +83 -0
- package/dist/test/tool_mode.test.js.map +1 -0
- package/dist/test/validation.test.js +28 -0
- package/dist/test/validation.test.js.map +1 -0
- package/dist/test/workflow_args_env.test.js +41 -0
- package/dist/test/workflow_args_env.test.js.map +1 -0
- package/dist/test/workflow_composition.test.js +238 -0
- package/dist/test/workflow_composition.test.js.map +1 -0
- package/dist/test/workflow_file.test.js +1399 -0
- package/dist/test/workflow_file.test.js.map +1 -0
- package/dist/test/workflow_graph.test.js +97 -0
- package/dist/test/workflow_graph.test.js.map +1 -0
- package/dist/test/workflows.test.js +32 -0
- package/dist/test/workflows.test.js.map +1 -0
- package/package.json +75 -0
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
const DEFAULTS = {
|
|
2
|
+
max: 1,
|
|
3
|
+
backoff: "fixed",
|
|
4
|
+
delay_ms: 1000,
|
|
5
|
+
max_delay_ms: 30000,
|
|
6
|
+
jitter: false,
|
|
7
|
+
};
|
|
8
|
+
export function resolveRetryConfig(raw) {
|
|
9
|
+
if (!raw)
|
|
10
|
+
return { ...DEFAULTS };
|
|
11
|
+
return {
|
|
12
|
+
max: raw.max ?? DEFAULTS.max,
|
|
13
|
+
backoff: raw.backoff ?? DEFAULTS.backoff,
|
|
14
|
+
delay_ms: raw.delay_ms ?? DEFAULTS.delay_ms,
|
|
15
|
+
max_delay_ms: raw.max_delay_ms ?? DEFAULTS.max_delay_ms,
|
|
16
|
+
jitter: raw.jitter ?? DEFAULTS.jitter,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function computeDelay(config, attempt) {
|
|
20
|
+
let delay;
|
|
21
|
+
if (config.backoff === "exponential") {
|
|
22
|
+
delay = Math.min(config.delay_ms * Math.pow(2, attempt), config.max_delay_ms);
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
delay = config.delay_ms;
|
|
26
|
+
}
|
|
27
|
+
if (config.jitter) {
|
|
28
|
+
// +/- 10% randomization, clamped to max_delay_ms
|
|
29
|
+
const jitterRange = delay * 0.1;
|
|
30
|
+
delay += (Math.random() * 2 - 1) * jitterRange;
|
|
31
|
+
delay = Math.min(delay, config.max_delay_ms);
|
|
32
|
+
}
|
|
33
|
+
return Math.max(0, Math.round(delay));
|
|
34
|
+
}
|
|
35
|
+
function abortableSleep(ms, signal) {
|
|
36
|
+
if (!signal)
|
|
37
|
+
return new Promise((r) => setTimeout(r, ms));
|
|
38
|
+
return new Promise((resolve, reject) => {
|
|
39
|
+
if (signal.aborted) {
|
|
40
|
+
reject(signal.reason ?? new DOMException("The operation was aborted.", "AbortError"));
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
let timer;
|
|
44
|
+
const onAbort = () => {
|
|
45
|
+
clearTimeout(timer);
|
|
46
|
+
reject(signal.reason ?? new DOMException("The operation was aborted.", "AbortError"));
|
|
47
|
+
};
|
|
48
|
+
timer = setTimeout(() => {
|
|
49
|
+
signal.removeEventListener("abort", onAbort);
|
|
50
|
+
resolve();
|
|
51
|
+
}, ms);
|
|
52
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Execute `fn` with retries according to the given config.
|
|
57
|
+
* External cancellation (options.signal aborted) always propagates immediately.
|
|
58
|
+
* Per-attempt timeout AbortErrors flow through shouldRetry like any other error,
|
|
59
|
+
* so timeout_ms + retry.max combinations work as documented.
|
|
60
|
+
* Returns the result of the first successful call, or throws
|
|
61
|
+
* the last error after all retries are exhausted.
|
|
62
|
+
*/
|
|
63
|
+
export async function withRetry(fn, config, options) {
|
|
64
|
+
let lastError;
|
|
65
|
+
for (let attempt = 0; attempt < config.max; attempt++) {
|
|
66
|
+
try {
|
|
67
|
+
return await fn();
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
// Only propagate AbortError immediately for external workflow cancellation.
|
|
71
|
+
// Per-attempt timeout AbortErrors (options.signal not aborted) flow through
|
|
72
|
+
// shouldRetry so timeout_ms + retry.max combinations work as documented.
|
|
73
|
+
if ((err?.name === "AbortError" || err?.code === "ABORT_ERR") && options?.signal?.aborted) {
|
|
74
|
+
throw err;
|
|
75
|
+
}
|
|
76
|
+
lastError = err;
|
|
77
|
+
if (attempt + 1 < config.max) {
|
|
78
|
+
if (options?.shouldRetry && !options.shouldRetry(err, attempt + 1)) {
|
|
79
|
+
throw err;
|
|
80
|
+
}
|
|
81
|
+
const delay = computeDelay(config, attempt);
|
|
82
|
+
options?.onRetry?.(attempt + 1, err, delay);
|
|
83
|
+
await abortableSleep(delay, options?.signal);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
throw lastError;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../../src/core/retry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
import { Writable } from "node:stream";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { createDefaultRegistry } from "../commands/registry.js";
|
|
4
|
+
import { parsePipeline } from "../parser.js";
|
|
5
|
+
import { decodeResumeToken, kindFromStateKey } from "../resume.js";
|
|
6
|
+
import { runPipeline } from "../runtime.js";
|
|
7
|
+
import { encodeToken } from "../token.js";
|
|
8
|
+
import { deleteStateJson, deleteApprovalId, findStateKeyByApprovalId, cleanupApprovalIndexByStateKey, } from "../state/store.js";
|
|
9
|
+
import { WorkflowResumeArgumentError, runWorkflowFile } from "../workflows/file.js";
|
|
10
|
+
import { finalizePipelineToolRun, loadPipelineResumeState, validatePipelineInputResponse, } from "../pipeline_resume_state.js";
|
|
11
|
+
export async function runToolRequest({ pipeline, filePath, args, ctx = {}, }) {
|
|
12
|
+
const runtime = createToolContext(ctx);
|
|
13
|
+
const hasPipeline = typeof pipeline === "string" && pipeline.trim().length > 0;
|
|
14
|
+
const hasFile = typeof filePath === "string" && filePath.trim().length > 0;
|
|
15
|
+
if (!hasPipeline && !hasFile) {
|
|
16
|
+
return errorEnvelope("parse_error", "run requires either pipeline or filePath");
|
|
17
|
+
}
|
|
18
|
+
if (hasPipeline && hasFile) {
|
|
19
|
+
return errorEnvelope("parse_error", "run accepts either pipeline or filePath, not both");
|
|
20
|
+
}
|
|
21
|
+
if (hasFile) {
|
|
22
|
+
let resolvedFilePath;
|
|
23
|
+
try {
|
|
24
|
+
resolvedFilePath = await resolveWorkflowFile(filePath, runtime.cwd);
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
return errorEnvelope("parse_error", err?.message ?? String(err));
|
|
28
|
+
}
|
|
29
|
+
try {
|
|
30
|
+
const output = await runWorkflowFile({
|
|
31
|
+
filePath: resolvedFilePath,
|
|
32
|
+
args,
|
|
33
|
+
ctx: runtime,
|
|
34
|
+
});
|
|
35
|
+
if (output.status === "needs_approval") {
|
|
36
|
+
return okEnvelope("needs_approval", [], output.requiresApproval ?? null, null);
|
|
37
|
+
}
|
|
38
|
+
if (output.status === "needs_input") {
|
|
39
|
+
return okEnvelope("needs_input", [], null, output.requiresInput ?? null);
|
|
40
|
+
}
|
|
41
|
+
if (output.status === "cancelled") {
|
|
42
|
+
return okEnvelope("cancelled", [], null, null);
|
|
43
|
+
}
|
|
44
|
+
return okEnvelope("ok", output.output, null, null);
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
return errorEnvelope("runtime_error", err?.message ?? String(err));
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
let parsed;
|
|
51
|
+
try {
|
|
52
|
+
parsed = parsePipeline(String(pipeline));
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
return errorEnvelope("parse_error", err?.message ?? String(err));
|
|
56
|
+
}
|
|
57
|
+
try {
|
|
58
|
+
const output = await runPipeline({
|
|
59
|
+
pipeline: parsed,
|
|
60
|
+
registry: runtime.registry,
|
|
61
|
+
input: [],
|
|
62
|
+
stdin: runtime.stdin,
|
|
63
|
+
stdout: runtime.stdout,
|
|
64
|
+
stderr: runtime.stderr,
|
|
65
|
+
env: runtime.env,
|
|
66
|
+
mode: "tool",
|
|
67
|
+
cwd: runtime.cwd,
|
|
68
|
+
llmAdapters: runtime.llmAdapters,
|
|
69
|
+
signal: runtime.signal,
|
|
70
|
+
});
|
|
71
|
+
const finalized = await finalizePipelineToolRun({
|
|
72
|
+
env: runtime.env,
|
|
73
|
+
pipeline: parsed,
|
|
74
|
+
output,
|
|
75
|
+
});
|
|
76
|
+
return okEnvelope(finalized.status, finalized.output, finalized.requiresApproval, finalized.requiresInput);
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
return errorEnvelope("runtime_error", err?.message ?? String(err));
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
export async function resumeToolRequest({ token, approvalId, approved, response, cancel, ctx = {}, }) {
|
|
83
|
+
const runtime = createToolContext(ctx);
|
|
84
|
+
let payload;
|
|
85
|
+
let resolvedApprovalId = approvalId ?? null;
|
|
86
|
+
try {
|
|
87
|
+
// Resolve short approval ID to token if provided
|
|
88
|
+
let resolvedToken;
|
|
89
|
+
if (approvalId) {
|
|
90
|
+
const stateKey = await findStateKeyByApprovalId({ env: runtime.env, approvalId });
|
|
91
|
+
if (!stateKey) {
|
|
92
|
+
return errorEnvelope("parse_error", `Approval ID "${approvalId}" not found or expired`);
|
|
93
|
+
}
|
|
94
|
+
const kind = kindFromStateKey(stateKey);
|
|
95
|
+
resolvedToken = encodeToken({
|
|
96
|
+
protocolVersion: 1,
|
|
97
|
+
v: 1,
|
|
98
|
+
kind,
|
|
99
|
+
stateKey,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
else if (token) {
|
|
103
|
+
resolvedToken = token;
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
return errorEnvelope("parse_error", "resume requires token or approvalId");
|
|
107
|
+
}
|
|
108
|
+
payload = decodeResumeToken(resolvedToken);
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
return errorEnvelope("parse_error", err?.message ?? String(err));
|
|
112
|
+
}
|
|
113
|
+
// Helper: clean up approval ID index after successful use
|
|
114
|
+
const cleanupIndex = async () => {
|
|
115
|
+
if (resolvedApprovalId) {
|
|
116
|
+
await deleteApprovalId({ env: runtime.env, approvalId: resolvedApprovalId });
|
|
117
|
+
}
|
|
118
|
+
else if (payload?.stateKey) {
|
|
119
|
+
await cleanupApprovalIndexByStateKey({ env: runtime.env, stateKey: payload.stateKey });
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
if (cancel === true) {
|
|
123
|
+
await cleanupIndex();
|
|
124
|
+
if (payload.kind === "workflow-file" && payload.stateKey) {
|
|
125
|
+
await deleteStateJson({ env: runtime.env, key: payload.stateKey });
|
|
126
|
+
}
|
|
127
|
+
if (payload.kind === "pipeline-resume" && payload.stateKey) {
|
|
128
|
+
await deleteStateJson({ env: runtime.env, key: payload.stateKey });
|
|
129
|
+
}
|
|
130
|
+
return okEnvelope("cancelled", [], null, null);
|
|
131
|
+
}
|
|
132
|
+
if (payload.kind === "workflow-file") {
|
|
133
|
+
try {
|
|
134
|
+
const output = await runWorkflowFile({
|
|
135
|
+
filePath: payload.filePath,
|
|
136
|
+
ctx: runtime,
|
|
137
|
+
resume: payload,
|
|
138
|
+
approved,
|
|
139
|
+
response,
|
|
140
|
+
cancel,
|
|
141
|
+
});
|
|
142
|
+
if (output.status === "needs_approval") {
|
|
143
|
+
// Don't clean up index — next gate will issue a new approvalId
|
|
144
|
+
return okEnvelope("needs_approval", [], output.requiresApproval ?? null, null);
|
|
145
|
+
}
|
|
146
|
+
if (output.status === "needs_input") {
|
|
147
|
+
return okEnvelope("needs_input", [], null, output.requiresInput ?? null);
|
|
148
|
+
}
|
|
149
|
+
await cleanupIndex();
|
|
150
|
+
if (output.status === "cancelled") {
|
|
151
|
+
return okEnvelope("cancelled", [], null, null);
|
|
152
|
+
}
|
|
153
|
+
return okEnvelope("ok", output.output, null, null);
|
|
154
|
+
}
|
|
155
|
+
catch (err) {
|
|
156
|
+
if (err instanceof WorkflowResumeArgumentError) {
|
|
157
|
+
return errorEnvelope("parse_error", err.message);
|
|
158
|
+
}
|
|
159
|
+
// Don't clean up index on error — allow retry by --id
|
|
160
|
+
return errorEnvelope("runtime_error", err?.message ?? String(err));
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
let resumeState;
|
|
164
|
+
try {
|
|
165
|
+
resumeState = await loadPipelineResumeState(runtime.env, payload.stateKey);
|
|
166
|
+
}
|
|
167
|
+
catch (err) {
|
|
168
|
+
return errorEnvelope("runtime_error", err?.message ?? String(err));
|
|
169
|
+
}
|
|
170
|
+
if (resumeState.haltType === "input_request") {
|
|
171
|
+
if (approved !== undefined) {
|
|
172
|
+
return errorEnvelope("parse_error", "pipeline input resumes require response");
|
|
173
|
+
}
|
|
174
|
+
if (response === undefined) {
|
|
175
|
+
return errorEnvelope("parse_error", "pipeline input resumes require response");
|
|
176
|
+
}
|
|
177
|
+
try {
|
|
178
|
+
validatePipelineInputResponse(resumeState.inputSchema, response);
|
|
179
|
+
}
|
|
180
|
+
catch (err) {
|
|
181
|
+
return errorEnvelope("parse_error", err?.message ?? String(err));
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
if (response !== undefined) {
|
|
186
|
+
return errorEnvelope("parse_error", "approval resumes require approved=true|false, not response");
|
|
187
|
+
}
|
|
188
|
+
if (approved !== true) {
|
|
189
|
+
await cleanupIndex();
|
|
190
|
+
await deleteStateJson({ env: runtime.env, key: payload.stateKey });
|
|
191
|
+
return okEnvelope("cancelled", [], null, null);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
const isSameStageInput = resumeState.haltType === "input_request" && resumeState.resumeMode === "same_stage";
|
|
195
|
+
const remaining = resumeState.pipeline.slice(resumeState.resumeAtIndex);
|
|
196
|
+
const input = isSameStageInput
|
|
197
|
+
? resumeState.items
|
|
198
|
+
: resumeState.haltType === "input_request"
|
|
199
|
+
? [response]
|
|
200
|
+
: resumeState.items;
|
|
201
|
+
const requestInputResume = isSameStageInput
|
|
202
|
+
? {
|
|
203
|
+
state: resumeState.commandInput,
|
|
204
|
+
response,
|
|
205
|
+
onConsumed: async () => {
|
|
206
|
+
await cleanupIndex();
|
|
207
|
+
await deleteStateJson({ env: runtime.env, key: payload.stateKey });
|
|
208
|
+
},
|
|
209
|
+
}
|
|
210
|
+
: undefined;
|
|
211
|
+
try {
|
|
212
|
+
const output = await runPipeline({
|
|
213
|
+
pipeline: remaining,
|
|
214
|
+
registry: runtime.registry,
|
|
215
|
+
stdin: runtime.stdin,
|
|
216
|
+
stdout: runtime.stdout,
|
|
217
|
+
stderr: runtime.stderr,
|
|
218
|
+
env: runtime.env,
|
|
219
|
+
mode: "tool",
|
|
220
|
+
cwd: runtime.cwd,
|
|
221
|
+
llmAdapters: runtime.llmAdapters,
|
|
222
|
+
signal: runtime.signal,
|
|
223
|
+
input,
|
|
224
|
+
requestInputResume,
|
|
225
|
+
});
|
|
226
|
+
await cleanupIndex();
|
|
227
|
+
const finalized = await finalizePipelineToolRun({
|
|
228
|
+
env: runtime.env,
|
|
229
|
+
pipeline: remaining,
|
|
230
|
+
output,
|
|
231
|
+
previousStateKey: payload.stateKey,
|
|
232
|
+
});
|
|
233
|
+
return okEnvelope(finalized.status, finalized.output, finalized.requiresApproval, finalized.requiresInput);
|
|
234
|
+
}
|
|
235
|
+
catch (err) {
|
|
236
|
+
// Don't clean up index on error — allow retry by --id
|
|
237
|
+
return errorEnvelope("runtime_error", err?.message ?? String(err));
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
export function createToolContext(ctx = {}) {
|
|
241
|
+
return {
|
|
242
|
+
cwd: ctx.cwd ?? process.cwd(),
|
|
243
|
+
env: { ...process.env, ...ctx.env },
|
|
244
|
+
mode: "tool",
|
|
245
|
+
stdin: ctx.stdin ?? process.stdin,
|
|
246
|
+
stdout: ctx.stdout ?? createCaptureStream(),
|
|
247
|
+
stderr: ctx.stderr ?? createCaptureStream(),
|
|
248
|
+
signal: ctx.signal,
|
|
249
|
+
registry: ctx.registry ?? createDefaultRegistry(),
|
|
250
|
+
llmAdapters: ctx.llmAdapters,
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
export function createCaptureStream() {
|
|
254
|
+
return new Writable({
|
|
255
|
+
write(_chunk, _encoding, callback) {
|
|
256
|
+
callback();
|
|
257
|
+
},
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
function okEnvelope(status, output, requiresApproval, requiresInput) {
|
|
261
|
+
return {
|
|
262
|
+
protocolVersion: 1,
|
|
263
|
+
ok: true,
|
|
264
|
+
status,
|
|
265
|
+
output,
|
|
266
|
+
requiresApproval,
|
|
267
|
+
requiresInput,
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
function errorEnvelope(type, message) {
|
|
271
|
+
return {
|
|
272
|
+
protocolVersion: 1,
|
|
273
|
+
ok: false,
|
|
274
|
+
error: { type, message },
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
async function resolveWorkflowFile(candidate, cwd) {
|
|
278
|
+
const { stat } = await import("node:fs/promises");
|
|
279
|
+
const resolved = path.isAbsolute(candidate) ? candidate : path.resolve(cwd, candidate);
|
|
280
|
+
const fileStat = await stat(resolved);
|
|
281
|
+
if (!fileStat.isFile())
|
|
282
|
+
throw new Error("Workflow path is not a file");
|
|
283
|
+
const ext = path.extname(resolved).toLowerCase();
|
|
284
|
+
if (![".lobster", ".yaml", ".yml", ".json"].includes(ext)) {
|
|
285
|
+
throw new Error("Workflow file must end in .lobster, .yaml, .yml, or .json");
|
|
286
|
+
}
|
|
287
|
+
return resolved;
|
|
288
|
+
}
|
|
289
|
+
//# sourceMappingURL=tool_runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool_runtime.js","sourceRoot":"","sources":["../../../src/core/tool_runtime.ts"],"names":[],"mappings":"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"}
|