@openclaw/lobster 2026.7.2-beta.7 → 2026.7.33

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 (45) hide show
  1. package/dist/index.js +149 -9
  2. package/node_modules/@clawdbot/lobster/node_modules/fast-uri/.github/dependabot.yml +2 -42
  3. package/node_modules/@clawdbot/lobster/node_modules/fast-uri/.github/workflows/ci.yml +3 -51
  4. package/node_modules/@clawdbot/lobster/node_modules/fast-uri/.github/workflows/package-manager-ci.yml +24 -0
  5. package/node_modules/@clawdbot/lobster/node_modules/fast-uri/README.md +9 -9
  6. package/node_modules/@clawdbot/lobster/node_modules/fast-uri/index.js +246 -41
  7. package/node_modules/@clawdbot/lobster/node_modules/fast-uri/lib/schemes.js +9 -4
  8. package/node_modules/@clawdbot/lobster/node_modules/fast-uri/lib/utils.js +319 -157
  9. package/node_modules/@clawdbot/lobster/node_modules/fast-uri/package.json +4 -4
  10. package/node_modules/@clawdbot/lobster/node_modules/fast-uri/test/component-safe-serialization.test.js +163 -0
  11. package/node_modules/@clawdbot/lobster/node_modules/fast-uri/test/equal.test.js +31 -54
  12. package/node_modules/@clawdbot/lobster/node_modules/fast-uri/test/fixtures/uri-js-parse.json +2 -0
  13. package/node_modules/@clawdbot/lobster/node_modules/fast-uri/test/ipv6-canonical.test.js +34 -0
  14. package/node_modules/@clawdbot/lobster/node_modules/fast-uri/test/ipv6-validation.test.js +124 -0
  15. package/node_modules/@clawdbot/lobster/node_modules/fast-uri/test/malformed-percent.test.js +77 -0
  16. package/node_modules/@clawdbot/lobster/node_modules/fast-uri/test/malformed-urn.test.js +61 -0
  17. package/node_modules/@clawdbot/lobster/node_modules/fast-uri/test/parse.test.js +2 -0
  18. package/node_modules/@clawdbot/lobster/node_modules/fast-uri/test/reserved-path-normalization.test.js +109 -0
  19. package/node_modules/@clawdbot/lobster/node_modules/fast-uri/test/scheme-validation.test.js +124 -0
  20. package/node_modules/@clawdbot/lobster/node_modules/fast-uri/test/security-normalization.test.js +101 -0
  21. package/node_modules/@clawdbot/lobster/node_modules/fast-uri/test/security.test.js +211 -3
  22. package/node_modules/@clawdbot/lobster/node_modules/fast-uri/test/uri-js.test.js +1 -1
  23. package/node_modules/@clawdbot/lobster/node_modules/fast-uri/test/urn-full-input.test.js +29 -0
  24. package/node_modules/@clawdbot/lobster/node_modules/fast-uri/test/util.test.js +0 -9
  25. package/node_modules/@clawdbot/lobster/node_modules/fast-uri/test/websocket-query-preservation.test.js +24 -0
  26. package/node_modules/@clawdbot/lobster/node_modules/fast-uri/tsconfig.json +7 -8
  27. package/node_modules/@clawdbot/lobster/node_modules/fast-uri/types/index.d.ts +9 -0
  28. package/node_modules/@clawdbot/lobster/node_modules/fast-uri/types/index.test-d.ts +17 -0
  29. package/node_modules/typebox/build/compile/validator.d.mts +4 -1
  30. package/node_modules/typebox/build/guard/guard.d.mts +1 -1
  31. package/node_modules/typebox/build/guard/guard.mjs +2 -5
  32. package/node_modules/typebox/build/guard/string.mjs +4 -16
  33. package/node_modules/typebox/build/schema/engine/_functions.mjs +15 -34
  34. package/node_modules/typebox/build/type/action/readonly_object.d.mts +0 -5
  35. package/node_modules/typebox/build/type/action/readonly_object.mjs +0 -8
  36. package/node_modules/typebox/build/typebox.d.mts +1 -1
  37. package/node_modules/typebox/build/typebox.mjs +1 -1
  38. package/node_modules/typebox/package.json +1 -1
  39. package/node_modules/typebox/readme.md +32 -29
  40. package/openclaw.plugin.json +0 -1
  41. package/package.json +5 -5
  42. package/node_modules/@clawdbot/lobster/node_modules/fast-uri/benchmark/encoder.mjs +0 -54
  43. package/node_modules/@clawdbot/lobster/node_modules/fast-uri/test/scheme-normalization.test.js +0 -16
  44. package/node_modules/@clawdbot/lobster/node_modules/fast-uri/test/security-utf8-encoding.test.js +0 -0
  45. package/node_modules/@clawdbot/lobster/node_modules/fast-uri/types/index.tst.ts +0 -15
package/dist/index.js CHANGED
@@ -1,18 +1,137 @@
1
+ import { createRequire } from "node:module";
1
2
  import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
2
3
  import { optionalNonNegativeIntegerSchema, optionalPositiveIntegerSchema } from "openclaw/plugin-sdk/channel-actions";
3
4
  import { readNonNegativeIntegerParam, readPositiveIntegerParam } from "openclaw/plugin-sdk/param-readers";
4
5
  import { jsonResult } from "openclaw/plugin-sdk/tool-results";
5
6
  import { Type } from "typebox";
7
+ import { readFileSync } from "node:fs";
6
8
  import { stat } from "node:fs/promises";
7
9
  import path from "node:path";
8
10
  import { Readable, Writable } from "node:stream";
11
+ import { pathToFileURL } from "node:url";
12
+ import { createHash } from "node:crypto";
13
+ //#region extensions/lobster/src/lobster-ajv-cache.ts
14
+ const installedSymbol = Symbol.for("openclaw.lobster.ajv-compile-cache.installed");
15
+ const cacheSymbol = Symbol.for("openclaw.lobster.ajv-compile-cache.entries");
16
+ const maxEntries = 512;
17
+ function stableJsonStringify(value, seen = /* @__PURE__ */ new WeakSet()) {
18
+ if (value === null || typeof value !== "object") return JSON.stringify(value);
19
+ if (seen.has(value)) throw new TypeError("Cannot cache cyclic JSON schema");
20
+ seen.add(value);
21
+ if (Array.isArray(value)) {
22
+ const items = value.map((entry) => stableJsonStringify(entry, seen));
23
+ seen.delete(value);
24
+ return `[${items.join(",")}]`;
25
+ }
26
+ const record = value;
27
+ const properties = Object.keys(record).toSorted().filter((key) => record[key] !== void 0).map((key) => `${JSON.stringify(key)}:${stableJsonStringify(record[key], seen)}`);
28
+ seen.delete(value);
29
+ return `{${properties.join(",")}}`;
30
+ }
31
+ function compileCacheKey(schema) {
32
+ try {
33
+ return createHash("sha256").update(stableJsonStringify(schema)).digest("hex");
34
+ } catch {
35
+ return null;
36
+ }
37
+ }
38
+ function readCompileCache(instance) {
39
+ let cache = instance[cacheSymbol];
40
+ if (!cache) {
41
+ cache = /* @__PURE__ */ new Map();
42
+ Object.defineProperty(instance, cacheSymbol, {
43
+ value: cache,
44
+ configurable: true
45
+ });
46
+ }
47
+ return cache;
48
+ }
49
+ function rememberCompiledValidator(params) {
50
+ const { cache, instance, key, removeSchema, schema, validate } = params;
51
+ if (!cache.has(key) && cache.size >= maxEntries) {
52
+ const oldest = cache.keys().next().value;
53
+ if (oldest !== void 0) {
54
+ const evicted = cache.get(oldest);
55
+ cache.delete(oldest);
56
+ if (evicted) removeSchema.call(instance, evicted.schema);
57
+ }
58
+ }
59
+ cache.set(key, {
60
+ schema,
61
+ validate
62
+ });
63
+ }
64
+ async function resolveLobsterAjvConstructor(packageEntryPath) {
65
+ const ajvPath = createRequire(packageEntryPath).resolve("ajv");
66
+ const ajvModule = await import(pathToFileURL(ajvPath).href);
67
+ return ajvModule.default ?? ajvModule;
68
+ }
69
+ async function installLobsterAjvCompileCache(packageEntryPath) {
70
+ let AjvCtor;
71
+ try {
72
+ AjvCtor = await resolveLobsterAjvConstructor(packageEntryPath);
73
+ } catch {
74
+ return;
75
+ }
76
+ const proto = AjvCtor.prototype;
77
+ if (proto[installedSymbol]) return;
78
+ const originalCompile = proto.compile;
79
+ const originalRemoveSchema = proto.removeSchema;
80
+ Object.defineProperty(proto, installedSymbol, {
81
+ value: true,
82
+ configurable: true
83
+ });
84
+ proto.compile = function compileWithContentCache(schema) {
85
+ const key = compileCacheKey(schema);
86
+ if (!key) return originalCompile.call(this, schema);
87
+ const cache = readCompileCache(this);
88
+ const cached = cache.get(key);
89
+ if (cached) return cached.validate;
90
+ const validate = originalCompile.call(this, schema);
91
+ rememberCompiledValidator({
92
+ cache,
93
+ instance: this,
94
+ key,
95
+ removeSchema: originalRemoveSchema,
96
+ schema,
97
+ validate
98
+ });
99
+ return validate;
100
+ };
101
+ proto.removeSchema = function removeSchemaAndClearContentCache(schemaKeyRef) {
102
+ this[cacheSymbol]?.clear();
103
+ return originalRemoveSchema.call(this, schemaKeyRef);
104
+ };
105
+ }
106
+ //#endregion
9
107
  //#region extensions/lobster/src/lobster-runner.ts
108
+ const lobsterRequire = createRequire(import.meta.url);
10
109
  const workflowExts = /* @__PURE__ */ new Set([
11
110
  ".lobster",
12
111
  ".yaml",
13
112
  ".yml",
14
113
  ".json"
15
114
  ]);
115
+ function toEmbeddedToolRuntime(moduleExports, source) {
116
+ const { runToolRequest, resumeToolRequest } = moduleExports;
117
+ if (typeof runToolRequest === "function" && typeof resumeToolRequest === "function") return {
118
+ runToolRequest,
119
+ resumeToolRequest
120
+ };
121
+ throw new Error(`${source} does not export Lobster embedded runtime functions`);
122
+ }
123
+ function findLobsterPackageRoot(resolvedEntryPath) {
124
+ let dir = path.dirname(resolvedEntryPath);
125
+ while (true) {
126
+ const packageJsonPath = path.join(dir, "package.json");
127
+ try {
128
+ if (JSON.parse(readFileSync(packageJsonPath, "utf8")).name === "@clawdbot/lobster") return dir;
129
+ } catch {}
130
+ const parent = path.dirname(dir);
131
+ if (parent === dir) throw new Error(`Could not locate @clawdbot/lobster package root from ${resolvedEntryPath}`);
132
+ dir = parent;
133
+ }
134
+ }
16
135
  function normalizeForCwdSandbox(p) {
17
136
  const normalized = path.normalize(p);
18
137
  return process.platform === "win32" ? normalized.toLowerCase() : normalized;
@@ -131,12 +250,29 @@ async function withTimeout(timeoutMs, fn) {
131
250
  });
132
251
  });
133
252
  }
134
- async function loadEmbeddedToolRuntimeFromPackage() {
135
- return await import([
136
- "@clawdbot",
137
- "lobster",
138
- "core"
139
- ].join("/"));
253
+ async function loadEmbeddedToolRuntimeFromPackage(options = {}) {
254
+ const importModule = options.importModule ?? (async (specifier) => await import(specifier));
255
+ const packageEntryPath = (options.resolvePackageEntry ?? ((specifier) => lobsterRequire.resolve(specifier)))("@clawdbot/lobster");
256
+ await installLobsterAjvCompileCache(packageEntryPath);
257
+ let coreLoadError;
258
+ try {
259
+ return toEmbeddedToolRuntime(await importModule([
260
+ "@clawdbot",
261
+ "lobster",
262
+ "core"
263
+ ].join("/")), "@clawdbot/lobster/core");
264
+ } catch (error) {
265
+ coreLoadError = error;
266
+ }
267
+ let fallbackLoadError;
268
+ try {
269
+ const packageRoot = findLobsterPackageRoot(packageEntryPath);
270
+ const coreRuntimeUrl = pathToFileURL(path.join(packageRoot, "dist/src/core/index.js")).href;
271
+ return toEmbeddedToolRuntime(await importModule(coreRuntimeUrl), coreRuntimeUrl);
272
+ } catch (error) {
273
+ fallbackLoadError = error;
274
+ }
275
+ throw new Error("Failed to load the Lobster embedded runtime", { cause: new AggregateError([coreLoadError, fallbackLoadError], "Both Lobster embedded runtime load paths failed") });
140
276
  }
141
277
  function createEmbeddedLobsterRunner(options) {
142
278
  const loadRuntime = options?.loadRuntime ?? loadEmbeddedToolRuntimeFromPackage;
@@ -435,11 +571,12 @@ function parseResumeFlowParams(params) {
435
571
  };
436
572
  }
437
573
  function formatManagedFlowResult(result) {
438
- return jsonResult({
574
+ const details = {
439
575
  ...result.envelope && typeof result.envelope === "object" && !Array.isArray(result.envelope) ? result.envelope : { envelope: result.envelope },
440
576
  flow: result.flow,
441
577
  mutation: result.mutation
442
- });
578
+ };
579
+ return jsonResult(details);
443
580
  }
444
581
  function requireTaskFlowRuntime(taskFlow, action) {
445
582
  if (!taskFlow) throw new Error(`Managed TaskFlow ${action} mode requires a bound taskFlow runtime`);
@@ -456,7 +593,10 @@ function createLobsterTool(api, options) {
456
593
  label: "Lobster Workflow",
457
594
  description: "Run Lobster pipelines as a local-first workflow runtime (typed JSON envelope + resumable approvals).",
458
595
  parameters: Type.Object({
459
- action: Type.Enum(["run", "resume"], { type: "string" }),
596
+ action: Type.Unsafe({
597
+ type: "string",
598
+ enum: ["run", "resume"]
599
+ }),
460
600
  pipeline: Type.Optional(Type.String()),
461
601
  argsJson: Type.Optional(Type.String()),
462
602
  token: Type.Optional(Type.String()),
@@ -2,52 +2,12 @@ version: 2
2
2
  updates:
3
3
  - package-ecosystem: "github-actions"
4
4
  directory: "/"
5
- commit-message:
6
- # Prefix all commit messages with "chore: "
7
- prefix: "chore"
8
5
  schedule:
9
- interval: "weekly"
10
- cooldown:
11
- default-days: 7
12
- allow:
13
- - dependency-name: "*"
14
- update-types:
15
- - "version-update:semver-major"
6
+ interval: "monthly"
16
7
  open-pull-requests-limit: 10
17
8
 
18
9
  - package-ecosystem: "npm"
19
10
  directory: "/"
20
- commit-message:
21
- # Prefix all commit messages with "chore: "
22
- prefix: "chore"
23
11
  schedule:
24
- interval: "weekly"
25
- cooldown:
26
- default-days: 7
27
- versioning-strategy: "increase-if-necessary"
28
- allow:
29
- - dependency-name: "*"
30
- update-types:
31
- - "version-update:semver-major"
32
- ignore:
33
- # TODO: remove ignore until neostandard support ESLint 10
34
- - dependency-name: "eslint"
35
- - dependency-name: "neostandard"
36
- - dependency-name: "@stylistic/*"
12
+ interval: "monthly"
37
13
  open-pull-requests-limit: 10
38
- groups:
39
- # Production dependencies with breaking changes
40
- dependencies:
41
- dependency-type: "production"
42
- # ESLint related dependencies
43
- dev-dependencies-eslint:
44
- patterns:
45
- - "eslint"
46
- - "neostandard"
47
- - "@stylistic/*"
48
- # TypeScript related dependencies
49
- dev-dependencies-typescript:
50
- patterns:
51
- - "@types/*"
52
- - "tstyche"
53
- - "typescript"
@@ -23,61 +23,13 @@ permissions:
23
23
  contents: read
24
24
 
25
25
  jobs:
26
- type-tests:
27
- name: Type Tests
28
- runs-on: ubuntu-latest
29
- strategy:
30
- matrix:
31
- node-version: ['20', '22', '24', '26']
32
- steps:
33
- - uses: actions/checkout@v7
34
- with:
35
- persist-credentials: false
36
-
37
- - uses: actions/setup-node@v6
38
- with:
39
- node-version: ${{ matrix.node-version }}
40
- cache: 'npm'
41
- cache-dependency-path: package.json
42
- check-latest: true
43
-
44
- - name: Install dependencies
45
- run: npm install --ignore-scripts
46
-
47
- - name: Run type tests
48
- run: npm run test:typescript
49
-
50
- unit-tests:
51
- name: Unit Tests
52
- runs-on: ubuntu-latest
53
- strategy:
54
- matrix:
55
- node-version: ['16', '18', '20', '22', '24', '26']
56
- steps:
57
- - uses: actions/checkout@v7
58
- with:
59
- persist-credentials: false
60
-
61
- - uses: actions/setup-node@v6
62
- with:
63
- node-version: ${{ matrix.node-version }}
64
- cache: 'npm'
65
- cache-dependency-path: package.json
66
- check-latest: true
67
-
68
- - name: Install dependencies
69
- run: npm install --ignore-scripts
70
-
71
- - name: Run unit tests
72
- run: npm test
73
-
74
26
  test-regression-check-node10:
75
27
  name: Test compatibility with Node.js 10
76
28
  runs-on: ubuntu-latest
77
29
  permissions:
78
30
  contents: read
79
31
  steps:
80
- - uses: actions/checkout@v7
32
+ - uses: actions/checkout@v6
81
33
  with:
82
34
  persist-credentials: false
83
35
 
@@ -119,7 +71,7 @@ jobs:
119
71
  permissions:
120
72
  contents: read
121
73
  steps:
122
- - uses: actions/checkout@v7
74
+ - uses: actions/checkout@v6
123
75
  with:
124
76
  persist-credentials: false
125
77
 
@@ -151,4 +103,4 @@ jobs:
151
103
  with:
152
104
  license-check: true
153
105
  lint: true
154
- node-versions: '["16", "18", "20", "22", "24", "26"]'
106
+ node-versions: '["16", "18", "20", "22", "24"]'
@@ -0,0 +1,24 @@
1
+ name: package-manager-ci
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+ - next
8
+ - 'v*'
9
+ paths-ignore:
10
+ - 'docs/**'
11
+ - '*.md'
12
+ pull_request:
13
+ paths-ignore:
14
+ - 'docs/**'
15
+ - '*.md'
16
+
17
+ permissions:
18
+ contents: read
19
+
20
+ jobs:
21
+ test:
22
+ permissions:
23
+ contents: read
24
+ uses: fastify/workflows/.github/workflows/plugins-ci-package-manager.yml@v6
@@ -27,10 +27,10 @@ Malformed authorities and out-of-range ports are reported through the parsed com
27
27
  If set to `true`, the serializer will not resolve a relative `path` component.
28
28
 
29
29
  * `unicodeSupport` (boolean, false)
30
- If set to `true`, the parser will unescape non-ASCII characters in the parsed output as per [RFC 3987](https://www.ietf.org/rfc/rfc3987.txt).
30
+ If set to `true`, the parser will unescape non-ASCII characters in the parsed output as per [RFC 3987](http://www.ietf.org/rfc/rfc3987.txt).
31
31
 
32
32
  * `domainHost` (boolean, false)
33
- If set to `true`, the library will treat the `host` component as a domain name, and convert IDNs (International Domain Names) as per [RFC 5891](https://www.ietf.org/rfc/rfc5891.txt).
33
+ If set to `true`, the library will treat the `host` component as a domain name, and convert IDNs (International Domain Names) as per [RFC 5891](http://www.ietf.org/rfc/rfc5891.txt).
34
34
 
35
35
  ### Parse
36
36
 
@@ -90,14 +90,14 @@ true
90
90
 
91
91
  ## Scheme supports
92
92
 
93
- fast-uri supports inserting custom [scheme](https://en.wikipedia.org/wiki/URI_scheme)-dependent processing rules. Currently, fast-uri has built-in support for the following schemes:
93
+ fast-uri supports inserting custom [scheme](http://en.wikipedia.org/wiki/URI_scheme)-dependent processing rules. Currently, fast-uri has built-in support for the following schemes:
94
94
 
95
- * http \[[RFC 2616](https://www.ietf.org/rfc/rfc2616.txt)\]
96
- * https \[[RFC 2818](https://www.ietf.org/rfc/rfc2818.txt)\]
97
- * ws \[[RFC 6455](https://www.ietf.org/rfc/rfc6455.txt)\]
98
- * wss \[[RFC 6455](https://www.ietf.org/rfc/rfc6455.txt)\]
99
- * urn \[[RFC 2141](https://www.ietf.org/rfc/rfc2141.txt)\]
100
- * urn:uuid \[[RFC 4122](https://www.ietf.org/rfc/rfc4122.txt)\]
95
+ * http \[[RFC 2616](http://www.ietf.org/rfc/rfc2616.txt)\]
96
+ * https \[[RFC 2818](http://www.ietf.org/rfc/rfc2818.txt)\]
97
+ * ws \[[RFC 6455](http://www.ietf.org/rfc/rfc6455.txt)\]
98
+ * wss \[[RFC 6455](http://www.ietf.org/rfc/rfc6455.txt)\]
99
+ * urn \[[RFC 2141](http://www.ietf.org/rfc/rfc2141.txt)\]
100
+ * urn:uuid \[[RFC 4122](http://www.ietf.org/rfc/rfc4122.txt)\]
101
101
 
102
102
 
103
103
  ## Benchmarks