@openclaw/crabline 0.1.9 → 0.1.11
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/README.md +47 -22
- package/assets/crabline-banner.svg +20 -0
- package/dist/src/bin/crabline.js.map +1 -1
- package/dist/src/cli/program.d.ts +25 -1
- package/dist/src/cli/program.js +579 -82
- package/dist/src/cli/program.js.map +1 -1
- package/dist/src/config/load.js +59 -6
- package/dist/src/config/load.js.map +1 -1
- package/dist/src/config/schema.d.ts +116 -92
- package/dist/src/config/schema.js +179 -73
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/core/errors.js +9 -2
- package/dist/src/core/errors.js.map +1 -1
- package/dist/src/core/exit-codes.js.map +1 -1
- package/dist/src/core/matcher.js +7 -6
- package/dist/src/core/matcher.js.map +1 -1
- package/dist/src/core/message-template.js.map +1 -1
- package/dist/src/core/nonces.d.ts +1 -0
- package/dist/src/core/nonces.js +4 -2
- package/dist/src/core/nonces.js.map +1 -1
- package/dist/src/core/reporters.d.ts +1 -0
- package/dist/src/core/reporters.js +42 -4
- package/dist/src/core/reporters.js.map +1 -1
- package/dist/src/core/run.d.ts +3 -0
- package/dist/src/core/run.js +415 -107
- package/dist/src/core/run.js.map +1 -1
- package/dist/src/core/safe-regex.d.ts +3 -0
- package/dist/src/core/safe-regex.js +21 -0
- package/dist/src/core/safe-regex.js.map +1 -0
- package/dist/src/index.d.ts +2 -2
- package/dist/src/index.js +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/openclaw/artifact-generation.d.ts +43 -0
- package/dist/src/openclaw/artifact-generation.js +363 -0
- package/dist/src/openclaw/artifact-generation.js.map +1 -0
- package/dist/src/openclaw/bridges/matrix.js +97 -12
- package/dist/src/openclaw/bridges/matrix.js.map +1 -1
- package/dist/src/openclaw/bridges/mattermost.js +32 -10
- package/dist/src/openclaw/bridges/mattermost.js.map +1 -1
- package/dist/src/openclaw/bridges/signal.js +55 -18
- package/dist/src/openclaw/bridges/signal.js.map +1 -1
- package/dist/src/openclaw/bridges/slack.js +85 -7
- package/dist/src/openclaw/bridges/slack.js.map +1 -1
- package/dist/src/openclaw/bridges/telegram.js +124 -30
- package/dist/src/openclaw/bridges/telegram.js.map +1 -1
- package/dist/src/openclaw/bridges/whatsapp.js +78 -17
- package/dist/src/openclaw/bridges/whatsapp.js.map +1 -1
- package/dist/src/openclaw/bridges/zalo.js +14 -5
- package/dist/src/openclaw/bridges/zalo.js.map +1 -1
- package/dist/src/openclaw/outbound-contract.d.ts +5 -0
- package/dist/src/openclaw/outbound-contract.js +40 -0
- package/dist/src/openclaw/outbound-contract.js.map +1 -0
- package/dist/src/openclaw/private-file.d.ts +28 -0
- package/dist/src/openclaw/private-file.js +465 -0
- package/dist/src/openclaw/private-file.js.map +1 -0
- package/dist/src/openclaw/shared.d.ts +21 -2
- package/dist/src/openclaw/shared.js +115 -18
- package/dist/src/openclaw/shared.js.map +1 -1
- package/dist/src/openclaw/smoke-lock.d.ts +63 -0
- package/dist/src/openclaw/smoke-lock.js +1004 -0
- package/dist/src/openclaw/smoke-lock.js.map +1 -0
- package/dist/src/openclaw.d.ts +16 -8
- package/dist/src/openclaw.js +334 -52
- package/dist/src/openclaw.js.map +1 -1
- package/dist/src/providers/builtin/discord.d.ts +10 -1
- package/dist/src/providers/builtin/discord.js +144 -18
- package/dist/src/providers/builtin/discord.js.map +1 -1
- package/dist/src/providers/builtin/external-webhook-auth.d.ts +11 -0
- package/dist/src/providers/builtin/external-webhook-auth.js +10 -0
- package/dist/src/providers/builtin/external-webhook-auth.js.map +1 -0
- package/dist/src/providers/builtin/feishu.d.ts +19 -2
- package/dist/src/providers/builtin/feishu.js +307 -25
- package/dist/src/providers/builtin/feishu.js.map +1 -1
- package/dist/src/providers/builtin/googlechat.d.ts +20 -1
- package/dist/src/providers/builtin/googlechat.js +178 -19
- package/dist/src/providers/builtin/googlechat.js.map +1 -1
- package/dist/src/providers/builtin/imessage.d.ts +4 -0
- package/dist/src/providers/builtin/imessage.js +26 -11
- package/dist/src/providers/builtin/imessage.js.map +1 -1
- package/dist/src/providers/builtin/loopback.js +92 -30
- package/dist/src/providers/builtin/loopback.js.map +1 -1
- package/dist/src/providers/builtin/matrix.d.ts +11 -1
- package/dist/src/providers/builtin/matrix.js +53 -29
- package/dist/src/providers/builtin/matrix.js.map +1 -1
- package/dist/src/providers/builtin/mattermost.d.ts +10 -0
- package/dist/src/providers/builtin/mattermost.js +38 -15
- package/dist/src/providers/builtin/mattermost.js.map +1 -1
- package/dist/src/providers/builtin/msteams.d.ts +17 -1
- package/dist/src/providers/builtin/msteams.js +113 -14
- package/dist/src/providers/builtin/msteams.js.map +1 -1
- package/dist/src/providers/builtin/native-local-mock.d.ts +2 -9
- package/dist/src/providers/builtin/native-local-mock.js +12 -35
- package/dist/src/providers/builtin/native-local-mock.js.map +1 -1
- package/dist/src/providers/builtin/script.d.ts +11 -15
- package/dist/src/providers/builtin/script.js +566 -104
- package/dist/src/providers/builtin/script.js.map +1 -1
- package/dist/src/providers/builtin/slack.d.ts +6 -0
- package/dist/src/providers/builtin/slack.js +99 -40
- package/dist/src/providers/builtin/slack.js.map +1 -1
- package/dist/src/providers/builtin/telegram.d.ts +6 -0
- package/dist/src/providers/builtin/telegram.js +64 -43
- package/dist/src/providers/builtin/telegram.js.map +1 -1
- package/dist/src/providers/builtin/whatsapp.d.ts +28 -8
- package/dist/src/providers/builtin/whatsapp.js +567 -30
- package/dist/src/providers/builtin/whatsapp.js.map +1 -1
- package/dist/src/providers/builtin/zalo.js +30 -19
- package/dist/src/providers/builtin/zalo.js.map +1 -1
- package/dist/src/providers/catalog.d.ts +3 -3
- package/dist/src/providers/catalog.js +3 -3
- package/dist/src/providers/catalog.js.map +1 -1
- package/dist/src/providers/local-mock.d.ts +11 -2
- package/dist/src/providers/local-mock.js +322 -96
- package/dist/src/providers/local-mock.js.map +1 -1
- package/dist/src/providers/native-ids.d.ts +1 -0
- package/dist/src/providers/native-ids.js +6 -1
- package/dist/src/providers/native-ids.js.map +1 -1
- package/dist/src/providers/recorder.d.ts +30 -2
- package/dist/src/providers/recorder.js +549 -70
- package/dist/src/providers/recorder.js.map +1 -1
- package/dist/src/providers/registry.d.ts +25 -1
- package/dist/src/providers/registry.js +280 -40
- package/dist/src/providers/registry.js.map +1 -1
- package/dist/src/providers/signed-jwt.d.ts +29 -0
- package/dist/src/providers/signed-jwt.js +202 -0
- package/dist/src/providers/signed-jwt.js.map +1 -0
- package/dist/src/providers/slack-ids.js.map +1 -1
- package/dist/src/providers/target-normalizers.d.ts +26 -0
- package/dist/src/providers/target-normalizers.js +276 -0
- package/dist/src/providers/target-normalizers.js.map +1 -0
- package/dist/src/providers/types.d.ts +5 -0
- package/dist/src/providers/types.js.map +1 -1
- package/dist/src/providers/webhook-server.d.ts +2 -0
- package/dist/src/providers/webhook-server.js +72 -25
- package/dist/src/providers/webhook-server.js.map +1 -1
- package/dist/src/servers/http.d.ts +23 -3
- package/dist/src/servers/http.js +213 -20
- package/dist/src/servers/http.js.map +1 -1
- package/dist/src/servers/index.js +20 -21
- package/dist/src/servers/index.js.map +1 -1
- package/dist/src/servers/matrix.js +465 -51
- package/dist/src/servers/matrix.js.map +1 -1
- package/dist/src/servers/mattermost.d.ts +5 -0
- package/dist/src/servers/mattermost.js +306 -58
- package/dist/src/servers/mattermost.js.map +1 -1
- package/dist/src/servers/pending-events.d.ts +2 -0
- package/dist/src/servers/pending-events.js +11 -0
- package/dist/src/servers/pending-events.js.map +1 -0
- package/dist/src/servers/recorder.d.ts +5 -0
- package/dist/src/servers/recorder.js +262 -3
- package/dist/src/servers/recorder.js.map +1 -1
- package/dist/src/servers/signal.d.ts +2 -0
- package/dist/src/servers/signal.js +444 -56
- package/dist/src/servers/signal.js.map +1 -1
- package/dist/src/servers/slack.d.ts +5 -0
- package/dist/src/servers/slack.js +515 -49
- package/dist/src/servers/slack.js.map +1 -1
- package/dist/src/servers/telegram.d.ts +111 -0
- package/dist/src/servers/telegram.js +830 -158
- package/dist/src/servers/telegram.js.map +1 -1
- package/dist/src/servers/webhook-target.d.ts +40 -0
- package/dist/src/servers/webhook-target.js +349 -0
- package/dist/src/servers/webhook-target.js.map +1 -0
- package/dist/src/servers/websocket.d.ts +2 -0
- package/dist/src/servers/websocket.js +29 -0
- package/dist/src/servers/websocket.js.map +1 -0
- package/dist/src/servers/whatsapp-baileys-websocket.d.ts +65 -1
- package/dist/src/servers/whatsapp-baileys-websocket.js +723 -99
- package/dist/src/servers/whatsapp-baileys-websocket.js.map +1 -1
- package/dist/src/servers/whatsapp-jid.d.ts +5 -0
- package/dist/src/servers/whatsapp-jid.js +32 -0
- package/dist/src/servers/whatsapp-jid.js.map +1 -0
- package/dist/src/servers/whatsapp-wire/binary-node.d.ts +5 -0
- package/dist/src/servers/whatsapp-wire/binary-node.js +87 -20
- package/dist/src/servers/whatsapp-wire/binary-node.js.map +1 -1
- package/dist/src/servers/whatsapp-wire/crypto.d.ts +6 -1
- package/dist/src/servers/whatsapp-wire/crypto.js +99 -45
- package/dist/src/servers/whatsapp-wire/crypto.js.map +1 -1
- package/dist/src/servers/whatsapp-wire/handshake.js +39 -4
- package/dist/src/servers/whatsapp-wire/handshake.js.map +1 -1
- package/dist/src/servers/whatsapp-wire/signal.js.map +1 -1
- package/dist/src/servers/whatsapp.d.ts +12 -7
- package/dist/src/servers/whatsapp.js +269 -107
- package/dist/src/servers/whatsapp.js.map +1 -1
- package/dist/src/servers/zalo.d.ts +14 -0
- package/dist/src/servers/zalo.js +521 -88
- package/dist/src/servers/zalo.js.map +1 -1
- package/docs/channel-setup.md +197 -19
- package/fixtures/examples/crabline.example.yaml +10 -0
- package/package.json +20 -15
package/dist/src/core/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/core/run.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/core/run.ts"],"names":[],"mappings":"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","sourcesContent":["import { matchesInbound } from \"./matcher.js\";\nimport { createOutboundText } from \"./message-template.js\";\nimport { createNonce } from \"./nonces.js\";\nimport { inboundRegexSafetyError } from \"./safe-regex.js\";\nimport { type FailureKind, CrablineError, ensureErrorMessage } from \"./errors.js\";\nimport { EXIT_CODES, type ExitCode } from \"./exit-codes.js\";\nimport type { ManifestDefinition } from \"../config/schema.js\";\nimport type { Registry } from \"../providers/registry.js\";\n\nexport type CommandRunResult = {\n diagnostics: string[];\n exitCode?: ExitCode | undefined;\n failureKind?: FailureKind | undefined;\n fixtureId: string;\n mode: string;\n nonce?: string | undefined;\n ok: boolean;\n providerId: string;\n};\n\nexport type SuiteRunResult = {\n results: CommandRunResult[];\n totalPassed: number;\n};\n\nconst INBOUND_DEADLINE_REACHED = Symbol(\"inbound deadline reached\");\nconst INBOUND_ABORT_GRACE_MS = 250;\nconst MAX_EXCLUDED_INBOUND_IDS = 1_024;\nconst MAX_SCRIPT_STDIN_BYTES = 1024 * 1024;\n\nclass UnsettledProviderOperationError extends CrablineError {}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nasync function raceInboundDeadline<T>(\n operation: Promise<T>,\n timeoutMs: number,\n): Promise<T | typeof INBOUND_DEADLINE_REACHED> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n const deadline = new Promise<typeof INBOUND_DEADLINE_REACHED>((resolve) => {\n timer = setTimeout(() => resolve(INBOUND_DEADLINE_REACHED), timeoutMs);\n });\n try {\n return await Promise.race([operation, deadline]);\n } finally {\n if (timer) {\n clearTimeout(timer);\n }\n }\n}\n\nasync function withFixtureDeadline<T>(\n operation: (signal: AbortSignal) => Promise<T>,\n timeoutMs: number,\n operationName: string,\n): Promise<T> {\n const controller = new AbortController();\n const pending = Promise.resolve().then(async () => await operation(controller.signal));\n const result = await raceInboundDeadline(pending, timeoutMs);\n if (result === INBOUND_DEADLINE_REACHED) {\n const timeoutError = new CrablineError(\n `Provider ${operationName} timed out after ${timeoutMs}ms.`,\n {\n kind: \"timeout\",\n },\n );\n controller.abort(timeoutError);\n const settled = pending.then(\n () => true,\n () => true,\n );\n if ((await raceInboundDeadline(settled, INBOUND_ABORT_GRACE_MS)) === INBOUND_DEADLINE_REACHED) {\n throw new UnsettledProviderOperationError(\n `Provider ${operationName} did not settle within ${INBOUND_ABORT_GRACE_MS}ms after abort.`,\n {\n cause: timeoutError,\n kind: \"timeout\",\n },\n );\n }\n throw timeoutError;\n }\n return result;\n}\n\nasync function withCleanupDeadline<T>(\n operation: Promise<T>,\n timeoutMs: number,\n operationName: string,\n): Promise<T> {\n const result = await raceInboundDeadline(operation, timeoutMs);\n if (result === INBOUND_DEADLINE_REACHED) {\n throw new CrablineError(`Provider ${operationName} timed out after ${timeoutMs}ms.`, {\n kind: \"timeout\",\n });\n }\n return result;\n}\n\nfunction jsonStringByteLength(value: string, limit: number): number {\n let bytes = 2;\n for (let index = 0; index < value.length && bytes <= limit; index += 1) {\n const code = value.charCodeAt(index);\n if (code === 0x22 || code === 0x5c || code === 0x08 || code === 0x09 || code === 0x0a) {\n bytes += 2;\n } else if (code === 0x0c || code === 0x0d) {\n bytes += 2;\n } else if (code <= 0x1f) {\n bytes += 6;\n } else if (code >= 0xd800 && code <= 0xdbff) {\n const next = value.charCodeAt(index + 1);\n if (next >= 0xdc00 && next <= 0xdfff) {\n bytes += 4;\n index += 1;\n } else {\n bytes += 6;\n }\n } else if (code >= 0xdc00 && code <= 0xdfff) {\n bytes += 6;\n } else if (code <= 0x7f) {\n bytes += 1;\n } else if (code <= 0x7ff) {\n bytes += 2;\n } else {\n bytes += 3;\n }\n }\n return bytes;\n}\n\nfunction boundedJsonByteLength(\n value: unknown,\n limit: number,\n ancestors = new Set<object>(),\n arrayEntry = false,\n): number {\n if (value === null || value === undefined || typeof value === \"function\") {\n return value === undefined && !arrayEntry ? 0 : 4;\n }\n if (typeof value === \"string\") {\n return jsonStringByteLength(value, limit);\n }\n if (typeof value === \"number\") {\n return Number.isFinite(value) ? String(value).length : 4;\n }\n if (typeof value === \"boolean\") {\n return value ? 4 : 5;\n }\n if (typeof value !== \"object\") {\n return 0;\n }\n if (ancestors.has(value)) {\n throw new CrablineError(\"Script command input must not contain circular values.\", {\n kind: \"config\",\n });\n }\n\n ancestors.add(value);\n let bytes = 2;\n let entries = 0;\n if (Array.isArray(value)) {\n for (const entry of value) {\n if (entries > 0) {\n bytes += 1;\n }\n bytes += boundedJsonByteLength(entry, limit - bytes, ancestors, true);\n entries += 1;\n if (bytes > limit) {\n break;\n }\n }\n } else {\n for (const [key, entry] of Object.entries(value)) {\n if (entry === undefined || typeof entry === \"function\") {\n continue;\n }\n if (entries > 0) {\n bytes += 1;\n }\n bytes += jsonStringByteLength(key, limit - bytes) + 1;\n bytes += boundedJsonByteLength(entry, limit - bytes, ancestors);\n entries += 1;\n if (bytes > limit) {\n break;\n }\n }\n }\n ancestors.delete(value);\n return bytes;\n}\n\nexport function assertScriptStdinPayloadSize(payload: unknown): void {\n if (boundedJsonByteLength(payload, MAX_SCRIPT_STDIN_BYTES) > MAX_SCRIPT_STDIN_BYTES) {\n throw new CrablineError(`Script command input exceeded ${MAX_SCRIPT_STDIN_BYTES} bytes.`, {\n kind: \"config\",\n });\n }\n}\n\nfunction scriptPayloadBase(context: {\n config: ManifestDefinition[\"providers\"][string];\n fixture: ManifestDefinition[\"fixtures\"][number];\n manifestPath: string;\n providerId: string;\n}): object {\n return {\n fixture: context.fixture,\n provider: {\n config: context.config,\n id: context.providerId,\n manifestPath: context.manifestPath,\n },\n };\n}\n\nasync function abortAndDrainInboundWait(\n operation: Promise<unknown>,\n controller: AbortController,\n): Promise<boolean> {\n controller.abort(new Error(\"Inbound wait deadline reached.\"));\n const settled = operation.then(\n () => true,\n () => true,\n );\n return (await raceInboundDeadline(settled, INBOUND_ABORT_GRACE_MS)) !== INBOUND_DEADLINE_REACHED;\n}\n\nexport async function runFixtureCommand(params: {\n fixtureId: string;\n manifest: ManifestDefinition;\n manifestPath: string;\n modeOverride?: \"agent\" | \"probe\" | \"roundtrip\" | \"send\";\n registry: Registry;\n}): Promise<CommandRunResult> {\n const configuredFixture = params.manifest.fixtures.find((entry) => entry.id === params.fixtureId);\n if (!configuredFixture) {\n throw new CrablineError(`Unknown fixture: ${params.fixtureId}`, { kind: \"config\" });\n }\n\n const mode = params.modeOverride ?? configuredFixture.mode;\n const fixture =\n mode === configuredFixture.mode ? configuredFixture : { ...configuredFixture, mode };\n const provider = params.registry.resolve(fixture.provider, fixture.id);\n const diagnostics: string[] = [];\n let abortDrainFailed = false;\n\n const contextBase = {\n config: params.manifest.providers[fixture.provider]!,\n fixture,\n manifestPath: params.manifestPath,\n providerId: fixture.provider,\n userName: params.manifest.userName,\n };\n\n let result: CommandRunResult | undefined;\n try {\n if (!provider.supports.includes(mode)) {\n result = {\n diagnostics: [`provider ${fixture.provider} does not support mode ${mode}`],\n failureKind: \"config\",\n fixtureId: fixture.id,\n mode,\n ok: false,\n providerId: fixture.provider,\n };\n }\n\n if (!result) {\n for (const envName of [\n ...fixture.env,\n ...(params.manifest.providers[fixture.provider]?.env ?? []),\n ]) {\n if (!process.env[envName]) {\n result = {\n diagnostics: [`missing env: ${envName}`],\n failureKind: \"config\",\n fixtureId: fixture.id,\n mode,\n ok: false,\n providerId: fixture.provider,\n };\n break;\n }\n }\n }\n\n if (result) {\n // Preflight failures still flow through provider cleanup before returning.\n } else if (mode === \"probe\") {\n try {\n if (contextBase.config.adapter === \"script\") {\n assertScriptStdinPayloadSize(scriptPayloadBase(contextBase));\n }\n const probeResult = await withFixtureDeadline(\n async (signal) => await provider.probe({ ...contextBase, signal }),\n fixture.timeoutMs,\n \"probe\",\n );\n return (result = {\n diagnostics: probeResult.details,\n failureKind: probeResult.healthy ? undefined : \"connectivity\",\n fixtureId: fixture.id,\n mode,\n ok: probeResult.healthy,\n providerId: fixture.provider,\n });\n } catch (error) {\n if (error instanceof UnsettledProviderOperationError) {\n abortDrainFailed = true;\n }\n return (result = toFailure(fixture.id, fixture.provider, mode, error, \"connectivity\"));\n }\n } else {\n if (fixture.inboundMatch.strategy === \"regex\" && fixture.inboundMatch.pattern) {\n try {\n RegExp(fixture.inboundMatch.pattern, \"u\");\n const safetyError = inboundRegexSafetyError(fixture.inboundMatch.pattern);\n if (safetyError) {\n throw new Error(safetyError);\n }\n } catch (error) {\n return (result = toFailure(\n fixture.id,\n fixture.provider,\n mode,\n new CrablineError(`Invalid inbound regex: ${ensureErrorMessage(error)}`, {\n cause: error,\n kind: \"config\",\n }),\n \"config\",\n ));\n }\n }\n\n let attempts = 0;\n const maxAttempts = fixture.retries + 1;\n let lastFailure: CommandRunResult | null = null;\n\n while (attempts < maxAttempts) {\n attempts += 1;\n const nonce = createNonce(fixture.id);\n\n try {\n const outboundText = createOutboundText({ ...fixture, mode }, nonce);\n const since = new Date().toISOString();\n let accepted;\n try {\n const sendContext = {\n ...contextBase,\n mode,\n nonce,\n text: outboundText,\n };\n if (contextBase.config.adapter === \"script\") {\n assertScriptStdinPayloadSize({\n ...scriptPayloadBase(contextBase),\n outbound: {\n mode,\n nonce,\n target: fixture.target,\n text: outboundText,\n },\n });\n }\n accepted = await withFixtureDeadline(\n async (signal) => await provider.send({ ...sendContext, signal }),\n fixture.timeoutMs,\n \"send\",\n );\n } catch (error) {\n lastFailure = toFailure(fixture.id, fixture.provider, mode, error, \"outbound\", nonce);\n if (error instanceof UnsettledProviderOperationError) {\n abortDrainFailed = true;\n break;\n }\n continue;\n }\n if (!accepted.accepted) {\n lastFailure = toFailure(\n fixture.id,\n fixture.provider,\n mode,\n new CrablineError(`Provider rejected outbound message ${accepted.messageId}.`, {\n kind: \"outbound\",\n }),\n \"outbound\",\n nonce,\n );\n continue;\n }\n diagnostics.push(`accepted message ${accepted.messageId}`);\n\n if (mode === \"send\") {\n return (result = {\n diagnostics,\n fixtureId: fixture.id,\n mode,\n nonce,\n ok: true,\n providerId: fixture.provider,\n });\n }\n\n const inboundDeadline = Date.now() + fixture.timeoutMs;\n const seenInbound = new Set<string>();\n const excludedInboundIds = new Set<string>();\n let inbound;\n try {\n while (Date.now() < inboundDeadline) {\n const timeoutMs = inboundDeadline - Date.now();\n const controller = new AbortController();\n const excludeIds = [...excludedInboundIds];\n const waitContext = {\n ...contextBase,\n excludeIds,\n nonce,\n signal: controller.signal,\n since,\n threadId: accepted.threadId,\n timeoutMs,\n };\n if (contextBase.config.adapter === \"script\") {\n assertScriptStdinPayloadSize({\n ...scriptPayloadBase(contextBase),\n wait: {\n excludeIds,\n nonce,\n since,\n target: fixture.target,\n threadId: accepted.threadId,\n timeoutMs,\n },\n });\n }\n const wait = provider.waitForInbound(waitContext);\n const candidate = await raceInboundDeadline(wait, timeoutMs);\n if (candidate === INBOUND_DEADLINE_REACHED) {\n if (!(await abortAndDrainInboundWait(wait, controller))) {\n abortDrainFailed = true;\n throw new UnsettledProviderOperationError(\n `Provider inbound wait did not settle within ${INBOUND_ABORT_GRACE_MS}ms after abort.`,\n { kind: \"inbound\" },\n );\n }\n break;\n }\n if (!candidate) {\n break;\n }\n\n const key = JSON.stringify([candidate.provider, candidate.threadId, candidate.id]);\n if (seenInbound.has(key)) {\n await sleep(Math.min(10, Math.max(0, inboundDeadline - Date.now())));\n continue;\n }\n seenInbound.add(key);\n\n if (matchesInbound(candidate, fixture.inboundMatch, nonce)) {\n inbound = candidate;\n break;\n }\n if (!excludedInboundIds.has(candidate.id)) {\n if (excludedInboundIds.size >= MAX_EXCLUDED_INBOUND_IDS) {\n throw new CrablineError(\n `Provider returned more than ${MAX_EXCLUDED_INBOUND_IDS} unmatched inbound message IDs.`,\n { kind: \"inbound\" },\n );\n }\n excludedInboundIds.add(candidate.id);\n }\n }\n } catch (error) {\n lastFailure = toFailure(fixture.id, fixture.provider, mode, error, \"inbound\", nonce);\n if (abortDrainFailed) {\n break;\n }\n continue;\n }\n if (!inbound) {\n lastFailure = {\n diagnostics: [\n ...diagnostics,\n `timed out waiting for inbound after ${fixture.timeoutMs}ms`,\n ],\n failureKind: \"timeout\",\n fixtureId: fixture.id,\n mode,\n nonce,\n ok: false,\n providerId: fixture.provider,\n };\n if (attempts < maxAttempts) {\n await sleep(50);\n }\n continue;\n }\n\n return (result = {\n diagnostics: [...diagnostics, `matched inbound ${inbound.id}`],\n fixtureId: fixture.id,\n mode,\n nonce,\n ok: true,\n providerId: fixture.provider,\n });\n } catch (error) {\n lastFailure = toFailure(fixture.id, fixture.provider, mode, error, \"assertion\", nonce);\n }\n }\n\n return (result = lastFailure ?? {\n diagnostics: [\"unknown failure\"],\n failureKind: \"assertion\",\n fixtureId: fixture.id,\n mode,\n ok: false,\n providerId: fixture.provider,\n });\n }\n } finally {\n const cleanupErrors: unknown[] = [];\n try {\n provider.beginCleanup?.();\n } catch (error) {\n cleanupErrors.push(error);\n }\n try {\n const cleanup = provider.cleanup?.();\n if (cleanup) {\n if (\n abortDrainFailed &&\n (await raceInboundDeadline(cleanup, INBOUND_ABORT_GRACE_MS)) === INBOUND_DEADLINE_REACHED\n ) {\n cleanupErrors.push(\n new Error(\n `Provider cleanup did not settle within ${INBOUND_ABORT_GRACE_MS}ms after an aborted operation.`,\n ),\n );\n }\n if (!abortDrainFailed) {\n await withCleanupDeadline(cleanup, fixture.timeoutMs, \"cleanup\");\n }\n }\n } catch (error) {\n cleanupErrors.push(error);\n }\n if (cleanupErrors.length > 0) {\n const cleanupError =\n cleanupErrors.length === 1\n ? cleanupErrors[0]\n : new AggregateError(\n cleanupErrors,\n cleanupErrors.map((error) => ensureErrorMessage(error)).join(\"; \"),\n );\n const diagnostic = `cleanup failed: ${ensureErrorMessage(cleanupError)}`;\n if (result) {\n result.diagnostics.push(diagnostic);\n if (result.ok) {\n result.exitCode = EXIT_CODES.ASSERTION;\n result.failureKind = \"assertion\";\n result.ok = false;\n }\n } else {\n result = {\n diagnostics: [...diagnostics, diagnostic],\n exitCode: EXIT_CODES.ASSERTION,\n failureKind: \"assertion\",\n fixtureId: fixture.id,\n mode,\n ok: false,\n providerId: fixture.provider,\n };\n }\n }\n }\n\n // The finally block can synthesize a result when provider cleanup fails.\n // oxlint-disable-next-line no-unreachable\n return result!;\n}\n\nexport async function runSuite(params: {\n fixtureIds: string[];\n manifest: ManifestDefinition;\n manifestPath: string;\n registry: Registry;\n}): Promise<SuiteRunResult> {\n const results: CommandRunResult[] = [];\n for (const fixtureId of params.fixtureIds) {\n results.push(\n await runFixtureCommand({\n fixtureId,\n manifest: params.manifest,\n manifestPath: params.manifestPath,\n registry: params.registry,\n }),\n );\n }\n\n return {\n results,\n totalPassed: results.filter((entry) => entry.ok).length,\n };\n}\n\nexport function computeExitCode(result: CommandRunResult | SuiteRunResult): number {\n if (\"results\" in result) {\n const failure = result.results.find((entry) => !entry.ok);\n return failure ? computeExitCode(failure) : 0;\n }\n\n if (result.ok) {\n return 0;\n }\n\n if (result.exitCode !== undefined) {\n return result.exitCode;\n }\n\n switch (result.failureKind) {\n case \"auth\":\n return 11;\n case \"config\":\n return 10;\n case \"connectivity\":\n return 12;\n case \"outbound\":\n return 13;\n case \"inbound\":\n return 14;\n case \"timeout\":\n return 15;\n case \"assertion\":\n return 16;\n default:\n return 1;\n }\n}\n\nfunction toFailure(\n fixtureId: string,\n providerId: string,\n mode: string,\n error: unknown,\n fallbackKind: FailureKind,\n nonce?: string,\n): CommandRunResult {\n const diagnostics = [ensureErrorMessage(error)];\n if (error instanceof CrablineError) {\n return {\n diagnostics,\n exitCode: error.exitCode,\n failureKind: error.kind,\n fixtureId,\n mode,\n nonce,\n ok: false,\n providerId,\n };\n }\n\n return {\n diagnostics,\n failureKind: fallbackKind,\n fixtureId,\n mode,\n nonce,\n ok: false,\n providerId,\n };\n}\n"]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { RE2JS } from "re2js";
|
|
2
|
+
const MAX_INBOUND_REGEX_LENGTH = 512;
|
|
3
|
+
export function inboundRegexSafetyError(pattern) {
|
|
4
|
+
if (pattern.length > MAX_INBOUND_REGEX_LENGTH) {
|
|
5
|
+
return `must contain at most ${MAX_INBOUND_REGEX_LENGTH} characters`;
|
|
6
|
+
}
|
|
7
|
+
try {
|
|
8
|
+
compileInboundRegex(pattern);
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return "must use syntax supported by the linear-time regex engine";
|
|
12
|
+
}
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
export function compileInboundRegex(pattern) {
|
|
16
|
+
if (pattern.length > MAX_INBOUND_REGEX_LENGTH) {
|
|
17
|
+
throw new Error(`Regex must contain at most ${MAX_INBOUND_REGEX_LENGTH} characters.`);
|
|
18
|
+
}
|
|
19
|
+
return RE2JS.compile(RE2JS.translateRegExp(pattern));
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=safe-regex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safe-regex.js","sourceRoot":"","sources":["../../../src/core/safe-regex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAE9B,MAAM,wBAAwB,GAAG,GAAG,CAAC;AAErC,MAAM,UAAU,uBAAuB,CAAC,OAAe;IACrD,IAAI,OAAO,CAAC,MAAM,GAAG,wBAAwB,EAAE,CAAC;QAC9C,OAAO,wBAAwB,wBAAwB,aAAa,CAAC;IACvE,CAAC;IACD,IAAI,CAAC;QACH,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,2DAA2D,CAAC;IACrE,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,IAAI,OAAO,CAAC,MAAM,GAAG,wBAAwB,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,8BAA8B,wBAAwB,cAAc,CAAC,CAAC;IACxF,CAAC;IACD,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;AACvD,CAAC","sourcesContent":["import { RE2JS } from \"re2js\";\n\nconst MAX_INBOUND_REGEX_LENGTH = 512;\n\nexport function inboundRegexSafetyError(pattern: string): string | undefined {\n if (pattern.length > MAX_INBOUND_REGEX_LENGTH) {\n return `must contain at most ${MAX_INBOUND_REGEX_LENGTH} characters`;\n }\n try {\n compileInboundRegex(pattern);\n } catch {\n return \"must use syntax supported by the linear-time regex engine\";\n }\n return undefined;\n}\n\nexport function compileInboundRegex(pattern: string): RE2JS {\n if (pattern.length > MAX_INBOUND_REGEX_LENGTH) {\n throw new Error(`Regex must contain at most ${MAX_INBOUND_REGEX_LENGTH} characters.`);\n }\n return RE2JS.compile(RE2JS.translateRegExp(pattern));\n}\n"]}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -8,7 +8,7 @@ export { startTelegramServer, startTelegramServer as startTelegramFakeServer, }
|
|
|
8
8
|
export { startWhatsAppServer, startWhatsAppServer as startWhatsAppFakeServer, } from "./servers/whatsapp.js";
|
|
9
9
|
export { startZaloServer } from "./servers/zalo.js";
|
|
10
10
|
export { CRABLINE_SERVER_CHANNELS, CRABLINE_SERVER_CHANNELS as CRABLINE_FAKE_PROVIDER_CHANNELS, isCrablineServerChannel, isCrablineServerChannel as isCrablineFakeProviderChannel, startCrablineServer, startCrablineServer as startCrablineFakeProviderServer, } from "./servers/index.js";
|
|
11
|
-
export { createOpenClawCrablineAgentDelivery, createOpenClawCrablineChannelReportNotes, createOpenClawCrablineProviderBinding as createOpenClawCrablineFakeProviderBinding, createOpenClawCrablineProviderBinding, createOpenClawCrablineInbound, createOpenClawCrablineOutboundFromRecorderEvent, OPENCLAW_CRABLINE_CHANNEL_CAPABILITY_MATRIX_PATH, OPENCLAW_CRABLINE_CHANNEL_SMOKE_PATH, OPENCLAW_CRABLINE_DEFAULT_CHANNEL, OPENCLAW_CRABLINE_MANIFEST_PATH, probeOpenClawCrablineProvider as probeOpenClawCrablineFakeProvider, probeOpenClawCrablineProvider, resolveOpenClawCrablineChannel, resolveOpenClawCrablineChannelDriverSelection, runOpenClawCrablineChannelDriverSmoke, startOpenClawCrablineAdapter, } from "./openclaw.js";
|
|
11
|
+
export { createOpenClawCrablineAgentDelivery, createOpenClawCrablineChannelReportNotes, createOpenClawCrablineProviderBinding as createOpenClawCrablineFakeProviderBinding, createOpenClawCrablineProviderBinding, createOpenClawCrablineInbound, createOpenClawCrablineOutboundFromRecorderEvent, OPENCLAW_CRABLINE_ARTIFACT_POINTER_PATH, OPENCLAW_CRABLINE_ARTIFACT_STORE_DIRECTORY, OPENCLAW_CRABLINE_CHANNEL_CAPABILITY_MATRIX_PATH, OPENCLAW_CRABLINE_CHANNEL_SMOKE_PATH, OPENCLAW_CRABLINE_PROVIDER_READINESS_PATH, OPENCLAW_CRABLINE_DEFAULT_CHANNEL, OPENCLAW_CRABLINE_MANIFEST_PATH, probeOpenClawCrablineProvider as probeOpenClawCrablineFakeProvider, probeOpenClawCrablineProvider, resolveOpenClawCrablineChannel, resolveOpenClawCrablineChannelDriverSelection, runOpenClawCrablineProviderReadiness, runOpenClawCrablineChannelDriverSmoke, startOpenClawCrablineAdapter, } from "./openclaw.js";
|
|
12
12
|
export { BUILTIN_ADAPTERS, FIXTURE_MODES, INBOUND_AUTHORS, INBOUND_NONCE_MODES, INBOUND_STRATEGIES, ManifestSchema, PROVIDER_PLATFORMS, ProviderConfigSchema, } from "./config/schema.js";
|
|
13
13
|
export { OPENCLAW_SUPPORT_CATALOG } from "./providers/catalog.js";
|
|
14
14
|
export { createRegistry } from "./providers/registry.js";
|
|
@@ -26,4 +26,4 @@ export type { StartedTelegramServer as StartedTelegramFakeServer, StartedTelegra
|
|
|
26
26
|
export type { StartedWhatsAppServer as StartedWhatsAppFakeServer, StartedWhatsAppServer, StartWhatsAppServerParams as StartWhatsAppFakeServerParams, StartWhatsAppServerParams, WhatsAppBaileysMessage, WhatsAppServerManifest as WhatsAppFakeServerManifest, WhatsAppServerManifest, } from "./servers/whatsapp.js";
|
|
27
27
|
export type { StartedZaloServer, StartZaloServerParams, ZaloServerManifest, } from "./servers/zalo.js";
|
|
28
28
|
export type { CrablineServerChannel as CrablineFakeProviderChannel, CrablineServerChannel, CrablineServerManifest as CrablineFakeProviderManifest, CrablineServerManifest, StartedCrablineServer as StartedCrablineFakeProviderServer, StartedCrablineServer, StartCrablineServerParams as StartCrablineFakeProviderServerParams, StartCrablineServerParams, } from "./servers/index.js";
|
|
29
|
-
export type { OpenClawCrablineAgentDelivery, OpenClawCrablineChannelDriverSelection, OpenClawCrablineChannelDriverSmokeResult, OpenClawCrablineGatewayBinding, OpenClawCrablineInbound, OpenClawCrablineInboundInput, OpenClawCrablineOutboundMessage, StartedOpenClawCrablineAdapter, StartOpenClawCrablineAdapterParams, } from "./openclaw.js";
|
|
29
|
+
export type { OpenClawCrablineAgentDelivery, OpenClawCrablineChannelDriverSelection, OpenClawCrablineChannelDriverSmokeResult, OpenClawCrablineProviderReadinessResult, OpenClawCrablineConversation, OpenClawCrablineGatewayBinding, OpenClawCrablineInbound, OpenClawCrablineInboundInput, OpenClawCrablineOutboundMessage, StartedOpenClawCrablineAdapter, StartOpenClawCrablineAdapterParams, } from "./openclaw.js";
|
package/dist/src/index.js
CHANGED
|
@@ -8,7 +8,7 @@ export { startTelegramServer, startTelegramServer as startTelegramFakeServer, }
|
|
|
8
8
|
export { startWhatsAppServer, startWhatsAppServer as startWhatsAppFakeServer, } from "./servers/whatsapp.js";
|
|
9
9
|
export { startZaloServer } from "./servers/zalo.js";
|
|
10
10
|
export { CRABLINE_SERVER_CHANNELS, CRABLINE_SERVER_CHANNELS as CRABLINE_FAKE_PROVIDER_CHANNELS, isCrablineServerChannel, isCrablineServerChannel as isCrablineFakeProviderChannel, startCrablineServer, startCrablineServer as startCrablineFakeProviderServer, } from "./servers/index.js";
|
|
11
|
-
export { createOpenClawCrablineAgentDelivery, createOpenClawCrablineChannelReportNotes, createOpenClawCrablineProviderBinding as createOpenClawCrablineFakeProviderBinding, createOpenClawCrablineProviderBinding, createOpenClawCrablineInbound, createOpenClawCrablineOutboundFromRecorderEvent, OPENCLAW_CRABLINE_CHANNEL_CAPABILITY_MATRIX_PATH, OPENCLAW_CRABLINE_CHANNEL_SMOKE_PATH, OPENCLAW_CRABLINE_DEFAULT_CHANNEL, OPENCLAW_CRABLINE_MANIFEST_PATH, probeOpenClawCrablineProvider as probeOpenClawCrablineFakeProvider, probeOpenClawCrablineProvider, resolveOpenClawCrablineChannel, resolveOpenClawCrablineChannelDriverSelection, runOpenClawCrablineChannelDriverSmoke, startOpenClawCrablineAdapter, } from "./openclaw.js";
|
|
11
|
+
export { createOpenClawCrablineAgentDelivery, createOpenClawCrablineChannelReportNotes, createOpenClawCrablineProviderBinding as createOpenClawCrablineFakeProviderBinding, createOpenClawCrablineProviderBinding, createOpenClawCrablineInbound, createOpenClawCrablineOutboundFromRecorderEvent, OPENCLAW_CRABLINE_ARTIFACT_POINTER_PATH, OPENCLAW_CRABLINE_ARTIFACT_STORE_DIRECTORY, OPENCLAW_CRABLINE_CHANNEL_CAPABILITY_MATRIX_PATH, OPENCLAW_CRABLINE_CHANNEL_SMOKE_PATH, OPENCLAW_CRABLINE_PROVIDER_READINESS_PATH, OPENCLAW_CRABLINE_DEFAULT_CHANNEL, OPENCLAW_CRABLINE_MANIFEST_PATH, probeOpenClawCrablineProvider as probeOpenClawCrablineFakeProvider, probeOpenClawCrablineProvider, resolveOpenClawCrablineChannel, resolveOpenClawCrablineChannelDriverSelection, runOpenClawCrablineProviderReadiness, runOpenClawCrablineChannelDriverSmoke, startOpenClawCrablineAdapter, } from "./openclaw.js";
|
|
12
12
|
export { BUILTIN_ADAPTERS, FIXTURE_MODES, INBOUND_AUTHORS, INBOUND_NONCE_MODES, INBOUND_STRATEGIES, ManifestSchema, PROVIDER_PLATFORMS, ProviderConfigSchema, } from "./config/schema.js";
|
|
13
13
|
export { OPENCLAW_SUPPORT_CATALOG } from "./providers/catalog.js";
|
|
14
14
|
export { createRegistry } from "./providers/registry.js";
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,EAAE,4BAA4B,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,IAAI,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAChG,OAAO,EACL,mBAAmB,EACnB,mBAAmB,IAAI,uBAAuB,GAC/C,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,mBAAmB,EACnB,mBAAmB,IAAI,uBAAuB,GAC/C,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EACL,wBAAwB,EACxB,wBAAwB,IAAI,+BAA+B,EAC3D,uBAAuB,EACvB,uBAAuB,IAAI,6BAA6B,EACxD,mBAAmB,EACnB,mBAAmB,IAAI,+BAA+B,GACvD,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,mCAAmC,EACnC,wCAAwC,EACxC,qCAAqC,IAAI,yCAAyC,EAClF,qCAAqC,EACrC,6BAA6B,EAC7B,+CAA+C,EAC/C,gDAAgD,EAChD,oCAAoC,EACpC,iCAAiC,EACjC,+BAA+B,EAC/B,6BAA6B,IAAI,iCAAiC,EAClE,6BAA6B,EAC7B,8BAA8B,EAC9B,6CAA6C,EAC7C,qCAAqC,EACrC,4BAA4B,GAC7B,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,cAAc,EACd,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,EAAE,4BAA4B,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,IAAI,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAChG,OAAO,EACL,mBAAmB,EACnB,mBAAmB,IAAI,uBAAuB,GAC/C,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,mBAAmB,EACnB,mBAAmB,IAAI,uBAAuB,GAC/C,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EACL,wBAAwB,EACxB,wBAAwB,IAAI,+BAA+B,EAC3D,uBAAuB,EACvB,uBAAuB,IAAI,6BAA6B,EACxD,mBAAmB,EACnB,mBAAmB,IAAI,+BAA+B,GACvD,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,mCAAmC,EACnC,wCAAwC,EACxC,qCAAqC,IAAI,yCAAyC,EAClF,qCAAqC,EACrC,6BAA6B,EAC7B,+CAA+C,EAC/C,uCAAuC,EACvC,0CAA0C,EAC1C,gDAAgD,EAChD,oCAAoC,EACpC,yCAAyC,EACzC,iCAAiC,EACjC,+BAA+B,EAC/B,6BAA6B,IAAI,iCAAiC,EAClE,6BAA6B,EAC7B,8BAA8B,EAC9B,6CAA6C,EAC7C,oCAAoC,EACpC,qCAAqC,EACrC,4BAA4B,GAC7B,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,cAAc,EACd,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC","sourcesContent":["export { resolveTelegramAdapterConfig } from \"./providers/builtin/telegram.js\";\nexport { resolveWhatsAppAdapterConfig } from \"./providers/builtin/whatsapp.js\";\nexport { startMattermostServer } from \"./servers/mattermost.js\";\nexport { startMatrixServer } from \"./servers/matrix.js\";\nexport { startSignalServer } from \"./servers/signal.js\";\nexport { startSlackServer, startSlackServer as startSlackFakeServer } from \"./servers/slack.js\";\nexport {\n startTelegramServer,\n startTelegramServer as startTelegramFakeServer,\n} from \"./servers/telegram.js\";\nexport {\n startWhatsAppServer,\n startWhatsAppServer as startWhatsAppFakeServer,\n} from \"./servers/whatsapp.js\";\nexport { startZaloServer } from \"./servers/zalo.js\";\nexport {\n CRABLINE_SERVER_CHANNELS,\n CRABLINE_SERVER_CHANNELS as CRABLINE_FAKE_PROVIDER_CHANNELS,\n isCrablineServerChannel,\n isCrablineServerChannel as isCrablineFakeProviderChannel,\n startCrablineServer,\n startCrablineServer as startCrablineFakeProviderServer,\n} from \"./servers/index.js\";\nexport {\n createOpenClawCrablineAgentDelivery,\n createOpenClawCrablineChannelReportNotes,\n createOpenClawCrablineProviderBinding as createOpenClawCrablineFakeProviderBinding,\n createOpenClawCrablineProviderBinding,\n createOpenClawCrablineInbound,\n createOpenClawCrablineOutboundFromRecorderEvent,\n OPENCLAW_CRABLINE_ARTIFACT_POINTER_PATH,\n OPENCLAW_CRABLINE_ARTIFACT_STORE_DIRECTORY,\n OPENCLAW_CRABLINE_CHANNEL_CAPABILITY_MATRIX_PATH,\n OPENCLAW_CRABLINE_CHANNEL_SMOKE_PATH,\n OPENCLAW_CRABLINE_PROVIDER_READINESS_PATH,\n OPENCLAW_CRABLINE_DEFAULT_CHANNEL,\n OPENCLAW_CRABLINE_MANIFEST_PATH,\n probeOpenClawCrablineProvider as probeOpenClawCrablineFakeProvider,\n probeOpenClawCrablineProvider,\n resolveOpenClawCrablineChannel,\n resolveOpenClawCrablineChannelDriverSelection,\n runOpenClawCrablineProviderReadiness,\n runOpenClawCrablineChannelDriverSmoke,\n startOpenClawCrablineAdapter,\n} from \"./openclaw.js\";\nexport {\n BUILTIN_ADAPTERS,\n FIXTURE_MODES,\n INBOUND_AUTHORS,\n INBOUND_NONCE_MODES,\n INBOUND_STRATEGIES,\n ManifestSchema,\n PROVIDER_PLATFORMS,\n ProviderConfigSchema,\n} from \"./config/schema.js\";\nexport { OPENCLAW_SUPPORT_CATALOG } from \"./providers/catalog.js\";\nexport { createRegistry } from \"./providers/registry.js\";\nexport type { CatalogEntry } from \"./providers/catalog.js\";\nexport type { Registry } from \"./providers/registry.js\";\nexport type { ServerRequestEvent } from \"./servers/http.js\";\nexport type { ServerEventObserver } from \"./servers/recorder.js\";\nexport type {\n BuiltinAdapterId,\n FixtureDefinition,\n FixtureMode,\n ManifestDefinition,\n ProviderConfig,\n ProviderPlatform,\n} from \"./config/schema.js\";\nexport type {\n InboundEnvelope,\n NormalizedTarget,\n ProbeResult,\n ProviderAdapter,\n ProviderContext,\n ProviderSupportStatus,\n SendContext,\n SendResult,\n WaitContext,\n WatchContext,\n} from \"./providers/types.js\";\nexport type {\n MattermostServerManifest,\n StartedMattermostServer,\n StartMattermostServerParams,\n} from \"./servers/mattermost.js\";\nexport type {\n MatrixServerManifest,\n StartedMatrixServer,\n StartMatrixServerParams,\n} from \"./servers/matrix.js\";\nexport type {\n SignalServerManifest,\n StartedSignalServer,\n StartSignalServerParams,\n} from \"./servers/signal.js\";\nexport type {\n SlackServerManifest as SlackFakeServerManifest,\n SlackServerManifest,\n StartedSlackServer as StartedSlackFakeServer,\n StartedSlackServer,\n StartSlackServerParams as StartSlackFakeServerParams,\n StartSlackServerParams,\n} from \"./servers/slack.js\";\nexport type {\n StartedTelegramServer as StartedTelegramFakeServer,\n StartedTelegramServer,\n StartTelegramServerParams as StartTelegramFakeServerParams,\n StartTelegramServerParams,\n TelegramServerManifest as TelegramFakeServerManifest,\n TelegramServerManifest,\n} from \"./servers/telegram.js\";\nexport type {\n StartedWhatsAppServer as StartedWhatsAppFakeServer,\n StartedWhatsAppServer,\n StartWhatsAppServerParams as StartWhatsAppFakeServerParams,\n StartWhatsAppServerParams,\n WhatsAppBaileysMessage,\n WhatsAppServerManifest as WhatsAppFakeServerManifest,\n WhatsAppServerManifest,\n} from \"./servers/whatsapp.js\";\nexport type {\n StartedZaloServer,\n StartZaloServerParams,\n ZaloServerManifest,\n} from \"./servers/zalo.js\";\nexport type {\n CrablineServerChannel as CrablineFakeProviderChannel,\n CrablineServerChannel,\n CrablineServerManifest as CrablineFakeProviderManifest,\n CrablineServerManifest,\n StartedCrablineServer as StartedCrablineFakeProviderServer,\n StartedCrablineServer,\n StartCrablineServerParams as StartCrablineFakeProviderServerParams,\n StartCrablineServerParams,\n} from \"./servers/index.js\";\nexport type {\n OpenClawCrablineAgentDelivery,\n OpenClawCrablineChannelDriverSelection,\n OpenClawCrablineChannelDriverSmokeResult,\n OpenClawCrablineProviderReadinessResult,\n OpenClawCrablineConversation,\n OpenClawCrablineGatewayBinding,\n OpenClawCrablineInbound,\n OpenClawCrablineInboundInput,\n OpenClawCrablineOutboundMessage,\n StartedOpenClawCrablineAdapter,\n StartOpenClawCrablineAdapterParams,\n} from \"./openclaw.js\";\n"]}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { CrablineServerManifest } from "../servers/index.js";
|
|
2
|
+
import { publishPrivateFileAtomically, syncParentDirectory } from "./private-file.js";
|
|
3
|
+
import { type OpenClawCrablineChannelDriverSelection } from "./shared.js";
|
|
4
|
+
import type { OpenClawCrablineSmokeRunLock } from "./smoke-lock.js";
|
|
5
|
+
export type OpenClawCrablineArtifactPointer = {
|
|
6
|
+
capabilityMatrixPath: string;
|
|
7
|
+
generation: string;
|
|
8
|
+
manifestPath: string;
|
|
9
|
+
previousGeneration?: string;
|
|
10
|
+
providerReadinessArtifactPath: string;
|
|
11
|
+
smokeArtifactPath: string;
|
|
12
|
+
version: 1;
|
|
13
|
+
};
|
|
14
|
+
export type PublishedOpenClawCrablineArtifactGeneration = OpenClawCrablineArtifactPointer & {
|
|
15
|
+
pointerPath: string;
|
|
16
|
+
providerReadiness: Record<string, unknown>;
|
|
17
|
+
smoke: Record<string, unknown>;
|
|
18
|
+
warnings?: string[];
|
|
19
|
+
};
|
|
20
|
+
type PublishGenerationDependencies = {
|
|
21
|
+
beforePointerSwitch?: (pointer: OpenClawCrablineArtifactPointer) => Promise<void>;
|
|
22
|
+
createGenerationId?: () => string;
|
|
23
|
+
platform?: NodeJS.Platform;
|
|
24
|
+
publishPrivateFile?: typeof publishPrivateFileAtomically;
|
|
25
|
+
secureWindowsDirectory?: (directoryPath: string) => Promise<void>;
|
|
26
|
+
secureWindowsFile?: (filePath: string) => Promise<void>;
|
|
27
|
+
syncParent?: typeof syncParentDirectory;
|
|
28
|
+
};
|
|
29
|
+
type RecorderSnapshot = {
|
|
30
|
+
contents: string;
|
|
31
|
+
fileName: string;
|
|
32
|
+
};
|
|
33
|
+
export declare function readOpenClawCrablineArtifactPointer(outputDir: string): Promise<OpenClawCrablineArtifactPointer | null>;
|
|
34
|
+
export declare function publishOpenClawCrablineArtifactGeneration(params: {
|
|
35
|
+
capabilityReport: unknown;
|
|
36
|
+
lock: OpenClawCrablineSmokeRunLock;
|
|
37
|
+
manifest: CrablineServerManifest;
|
|
38
|
+
outputDir: string;
|
|
39
|
+
recorderSnapshot?: RecorderSnapshot;
|
|
40
|
+
selection: OpenClawCrablineChannelDriverSelection;
|
|
41
|
+
providerReadiness: Record<string, unknown>;
|
|
42
|
+
}, dependencies?: PublishGenerationDependencies): Promise<PublishedOpenClawCrablineArtifactGeneration>;
|
|
43
|
+
export {};
|
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import fs from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { captureDirectoryIdentity, publishPrivateFileAtomically, removeSecuredPrivateDirectory, securePrivateDirectory, syncParentDirectory, } from "./private-file.js";
|
|
5
|
+
import { OPENCLAW_CRABLINE_ARTIFACT_POINTER_PATH, OPENCLAW_CRABLINE_ARTIFACT_STORE_DIRECTORY, OPENCLAW_CRABLINE_CHANNEL_CAPABILITY_MATRIX_PATH, OPENCLAW_CRABLINE_CHANNEL_SMOKE_PATH, OPENCLAW_CRABLINE_PROVIDER_READINESS_PATH, OPENCLAW_CRABLINE_MANIFEST_PATH, } from "./shared.js";
|
|
6
|
+
const GENERATION_NAME_PATTERN = /^generation-[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/iu;
|
|
7
|
+
const STAGING_NAME_PATTERN = /^\.staging-[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/iu;
|
|
8
|
+
const REMOVAL_TOMBSTONE_PATTERN = /^\.(.+)\.\d+\.[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\.remove$/iu;
|
|
9
|
+
function resolveProviderReadinessArtifactPath(selection) {
|
|
10
|
+
const readinessPath = selection.providerReadinessArtifactPath ?? selection.smokeArtifactPath;
|
|
11
|
+
if (selection.capabilityMatrixPath !== OPENCLAW_CRABLINE_CHANNEL_CAPABILITY_MATRIX_PATH ||
|
|
12
|
+
readinessPath !== OPENCLAW_CRABLINE_PROVIDER_READINESS_PATH) {
|
|
13
|
+
throw new Error("OpenClaw Crabline artifact selection paths are malformed.");
|
|
14
|
+
}
|
|
15
|
+
return readinessPath;
|
|
16
|
+
}
|
|
17
|
+
function isMissingPathError(error) {
|
|
18
|
+
return error.code === "ENOENT";
|
|
19
|
+
}
|
|
20
|
+
function assertGenerationName(value, field) {
|
|
21
|
+
if (typeof value !== "string" || !GENERATION_NAME_PATTERN.test(value)) {
|
|
22
|
+
throw new Error(`OpenClaw Crabline artifact pointer ${field} is malformed.`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function generationArtifactPath(generation, fileName) {
|
|
26
|
+
return path.join(OPENCLAW_CRABLINE_ARTIFACT_STORE_DIRECTORY, generation, fileName);
|
|
27
|
+
}
|
|
28
|
+
function artifactRemovalTombstoneBaseName(name) {
|
|
29
|
+
const originalName = REMOVAL_TOMBSTONE_PATTERN.exec(name)?.[1];
|
|
30
|
+
return originalName !== undefined &&
|
|
31
|
+
(GENERATION_NAME_PATTERN.test(originalName) || STAGING_NAME_PATTERN.test(originalName))
|
|
32
|
+
? originalName
|
|
33
|
+
: null;
|
|
34
|
+
}
|
|
35
|
+
function withRecorderSnapshotPath(providerReadiness, recorderPath) {
|
|
36
|
+
const result = providerReadiness.result;
|
|
37
|
+
if (!result || typeof result !== "object" || Array.isArray(result)) {
|
|
38
|
+
throw new Error("OpenClaw Crabline provider readiness result is malformed.");
|
|
39
|
+
}
|
|
40
|
+
return {
|
|
41
|
+
...providerReadiness,
|
|
42
|
+
result: {
|
|
43
|
+
...result,
|
|
44
|
+
recorderPath,
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
function parseArtifactPointer(contents) {
|
|
49
|
+
let value;
|
|
50
|
+
try {
|
|
51
|
+
value = JSON.parse(contents);
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
throw new Error("OpenClaw Crabline artifact pointer is malformed.", { cause: error });
|
|
55
|
+
}
|
|
56
|
+
if (value.version !== 1) {
|
|
57
|
+
throw new Error("OpenClaw Crabline artifact pointer is malformed.");
|
|
58
|
+
}
|
|
59
|
+
assertGenerationName(value.generation, "generation");
|
|
60
|
+
if (value.previousGeneration !== undefined) {
|
|
61
|
+
assertGenerationName(value.previousGeneration, "previousGeneration");
|
|
62
|
+
if (value.previousGeneration === value.generation) {
|
|
63
|
+
throw new Error("OpenClaw Crabline artifact pointer is malformed.");
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
const expected = {
|
|
67
|
+
capabilityMatrixPath: generationArtifactPath(value.generation, OPENCLAW_CRABLINE_CHANNEL_CAPABILITY_MATRIX_PATH),
|
|
68
|
+
manifestPath: generationArtifactPath(value.generation, OPENCLAW_CRABLINE_MANIFEST_PATH),
|
|
69
|
+
providerReadinessArtifactPath: generationArtifactPath(value.generation, OPENCLAW_CRABLINE_PROVIDER_READINESS_PATH),
|
|
70
|
+
smokeArtifactPath: generationArtifactPath(value.generation, OPENCLAW_CRABLINE_CHANNEL_SMOKE_PATH),
|
|
71
|
+
};
|
|
72
|
+
if (typeof value.capabilityMatrixPath !== "string" ||
|
|
73
|
+
value.capabilityMatrixPath !== expected.capabilityMatrixPath ||
|
|
74
|
+
value.manifestPath !== expected.manifestPath ||
|
|
75
|
+
(value.providerReadinessArtifactPath !== undefined &&
|
|
76
|
+
value.providerReadinessArtifactPath !== expected.providerReadinessArtifactPath) ||
|
|
77
|
+
(value.smokeArtifactPath !== undefined &&
|
|
78
|
+
value.smokeArtifactPath !== expected.smokeArtifactPath) ||
|
|
79
|
+
(value.providerReadinessArtifactPath === undefined && value.smokeArtifactPath === undefined)) {
|
|
80
|
+
throw new Error("OpenClaw Crabline artifact pointer is malformed.");
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
capabilityMatrixPath: value.capabilityMatrixPath,
|
|
84
|
+
generation: value.generation,
|
|
85
|
+
...(value.previousGeneration ? { previousGeneration: value.previousGeneration } : {}),
|
|
86
|
+
manifestPath: value.manifestPath,
|
|
87
|
+
providerReadinessArtifactPath: value.providerReadinessArtifactPath ?? value.smokeArtifactPath,
|
|
88
|
+
smokeArtifactPath: value.smokeArtifactPath ?? value.providerReadinessArtifactPath,
|
|
89
|
+
version: 1,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
export async function readOpenClawCrablineArtifactPointer(outputDir) {
|
|
93
|
+
try {
|
|
94
|
+
return parseArtifactPointer(await fs.readFile(path.join(path.resolve(outputDir), OPENCLAW_CRABLINE_ARTIFACT_POINTER_PATH), "utf8"));
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
if (isMissingPathError(error)) {
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
throw error;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
async function assertCurrentGenerationExists(outputDir, pointer) {
|
|
104
|
+
for (const artifactPath of [
|
|
105
|
+
pointer.manifestPath,
|
|
106
|
+
pointer.capabilityMatrixPath,
|
|
107
|
+
pointer.providerReadinessArtifactPath,
|
|
108
|
+
]) {
|
|
109
|
+
const stats = await fs.lstat(path.join(outputDir, artifactPath));
|
|
110
|
+
if (!stats.isFile()) {
|
|
111
|
+
throw new Error("OpenClaw Crabline current artifact generation is incomplete.");
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
async function pruneArtifactStore(params) {
|
|
116
|
+
const retainedGenerations = new Set(params.pointer
|
|
117
|
+
? [params.pointer.generation, params.pointer.previousGeneration].filter((generation) => generation !== undefined)
|
|
118
|
+
: []);
|
|
119
|
+
for (const entry of await fs.readdir(params.store.directoryPath, { withFileTypes: true })) {
|
|
120
|
+
const isAbandonedStaging = entry.isDirectory() && STAGING_NAME_PATTERN.test(entry.name);
|
|
121
|
+
const isObsoleteGeneration = entry.isDirectory() &&
|
|
122
|
+
GENERATION_NAME_PATTERN.test(entry.name) &&
|
|
123
|
+
!retainedGenerations.has(entry.name);
|
|
124
|
+
const removalTombstoneBaseName = entry.isDirectory()
|
|
125
|
+
? artifactRemovalTombstoneBaseName(entry.name)
|
|
126
|
+
: null;
|
|
127
|
+
const isRemovalTombstone = removalTombstoneBaseName !== null;
|
|
128
|
+
if (!isAbandonedStaging && !isObsoleteGeneration && !isRemovalTombstone) {
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
await params.lock.assertOwned();
|
|
132
|
+
await params.store.assertIdentityAt();
|
|
133
|
+
const obsolete = await securePrivateDirectory(path.join(params.store.directoryPath, entry.name), params.directoryOptions);
|
|
134
|
+
await removeSecuredPrivateDirectory(obsolete, undefined, removalTombstoneBaseName ?? entry.name);
|
|
135
|
+
await params.store.assertIdentityAt();
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
export async function publishOpenClawCrablineArtifactGeneration(params, dependencies = {}) {
|
|
139
|
+
const providerReadinessArtifactPath = resolveProviderReadinessArtifactPath(params.selection);
|
|
140
|
+
const outputDir = path.resolve(params.outputDir);
|
|
141
|
+
await fs.mkdir(outputDir, { recursive: true });
|
|
142
|
+
const output = await captureDirectoryIdentity(outputDir);
|
|
143
|
+
await output.assertIdentityAt();
|
|
144
|
+
const storePath = path.join(outputDir, OPENCLAW_CRABLINE_ARTIFACT_STORE_DIRECTORY);
|
|
145
|
+
const directoryOptions = {
|
|
146
|
+
...(dependencies.platform ? { platform: dependencies.platform } : {}),
|
|
147
|
+
...(dependencies.secureWindowsDirectory
|
|
148
|
+
? { secureWindowsDirectory: dependencies.secureWindowsDirectory }
|
|
149
|
+
: {}),
|
|
150
|
+
...(dependencies.syncParent ? { syncParent: dependencies.syncParent } : {}),
|
|
151
|
+
};
|
|
152
|
+
const store = await securePrivateDirectory(storePath, directoryOptions);
|
|
153
|
+
await output.assertIdentityAt();
|
|
154
|
+
await store.assertIdentityAt();
|
|
155
|
+
await params.lock.assertOwned();
|
|
156
|
+
const currentPointer = await readOpenClawCrablineArtifactPointer(outputDir);
|
|
157
|
+
await output.assertIdentityAt();
|
|
158
|
+
await store.assertIdentityAt();
|
|
159
|
+
if (currentPointer) {
|
|
160
|
+
await assertCurrentGenerationExists(outputDir, currentPointer);
|
|
161
|
+
await output.assertIdentityAt();
|
|
162
|
+
await store.assertIdentityAt();
|
|
163
|
+
}
|
|
164
|
+
await pruneArtifactStore({
|
|
165
|
+
directoryOptions,
|
|
166
|
+
lock: params.lock,
|
|
167
|
+
pointer: currentPointer,
|
|
168
|
+
store,
|
|
169
|
+
});
|
|
170
|
+
await output.assertIdentityAt();
|
|
171
|
+
await store.assertIdentityAt();
|
|
172
|
+
const generationId = dependencies.createGenerationId?.() ?? randomUUID();
|
|
173
|
+
const generation = `generation-${generationId}`;
|
|
174
|
+
if (!GENERATION_NAME_PATTERN.test(generation)) {
|
|
175
|
+
throw new Error("OpenClaw Crabline artifact generation id is malformed.");
|
|
176
|
+
}
|
|
177
|
+
const stagingPath = path.join(storePath, `.staging-${generationId}`);
|
|
178
|
+
const generationPath = path.join(storePath, generation);
|
|
179
|
+
const staging = await securePrivateDirectory(stagingPath, directoryOptions);
|
|
180
|
+
await output.assertIdentityAt();
|
|
181
|
+
await store.assertIdentityAt();
|
|
182
|
+
await staging.assertIdentityAt();
|
|
183
|
+
const publishPrivateFile = dependencies.publishPrivateFile ?? publishPrivateFileAtomically;
|
|
184
|
+
const fileOptions = {
|
|
185
|
+
...(dependencies.platform ? { platform: dependencies.platform } : {}),
|
|
186
|
+
...(dependencies.secureWindowsFile
|
|
187
|
+
? { secureWindowsFile: dependencies.secureWindowsFile }
|
|
188
|
+
: {}),
|
|
189
|
+
...(dependencies.syncParent ? { syncParent: dependencies.syncParent } : {}),
|
|
190
|
+
};
|
|
191
|
+
let installed = false;
|
|
192
|
+
let committed = false;
|
|
193
|
+
let primaryError;
|
|
194
|
+
let published;
|
|
195
|
+
try {
|
|
196
|
+
const pointer = {
|
|
197
|
+
capabilityMatrixPath: generationArtifactPath(generation, params.selection.capabilityMatrixPath),
|
|
198
|
+
generation,
|
|
199
|
+
manifestPath: generationArtifactPath(generation, OPENCLAW_CRABLINE_MANIFEST_PATH),
|
|
200
|
+
...(currentPointer ? { previousGeneration: currentPointer.generation } : {}),
|
|
201
|
+
providerReadinessArtifactPath: generationArtifactPath(generation, providerReadinessArtifactPath),
|
|
202
|
+
smokeArtifactPath: generationArtifactPath(generation, providerReadinessArtifactPath),
|
|
203
|
+
version: 1,
|
|
204
|
+
};
|
|
205
|
+
if (params.recorderSnapshot &&
|
|
206
|
+
(path.basename(params.recorderSnapshot.fileName) !== params.recorderSnapshot.fileName ||
|
|
207
|
+
!params.recorderSnapshot.fileName.endsWith(".jsonl"))) {
|
|
208
|
+
throw new Error("OpenClaw Crabline recorder snapshot filename is malformed.");
|
|
209
|
+
}
|
|
210
|
+
const recorderSnapshotPath = params.recorderSnapshot
|
|
211
|
+
? generationArtifactPath(generation, params.recorderSnapshot.fileName)
|
|
212
|
+
: undefined;
|
|
213
|
+
const publishedManifest = recorderSnapshotPath
|
|
214
|
+
? { ...params.manifest, recorderPath: recorderSnapshotPath }
|
|
215
|
+
: params.manifest;
|
|
216
|
+
const providerReadinessBase = recorderSnapshotPath
|
|
217
|
+
? withRecorderSnapshotPath(params.providerReadiness, recorderSnapshotPath)
|
|
218
|
+
: params.providerReadiness;
|
|
219
|
+
const providerReadiness = {
|
|
220
|
+
...providerReadinessBase,
|
|
221
|
+
manifestPath: pointer.manifestPath,
|
|
222
|
+
};
|
|
223
|
+
const artifactContents = [
|
|
224
|
+
{
|
|
225
|
+
contents: `${JSON.stringify(publishedManifest, null, 2)}\n`,
|
|
226
|
+
fileName: OPENCLAW_CRABLINE_MANIFEST_PATH,
|
|
227
|
+
},
|
|
228
|
+
{
|
|
229
|
+
contents: `${JSON.stringify({
|
|
230
|
+
version: 1,
|
|
231
|
+
source: "openclaw/crabline",
|
|
232
|
+
channelDriver: params.selection.channelDriver,
|
|
233
|
+
selectedChannel: params.selection.channel,
|
|
234
|
+
manifestPath: pointer.manifestPath,
|
|
235
|
+
report: params.capabilityReport,
|
|
236
|
+
}, null, 2)}\n`,
|
|
237
|
+
fileName: params.selection.capabilityMatrixPath,
|
|
238
|
+
},
|
|
239
|
+
{
|
|
240
|
+
contents: `${JSON.stringify({
|
|
241
|
+
version: 1,
|
|
242
|
+
source: "openclaw/crabline",
|
|
243
|
+
channelDriver: params.selection.channelDriver,
|
|
244
|
+
selectedChannel: params.selection.channel,
|
|
245
|
+
manifestPath: pointer.manifestPath,
|
|
246
|
+
providerReadiness,
|
|
247
|
+
smoke: providerReadiness,
|
|
248
|
+
}, null, 2)}\n`,
|
|
249
|
+
fileName: providerReadinessArtifactPath,
|
|
250
|
+
},
|
|
251
|
+
...(params.recorderSnapshot
|
|
252
|
+
? [
|
|
253
|
+
{
|
|
254
|
+
contents: params.recorderSnapshot.contents,
|
|
255
|
+
fileName: params.recorderSnapshot.fileName,
|
|
256
|
+
},
|
|
257
|
+
]
|
|
258
|
+
: []),
|
|
259
|
+
];
|
|
260
|
+
await params.lock.assertOwned();
|
|
261
|
+
for (const artifact of artifactContents) {
|
|
262
|
+
await output.assertIdentityAt();
|
|
263
|
+
await store.assertIdentityAt();
|
|
264
|
+
await staging.assertIdentityAt();
|
|
265
|
+
await publishPrivateFile(path.join(stagingPath, artifact.fileName), artifact.contents, fileOptions);
|
|
266
|
+
await output.assertIdentityAt();
|
|
267
|
+
await store.assertIdentityAt();
|
|
268
|
+
await staging.assertIdentityAt();
|
|
269
|
+
}
|
|
270
|
+
await params.lock.assertOwned();
|
|
271
|
+
await output.assertIdentityAt();
|
|
272
|
+
await store.assertIdentityAt();
|
|
273
|
+
await fs.rename(stagingPath, generationPath);
|
|
274
|
+
installed = true;
|
|
275
|
+
await (dependencies.syncParent ?? syncParentDirectory)(generationPath, dependencies.platform);
|
|
276
|
+
await output.assertIdentityAt();
|
|
277
|
+
await staging.assertIdentityAt(generationPath);
|
|
278
|
+
await store.assertIdentityAt();
|
|
279
|
+
await dependencies.beforePointerSwitch?.(pointer);
|
|
280
|
+
await output.assertIdentityAt();
|
|
281
|
+
await store.assertIdentityAt();
|
|
282
|
+
await staging.assertIdentityAt(generationPath);
|
|
283
|
+
await params.lock.commitFileAtomically({
|
|
284
|
+
contents: `${JSON.stringify(pointer, null, 2)}\n`,
|
|
285
|
+
destinationPath: path.join(outputDir, OPENCLAW_CRABLINE_ARTIFACT_POINTER_PATH),
|
|
286
|
+
stageDirectory: store.directoryPath,
|
|
287
|
+
stageFile: async (filePath, contents) => {
|
|
288
|
+
await output.assertIdentityAt();
|
|
289
|
+
await store.assertIdentityAt();
|
|
290
|
+
await staging.assertIdentityAt(generationPath);
|
|
291
|
+
await publishPrivateFile(filePath, contents, fileOptions);
|
|
292
|
+
await output.assertIdentityAt();
|
|
293
|
+
await store.assertIdentityAt();
|
|
294
|
+
await staging.assertIdentityAt(generationPath);
|
|
295
|
+
},
|
|
296
|
+
});
|
|
297
|
+
committed = true;
|
|
298
|
+
let warnings;
|
|
299
|
+
try {
|
|
300
|
+
const committedPointer = await readOpenClawCrablineArtifactPointer(outputDir);
|
|
301
|
+
if (!committedPointer) {
|
|
302
|
+
throw new Error("OpenClaw Crabline artifact pointer is missing after publication.");
|
|
303
|
+
}
|
|
304
|
+
await pruneArtifactStore({
|
|
305
|
+
directoryOptions,
|
|
306
|
+
lock: params.lock,
|
|
307
|
+
pointer: committedPointer,
|
|
308
|
+
store,
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
catch (error) {
|
|
312
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
313
|
+
warnings = [`OpenClaw Crabline artifact retention cleanup failed: ${detail}`];
|
|
314
|
+
}
|
|
315
|
+
published = {
|
|
316
|
+
...pointer,
|
|
317
|
+
pointerPath: OPENCLAW_CRABLINE_ARTIFACT_POINTER_PATH,
|
|
318
|
+
providerReadiness,
|
|
319
|
+
smoke: providerReadiness,
|
|
320
|
+
...(warnings ? { warnings } : {}),
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
catch (error) {
|
|
324
|
+
primaryError = error;
|
|
325
|
+
}
|
|
326
|
+
if (!committed) {
|
|
327
|
+
const unpublishedPath = installed ? generationPath : stagingPath;
|
|
328
|
+
let referencedByPointer = false;
|
|
329
|
+
if (installed) {
|
|
330
|
+
try {
|
|
331
|
+
const livePointer = await readOpenClawCrablineArtifactPointer(outputDir);
|
|
332
|
+
referencedByPointer =
|
|
333
|
+
livePointer?.generation === generation || livePointer?.previousGeneration === generation;
|
|
334
|
+
}
|
|
335
|
+
catch {
|
|
336
|
+
referencedByPointer = true;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
if (!referencedByPointer) {
|
|
340
|
+
try {
|
|
341
|
+
await removeSecuredPrivateDirectory(staging, unpublishedPath);
|
|
342
|
+
}
|
|
343
|
+
catch (cleanupError) {
|
|
344
|
+
if (primaryError !== undefined) {
|
|
345
|
+
const primaryMessage = primaryError instanceof Error ? primaryError.message : String(primaryError);
|
|
346
|
+
const aggregateError = new AggregateError([primaryError, cleanupError], `${primaryMessage} OpenClaw Crabline artifact rollback cleanup also failed.`);
|
|
347
|
+
aggregateError.cause = primaryError;
|
|
348
|
+
const primaryCode = primaryError.code;
|
|
349
|
+
if (primaryCode) {
|
|
350
|
+
Object.assign(aggregateError, { code: primaryCode });
|
|
351
|
+
}
|
|
352
|
+
throw aggregateError;
|
|
353
|
+
}
|
|
354
|
+
throw cleanupError;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
if (primaryError !== undefined) {
|
|
359
|
+
throw primaryError;
|
|
360
|
+
}
|
|
361
|
+
return published;
|
|
362
|
+
}
|
|
363
|
+
//# sourceMappingURL=artifact-generation.js.map
|