@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,337 @@
|
|
|
1
|
+
import os from "node:os";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { promises as fsp } from "node:fs";
|
|
4
|
+
import { randomBytes } from "node:crypto";
|
|
5
|
+
export function defaultStateDir(env) {
|
|
6
|
+
return ((env?.LOBSTER_STATE_DIR && String(env.LOBSTER_STATE_DIR).trim()) ||
|
|
7
|
+
path.join(os.homedir(), ".lobster", "state"));
|
|
8
|
+
}
|
|
9
|
+
export function keyToPath(stateDir, key) {
|
|
10
|
+
const safe = String(key)
|
|
11
|
+
.toLowerCase()
|
|
12
|
+
.replace(/[^a-z0-9._-]+/g, "_")
|
|
13
|
+
.replace(/_+/g, "_")
|
|
14
|
+
.replace(/^_+|_+$/g, "");
|
|
15
|
+
if (!safe)
|
|
16
|
+
throw new Error("state key is empty/invalid");
|
|
17
|
+
return path.join(stateDir, `${safe}.json`);
|
|
18
|
+
}
|
|
19
|
+
export function stableStringify(value) {
|
|
20
|
+
return JSON.stringify(value, (_k, v) => {
|
|
21
|
+
if (v && typeof v === "object" && !Array.isArray(v)) {
|
|
22
|
+
return Object.fromEntries(Object.keys(v)
|
|
23
|
+
.sort()
|
|
24
|
+
.map((k) => [k, v[k]]));
|
|
25
|
+
}
|
|
26
|
+
return v;
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
function isDirectorySyncUnsupportedError(err) {
|
|
30
|
+
return [
|
|
31
|
+
"EACCES",
|
|
32
|
+
"EBADF",
|
|
33
|
+
"EINVAL",
|
|
34
|
+
"EISDIR",
|
|
35
|
+
"ENOSYS",
|
|
36
|
+
"ENOTSUP",
|
|
37
|
+
"EOPNOTSUPP",
|
|
38
|
+
"EPERM",
|
|
39
|
+
].includes(err?.code);
|
|
40
|
+
}
|
|
41
|
+
async function syncParentDir(filePath) {
|
|
42
|
+
await syncDirectory(path.dirname(filePath));
|
|
43
|
+
}
|
|
44
|
+
async function syncDirectory(dir) {
|
|
45
|
+
let handle;
|
|
46
|
+
try {
|
|
47
|
+
handle = await fsp.open(dir, "r");
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
if (isDirectorySyncUnsupportedError(err))
|
|
51
|
+
return;
|
|
52
|
+
throw err;
|
|
53
|
+
}
|
|
54
|
+
try {
|
|
55
|
+
await handle.sync();
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
if (!isDirectorySyncUnsupportedError(err))
|
|
59
|
+
throw err;
|
|
60
|
+
}
|
|
61
|
+
finally {
|
|
62
|
+
if (handle)
|
|
63
|
+
await handle.close().catch(() => { });
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
async function syncCreatedDirectoryChain(firstCreated, finalDir) {
|
|
67
|
+
const final = path.resolve(finalDir);
|
|
68
|
+
let current = path.resolve(firstCreated);
|
|
69
|
+
await syncDirectory(path.dirname(current));
|
|
70
|
+
while (current !== final) {
|
|
71
|
+
await syncDirectory(current);
|
|
72
|
+
const relative = path.relative(current, final);
|
|
73
|
+
const next = relative.split(path.sep)[0];
|
|
74
|
+
if (!next || next === "..")
|
|
75
|
+
break;
|
|
76
|
+
current = path.join(current, next);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
export async function ensureDirectory(dir) {
|
|
80
|
+
const created = await fsp.mkdir(dir, { recursive: true });
|
|
81
|
+
if (created)
|
|
82
|
+
await syncCreatedDirectoryChain(created, dir);
|
|
83
|
+
}
|
|
84
|
+
export function isJsonSyntaxError(err) {
|
|
85
|
+
return err instanceof SyntaxError;
|
|
86
|
+
}
|
|
87
|
+
function isLinkUnsupportedError(err) {
|
|
88
|
+
return ["ENOSYS", "ENOTSUP", "EOPNOTSUPP", "EPERM", "EXDEV"].includes(err?.code);
|
|
89
|
+
}
|
|
90
|
+
export function isAtomicExclusiveUnsupportedError(err) {
|
|
91
|
+
return err?.code === "ENOTSUP" && err?.cause && isLinkUnsupportedError(err.cause);
|
|
92
|
+
}
|
|
93
|
+
function isOptionalApprovalIndexPersistenceError(err) {
|
|
94
|
+
return (isAtomicExclusiveUnsupportedError(err) ||
|
|
95
|
+
["EACCES", "EDQUOT", "EIO", "ENOSPC", "EPERM", "EROFS"].includes(err?.code));
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Write a file atomically: stage to a sibling temp file, fsync, then rename
|
|
99
|
+
* over the target. `rename(2)` is atomic on a single filesystem, so a reader
|
|
100
|
+
* (or a crash) never observes a truncated/partial file — it sees either the
|
|
101
|
+
* complete old content or the complete new content. Plain `fsp.writeFile`
|
|
102
|
+
* truncates the target up front, leaving a corruption window on SIGKILL/OOM/
|
|
103
|
+
* power loss. New state files are private by default; existing file modes are
|
|
104
|
+
* preserved across replacement. The temp file is removed on any failed path.
|
|
105
|
+
*/
|
|
106
|
+
export async function writeFileAtomic(filePath, data, options = {}) {
|
|
107
|
+
const renameFile = options.renameFile ?? fsp.rename;
|
|
108
|
+
const syncDir = options.syncParentDir ?? syncParentDir;
|
|
109
|
+
const dir = path.dirname(filePath);
|
|
110
|
+
const tmpPath = path.join(dir, `.${path.basename(filePath)}.${randomBytes(6).toString("hex")}.tmp`);
|
|
111
|
+
let mode = 0o600;
|
|
112
|
+
let handle;
|
|
113
|
+
let cleanup = true;
|
|
114
|
+
try {
|
|
115
|
+
try {
|
|
116
|
+
mode = (await fsp.stat(filePath)).mode & 0o777;
|
|
117
|
+
}
|
|
118
|
+
catch (err) {
|
|
119
|
+
if (err?.code !== "ENOENT")
|
|
120
|
+
throw err;
|
|
121
|
+
}
|
|
122
|
+
handle = await fsp.open(tmpPath, "wx", mode);
|
|
123
|
+
await handle.writeFile(data, "utf8");
|
|
124
|
+
await handle.chmod(mode);
|
|
125
|
+
await handle.sync();
|
|
126
|
+
await handle.close();
|
|
127
|
+
handle = undefined;
|
|
128
|
+
await renameFile(tmpPath, filePath);
|
|
129
|
+
await syncDir(filePath);
|
|
130
|
+
cleanup = false;
|
|
131
|
+
}
|
|
132
|
+
finally {
|
|
133
|
+
if (handle)
|
|
134
|
+
await handle.close().catch(() => { });
|
|
135
|
+
if (cleanup)
|
|
136
|
+
await fsp.rm(tmpPath, { force: true }).catch(() => { });
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
export async function writeFileAtomicExclusive(filePath, data, options = {}) {
|
|
140
|
+
const linkFile = options.linkFile ?? fsp.link;
|
|
141
|
+
const syncDir = options.syncParentDir ?? syncParentDir;
|
|
142
|
+
const dir = path.dirname(filePath);
|
|
143
|
+
const tmpPath = path.join(dir, `.${path.basename(filePath)}.${randomBytes(6).toString("hex")}.tmp`);
|
|
144
|
+
let handle;
|
|
145
|
+
try {
|
|
146
|
+
handle = await fsp.open(tmpPath, "wx", 0o600);
|
|
147
|
+
await handle.writeFile(data, "utf8");
|
|
148
|
+
await handle.chmod(0o600);
|
|
149
|
+
await handle.sync();
|
|
150
|
+
await handle.close();
|
|
151
|
+
handle = undefined;
|
|
152
|
+
try {
|
|
153
|
+
await linkFile(tmpPath, filePath);
|
|
154
|
+
}
|
|
155
|
+
catch (err) {
|
|
156
|
+
if (!isLinkUnsupportedError(err))
|
|
157
|
+
throw err;
|
|
158
|
+
const unsupported = new Error("Atomic exclusive file creation requires hard-link support on this filesystem");
|
|
159
|
+
unsupported.code = "ENOTSUP";
|
|
160
|
+
unsupported.cause = err;
|
|
161
|
+
throw unsupported;
|
|
162
|
+
}
|
|
163
|
+
try {
|
|
164
|
+
await fsp.unlink(tmpPath);
|
|
165
|
+
await syncDir(filePath);
|
|
166
|
+
}
|
|
167
|
+
catch (err) {
|
|
168
|
+
await fsp.unlink(filePath).catch(() => { });
|
|
169
|
+
await syncDir(filePath).catch(() => { });
|
|
170
|
+
throw err;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
finally {
|
|
174
|
+
if (handle)
|
|
175
|
+
await handle.close().catch(() => { });
|
|
176
|
+
await fsp.rm(tmpPath, { force: true }).catch(() => { });
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
export async function readStateJson({ env, key }) {
|
|
180
|
+
const stateDir = defaultStateDir(env);
|
|
181
|
+
const filePath = keyToPath(stateDir, key);
|
|
182
|
+
try {
|
|
183
|
+
const text = await fsp.readFile(filePath, "utf8");
|
|
184
|
+
return JSON.parse(text);
|
|
185
|
+
}
|
|
186
|
+
catch (err) {
|
|
187
|
+
if (err?.code === "ENOENT")
|
|
188
|
+
return null;
|
|
189
|
+
throw err;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
export async function writeStateJson({ env, key, value }) {
|
|
193
|
+
const stateDir = defaultStateDir(env);
|
|
194
|
+
const filePath = keyToPath(stateDir, key);
|
|
195
|
+
await ensureDirectory(stateDir);
|
|
196
|
+
await writeFileAtomic(filePath, JSON.stringify(value, null, 2) + "\n");
|
|
197
|
+
}
|
|
198
|
+
export async function deleteStateJson({ env, key }) {
|
|
199
|
+
const stateDir = defaultStateDir(env);
|
|
200
|
+
const filePath = keyToPath(stateDir, key);
|
|
201
|
+
try {
|
|
202
|
+
await fsp.unlink(filePath);
|
|
203
|
+
}
|
|
204
|
+
catch (err) {
|
|
205
|
+
if (err?.code === "ENOENT")
|
|
206
|
+
return;
|
|
207
|
+
throw err;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
function sanitizeApprovalId(approvalId) {
|
|
211
|
+
return approvalId.replace(/[^a-f0-9]/g, "");
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Generate a short, human-friendly approval ID (8 hex chars).
|
|
215
|
+
* These are easy to copy/paste in chat interfaces where full
|
|
216
|
+
* base64url resume tokens are unwieldy.
|
|
217
|
+
*/
|
|
218
|
+
export function generateApprovalId() {
|
|
219
|
+
return randomBytes(4).toString("hex");
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Write a reverse-index file that maps approvalId → stateKey.
|
|
223
|
+
* Call this after writeStateJson to enable short-ID resume.
|
|
224
|
+
*/
|
|
225
|
+
export async function writeApprovalIndex({ env, stateKey, approvalId, options, }) {
|
|
226
|
+
const stateDir = defaultStateDir(env);
|
|
227
|
+
const safe = sanitizeApprovalId(approvalId);
|
|
228
|
+
if (!safe)
|
|
229
|
+
return;
|
|
230
|
+
await ensureDirectory(stateDir);
|
|
231
|
+
const indexPath = path.join(stateDir, `approval_${safe}.json`);
|
|
232
|
+
await writeFileAtomicExclusive(indexPath, JSON.stringify({ stateKey, createdAt: new Date().toISOString() }) + "\n", options);
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Create a unique approval ID index without ever overwriting an existing mapping.
|
|
236
|
+
*/
|
|
237
|
+
export async function createApprovalIndex({ env, stateKey, options, }) {
|
|
238
|
+
for (let attempt = 0; attempt < 16; attempt++) {
|
|
239
|
+
const approvalId = generateApprovalId();
|
|
240
|
+
try {
|
|
241
|
+
await writeApprovalIndex({ env, stateKey, approvalId, options });
|
|
242
|
+
return approvalId;
|
|
243
|
+
}
|
|
244
|
+
catch (err) {
|
|
245
|
+
if (err?.code === "EEXIST")
|
|
246
|
+
continue;
|
|
247
|
+
if (isOptionalApprovalIndexPersistenceError(err))
|
|
248
|
+
return null;
|
|
249
|
+
throw err;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
throw new Error("Could not allocate a unique approval ID");
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Look up a state key by short approval ID.
|
|
256
|
+
* Returns the stateKey string or null if not found.
|
|
257
|
+
*/
|
|
258
|
+
export async function findStateKeyByApprovalId({ env, approvalId, }) {
|
|
259
|
+
const stateDir = defaultStateDir(env);
|
|
260
|
+
const safe = sanitizeApprovalId(approvalId);
|
|
261
|
+
if (!safe)
|
|
262
|
+
return null;
|
|
263
|
+
const indexPath = path.join(stateDir, `approval_${safe}.json`);
|
|
264
|
+
try {
|
|
265
|
+
const text = await fsp.readFile(indexPath, "utf8");
|
|
266
|
+
const data = JSON.parse(text);
|
|
267
|
+
return typeof data?.stateKey === "string" ? data.stateKey : null;
|
|
268
|
+
}
|
|
269
|
+
catch (err) {
|
|
270
|
+
if (err?.code === "ENOENT")
|
|
271
|
+
return null;
|
|
272
|
+
if (isJsonSyntaxError(err))
|
|
273
|
+
return null;
|
|
274
|
+
throw err;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Delete the approval ID index file (cleanup after resume or cancel).
|
|
279
|
+
*/
|
|
280
|
+
export async function deleteApprovalId({ env, approvalId, }) {
|
|
281
|
+
const stateDir = defaultStateDir(env);
|
|
282
|
+
const safe = sanitizeApprovalId(approvalId);
|
|
283
|
+
if (!safe)
|
|
284
|
+
return;
|
|
285
|
+
const indexPath = path.join(stateDir, `approval_${safe}.json`);
|
|
286
|
+
try {
|
|
287
|
+
await fsp.unlink(indexPath);
|
|
288
|
+
}
|
|
289
|
+
catch (err) {
|
|
290
|
+
if (err?.code === "ENOENT")
|
|
291
|
+
return;
|
|
292
|
+
throw err;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Clean up any approval index file that points to the given stateKey.
|
|
297
|
+
* Used when resuming via --token (where we don't know the approvalId).
|
|
298
|
+
* Scans index files in the state dir — O(n) but n is tiny in practice.
|
|
299
|
+
*/
|
|
300
|
+
export async function cleanupApprovalIndexByStateKey({ env, stateKey, }) {
|
|
301
|
+
const stateDir = defaultStateDir(env);
|
|
302
|
+
let files;
|
|
303
|
+
try {
|
|
304
|
+
files = await fsp.readdir(stateDir);
|
|
305
|
+
}
|
|
306
|
+
catch (err) {
|
|
307
|
+
if (err?.code === "ENOENT")
|
|
308
|
+
return;
|
|
309
|
+
throw err;
|
|
310
|
+
}
|
|
311
|
+
for (const file of files) {
|
|
312
|
+
if (!file.startsWith("approval_") || !file.endsWith(".json"))
|
|
313
|
+
continue;
|
|
314
|
+
try {
|
|
315
|
+
const text = await fsp.readFile(path.join(stateDir, file), "utf8");
|
|
316
|
+
const data = JSON.parse(text);
|
|
317
|
+
if (data?.stateKey === stateKey) {
|
|
318
|
+
await fsp.unlink(path.join(stateDir, file)).catch(() => { });
|
|
319
|
+
return; // one index per stateKey
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
catch {
|
|
323
|
+
/* skip corrupt files */
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
export async function diffAndStore({ env, key, value }) {
|
|
328
|
+
const before = await readStateJson({ env, key }).catch((err) => {
|
|
329
|
+
if (isJsonSyntaxError(err))
|
|
330
|
+
return null;
|
|
331
|
+
throw err;
|
|
332
|
+
});
|
|
333
|
+
const changed = stableStringify(before) !== stableStringify(value);
|
|
334
|
+
await writeStateJson({ env, key, value });
|
|
335
|
+
return { before, after: value, changed };
|
|
336
|
+
}
|
|
337
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/state/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Buffer } from "node:buffer";
|
|
2
|
+
export function encodeToken(obj) {
|
|
3
|
+
const json = JSON.stringify(obj);
|
|
4
|
+
return Buffer.from(json, "utf8").toString("base64url");
|
|
5
|
+
}
|
|
6
|
+
export function decodeToken(token) {
|
|
7
|
+
try {
|
|
8
|
+
const json = Buffer.from(String(token), "base64url").toString("utf8");
|
|
9
|
+
return JSON.parse(json);
|
|
10
|
+
}
|
|
11
|
+
catch (_err) {
|
|
12
|
+
throw new Error("Invalid token");
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token.js","sourceRoot":"","sources":["../../src/token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,UAAU,WAAW,CAAC,GAAG;IAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACjC,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAK;IAC/B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACtE,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,IAAI,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;IACnC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { Ajv } from "ajv";
|
|
2
|
+
import { stableStringify } from "./state/store.js";
|
|
3
|
+
export const sharedAjv = new Ajv({
|
|
4
|
+
allErrors: false,
|
|
5
|
+
strict: false,
|
|
6
|
+
// User-provided schemas may repeat `$id` across runs/resumes.
|
|
7
|
+
addUsedSchema: false,
|
|
8
|
+
});
|
|
9
|
+
/**
|
|
10
|
+
* Build a memoized `compile()` for a given Ajv instance.
|
|
11
|
+
*
|
|
12
|
+
* Calling `ajv.compile(schema)` per request leaks SchemaEnv / closure graphs
|
|
13
|
+
* that Ajv retains indefinitely (issue #96). Memoization
|
|
14
|
+
* eliminates the leak for the common case where the same schema is recompiled
|
|
15
|
+
* across calls.
|
|
16
|
+
*
|
|
17
|
+
* Cache key is the stable JSON serialization of the schema, which catches
|
|
18
|
+
* structurally-identical schemas across reloads even when keys are inserted
|
|
19
|
+
* in different orders.
|
|
20
|
+
*
|
|
21
|
+
* Each Ajv instance gets its own cache because compiled validators are not
|
|
22
|
+
* interchangeable across different Ajv configurations.
|
|
23
|
+
*/
|
|
24
|
+
export function createCompileCached(ajv) {
|
|
25
|
+
const cache = new Map();
|
|
26
|
+
return function compileCached(schema) {
|
|
27
|
+
const key = stableStringify(schema);
|
|
28
|
+
let validator = cache.get(key);
|
|
29
|
+
if (!validator) {
|
|
30
|
+
validator = ajv.compile(schema);
|
|
31
|
+
cache.set(key, validator);
|
|
32
|
+
}
|
|
33
|
+
return validator;
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/** Memoized compile bound to the module-level `sharedAjv` instance. */
|
|
37
|
+
export const compileCached = createCompileCached(sharedAjv);
|
|
38
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAyC,MAAM,KAAK,CAAC;AAEjE,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC;IAC/B,SAAS,EAAE,KAAK;IAChB,MAAM,EAAE,KAAK;IACb,8DAA8D;IAC9D,aAAa,EAAE,KAAK;CACrB,CAAC,CAAC;AAEH;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAQ;IAC1C,MAAM,KAAK,GAAG,IAAI,GAAG,EAA4B,CAAC;IAClD,OAAO,SAAS,aAAa,CAAC,MAAiB;QAC7C,MAAM,GAAG,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAChC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC5B,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;AACJ,CAAC;AAED,uEAAuE;AACvE,MAAM,CAAC,MAAM,aAAa,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC"}
|