@openclaw/crabline 0.1.9 → 0.1.10
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 +38 -0
- package/dist/src/openclaw/artifact-generation.js +314 -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 +26 -0
- package/dist/src/openclaw/private-file.js +411 -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 +949 -0
- package/dist/src/openclaw/smoke-lock.js.map +1 -0
- package/dist/src/openclaw.d.ts +16 -8
- package/dist/src/openclaw.js +194 -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 +539 -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 +46 -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 +811 -152
- 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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recorder.js","sourceRoot":"","sources":["../../../src/providers/recorder.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"recorder.js","sourceRoot":"","sources":["../../../src/providers/recorder.ts"],"names":[],"mappings":"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","sourcesContent":["import { lstat, mkdir, open, readFile, readlink, realpath } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { lock } from \"proper-lockfile\";\nimport type { InboundEnvelope } from \"./types.js\";\n\nexport type RecordableInboundEnvelope = InboundEnvelope & {\n recordedDirection?: \"inbound\" | \"outbound\";\n};\n\nexport type RecordedInboundEnvelope = RecordableInboundEnvelope & {\n recordedAt: string;\n};\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) {\n return Promise.resolve();\n }\n return new Promise((resolve) => {\n const done = () => {\n clearTimeout(timeout);\n signal?.removeEventListener(\"abort\", done);\n resolve();\n };\n const timeout = setTimeout(done, ms);\n signal?.addEventListener(\"abort\", done, { once: true });\n });\n}\n\nconst pendingAppends = new Map<string, Promise<void>>();\nconst recordIdentityIndexes = new Map<string, RecordIdentityIndex>();\nconst MAX_RECORD_IDENTITY_INDEXES = 128;\nconst MAX_RECENT_RECORD_KEYS = 4096;\nconst RECORDER_BATCH_VERSION = 1;\nconst RECORDER_LOCK_STALE_MS = 30_000;\nconst RECORDER_LOCK_UPDATE_MS = 10_000;\nconst RECORDER_ROTATION_ATTEMPTS = 3;\n\nclass RecorderRotatedError extends Error {}\n\ntype IncrementalReadState = {\n caughtUp: boolean;\n continuity: Buffer;\n generation: number;\n identity:\n | {\n dev: number;\n ino: number;\n }\n | undefined;\n offset: number;\n pending: Buffer;\n};\n\ntype RecordIdentityIndex = {\n readState: IncrementalReadState;\n seen: Set<string>;\n};\n\ntype RecorderFileIdentity = {\n dev: bigint;\n ino: bigint;\n};\n\ntype RecordedInboundBatchLine = {\n events: RecordedInboundEnvelope[];\n recordType: \"crabline.recorder.batch\";\n recorderBatchVersion: typeof RECORDER_BATCH_VERSION;\n};\n\nexport type RecordedInboundCursor = {\n buffered: RecordedInboundEnvelope[];\n readState: IncrementalReadState;\n seen: Set<string>;\n};\n\nconst CONTINUITY_BYTES = 4096;\nconst MAX_INCREMENTAL_READ_BYTES = 256 * 1024;\nconst MAX_PENDING_RECORD_BYTES = 4 * 1024 * 1024;\n\nfunction createIncrementalReadState(): IncrementalReadState {\n return {\n caughtUp: true,\n continuity: Buffer.alloc(0),\n generation: 0,\n identity: undefined,\n offset: 0,\n pending: Buffer.alloc(0),\n };\n}\n\nexport function createRecordedInboundCursor(): RecordedInboundCursor {\n return {\n buffered: [],\n readState: createIncrementalReadState(),\n seen: new Set(),\n };\n}\n\nexport function cloneRecordedInboundCursor(cursor: RecordedInboundCursor): RecordedInboundCursor {\n return {\n buffered: [...cursor.buffered],\n readState: {\n caughtUp: cursor.readState.caughtUp,\n continuity: Buffer.from(cursor.readState.continuity),\n generation: cursor.readState.generation,\n identity: cursor.readState.identity ? { ...cursor.readState.identity } : undefined,\n offset: cursor.readState.offset,\n pending: Buffer.from(cursor.readState.pending),\n },\n seen: new Set(cursor.seen),\n };\n}\n\nfunction rememberRecentRecord(seen: Set<string>, event: InboundEnvelope): boolean {\n const key = JSON.stringify([\n event.provider,\n event.threadId,\n event.id,\n recordedDirectionOf(event),\n ]);\n if (seen.has(key)) {\n return false;\n }\n seen.add(key);\n if (seen.size > MAX_RECENT_RECORD_KEYS) {\n seen.delete(seen.values().next().value!);\n }\n return true;\n}\n\nfunction recordedDirectionOf(\n event: Pick<RecordableInboundEnvelope, \"raw\" | \"recordedDirection\">,\n): \"inbound\" | \"outbound\" {\n if (event.recordedDirection) {\n return event.recordedDirection;\n }\n return event.raw !== null &&\n typeof event.raw === \"object\" &&\n \"direction\" in event.raw &&\n event.raw.direction === \"outbound\"\n ? \"outbound\"\n : \"inbound\";\n}\n\nfunction requireNonEmptyString(value: unknown, field: keyof RecordedInboundEnvelope): string {\n if (typeof value !== \"string\" || value.length === 0) {\n throw new Error(`Recorded inbound envelope ${field} must be a non-empty string.`);\n }\n return value;\n}\n\nfunction requireString(value: unknown, field: keyof RecordedInboundEnvelope): string {\n if (typeof value !== \"string\") {\n throw new Error(`Recorded inbound envelope ${field} must be a string.`);\n }\n return value;\n}\n\nfunction parseRecordedEnvelope(value: unknown): RecordedInboundEnvelope {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new Error(\"Recorded inbound envelope must be an object.\");\n }\n const record = value as Record<string, unknown>;\n if (record.author !== \"assistant\" && record.author !== \"system\" && record.author !== \"user\") {\n throw new Error(\"Recorded inbound envelope author must be assistant, system, or user.\");\n }\n if (\n record.recordedDirection !== undefined &&\n record.recordedDirection !== \"inbound\" &&\n record.recordedDirection !== \"outbound\"\n ) {\n throw new Error(\"Recorded inbound envelope recordedDirection must be inbound or outbound.\");\n }\n return {\n author: record.author,\n id: requireNonEmptyString(record.id, \"id\"),\n provider: requireNonEmptyString(record.provider, \"provider\"),\n ...(record.raw !== undefined ? { raw: record.raw } : {}),\n recordedAt: requireNonEmptyString(record.recordedAt, \"recordedAt\"),\n ...(record.recordedDirection !== undefined\n ? { recordedDirection: record.recordedDirection }\n : {}),\n sentAt: requireNonEmptyString(record.sentAt, \"sentAt\"),\n text: requireString(record.text, \"text\"),\n threadId: requireNonEmptyString(record.threadId, \"threadId\"),\n };\n}\n\nfunction parseRecordedLine(line: string): RecordedInboundEnvelope[] {\n const parsed = JSON.parse(line) as unknown;\n if (\n typeof parsed === \"object\" &&\n parsed !== null &&\n !Array.isArray(parsed) &&\n \"recordType\" in parsed &&\n parsed.recordType === \"crabline.recorder.batch\" &&\n \"recorderBatchVersion\" in parsed &&\n parsed.recorderBatchVersion === RECORDER_BATCH_VERSION &&\n \"events\" in parsed &&\n Array.isArray(parsed.events)\n ) {\n return parsed.events.map(parseRecordedEnvelope);\n }\n return [parseRecordedEnvelope(parsed)];\n}\n\nfunction resetIncrementalReadState(state: IncrementalReadState): void {\n if (\n state.identity !== undefined ||\n state.offset > 0 ||\n state.pending.length > 0 ||\n state.continuity.length > 0\n ) {\n state.generation += 1;\n }\n state.caughtUp = true;\n state.continuity = Buffer.alloc(0);\n state.offset = 0;\n state.pending = Buffer.alloc(0);\n}\n\nasync function readBufferAt(\n handle: Awaited<ReturnType<typeof open>>,\n length: number,\n position: number,\n): Promise<Buffer> {\n const buffer = Buffer.alloc(length);\n let bytesRead = 0;\n\n while (bytesRead < length) {\n const result = await handle.read(buffer, bytesRead, length - bytesRead, position + bytesRead);\n if (result.bytesRead === 0) {\n break;\n }\n bytesRead += result.bytesRead;\n }\n\n return buffer.subarray(0, bytesRead);\n}\n\nfunction consumeRecordedChunk(\n state: IncrementalReadState,\n chunk: Buffer,\n): RecordedInboundEnvelope[] {\n const continuity = Buffer.concat([state.continuity, chunk]);\n state.continuity = Buffer.from(continuity.subarray(-CONTINUITY_BYTES));\n\n const raw = state.pending.length > 0 ? Buffer.concat([state.pending, chunk]) : chunk;\n const lastNewline = raw.lastIndexOf(0x0a);\n if (lastNewline < 0) {\n if (raw.length > MAX_PENDING_RECORD_BYTES) {\n throw new Error(\n `Recorder record exceeded ${MAX_PENDING_RECORD_BYTES} bytes without a newline.`,\n );\n }\n state.pending = Buffer.from(raw);\n return [];\n }\n\n state.pending = Buffer.from(raw.subarray(lastNewline + 1));\n if (state.pending.length > MAX_PENDING_RECORD_BYTES) {\n throw new Error(\n `Recorder record exceeded ${MAX_PENDING_RECORD_BYTES} bytes without a newline.`,\n );\n }\n\n const events: RecordedInboundEnvelope[] = [];\n for (const line of raw.subarray(0, lastNewline).toString(\"utf8\").split(\"\\n\")) {\n if (line.trim()) {\n events.push(...parseRecordedLine(line));\n }\n }\n return events;\n}\n\nasync function appendJsonLine(filePath: string, line: string): Promise<void> {\n await serializeAppend(filePath, async (publicationPath, logicalPath) => {\n await appendCommittedLine(publicationPath, logicalPath, line, true);\n });\n}\n\nasync function readRecorderFileIdentity(\n filePath: string,\n): Promise<RecorderFileIdentity | undefined> {\n try {\n const stats = await lstat(filePath, { bigint: true });\n if (!stats.isFile()) {\n throw new Error(`Recorder path is not a regular file: ${filePath}`);\n }\n return {\n dev: stats.dev,\n ino: stats.ino,\n };\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return undefined;\n }\n throw error;\n }\n}\n\nfunction sameRecorderFileIdentity(\n left: RecorderFileIdentity | undefined,\n right: RecorderFileIdentity | undefined,\n): boolean {\n return left?.dev === right?.dev && left?.ino === right?.ino;\n}\n\nasync function resolveRecorderPublicationPath(filePath: string): Promise<string> {\n try {\n return await realpath(filePath);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n\n try {\n const stats = await lstat(filePath);\n if (stats.isSymbolicLink()) {\n const target = await readlink(filePath);\n return await resolveRecorderPublicationPath(path.resolve(path.dirname(filePath), target));\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n return path.join(await realpath(path.dirname(filePath)), path.basename(filePath));\n}\n\nasync function prepareRecorderTailForAppend(\n handle: Awaited<ReturnType<typeof open>>,\n): Promise<boolean> {\n const stats = await handle.stat();\n if (stats.size === 0) {\n return false;\n }\n\n const finalByte = await readBufferAt(handle, 1, stats.size - 1);\n if (finalByte[0] === 0x0a) {\n return false;\n }\n\n const windowSize = Math.min(stats.size, MAX_PENDING_RECORD_BYTES + 1);\n const tailWindow = await readBufferAt(handle, windowSize, stats.size - windowSize);\n const lastNewline = tailWindow.lastIndexOf(0x0a);\n if (lastNewline < 0 && stats.size > MAX_PENDING_RECORD_BYTES) {\n throw new Error(\n `Recorder record exceeded ${MAX_PENDING_RECORD_BYTES} bytes without a newline.`,\n );\n }\n\n const tailStart = stats.size - windowSize + lastNewline + 1;\n const tail = tailWindow.subarray(lastNewline + 1).toString(\"utf8\");\n try {\n JSON.parse(tail);\n await handle.writeFile(\"\\n\", \"utf8\");\n return true;\n } catch (error) {\n if (!(error instanceof SyntaxError)) {\n throw error;\n }\n await handle.truncate(tailStart);\n return true;\n }\n}\n\nasync function prepareRecorderPathForAppend(\n publicationPath: string,\n logicalPath: string,\n durable: boolean,\n): Promise<RecorderFileIdentity> {\n const handle = await open(publicationPath, \"a+\");\n const identity = await handle.stat({ bigint: true });\n const recorderIdentity = { dev: identity.dev, ino: identity.ino };\n try {\n const changed = await prepareRecorderTailForAppend(handle);\n if (changed && durable) {\n await handle.sync();\n }\n } finally {\n await handle.close();\n }\n\n if (\n !sameRecorderFileIdentity(\n recorderIdentity,\n await readRecorderFileIdentity(await resolveRecorderPublicationPath(logicalPath)),\n )\n ) {\n throw new RecorderRotatedError(\"Recorder rotated while preparing a committed line.\");\n }\n return recorderIdentity;\n}\n\nasync function appendCommittedLine(\n publicationPath: string,\n logicalPath: string,\n line: string,\n durable: boolean,\n expectedIdentity?: RecorderFileIdentity,\n): Promise<void> {\n const handle = await open(publicationPath, \"a+\");\n const identity = await handle.stat({ bigint: true });\n const recorderIdentity = { dev: identity.dev, ino: identity.ino };\n try {\n if (\n expectedIdentity !== undefined &&\n !sameRecorderFileIdentity(expectedIdentity, recorderIdentity)\n ) {\n throw new RecorderRotatedError(\"Recorder rotated before appending a committed line.\");\n }\n await prepareRecorderTailForAppend(handle);\n await handle.writeFile(line, \"utf8\");\n if (durable) {\n await handle.sync();\n }\n } finally {\n await handle.close();\n }\n\n if (\n !sameRecorderFileIdentity(\n recorderIdentity,\n await readRecorderFileIdentity(await resolveRecorderPublicationPath(logicalPath)),\n )\n ) {\n throw new RecorderRotatedError(\"Recorder rotated while appending a committed line.\");\n }\n}\n\nfunction recorderLockReleaseError(\n filePath: string,\n operationError: unknown,\n releaseError: unknown,\n): AggregateError {\n return new AggregateError(\n [operationError, releaseError],\n `Recorder append and lock release both failed for \"${filePath}\".`,\n { cause: operationError },\n );\n}\n\nasync function withRecorderLock<T>(filePath: string, operation: () => Promise<T>): Promise<T> {\n const release = await lock(filePath, {\n realpath: false,\n retries: {\n factor: 1,\n maxTimeout: 10,\n minTimeout: 10,\n retries: 500,\n },\n stale: RECORDER_LOCK_STALE_MS,\n update: RECORDER_LOCK_UPDATE_MS,\n });\n let operationFailed = false;\n let operationError: unknown;\n let result: T | undefined;\n try {\n result = await operation();\n } catch (error) {\n operationFailed = true;\n operationError = error;\n }\n try {\n await release();\n } catch (releaseError) {\n if (operationFailed) {\n throw recorderLockReleaseError(filePath, operationError, releaseError);\n }\n throw releaseError;\n }\n if (operationFailed) {\n throw operationError;\n }\n return result as T;\n}\n\nasync function serializeAppend<T>(\n filePath: string,\n operation: (publicationPath: string, logicalPath: string) => Promise<T>,\n): Promise<T> {\n const logicalPath = path.resolve(filePath);\n const key = await resolveRecorderPublicationPath(logicalPath);\n const previous = pendingAppends.get(key) ?? Promise.resolve();\n let result: T;\n const current = previous\n .catch(() => {})\n .then(async () => {\n result = await withRecorderLock(key, async () => await operation(key, logicalPath));\n });\n pendingAppends.set(key, current);\n\n try {\n await current;\n return result!;\n } finally {\n if (pendingAppends.get(key) === current) {\n pendingAppends.delete(key);\n }\n }\n}\n\nasync function readRecordedInboundAppend(\n filePath: string,\n state: IncrementalReadState,\n): Promise<RecordedInboundEnvelope[]> {\n let handle;\n\n try {\n handle = await open(filePath, \"r\");\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (code === \"ENOENT\") {\n resetIncrementalReadState(state);\n state.identity = undefined;\n return [];\n }\n throw error;\n }\n\n try {\n const stats = await handle.stat();\n const identity = { dev: stats.dev, ino: stats.ino };\n const sameFile = state.identity?.dev === identity.dev && state.identity.ino === identity.ino;\n const rotated = state.identity !== undefined && !sameFile;\n let hasContinuity = stats.size >= state.offset;\n\n if (hasContinuity && state.offset > 0 && state.continuity.length === 0) {\n hasContinuity = sameFile;\n } else if (hasContinuity && state.continuity.length > 0) {\n const actual = await readBufferAt(\n handle,\n state.continuity.length,\n state.offset - state.continuity.length,\n );\n hasContinuity = actual.equals(state.continuity);\n }\n\n if (!hasContinuity) {\n resetIncrementalReadState(state);\n } else if (rotated) {\n state.generation += 1;\n }\n state.identity = identity;\n\n const events: RecordedInboundEnvelope[] = [];\n let position = state.offset;\n let remainingBatchBytes = MAX_INCREMENTAL_READ_BYTES;\n let reachedUnexpectedEof = false;\n while (position < stats.size && remainingBatchBytes > 0) {\n const chunk = Buffer.alloc(Math.min(64 * 1024, stats.size - position, remainingBatchBytes));\n const { bytesRead } = await handle.read(chunk, 0, chunk.length, position);\n if (bytesRead === 0) {\n reachedUnexpectedEof = true;\n break;\n }\n position += bytesRead;\n state.offset = position;\n remainingBatchBytes -= bytesRead;\n events.push(...consumeRecordedChunk(state, chunk.subarray(0, bytesRead)));\n }\n state.caughtUp = reachedUnexpectedEof || position >= stats.size;\n return events;\n } finally {\n await handle.close();\n }\n}\n\nexport async function appendRecordedInbound(\n filePath: string,\n event: RecordableInboundEnvelope,\n): Promise<RecordedInboundEnvelope> {\n await mkdir(path.dirname(filePath), { recursive: true });\n\n const recorded = {\n ...event,\n recordedAt: new Date().toISOString(),\n } satisfies RecordedInboundEnvelope;\n\n const line = `${JSON.stringify(recorded)}\\n`;\n if (Buffer.byteLength(line) > MAX_PENDING_RECORD_BYTES) {\n throw new Error(\n `Recorder record exceeded ${MAX_PENDING_RECORD_BYTES} bytes without a newline.`,\n );\n }\n await appendJsonLine(filePath, line);\n return recorded;\n}\n\nexport async function appendRecordedInboundBatch(\n filePath: string,\n events: InboundEnvelope[],\n): Promise<RecordedInboundEnvelope[]> {\n if (events.length === 0) {\n return [];\n }\n await mkdir(path.dirname(filePath), { recursive: true });\n for (let attempt = 0; ; attempt++) {\n try {\n return await serializeAppend(filePath, async (publicationPath, logicalPath) => {\n const generation = await prepareRecorderPathForAppend(publicationPath, logicalPath, true);\n const seen = await syncRecordIdentityIndex(publicationPath);\n const pendingIdentities = new Set<string>();\n const recorded: RecordedInboundEnvelope[] = [];\n for (const event of events) {\n const identity = recordIdentity(event);\n if (seen.has(identity) || pendingIdentities.has(identity)) {\n continue;\n }\n pendingIdentities.add(identity);\n recorded.push({\n ...event,\n recordedAt: new Date().toISOString(),\n });\n }\n if (recorded.length > 0) {\n const batch = {\n events: recorded,\n recordType: \"crabline.recorder.batch\",\n recorderBatchVersion: RECORDER_BATCH_VERSION,\n } satisfies RecordedInboundBatchLine;\n const line = `${JSON.stringify(batch)}\\n`;\n if (Buffer.byteLength(line) > MAX_PENDING_RECORD_BYTES) {\n throw new Error(\n `Recorder record exceeded ${MAX_PENDING_RECORD_BYTES} bytes without a newline.`,\n );\n }\n await appendCommittedLine(publicationPath, logicalPath, line, true, generation);\n await syncRecordIdentityIndex(publicationPath);\n } else if (\n !sameRecorderFileIdentity(\n generation,\n await readRecorderFileIdentity(await resolveRecorderPublicationPath(logicalPath)),\n )\n ) {\n throw new RecorderRotatedError(\"Recorder rotated before confirming a duplicate batch.\");\n }\n return recorded;\n });\n } catch (error) {\n if (!(error instanceof RecorderRotatedError) || attempt + 1 >= RECORDER_ROTATION_ATTEMPTS) {\n throw error;\n }\n }\n }\n}\n\nfunction recordIdentity(event: RecordableInboundEnvelope): string {\n return JSON.stringify([event.provider, event.threadId, event.id, recordedDirectionOf(event)]);\n}\n\nasync function syncRecordIdentityIndex(filePath: string): Promise<Set<string>> {\n const key = path.resolve(filePath);\n let index = recordIdentityIndexes.get(key);\n if (!index) {\n index = { readState: createIncrementalReadState(), seen: new Set() };\n recordIdentityIndexes.set(key, index);\n if (recordIdentityIndexes.size > MAX_RECORD_IDENTITY_INDEXES) {\n recordIdentityIndexes.delete(recordIdentityIndexes.keys().next().value!);\n }\n } else {\n recordIdentityIndexes.delete(key);\n recordIdentityIndexes.set(key, index);\n }\n\n let generation = index.readState.generation;\n do {\n const appended = await readRecordedInboundAppend(filePath, index.readState);\n if (index.readState.generation !== generation) {\n index.seen.clear();\n generation = index.readState.generation;\n }\n for (const event of appended) {\n rememberRecentRecord(index.seen, event);\n }\n } while (!index.readState.caughtUp);\n return index.seen;\n}\n\nexport async function readRecordedInbound(filePath: string): Promise<RecordedInboundEnvelope[]> {\n let raw = \"\";\n\n try {\n raw = await readFile(filePath, \"utf8\");\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (code === \"ENOENT\") {\n return [];\n }\n throw error;\n }\n\n const lastNewline = raw.lastIndexOf(\"\\n\");\n const completed = lastNewline >= 0 ? raw.slice(0, lastNewline) : \"\";\n const tail = raw.slice(lastNewline + 1);\n const events: RecordedInboundEnvelope[] = [];\n\n for (const line of completed.split(\"\\n\")) {\n if (line.trim()) {\n events.push(...parseRecordedLine(line));\n }\n }\n if (tail.trim()) {\n try {\n events.push(...parseRecordedLine(tail));\n } catch (error) {\n if (!(error instanceof SyntaxError)) {\n throw error;\n }\n // Ignore a syntactically partial final append; completed lines remain strict.\n }\n }\n\n return events;\n}\n\nexport async function waitForRecordedInbound(params: {\n cursor?: RecordedInboundCursor | undefined;\n filePath: string;\n matches: (event: RecordedInboundEnvelope) => boolean;\n pollMs?: number;\n recordedDirection?: \"inbound\" | \"outbound\" | undefined;\n signal?: AbortSignal | undefined;\n since?: string | undefined;\n timeoutMs: number;\n}): Promise<RecordedInboundEnvelope | null> {\n const deadline = Date.now() + params.timeoutMs;\n const cursor = params.cursor ?? createRecordedInboundCursor();\n\n while (!params.signal?.aborted && Date.now() <= deadline) {\n const generation = cursor.readState.generation;\n const events =\n cursor.buffered.length > 0\n ? cursor.buffered.splice(0)\n : await readRecordedInboundAppend(params.filePath, cursor.readState);\n if (cursor.readState.generation !== generation) {\n cursor.seen.clear();\n }\n for (const [index, event] of events.entries()) {\n if (params.recordedDirection && recordedDirectionOf(event) !== params.recordedDirection) {\n continue;\n }\n // Incremental read state owns progress; this bounded window only filters appended retries.\n if (!rememberRecentRecord(cursor.seen, event)) {\n continue;\n }\n if (params.since && new Date(event.sentAt).getTime() < new Date(params.since).getTime()) {\n continue;\n }\n\n if (params.matches(event)) {\n cursor.buffered.push(...events.slice(index + 1));\n return event;\n }\n }\n if (!cursor.readState.caughtUp) {\n if (Date.now() >= deadline) {\n return null;\n }\n continue;\n }\n\n const remainingMs = deadline - Date.now();\n if (remainingMs <= 0) {\n return null;\n }\n await sleep(Math.min(params.pollMs ?? 200, remainingMs), params.signal);\n }\n\n return null;\n}\n\nexport async function* watchRecordedInbound(params: {\n filePath: string;\n matches: (event: RecordedInboundEnvelope) => boolean;\n pollMs?: number;\n recordedDirection?: \"inbound\" | \"outbound\" | undefined;\n signal?: AbortSignal | undefined;\n since?: string | undefined;\n}): AsyncIterable<RecordedInboundEnvelope> {\n const state = createIncrementalReadState();\n const seen = new Set<string>();\n\n while (!params.signal?.aborted) {\n const generation = state.generation;\n const events = await readRecordedInboundAppend(params.filePath, state);\n if (state.generation !== generation) {\n seen.clear();\n }\n if (params.signal?.aborted) {\n return;\n }\n for (const event of events) {\n if (params.signal?.aborted) {\n return;\n }\n if (!rememberRecentRecord(seen, event)) {\n continue;\n }\n if (params.recordedDirection && recordedDirectionOf(event) !== params.recordedDirection) {\n continue;\n }\n if (params.since && new Date(event.sentAt).getTime() < new Date(params.since).getTime()) {\n continue;\n }\n\n if (params.matches(event)) {\n yield event;\n }\n }\n if (!state.caughtUp) {\n continue;\n }\n\n await sleep(params.pollMs ?? 250, params.signal);\n }\n}\n"]}
|
|
@@ -1,8 +1,32 @@
|
|
|
1
1
|
import type { ManifestDefinition } from "../config/schema.js";
|
|
2
2
|
import { OPENCLAW_SUPPORT_CATALOG } from "./catalog.js";
|
|
3
|
-
import type { ProviderAdapter } from "./types.js";
|
|
3
|
+
import type { InboundEnvelope, ProbeResult, ProviderAdapter, ProviderContext, ProviderSupportStatus, SendContext, SendResult, WaitContext, WatchContext } from "./types.js";
|
|
4
4
|
export type Registry = {
|
|
5
5
|
catalog: typeof OPENCLAW_SUPPORT_CATALOG;
|
|
6
6
|
resolve(providerId: string, fixtureId: string): ProviderAdapter;
|
|
7
7
|
};
|
|
8
|
+
type ProviderFactory = () => Promise<ProviderAdapter>;
|
|
9
|
+
export declare class LazyProviderAdapter implements ProviderAdapter {
|
|
10
|
+
#private;
|
|
11
|
+
readonly id: string;
|
|
12
|
+
readonly platform: "bluebubbles" | "discord" | "feishu" | "googlechat" | "imessage" | "irc" | "line" | "loopback" | "matrix" | "mattermost" | "msteams" | "nextcloudtalk" | "nostr" | "signal" | "slack" | "synologychat" | "telegram" | "tlon" | "twitch" | "webchat" | "whatsapp" | "zalo" | "zalouser";
|
|
13
|
+
readonly status: ProviderSupportStatus;
|
|
14
|
+
readonly supports: readonly ("agent" | "probe" | "roundtrip" | "send")[];
|
|
15
|
+
constructor(params: {
|
|
16
|
+
adapterName: string;
|
|
17
|
+
factory: ProviderFactory;
|
|
18
|
+
id: string;
|
|
19
|
+
normalizeTarget: ProviderAdapter["normalizeTarget"];
|
|
20
|
+
platform: ProviderAdapter["platform"];
|
|
21
|
+
status: ProviderSupportStatus;
|
|
22
|
+
supports: ProviderAdapter["supports"];
|
|
23
|
+
});
|
|
24
|
+
normalizeTarget(target: ProviderContext["fixture"]["target"]): import("./types.js").NormalizedTarget;
|
|
25
|
+
probe(context: ProviderContext): Promise<ProbeResult>;
|
|
26
|
+
send(context: SendContext): Promise<SendResult>;
|
|
27
|
+
waitForInbound(context: WaitContext): Promise<InboundEnvelope | null>;
|
|
28
|
+
watch(context: WatchContext): AsyncIterable<InboundEnvelope>;
|
|
29
|
+
cleanup(): Promise<void>;
|
|
30
|
+
}
|
|
8
31
|
export declare function createRegistry(manifest: ManifestDefinition, manifestPath: string): Registry;
|
|
32
|
+
export {};
|
|
@@ -1,12 +1,7 @@
|
|
|
1
1
|
import { CrablineError } from "../core/errors.js";
|
|
2
2
|
import { ScriptProviderAdapter } from "./builtin/script.js";
|
|
3
3
|
import { OPENCLAW_SUPPORT_CATALOG } from "./catalog.js";
|
|
4
|
-
|
|
5
|
-
"probe",
|
|
6
|
-
"send",
|
|
7
|
-
"roundtrip",
|
|
8
|
-
"agent",
|
|
9
|
-
];
|
|
4
|
+
import { getBuiltinTargetCodec } from "./target-normalizers.js";
|
|
10
5
|
const LAZY_PROVIDER_FACTORIES = {
|
|
11
6
|
async discord({ config, providerId, userName }) {
|
|
12
7
|
const { DiscordProviderAdapter } = await import("./builtin/discord.js");
|
|
@@ -57,81 +52,318 @@ const LAZY_PROVIDER_FACTORIES = {
|
|
|
57
52
|
return new ZaloProviderAdapter(providerId, config, userName);
|
|
58
53
|
},
|
|
59
54
|
};
|
|
55
|
+
function createDispatchBarrier() {
|
|
56
|
+
let resolveDispatch;
|
|
57
|
+
const dispatch = {
|
|
58
|
+
promise: new Promise((resolve) => {
|
|
59
|
+
resolveDispatch = resolve;
|
|
60
|
+
}),
|
|
61
|
+
reach() {
|
|
62
|
+
if (dispatch.reached) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
dispatch.reached = true;
|
|
66
|
+
resolveDispatch?.();
|
|
67
|
+
},
|
|
68
|
+
reached: false,
|
|
69
|
+
};
|
|
70
|
+
return dispatch;
|
|
71
|
+
}
|
|
60
72
|
function isLazyAdapter(adapter) {
|
|
61
73
|
return adapter in LAZY_PROVIDER_FACTORIES;
|
|
62
74
|
}
|
|
63
|
-
function normalizeTarget(target) {
|
|
64
|
-
const normalized = { id: target.id, metadata: target.metadata };
|
|
65
|
-
if (target.channelId) {
|
|
66
|
-
normalized.channelId = target.channelId;
|
|
67
|
-
}
|
|
68
|
-
if (target.threadId) {
|
|
69
|
-
normalized.threadId = target.threadId;
|
|
70
|
-
}
|
|
71
|
-
return normalized;
|
|
72
|
-
}
|
|
73
75
|
function createLazyProvider(params) {
|
|
74
76
|
return new LazyProviderAdapter({
|
|
75
77
|
adapterName: params.adapter,
|
|
76
78
|
factory: () => LAZY_PROVIDER_FACTORIES[params.adapter](params),
|
|
77
79
|
id: params.providerId,
|
|
80
|
+
normalizeTarget: getBuiltinTargetCodec(params.adapter).normalize,
|
|
78
81
|
platform: params.config.platform,
|
|
79
82
|
status: "ready",
|
|
80
|
-
supports:
|
|
83
|
+
supports: params.config.capabilities,
|
|
81
84
|
});
|
|
82
85
|
}
|
|
83
|
-
class LazyProviderAdapter {
|
|
86
|
+
export class LazyProviderAdapter {
|
|
84
87
|
id;
|
|
85
88
|
platform;
|
|
86
89
|
status;
|
|
87
90
|
supports;
|
|
88
|
-
#adapterName;
|
|
89
91
|
#factory;
|
|
92
|
+
#normalizeTarget;
|
|
93
|
+
#activeWatches = new Set();
|
|
94
|
+
#inFlightOperations = new Set();
|
|
95
|
+
#cleanedUp = false;
|
|
96
|
+
#cleanupPromise = null;
|
|
97
|
+
#providerInstance = null;
|
|
90
98
|
#providerPromise = null;
|
|
91
99
|
constructor(params) {
|
|
92
|
-
this.#adapterName = params.adapterName;
|
|
93
100
|
this.#factory = params.factory;
|
|
101
|
+
this.#normalizeTarget = params.normalizeTarget;
|
|
94
102
|
this.id = params.id;
|
|
95
103
|
this.platform = params.platform;
|
|
96
104
|
this.status = params.status;
|
|
97
105
|
this.supports = params.supports;
|
|
98
106
|
}
|
|
99
107
|
normalizeTarget(target) {
|
|
100
|
-
|
|
108
|
+
this.#assertActive();
|
|
109
|
+
return this.#normalizeTarget(target);
|
|
101
110
|
}
|
|
102
|
-
|
|
103
|
-
return
|
|
111
|
+
probe(context) {
|
|
112
|
+
return this.#runOperation((provider) => provider.probe(context), context.signal);
|
|
104
113
|
}
|
|
105
|
-
|
|
106
|
-
return
|
|
114
|
+
send(context) {
|
|
115
|
+
return this.#runOperation((provider) => provider.send(context), context.signal);
|
|
107
116
|
}
|
|
108
|
-
|
|
109
|
-
return
|
|
117
|
+
waitForInbound(context) {
|
|
118
|
+
return this.#runOperation((provider) => provider.waitForInbound(context), context.signal);
|
|
110
119
|
}
|
|
111
120
|
watch(context) {
|
|
112
|
-
|
|
121
|
+
if (this.#cleanedUp) {
|
|
122
|
+
const error = this.#cleanedUpError();
|
|
123
|
+
return {
|
|
124
|
+
[Symbol.asyncIterator]() {
|
|
125
|
+
return {
|
|
126
|
+
next: () => Promise.reject(error),
|
|
127
|
+
};
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
const controller = new AbortController();
|
|
132
|
+
const abortFromContext = () => controller.abort(context.signal?.reason);
|
|
133
|
+
if (context.signal?.aborted) {
|
|
134
|
+
abortFromContext();
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
context.signal?.addEventListener("abort", abortFromContext, { once: true });
|
|
138
|
+
}
|
|
139
|
+
const dispatch = createDispatchBarrier();
|
|
140
|
+
const source = this.#watch(context, controller.signal, dispatch)[Symbol.asyncIterator]();
|
|
141
|
+
let activeWatch;
|
|
142
|
+
let closed = false;
|
|
143
|
+
let closePromise = null;
|
|
144
|
+
const finish = () => {
|
|
145
|
+
if (closed) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
closed = true;
|
|
149
|
+
context.signal?.removeEventListener("abort", abortFromContext);
|
|
150
|
+
this.#activeWatches.delete(activeWatch);
|
|
151
|
+
};
|
|
152
|
+
const close = () => {
|
|
153
|
+
if (closed) {
|
|
154
|
+
return Promise.resolve({ done: true, value: undefined });
|
|
155
|
+
}
|
|
156
|
+
closePromise ??= (async () => {
|
|
157
|
+
controller.abort();
|
|
158
|
+
try {
|
|
159
|
+
const result = source.return
|
|
160
|
+
? await source.return()
|
|
161
|
+
: { done: true, value: undefined };
|
|
162
|
+
if (result.done) {
|
|
163
|
+
finish();
|
|
164
|
+
}
|
|
165
|
+
return result;
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
finish();
|
|
169
|
+
throw error;
|
|
170
|
+
}
|
|
171
|
+
finally {
|
|
172
|
+
dispatch.reach();
|
|
173
|
+
}
|
|
174
|
+
})();
|
|
175
|
+
const closing = closePromise;
|
|
176
|
+
void closing.then(() => {
|
|
177
|
+
if (closePromise === closing) {
|
|
178
|
+
closePromise = null;
|
|
179
|
+
}
|
|
180
|
+
}, () => {
|
|
181
|
+
if (closePromise === closing) {
|
|
182
|
+
closePromise = null;
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
return closing;
|
|
186
|
+
};
|
|
187
|
+
const iterator = {
|
|
188
|
+
async next() {
|
|
189
|
+
try {
|
|
190
|
+
const result = await source.next();
|
|
191
|
+
if (result.done) {
|
|
192
|
+
finish();
|
|
193
|
+
}
|
|
194
|
+
return result;
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
finish();
|
|
198
|
+
throw error;
|
|
199
|
+
}
|
|
200
|
+
},
|
|
201
|
+
return: close,
|
|
202
|
+
async throw(error) {
|
|
203
|
+
controller.abort();
|
|
204
|
+
try {
|
|
205
|
+
if (source.throw) {
|
|
206
|
+
return await source.throw(error);
|
|
207
|
+
}
|
|
208
|
+
throw error;
|
|
209
|
+
}
|
|
210
|
+
finally {
|
|
211
|
+
finish();
|
|
212
|
+
}
|
|
213
|
+
},
|
|
214
|
+
[Symbol.asyncIterator]() {
|
|
215
|
+
return this;
|
|
216
|
+
},
|
|
217
|
+
};
|
|
218
|
+
activeWatch = {
|
|
219
|
+
abort: () => controller.abort(),
|
|
220
|
+
close: async () => {
|
|
221
|
+
while (!(await close()).done) {
|
|
222
|
+
// Async iterators may yield final values before acknowledging return.
|
|
223
|
+
}
|
|
224
|
+
},
|
|
225
|
+
dispatch,
|
|
226
|
+
};
|
|
227
|
+
this.#activeWatches.add(activeWatch);
|
|
228
|
+
return iterator;
|
|
113
229
|
}
|
|
114
230
|
async cleanup() {
|
|
115
|
-
|
|
116
|
-
|
|
231
|
+
this.#cleanedUp = true;
|
|
232
|
+
for (const watch of this.#activeWatches) {
|
|
233
|
+
watch.abort();
|
|
117
234
|
}
|
|
118
|
-
|
|
235
|
+
this.#cleanupPromise ??= (async () => {
|
|
236
|
+
const operations = [...this.#inFlightOperations];
|
|
237
|
+
const watches = [...this.#activeWatches];
|
|
238
|
+
const closingWatches = watches.map(async (watch) => await watch.close());
|
|
239
|
+
const providerCleanup = this.#cleanupProvider(operations
|
|
240
|
+
.map((operation) => operation.dispatch)
|
|
241
|
+
.concat(watches.map((watch) => watch.dispatch)));
|
|
242
|
+
const [cleanupResult, , watchResults] = await Promise.all([
|
|
243
|
+
providerCleanup.then(() => ({ ok: true }), (error) => ({ error, ok: false })),
|
|
244
|
+
Promise.allSettled(operations.map((operation) => operation.completion)),
|
|
245
|
+
Promise.allSettled(closingWatches),
|
|
246
|
+
]);
|
|
247
|
+
const teardownErrors = watchResults.flatMap((result) => result.status === "rejected" ? [result.reason] : []);
|
|
248
|
+
if (!cleanupResult.ok) {
|
|
249
|
+
teardownErrors.unshift(cleanupResult.error);
|
|
250
|
+
}
|
|
251
|
+
if (teardownErrors.length === 1) {
|
|
252
|
+
throw teardownErrors[0];
|
|
253
|
+
}
|
|
254
|
+
if (teardownErrors.length > 1) {
|
|
255
|
+
throw new AggregateError(teardownErrors, "Provider cleanup failed.");
|
|
256
|
+
}
|
|
257
|
+
})();
|
|
258
|
+
await this.#cleanupPromise;
|
|
119
259
|
}
|
|
120
260
|
async #provider() {
|
|
121
|
-
this.#
|
|
261
|
+
this.#assertActive();
|
|
262
|
+
this.#providerPromise ??= this.#factory()
|
|
263
|
+
.then((provider) => {
|
|
264
|
+
this.#providerInstance = provider;
|
|
265
|
+
return provider;
|
|
266
|
+
})
|
|
267
|
+
.catch((error) => {
|
|
122
268
|
this.#providerPromise = null;
|
|
123
|
-
throw
|
|
269
|
+
throw error;
|
|
124
270
|
});
|
|
125
271
|
return await this.#providerPromise;
|
|
126
272
|
}
|
|
127
|
-
async *#watch(context) {
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
273
|
+
async *#watch(context, signal, dispatch) {
|
|
274
|
+
try {
|
|
275
|
+
if (signal.aborted) {
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
const provider = await this.#provider();
|
|
279
|
+
if (signal.aborted) {
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
if (!provider.watch) {
|
|
283
|
+
throw new CrablineError(`Provider "${this.id}" does not implement watch.`, {
|
|
284
|
+
kind: "config",
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
dispatch.reach();
|
|
288
|
+
yield* provider.watch({ ...context, signal });
|
|
289
|
+
}
|
|
290
|
+
finally {
|
|
291
|
+
dispatch.reach();
|
|
133
292
|
}
|
|
134
|
-
|
|
293
|
+
}
|
|
294
|
+
#assertActive() {
|
|
295
|
+
if (this.#cleanedUp) {
|
|
296
|
+
throw this.#cleanedUpError();
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
async #cleanupProvider(dispatches) {
|
|
300
|
+
const pendingDispatches = dispatches
|
|
301
|
+
.filter((dispatch) => !dispatch.reached)
|
|
302
|
+
.map((dispatch) => dispatch.promise);
|
|
303
|
+
if (pendingDispatches.length > 0) {
|
|
304
|
+
await Promise.allSettled(pendingDispatches);
|
|
305
|
+
}
|
|
306
|
+
let provider = this.#providerInstance;
|
|
307
|
+
if (!provider) {
|
|
308
|
+
const providerPromise = this.#providerPromise;
|
|
309
|
+
if (!providerPromise) {
|
|
310
|
+
return;
|
|
311
|
+
}
|
|
312
|
+
provider = await providerPromise;
|
|
313
|
+
}
|
|
314
|
+
if (!provider) {
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
const errors = [];
|
|
318
|
+
try {
|
|
319
|
+
provider.beginCleanup?.();
|
|
320
|
+
}
|
|
321
|
+
catch (error) {
|
|
322
|
+
errors.push(error);
|
|
323
|
+
}
|
|
324
|
+
try {
|
|
325
|
+
await provider.cleanup?.();
|
|
326
|
+
}
|
|
327
|
+
catch (error) {
|
|
328
|
+
errors.push(error);
|
|
329
|
+
}
|
|
330
|
+
if (errors.length === 1) {
|
|
331
|
+
throw errors[0];
|
|
332
|
+
}
|
|
333
|
+
if (errors.length > 1) {
|
|
334
|
+
throw new AggregateError(errors, "Provider teardown failed.");
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
#runOperation(run, signal) {
|
|
338
|
+
if (this.#cleanedUp) {
|
|
339
|
+
return Promise.reject(this.#cleanedUpError());
|
|
340
|
+
}
|
|
341
|
+
if (signal?.aborted) {
|
|
342
|
+
return Promise.reject(signal.reason ?? new Error("Provider operation aborted."));
|
|
343
|
+
}
|
|
344
|
+
const dispatch = createDispatchBarrier();
|
|
345
|
+
const underlying = (async () => {
|
|
346
|
+
try {
|
|
347
|
+
const provider = await this.#provider();
|
|
348
|
+
if (signal?.aborted) {
|
|
349
|
+
throw signal.reason ?? new Error("Provider operation aborted.");
|
|
350
|
+
}
|
|
351
|
+
const result = run(provider);
|
|
352
|
+
dispatch.reach();
|
|
353
|
+
return await result;
|
|
354
|
+
}
|
|
355
|
+
catch (error) {
|
|
356
|
+
dispatch.reach();
|
|
357
|
+
throw error;
|
|
358
|
+
}
|
|
359
|
+
})();
|
|
360
|
+
const operation = { completion: underlying, dispatch };
|
|
361
|
+
this.#inFlightOperations.add(operation);
|
|
362
|
+
void underlying.then(() => this.#inFlightOperations.delete(operation), () => this.#inFlightOperations.delete(operation));
|
|
363
|
+
return underlying;
|
|
364
|
+
}
|
|
365
|
+
#cleanedUpError() {
|
|
366
|
+
return new CrablineError(`Provider "${this.id}" has been cleaned up.`, { kind: "config" });
|
|
135
367
|
}
|
|
136
368
|
}
|
|
137
369
|
export function createRegistry(manifest, manifestPath) {
|
|
@@ -146,9 +378,17 @@ export function createRegistry(manifest, manifestPath) {
|
|
|
146
378
|
if (!config) {
|
|
147
379
|
throw new CrablineError(`Unknown provider: ${providerId}`, { kind: "config" });
|
|
148
380
|
}
|
|
381
|
+
if (fixture.provider !== providerId) {
|
|
382
|
+
throw new CrablineError(`Fixture "${fixtureId}" belongs to provider "${fixture.provider}", not "${providerId}".`, { kind: "config" });
|
|
383
|
+
}
|
|
149
384
|
if (config.status === "disabled") {
|
|
150
385
|
throw new CrablineError(`Provider "${providerId}" is disabled.`, { kind: "config" });
|
|
151
386
|
}
|
|
387
|
+
if (config.status === "planned") {
|
|
388
|
+
throw new CrablineError(`Provider "${providerId}" is planned and cannot run.`, {
|
|
389
|
+
kind: "config",
|
|
390
|
+
});
|
|
391
|
+
}
|
|
152
392
|
const context = {
|
|
153
393
|
config,
|
|
154
394
|
fixture,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/providers/registry.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/providers/registry.ts"],"names":[],"mappings":"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","sourcesContent":["import { CrablineError } from \"../core/errors.js\";\nimport type { BuiltinAdapterId, ManifestDefinition, ProviderConfig } from \"../config/schema.js\";\nimport { ScriptProviderAdapter } from \"./builtin/script.js\";\nimport { OPENCLAW_SUPPORT_CATALOG } from \"./catalog.js\";\nimport type {\n InboundEnvelope,\n ProbeResult,\n ProviderAdapter,\n ProviderContext,\n ProviderSupportStatus,\n SendContext,\n SendResult,\n WaitContext,\n WatchContext,\n} from \"./types.js\";\nimport { getBuiltinTargetCodec, type BuiltinProviderAdapterId } from \"./target-normalizers.js\";\n\nexport type Registry = {\n catalog: typeof OPENCLAW_SUPPORT_CATALOG;\n resolve(providerId: string, fixtureId: string): ProviderAdapter;\n};\n\ntype LazyAdapterId = BuiltinProviderAdapterId;\ntype ProviderFactory = () => Promise<ProviderAdapter>;\ntype ActiveWatch = {\n abort(): void;\n close(): Promise<void>;\n dispatch: DispatchBarrier;\n};\ntype DispatchBarrier = {\n promise: Promise<void>;\n reach(): void;\n reached: boolean;\n};\ntype AdmittedOperation = {\n completion: Promise<unknown>;\n dispatch: DispatchBarrier;\n};\ntype LazyProviderFactory = (params: {\n config: ProviderConfig;\n providerId: string;\n userName: string;\n}) => Promise<ProviderAdapter>;\n\nconst LAZY_PROVIDER_FACTORIES = {\n async discord({ config, providerId, userName }) {\n const { DiscordProviderAdapter } = await import(\"./builtin/discord.js\");\n return new DiscordProviderAdapter(providerId, config, userName);\n },\n async feishu({ config, providerId, userName }) {\n const { FeishuProviderAdapter } = await import(\"./builtin/feishu.js\");\n return new FeishuProviderAdapter(providerId, config, userName);\n },\n async googlechat({ config, providerId, userName }) {\n const { GoogleChatProviderAdapter } = await import(\"./builtin/googlechat.js\");\n return new GoogleChatProviderAdapter(providerId, config, userName);\n },\n async imessage({ config, providerId, userName }) {\n const { IMessageProviderAdapter } = await import(\"./builtin/imessage.js\");\n return new IMessageProviderAdapter(providerId, config, userName);\n },\n async loopback({ config, providerId, userName }) {\n const { LoopbackProviderAdapter } = await import(\"./builtin/loopback.js\");\n return new LoopbackProviderAdapter(providerId, config, userName);\n },\n async matrix({ config, providerId, userName }) {\n const { MatrixProviderAdapter } = await import(\"./builtin/matrix.js\");\n return new MatrixProviderAdapter(providerId, config, userName);\n },\n async mattermost({ config, providerId, userName }) {\n const { MattermostProviderAdapter } = await import(\"./builtin/mattermost.js\");\n return new MattermostProviderAdapter(providerId, config, userName);\n },\n async msteams({ config, providerId, userName }) {\n const { MsTeamsProviderAdapter } = await import(\"./builtin/msteams.js\");\n return new MsTeamsProviderAdapter(providerId, config, userName);\n },\n async slack({ config, providerId, userName }) {\n const { SlackProviderAdapter } = await import(\"./builtin/slack.js\");\n return new SlackProviderAdapter(providerId, config, userName);\n },\n async telegram({ config, providerId, userName }) {\n const { TelegramProviderAdapter } = await import(\"./builtin/telegram.js\");\n return new TelegramProviderAdapter(providerId, config, userName);\n },\n async whatsapp({ config, providerId, userName }) {\n const { WhatsAppProviderAdapter } = await import(\"./builtin/whatsapp.js\");\n return new WhatsAppProviderAdapter(providerId, config, userName);\n },\n async zalo({ config, providerId, userName }) {\n const { ZaloProviderAdapter } = await import(\"./builtin/zalo.js\");\n return new ZaloProviderAdapter(providerId, config, userName);\n },\n} satisfies Record<LazyAdapterId, LazyProviderFactory>;\n\nfunction createDispatchBarrier(): DispatchBarrier {\n let resolveDispatch: (() => void) | undefined;\n const dispatch: DispatchBarrier = {\n promise: new Promise<void>((resolve) => {\n resolveDispatch = resolve;\n }),\n reach() {\n if (dispatch.reached) {\n return;\n }\n dispatch.reached = true;\n resolveDispatch?.();\n },\n reached: false,\n };\n return dispatch;\n}\n\nfunction isLazyAdapter(adapter: BuiltinAdapterId): adapter is LazyAdapterId {\n return adapter in LAZY_PROVIDER_FACTORIES;\n}\n\nfunction createLazyProvider(params: {\n adapter: LazyAdapterId;\n config: ProviderConfig;\n providerId: string;\n userName: string;\n}): ProviderAdapter {\n return new LazyProviderAdapter({\n adapterName: params.adapter,\n factory: () => LAZY_PROVIDER_FACTORIES[params.adapter](params),\n id: params.providerId,\n normalizeTarget: getBuiltinTargetCodec(params.adapter).normalize,\n platform: params.config.platform,\n status: \"ready\",\n supports: params.config.capabilities,\n });\n}\n\nexport class LazyProviderAdapter implements ProviderAdapter {\n readonly id;\n readonly platform;\n readonly status;\n readonly supports;\n\n readonly #factory: ProviderFactory;\n readonly #normalizeTarget: ProviderAdapter[\"normalizeTarget\"];\n readonly #activeWatches = new Set<ActiveWatch>();\n readonly #inFlightOperations = new Set<AdmittedOperation>();\n #cleanedUp = false;\n #cleanupPromise: Promise<void> | null = null;\n #providerInstance: ProviderAdapter | null = null;\n #providerPromise: Promise<ProviderAdapter> | null = null;\n\n constructor(params: {\n adapterName: string;\n factory: ProviderFactory;\n id: string;\n normalizeTarget: ProviderAdapter[\"normalizeTarget\"];\n platform: ProviderAdapter[\"platform\"];\n status: ProviderSupportStatus;\n supports: ProviderAdapter[\"supports\"];\n }) {\n this.#factory = params.factory;\n this.#normalizeTarget = params.normalizeTarget;\n this.id = params.id;\n this.platform = params.platform;\n this.status = params.status;\n this.supports = params.supports;\n }\n\n normalizeTarget(target: ProviderContext[\"fixture\"][\"target\"]) {\n this.#assertActive();\n return this.#normalizeTarget(target);\n }\n\n probe(context: ProviderContext): Promise<ProbeResult> {\n return this.#runOperation((provider) => provider.probe(context), context.signal);\n }\n\n send(context: SendContext): Promise<SendResult> {\n return this.#runOperation((provider) => provider.send(context), context.signal);\n }\n\n waitForInbound(context: WaitContext): Promise<InboundEnvelope | null> {\n return this.#runOperation((provider) => provider.waitForInbound(context), context.signal);\n }\n\n watch(context: WatchContext): AsyncIterable<InboundEnvelope> {\n if (this.#cleanedUp) {\n const error = this.#cleanedUpError();\n return {\n [Symbol.asyncIterator](): AsyncIterator<InboundEnvelope> {\n return {\n next: () => Promise.reject(error),\n };\n },\n };\n }\n const controller = new AbortController();\n const abortFromContext = () => controller.abort(context.signal?.reason);\n if (context.signal?.aborted) {\n abortFromContext();\n } else {\n context.signal?.addEventListener(\"abort\", abortFromContext, { once: true });\n }\n const dispatch = createDispatchBarrier();\n const source = this.#watch(context, controller.signal, dispatch)[Symbol.asyncIterator]();\n let activeWatch: ActiveWatch;\n let closed = false;\n let closePromise: Promise<IteratorResult<InboundEnvelope>> | null = null;\n const finish = () => {\n if (closed) {\n return;\n }\n closed = true;\n context.signal?.removeEventListener(\"abort\", abortFromContext);\n this.#activeWatches.delete(activeWatch);\n };\n const close = () => {\n if (closed) {\n return Promise.resolve({ done: true as const, value: undefined as never });\n }\n closePromise ??= (async () => {\n controller.abort();\n try {\n const result = source.return\n ? await source.return()\n : { done: true as const, value: undefined as never };\n if (result.done) {\n finish();\n }\n return result;\n } catch (error) {\n finish();\n throw error;\n } finally {\n dispatch.reach();\n }\n })();\n const closing = closePromise;\n void closing.then(\n () => {\n if (closePromise === closing) {\n closePromise = null;\n }\n },\n () => {\n if (closePromise === closing) {\n closePromise = null;\n }\n },\n );\n return closing;\n };\n const iterator: AsyncIterableIterator<InboundEnvelope> = {\n async next() {\n try {\n const result = await source.next();\n if (result.done) {\n finish();\n }\n return result;\n } catch (error) {\n finish();\n throw error;\n }\n },\n return: close,\n async throw(error?: unknown) {\n controller.abort();\n try {\n if (source.throw) {\n return await source.throw(error);\n }\n throw error;\n } finally {\n finish();\n }\n },\n [Symbol.asyncIterator]() {\n return this;\n },\n };\n activeWatch = {\n abort: () => controller.abort(),\n close: async () => {\n while (!(await close()).done) {\n // Async iterators may yield final values before acknowledging return.\n }\n },\n dispatch,\n };\n this.#activeWatches.add(activeWatch);\n return iterator;\n }\n\n async cleanup(): Promise<void> {\n this.#cleanedUp = true;\n for (const watch of this.#activeWatches) {\n watch.abort();\n }\n this.#cleanupPromise ??= (async () => {\n const operations = [...this.#inFlightOperations];\n const watches = [...this.#activeWatches];\n const closingWatches = watches.map(async (watch) => await watch.close());\n const providerCleanup = this.#cleanupProvider(\n operations\n .map((operation) => operation.dispatch)\n .concat(watches.map((watch) => watch.dispatch)),\n );\n const [cleanupResult, , watchResults] = await Promise.all([\n providerCleanup.then(\n () => ({ ok: true as const }),\n (error: unknown) => ({ error, ok: false as const }),\n ),\n Promise.allSettled(operations.map((operation) => operation.completion)),\n Promise.allSettled(closingWatches),\n ]);\n const teardownErrors = watchResults.flatMap((result) =>\n result.status === \"rejected\" ? [result.reason] : [],\n );\n if (!cleanupResult.ok) {\n teardownErrors.unshift(cleanupResult.error);\n }\n if (teardownErrors.length === 1) {\n throw teardownErrors[0];\n }\n if (teardownErrors.length > 1) {\n throw new AggregateError(teardownErrors, \"Provider cleanup failed.\");\n }\n })();\n await this.#cleanupPromise;\n }\n\n async #provider(): Promise<ProviderAdapter> {\n this.#assertActive();\n this.#providerPromise ??= this.#factory()\n .then((provider) => {\n this.#providerInstance = provider;\n return provider;\n })\n .catch((error: unknown) => {\n this.#providerPromise = null;\n throw error;\n });\n return await this.#providerPromise;\n }\n\n async *#watch(\n context: WatchContext,\n signal: AbortSignal,\n dispatch: DispatchBarrier,\n ): AsyncIterable<InboundEnvelope> {\n try {\n if (signal.aborted) {\n return;\n }\n const provider = await this.#provider();\n if (signal.aborted) {\n return;\n }\n if (!provider.watch) {\n throw new CrablineError(`Provider \"${this.id}\" does not implement watch.`, {\n kind: \"config\",\n });\n }\n dispatch.reach();\n yield* provider.watch({ ...context, signal });\n } finally {\n dispatch.reach();\n }\n }\n\n #assertActive(): void {\n if (this.#cleanedUp) {\n throw this.#cleanedUpError();\n }\n }\n\n async #cleanupProvider(dispatches: readonly DispatchBarrier[]): Promise<void> {\n const pendingDispatches = dispatches\n .filter((dispatch) => !dispatch.reached)\n .map((dispatch) => dispatch.promise);\n if (pendingDispatches.length > 0) {\n await Promise.allSettled(pendingDispatches);\n }\n let provider = this.#providerInstance;\n if (!provider) {\n const providerPromise = this.#providerPromise;\n if (!providerPromise) {\n return;\n }\n provider = await providerPromise;\n }\n if (!provider) {\n return;\n }\n const errors: unknown[] = [];\n try {\n provider.beginCleanup?.();\n } catch (error) {\n errors.push(error);\n }\n try {\n await provider.cleanup?.();\n } catch (error) {\n errors.push(error);\n }\n if (errors.length === 1) {\n throw errors[0];\n }\n if (errors.length > 1) {\n throw new AggregateError(errors, \"Provider teardown failed.\");\n }\n }\n\n #runOperation<T>(\n run: (provider: ProviderAdapter) => Promise<T>,\n signal?: AbortSignal,\n ): Promise<T> {\n if (this.#cleanedUp) {\n return Promise.reject(this.#cleanedUpError());\n }\n if (signal?.aborted) {\n return Promise.reject(signal.reason ?? new Error(\"Provider operation aborted.\"));\n }\n const dispatch = createDispatchBarrier();\n const underlying = (async () => {\n try {\n const provider = await this.#provider();\n if (signal?.aborted) {\n throw signal.reason ?? new Error(\"Provider operation aborted.\");\n }\n const result = run(provider);\n dispatch.reach();\n return await result;\n } catch (error) {\n dispatch.reach();\n throw error;\n }\n })();\n const operation = { completion: underlying, dispatch };\n this.#inFlightOperations.add(operation);\n void underlying.then(\n () => this.#inFlightOperations.delete(operation),\n () => this.#inFlightOperations.delete(operation),\n );\n return underlying;\n }\n\n #cleanedUpError(): CrablineError {\n return new CrablineError(`Provider \"${this.id}\" has been cleaned up.`, { kind: \"config\" });\n }\n}\n\nexport function createRegistry(manifest: ManifestDefinition, manifestPath: string): Registry {\n return {\n catalog: OPENCLAW_SUPPORT_CATALOG,\n resolve(providerId, fixtureId) {\n const fixture = manifest.fixtures.find((entry) => entry.id === fixtureId);\n if (!fixture) {\n throw new CrablineError(`Unknown fixture: ${fixtureId}`, { kind: \"config\" });\n }\n const config = manifest.providers[providerId];\n if (!config) {\n throw new CrablineError(`Unknown provider: ${providerId}`, { kind: \"config\" });\n }\n if (fixture.provider !== providerId) {\n throw new CrablineError(\n `Fixture \"${fixtureId}\" belongs to provider \"${fixture.provider}\", not \"${providerId}\".`,\n { kind: \"config\" },\n );\n }\n\n if (config.status === \"disabled\") {\n throw new CrablineError(`Provider \"${providerId}\" is disabled.`, { kind: \"config\" });\n }\n if (config.status === \"planned\") {\n throw new CrablineError(`Provider \"${providerId}\" is planned and cannot run.`, {\n kind: \"config\",\n });\n }\n\n const context: ProviderContext = {\n config,\n fixture,\n manifestPath,\n providerId,\n userName: manifest.userName,\n };\n\n if (isLazyAdapter(config.adapter)) {\n return createLazyProvider({\n adapter: config.adapter,\n config,\n providerId,\n userName: manifest.userName,\n });\n }\n\n return new ScriptProviderAdapter(context);\n },\n };\n}\n"]}
|