From 1e94f8451ea8fb97d4b21e610f9bc635d1bcbebb Mon Sep 17 00:00:00 2001 From: richblack Date: Tue, 11 Aug 2026 13:34:23 +0800 Subject: [PATCH] =?UTF-8?q?Arcrun#80:=20commit=20tier2=20worker=20?= =?UTF-8?q?=E5=AE=98=E6=96=B9=E7=B7=A8=E8=AD=AF=E6=88=90=E5=93=81=E5=88=B0?= =?UTF-8?q?=E5=9B=BA=E5=AE=9A=E4=BD=8D=E7=BD=AE=20.worker-builds/?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 從本 repo 的 cypher-executor / kbdb / .component-builds/http_request / registry/components/code / mcp 五個原始碼目錄,用 scripts/build-worker-artifacts.mjs 編出 5 顆成品,commit 進 repo(與既有 .component-builds/*/component.wasm 同一套 「固定位置、任何人直接拿」慣例)。 每顆 manifest 條目自帶 source_commit(該原始碼目錄最後改動的 commit)與 content_sha256,答得出「我是哪個版本的原始碼編出來的」到單顆層級。 重現性已驗證(見 commit 說明外的驗證記錄):同一個 commit 在兩個獨立 clone (不同磁碟路徑深度,刻意模擬雲端 vs 地端的目錄結構差異)分別裝依賴、分別編譯, 5 顆的 content_sha256 與 wasm module sha256 逐位元相同,manifest.json 唯一差異 是 generated_at 時間戳。 Co-Authored-By: Claude Opus 5 --- .gitignore | 4 + .worker-builds/arcrun-code/quickjs.wasm | Bin 0 -> 503134 bytes .worker-builds/arcrun-code/worker.mjs | 4014 ++ .../arcrun-cypher-executor/worker.mjs | 15266 +++++++ .../arcrun-http-request/component.wasm | Bin 0 -> 1101737 bytes .worker-builds/arcrun-http-request/worker.mjs | 2572 ++ .worker-builds/arcrun-kbdb/worker.mjs | 3803 ++ .worker-builds/arcrun-mcp/worker.mjs | 33395 ++++++++++++++++ .worker-builds/manifest.json | 174 + 9 files changed, 59228 insertions(+) create mode 100644 .worker-builds/arcrun-code/quickjs.wasm create mode 100644 .worker-builds/arcrun-code/worker.mjs create mode 100644 .worker-builds/arcrun-cypher-executor/worker.mjs create mode 100644 .worker-builds/arcrun-http-request/component.wasm create mode 100644 .worker-builds/arcrun-http-request/worker.mjs create mode 100644 .worker-builds/arcrun-kbdb/worker.mjs create mode 100644 .worker-builds/arcrun-mcp/worker.mjs create mode 100644 .worker-builds/manifest.json diff --git a/.gitignore b/.gitignore index 6bb0488..290ebcf 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,10 @@ dist/ # 例外:放行 .component-builds 的部署物 wasm — self-host 用戶 / acr init 從 repo 直接拿這份部署 # (推翻 rule 05 原「wasm 不 commit」慣例,見 .agents/specs/arcrun/sdk-and-website/self-hosted-init.md §6) !.component-builds/**/component.wasm +# 例外:Arcrun#80 tier2 worker 官方編譯成品(cypher-executor/kbdb/http_request/code/mcp 的 +# esbuild bundle + 隨附 wasm part)——commit 進 repo 同一套理由:固定位置、any clone 都拿得到, +# 不必自己再編一次(見 scripts/build-worker-artifacts.mjs)。 +!.worker-builds/**/*.wasm # 例外:code 零件(自足 Worker)的 vendored quickjs.wasm 同屬部署物 —— acr init/update 從 # repo archive 直接部署(同上 .component-builds 放行邏輯)。來源=npm 套件 # @jitl/quickjs-wasmfile-release-sync 的 emscripten-module.wasm,由 postinstall vendor-wasm.mjs diff --git a/.worker-builds/arcrun-code/quickjs.wasm b/.worker-builds/arcrun-code/quickjs.wasm new file mode 100644 index 0000000000000000000000000000000000000000..1815757b9a01a3e9a2eac80fc6e6ef3a6db566b9 GIT binary patch literal 503134 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

I3e?`Jma1R3t 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�Dt(fU>H~a& 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%0AuCsjgE=7u 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

Hg@v?tBX1Sf$zGWsKtV>2M`Wb~W(^ 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 z zt9Kd=`(H=F@k`L?7Q%1hZkQH~MBoquI)C*Hb7}X@S37Fr{i)YzwZAbP&+u^gX_S0z zKuqcqq_-@^$=bUSJ!lDj9=IQUEXPqC>WPv`-O#vB3AXsILO`P~82s`wuFP13<^2lK zJN_*OxW31|@4kn;ya+xcbV{vPC&yiW`Z^HL)f8Oum#S;Upm^6S9llquFXVY`y&W^ z^%%d$kPW0C!l<0j(J5ma4$RUZx6gG1mC&x_KbK%}rVe=x7QlEm817H=5x&A7y%rT= zqWK%lnN=S(_O!sd*QwABcz}QxZrDL{nhA3vu}0SiJKk)hM`tc!VM#Q6+9;{b6|k&c zg>RpZM@Y&Hn0K$o*cQXkC1@yZ-SrgbF&*z;^@n0`ByLTjTRS-`)tZ^oyMQ;H#r(Q) z_>@pOu|-|}=tyTnpVNQoAg(PRJrAL?cH+98`A!=;qwY&nYjOUO79`?u{EOos z>p$cx&vL;kwdUgwh#x9H5EW;tlb^3vYh)cgqDh>G!#QeAK=r>PXsU_gYGOs>E{fejX?4i&2u@KIazd_Jw}a{woxfT>0F==^a_QSD6JYl$o03E&R-4izf2M2XJcwMD5jad+;uCl-uUw`?uJ&{pK@=^W%OV4R7& zkH~^j`fJv_Mazm;naKLE@Q5z-WEw%M42C|CuTw5SEOEp~tnI{yRQb2#DrtEH71FaO@+&&41q~0#yVn!P!Tl8f0U2jwZ2$lO literal 0 HcmV?d00001 diff --git a/.worker-builds/arcrun-code/worker.mjs b/.worker-builds/arcrun-code/worker.mjs new file mode 100644 index 0000000..4096fc7 --- /dev/null +++ b/.worker-builds/arcrun-code/worker.mjs @@ -0,0 +1,4014 @@ +var __defProp = Object.defineProperty; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __esm = (fn, res) => function __init() { + return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res; +}; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; + +// registry/components/code/node_modules/@jitl/quickjs-ffi-types/dist/index.mjs +var EvalFlags, IntrinsicsFlags, JSPromiseStateEnum, GetOwnPropertyNamesFlags, IsEqualOp; +var init_dist = __esm({ + "registry/components/code/node_modules/@jitl/quickjs-ffi-types/dist/index.mjs"() { + EvalFlags = { JS_EVAL_TYPE_GLOBAL: 0, JS_EVAL_TYPE_MODULE: 1, JS_EVAL_TYPE_DIRECT: 2, JS_EVAL_TYPE_INDIRECT: 3, JS_EVAL_TYPE_MASK: 3, JS_EVAL_FLAG_STRICT: 8, JS_EVAL_FLAG_STRIP: 16, JS_EVAL_FLAG_COMPILE_ONLY: 32, JS_EVAL_FLAG_BACKTRACE_BARRIER: 64 }; + IntrinsicsFlags = { BaseObjects: 1, Date: 2, Eval: 4, StringNormalize: 8, RegExp: 16, RegExpCompiler: 32, JSON: 64, Proxy: 128, MapSet: 256, TypedArrays: 512, Promise: 1024, BigInt: 2048, BigFloat: 4096, BigDecimal: 8192, OperatorOverloading: 16384, BignumExt: 32768 }; + JSPromiseStateEnum = { Pending: 0, Fulfilled: 1, Rejected: 2 }; + GetOwnPropertyNamesFlags = { JS_GPN_STRING_MASK: 1, JS_GPN_SYMBOL_MASK: 2, JS_GPN_PRIVATE_MASK: 4, JS_GPN_ENUM_ONLY: 16, JS_GPN_SET_ENUM: 32, QTS_GPN_NUMBER_MASK: 64, QTS_STANDARD_COMPLIANT_NUMBER: 128 }; + IsEqualOp = { IsStrictlyEqual: 0, IsSameValue: 1, IsSameValueZero: 2 }; + } +}); + +// registry/components/code/node_modules/quickjs-emscripten-core/dist/chunk-JTKJZQYV.mjs +function debugLog(...args) { + QTS_DEBUG && console.log("quickjs-emscripten:", ...args); +} +function* awaitYield(value) { + return yield value; +} +function awaitYieldOf(generator) { + return awaitYield(awaitEachYieldedPromise(generator)); +} +function maybeAsyncFn(that, fn) { + return (...args) => { + let generator = fn.call(that, AwaitYield, ...args); + return awaitEachYieldedPromise(generator); + }; +} +function maybeAsync(that, startGenerator) { + let generator = startGenerator.call(that, AwaitYield); + return awaitEachYieldedPromise(generator); +} +function awaitEachYieldedPromise(gen) { + function handleNextStep(step) { + return step.done ? step.value : step.value instanceof Promise ? step.value.then((value) => handleNextStep(gen.next(value)), (error) => handleNextStep(gen.throw(error))) : handleNextStep(gen.next(step.value)); + } + return handleNextStep(gen.next()); +} +function scopeFinally(scope, blockError) { + let disposeError; + try { + scope.dispose(); + } catch (error) { + disposeError = error; + } + if (blockError && disposeError) throw Object.assign(blockError, { message: `${blockError.message} + Then, failed to dispose scope: ${disposeError.message}`, disposeError }), blockError; + if (blockError || disposeError) throw blockError || disposeError; +} +function createDisposableArray(items) { + let array = items ? Array.from(items) : []; + function disposeAlive() { + return array.forEach((disposable) => disposable.alive ? disposable.dispose() : void 0); + } + function someIsAlive() { + return array.some((disposable) => disposable.alive); + } + return Object.defineProperty(array, SymbolDispose, { configurable: true, enumerable: false, value: disposeAlive }), Object.defineProperty(array, "dispose", { configurable: true, enumerable: false, value: disposeAlive }), Object.defineProperty(array, "alive", { configurable: true, enumerable: false, get: someIsAlive }), array; +} +function isDisposable(value) { + return !!(value && (typeof value == "object" || typeof value == "function") && "alive" in value && typeof value.alive == "boolean" && "dispose" in value && typeof value.dispose == "function"); +} +function intrinsicsToFlags(intrinsics) { + if (!intrinsics) return 0; + let result = 0; + for (let [maybeIntrinsicName, enabled] of Object.entries(intrinsics)) { + if (!(maybeIntrinsicName in IntrinsicsFlags)) throw new QuickJSUnknownIntrinsic(maybeIntrinsicName); + enabled && (result |= IntrinsicsFlags[maybeIntrinsicName]); + } + return result; +} +function evalOptionsToFlags(evalOptions) { + if (typeof evalOptions == "number") return evalOptions; + if (evalOptions === void 0) return 0; + let { type, strict, strip, compileOnly, backtraceBarrier } = evalOptions, flags = 0; + return type === "global" && (flags |= EvalFlags.JS_EVAL_TYPE_GLOBAL), type === "module" && (flags |= EvalFlags.JS_EVAL_TYPE_MODULE), strict && (flags |= EvalFlags.JS_EVAL_FLAG_STRICT), strip && (flags |= EvalFlags.JS_EVAL_FLAG_STRIP), compileOnly && (flags |= EvalFlags.JS_EVAL_FLAG_COMPILE_ONLY), backtraceBarrier && (flags |= EvalFlags.JS_EVAL_FLAG_BACKTRACE_BARRIER), flags; +} +function getOwnPropertyNamesOptionsToFlags(options) { + if (typeof options == "number") return options; + if (options === void 0) return 0; + let { strings: includeStrings, symbols: includeSymbols, quickjsPrivate: includePrivate, onlyEnumerable, numbers: includeNumbers, numbersAsStrings } = options, flags = 0; + return includeStrings && (flags |= GetOwnPropertyNamesFlags.JS_GPN_STRING_MASK), includeSymbols && (flags |= GetOwnPropertyNamesFlags.JS_GPN_SYMBOL_MASK), includePrivate && (flags |= GetOwnPropertyNamesFlags.JS_GPN_PRIVATE_MASK), onlyEnumerable && (flags |= GetOwnPropertyNamesFlags.JS_GPN_ENUM_ONLY), includeNumbers && (flags |= GetOwnPropertyNamesFlags.QTS_GPN_NUMBER_MASK), numbersAsStrings && (flags |= GetOwnPropertyNamesFlags.QTS_STANDARD_COMPLIANT_NUMBER), flags; +} +function concat(...values) { + let result = []; + for (let value of values) value !== void 0 && (result = result.concat(value)); + return result; +} +function applyBaseRuntimeOptions(runtime, options) { + options.interruptHandler && runtime.setInterruptHandler(options.interruptHandler), options.maxStackSizeBytes !== void 0 && runtime.setMaxStackSize(options.maxStackSizeBytes), options.memoryLimitBytes !== void 0 && runtime.setMemoryLimit(options.memoryLimitBytes); +} +function applyModuleEvalRuntimeOptions(runtime, options) { + options.moduleLoader && runtime.setModuleLoader(options.moduleLoader), options.shouldInterrupt && runtime.setInterruptHandler(options.shouldInterrupt), options.memoryLimitBytes !== void 0 && runtime.setMemoryLimit(options.memoryLimitBytes), options.maxStackSizeBytes !== void 0 && runtime.setMaxStackSize(options.maxStackSizeBytes); +} +var __defProp2, __export2, QTS_DEBUG, errors_exports, QuickJSUnwrapError, QuickJSWrongOwner, QuickJSUseAfterFree, QuickJSNotImplemented, QuickJSAsyncifyError, QuickJSAsyncifySuspended, QuickJSMemoryLeakDetected, QuickJSEmscriptenModuleError, QuickJSUnknownIntrinsic, QuickJSPromisePending, QuickJSEmptyGetOwnPropertyNames, AwaitYield, UsingDisposable, SymbolDispose, prototypeAsAny, Lifetime, StaticLifetime, WeakLifetime, Scope, AbstractDisposableResult, DisposableSuccess, DisposableFail, DisposableResult, QuickJSDeferredPromise, ModuleMemory, UnstableSymbol, DefaultIntrinsics, QuickJSIterator, ContextMemory, QuickJSContext, QuickJSRuntime, QuickJSEmscriptenModuleCallbacks, QuickJSModuleCallbacks, QuickJSWASMModule; +var init_chunk_JTKJZQYV = __esm({ + "registry/components/code/node_modules/quickjs-emscripten-core/dist/chunk-JTKJZQYV.mjs"() { + init_dist(); + init_dist(); + __defProp2 = Object.defineProperty; + __export2 = (target, all) => { + for (var name in all) __defProp2(target, name, { get: all[name], enumerable: true }); + }; + QTS_DEBUG = false; + errors_exports = {}; + __export2(errors_exports, { QuickJSAsyncifyError: () => QuickJSAsyncifyError, QuickJSAsyncifySuspended: () => QuickJSAsyncifySuspended, QuickJSEmptyGetOwnPropertyNames: () => QuickJSEmptyGetOwnPropertyNames, QuickJSEmscriptenModuleError: () => QuickJSEmscriptenModuleError, QuickJSMemoryLeakDetected: () => QuickJSMemoryLeakDetected, QuickJSNotImplemented: () => QuickJSNotImplemented, QuickJSPromisePending: () => QuickJSPromisePending, QuickJSUnknownIntrinsic: () => QuickJSUnknownIntrinsic, QuickJSUnwrapError: () => QuickJSUnwrapError, QuickJSUseAfterFree: () => QuickJSUseAfterFree, QuickJSWrongOwner: () => QuickJSWrongOwner }); + QuickJSUnwrapError = class extends Error { + constructor(cause, context) { + let message = typeof cause == "object" && cause && "message" in cause ? String(cause.message) : String(cause); + super(message); + this.cause = cause; + this.context = context; + this.name = "QuickJSUnwrapError"; + } + }; + QuickJSWrongOwner = class extends Error { + constructor() { + super(...arguments); + this.name = "QuickJSWrongOwner"; + } + }; + QuickJSUseAfterFree = class extends Error { + constructor() { + super(...arguments); + this.name = "QuickJSUseAfterFree"; + } + }; + QuickJSNotImplemented = class extends Error { + constructor() { + super(...arguments); + this.name = "QuickJSNotImplemented"; + } + }; + QuickJSAsyncifyError = class extends Error { + constructor() { + super(...arguments); + this.name = "QuickJSAsyncifyError"; + } + }; + QuickJSAsyncifySuspended = class extends Error { + constructor() { + super(...arguments); + this.name = "QuickJSAsyncifySuspended"; + } + }; + QuickJSMemoryLeakDetected = class extends Error { + constructor() { + super(...arguments); + this.name = "QuickJSMemoryLeakDetected"; + } + }; + QuickJSEmscriptenModuleError = class extends Error { + constructor() { + super(...arguments); + this.name = "QuickJSEmscriptenModuleError"; + } + }; + QuickJSUnknownIntrinsic = class extends TypeError { + constructor() { + super(...arguments); + this.name = "QuickJSUnknownIntrinsic"; + } + }; + QuickJSPromisePending = class extends Error { + constructor() { + super(...arguments); + this.name = "QuickJSPromisePending"; + } + }; + QuickJSEmptyGetOwnPropertyNames = class extends Error { + constructor() { + super(...arguments); + this.name = "QuickJSEmptyGetOwnPropertyNames"; + } + }; + AwaitYield = awaitYield; + AwaitYield.of = awaitYieldOf; + UsingDisposable = class { + [Symbol.dispose]() { + return this.dispose(); + } + }; + SymbolDispose = Symbol.dispose ?? Symbol.for("Symbol.dispose"); + prototypeAsAny = UsingDisposable.prototype; + prototypeAsAny[SymbolDispose] || (prototypeAsAny[SymbolDispose] = function() { + return this.dispose(); + }); + Lifetime = class _Lifetime extends UsingDisposable { + constructor(_value, copier, disposer, _owner) { + super(); + this._value = _value; + this.copier = copier; + this.disposer = disposer; + this._owner = _owner; + this._alive = true; + this._constructorStack = QTS_DEBUG ? new Error("Lifetime constructed").stack : void 0; + } + get alive() { + return this._alive; + } + get value() { + return this.assertAlive(), this._value; + } + get owner() { + return this._owner; + } + get dupable() { + return !!this.copier; + } + dup() { + if (this.assertAlive(), !this.copier) throw new Error("Non-dupable lifetime"); + return new _Lifetime(this.copier(this._value), this.copier, this.disposer, this._owner); + } + consume(map) { + this.assertAlive(); + let result = map(this); + return this.dispose(), result; + } + map(map) { + return this.assertAlive(), map(this); + } + tap(fn) { + return fn(this), this; + } + dispose() { + this.assertAlive(), this.disposer && this.disposer(this._value), this._alive = false; + } + assertAlive() { + if (!this.alive) throw this._constructorStack ? new QuickJSUseAfterFree(`Lifetime not alive +${this._constructorStack} +Lifetime used`) : new QuickJSUseAfterFree("Lifetime not alive"); + } + }; + StaticLifetime = class extends Lifetime { + constructor(value, owner) { + super(value, void 0, void 0, owner); + } + get dupable() { + return true; + } + dup() { + return this; + } + dispose() { + } + }; + WeakLifetime = class extends Lifetime { + constructor(value, copier, disposer, owner) { + super(value, copier, disposer, owner); + } + dispose() { + this._alive = false; + } + }; + Scope = class _Scope extends UsingDisposable { + constructor() { + super(...arguments); + this._disposables = new Lifetime(/* @__PURE__ */ new Set()); + this.manage = (lifetime) => (this._disposables.value.add(lifetime), lifetime); + } + static withScope(block) { + let scope = new _Scope(), blockError; + try { + return block(scope); + } catch (error) { + throw blockError = error, error; + } finally { + scopeFinally(scope, blockError); + } + } + static withScopeMaybeAsync(_this, block) { + return maybeAsync(void 0, function* (awaited) { + let scope = new _Scope(), blockError; + try { + return yield* awaited.of(block.call(_this, awaited, scope)); + } catch (error) { + throw blockError = error, error; + } finally { + scopeFinally(scope, blockError); + } + }); + } + static async withScopeAsync(block) { + let scope = new _Scope(), blockError; + try { + return await block(scope); + } catch (error) { + throw blockError = error, error; + } finally { + scopeFinally(scope, blockError); + } + } + get alive() { + return this._disposables.alive; + } + dispose() { + let lifetimes = Array.from(this._disposables.value.values()).reverse(); + for (let lifetime of lifetimes) lifetime.alive && lifetime.dispose(); + this._disposables.dispose(); + } + }; + AbstractDisposableResult = class _AbstractDisposableResult extends UsingDisposable { + static success(value) { + return new DisposableSuccess(value); + } + static fail(error, onUnwrap) { + return new DisposableFail(error, onUnwrap); + } + static is(result) { + return result instanceof _AbstractDisposableResult; + } + }; + DisposableSuccess = class extends AbstractDisposableResult { + constructor(value) { + super(); + this.value = value; + } + get alive() { + return isDisposable(this.value) ? this.value.alive : true; + } + dispose() { + isDisposable(this.value) && this.value.dispose(); + } + unwrap() { + return this.value; + } + unwrapOr(_fallback) { + return this.value; + } + }; + DisposableFail = class extends AbstractDisposableResult { + constructor(error, onUnwrap) { + super(); + this.error = error; + this.onUnwrap = onUnwrap; + } + get alive() { + return isDisposable(this.error) ? this.error.alive : true; + } + dispose() { + isDisposable(this.error) && this.error.dispose(); + } + unwrap() { + throw this.onUnwrap(this), this.error; + } + unwrapOr(fallback) { + return fallback; + } + }; + DisposableResult = AbstractDisposableResult; + QuickJSDeferredPromise = class extends UsingDisposable { + constructor(args) { + super(); + this.resolve = (value) => { + this.resolveHandle.alive && (this.context.unwrapResult(this.context.callFunction(this.resolveHandle, this.context.undefined, value || this.context.undefined)).dispose(), this.disposeResolvers(), this.onSettled()); + }; + this.reject = (value) => { + this.rejectHandle.alive && (this.context.unwrapResult(this.context.callFunction(this.rejectHandle, this.context.undefined, value || this.context.undefined)).dispose(), this.disposeResolvers(), this.onSettled()); + }; + this.dispose = () => { + this.handle.alive && this.handle.dispose(), this.disposeResolvers(); + }; + this.context = args.context, this.owner = args.context.runtime, this.handle = args.promiseHandle, this.settled = new Promise((resolve) => { + this.onSettled = resolve; + }), this.resolveHandle = args.resolveHandle, this.rejectHandle = args.rejectHandle; + } + get alive() { + return this.handle.alive || this.resolveHandle.alive || this.rejectHandle.alive; + } + disposeResolvers() { + this.resolveHandle.alive && this.resolveHandle.dispose(), this.rejectHandle.alive && this.rejectHandle.dispose(); + } + }; + ModuleMemory = class { + constructor(module) { + this.module = module; + } + toPointerArray(handleArray) { + let typedArray = new Int32Array(handleArray.map((handle) => handle.value)), numBytes = typedArray.length * typedArray.BYTES_PER_ELEMENT, ptr = this.module._malloc(numBytes); + return new Uint8Array(this.module.HEAPU8.buffer, ptr, numBytes).set(new Uint8Array(typedArray.buffer)), new Lifetime(ptr, void 0, (ptr2) => this.module._free(ptr2)); + } + newTypedArray(kind, length) { + let zeros = new kind(new Array(length).fill(0)), numBytes = zeros.length * zeros.BYTES_PER_ELEMENT, ptr = this.module._malloc(numBytes), typedArray = new kind(this.module.HEAPU8.buffer, ptr, length); + return typedArray.set(zeros), new Lifetime({ typedArray, ptr }, void 0, (value) => this.module._free(value.ptr)); + } + newMutablePointerArray(length) { + return this.newTypedArray(Int32Array, length); + } + newHeapCharPointer(string) { + let strlen = this.module.lengthBytesUTF8(string), dataBytes = strlen + 1, ptr = this.module._malloc(dataBytes); + return this.module.stringToUTF8(string, ptr, dataBytes), new Lifetime({ ptr, strlen }, void 0, (value) => this.module._free(value.ptr)); + } + newHeapBufferPointer(buffer) { + let numBytes = buffer.byteLength, ptr = this.module._malloc(numBytes); + return this.module.HEAPU8.set(buffer, ptr), new Lifetime({ pointer: ptr, numBytes }, void 0, (value) => this.module._free(value.pointer)); + } + consumeHeapCharPointer(ptr) { + let str = this.module.UTF8ToString(ptr); + return this.module._free(ptr), str; + } + }; + UnstableSymbol = Symbol("Unstable"); + DefaultIntrinsics = Object.freeze({ BaseObjects: true, Date: true, Eval: true, StringNormalize: true, RegExp: true, JSON: true, Proxy: true, MapSet: true, TypedArrays: true, Promise: true }); + QuickJSIterator = class extends UsingDisposable { + constructor(handle, context) { + super(); + this.handle = handle; + this.context = context; + this._isDone = false; + this.owner = context.runtime; + } + [Symbol.iterator]() { + return this; + } + next(value) { + if (!this.alive || this._isDone) return { done: true, value: void 0 }; + let nextMethod = this._next ?? (this._next = this.context.getProp(this.handle, "next")); + return this.callIteratorMethod(nextMethod, value); + } + return(value) { + if (!this.alive) return { done: true, value: void 0 }; + let returnMethod = this.context.getProp(this.handle, "return"); + if (returnMethod === this.context.undefined && value === void 0) return this.dispose(), { done: true, value: void 0 }; + let result = this.callIteratorMethod(returnMethod, value); + return returnMethod.dispose(), this.dispose(), result; + } + throw(e) { + if (!this.alive) return { done: true, value: void 0 }; + let errorHandle = e instanceof Lifetime ? e : this.context.newError(e), throwMethod = this.context.getProp(this.handle, "throw"), result = this.callIteratorMethod(throwMethod, e); + return errorHandle.alive && errorHandle.dispose(), throwMethod.dispose(), this.dispose(), result; + } + get alive() { + return this.handle.alive; + } + dispose() { + this._isDone = true, this.handle.dispose(), this._next?.dispose(); + } + callIteratorMethod(method, input) { + let callResult = input ? this.context.callFunction(method, this.handle, input) : this.context.callFunction(method, this.handle); + if (callResult.error) return this.dispose(), { value: callResult }; + let done = this.context.getProp(callResult.value, "done").consume((v) => this.context.dump(v)); + if (done) return callResult.value.dispose(), this.dispose(), { done, value: void 0 }; + let value = this.context.getProp(callResult.value, "value"); + return callResult.value.dispose(), { value: DisposableResult.success(value), done }; + } + }; + ContextMemory = class extends ModuleMemory { + constructor(args) { + super(args.module); + this.scope = new Scope(); + this.copyJSValue = (ptr) => this.ffi.QTS_DupValuePointer(this.ctx.value, ptr); + this.freeJSValue = (ptr) => { + this.ffi.QTS_FreeValuePointer(this.ctx.value, ptr); + }; + args.ownedLifetimes?.forEach((lifetime) => this.scope.manage(lifetime)), this.owner = args.owner, this.module = args.module, this.ffi = args.ffi, this.rt = args.rt, this.ctx = this.scope.manage(args.ctx); + } + get alive() { + return this.scope.alive; + } + dispose() { + return this.scope.dispose(); + } + [Symbol.dispose]() { + return this.dispose(); + } + manage(lifetime) { + return this.scope.manage(lifetime); + } + consumeJSCharPointer(ptr) { + let str = this.module.UTF8ToString(ptr); + return this.ffi.QTS_FreeCString(this.ctx.value, ptr), str; + } + heapValueHandle(ptr) { + return new Lifetime(ptr, this.copyJSValue, this.freeJSValue, this.owner); + } + staticHeapValueHandle(ptr) { + return this.manage(this.heapValueHandle(ptr)), new StaticLifetime(ptr, this.owner); + } + }; + QuickJSContext = class extends UsingDisposable { + constructor(args) { + super(); + this._undefined = void 0; + this._null = void 0; + this._false = void 0; + this._true = void 0; + this._global = void 0; + this._BigInt = void 0; + this._Symbol = void 0; + this._SymbolIterator = void 0; + this._SymbolAsyncIterator = void 0; + this.fnNextId = -32768; + this.fnMaps = /* @__PURE__ */ new Map(); + this.cToHostCallbacks = { callFunction: (ctx, this_ptr, argc, argv, fn_id) => { + if (ctx !== this.ctx.value) throw new Error("QuickJSContext instance received C -> JS call with mismatched ctx"); + let fn = this.getFunction(fn_id); + if (!fn) throw new Error(`QuickJSContext had no callback with id ${fn_id}`); + return Scope.withScopeMaybeAsync(this, function* (awaited, scope) { + let thisHandle = scope.manage(new WeakLifetime(this_ptr, this.memory.copyJSValue, this.memory.freeJSValue, this.runtime)), argHandles = new Array(argc); + for (let i = 0; i < argc; i++) { + let ptr = this.ffi.QTS_ArgvGetJSValueConstPointer(argv, i); + argHandles[i] = scope.manage(new WeakLifetime(ptr, this.memory.copyJSValue, this.memory.freeJSValue, this.runtime)); + } + try { + let result = yield* awaited(fn.apply(thisHandle, argHandles)); + if (result) { + if ("error" in result && result.error) throw this.runtime.debugLog("throw error", result.error), result.error; + let handle = scope.manage(result instanceof Lifetime ? result : result.value); + return this.ffi.QTS_DupValuePointer(this.ctx.value, handle.value); + } + return 0; + } catch (error) { + return this.errorToHandle(error).consume((errorHandle) => this.ffi.QTS_Throw(this.ctx.value, errorHandle.value)); + } + }); + } }; + this.runtime = args.runtime, this.module = args.module, this.ffi = args.ffi, this.rt = args.rt, this.ctx = args.ctx, this.memory = new ContextMemory({ ...args, owner: this.runtime }), args.callbacks.setContextCallbacks(this.ctx.value, this.cToHostCallbacks), this.dump = this.dump.bind(this), this.getString = this.getString.bind(this), this.getNumber = this.getNumber.bind(this), this.resolvePromise = this.resolvePromise.bind(this), this.uint32Out = this.memory.manage(this.memory.newTypedArray(Uint32Array, 1)); + } + get alive() { + return this.memory.alive; + } + dispose() { + this.memory.dispose(); + } + get undefined() { + if (this._undefined) return this._undefined; + let ptr = this.ffi.QTS_GetUndefined(); + return this._undefined = new StaticLifetime(ptr); + } + get null() { + if (this._null) return this._null; + let ptr = this.ffi.QTS_GetNull(); + return this._null = new StaticLifetime(ptr); + } + get true() { + if (this._true) return this._true; + let ptr = this.ffi.QTS_GetTrue(); + return this._true = new StaticLifetime(ptr); + } + get false() { + if (this._false) return this._false; + let ptr = this.ffi.QTS_GetFalse(); + return this._false = new StaticLifetime(ptr); + } + get global() { + if (this._global) return this._global; + let ptr = this.ffi.QTS_GetGlobalObject(this.ctx.value); + return this._global = this.memory.staticHeapValueHandle(ptr), this._global; + } + newNumber(num) { + return this.memory.heapValueHandle(this.ffi.QTS_NewFloat64(this.ctx.value, num)); + } + newString(str) { + let ptr = this.memory.newHeapCharPointer(str).consume((charHandle) => this.ffi.QTS_NewString(this.ctx.value, charHandle.value.ptr)); + return this.memory.heapValueHandle(ptr); + } + newUniqueSymbol(description) { + let key = (typeof description == "symbol" ? description.description : description) ?? "", ptr = this.memory.newHeapCharPointer(key).consume((charHandle) => this.ffi.QTS_NewSymbol(this.ctx.value, charHandle.value.ptr, 0)); + return this.memory.heapValueHandle(ptr); + } + newSymbolFor(key) { + let description = (typeof key == "symbol" ? key.description : key) ?? "", ptr = this.memory.newHeapCharPointer(description).consume((charHandle) => this.ffi.QTS_NewSymbol(this.ctx.value, charHandle.value.ptr, 1)); + return this.memory.heapValueHandle(ptr); + } + getWellKnownSymbol(name) { + return this._Symbol ?? (this._Symbol = this.memory.manage(this.getProp(this.global, "Symbol"))), this.getProp(this._Symbol, name); + } + newBigInt(num) { + if (!this._BigInt) { + let bigIntHandle2 = this.getProp(this.global, "BigInt"); + this.memory.manage(bigIntHandle2), this._BigInt = new StaticLifetime(bigIntHandle2.value, this.runtime); + } + let bigIntHandle = this._BigInt, asString = String(num); + return this.newString(asString).consume((handle) => this.unwrapResult(this.callFunction(bigIntHandle, this.undefined, handle))); + } + newObject(prototype) { + prototype && this.runtime.assertOwned(prototype); + let ptr = prototype ? this.ffi.QTS_NewObjectProto(this.ctx.value, prototype.value) : this.ffi.QTS_NewObject(this.ctx.value); + return this.memory.heapValueHandle(ptr); + } + newArray() { + let ptr = this.ffi.QTS_NewArray(this.ctx.value); + return this.memory.heapValueHandle(ptr); + } + newArrayBuffer(buffer) { + let array = new Uint8Array(buffer), handle = this.memory.newHeapBufferPointer(array), ptr = this.ffi.QTS_NewArrayBuffer(this.ctx.value, handle.value.pointer, array.length); + return this.memory.heapValueHandle(ptr); + } + newPromise(value) { + let deferredPromise = Scope.withScope((scope) => { + let mutablePointerArray = scope.manage(this.memory.newMutablePointerArray(2)), promisePtr = this.ffi.QTS_NewPromiseCapability(this.ctx.value, mutablePointerArray.value.ptr), promiseHandle = this.memory.heapValueHandle(promisePtr), [resolveHandle, rejectHandle] = Array.from(mutablePointerArray.value.typedArray).map((jsvaluePtr) => this.memory.heapValueHandle(jsvaluePtr)); + return new QuickJSDeferredPromise({ context: this, promiseHandle, resolveHandle, rejectHandle }); + }); + return value && typeof value == "function" && (value = new Promise(value)), value && Promise.resolve(value).then(deferredPromise.resolve, (error) => error instanceof Lifetime ? deferredPromise.reject(error) : this.newError(error).consume(deferredPromise.reject)), deferredPromise; + } + newFunction(name, fn) { + let fnId = ++this.fnNextId; + return this.setFunction(fnId, fn), this.memory.heapValueHandle(this.ffi.QTS_NewFunction(this.ctx.value, fnId, name)); + } + newError(error) { + let errorHandle = this.memory.heapValueHandle(this.ffi.QTS_NewError(this.ctx.value)); + return error && typeof error == "object" ? (error.name !== void 0 && this.newString(error.name).consume((handle) => this.setProp(errorHandle, "name", handle)), error.message !== void 0 && this.newString(error.message).consume((handle) => this.setProp(errorHandle, "message", handle))) : typeof error == "string" ? this.newString(error).consume((handle) => this.setProp(errorHandle, "message", handle)) : error !== void 0 && this.newString(String(error)).consume((handle) => this.setProp(errorHandle, "message", handle)), errorHandle; + } + typeof(handle) { + return this.runtime.assertOwned(handle), this.memory.consumeHeapCharPointer(this.ffi.QTS_Typeof(this.ctx.value, handle.value)); + } + getNumber(handle) { + return this.runtime.assertOwned(handle), this.ffi.QTS_GetFloat64(this.ctx.value, handle.value); + } + getString(handle) { + return this.runtime.assertOwned(handle), this.memory.consumeJSCharPointer(this.ffi.QTS_GetString(this.ctx.value, handle.value)); + } + getSymbol(handle) { + this.runtime.assertOwned(handle); + let key = this.memory.consumeJSCharPointer(this.ffi.QTS_GetSymbolDescriptionOrKey(this.ctx.value, handle.value)); + return this.ffi.QTS_IsGlobalSymbol(this.ctx.value, handle.value) ? Symbol.for(key) : Symbol(key); + } + getBigInt(handle) { + this.runtime.assertOwned(handle); + let asString = this.getString(handle); + return BigInt(asString); + } + getArrayBuffer(handle) { + this.runtime.assertOwned(handle); + let len = this.ffi.QTS_GetArrayBufferLength(this.ctx.value, handle.value), ptr = this.ffi.QTS_GetArrayBuffer(this.ctx.value, handle.value); + if (!ptr) throw new Error("Couldn't allocate memory to get ArrayBuffer"); + return new Lifetime(this.module.HEAPU8.subarray(ptr, ptr + len), void 0, () => this.module._free(ptr)); + } + getPromiseState(handle) { + this.runtime.assertOwned(handle); + let state = this.ffi.QTS_PromiseState(this.ctx.value, handle.value); + if (state < 0) return { type: "fulfilled", value: handle, notAPromise: true }; + if (state === JSPromiseStateEnum.Pending) return { type: "pending", get error() { + return new QuickJSPromisePending("Cannot unwrap a pending promise"); + } }; + let ptr = this.ffi.QTS_PromiseResult(this.ctx.value, handle.value), result = this.memory.heapValueHandle(ptr); + if (state === JSPromiseStateEnum.Fulfilled) return { type: "fulfilled", value: result }; + if (state === JSPromiseStateEnum.Rejected) return { type: "rejected", error: result }; + throw result.dispose(), new Error(`Unknown JSPromiseStateEnum: ${state}`); + } + resolvePromise(promiseLikeHandle) { + this.runtime.assertOwned(promiseLikeHandle); + let vmResolveResult = Scope.withScope((scope) => { + let vmPromise = scope.manage(this.getProp(this.global, "Promise")), vmPromiseResolve = scope.manage(this.getProp(vmPromise, "resolve")); + return this.callFunction(vmPromiseResolve, vmPromise, promiseLikeHandle); + }); + return vmResolveResult.error ? Promise.resolve(vmResolveResult) : new Promise((resolve) => { + Scope.withScope((scope) => { + let resolveHandle = scope.manage(this.newFunction("resolve", (value) => { + resolve(this.success(value && value.dup())); + })), rejectHandle = scope.manage(this.newFunction("reject", (error) => { + resolve(this.fail(error && error.dup())); + })), promiseHandle = scope.manage(vmResolveResult.value), promiseThenHandle = scope.manage(this.getProp(promiseHandle, "then")); + this.callFunction(promiseThenHandle, promiseHandle, resolveHandle, rejectHandle).unwrap().dispose(); + }); + }); + } + isEqual(a, b, equalityType = IsEqualOp.IsStrictlyEqual) { + if (a === b) return true; + this.runtime.assertOwned(a), this.runtime.assertOwned(b); + let result = this.ffi.QTS_IsEqual(this.ctx.value, a.value, b.value, equalityType); + if (result === -1) throw new QuickJSNotImplemented("WASM variant does not expose equality"); + return !!result; + } + eq(handle, other) { + return this.isEqual(handle, other, IsEqualOp.IsStrictlyEqual); + } + sameValue(handle, other) { + return this.isEqual(handle, other, IsEqualOp.IsSameValue); + } + sameValueZero(handle, other) { + return this.isEqual(handle, other, IsEqualOp.IsSameValueZero); + } + getProp(handle, key) { + this.runtime.assertOwned(handle); + let ptr; + return typeof key == "number" && key >= 0 ? ptr = this.ffi.QTS_GetPropNumber(this.ctx.value, handle.value, key) : ptr = this.borrowPropertyKey(key).consume((quickJSKey) => this.ffi.QTS_GetProp(this.ctx.value, handle.value, quickJSKey.value)), this.memory.heapValueHandle(ptr); + } + getLength(handle) { + if (this.runtime.assertOwned(handle), !(this.ffi.QTS_GetLength(this.ctx.value, this.uint32Out.value.ptr, handle.value) < 0)) return this.uint32Out.value.typedArray[0]; + } + getOwnPropertyNames(handle, options = { strings: true, numbersAsStrings: true }) { + this.runtime.assertOwned(handle), handle.value; + let flags = getOwnPropertyNamesOptionsToFlags(options); + if (flags === 0) throw new QuickJSEmptyGetOwnPropertyNames("No options set, will return an empty array"); + return Scope.withScope((scope) => { + let outPtr = scope.manage(this.memory.newMutablePointerArray(1)), errorPtr = this.ffi.QTS_GetOwnPropertyNames(this.ctx.value, outPtr.value.ptr, this.uint32Out.value.ptr, handle.value, flags); + if (errorPtr) return this.fail(this.memory.heapValueHandle(errorPtr)); + let len = this.uint32Out.value.typedArray[0], ptr = outPtr.value.typedArray[0], pointerArray = new Uint32Array(this.module.HEAP8.buffer, ptr, len), handles = Array.from(pointerArray).map((ptr2) => this.memory.heapValueHandle(ptr2)); + return this.ffi.QTS_FreeVoidPointer(this.ctx.value, ptr), this.success(createDisposableArray(handles)); + }); + } + getIterator(iterableHandle) { + let SymbolIterator = this._SymbolIterator ?? (this._SymbolIterator = this.memory.manage(this.getWellKnownSymbol("iterator"))); + return Scope.withScope((scope) => { + let methodHandle = scope.manage(this.getProp(iterableHandle, SymbolIterator)), iteratorCallResult = this.callFunction(methodHandle, iterableHandle); + return iteratorCallResult.error ? iteratorCallResult : this.success(new QuickJSIterator(iteratorCallResult.value, this)); + }); + } + setProp(handle, key, value) { + this.runtime.assertOwned(handle), this.borrowPropertyKey(key).consume((quickJSKey) => this.ffi.QTS_SetProp(this.ctx.value, handle.value, quickJSKey.value, value.value)); + } + defineProp(handle, key, descriptor) { + this.runtime.assertOwned(handle), Scope.withScope((scope) => { + let quickJSKey = scope.manage(this.borrowPropertyKey(key)), value = descriptor.value || this.undefined, configurable = !!descriptor.configurable, enumerable = !!descriptor.enumerable, hasValue = !!descriptor.value, get = descriptor.get ? scope.manage(this.newFunction(descriptor.get.name, descriptor.get)) : this.undefined, set = descriptor.set ? scope.manage(this.newFunction(descriptor.set.name, descriptor.set)) : this.undefined; + this.ffi.QTS_DefineProp(this.ctx.value, handle.value, quickJSKey.value, value.value, get.value, set.value, configurable, enumerable, hasValue); + }); + } + callFunction(func, thisVal, ...restArgs) { + this.runtime.assertOwned(func); + let args, firstArg = restArgs[0]; + firstArg === void 0 || Array.isArray(firstArg) ? args = firstArg ?? [] : args = restArgs; + let resultPtr = this.memory.toPointerArray(args).consume((argsArrayPtr) => this.ffi.QTS_Call(this.ctx.value, func.value, thisVal.value, args.length, argsArrayPtr.value)), errorPtr = this.ffi.QTS_ResolveException(this.ctx.value, resultPtr); + return errorPtr ? (this.ffi.QTS_FreeValuePointer(this.ctx.value, resultPtr), this.fail(this.memory.heapValueHandle(errorPtr))) : this.success(this.memory.heapValueHandle(resultPtr)); + } + callMethod(thisHandle, key, args = []) { + return this.getProp(thisHandle, key).consume((func) => this.callFunction(func, thisHandle, args)); + } + evalCode(code, filename = "eval.js", options) { + let detectModule = options === void 0 ? 1 : 0, flags = evalOptionsToFlags(options), resultPtr = this.memory.newHeapCharPointer(code).consume((charHandle) => this.ffi.QTS_Eval(this.ctx.value, charHandle.value.ptr, charHandle.value.strlen, filename, detectModule, flags)), errorPtr = this.ffi.QTS_ResolveException(this.ctx.value, resultPtr); + return errorPtr ? (this.ffi.QTS_FreeValuePointer(this.ctx.value, resultPtr), this.fail(this.memory.heapValueHandle(errorPtr))) : this.success(this.memory.heapValueHandle(resultPtr)); + } + throw(error) { + return this.errorToHandle(error).consume((handle) => this.ffi.QTS_Throw(this.ctx.value, handle.value)); + } + borrowPropertyKey(key) { + return typeof key == "number" ? this.newNumber(key) : typeof key == "string" ? this.newString(key) : new StaticLifetime(key.value, this.runtime); + } + getMemory(rt) { + if (rt === this.rt.value) return this.memory; + throw new Error("Private API. Cannot get memory from a different runtime"); + } + dump(handle) { + this.runtime.assertOwned(handle); + let type = this.typeof(handle); + if (type === "string") return this.getString(handle); + if (type === "number") return this.getNumber(handle); + if (type === "bigint") return this.getBigInt(handle); + if (type === "undefined") return; + if (type === "symbol") return this.getSymbol(handle); + let asPromiseState = this.getPromiseState(handle); + if (asPromiseState.type === "fulfilled" && !asPromiseState.notAPromise) return handle.dispose(), { type: asPromiseState.type, value: asPromiseState.value.consume(this.dump) }; + if (asPromiseState.type === "pending") return handle.dispose(), { type: asPromiseState.type }; + if (asPromiseState.type === "rejected") return handle.dispose(), { type: asPromiseState.type, error: asPromiseState.error.consume(this.dump) }; + let str = this.memory.consumeJSCharPointer(this.ffi.QTS_Dump(this.ctx.value, handle.value)); + try { + return JSON.parse(str); + } catch { + return str; + } + } + unwrapResult(result) { + if (result.error) { + let context = "context" in result.error ? result.error.context : this, cause = result.error.consume((error) => this.dump(error)); + if (cause && typeof cause == "object" && typeof cause.message == "string") { + let { message, name, stack, ...rest } = cause, exception = new QuickJSUnwrapError(cause, context); + typeof name == "string" && (exception.name = cause.name), exception.message = message; + let hostStack = exception.stack; + throw typeof stack == "string" && (exception.stack = `${name}: ${message} +${cause.stack}Host: ${hostStack}`), Object.assign(exception, rest), exception; + } + throw new QuickJSUnwrapError(cause); + } + return result.value; + } + [Symbol.for("nodejs.util.inspect.custom")]() { + return this.alive ? `${this.constructor.name} { ctx: ${this.ctx.value} rt: ${this.rt.value} }` : `${this.constructor.name} { disposed }`; + } + getFunction(fn_id) { + let map_id = fn_id >> 8, fnMap = this.fnMaps.get(map_id); + if (fnMap) return fnMap.get(fn_id); + } + setFunction(fn_id, handle) { + let map_id = fn_id >> 8, fnMap = this.fnMaps.get(map_id); + return fnMap || (fnMap = /* @__PURE__ */ new Map(), this.fnMaps.set(map_id, fnMap)), fnMap.set(fn_id, handle); + } + errorToHandle(error) { + return error instanceof Lifetime ? error : this.newError(error); + } + encodeBinaryJSON(handle) { + let ptr = this.ffi.QTS_bjson_encode(this.ctx.value, handle.value); + return this.memory.heapValueHandle(ptr); + } + decodeBinaryJSON(handle) { + let ptr = this.ffi.QTS_bjson_decode(this.ctx.value, handle.value); + return this.memory.heapValueHandle(ptr); + } + success(value) { + return DisposableResult.success(value); + } + fail(error) { + return DisposableResult.fail(error, (error2) => this.unwrapResult(error2)); + } + }; + QuickJSRuntime = class extends UsingDisposable { + constructor(args) { + super(); + this.scope = new Scope(); + this.contextMap = /* @__PURE__ */ new Map(); + this._debugMode = false; + this.cToHostCallbacks = { shouldInterrupt: (rt) => { + if (rt !== this.rt.value) throw new Error("QuickJSContext instance received C -> JS interrupt with mismatched rt"); + let fn = this.interruptHandler; + if (!fn) throw new Error("QuickJSContext had no interrupt handler"); + return fn(this) ? 1 : 0; + }, loadModuleSource: maybeAsyncFn(this, function* (awaited, rt, ctx, moduleName) { + let moduleLoader = this.moduleLoader; + if (!moduleLoader) throw new Error("Runtime has no module loader"); + if (rt !== this.rt.value) throw new Error("Runtime pointer mismatch"); + let context = this.contextMap.get(ctx) ?? this.newContext({ contextPointer: ctx }); + try { + let result = yield* awaited(moduleLoader(moduleName, context)); + if (typeof result == "object" && "error" in result && result.error) throw this.debugLog("cToHostLoadModule: loader returned error", result.error), result.error; + let moduleSource = typeof result == "string" ? result : "value" in result ? result.value : result; + return this.memory.newHeapCharPointer(moduleSource).value.ptr; + } catch (error) { + return this.debugLog("cToHostLoadModule: caught error", error), context.throw(error), 0; + } + }), normalizeModule: maybeAsyncFn(this, function* (awaited, rt, ctx, baseModuleName, moduleNameRequest) { + let moduleNormalizer = this.moduleNormalizer; + if (!moduleNormalizer) throw new Error("Runtime has no module normalizer"); + if (rt !== this.rt.value) throw new Error("Runtime pointer mismatch"); + let context = this.contextMap.get(ctx) ?? this.newContext({ contextPointer: ctx }); + try { + let result = yield* awaited(moduleNormalizer(baseModuleName, moduleNameRequest, context)); + if (typeof result == "object" && "error" in result && result.error) throw this.debugLog("cToHostNormalizeModule: normalizer returned error", result.error), result.error; + let name = typeof result == "string" ? result : result.value; + return context.getMemory(this.rt.value).newHeapCharPointer(name).value.ptr; + } catch (error) { + return this.debugLog("normalizeModule: caught error", error), context.throw(error), 0; + } + }) }; + args.ownedLifetimes?.forEach((lifetime) => this.scope.manage(lifetime)), this.module = args.module, this.memory = new ModuleMemory(this.module), this.ffi = args.ffi, this.rt = args.rt, this.callbacks = args.callbacks, this.scope.manage(this.rt), this.callbacks.setRuntimeCallbacks(this.rt.value, this.cToHostCallbacks), this.executePendingJobs = this.executePendingJobs.bind(this), QTS_DEBUG && this.setDebugMode(true); + } + get alive() { + return this.scope.alive; + } + dispose() { + return this.scope.dispose(); + } + newContext(options = {}) { + let intrinsics = intrinsicsToFlags(options.intrinsics), ctx = new Lifetime(options.contextPointer || this.ffi.QTS_NewContext(this.rt.value, intrinsics), void 0, (ctx_ptr) => { + this.contextMap.delete(ctx_ptr), this.callbacks.deleteContext(ctx_ptr), this.ffi.QTS_FreeContext(ctx_ptr); + }), context = new QuickJSContext({ module: this.module, ctx, ffi: this.ffi, rt: this.rt, ownedLifetimes: options.ownedLifetimes, runtime: this, callbacks: this.callbacks }); + return this.contextMap.set(ctx.value, context), context; + } + setModuleLoader(moduleLoader, moduleNormalizer) { + this.moduleLoader = moduleLoader, this.moduleNormalizer = moduleNormalizer, this.ffi.QTS_RuntimeEnableModuleLoader(this.rt.value, this.moduleNormalizer ? 1 : 0); + } + removeModuleLoader() { + this.moduleLoader = void 0, this.ffi.QTS_RuntimeDisableModuleLoader(this.rt.value); + } + hasPendingJob() { + return !!this.ffi.QTS_IsJobPending(this.rt.value); + } + setInterruptHandler(cb) { + let prevInterruptHandler = this.interruptHandler; + this.interruptHandler = cb, prevInterruptHandler || this.ffi.QTS_RuntimeEnableInterruptHandler(this.rt.value); + } + removeInterruptHandler() { + this.interruptHandler && (this.ffi.QTS_RuntimeDisableInterruptHandler(this.rt.value), this.interruptHandler = void 0); + } + executePendingJobs(maxJobsToExecute = -1) { + let ctxPtrOut = this.memory.newMutablePointerArray(1), valuePtr = this.ffi.QTS_ExecutePendingJob(this.rt.value, maxJobsToExecute ?? -1, ctxPtrOut.value.ptr), ctxPtr = ctxPtrOut.value.typedArray[0]; + if (ctxPtrOut.dispose(), ctxPtr === 0) return this.ffi.QTS_FreeValuePointerRuntime(this.rt.value, valuePtr), DisposableResult.success(0); + let context = this.contextMap.get(ctxPtr) ?? this.newContext({ contextPointer: ctxPtr }), resultValue = context.getMemory(this.rt.value).heapValueHandle(valuePtr); + if (context.typeof(resultValue) === "number") { + let executedJobs = context.getNumber(resultValue); + return resultValue.dispose(), DisposableResult.success(executedJobs); + } else { + let error = Object.assign(resultValue, { context }); + return DisposableResult.fail(error, (error2) => context.unwrapResult(error2)); + } + } + setMemoryLimit(limitBytes) { + if (limitBytes < 0 && limitBytes !== -1) throw new Error("Cannot set memory limit to negative number. To unset, pass -1"); + this.ffi.QTS_RuntimeSetMemoryLimit(this.rt.value, limitBytes); + } + computeMemoryUsage() { + let serviceContextMemory = this.getSystemContext().getMemory(this.rt.value); + return serviceContextMemory.heapValueHandle(this.ffi.QTS_RuntimeComputeMemoryUsage(this.rt.value, serviceContextMemory.ctx.value)); + } + dumpMemoryUsage() { + return this.memory.consumeHeapCharPointer(this.ffi.QTS_RuntimeDumpMemoryUsage(this.rt.value)); + } + setMaxStackSize(stackSize) { + if (stackSize < 0) throw new Error("Cannot set memory limit to negative number. To unset, pass 0."); + this.ffi.QTS_RuntimeSetMaxStackSize(this.rt.value, stackSize); + } + assertOwned(handle) { + if (handle.owner && handle.owner.rt !== this.rt) throw new QuickJSWrongOwner(`Handle is not owned by this runtime: ${handle.owner.rt.value} != ${this.rt.value}`); + } + setDebugMode(enabled) { + this._debugMode = enabled, this.ffi.DEBUG && this.rt.alive && this.ffi.QTS_SetDebugLogEnabled(this.rt.value, enabled ? 1 : 0); + } + isDebugMode() { + return this._debugMode; + } + debugLog(...msg) { + this._debugMode && console.log("quickjs-emscripten:", ...msg); + } + [Symbol.for("nodejs.util.inspect.custom")]() { + return this.alive ? `${this.constructor.name} { rt: ${this.rt.value} }` : `${this.constructor.name} { disposed }`; + } + getSystemContext() { + return this.context || (this.context = this.scope.manage(this.newContext())), this.context; + } + }; + QuickJSEmscriptenModuleCallbacks = class { + constructor(args) { + this.callFunction = args.callFunction, this.shouldInterrupt = args.shouldInterrupt, this.loadModuleSource = args.loadModuleSource, this.normalizeModule = args.normalizeModule; + } + }; + QuickJSModuleCallbacks = class { + constructor(module) { + this.contextCallbacks = /* @__PURE__ */ new Map(); + this.runtimeCallbacks = /* @__PURE__ */ new Map(); + this.suspendedCount = 0; + this.cToHostCallbacks = new QuickJSEmscriptenModuleCallbacks({ callFunction: (asyncify, ctx, this_ptr, argc, argv, fn_id) => this.handleAsyncify(asyncify, () => { + try { + let vm = this.contextCallbacks.get(ctx); + if (!vm) throw new Error(`QuickJSContext(ctx = ${ctx}) not found for C function call "${fn_id}"`); + return vm.callFunction(ctx, this_ptr, argc, argv, fn_id); + } catch (error) { + return console.error("[C to host error: returning null]", error), 0; + } + }), shouldInterrupt: (asyncify, rt) => this.handleAsyncify(asyncify, () => { + try { + let vm = this.runtimeCallbacks.get(rt); + if (!vm) throw new Error(`QuickJSRuntime(rt = ${rt}) not found for C interrupt`); + return vm.shouldInterrupt(rt); + } catch (error) { + return console.error("[C to host interrupt: returning error]", error), 1; + } + }), loadModuleSource: (asyncify, rt, ctx, moduleName) => this.handleAsyncify(asyncify, () => { + try { + let runtimeCallbacks = this.runtimeCallbacks.get(rt); + if (!runtimeCallbacks) throw new Error(`QuickJSRuntime(rt = ${rt}) not found for C module loader`); + let loadModule = runtimeCallbacks.loadModuleSource; + if (!loadModule) throw new Error(`QuickJSRuntime(rt = ${rt}) does not support module loading`); + return loadModule(rt, ctx, moduleName); + } catch (error) { + return console.error("[C to host module loader error: returning null]", error), 0; + } + }), normalizeModule: (asyncify, rt, ctx, moduleBaseName, moduleName) => this.handleAsyncify(asyncify, () => { + try { + let runtimeCallbacks = this.runtimeCallbacks.get(rt); + if (!runtimeCallbacks) throw new Error(`QuickJSRuntime(rt = ${rt}) not found for C module loader`); + let normalizeModule = runtimeCallbacks.normalizeModule; + if (!normalizeModule) throw new Error(`QuickJSRuntime(rt = ${rt}) does not support module loading`); + return normalizeModule(rt, ctx, moduleBaseName, moduleName); + } catch (error) { + return console.error("[C to host module loader error: returning null]", error), 0; + } + }) }); + this.module = module, this.module.callbacks = this.cToHostCallbacks; + } + setRuntimeCallbacks(rt, callbacks) { + this.runtimeCallbacks.set(rt, callbacks); + } + deleteRuntime(rt) { + this.runtimeCallbacks.delete(rt); + } + setContextCallbacks(ctx, callbacks) { + this.contextCallbacks.set(ctx, callbacks); + } + deleteContext(ctx) { + this.contextCallbacks.delete(ctx); + } + handleAsyncify(asyncify, fn) { + if (asyncify) return asyncify.handleSleep((done) => { + try { + let result = fn(); + if (!(result instanceof Promise)) { + debugLog("asyncify.handleSleep: not suspending:", result), done(result); + return; + } + if (this.suspended) throw new QuickJSAsyncifyError(`Already suspended at: ${this.suspended.stack} +Attempted to suspend at:`); + this.suspended = new QuickJSAsyncifySuspended(`(${this.suspendedCount++})`), debugLog("asyncify.handleSleep: suspending:", this.suspended), result.then((resolvedResult) => { + this.suspended = void 0, debugLog("asyncify.handleSleep: resolved:", resolvedResult), done(resolvedResult); + }, (error) => { + debugLog("asyncify.handleSleep: rejected:", error), console.error("QuickJS: cannot handle error in suspended function", error), this.suspended = void 0; + }); + } catch (error) { + throw debugLog("asyncify.handleSleep: error:", error), this.suspended = void 0, error; + } + }); + let value = fn(); + if (value instanceof Promise) throw new Error("Promise return value not supported in non-asyncify context."); + return value; + } + }; + QuickJSWASMModule = class { + constructor(module, ffi) { + this.module = module, this.ffi = ffi, this.callbacks = new QuickJSModuleCallbacks(module); + } + newRuntime(options = {}) { + let rt = new Lifetime(this.ffi.QTS_NewRuntime(), void 0, (rt_ptr) => { + this.callbacks.deleteRuntime(rt_ptr), this.ffi.QTS_FreeRuntime(rt_ptr); + }), runtime = new QuickJSRuntime({ module: this.module, callbacks: this.callbacks, ffi: this.ffi, rt }); + return applyBaseRuntimeOptions(runtime, options), options.moduleLoader && runtime.setModuleLoader(options.moduleLoader), runtime; + } + newContext(options = {}) { + let runtime = this.newRuntime(), context = runtime.newContext({ ...options, ownedLifetimes: concat(runtime, options.ownedLifetimes) }); + return runtime.context = context, context; + } + evalCode(code, options = {}) { + return Scope.withScope((scope) => { + let vm = scope.manage(this.newContext()); + applyModuleEvalRuntimeOptions(vm.runtime, options); + let result = vm.evalCode(code, "eval.js"); + if (options.memoryLimitBytes !== void 0 && vm.runtime.setMemoryLimit(-1), result.error) throw vm.dump(scope.manage(result.error)); + return vm.dump(scope.manage(result.value)); + }); + } + getWasmMemory() { + let memory = this.module.quickjsEmscriptenInit?.(() => { + })?.getWasmMemory?.(); + if (!memory) throw new Error("Variant does not support getting WebAssembly.Memory"); + return memory; + } + getFFI() { + return this.ffi; + } + }; + } +}); + +// registry/components/code/node_modules/quickjs-emscripten-core/dist/module-6F3E5H7Y.mjs +var module_6F3E5H7Y_exports = {}; +__export(module_6F3E5H7Y_exports, { + QuickJSModuleCallbacks: () => QuickJSModuleCallbacks, + QuickJSWASMModule: () => QuickJSWASMModule, + applyBaseRuntimeOptions: () => applyBaseRuntimeOptions, + applyModuleEvalRuntimeOptions: () => applyModuleEvalRuntimeOptions +}); +var init_module_6F3E5H7Y = __esm({ + "registry/components/code/node_modules/quickjs-emscripten-core/dist/module-6F3E5H7Y.mjs"() { + init_chunk_JTKJZQYV(); + } +}); + +// registry/components/code/node_modules/@jitl/quickjs-wasmfile-release-sync/dist/ffi.mjs +var ffi_exports = {}; +__export(ffi_exports, { + QuickJSFFI: () => QuickJSFFI +}); +var QuickJSFFI; +var init_ffi = __esm({ + "registry/components/code/node_modules/@jitl/quickjs-wasmfile-release-sync/dist/ffi.mjs"() { + QuickJSFFI = class { + constructor(module) { + this.module = module; + this.DEBUG = false; + this.QTS_Throw = this.module.cwrap("QTS_Throw", "number", ["number", "number"]); + this.QTS_NewError = this.module.cwrap("QTS_NewError", "number", ["number"]); + this.QTS_RuntimeSetMemoryLimit = this.module.cwrap("QTS_RuntimeSetMemoryLimit", null, ["number", "number"]); + this.QTS_RuntimeComputeMemoryUsage = this.module.cwrap("QTS_RuntimeComputeMemoryUsage", "number", ["number", "number"]); + this.QTS_RuntimeDumpMemoryUsage = this.module.cwrap("QTS_RuntimeDumpMemoryUsage", "number", ["number"]); + this.QTS_RecoverableLeakCheck = this.module.cwrap("QTS_RecoverableLeakCheck", "number", []); + this.QTS_BuildIsSanitizeLeak = this.module.cwrap("QTS_BuildIsSanitizeLeak", "number", []); + this.QTS_RuntimeSetMaxStackSize = this.module.cwrap("QTS_RuntimeSetMaxStackSize", null, ["number", "number"]); + this.QTS_GetUndefined = this.module.cwrap("QTS_GetUndefined", "number", []); + this.QTS_GetNull = this.module.cwrap("QTS_GetNull", "number", []); + this.QTS_GetFalse = this.module.cwrap("QTS_GetFalse", "number", []); + this.QTS_GetTrue = this.module.cwrap("QTS_GetTrue", "number", []); + this.QTS_NewHostRef = this.module.cwrap("QTS_NewHostRef", "number", ["number", "number"]); + this.QTS_GetHostRefId = this.module.cwrap("QTS_GetHostRefId", "number", ["number"]); + this.QTS_NewRuntime = this.module.cwrap("QTS_NewRuntime", "number", []); + this.QTS_FreeRuntime = this.module.cwrap("QTS_FreeRuntime", null, ["number"]); + this.QTS_NewContext = this.module.cwrap("QTS_NewContext", "number", ["number", "number"]); + this.QTS_FreeContext = this.module.cwrap("QTS_FreeContext", null, ["number"]); + this.QTS_FreeValuePointer = this.module.cwrap("QTS_FreeValuePointer", null, ["number", "number"]); + this.QTS_FreeValuePointerRuntime = this.module.cwrap("QTS_FreeValuePointerRuntime", null, ["number", "number"]); + this.QTS_FreeVoidPointer = this.module.cwrap("QTS_FreeVoidPointer", null, ["number", "number"]); + this.QTS_FreeCString = this.module.cwrap("QTS_FreeCString", null, ["number", "number"]); + this.QTS_DupValuePointer = this.module.cwrap("QTS_DupValuePointer", "number", ["number", "number"]); + this.QTS_NewObject = this.module.cwrap("QTS_NewObject", "number", ["number"]); + this.QTS_NewObjectProto = this.module.cwrap("QTS_NewObjectProto", "number", ["number", "number"]); + this.QTS_NewArray = this.module.cwrap("QTS_NewArray", "number", ["number"]); + this.QTS_NewArrayBuffer = this.module.cwrap("QTS_NewArrayBuffer", "number", ["number", "number", "number"]); + this.QTS_NewFloat64 = this.module.cwrap("QTS_NewFloat64", "number", ["number", "number"]); + this.QTS_GetFloat64 = this.module.cwrap("QTS_GetFloat64", "number", ["number", "number"]); + this.QTS_NewString = this.module.cwrap("QTS_NewString", "number", ["number", "number"]); + this.QTS_GetString = this.module.cwrap("QTS_GetString", "number", ["number", "number"]); + this.QTS_GetArrayBuffer = this.module.cwrap("QTS_GetArrayBuffer", "number", ["number", "number"]); + this.QTS_GetArrayBufferLength = this.module.cwrap("QTS_GetArrayBufferLength", "number", ["number", "number"]); + this.QTS_NewSymbol = this.module.cwrap("QTS_NewSymbol", "number", ["number", "number", "number"]); + this.QTS_GetSymbolDescriptionOrKey = this.module.cwrap("QTS_GetSymbolDescriptionOrKey", "number", ["number", "number"]); + this.QTS_IsGlobalSymbol = this.module.cwrap("QTS_IsGlobalSymbol", "number", ["number", "number"]); + this.QTS_IsJobPending = this.module.cwrap("QTS_IsJobPending", "number", ["number"]); + this.QTS_ExecutePendingJob = this.module.cwrap("QTS_ExecutePendingJob", "number", ["number", "number", "number"]); + this.QTS_GetProp = this.module.cwrap("QTS_GetProp", "number", ["number", "number", "number"]); + this.QTS_GetPropNumber = this.module.cwrap("QTS_GetPropNumber", "number", ["number", "number", "number"]); + this.QTS_SetProp = this.module.cwrap("QTS_SetProp", null, ["number", "number", "number", "number"]); + this.QTS_DefineProp = this.module.cwrap("QTS_DefineProp", null, ["number", "number", "number", "number", "number", "number", "boolean", "boolean", "boolean"]); + this.QTS_GetOwnPropertyNames = this.module.cwrap("QTS_GetOwnPropertyNames", "number", ["number", "number", "number", "number", "number"]); + this.QTS_Call = this.module.cwrap("QTS_Call", "number", ["number", "number", "number", "number", "number"]); + this.QTS_ResolveException = this.module.cwrap("QTS_ResolveException", "number", ["number", "number"]); + this.QTS_Dump = this.module.cwrap("QTS_Dump", "number", ["number", "number"]); + this.QTS_Eval = this.module.cwrap("QTS_Eval", "number", ["number", "number", "number", "string", "number", "number"]); + this.QTS_GetModuleNamespace = this.module.cwrap("QTS_GetModuleNamespace", "number", ["number", "number"]); + this.QTS_Typeof = this.module.cwrap("QTS_Typeof", "number", ["number", "number"]); + this.QTS_GetLength = this.module.cwrap("QTS_GetLength", "number", ["number", "number", "number"]); + this.QTS_IsEqual = this.module.cwrap("QTS_IsEqual", "number", ["number", "number", "number", "number"]); + this.QTS_GetGlobalObject = this.module.cwrap("QTS_GetGlobalObject", "number", ["number"]); + this.QTS_NewPromiseCapability = this.module.cwrap("QTS_NewPromiseCapability", "number", ["number", "number"]); + this.QTS_PromiseState = this.module.cwrap("QTS_PromiseState", "number", ["number", "number"]); + this.QTS_PromiseResult = this.module.cwrap("QTS_PromiseResult", "number", ["number", "number"]); + this.QTS_TestStringArg = this.module.cwrap("QTS_TestStringArg", null, ["string"]); + this.QTS_GetDebugLogEnabled = this.module.cwrap("QTS_GetDebugLogEnabled", "number", ["number"]); + this.QTS_SetDebugLogEnabled = this.module.cwrap("QTS_SetDebugLogEnabled", null, ["number", "number"]); + this.QTS_BuildIsDebug = this.module.cwrap("QTS_BuildIsDebug", "number", []); + this.QTS_BuildIsAsyncify = this.module.cwrap("QTS_BuildIsAsyncify", "number", []); + this.QTS_NewFunction = this.module.cwrap("QTS_NewFunction", "number", ["number", "string", "number", "boolean", "number"]); + this.QTS_ArgvGetJSValueConstPointer = this.module.cwrap("QTS_ArgvGetJSValueConstPointer", "number", ["number", "number"]); + this.QTS_RuntimeEnableInterruptHandler = this.module.cwrap("QTS_RuntimeEnableInterruptHandler", null, ["number"]); + this.QTS_RuntimeDisableInterruptHandler = this.module.cwrap("QTS_RuntimeDisableInterruptHandler", null, ["number"]); + this.QTS_RuntimeEnableModuleLoader = this.module.cwrap("QTS_RuntimeEnableModuleLoader", null, ["number", "number"]); + this.QTS_RuntimeDisableModuleLoader = this.module.cwrap("QTS_RuntimeDisableModuleLoader", null, ["number"]); + this.QTS_bjson_encode = this.module.cwrap("QTS_bjson_encode", "number", ["number", "number"]); + this.QTS_bjson_decode = this.module.cwrap("QTS_bjson_decode", "number", ["number", "number"]); + } + }; + } +}); + +// registry/components/code/node_modules/@jitl/quickjs-wasmfile-release-sync/dist/emscripten-module.browser.mjs +var emscripten_module_browser_exports = {}; +__export(emscripten_module_browser_exports, { + default: () => emscripten_module_browser_default +}); +async function QuickJSRaw(moduleArg = {}) { + var moduleRtn; + var c = moduleArg, aa = !!globalThis.window, n = !!globalThis.WorkerGlobalScope; + function q(a) { + a = { log: a || function() { + } }; + for (const d of q.Pa) d(a); + return c.quickJSEmscriptenExtensions = a; + } + q.Pa = []; + c.quickjsEmscriptenInit = q; + q.Pa.push((a) => { + a.getWasmMemory = function() { + return r; + }; + }); + var t = "./this.program", ba = import.meta.url, u = "", v, w; + if (aa || n) { + try { + u = new URL(".", ba).href; + } catch { + } + n && (w = (a) => { + var d = new XMLHttpRequest(); + d.open("GET", a, false); + d.responseType = "arraybuffer"; + d.send(null); + return new Uint8Array(d.response); + }); + v = async (a) => { + a = await fetch(a, { credentials: "same-origin" }); + if (a.ok) return a.arrayBuffer(); + throw Error(a.status + " : " + a.url); + }; + } + var y = console.log.bind(console), z = console.error.bind(console), A, B = false, C, D, E, F, G, H, I, J = false; + function K() { + var a = r.buffer; + c.HEAP8 = F = new Int8Array(a); + new Int16Array(a); + c.HEAPU8 = G = new Uint8Array(a); + new Uint16Array(a); + H = new Int32Array(a); + I = new Uint32Array(a); + new Float32Array(a); + new Float64Array(a); + new BigInt64Array(a); + new BigUint64Array(a); + } + function L(a) { + c.onAbort?.(a); + a = "Aborted(" + a + ")"; + z(a); + B = true; + a = new WebAssembly.RuntimeError(a + ". Build with -sASSERTIONS for more info."); + E?.(a); + throw a; + } + var M; + async function ca(a) { + if (!A) try { + var d = await v(a); + return new Uint8Array(d); + } catch { + } + if (a == M && A) a = new Uint8Array(A); + else if (w) a = w(a); + else throw "both async and sync fetching of the wasm failed"; + return a; + } + async function da(a, d) { + try { + var b = await ca(a); + return await WebAssembly.instantiate(b, d); + } catch (e) { + z(`failed to asynchronously prepare wasm: ${e}`), L(e); + } + } + async function ea(a) { + var d = M; + if (!A) try { + var b = fetch(d, { credentials: "same-origin" }); + return await WebAssembly.instantiateStreaming(b, a); + } catch (e) { + z(`wasm streaming compile failed: ${e}`), z("falling back to ArrayBuffer instantiation"); + } + return da(d, a); + } + class N { + name = "ExitStatus"; + constructor(a) { + this.message = `Program terminated with exit(${a})`; + this.status = a; + } + } + var O = (a) => { + for (; 0 < a.length; ) a.shift()(c); + }, P = [], fa = [], ha = () => { + var a = c.preRun.shift(); + fa.push(a); + }, Q = true, r, ia = new TextDecoder(), ja = (a, d, b, e) => { + b = d + b; + if (e) return b; + for (; a[d] && !(d >= b); ) ++d; + return d; + }, R = (a, d, b) => a ? ia.decode(G.subarray(a, ja(G, a, d, b))) : "", S = 0, ka = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335], la = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334], T = {}, ma = (a) => { + if (!(a instanceof N || "unwind" == a)) throw a; + }, na = (a) => { + C = a; + Q || 0 < S || (c.onExit?.(a), B = true); + throw new N(a); + }, oa = (a) => { + if (!B) try { + a(); + } catch (d) { + ma(d); + } finally { + if (!(Q || 0 < S)) try { + C = a = C, na(a); + } catch (d) { + ma(d); + } + } + }, U = (a, d, b) => { + var e = G; + if (!(0 < b)) return 0; + var f = d; + b = d + b - 1; + for (var g = 0; g < a.length; ++g) { + var h = a.codePointAt(g); + if (127 >= h) { + if (d >= b) break; + e[d++] = h; + } else if (2047 >= h) { + if (d + 1 >= b) break; + e[d++] = 192 | h >> 6; + e[d++] = 128 | h & 63; + } else if (65535 >= h) { + if (d + 2 >= b) break; + e[d++] = 224 | h >> 12; + e[d++] = 128 | h >> 6 & 63; + e[d++] = 128 | h & 63; + } else { + if (d + 3 >= b) break; + e[d++] = 240 | h >> 18; + e[d++] = 128 | h >> 12 & 63; + e[d++] = 128 | h >> 6 & 63; + e[d++] = 128 | h & 63; + g++; + } + } + e[d] = 0; + return d - f; + }, V = {}, pa = () => { + if (!W) { + var a = { + USER: "web_user", + LOGNAME: "web_user", + PATH: "/", + PWD: "/", + HOME: "/home/web_user", + LANG: (globalThis.navigator?.language ?? "C").replace("-", "_") + ".UTF-8", + _: t || "./this.program" + }, d; + for (d in V) void 0 === V[d] ? delete a[d] : a[d] = V[d]; + var b = []; + for (d in a) b.push(`${d}=${a[d]}`); + W = b; + } + return W; + }, W, X = (a) => { + for (var d = 0, b = 0; b < a.length; ++b) { + var e = a.charCodeAt(b); + 127 >= e ? d++ : 2047 >= e ? d += 2 : 55296 <= e && 57343 >= e ? (d += 4, ++b) : d += 3; + } + return d; + }, qa = [null, [], []], ta = (a, d, b, e) => { + var f = { string: (k) => { + var l = 0; + if (null !== k && void 0 !== k && 0 !== k) { + l = X(k) + 1; + var p = Y(l); + U(k, p, l); + l = p; + } + return l; + }, array: (k) => { + var l = Y(k.length); + F.set(k, l); + return l; + } }; + a = c["_" + a]; + var g = [], h = 0; + if (e) for (var m = 0; m < e.length; m++) { + var x = f[b[m]]; + x ? (0 === h && (h = ra()), g[m] = x(e[m])) : g[m] = e[m]; + } + b = a(...g); + return b = function(k) { + 0 !== h && sa(h); + return "string" === d ? R(k) : "boolean" === d ? !!k : k; + }(b); + }; + c.wasmMemory ? r = c.wasmMemory : r = new WebAssembly.Memory({ initial: (c.INITIAL_MEMORY || 16777216) / 65536, maximum: 32768 }); + K(); + c.noExitRuntime && (Q = c.noExitRuntime); + c.print && (y = c.print); + c.printErr && (z = c.printErr); + c.wasmBinary && (A = c.wasmBinary); + c.thisProgram && (t = c.thisProgram); + if (c.preInit) for ("function" == typeof c.preInit && (c.preInit = [c.preInit]); 0 < c.preInit.length; ) c.preInit.shift()(); + c.cwrap = (a, d, b, e) => { + var f = !b || b.every((g) => "number" === g || "boolean" === g); + return "string" !== d && f && !e ? c["_" + a] : (...g) => ta(a, d, b, g); + }; + c.UTF8ToString = R; + c.stringToUTF8 = (a, d, b) => U(a, d, b); + c.lengthBytesUTF8 = X; + var ua, sa, Y, ra, va = { b: (a, d, b, e) => L(`Assertion failed: ${R(a)}, at: ` + [d ? R(d) : "unknown filename", b, e ? R(e) : "unknown function"]), q: () => L(""), l: () => { + Q = false; + S = 0; + }, m: function(a, d) { + a = -9007199254740992 > a || 9007199254740992 < a ? NaN : Number(a); + a = new Date(1e3 * a); + H[d >> 2] = a.getSeconds(); + H[d + 4 >> 2] = a.getMinutes(); + H[d + 8 >> 2] = a.getHours(); + H[d + 12 >> 2] = a.getDate(); + H[d + 16 >> 2] = a.getMonth(); + H[d + 20 >> 2] = a.getFullYear() - 1900; + H[d + 24 >> 2] = a.getDay(); + var b = a.getFullYear(); + H[d + 28 >> 2] = (0 !== b % 4 || 0 === b % 100 && 0 !== b % 400 ? la : ka)[a.getMonth()] + a.getDate() - 1 | 0; + H[d + 36 >> 2] = -(60 * a.getTimezoneOffset()); + b = new Date(a.getFullYear(), 6, 1).getTimezoneOffset(); + var e = new Date(a.getFullYear(), 0, 1).getTimezoneOffset(); + H[d + 32 >> 2] = (b != e && a.getTimezoneOffset() == Math.min(e, b)) | 0; + }, j: (a, d) => { + T[a] && (clearTimeout(T[a].id), delete T[a]); + if (!d) return 0; + var b = setTimeout(() => { + delete T[a]; + oa(() => ua(a, performance.now())); + }, d); + T[a] = { id: b, Qa: d }; + return 0; + }, n: (a, d, b, e) => { + var f = (/* @__PURE__ */ new Date()).getFullYear(), g = new Date(f, 0, 1).getTimezoneOffset(); + f = new Date(f, 6, 1).getTimezoneOffset(); + I[a >> 2] = 60 * Math.max(g, f); + H[d >> 2] = Number(g != f); + d = (h) => { + var m = Math.abs(h); + return `UTC${0 <= h ? "-" : "+"}${String(Math.floor(m / 60)).padStart(2, "0")}${String(m % 60).padStart(2, "0")}`; + }; + a = d(g); + d = d(f); + f < g ? (U(a, b, 17), U(d, e, 17)) : (U(a, e, 17), U(d, b, 17)); + }, p: () => Date.now(), k: (a) => { + var d = G.length; + a >>>= 0; + if (2147483648 < a) return false; + for (var b = 1; 4 >= b; b *= 2) { + var e = d * (1 + 0.2 / b); + e = Math.min(e, a + 100663296); + a: { + e = (Math.min(2147483648, 65536 * Math.ceil(Math.max(a, e) / 65536)) - r.buffer.byteLength + 65535) / 65536 | 0; + try { + r.grow(e); + K(); + var f = 1; + break a; + } catch (g) { + } + f = void 0; + } + if (f) return true; + } + return false; + }, e: (a, d) => { + var b = 0, e = 0, f; + for (f of pa()) { + var g = d + b; + I[a + e >> 2] = g; + b += U(f, g, Infinity) + 1; + e += 4; + } + return 0; + }, f: (a, d) => { + var b = pa(); + I[a >> 2] = b.length; + a = 0; + for (var e of b) a += X(e) + 1; + I[d >> 2] = a; + return 0; + }, d: () => 52, o: function() { + return 70; + }, c: (a, d, b, e) => { + for (var f = 0, g = 0; g < b; g++) { + var h = I[d >> 2], m = I[d + 4 >> 2]; + d += 8; + for (var x = 0; x < m; x++) { + var k = a, l = G[h + x], p = qa[k]; + 0 === l || 10 === l ? (k = 1 === k ? y : z, l = ja(p, 0), l = ia.decode(p.buffer ? p.subarray(0, l) : new Uint8Array(p.slice(0, l))), k(l), p.length = 0) : p.push(l); + } + f += m; + } + I[e >> 2] = f; + return 0; + }, a: r, r: na, s: function(a, d, b, e, f) { + return c.callbacks.callFunction(void 0, a, d, b, e, f); + }, i: function(a) { + return c.callbacks.shouldInterrupt(void 0, a); + }, h: function(a, d, b) { + b = R(b); + return c.callbacks.loadModuleSource(void 0, a, d, b); + }, g: function(a, d, b, e) { + b = R(b); + e = R(e); + return c.callbacks.normalizeModule(void 0, a, d, b, e); + }, t: function(a, d) { + c.callbacks.freeHostRef(void 0, a, d); + } }, Z; + Z = await async function() { + function a(b) { + b = Z = b.exports; + c._malloc = b.v; + c._QTS_Throw = b.w; + c._QTS_NewError = b.x; + c._QTS_RuntimeSetMemoryLimit = b.y; + c._QTS_RuntimeComputeMemoryUsage = b.z; + c._QTS_RuntimeDumpMemoryUsage = b.A; + c._QTS_RecoverableLeakCheck = b.B; + c._QTS_BuildIsSanitizeLeak = b.C; + c._QTS_RuntimeSetMaxStackSize = b.D; + c._QTS_GetUndefined = b.E; + c._QTS_GetNull = b.F; + c._QTS_GetFalse = b.G; + c._QTS_GetTrue = b.H; + c._QTS_NewHostRef = b.I; + c._QTS_GetHostRefId = b.J; + c._QTS_NewRuntime = b.K; + c._QTS_FreeRuntime = b.L; + c._free = b.M; + c._QTS_NewContext = b.N; + c._QTS_FreeContext = b.O; + c._QTS_FreeValuePointer = b.P; + c._QTS_FreeValuePointerRuntime = b.Q; + c._QTS_FreeVoidPointer = b.R; + c._QTS_FreeCString = b.S; + c._QTS_DupValuePointer = b.T; + c._QTS_NewObject = b.U; + c._QTS_NewObjectProto = b.V; + c._QTS_NewArray = b.W; + c._QTS_NewArrayBuffer = b.X; + c._QTS_NewFloat64 = b.Y; + c._QTS_GetFloat64 = b.Z; + c._QTS_NewString = b._; + c._QTS_GetString = b.$; + c._QTS_GetArrayBuffer = b.aa; + c._QTS_GetArrayBufferLength = b.ba; + c._QTS_NewSymbol = b.ca; + c._QTS_GetSymbolDescriptionOrKey = b.da; + c._QTS_IsGlobalSymbol = b.ea; + c._QTS_IsJobPending = b.fa; + c._QTS_ExecutePendingJob = b.ga; + c._QTS_GetProp = b.ha; + c._QTS_GetPropNumber = b.ia; + c._QTS_SetProp = b.ja; + c._QTS_DefineProp = b.ka; + c._QTS_GetOwnPropertyNames = b.la; + c._QTS_Call = b.ma; + c._QTS_ResolveException = b.na; + c._QTS_Dump = b.oa; + c._QTS_Eval = b.pa; + c._QTS_GetModuleNamespace = b.qa; + c._QTS_Typeof = b.ra; + c._QTS_GetLength = b.sa; + c._QTS_IsEqual = b.ta; + c._QTS_GetGlobalObject = b.ua; + c._QTS_NewPromiseCapability = b.va; + c._QTS_PromiseState = b.wa; + c._QTS_PromiseResult = b.xa; + c._QTS_TestStringArg = b.ya; + c._QTS_GetDebugLogEnabled = b.za; + c._QTS_SetDebugLogEnabled = b.Aa; + c._QTS_BuildIsDebug = b.Ba; + c._QTS_BuildIsAsyncify = b.Ca; + c._QTS_NewFunction = b.Da; + c._QTS_ArgvGetJSValueConstPointer = b.Ea; + c._QTS_RuntimeEnableInterruptHandler = b.Fa; + c._QTS_RuntimeDisableInterruptHandler = b.Ga; + c._QTS_RuntimeEnableModuleLoader = b.Ha; + c._QTS_RuntimeDisableModuleLoader = b.Ia; + c._QTS_bjson_encode = b.Ja; + c._QTS_bjson_decode = b.Ka; + ua = b.La; + sa = b.Ma; + Y = b.Na; + ra = b.Oa; + return Z; + } + var d = { a: va }; + if (c.instantiateWasm) return new Promise((b) => { + c.instantiateWasm(d, (e, f) => { + b(a(e, f)); + }); + }); + M ??= c.locateFile ? c.locateFile ? c.locateFile("emscripten-module.wasm", u) : u + "emscripten-module.wasm" : new URL("emscripten-module.wasm", import.meta.url).href; + return a((await ea(d)).instance); + }(); + (function() { + function a() { + c.calledRun = true; + if (!B) { + J = true; + Z.u(); + D?.(c); + c.onRuntimeInitialized?.(); + if (c.postRun) for ("function" == typeof c.postRun && (c.postRun = [c.postRun]); c.postRun.length; ) { + var d = c.postRun.shift(); + P.push(d); + } + O(P); + } + } + if (c.preRun) for ("function" == typeof c.preRun && (c.preRun = [c.preRun]); c.preRun.length; ) ha(); + O(fa); + c.setStatus ? (c.setStatus("Running..."), setTimeout(() => { + setTimeout(() => c.setStatus(""), 1); + a(); + }, 1)) : a(); + })(); + J ? moduleRtn = c : moduleRtn = new Promise((a, d) => { + D = a; + E = d; + }); + ; + return moduleRtn; +} +var emscripten_module_browser_default; +var init_emscripten_module_browser = __esm({ + "registry/components/code/node_modules/@jitl/quickjs-wasmfile-release-sync/dist/emscripten-module.browser.mjs"() { + emscripten_module_browser_default = QuickJSRaw; + } +}); + +// registry/components/code/node_modules/hono/dist/compose.js +var compose = (middleware, onError, onNotFound) => { + return (context, next) => { + let index = -1; + return dispatch(0); + async function dispatch(i) { + if (i <= index) { + throw new Error("next() called multiple times"); + } + index = i; + let res; + let isError = false; + let handler; + if (middleware[i]) { + handler = middleware[i][0][0]; + context.req.routeIndex = i; + } else { + handler = i === middleware.length && next || void 0; + } + if (handler) { + try { + res = await handler(context, () => dispatch(i + 1)); + } catch (err2) { + if (err2 instanceof Error && onError) { + context.error = err2; + res = await onError(err2, context); + isError = true; + } else { + throw err2; + } + } + } else { + if (context.finalized === false && onNotFound) { + res = await onNotFound(context); + } + } + if (res && (context.finalized === false || isError)) { + context.res = res; + } + return context; + } + }; +}; + +// registry/components/code/node_modules/hono/dist/request/constants.js +var GET_MATCH_RESULT = /* @__PURE__ */ Symbol(); + +// registry/components/code/node_modules/hono/dist/utils/body.js +var parseBody = async (request, options = /* @__PURE__ */ Object.create(null)) => { + const { all = false, dot = false } = options; + const headers = request instanceof HonoRequest ? request.raw.headers : request.headers; + const contentType = headers.get("Content-Type"); + if (contentType?.startsWith("multipart/form-data") || contentType?.startsWith("application/x-www-form-urlencoded")) { + return parseFormData(request, { all, dot }); + } + return {}; +}; +async function parseFormData(request, options) { + const formData = await request.formData(); + if (formData) { + return convertFormDataToBodyData(formData, options); + } + return {}; +} +function convertFormDataToBodyData(formData, options) { + const form = /* @__PURE__ */ Object.create(null); + formData.forEach((value, key) => { + const shouldParseAllValues = options.all || key.endsWith("[]"); + if (!shouldParseAllValues) { + form[key] = value; + } else { + handleParsingAllValues(form, key, value); + } + }); + if (options.dot) { + Object.entries(form).forEach(([key, value]) => { + const shouldParseDotValues = key.includes("."); + if (shouldParseDotValues) { + handleParsingNestedValues(form, key, value); + delete form[key]; + } + }); + } + return form; +} +var handleParsingAllValues = (form, key, value) => { + if (form[key] !== void 0) { + if (Array.isArray(form[key])) { + ; + form[key].push(value); + } else { + form[key] = [form[key], value]; + } + } else { + if (!key.endsWith("[]")) { + form[key] = value; + } else { + form[key] = [value]; + } + } +}; +var handleParsingNestedValues = (form, key, value) => { + if (/(?:^|\.)__proto__\./.test(key)) { + return; + } + let nestedForm = form; + const keys = key.split("."); + keys.forEach((key2, index) => { + if (index === keys.length - 1) { + nestedForm[key2] = value; + } else { + if (!nestedForm[key2] || typeof nestedForm[key2] !== "object" || Array.isArray(nestedForm[key2]) || nestedForm[key2] instanceof File) { + nestedForm[key2] = /* @__PURE__ */ Object.create(null); + } + nestedForm = nestedForm[key2]; + } + }); +}; + +// registry/components/code/node_modules/hono/dist/utils/url.js +var splitPath = (path) => { + const paths = path.split("/"); + if (paths[0] === "") { + paths.shift(); + } + return paths; +}; +var splitRoutingPath = (routePath) => { + const { groups, path } = extractGroupsFromPath(routePath); + const paths = splitPath(path); + return replaceGroupMarks(paths, groups); +}; +var extractGroupsFromPath = (path) => { + const groups = []; + path = path.replace(/\{[^}]+\}/g, (match2, index) => { + const mark = `@${index}`; + groups.push([mark, match2]); + return mark; + }); + return { groups, path }; +}; +var replaceGroupMarks = (paths, groups) => { + for (let i = groups.length - 1; i >= 0; i--) { + const [mark] = groups[i]; + for (let j = paths.length - 1; j >= 0; j--) { + if (paths[j].includes(mark)) { + paths[j] = paths[j].replace(mark, groups[i][1]); + break; + } + } + } + return paths; +}; +var patternCache = {}; +var getPattern = (label, next) => { + if (label === "*") { + return "*"; + } + const match2 = label.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/); + if (match2) { + const cacheKey = `${label}#${next}`; + if (!patternCache[cacheKey]) { + if (match2[2]) { + patternCache[cacheKey] = next && next[0] !== ":" && next[0] !== "*" ? [cacheKey, match2[1], new RegExp(`^${match2[2]}(?=/${next})`)] : [label, match2[1], new RegExp(`^${match2[2]}$`)]; + } else { + patternCache[cacheKey] = [label, match2[1], true]; + } + } + return patternCache[cacheKey]; + } + return null; +}; +var tryDecode = (str, decoder) => { + try { + return decoder(str); + } catch { + return str.replace(/(?:%[0-9A-Fa-f]{2})+/g, (match2) => { + try { + return decoder(match2); + } catch { + return match2; + } + }); + } +}; +var tryDecodeURI = (str) => tryDecode(str, decodeURI); +var getPath = (request) => { + const url = request.url; + const start = url.indexOf("/", url.indexOf(":") + 4); + let i = start; + for (; i < url.length; i++) { + const charCode = url.charCodeAt(i); + if (charCode === 37) { + const queryIndex = url.indexOf("?", i); + const hashIndex = url.indexOf("#", i); + const end = queryIndex === -1 ? hashIndex === -1 ? void 0 : hashIndex : hashIndex === -1 ? queryIndex : Math.min(queryIndex, hashIndex); + const path = url.slice(start, end); + return tryDecodeURI(path.includes("%25") ? path.replace(/%25/g, "%2525") : path); + } else if (charCode === 63 || charCode === 35) { + break; + } + } + return url.slice(start, i); +}; +var getPathNoStrict = (request) => { + const result = getPath(request); + return result.length > 1 && result.at(-1) === "/" ? result.slice(0, -1) : result; +}; +var mergePath = (base, sub, ...rest) => { + if (rest.length) { + sub = mergePath(sub, ...rest); + } + return `${base?.[0] === "/" ? "" : "/"}${base}${sub === "/" ? "" : `${base?.at(-1) === "/" ? "" : "/"}${sub?.[0] === "/" ? sub.slice(1) : sub}`}`; +}; +var checkOptionalParameter = (path) => { + if (path.charCodeAt(path.length - 1) !== 63 || !path.includes(":")) { + return null; + } + const segments = path.split("/"); + const results = []; + let basePath = ""; + segments.forEach((segment) => { + if (segment !== "" && !/\:/.test(segment)) { + basePath += "/" + segment; + } else if (/\:/.test(segment)) { + if (/\?/.test(segment)) { + if (results.length === 0 && basePath === "") { + results.push("/"); + } else { + results.push(basePath); + } + const optionalSegment = segment.replace("?", ""); + basePath += "/" + optionalSegment; + results.push(basePath); + } else { + basePath += "/" + segment; + } + } + }); + return results.filter((v, i, a) => a.indexOf(v) === i); +}; +var _decodeURI = (value) => { + if (!/[%+]/.test(value)) { + return value; + } + if (value.indexOf("+") !== -1) { + value = value.replace(/\+/g, " "); + } + return value.indexOf("%") !== -1 ? tryDecode(value, decodeURIComponent_) : value; +}; +var _getQueryParam = (url, key, multiple) => { + let encoded; + if (!multiple && key && !/[%+]/.test(key)) { + let keyIndex2 = url.indexOf("?", 8); + if (keyIndex2 === -1) { + return void 0; + } + if (!url.startsWith(key, keyIndex2 + 1)) { + keyIndex2 = url.indexOf(`&${key}`, keyIndex2 + 1); + } + while (keyIndex2 !== -1) { + const trailingKeyCode = url.charCodeAt(keyIndex2 + key.length + 1); + if (trailingKeyCode === 61) { + const valueIndex = keyIndex2 + key.length + 2; + const endIndex = url.indexOf("&", valueIndex); + return _decodeURI(url.slice(valueIndex, endIndex === -1 ? void 0 : endIndex)); + } else if (trailingKeyCode == 38 || isNaN(trailingKeyCode)) { + return ""; + } + keyIndex2 = url.indexOf(`&${key}`, keyIndex2 + 1); + } + encoded = /[%+]/.test(url); + if (!encoded) { + return void 0; + } + } + const results = {}; + encoded ??= /[%+]/.test(url); + let keyIndex = url.indexOf("?", 8); + while (keyIndex !== -1) { + const nextKeyIndex = url.indexOf("&", keyIndex + 1); + let valueIndex = url.indexOf("=", keyIndex); + if (valueIndex > nextKeyIndex && nextKeyIndex !== -1) { + valueIndex = -1; + } + let name = url.slice( + keyIndex + 1, + valueIndex === -1 ? nextKeyIndex === -1 ? void 0 : nextKeyIndex : valueIndex + ); + if (encoded) { + name = _decodeURI(name); + } + keyIndex = nextKeyIndex; + if (name === "") { + continue; + } + let value; + if (valueIndex === -1) { + value = ""; + } else { + value = url.slice(valueIndex + 1, nextKeyIndex === -1 ? void 0 : nextKeyIndex); + if (encoded) { + value = _decodeURI(value); + } + } + if (multiple) { + if (!(results[name] && Array.isArray(results[name]))) { + results[name] = []; + } + ; + results[name].push(value); + } else { + results[name] ??= value; + } + } + return key ? results[key] : results; +}; +var getQueryParam = _getQueryParam; +var getQueryParams = (url, key) => { + return _getQueryParam(url, key, true); +}; +var decodeURIComponent_ = decodeURIComponent; + +// registry/components/code/node_modules/hono/dist/request.js +var tryDecodeURIComponent = (str) => tryDecode(str, decodeURIComponent_); +var HonoRequest = class { + /** + * `.raw` can get the raw Request object. + * + * @see {@link https://hono.dev/docs/api/request#raw} + * + * @example + * ```ts + * // For Cloudflare Workers + * app.post('/', async (c) => { + * const metadata = c.req.raw.cf?.hostMetadata? + * ... + * }) + * ``` + */ + raw; + #validatedData; + // Short name of validatedData + #matchResult; + routeIndex = 0; + /** + * `.path` can get the pathname of the request. + * + * @see {@link https://hono.dev/docs/api/request#path} + * + * @example + * ```ts + * app.get('/about/me', (c) => { + * const pathname = c.req.path // `/about/me` + * }) + * ``` + */ + path; + bodyCache = {}; + constructor(request, path = "/", matchResult = [[]]) { + this.raw = request; + this.path = path; + this.#matchResult = matchResult; + this.#validatedData = {}; + } + param(key) { + return key ? this.#getDecodedParam(key) : this.#getAllDecodedParams(); + } + #getDecodedParam(key) { + const paramKey = this.#matchResult[0][this.routeIndex][1][key]; + const param = this.#getParamValue(paramKey); + return param && /\%/.test(param) ? tryDecodeURIComponent(param) : param; + } + #getAllDecodedParams() { + const decoded = {}; + const keys = Object.keys(this.#matchResult[0][this.routeIndex][1]); + for (const key of keys) { + const value = this.#getParamValue(this.#matchResult[0][this.routeIndex][1][key]); + if (value !== void 0) { + decoded[key] = /\%/.test(value) ? tryDecodeURIComponent(value) : value; + } + } + return decoded; + } + #getParamValue(paramKey) { + return this.#matchResult[1] ? this.#matchResult[1][paramKey] : paramKey; + } + query(key) { + return getQueryParam(this.url, key); + } + queries(key) { + return getQueryParams(this.url, key); + } + header(name) { + if (name) { + return this.raw.headers.get(name) ?? void 0; + } + const headerData = {}; + this.raw.headers.forEach((value, key) => { + headerData[key] = value; + }); + return headerData; + } + async parseBody(options) { + return parseBody(this, options); + } + #cachedBody = (key) => { + const { bodyCache, raw: raw2 } = this; + const cachedBody = bodyCache[key]; + if (cachedBody) { + return cachedBody; + } + const anyCachedKey = Object.keys(bodyCache)[0]; + if (anyCachedKey) { + return bodyCache[anyCachedKey].then((body) => { + if (anyCachedKey === "json") { + body = JSON.stringify(body); + } + return new Response(body)[key](); + }); + } + return bodyCache[key] = raw2[key](); + }; + /** + * `.json()` can parse Request body of type `application/json` + * + * @see {@link https://hono.dev/docs/api/request#json} + * + * @example + * ```ts + * app.post('/entry', async (c) => { + * const body = await c.req.json() + * }) + * ``` + */ + json() { + return this.#cachedBody("text").then((text) => JSON.parse(text)); + } + /** + * `.text()` can parse Request body of type `text/plain` + * + * @see {@link https://hono.dev/docs/api/request#text} + * + * @example + * ```ts + * app.post('/entry', async (c) => { + * const body = await c.req.text() + * }) + * ``` + */ + text() { + return this.#cachedBody("text"); + } + /** + * `.arrayBuffer()` parse Request body as an `ArrayBuffer` + * + * @see {@link https://hono.dev/docs/api/request#arraybuffer} + * + * @example + * ```ts + * app.post('/entry', async (c) => { + * const body = await c.req.arrayBuffer() + * }) + * ``` + */ + arrayBuffer() { + return this.#cachedBody("arrayBuffer"); + } + /** + * `.bytes()` parses the request body as a `Uint8Array`. + * + * @see {@link https://hono.dev/docs/api/request#bytes} + * + * @example + * ```ts + * app.post('/entry', async (c) => { + * const body = await c.req.bytes() + * }) + * ``` + */ + bytes() { + return this.#cachedBody("arrayBuffer").then((buffer) => new Uint8Array(buffer)); + } + /** + * Parses the request body as a `Blob`. + * @example + * ```ts + * app.post('/entry', async (c) => { + * const body = await c.req.blob(); + * }); + * ``` + * @see https://hono.dev/docs/api/request#blob + */ + blob() { + return this.#cachedBody("blob"); + } + /** + * Parses the request body as `FormData`. + * @example + * ```ts + * app.post('/entry', async (c) => { + * const body = await c.req.formData(); + * }); + * ``` + * @see https://hono.dev/docs/api/request#formdata + */ + formData() { + return this.#cachedBody("formData"); + } + /** + * Adds validated data to the request. + * + * @param target - The target of the validation. + * @param data - The validated data to add. + */ + addValidatedData(target, data) { + this.#validatedData[target] = data; + } + valid(target) { + return this.#validatedData[target]; + } + /** + * `.url()` can get the request url strings. + * + * @see {@link https://hono.dev/docs/api/request#url} + * + * @example + * ```ts + * app.get('/about/me', (c) => { + * const url = c.req.url // `http://localhost:8787/about/me` + * ... + * }) + * ``` + */ + get url() { + return this.raw.url; + } + /** + * `.method()` can get the method name of the request. + * + * @see {@link https://hono.dev/docs/api/request#method} + * + * @example + * ```ts + * app.get('/about/me', (c) => { + * const method = c.req.method // `GET` + * }) + * ``` + */ + get method() { + return this.raw.method; + } + get [GET_MATCH_RESULT]() { + return this.#matchResult; + } + /** + * `.matchedRoutes()` can return a matched route in the handler + * + * @deprecated + * + * Use matchedRoutes helper defined in "hono/route" instead. + * + * @see {@link https://hono.dev/docs/api/request#matchedroutes} + * + * @example + * ```ts + * app.use('*', async function logger(c, next) { + * await next() + * c.req.matchedRoutes.forEach(({ handler, method, path }, i) => { + * const name = handler.name || (handler.length < 2 ? '[handler]' : '[middleware]') + * console.log( + * method, + * ' ', + * path, + * ' '.repeat(Math.max(10 - path.length, 0)), + * name, + * i === c.req.routeIndex ? '<- respond from here' : '' + * ) + * }) + * }) + * ``` + */ + get matchedRoutes() { + return this.#matchResult[0].map(([[, route]]) => route); + } + /** + * `routePath()` can retrieve the path registered within the handler + * + * @deprecated + * + * Use routePath helper defined in "hono/route" instead. + * + * @see {@link https://hono.dev/docs/api/request#routepath} + * + * @example + * ```ts + * app.get('/posts/:id', (c) => { + * return c.json({ path: c.req.routePath }) + * }) + * ``` + */ + get routePath() { + return this.#matchResult[0].map(([[, route]]) => route)[this.routeIndex].path; + } +}; + +// registry/components/code/node_modules/hono/dist/utils/html.js +var HtmlEscapedCallbackPhase = { + Stringify: 1, + BeforeStream: 2, + Stream: 3 +}; +var raw = (value, callbacks) => { + const escapedString = new String(value); + escapedString.isEscaped = true; + escapedString.callbacks = callbacks; + return escapedString; +}; +var resolveCallback = async (str, phase, preserveCallbacks, context, buffer) => { + if (typeof str === "object" && !(str instanceof String)) { + if (!(str instanceof Promise)) { + str = str.toString(); + } + if (str instanceof Promise) { + str = await str; + } + } + const callbacks = str.callbacks; + if (!callbacks?.length) { + return Promise.resolve(str); + } + if (buffer) { + buffer[0] += str; + } else { + buffer = [str]; + } + const resStr = Promise.all(callbacks.map((c) => c({ phase, buffer, context }))).then( + (res) => Promise.all( + res.filter(Boolean).map((str2) => resolveCallback(str2, phase, false, context, buffer)) + ).then(() => buffer[0]) + ); + if (preserveCallbacks) { + return raw(await resStr, callbacks); + } else { + return resStr; + } +}; + +// registry/components/code/node_modules/hono/dist/context.js +var TEXT_PLAIN = "text/plain; charset=UTF-8"; +var setDefaultContentType = (contentType, headers) => { + return { + "Content-Type": contentType, + ...headers + }; +}; +var createResponseInstance = (body, init) => new Response(body, init); +var Context = class { + #rawRequest; + #req; + /** + * `.env` can get bindings (environment variables, secrets, KV namespaces, D1 database, R2 bucket etc.) in Cloudflare Workers. + * + * @see {@link https://hono.dev/docs/api/context#env} + * + * @example + * ```ts + * // Environment object for Cloudflare Workers + * app.get('*', async c => { + * const counter = c.env.COUNTER + * }) + * ``` + */ + env = {}; + #var; + finalized = false; + /** + * `.error` can get the error object from the middleware if the Handler throws an error. + * + * @see {@link https://hono.dev/docs/api/context#error} + * + * @example + * ```ts + * app.use('*', async (c, next) => { + * await next() + * if (c.error) { + * // do something... + * } + * }) + * ``` + */ + error; + #status; + #executionCtx; + #res; + #layout; + #renderer; + #notFoundHandler; + #preparedHeaders; + #matchResult; + #path; + /** + * Creates an instance of the Context class. + * + * @param req - The Request object. + * @param options - Optional configuration options for the context. + */ + constructor(req, options) { + this.#rawRequest = req; + if (options) { + this.#executionCtx = options.executionCtx; + this.env = options.env; + this.#notFoundHandler = options.notFoundHandler; + this.#path = options.path; + this.#matchResult = options.matchResult; + } + } + /** + * `.req` is the instance of {@link HonoRequest}. + */ + get req() { + this.#req ??= new HonoRequest(this.#rawRequest, this.#path, this.#matchResult); + return this.#req; + } + /** + * @see {@link https://hono.dev/docs/api/context#event} + * The FetchEvent associated with the current request. + * + * @throws Will throw an error if the context does not have a FetchEvent. + */ + get event() { + if (this.#executionCtx && "respondWith" in this.#executionCtx) { + return this.#executionCtx; + } else { + throw Error("This context has no FetchEvent"); + } + } + /** + * @see {@link https://hono.dev/docs/api/context#executionctx} + * The ExecutionContext associated with the current request. + * + * @throws Will throw an error if the context does not have an ExecutionContext. + */ + get executionCtx() { + if (this.#executionCtx) { + return this.#executionCtx; + } else { + throw Error("This context has no ExecutionContext"); + } + } + /** + * @see {@link https://hono.dev/docs/api/context#res} + * The Response object for the current request. + */ + get res() { + return this.#res ||= createResponseInstance(null, { + headers: this.#preparedHeaders ??= new Headers() + }); + } + /** + * Sets the Response object for the current request. + * + * @param _res - The Response object to set. + */ + set res(_res) { + if (this.#res && _res) { + _res = createResponseInstance(_res.body, _res); + for (const [k, v] of this.#res.headers.entries()) { + if (k === "content-type") { + continue; + } + if (k === "set-cookie") { + const cookies = this.#res.headers.getSetCookie(); + _res.headers.delete("set-cookie"); + for (const cookie of cookies) { + _res.headers.append("set-cookie", cookie); + } + } else { + _res.headers.set(k, v); + } + } + } + this.#res = _res; + this.finalized = true; + } + /** + * `.render()` can create a response within a layout. + * + * @see {@link https://hono.dev/docs/api/context#render-setrenderer} + * + * @example + * ```ts + * app.get('/', (c) => { + * return c.render('Hello!') + * }) + * ``` + */ + render = (...args) => { + this.#renderer ??= (content) => this.html(content); + return this.#renderer(...args); + }; + /** + * Sets the layout for the response. + * + * @param layout - The layout to set. + * @returns The layout function. + */ + setLayout = (layout) => this.#layout = layout; + /** + * Gets the current layout for the response. + * + * @returns The current layout function. + */ + getLayout = () => this.#layout; + /** + * `.setRenderer()` can set the layout in the custom middleware. + * + * @see {@link https://hono.dev/docs/api/context#render-setrenderer} + * + * @example + * ```tsx + * app.use('*', async (c, next) => { + * c.setRenderer((content) => { + * return c.html( + * + * + *

{content}

+ * + * + * ) + * }) + * await next() + * }) + * ``` + */ + setRenderer = (renderer) => { + this.#renderer = renderer; + }; + /** + * `.header()` can set headers. + * + * @see {@link https://hono.dev/docs/api/context#header} + * + * @example + * ```ts + * app.get('/welcome', (c) => { + * // Set headers + * c.header('X-Message', 'Hello!') + * c.header('Content-Type', 'text/plain') + * + * return c.body('Thank you for coming') + * }) + * ``` + */ + header = (name, value, options) => { + if (this.finalized) { + this.#res = createResponseInstance(this.#res.body, this.#res); + } + const headers = this.#res ? this.#res.headers : this.#preparedHeaders ??= new Headers(); + if (value === void 0) { + headers.delete(name); + } else if (options?.append) { + headers.append(name, value); + } else { + headers.set(name, value); + } + }; + status = (status) => { + this.#status = status; + }; + /** + * `.set()` can set the value specified by the key. + * + * @see {@link https://hono.dev/docs/api/context#set-get} + * + * @example + * ```ts + * app.use('*', async (c, next) => { + * c.set('message', 'Hono is hot!!') + * await next() + * }) + * ``` + */ + set = (key, value) => { + this.#var ??= /* @__PURE__ */ new Map(); + this.#var.set(key, value); + }; + /** + * `.get()` can use the value specified by the key. + * + * @see {@link https://hono.dev/docs/api/context#set-get} + * + * @example + * ```ts + * app.get('/', (c) => { + * const message = c.get('message') + * return c.text(`The message is "${message}"`) + * }) + * ``` + */ + get = (key) => { + return this.#var ? this.#var.get(key) : void 0; + }; + /** + * `.var` can access the value of a variable. + * + * @see {@link https://hono.dev/docs/api/context#var} + * + * @example + * ```ts + * const result = c.var.client.oneMethod() + * ``` + */ + // c.var.propName is a read-only + get var() { + if (!this.#var) { + return {}; + } + return Object.fromEntries(this.#var); + } + #newResponse(data, arg, headers) { + const responseHeaders = this.#res ? new Headers(this.#res.headers) : this.#preparedHeaders ?? new Headers(); + if (typeof arg === "object" && "headers" in arg) { + const argHeaders = arg.headers instanceof Headers ? arg.headers : new Headers(arg.headers); + for (const [key, value] of argHeaders) { + if (key.toLowerCase() === "set-cookie") { + responseHeaders.append(key, value); + } else { + responseHeaders.set(key, value); + } + } + } + if (headers) { + for (const [k, v] of Object.entries(headers)) { + if (typeof v === "string") { + responseHeaders.set(k, v); + } else { + responseHeaders.delete(k); + for (const v2 of v) { + responseHeaders.append(k, v2); + } + } + } + } + const status = typeof arg === "number" ? arg : arg?.status ?? this.#status; + return createResponseInstance(data, { status, headers: responseHeaders }); + } + newResponse = (...args) => this.#newResponse(...args); + /** + * `.body()` can return the HTTP response. + * You can set headers with `.header()` and set HTTP status code with `.status`. + * This can also be set in `.text()`, `.json()` and so on. + * + * @see {@link https://hono.dev/docs/api/context#body} + * + * @example + * ```ts + * app.get('/welcome', (c) => { + * // Set headers + * c.header('X-Message', 'Hello!') + * c.header('Content-Type', 'text/plain') + * // Set HTTP status code + * c.status(201) + * + * // Return the response body + * return c.body('Thank you for coming') + * }) + * ``` + */ + body = (data, arg, headers) => this.#newResponse(data, arg, headers); + /** + * `.text()` can render text as `Content-Type:text/plain`. + * + * @see {@link https://hono.dev/docs/api/context#text} + * + * @example + * ```ts + * app.get('/say', (c) => { + * return c.text('Hello!') + * }) + * ``` + */ + text = (text, arg, headers) => { + return !this.#preparedHeaders && !this.#status && !arg && !headers && !this.finalized ? new Response(text) : this.#newResponse( + text, + arg, + setDefaultContentType(TEXT_PLAIN, headers) + ); + }; + /** + * `.json()` can render JSON as `Content-Type:application/json`. + * + * @see {@link https://hono.dev/docs/api/context#json} + * + * @example + * ```ts + * app.get('/api', (c) => { + * return c.json({ message: 'Hello!' }) + * }) + * ``` + */ + json = (object, arg, headers) => { + return this.#newResponse( + JSON.stringify(object), + arg, + setDefaultContentType("application/json", headers) + ); + }; + html = (html, arg, headers) => { + const res = (html2) => this.#newResponse(html2, arg, setDefaultContentType("text/html; charset=UTF-8", headers)); + return typeof html === "object" ? resolveCallback(html, HtmlEscapedCallbackPhase.Stringify, false, {}).then(res) : res(html); + }; + /** + * `.redirect()` can Redirect, default status code is 302. + * + * @see {@link https://hono.dev/docs/api/context#redirect} + * + * @example + * ```ts + * app.get('/redirect', (c) => { + * return c.redirect('/') + * }) + * app.get('/redirect-permanently', (c) => { + * return c.redirect('/', 301) + * }) + * ``` + */ + redirect = (location, status) => { + const locationString = String(location); + this.header( + "Location", + // Multibyes should be encoded + // eslint-disable-next-line no-control-regex + !/[^\x00-\xFF]/.test(locationString) ? locationString : encodeURI(locationString) + ); + return this.newResponse(null, status ?? 302); + }; + /** + * `.notFound()` can return the Not Found Response. + * + * @see {@link https://hono.dev/docs/api/context#notfound} + * + * @example + * ```ts + * app.get('/notfound', (c) => { + * return c.notFound() + * }) + * ``` + */ + notFound = () => { + this.#notFoundHandler ??= () => createResponseInstance(); + return this.#notFoundHandler(this); + }; +}; + +// registry/components/code/node_modules/hono/dist/router.js +var METHOD_NAME_ALL = "ALL"; +var METHOD_NAME_ALL_LOWERCASE = "all"; +var METHODS = ["get", "post", "put", "delete", "options", "patch"]; +var MESSAGE_MATCHER_IS_ALREADY_BUILT = "Can not add a route since the matcher is already built."; +var UnsupportedPathError = class extends Error { +}; + +// registry/components/code/node_modules/hono/dist/utils/constants.js +var COMPOSED_HANDLER = "__COMPOSED_HANDLER"; + +// registry/components/code/node_modules/hono/dist/hono-base.js +var notFoundHandler = (c) => { + return c.text("404 Not Found", 404); +}; +var errorHandler = (err2, c) => { + if ("getResponse" in err2) { + const res = err2.getResponse(); + return c.newResponse(res.body, res); + } + console.error(err2); + return c.text("Internal Server Error", 500); +}; +var Hono = class _Hono { + get; + post; + put; + delete; + options; + patch; + all; + on; + use; + /* + This class is like an abstract class and does not have a router. + To use it, inherit the class and implement router in the constructor. + */ + router; + getPath; + // Cannot use `#` because it requires visibility at JavaScript runtime. + _basePath = "/"; + #path = "/"; + routes = []; + constructor(options = {}) { + const allMethods = [...METHODS, METHOD_NAME_ALL_LOWERCASE]; + allMethods.forEach((method) => { + this[method] = (args1, ...args) => { + if (typeof args1 === "string") { + this.#path = args1; + } else { + this.#addRoute(method, this.#path, args1); + } + args.forEach((handler) => { + this.#addRoute(method, this.#path, handler); + }); + return this; + }; + }); + this.on = (method, path, ...handlers) => { + for (const p of [path].flat()) { + this.#path = p; + for (const m of [method].flat()) { + handlers.map((handler) => { + this.#addRoute(m.toUpperCase(), this.#path, handler); + }); + } + } + return this; + }; + this.use = (arg1, ...handlers) => { + if (typeof arg1 === "string") { + this.#path = arg1; + } else { + this.#path = "*"; + handlers.unshift(arg1); + } + handlers.forEach((handler) => { + this.#addRoute(METHOD_NAME_ALL, this.#path, handler); + }); + return this; + }; + const { strict, ...optionsWithoutStrict } = options; + Object.assign(this, optionsWithoutStrict); + this.getPath = strict ?? true ? options.getPath ?? getPath : getPathNoStrict; + } + #clone() { + const clone = new _Hono({ + router: this.router, + getPath: this.getPath + }); + clone.errorHandler = this.errorHandler; + clone.#notFoundHandler = this.#notFoundHandler; + clone.routes = this.routes; + return clone; + } + #notFoundHandler = notFoundHandler; + // Cannot use `#` because it requires visibility at JavaScript runtime. + errorHandler = errorHandler; + /** + * `.route()` allows grouping other Hono instance in routes. + * + * @see {@link https://hono.dev/docs/api/routing#grouping} + * + * @param {string} path - base Path + * @param {Hono} app - other Hono instance + * @returns {Hono} routed Hono instance + * + * @example + * ```ts + * const app = new Hono() + * const app2 = new Hono() + * + * app2.get("/user", (c) => c.text("user")) + * app.route("/api", app2) // GET /api/user + * ``` + */ + route(path, app2) { + const subApp = this.basePath(path); + app2.routes.map((r) => { + let handler; + if (app2.errorHandler === errorHandler) { + handler = r.handler; + } else { + handler = async (c, next) => (await compose([], app2.errorHandler)(c, () => r.handler(c, next))).res; + handler[COMPOSED_HANDLER] = r.handler; + } + subApp.#addRoute(r.method, r.path, handler, r.basePath); + }); + return this; + } + /** + * `.basePath()` allows base paths to be specified. + * + * @see {@link https://hono.dev/docs/api/routing#base-path} + * + * @param {string} path - base Path + * @returns {Hono} changed Hono instance + * + * @example + * ```ts + * const api = new Hono().basePath('/api') + * ``` + */ + basePath(path) { + const subApp = this.#clone(); + subApp._basePath = mergePath(this._basePath, path); + return subApp; + } + /** + * `.onError()` handles an error and returns a customized Response. + * + * @see {@link https://hono.dev/docs/api/hono#error-handling} + * + * @param {ErrorHandler} handler - request Handler for error + * @returns {Hono} changed Hono instance + * + * @example + * ```ts + * app.onError((err, c) => { + * console.error(`${err}`) + * return c.text('Custom Error Message', 500) + * }) + * ``` + */ + onError = (handler) => { + this.errorHandler = handler; + return this; + }; + /** + * `.notFound()` allows you to customize a Not Found Response. + * + * @see {@link https://hono.dev/docs/api/hono#not-found} + * + * @param {NotFoundHandler} handler - request handler for not-found + * @returns {Hono} changed Hono instance + * + * @example + * ```ts + * app.notFound((c) => { + * return c.text('Custom 404 Message', 404) + * }) + * ``` + */ + notFound = (handler) => { + this.#notFoundHandler = handler; + return this; + }; + /** + * `.mount()` allows you to mount applications built with other frameworks into your Hono application. + * + * @see {@link https://hono.dev/docs/api/hono#mount} + * + * @param {string} path - base Path + * @param {Function} applicationHandler - other Request Handler + * @param {MountOptions} [options] - options of `.mount()` + * @returns {Hono} mounted Hono instance + * + * @example + * ```ts + * import { Router as IttyRouter } from 'itty-router' + * import { Hono } from 'hono' + * // Create itty-router application + * const ittyRouter = IttyRouter() + * // GET /itty-router/hello + * ittyRouter.get('/hello', () => new Response('Hello from itty-router')) + * + * const app = new Hono() + * app.mount('/itty-router', ittyRouter.handle) + * ``` + * + * @example + * ```ts + * const app = new Hono() + * // Send the request to another application without modification. + * app.mount('/app', anotherApp, { + * replaceRequest: (req) => req, + * }) + * ``` + */ + mount(path, applicationHandler, options) { + let replaceRequest; + let optionHandler; + if (options) { + if (typeof options === "function") { + optionHandler = options; + } else { + optionHandler = options.optionHandler; + if (options.replaceRequest === false) { + replaceRequest = (request) => request; + } else { + replaceRequest = options.replaceRequest; + } + } + } + const getOptions = optionHandler ? (c) => { + const options2 = optionHandler(c); + return Array.isArray(options2) ? options2 : [options2]; + } : (c) => { + let executionContext = void 0; + try { + executionContext = c.executionCtx; + } catch { + } + return [c.env, executionContext]; + }; + replaceRequest ||= (() => { + const mergedPath = mergePath(this._basePath, path); + const pathPrefixLength = mergedPath === "/" ? 0 : mergedPath.length; + return (request) => { + const url = new URL(request.url); + url.pathname = this.getPath(request).slice(pathPrefixLength) || "/"; + return new Request(url, request); + }; + })(); + const handler = async (c, next) => { + const res = await applicationHandler(replaceRequest(c.req.raw), ...getOptions(c)); + if (res) { + return res; + } + await next(); + }; + this.#addRoute(METHOD_NAME_ALL, mergePath(path, "*"), handler); + return this; + } + #addRoute(method, path, handler, baseRoutePath) { + method = method.toUpperCase(); + path = mergePath(this._basePath, path); + const r = { + basePath: baseRoutePath !== void 0 ? mergePath(this._basePath, baseRoutePath) : this._basePath, + path, + method, + handler + }; + this.router.add(method, path, [handler, r]); + this.routes.push(r); + } + #handleError(err2, c) { + if (err2 instanceof Error) { + return this.errorHandler(err2, c); + } + throw err2; + } + #dispatch(request, executionCtx, env, method) { + if (method === "HEAD") { + return (async () => new Response(null, await this.#dispatch(request, executionCtx, env, "GET")))(); + } + const path = this.getPath(request, { env }); + const matchResult = this.router.match(method, path); + const c = new Context(request, { + path, + matchResult, + env, + executionCtx, + notFoundHandler: this.#notFoundHandler + }); + if (matchResult[0].length === 1) { + let res; + try { + res = matchResult[0][0][0][0](c, async () => { + c.res = await this.#notFoundHandler(c); + }); + } catch (err2) { + return this.#handleError(err2, c); + } + return res instanceof Promise ? res.then( + (resolved) => resolved || (c.finalized ? c.res : this.#notFoundHandler(c)) + ).catch((err2) => this.#handleError(err2, c)) : res ?? this.#notFoundHandler(c); + } + const composed = compose(matchResult[0], this.errorHandler, this.#notFoundHandler); + return (async () => { + try { + const context = await composed(c); + if (!context.finalized) { + throw new Error( + "Context is not finalized. Did you forget to return a Response object or `await next()`?" + ); + } + return context.res; + } catch (err2) { + return this.#handleError(err2, c); + } + })(); + } + /** + * `.fetch()` will be entry point of your app. + * + * @see {@link https://hono.dev/docs/api/hono#fetch} + * + * @param {Request} request - request Object of request + * @param {Env} Env - env Object + * @param {ExecutionContext} - context of execution + * @returns {Response | Promise} response of request + * + */ + fetch = (request, ...rest) => { + return this.#dispatch(request, rest[1], rest[0], request.method); + }; + /** + * `.request()` is a useful method for testing. + * You can pass a URL or pathname to send a GET request. + * app will return a Response object. + * ```ts + * test('GET /hello is ok', async () => { + * const res = await app.request('/hello') + * expect(res.status).toBe(200) + * }) + * ``` + * @see https://hono.dev/docs/api/hono#request + */ + request = (input, requestInit, Env, executionCtx) => { + if (input instanceof Request) { + return this.fetch(requestInit ? new Request(input, requestInit) : input, Env, executionCtx); + } + input = input.toString(); + return this.fetch( + new Request( + /^https?:\/\//.test(input) ? input : `http://localhost${mergePath("/", input)}`, + requestInit + ), + Env, + executionCtx + ); + }; + /** + * `.fire()` automatically adds a global fetch event listener. + * This can be useful for environments that adhere to the Service Worker API, such as non-ES module Cloudflare Workers. + * @deprecated + * Use `fire` from `hono/service-worker` instead. + * ```ts + * import { Hono } from 'hono' + * import { fire } from 'hono/service-worker' + * + * const app = new Hono() + * // ... + * fire(app) + * ``` + * @see https://hono.dev/docs/api/hono#fire + * @see https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API + * @see https://developers.cloudflare.com/workers/reference/migrate-to-module-workers/ + */ + fire = () => { + addEventListener("fetch", (event) => { + event.respondWith(this.#dispatch(event.request, event, void 0, event.request.method)); + }); + }; +}; + +// registry/components/code/node_modules/hono/dist/router/reg-exp-router/matcher.js +var emptyParam = []; +function match(method, path) { + const matchers = this.buildAllMatchers(); + const match2 = (method2, path2) => { + const matcher = matchers[method2] || matchers[METHOD_NAME_ALL]; + const staticMatch = matcher[2][path2]; + if (staticMatch) { + return staticMatch; + } + const match3 = path2.match(matcher[0]); + if (!match3) { + return [[], emptyParam]; + } + const index = match3.indexOf("", 1); + return [matcher[1][index], match3]; + }; + this.match = match2; + return match2(method, path); +} + +// registry/components/code/node_modules/hono/dist/router/reg-exp-router/node.js +var LABEL_REG_EXP_STR = "[^/]+"; +var ONLY_WILDCARD_REG_EXP_STR = ".*"; +var TAIL_WILDCARD_REG_EXP_STR = "(?:|/.*)"; +var PATH_ERROR = /* @__PURE__ */ Symbol(); +var regExpMetaChars = new Set(".\\+*[^]$()"); +function compareKey(a, b) { + if (a.length === 1) { + return b.length === 1 ? a < b ? -1 : 1 : -1; + } + if (b.length === 1) { + return 1; + } + if (a === ONLY_WILDCARD_REG_EXP_STR || a === TAIL_WILDCARD_REG_EXP_STR) { + return 1; + } else if (b === ONLY_WILDCARD_REG_EXP_STR || b === TAIL_WILDCARD_REG_EXP_STR) { + return -1; + } + if (a === LABEL_REG_EXP_STR) { + return 1; + } else if (b === LABEL_REG_EXP_STR) { + return -1; + } + return a.length === b.length ? a < b ? -1 : 1 : b.length - a.length; +} +var Node = class _Node { + #index; + #varIndex; + #children = /* @__PURE__ */ Object.create(null); + insert(tokens, index, paramMap, context, pathErrorCheckOnly) { + if (tokens.length === 0) { + if (this.#index !== void 0) { + throw PATH_ERROR; + } + if (pathErrorCheckOnly) { + return; + } + this.#index = index; + return; + } + const [token, ...restTokens] = tokens; + const pattern = token === "*" ? restTokens.length === 0 ? ["", "", ONLY_WILDCARD_REG_EXP_STR] : ["", "", LABEL_REG_EXP_STR] : token === "/*" ? ["", "", TAIL_WILDCARD_REG_EXP_STR] : token.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/); + let node; + if (pattern) { + const name = pattern[1]; + let regexpStr = pattern[2] || LABEL_REG_EXP_STR; + if (name && pattern[2]) { + if (regexpStr === ".*") { + throw PATH_ERROR; + } + regexpStr = regexpStr.replace(/^\((?!\?:)(?=[^)]+\)$)/, "(?:"); + if (/\((?!\?:)/.test(regexpStr)) { + throw PATH_ERROR; + } + } + node = this.#children[regexpStr]; + if (!node) { + if (Object.keys(this.#children).some( + (k) => k !== ONLY_WILDCARD_REG_EXP_STR && k !== TAIL_WILDCARD_REG_EXP_STR + )) { + throw PATH_ERROR; + } + if (pathErrorCheckOnly) { + return; + } + node = this.#children[regexpStr] = new _Node(); + if (name !== "") { + node.#varIndex = context.varIndex++; + } + } + if (!pathErrorCheckOnly && name !== "") { + paramMap.push([name, node.#varIndex]); + } + } else { + node = this.#children[token]; + if (!node) { + if (Object.keys(this.#children).some( + (k) => k.length > 1 && k !== ONLY_WILDCARD_REG_EXP_STR && k !== TAIL_WILDCARD_REG_EXP_STR + )) { + throw PATH_ERROR; + } + if (pathErrorCheckOnly) { + return; + } + node = this.#children[token] = new _Node(); + } + } + node.insert(restTokens, index, paramMap, context, pathErrorCheckOnly); + } + buildRegExpStr() { + const childKeys = Object.keys(this.#children).sort(compareKey); + const strList = childKeys.map((k) => { + const c = this.#children[k]; + return (typeof c.#varIndex === "number" ? `(${k})@${c.#varIndex}` : regExpMetaChars.has(k) ? `\\${k}` : k) + c.buildRegExpStr(); + }); + if (typeof this.#index === "number") { + strList.unshift(`#${this.#index}`); + } + if (strList.length === 0) { + return ""; + } + if (strList.length === 1) { + return strList[0]; + } + return "(?:" + strList.join("|") + ")"; + } +}; + +// registry/components/code/node_modules/hono/dist/router/reg-exp-router/trie.js +var Trie = class { + #context = { varIndex: 0 }; + #root = new Node(); + insert(path, index, pathErrorCheckOnly) { + const paramAssoc = []; + const groups = []; + for (let i = 0; ; ) { + let replaced = false; + path = path.replace(/\{[^}]+\}/g, (m) => { + const mark = `@\\${i}`; + groups[i] = [mark, m]; + i++; + replaced = true; + return mark; + }); + if (!replaced) { + break; + } + } + const tokens = path.match(/(?::[^\/]+)|(?:\/\*$)|./g) || []; + for (let i = groups.length - 1; i >= 0; i--) { + const [mark] = groups[i]; + for (let j = tokens.length - 1; j >= 0; j--) { + if (tokens[j].indexOf(mark) !== -1) { + tokens[j] = tokens[j].replace(mark, groups[i][1]); + break; + } + } + } + this.#root.insert(tokens, index, paramAssoc, this.#context, pathErrorCheckOnly); + return paramAssoc; + } + buildRegExp() { + let regexp = this.#root.buildRegExpStr(); + if (regexp === "") { + return [/^$/, [], []]; + } + let captureIndex = 0; + const indexReplacementMap = []; + const paramReplacementMap = []; + regexp = regexp.replace(/#(\d+)|@(\d+)|\.\*\$/g, (_, handlerIndex, paramIndex) => { + if (handlerIndex !== void 0) { + indexReplacementMap[++captureIndex] = Number(handlerIndex); + return "$()"; + } + if (paramIndex !== void 0) { + paramReplacementMap[Number(paramIndex)] = ++captureIndex; + return ""; + } + return ""; + }); + return [new RegExp(`^${regexp}`), indexReplacementMap, paramReplacementMap]; + } +}; + +// registry/components/code/node_modules/hono/dist/router/reg-exp-router/router.js +var nullMatcher = [/^$/, [], /* @__PURE__ */ Object.create(null)]; +var wildcardRegExpCache = /* @__PURE__ */ Object.create(null); +function buildWildcardRegExp(path) { + return wildcardRegExpCache[path] ??= new RegExp( + path === "*" ? "" : `^${path.replace( + /\/\*$|([.\\+*[^\]$()])/g, + (_, metaChar) => metaChar ? `\\${metaChar}` : "(?:|/.*)" + )}$` + ); +} +function clearWildcardRegExpCache() { + wildcardRegExpCache = /* @__PURE__ */ Object.create(null); +} +function buildMatcherFromPreprocessedRoutes(routes) { + const trie = new Trie(); + const handlerData = []; + if (routes.length === 0) { + return nullMatcher; + } + const routesWithStaticPathFlag = routes.map( + (route) => [!/\*|\/:/.test(route[0]), ...route] + ).sort( + ([isStaticA, pathA], [isStaticB, pathB]) => isStaticA ? 1 : isStaticB ? -1 : pathA.length - pathB.length + ); + const staticMap = /* @__PURE__ */ Object.create(null); + for (let i = 0, j = -1, len = routesWithStaticPathFlag.length; i < len; i++) { + const [pathErrorCheckOnly, path, handlers] = routesWithStaticPathFlag[i]; + if (pathErrorCheckOnly) { + staticMap[path] = [handlers.map(([h]) => [h, /* @__PURE__ */ Object.create(null)]), emptyParam]; + } else { + j++; + } + let paramAssoc; + try { + paramAssoc = trie.insert(path, j, pathErrorCheckOnly); + } catch (e) { + throw e === PATH_ERROR ? new UnsupportedPathError(path) : e; + } + if (pathErrorCheckOnly) { + continue; + } + handlerData[j] = handlers.map(([h, paramCount]) => { + const paramIndexMap = /* @__PURE__ */ Object.create(null); + paramCount -= 1; + for (; paramCount >= 0; paramCount--) { + const [key, value] = paramAssoc[paramCount]; + paramIndexMap[key] = value; + } + return [h, paramIndexMap]; + }); + } + const [regexp, indexReplacementMap, paramReplacementMap] = trie.buildRegExp(); + for (let i = 0, len = handlerData.length; i < len; i++) { + for (let j = 0, len2 = handlerData[i].length; j < len2; j++) { + const map = handlerData[i][j]?.[1]; + if (!map) { + continue; + } + const keys = Object.keys(map); + for (let k = 0, len3 = keys.length; k < len3; k++) { + map[keys[k]] = paramReplacementMap[map[keys[k]]]; + } + } + } + const handlerMap = []; + for (const i in indexReplacementMap) { + handlerMap[i] = handlerData[indexReplacementMap[i]]; + } + return [regexp, handlerMap, staticMap]; +} +function findMiddleware(middleware, path) { + if (!middleware) { + return void 0; + } + for (const k of Object.keys(middleware).sort((a, b) => b.length - a.length)) { + if (buildWildcardRegExp(k).test(path)) { + return [...middleware[k]]; + } + } + return void 0; +} +var RegExpRouter = class { + name = "RegExpRouter"; + #middleware; + #routes; + constructor() { + this.#middleware = { [METHOD_NAME_ALL]: /* @__PURE__ */ Object.create(null) }; + this.#routes = { [METHOD_NAME_ALL]: /* @__PURE__ */ Object.create(null) }; + } + add(method, path, handler) { + const middleware = this.#middleware; + const routes = this.#routes; + if (!middleware || !routes) { + throw new Error(MESSAGE_MATCHER_IS_ALREADY_BUILT); + } + if (!middleware[method]) { + ; + [middleware, routes].forEach((handlerMap) => { + handlerMap[method] = /* @__PURE__ */ Object.create(null); + Object.keys(handlerMap[METHOD_NAME_ALL]).forEach((p) => { + handlerMap[method][p] = [...handlerMap[METHOD_NAME_ALL][p]]; + }); + }); + } + if (path === "/*") { + path = "*"; + } + const paramCount = (path.match(/\/:/g) || []).length; + if (/\*$/.test(path)) { + const re = buildWildcardRegExp(path); + if (method === METHOD_NAME_ALL) { + Object.keys(middleware).forEach((m) => { + middleware[m][path] ||= findMiddleware(middleware[m], path) || findMiddleware(middleware[METHOD_NAME_ALL], path) || []; + }); + } else { + middleware[method][path] ||= findMiddleware(middleware[method], path) || findMiddleware(middleware[METHOD_NAME_ALL], path) || []; + } + Object.keys(middleware).forEach((m) => { + if (method === METHOD_NAME_ALL || method === m) { + Object.keys(middleware[m]).forEach((p) => { + re.test(p) && middleware[m][p].push([handler, paramCount]); + }); + } + }); + Object.keys(routes).forEach((m) => { + if (method === METHOD_NAME_ALL || method === m) { + Object.keys(routes[m]).forEach( + (p) => re.test(p) && routes[m][p].push([handler, paramCount]) + ); + } + }); + return; + } + const paths = checkOptionalParameter(path) || [path]; + for (let i = 0, len = paths.length; i < len; i++) { + const path2 = paths[i]; + Object.keys(routes).forEach((m) => { + if (method === METHOD_NAME_ALL || method === m) { + routes[m][path2] ||= [ + ...findMiddleware(middleware[m], path2) || findMiddleware(middleware[METHOD_NAME_ALL], path2) || [] + ]; + routes[m][path2].push([handler, paramCount - len + i + 1]); + } + }); + } + } + match = match; + buildAllMatchers() { + const matchers = /* @__PURE__ */ Object.create(null); + Object.keys(this.#routes).concat(Object.keys(this.#middleware)).forEach((method) => { + matchers[method] ||= this.#buildMatcher(method); + }); + this.#middleware = this.#routes = void 0; + clearWildcardRegExpCache(); + return matchers; + } + #buildMatcher(method) { + const routes = []; + let hasOwnRoute = method === METHOD_NAME_ALL; + [this.#middleware, this.#routes].forEach((r) => { + const ownRoute = r[method] ? Object.keys(r[method]).map((path) => [path, r[method][path]]) : []; + if (ownRoute.length !== 0) { + hasOwnRoute ||= true; + routes.push(...ownRoute); + } else if (method !== METHOD_NAME_ALL) { + routes.push( + ...Object.keys(r[METHOD_NAME_ALL]).map((path) => [path, r[METHOD_NAME_ALL][path]]) + ); + } + }); + if (!hasOwnRoute) { + return null; + } else { + return buildMatcherFromPreprocessedRoutes(routes); + } + } +}; + +// registry/components/code/node_modules/hono/dist/router/smart-router/router.js +var SmartRouter = class { + name = "SmartRouter"; + #routers = []; + #routes = []; + constructor(init) { + this.#routers = init.routers; + } + add(method, path, handler) { + if (!this.#routes) { + throw new Error(MESSAGE_MATCHER_IS_ALREADY_BUILT); + } + this.#routes.push([method, path, handler]); + } + match(method, path) { + if (!this.#routes) { + throw new Error("Fatal error"); + } + const routers = this.#routers; + const routes = this.#routes; + const len = routers.length; + let i = 0; + let res; + for (; i < len; i++) { + const router = routers[i]; + try { + for (let i2 = 0, len2 = routes.length; i2 < len2; i2++) { + router.add(...routes[i2]); + } + res = router.match(method, path); + } catch (e) { + if (e instanceof UnsupportedPathError) { + continue; + } + throw e; + } + this.match = router.match.bind(router); + this.#routers = [router]; + this.#routes = void 0; + break; + } + if (i === len) { + throw new Error("Fatal error"); + } + this.name = `SmartRouter + ${this.activeRouter.name}`; + return res; + } + get activeRouter() { + if (this.#routes || this.#routers.length !== 1) { + throw new Error("No active router has been determined yet."); + } + return this.#routers[0]; + } +}; + +// registry/components/code/node_modules/hono/dist/router/trie-router/node.js +var emptyParams = /* @__PURE__ */ Object.create(null); +var hasChildren = (children) => { + for (const _ in children) { + return true; + } + return false; +}; +var Node2 = class _Node2 { + #methods; + #children; + #patterns; + #order = 0; + #params = emptyParams; + constructor(method, handler, children) { + this.#children = children || /* @__PURE__ */ Object.create(null); + this.#methods = []; + if (method && handler) { + const m = /* @__PURE__ */ Object.create(null); + m[method] = { handler, possibleKeys: [], score: 0 }; + this.#methods = [m]; + } + this.#patterns = []; + } + insert(method, path, handler) { + this.#order = ++this.#order; + let curNode = this; + const parts = splitRoutingPath(path); + const possibleKeys = []; + for (let i = 0, len = parts.length; i < len; i++) { + const p = parts[i]; + const nextP = parts[i + 1]; + const pattern = getPattern(p, nextP); + const key = Array.isArray(pattern) ? pattern[0] : p; + if (key in curNode.#children) { + curNode = curNode.#children[key]; + if (pattern) { + possibleKeys.push(pattern[1]); + } + continue; + } + curNode.#children[key] = new _Node2(); + if (pattern) { + curNode.#patterns.push(pattern); + possibleKeys.push(pattern[1]); + } + curNode = curNode.#children[key]; + } + curNode.#methods.push({ + [method]: { + handler, + possibleKeys: possibleKeys.filter((v, i, a) => a.indexOf(v) === i), + score: this.#order + } + }); + return curNode; + } + #pushHandlerSets(handlerSets, node, method, nodeParams, params) { + for (let i = 0, len = node.#methods.length; i < len; i++) { + const m = node.#methods[i]; + const handlerSet = m[method] || m[METHOD_NAME_ALL]; + const processedSet = {}; + if (handlerSet !== void 0) { + handlerSet.params = /* @__PURE__ */ Object.create(null); + handlerSets.push(handlerSet); + if (nodeParams !== emptyParams || params && params !== emptyParams) { + for (let i2 = 0, len2 = handlerSet.possibleKeys.length; i2 < len2; i2++) { + const key = handlerSet.possibleKeys[i2]; + const processed = processedSet[handlerSet.score]; + handlerSet.params[key] = params?.[key] && !processed ? params[key] : nodeParams[key] ?? params?.[key]; + processedSet[handlerSet.score] = true; + } + } + } + } + } + search(method, path) { + const handlerSets = []; + this.#params = emptyParams; + const curNode = this; + let curNodes = [curNode]; + const parts = splitPath(path); + const curNodesQueue = []; + const len = parts.length; + let partOffsets = null; + for (let i = 0; i < len; i++) { + const part = parts[i]; + const isLast = i === len - 1; + const tempNodes = []; + for (let j = 0, len2 = curNodes.length; j < len2; j++) { + const node = curNodes[j]; + const nextNode = node.#children[part]; + if (nextNode) { + nextNode.#params = node.#params; + if (isLast) { + if (nextNode.#children["*"]) { + this.#pushHandlerSets(handlerSets, nextNode.#children["*"], method, node.#params); + } + this.#pushHandlerSets(handlerSets, nextNode, method, node.#params); + } else { + tempNodes.push(nextNode); + } + } + for (let k = 0, len3 = node.#patterns.length; k < len3; k++) { + const pattern = node.#patterns[k]; + const params = node.#params === emptyParams ? {} : { ...node.#params }; + if (pattern === "*") { + const astNode = node.#children["*"]; + if (astNode) { + this.#pushHandlerSets(handlerSets, astNode, method, node.#params); + astNode.#params = params; + tempNodes.push(astNode); + } + continue; + } + const [key, name, matcher] = pattern; + if (!part && !(matcher instanceof RegExp)) { + continue; + } + const child = node.#children[key]; + if (matcher instanceof RegExp) { + if (partOffsets === null) { + partOffsets = new Array(len); + let offset = path[0] === "/" ? 1 : 0; + for (let p = 0; p < len; p++) { + partOffsets[p] = offset; + offset += parts[p].length + 1; + } + } + const restPathString = path.substring(partOffsets[i]); + const m = matcher.exec(restPathString); + if (m) { + params[name] = m[0]; + this.#pushHandlerSets(handlerSets, child, method, node.#params, params); + if (hasChildren(child.#children)) { + child.#params = params; + const componentCount = m[0].match(/\//)?.length ?? 0; + const targetCurNodes = curNodesQueue[componentCount] ||= []; + targetCurNodes.push(child); + } + continue; + } + } + if (matcher === true || matcher.test(part)) { + params[name] = part; + if (isLast) { + this.#pushHandlerSets(handlerSets, child, method, params, node.#params); + if (child.#children["*"]) { + this.#pushHandlerSets( + handlerSets, + child.#children["*"], + method, + params, + node.#params + ); + } + } else { + child.#params = params; + tempNodes.push(child); + } + } + } + } + const shifted = curNodesQueue.shift(); + curNodes = shifted ? tempNodes.concat(shifted) : tempNodes; + } + if (handlerSets.length > 1) { + handlerSets.sort((a, b) => { + return a.score - b.score; + }); + } + return [handlerSets.map(({ handler, params }) => [handler, params])]; + } +}; + +// registry/components/code/node_modules/hono/dist/router/trie-router/router.js +var TrieRouter = class { + name = "TrieRouter"; + #node; + constructor() { + this.#node = new Node2(); + } + add(method, path, handler) { + const results = checkOptionalParameter(path); + if (results) { + for (let i = 0, len = results.length; i < len; i++) { + this.#node.insert(method, results[i], handler); + } + return; + } + this.#node.insert(method, path, handler); + } + match(method, path) { + return this.#node.search(method, path); + } +}; + +// registry/components/code/node_modules/hono/dist/hono.js +var Hono2 = class extends Hono { + /** + * Creates an instance of the Hono class. + * + * @param options - Optional configuration options for the Hono instance. + */ + constructor(options = {}) { + super(options); + this.router = options.router ?? new SmartRouter({ + routers: [new RegExpRouter(), new TrieRouter()] + }); + } +}; + +// registry/components/code/node_modules/hono/dist/middleware/cors/index.js +var cors = (options) => { + const opts = { + origin: "*", + allowMethods: ["GET", "HEAD", "PUT", "POST", "DELETE", "PATCH"], + allowHeaders: [], + exposeHeaders: [], + ...options + }; + const findAllowOrigin = ((optsOrigin) => { + if (typeof optsOrigin === "string") { + if (optsOrigin === "*") { + return () => optsOrigin; + } else { + return (origin) => optsOrigin === origin ? origin : null; + } + } else if (typeof optsOrigin === "function") { + return optsOrigin; + } else { + return (origin) => optsOrigin.includes(origin) ? origin : null; + } + })(opts.origin); + const findAllowMethods = ((optsAllowMethods) => { + if (typeof optsAllowMethods === "function") { + return optsAllowMethods; + } else if (Array.isArray(optsAllowMethods)) { + return () => optsAllowMethods; + } else { + return () => []; + } + })(opts.allowMethods); + return async function cors2(c, next) { + function set(key, value) { + c.res.headers.set(key, value); + } + const allowOrigin = await findAllowOrigin(c.req.header("origin") || "", c); + if (allowOrigin) { + set("Access-Control-Allow-Origin", allowOrigin); + } + if (opts.credentials) { + set("Access-Control-Allow-Credentials", "true"); + } + if (opts.exposeHeaders?.length) { + set("Access-Control-Expose-Headers", opts.exposeHeaders.join(",")); + } + if (c.req.method === "OPTIONS") { + if (opts.origin !== "*") { + set("Vary", "Origin"); + } + if (opts.maxAge != null) { + set("Access-Control-Max-Age", opts.maxAge.toString()); + } + const allowMethods = await findAllowMethods(c.req.header("origin") || "", c); + if (allowMethods.length) { + set("Access-Control-Allow-Methods", allowMethods.join(",")); + } + let headers = opts.allowHeaders; + if (!headers?.length) { + const requestHeaders = c.req.header("Access-Control-Request-Headers"); + if (requestHeaders) { + headers = requestHeaders.split(/\s*,\s*/); + } + } + if (headers?.length) { + set("Access-Control-Allow-Headers", headers.join(",")); + c.res.headers.append("Vary", "Access-Control-Request-Headers"); + } + c.res.headers.delete("Content-Length"); + c.res.headers.delete("Content-Type"); + return new Response(null, { + headers: c.res.headers, + status: 204, + statusText: "No Content" + }); + } + await next(); + if (opts.origin !== "*") { + c.header("Vary", "Origin", { append: true }); + } + }; +}; + +// registry/components/code/node_modules/quickjs-emscripten-core/dist/index.mjs +init_chunk_JTKJZQYV(); +init_dist(); +async function newQuickJSWASMModuleFromVariant(variantOrPromise) { + let variant2 = smartUnwrap(await variantOrPromise), [wasmModuleLoader, QuickJSFFI2, { QuickJSWASMModule: QuickJSWASMModule2 }] = await Promise.all([variant2.importModuleLoader().then(smartUnwrap), variant2.importFFI(), Promise.resolve().then(() => (init_module_6F3E5H7Y(), module_6F3E5H7Y_exports)).then(smartUnwrap)]), wasmModule2 = await wasmModuleLoader(); + wasmModule2.type = "sync"; + let ffi = new QuickJSFFI2(wasmModule2); + return new QuickJSWASMModule2(wasmModule2, ffi); +} +function smartUnwrap(val) { + return val && "default" in val && val.default ? val.default && "default" in val.default && val.default.default ? val.default.default : val.default : val; +} +function newVariant(baseVariant, options) { + return { ...baseVariant, async importModuleLoader() { + let moduleLoader = smartUnwrap(await baseVariant.importModuleLoader()); + return async function() { + let moduleLoaderArg = options.emscriptenModule ? { ...options.emscriptenModule } : {}, log = options.log ?? ((...args) => debugLog("newVariant moduleLoader:", ...args)), tapValue = (message, val) => (log(...message, val), val), force = (val) => typeof val == "function" ? val() : val; + (options.wasmLocation || options.wasmSourceMapLocation || options.locateFile) && (moduleLoaderArg.locateFile = (fileName, relativeTo) => { + let args = { fileName, relativeTo }; + if (fileName.endsWith(".wasm") && options.wasmLocation !== void 0) return tapValue(["locateFile .wasm: provide wasmLocation", args], options.wasmLocation); + if (fileName.endsWith(".map")) { + if (options.wasmSourceMapLocation !== void 0) return tapValue(["locateFile .map: provide wasmSourceMapLocation", args], options.wasmSourceMapLocation); + if (options.wasmLocation && !options.locateFile) return tapValue(["locateFile .map: infer from wasmLocation", args], options.wasmLocation + ".map"); + } + return options.locateFile ? tapValue(["locateFile: use provided fn", args], options.locateFile(fileName, relativeTo)) : tapValue(["locateFile: unhandled, passthrough", args], fileName); + }), options.wasmBinary && (moduleLoaderArg.wasmBinary = await force(options.wasmBinary)), options.wasmMemory && (moduleLoaderArg.wasmMemory = await force(options.wasmMemory)); + let optionsWasmModule = options.wasmModule, modulePromise; + optionsWasmModule && (moduleLoaderArg.instantiateWasm = async (imports, onSuccess) => { + modulePromise ?? (modulePromise = Promise.resolve(force(optionsWasmModule))); + let wasmModule2 = await modulePromise; + if (!wasmModule2) throw new QuickJSEmscriptenModuleError(`options.wasmModule returned ${String(wasmModule2)}`); + let instance = await WebAssembly.instantiate(wasmModule2, imports); + return onSuccess(instance), instance.exports; + }), moduleLoaderArg.monitorRunDependencies = (left) => { + log("monitorRunDependencies:", left); + }, moduleLoaderArg.quickjsEmscriptenInit = () => newMockExtensions(log); + let resultPromise = moduleLoader(moduleLoaderArg), extensions = moduleLoaderArg.quickjsEmscriptenInit?.(log); + if (optionsWasmModule && extensions?.receiveWasmOffsetConverter && !extensions.existingWasmOffsetConverter) { + let wasmBinary = await force(options.wasmBinary) ?? new ArrayBuffer(0); + modulePromise ?? (modulePromise = Promise.resolve(force(optionsWasmModule))); + let wasmModule2 = await modulePromise; + if (!wasmModule2) throw new QuickJSEmscriptenModuleError(`options.wasmModule returned ${String(wasmModule2)}`); + extensions.receiveWasmOffsetConverter(wasmBinary, wasmModule2); + } + if (extensions?.receiveSourceMapJSON) { + let loadedSourceMapData = await force(options.wasmSourceMapData); + typeof loadedSourceMapData == "string" ? extensions.receiveSourceMapJSON(JSON.parse(loadedSourceMapData)) : loadedSourceMapData ? extensions.receiveSourceMapJSON(loadedSourceMapData) : extensions.receiveSourceMapJSON({ version: 3, names: [], sources: [], mappings: "" }); + } + return resultPromise; + }; + } }; +} +function newMockExtensions(log) { + let mockMessage = "mock called, emscripten module may not be initialized yet"; + return { mock: true, removeRunDependency(name) { + log(`${mockMessage}: removeRunDependency called:`, name); + }, receiveSourceMapJSON(data) { + log(`${mockMessage}: receiveSourceMapJSON called:`, data); + }, WasmOffsetConverter: void 0, receiveWasmOffsetConverter(bytes, mod) { + log(`${mockMessage}: receiveWasmOffsetConverter called:`, bytes, mod); + } }; +} + +// registry/components/code/node_modules/@jitl/quickjs-wasmfile-release-sync/dist/index.mjs +var variant = { type: "sync", importFFI: () => Promise.resolve().then(() => (init_ffi(), ffi_exports)).then((mod) => mod.QuickJSFFI), importModuleLoader: () => Promise.resolve().then(() => (init_emscripten_module_browser(), emscripten_module_browser_exports)).then((mod) => mod.default) }; +var src_default = variant; + +// registry/components/code/index.ts +import wasmModule from "./quickjs.wasm"; + +// registry/components/code/sandbox.mjs +var _variant = null; +function setVariant(v) { + _variant = v; + _modulePromise = null; +} +var DEFAULT_LIMITS = { + timeout_ms: 1e3, + // 牆鐘上限(Node/本機保護;CF 同步執行會凍結 Date.now,故非主保護) + max_ticks: 500, + // ★ 指令計數上限(CF 主保護):interrupt 回呼被叫超過此數即中止。 + // CF Workers 凍結同步 Date.now → 純同步無窮迴圈只能靠此計數中止。 + // 校準(leo21c 實測):interrupt cadence ≈ 5000 指令/tick; + // 真實 card 解析 ≈ 4 ticks;CF CPU 1102 門檻 ≈ 1000+ ticks。 + // 500 ticks(≈ 2.5M 指令)= card 的 125× 餘裕、且穩在 CF 門檻下。 + // 需更多算力的 user code 可提高 limits.max_ticks(但別逼近 ~1000)。 + memory_bytes: 16 * 1024 * 1024, + // QuickJS runtime 記憶體硬上限 + max_stack_bytes: 512 * 1024, + // 遞迴/深堆疊上限 + max_output_bytes: 1024 * 1024, + // stdout JSON 大小上限(防跑飛) + max_code_bytes: 256 * 1024 + // user code 本身大小上限 +}; +var SHA256_PRELUDE = ` +function sha256(ascii) { + function rr(n, x) { return (x >>> n) | (x << (32 - n)); } + var mathPow = Math.pow, maxWord = mathPow(2, 32), result = ''; + var words = [], asciiBitLength; + var utf8 = []; + for (var ci = 0; ci < ascii.length; ci++) { + var code = ascii.charCodeAt(ci); + if (code < 0x80) utf8.push(code); + else if (code < 0x800) { utf8.push(0xc0 | (code >> 6), 0x80 | (code & 0x3f)); } + else if (code < 0xd800 || code >= 0xe000) { utf8.push(0xe0 | (code >> 12), 0x80 | ((code >> 6) & 0x3f), 0x80 | (code & 0x3f)); } + else { + ci++; + code = 0x10000 + (((code & 0x3ff) << 10) | (ascii.charCodeAt(ci) & 0x3ff)); + utf8.push(0xf0 | (code >> 18), 0x80 | ((code >> 12) & 0x3f), 0x80 | ((code >> 6) & 0x3f), 0x80 | (code & 0x3f)); + } + } + asciiBitLength = utf8.length * 8; + var hash = sha256.h = sha256.h || []; + var k = sha256.k = sha256.k || []; + var primeCounter = k.length; + var isComposite = {}; + for (var candidate = 2; primeCounter < 64; candidate++) { + if (!isComposite[candidate]) { + for (var i2 = 0; i2 < 313; i2 += candidate) isComposite[i2] = candidate; + hash[primeCounter] = (mathPow(candidate, 0.5) * maxWord) | 0; + k[primeCounter++] = (mathPow(candidate, 1 / 3) * maxWord) | 0; + } + } + hash = hash.slice(0, 8); + var bytes = utf8.slice(); + bytes.push(0x80); + while (bytes.length % 64 - 56) bytes.push(0x00); + for (var b = 0; b < bytes.length; b++) { + words[b >> 2] |= bytes[b] << ((3 - b) % 4) * 8; + } + words[words.length] = (asciiBitLength / maxWord) | 0; + words[words.length] = asciiBitLength; + for (var j = 0; j < words.length;) { + var w = words.slice(j, j += 16); + var oldHash = hash; + hash = hash.slice(0, 8); + for (var i = 0; i < 64; i++) { + var w15 = w[i - 15], w2 = w[i - 2]; + var a = hash[0], e = hash[4]; + var temp1 = hash[7] + + (rr(6, e) ^ rr(11, e) ^ rr(25, e)) + + ((e & hash[5]) ^ ((~e) & hash[6])) + + k[i] + + (w[i] = (i < 16) ? w[i] : ( + w[i - 16] + + (rr(7, w15) ^ rr(18, w15) ^ (w15 >>> 3)) + + w[i - 7] + + (rr(17, w2) ^ rr(19, w2) ^ (w2 >>> 10)) + ) | 0); + var temp2 = (rr(2, a) ^ rr(13, a) ^ rr(22, a)) + + ((a & hash[1]) ^ (a & hash[2]) ^ (hash[1] & hash[2])); + hash = [(temp1 + temp2) | 0].concat(hash); + hash[4] = (hash[4] + temp1) | 0; + } + for (var i = 0; i < 8; i++) hash[i] = (hash[i] + oldHash[i]) | 0; + } + for (var i = 0; i < 8; i++) { + for (var j = 3; j + 1; j--) { + var b2 = (hash[i] >> (j * 8)) & 255; + result += ((b2 < 16) ? 0 : '') + b2.toString(16); + } + } + return result; +} +`; +var _modulePromise = null; +function getModule() { + if (!_variant) throw new Error("sandbox variant not set \u2014 \u547C\u53EB setVariant() \u6CE8\u5165\u9810\u7DE8 WebAssembly.Module"); + if (!_modulePromise) _modulePromise = newQuickJSWASMModuleFromVariant(_variant); + return _modulePromise; +} +async function runCode(code, input, opts = {}) { + const limits = { ...DEFAULT_LIMITS, ...opts.limits || {} }; + if (typeof code !== "string") return err("code must be a string", "ContractError"); + if (byteLen(code) > limits.max_code_bytes) { + return err(`code exceeds max_code_bytes (${limits.max_code_bytes})`, "ResourceError"); + } + const QuickJS = await getModule(); + const runtime = QuickJS.newRuntime(); + runtime.setMemoryLimit(limits.memory_bytes); + runtime.setMaxStackSize(limits.max_stack_bytes); + const deadline = Date.now() + limits.timeout_ms; + let interrupted = false; + let ticks = 0; + runtime.setInterruptHandler(() => { + if (++ticks > limits.max_ticks) { + interrupted = true; + return true; + } + if (Date.now() > deadline) { + interrupted = true; + return true; + } + return false; + }); + const ctx = runtime.newContext(); + try { + const inputJson = JSON.stringify(input === void 0 ? null : input); + const wrapped = `(() => { + "use strict"; + ${SHA256_PRELUDE} + const input = JSON.parse(${JSON.stringify(inputJson)}); + const __run = (input) => { ${code} + }; + const __out = __run(input); + return JSON.stringify(__out === undefined ? null : __out); + })()`; + const evalResult = ctx.evalCode(wrapped, "user-code.js"); + if (evalResult.error) { + const detail = ctx.dump(evalResult.error); + evalResult.error.dispose(); + if (interrupted) return err(`execution aborted: exceeded time (${limits.timeout_ms}ms) or instruction budget (${limits.max_ticks} ticks)`, "TimeoutError"); + const msg = typeof detail === "object" && detail ? `${detail.name || "Error"}: ${detail.message || ""}`.trim() : String(detail); + return err(msg, "UserCodeError"); + } + const outJson = ctx.getString(evalResult.value); + evalResult.value.dispose(); + if (byteLen(outJson) > limits.max_output_bytes) { + return err(`output exceeds max_output_bytes (${limits.max_output_bytes})`, "ResourceError"); + } + return { success: true, data: JSON.parse(outJson) }; + } catch (e) { + if (interrupted) return err(`execution aborted: exceeded time (${limits.timeout_ms}ms) or instruction budget (${limits.max_ticks} ticks)`, "TimeoutError"); + const m = e instanceof Error ? e.message : String(e); + if (/out of memory|memory/i.test(m)) return err("out of memory", "ResourceError"); + return err(m, "SandboxError"); + } finally { + ctx.dispose(); + runtime.dispose(); + } +} +function byteLen(s) { + if (typeof Buffer !== "undefined") return Buffer.byteLength(s, "utf8"); + return new TextEncoder().encode(s).length; +} +function err(message, error_type) { + return { success: false, error: message, error_type }; +} + +// registry/components/code/index.ts +setVariant(newVariant(src_default, { wasmModule })); +var app = new Hono2(); +app.use("*", cors()); +app.get("/", (c) => c.json({ ok: true, component: "code" })); +app.post("/", async (c) => { + let body; + try { + body = await c.req.json(); + } catch { + return c.json({ success: false, error: "request body must be JSON", error_type: "ContractError" }, 400); + } + if (typeof body.code !== "string") { + return c.json({ success: false, error: "code (string) is required", error_type: "ContractError" }, 400); + } + try { + const result = await runCode(body.code, body.input, { limits: body.limits }); + return c.json(result); + } catch (e) { + return c.json( + { success: false, error: e instanceof Error ? e.message : String(e), error_type: "SandboxError" }, + 500 + ); + } +}); +var code_default = app; +export { + code_default as default +}; diff --git a/.worker-builds/arcrun-cypher-executor/worker.mjs b/.worker-builds/arcrun-cypher-executor/worker.mjs new file mode 100644 index 0000000..2b2877c --- /dev/null +++ b/.worker-builds/arcrun-cypher-executor/worker.mjs @@ -0,0 +1,15266 @@ +var __defProp = Object.defineProperty; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __esm = (fn, res) => function __init() { + return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res; +}; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; + +// cypher-executor/node_modules/.pnpm/hono@4.12.10/node_modules/hono/dist/compose.js +var compose; +var init_compose = __esm({ + "cypher-executor/node_modules/.pnpm/hono@4.12.10/node_modules/hono/dist/compose.js"() { + compose = (middleware, onError, onNotFound) => { + return (context, next) => { + let index = -1; + return dispatch(0); + async function dispatch(i) { + if (i <= index) { + throw new Error("next() called multiple times"); + } + index = i; + let res; + let isError = false; + let handler; + if (middleware[i]) { + handler = middleware[i][0][0]; + context.req.routeIndex = i; + } else { + handler = i === middleware.length && next || void 0; + } + if (handler) { + try { + res = await handler(context, () => dispatch(i + 1)); + } catch (err) { + if (err instanceof Error && onError) { + context.error = err; + res = await onError(err, context); + isError = true; + } else { + throw err; + } + } + } else { + if (context.finalized === false && onNotFound) { + res = await onNotFound(context); + } + } + if (res && (context.finalized === false || isError)) { + context.res = res; + } + return context; + } + }; + }; + } +}); + +// cypher-executor/node_modules/.pnpm/hono@4.12.10/node_modules/hono/dist/http-exception.js +var init_http_exception = __esm({ + "cypher-executor/node_modules/.pnpm/hono@4.12.10/node_modules/hono/dist/http-exception.js"() { + } +}); + +// cypher-executor/node_modules/.pnpm/hono@4.12.10/node_modules/hono/dist/request/constants.js +var GET_MATCH_RESULT; +var init_constants = __esm({ + "cypher-executor/node_modules/.pnpm/hono@4.12.10/node_modules/hono/dist/request/constants.js"() { + GET_MATCH_RESULT = /* @__PURE__ */ Symbol(); + } +}); + +// cypher-executor/node_modules/.pnpm/hono@4.12.10/node_modules/hono/dist/utils/body.js +async function parseFormData(request, options) { + const formData = await request.formData(); + if (formData) { + return convertFormDataToBodyData(formData, options); + } + return {}; +} +function convertFormDataToBodyData(formData, options) { + const form = /* @__PURE__ */ Object.create(null); + formData.forEach((value, key) => { + const shouldParseAllValues = options.all || key.endsWith("[]"); + if (!shouldParseAllValues) { + form[key] = value; + } else { + handleParsingAllValues(form, key, value); + } + }); + if (options.dot) { + Object.entries(form).forEach(([key, value]) => { + const shouldParseDotValues = key.includes("."); + if (shouldParseDotValues) { + handleParsingNestedValues(form, key, value); + delete form[key]; + } + }); + } + return form; +} +var parseBody, handleParsingAllValues, handleParsingNestedValues; +var init_body = __esm({ + "cypher-executor/node_modules/.pnpm/hono@4.12.10/node_modules/hono/dist/utils/body.js"() { + init_request(); + parseBody = async (request, options = /* @__PURE__ */ Object.create(null)) => { + const { all = false, dot = false } = options; + const headers = request instanceof HonoRequest ? request.raw.headers : request.headers; + const contentType = headers.get("Content-Type"); + if (contentType?.startsWith("multipart/form-data") || contentType?.startsWith("application/x-www-form-urlencoded")) { + return parseFormData(request, { all, dot }); + } + return {}; + }; + handleParsingAllValues = (form, key, value) => { + if (form[key] !== void 0) { + if (Array.isArray(form[key])) { + ; + form[key].push(value); + } else { + form[key] = [form[key], value]; + } + } else { + if (!key.endsWith("[]")) { + form[key] = value; + } else { + form[key] = [value]; + } + } + }; + handleParsingNestedValues = (form, key, value) => { + if (/(?:^|\.)__proto__\./.test(key)) { + return; + } + let nestedForm = form; + const keys = key.split("."); + keys.forEach((key2, index) => { + if (index === keys.length - 1) { + nestedForm[key2] = value; + } else { + if (!nestedForm[key2] || typeof nestedForm[key2] !== "object" || Array.isArray(nestedForm[key2]) || nestedForm[key2] instanceof File) { + nestedForm[key2] = /* @__PURE__ */ Object.create(null); + } + nestedForm = nestedForm[key2]; + } + }); + }; + } +}); + +// cypher-executor/node_modules/.pnpm/hono@4.12.10/node_modules/hono/dist/utils/url.js +var splitPath, splitRoutingPath, extractGroupsFromPath, replaceGroupMarks, patternCache, getPattern, tryDecode, tryDecodeURI, getPath, getPathNoStrict, mergePath, checkOptionalParameter, _decodeURI, _getQueryParam, getQueryParam, getQueryParams, decodeURIComponent_; +var init_url = __esm({ + "cypher-executor/node_modules/.pnpm/hono@4.12.10/node_modules/hono/dist/utils/url.js"() { + splitPath = (path) => { + const paths = path.split("/"); + if (paths[0] === "") { + paths.shift(); + } + return paths; + }; + splitRoutingPath = (routePath) => { + const { groups, path } = extractGroupsFromPath(routePath); + const paths = splitPath(path); + return replaceGroupMarks(paths, groups); + }; + extractGroupsFromPath = (path) => { + const groups = []; + path = path.replace(/\{[^}]+\}/g, (match2, index) => { + const mark = `@${index}`; + groups.push([mark, match2]); + return mark; + }); + return { groups, path }; + }; + replaceGroupMarks = (paths, groups) => { + for (let i = groups.length - 1; i >= 0; i--) { + const [mark] = groups[i]; + for (let j = paths.length - 1; j >= 0; j--) { + if (paths[j].includes(mark)) { + paths[j] = paths[j].replace(mark, groups[i][1]); + break; + } + } + } + return paths; + }; + patternCache = {}; + getPattern = (label, next) => { + if (label === "*") { + return "*"; + } + const match2 = label.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/); + if (match2) { + const cacheKey = `${label}#${next}`; + if (!patternCache[cacheKey]) { + if (match2[2]) { + patternCache[cacheKey] = next && next[0] !== ":" && next[0] !== "*" ? [cacheKey, match2[1], new RegExp(`^${match2[2]}(?=/${next})`)] : [label, match2[1], new RegExp(`^${match2[2]}$`)]; + } else { + patternCache[cacheKey] = [label, match2[1], true]; + } + } + return patternCache[cacheKey]; + } + return null; + }; + tryDecode = (str2, decoder) => { + try { + return decoder(str2); + } catch { + return str2.replace(/(?:%[0-9A-Fa-f]{2})+/g, (match2) => { + try { + return decoder(match2); + } catch { + return match2; + } + }); + } + }; + tryDecodeURI = (str2) => tryDecode(str2, decodeURI); + getPath = (request) => { + const url = request.url; + const start = url.indexOf("/", url.indexOf(":") + 4); + let i = start; + for (; i < url.length; i++) { + const charCode = url.charCodeAt(i); + if (charCode === 37) { + const queryIndex = url.indexOf("?", i); + const hashIndex = url.indexOf("#", i); + const end = queryIndex === -1 ? hashIndex === -1 ? void 0 : hashIndex : hashIndex === -1 ? queryIndex : Math.min(queryIndex, hashIndex); + const path = url.slice(start, end); + return tryDecodeURI(path.includes("%25") ? path.replace(/%25/g, "%2525") : path); + } else if (charCode === 63 || charCode === 35) { + break; + } + } + return url.slice(start, i); + }; + getPathNoStrict = (request) => { + const result = getPath(request); + return result.length > 1 && result.at(-1) === "/" ? result.slice(0, -1) : result; + }; + mergePath = (base, sub, ...rest) => { + if (rest.length) { + sub = mergePath(sub, ...rest); + } + return `${base?.[0] === "/" ? "" : "/"}${base}${sub === "/" ? "" : `${base?.at(-1) === "/" ? "" : "/"}${sub?.[0] === "/" ? sub.slice(1) : sub}`}`; + }; + checkOptionalParameter = (path) => { + if (path.charCodeAt(path.length - 1) !== 63 || !path.includes(":")) { + return null; + } + const segments = path.split("/"); + const results = []; + let basePath = ""; + segments.forEach((segment) => { + if (segment !== "" && !/\:/.test(segment)) { + basePath += "/" + segment; + } else if (/\:/.test(segment)) { + if (/\?/.test(segment)) { + if (results.length === 0 && basePath === "") { + results.push("/"); + } else { + results.push(basePath); + } + const optionalSegment = segment.replace("?", ""); + basePath += "/" + optionalSegment; + results.push(basePath); + } else { + basePath += "/" + segment; + } + } + }); + return results.filter((v, i, a) => a.indexOf(v) === i); + }; + _decodeURI = (value) => { + if (!/[%+]/.test(value)) { + return value; + } + if (value.indexOf("+") !== -1) { + value = value.replace(/\+/g, " "); + } + return value.indexOf("%") !== -1 ? tryDecode(value, decodeURIComponent_) : value; + }; + _getQueryParam = (url, key, multiple) => { + let encoded; + if (!multiple && key && !/[%+]/.test(key)) { + let keyIndex2 = url.indexOf("?", 8); + if (keyIndex2 === -1) { + return void 0; + } + if (!url.startsWith(key, keyIndex2 + 1)) { + keyIndex2 = url.indexOf(`&${key}`, keyIndex2 + 1); + } + while (keyIndex2 !== -1) { + const trailingKeyCode = url.charCodeAt(keyIndex2 + key.length + 1); + if (trailingKeyCode === 61) { + const valueIndex = keyIndex2 + key.length + 2; + const endIndex = url.indexOf("&", valueIndex); + return _decodeURI(url.slice(valueIndex, endIndex === -1 ? void 0 : endIndex)); + } else if (trailingKeyCode == 38 || isNaN(trailingKeyCode)) { + return ""; + } + keyIndex2 = url.indexOf(`&${key}`, keyIndex2 + 1); + } + encoded = /[%+]/.test(url); + if (!encoded) { + return void 0; + } + } + const results = {}; + encoded ??= /[%+]/.test(url); + let keyIndex = url.indexOf("?", 8); + while (keyIndex !== -1) { + const nextKeyIndex = url.indexOf("&", keyIndex + 1); + let valueIndex = url.indexOf("=", keyIndex); + if (valueIndex > nextKeyIndex && nextKeyIndex !== -1) { + valueIndex = -1; + } + let name = url.slice( + keyIndex + 1, + valueIndex === -1 ? nextKeyIndex === -1 ? void 0 : nextKeyIndex : valueIndex + ); + if (encoded) { + name = _decodeURI(name); + } + keyIndex = nextKeyIndex; + if (name === "") { + continue; + } + let value; + if (valueIndex === -1) { + value = ""; + } else { + value = url.slice(valueIndex + 1, nextKeyIndex === -1 ? void 0 : nextKeyIndex); + if (encoded) { + value = _decodeURI(value); + } + } + if (multiple) { + if (!(results[name] && Array.isArray(results[name]))) { + results[name] = []; + } + ; + results[name].push(value); + } else { + results[name] ??= value; + } + } + return key ? results[key] : results; + }; + getQueryParam = _getQueryParam; + getQueryParams = (url, key) => { + return _getQueryParam(url, key, true); + }; + decodeURIComponent_ = decodeURIComponent; + } +}); + +// cypher-executor/node_modules/.pnpm/hono@4.12.10/node_modules/hono/dist/request.js +var tryDecodeURIComponent, HonoRequest; +var init_request = __esm({ + "cypher-executor/node_modules/.pnpm/hono@4.12.10/node_modules/hono/dist/request.js"() { + init_http_exception(); + init_constants(); + init_body(); + init_url(); + tryDecodeURIComponent = (str2) => tryDecode(str2, decodeURIComponent_); + HonoRequest = class { + /** + * `.raw` can get the raw Request object. + * + * @see {@link https://hono.dev/docs/api/request#raw} + * + * @example + * ```ts + * // For Cloudflare Workers + * app.post('/', async (c) => { + * const metadata = c.req.raw.cf?.hostMetadata? + * ... + * }) + * ``` + */ + raw; + #validatedData; + // Short name of validatedData + #matchResult; + routeIndex = 0; + /** + * `.path` can get the pathname of the request. + * + * @see {@link https://hono.dev/docs/api/request#path} + * + * @example + * ```ts + * app.get('/about/me', (c) => { + * const pathname = c.req.path // `/about/me` + * }) + * ``` + */ + path; + bodyCache = {}; + constructor(request, path = "/", matchResult = [[]]) { + this.raw = request; + this.path = path; + this.#matchResult = matchResult; + this.#validatedData = {}; + } + param(key) { + return key ? this.#getDecodedParam(key) : this.#getAllDecodedParams(); + } + #getDecodedParam(key) { + const paramKey = this.#matchResult[0][this.routeIndex][1][key]; + const param = this.#getParamValue(paramKey); + return param && /\%/.test(param) ? tryDecodeURIComponent(param) : param; + } + #getAllDecodedParams() { + const decoded = {}; + const keys = Object.keys(this.#matchResult[0][this.routeIndex][1]); + for (const key of keys) { + const value = this.#getParamValue(this.#matchResult[0][this.routeIndex][1][key]); + if (value !== void 0) { + decoded[key] = /\%/.test(value) ? tryDecodeURIComponent(value) : value; + } + } + return decoded; + } + #getParamValue(paramKey) { + return this.#matchResult[1] ? this.#matchResult[1][paramKey] : paramKey; + } + query(key) { + return getQueryParam(this.url, key); + } + queries(key) { + return getQueryParams(this.url, key); + } + header(name) { + if (name) { + return this.raw.headers.get(name) ?? void 0; + } + const headerData = {}; + this.raw.headers.forEach((value, key) => { + headerData[key] = value; + }); + return headerData; + } + async parseBody(options) { + return parseBody(this, options); + } + #cachedBody = (key) => { + const { bodyCache, raw: raw2 } = this; + const cachedBody = bodyCache[key]; + if (cachedBody) { + return cachedBody; + } + const anyCachedKey = Object.keys(bodyCache)[0]; + if (anyCachedKey) { + return bodyCache[anyCachedKey].then((body) => { + if (anyCachedKey === "json") { + body = JSON.stringify(body); + } + return new Response(body)[key](); + }); + } + return bodyCache[key] = raw2[key](); + }; + /** + * `.json()` can parse Request body of type `application/json` + * + * @see {@link https://hono.dev/docs/api/request#json} + * + * @example + * ```ts + * app.post('/entry', async (c) => { + * const body = await c.req.json() + * }) + * ``` + */ + json() { + return this.#cachedBody("text").then((text) => JSON.parse(text)); + } + /** + * `.text()` can parse Request body of type `text/plain` + * + * @see {@link https://hono.dev/docs/api/request#text} + * + * @example + * ```ts + * app.post('/entry', async (c) => { + * const body = await c.req.text() + * }) + * ``` + */ + text() { + return this.#cachedBody("text"); + } + /** + * `.arrayBuffer()` parse Request body as an `ArrayBuffer` + * + * @see {@link https://hono.dev/docs/api/request#arraybuffer} + * + * @example + * ```ts + * app.post('/entry', async (c) => { + * const body = await c.req.arrayBuffer() + * }) + * ``` + */ + arrayBuffer() { + return this.#cachedBody("arrayBuffer"); + } + /** + * Parses the request body as a `Blob`. + * @example + * ```ts + * app.post('/entry', async (c) => { + * const body = await c.req.blob(); + * }); + * ``` + * @see https://hono.dev/docs/api/request#blob + */ + blob() { + return this.#cachedBody("blob"); + } + /** + * Parses the request body as `FormData`. + * @example + * ```ts + * app.post('/entry', async (c) => { + * const body = await c.req.formData(); + * }); + * ``` + * @see https://hono.dev/docs/api/request#formdata + */ + formData() { + return this.#cachedBody("formData"); + } + /** + * Adds validated data to the request. + * + * @param target - The target of the validation. + * @param data - The validated data to add. + */ + addValidatedData(target, data) { + this.#validatedData[target] = data; + } + valid(target) { + return this.#validatedData[target]; + } + /** + * `.url()` can get the request url strings. + * + * @see {@link https://hono.dev/docs/api/request#url} + * + * @example + * ```ts + * app.get('/about/me', (c) => { + * const url = c.req.url // `http://localhost:8787/about/me` + * ... + * }) + * ``` + */ + get url() { + return this.raw.url; + } + /** + * `.method()` can get the method name of the request. + * + * @see {@link https://hono.dev/docs/api/request#method} + * + * @example + * ```ts + * app.get('/about/me', (c) => { + * const method = c.req.method // `GET` + * }) + * ``` + */ + get method() { + return this.raw.method; + } + get [GET_MATCH_RESULT]() { + return this.#matchResult; + } + /** + * `.matchedRoutes()` can return a matched route in the handler + * + * @deprecated + * + * Use matchedRoutes helper defined in "hono/route" instead. + * + * @see {@link https://hono.dev/docs/api/request#matchedroutes} + * + * @example + * ```ts + * app.use('*', async function logger(c, next) { + * await next() + * c.req.matchedRoutes.forEach(({ handler, method, path }, i) => { + * const name = handler.name || (handler.length < 2 ? '[handler]' : '[middleware]') + * console.log( + * method, + * ' ', + * path, + * ' '.repeat(Math.max(10 - path.length, 0)), + * name, + * i === c.req.routeIndex ? '<- respond from here' : '' + * ) + * }) + * }) + * ``` + */ + get matchedRoutes() { + return this.#matchResult[0].map(([[, route]]) => route); + } + /** + * `routePath()` can retrieve the path registered within the handler + * + * @deprecated + * + * Use routePath helper defined in "hono/route" instead. + * + * @see {@link https://hono.dev/docs/api/request#routepath} + * + * @example + * ```ts + * app.get('/posts/:id', (c) => { + * return c.json({ path: c.req.routePath }) + * }) + * ``` + */ + get routePath() { + return this.#matchResult[0].map(([[, route]]) => route)[this.routeIndex].path; + } + }; + } +}); + +// cypher-executor/node_modules/.pnpm/hono@4.12.10/node_modules/hono/dist/utils/html.js +var HtmlEscapedCallbackPhase, raw, resolveCallback; +var init_html = __esm({ + "cypher-executor/node_modules/.pnpm/hono@4.12.10/node_modules/hono/dist/utils/html.js"() { + HtmlEscapedCallbackPhase = { + Stringify: 1, + BeforeStream: 2, + Stream: 3 + }; + raw = (value, callbacks) => { + const escapedString = new String(value); + escapedString.isEscaped = true; + escapedString.callbacks = callbacks; + return escapedString; + }; + resolveCallback = async (str2, phase, preserveCallbacks, context, buffer) => { + if (typeof str2 === "object" && !(str2 instanceof String)) { + if (!(str2 instanceof Promise)) { + str2 = str2.toString(); + } + if (str2 instanceof Promise) { + str2 = await str2; + } + } + const callbacks = str2.callbacks; + if (!callbacks?.length) { + return Promise.resolve(str2); + } + if (buffer) { + buffer[0] += str2; + } else { + buffer = [str2]; + } + const resStr = Promise.all(callbacks.map((c) => c({ phase, buffer, context }))).then( + (res) => Promise.all( + res.filter(Boolean).map((str22) => resolveCallback(str22, phase, false, context, buffer)) + ).then(() => buffer[0]) + ); + if (preserveCallbacks) { + return raw(await resStr, callbacks); + } else { + return resStr; + } + }; + } +}); + +// cypher-executor/node_modules/.pnpm/hono@4.12.10/node_modules/hono/dist/context.js +var TEXT_PLAIN, setDefaultContentType, createResponseInstance, Context; +var init_context = __esm({ + "cypher-executor/node_modules/.pnpm/hono@4.12.10/node_modules/hono/dist/context.js"() { + init_request(); + init_html(); + TEXT_PLAIN = "text/plain; charset=UTF-8"; + setDefaultContentType = (contentType, headers) => { + return { + "Content-Type": contentType, + ...headers + }; + }; + createResponseInstance = (body, init) => new Response(body, init); + Context = class { + #rawRequest; + #req; + /** + * `.env` can get bindings (environment variables, secrets, KV namespaces, D1 database, R2 bucket etc.) in Cloudflare Workers. + * + * @see {@link https://hono.dev/docs/api/context#env} + * + * @example + * ```ts + * // Environment object for Cloudflare Workers + * app.get('*', async c => { + * const counter = c.env.COUNTER + * }) + * ``` + */ + env = {}; + #var; + finalized = false; + /** + * `.error` can get the error object from the middleware if the Handler throws an error. + * + * @see {@link https://hono.dev/docs/api/context#error} + * + * @example + * ```ts + * app.use('*', async (c, next) => { + * await next() + * if (c.error) { + * // do something... + * } + * }) + * ``` + */ + error; + #status; + #executionCtx; + #res; + #layout; + #renderer; + #notFoundHandler; + #preparedHeaders; + #matchResult; + #path; + /** + * Creates an instance of the Context class. + * + * @param req - The Request object. + * @param options - Optional configuration options for the context. + */ + constructor(req, options) { + this.#rawRequest = req; + if (options) { + this.#executionCtx = options.executionCtx; + this.env = options.env; + this.#notFoundHandler = options.notFoundHandler; + this.#path = options.path; + this.#matchResult = options.matchResult; + } + } + /** + * `.req` is the instance of {@link HonoRequest}. + */ + get req() { + this.#req ??= new HonoRequest(this.#rawRequest, this.#path, this.#matchResult); + return this.#req; + } + /** + * @see {@link https://hono.dev/docs/api/context#event} + * The FetchEvent associated with the current request. + * + * @throws Will throw an error if the context does not have a FetchEvent. + */ + get event() { + if (this.#executionCtx && "respondWith" in this.#executionCtx) { + return this.#executionCtx; + } else { + throw Error("This context has no FetchEvent"); + } + } + /** + * @see {@link https://hono.dev/docs/api/context#executionctx} + * The ExecutionContext associated with the current request. + * + * @throws Will throw an error if the context does not have an ExecutionContext. + */ + get executionCtx() { + if (this.#executionCtx) { + return this.#executionCtx; + } else { + throw Error("This context has no ExecutionContext"); + } + } + /** + * @see {@link https://hono.dev/docs/api/context#res} + * The Response object for the current request. + */ + get res() { + return this.#res ||= createResponseInstance(null, { + headers: this.#preparedHeaders ??= new Headers() + }); + } + /** + * Sets the Response object for the current request. + * + * @param _res - The Response object to set. + */ + set res(_res) { + if (this.#res && _res) { + _res = createResponseInstance(_res.body, _res); + for (const [k, v] of this.#res.headers.entries()) { + if (k === "content-type") { + continue; + } + if (k === "set-cookie") { + const cookies = this.#res.headers.getSetCookie(); + _res.headers.delete("set-cookie"); + for (const cookie of cookies) { + _res.headers.append("set-cookie", cookie); + } + } else { + _res.headers.set(k, v); + } + } + } + this.#res = _res; + this.finalized = true; + } + /** + * `.render()` can create a response within a layout. + * + * @see {@link https://hono.dev/docs/api/context#render-setrenderer} + * + * @example + * ```ts + * app.get('/', (c) => { + * return c.render('Hello!') + * }) + * ``` + */ + render = (...args) => { + this.#renderer ??= (content) => this.html(content); + return this.#renderer(...args); + }; + /** + * Sets the layout for the response. + * + * @param layout - The layout to set. + * @returns The layout function. + */ + setLayout = (layout) => this.#layout = layout; + /** + * Gets the current layout for the response. + * + * @returns The current layout function. + */ + getLayout = () => this.#layout; + /** + * `.setRenderer()` can set the layout in the custom middleware. + * + * @see {@link https://hono.dev/docs/api/context#render-setrenderer} + * + * @example + * ```tsx + * app.use('*', async (c, next) => { + * c.setRenderer((content) => { + * return c.html( + * + * + *

{content}

+ * + * + * ) + * }) + * await next() + * }) + * ``` + */ + setRenderer = (renderer) => { + this.#renderer = renderer; + }; + /** + * `.header()` can set headers. + * + * @see {@link https://hono.dev/docs/api/context#header} + * + * @example + * ```ts + * app.get('/welcome', (c) => { + * // Set headers + * c.header('X-Message', 'Hello!') + * c.header('Content-Type', 'text/plain') + * + * return c.body('Thank you for coming') + * }) + * ``` + */ + header = (name, value, options) => { + if (this.finalized) { + this.#res = createResponseInstance(this.#res.body, this.#res); + } + const headers = this.#res ? this.#res.headers : this.#preparedHeaders ??= new Headers(); + if (value === void 0) { + headers.delete(name); + } else if (options?.append) { + headers.append(name, value); + } else { + headers.set(name, value); + } + }; + status = (status) => { + this.#status = status; + }; + /** + * `.set()` can set the value specified by the key. + * + * @see {@link https://hono.dev/docs/api/context#set-get} + * + * @example + * ```ts + * app.use('*', async (c, next) => { + * c.set('message', 'Hono is hot!!') + * await next() + * }) + * ``` + */ + set = (key, value) => { + this.#var ??= /* @__PURE__ */ new Map(); + this.#var.set(key, value); + }; + /** + * `.get()` can use the value specified by the key. + * + * @see {@link https://hono.dev/docs/api/context#set-get} + * + * @example + * ```ts + * app.get('/', (c) => { + * const message = c.get('message') + * return c.text(`The message is "${message}"`) + * }) + * ``` + */ + get = (key) => { + return this.#var ? this.#var.get(key) : void 0; + }; + /** + * `.var` can access the value of a variable. + * + * @see {@link https://hono.dev/docs/api/context#var} + * + * @example + * ```ts + * const result = c.var.client.oneMethod() + * ``` + */ + // c.var.propName is a read-only + get var() { + if (!this.#var) { + return {}; + } + return Object.fromEntries(this.#var); + } + #newResponse(data, arg, headers) { + const responseHeaders = this.#res ? new Headers(this.#res.headers) : this.#preparedHeaders ?? new Headers(); + if (typeof arg === "object" && "headers" in arg) { + const argHeaders = arg.headers instanceof Headers ? arg.headers : new Headers(arg.headers); + for (const [key, value] of argHeaders) { + if (key.toLowerCase() === "set-cookie") { + responseHeaders.append(key, value); + } else { + responseHeaders.set(key, value); + } + } + } + if (headers) { + for (const [k, v] of Object.entries(headers)) { + if (typeof v === "string") { + responseHeaders.set(k, v); + } else { + responseHeaders.delete(k); + for (const v2 of v) { + responseHeaders.append(k, v2); + } + } + } + } + const status = typeof arg === "number" ? arg : arg?.status ?? this.#status; + return createResponseInstance(data, { status, headers: responseHeaders }); + } + newResponse = (...args) => this.#newResponse(...args); + /** + * `.body()` can return the HTTP response. + * You can set headers with `.header()` and set HTTP status code with `.status`. + * This can also be set in `.text()`, `.json()` and so on. + * + * @see {@link https://hono.dev/docs/api/context#body} + * + * @example + * ```ts + * app.get('/welcome', (c) => { + * // Set headers + * c.header('X-Message', 'Hello!') + * c.header('Content-Type', 'text/plain') + * // Set HTTP status code + * c.status(201) + * + * // Return the response body + * return c.body('Thank you for coming') + * }) + * ``` + */ + body = (data, arg, headers) => this.#newResponse(data, arg, headers); + /** + * `.text()` can render text as `Content-Type:text/plain`. + * + * @see {@link https://hono.dev/docs/api/context#text} + * + * @example + * ```ts + * app.get('/say', (c) => { + * return c.text('Hello!') + * }) + * ``` + */ + text = (text, arg, headers) => { + return !this.#preparedHeaders && !this.#status && !arg && !headers && !this.finalized ? new Response(text) : this.#newResponse( + text, + arg, + setDefaultContentType(TEXT_PLAIN, headers) + ); + }; + /** + * `.json()` can render JSON as `Content-Type:application/json`. + * + * @see {@link https://hono.dev/docs/api/context#json} + * + * @example + * ```ts + * app.get('/api', (c) => { + * return c.json({ message: 'Hello!' }) + * }) + * ``` + */ + json = (object, arg, headers) => { + return this.#newResponse( + JSON.stringify(object), + arg, + setDefaultContentType("application/json", headers) + ); + }; + html = (html, arg, headers) => { + const res = (html2) => this.#newResponse(html2, arg, setDefaultContentType("text/html; charset=UTF-8", headers)); + return typeof html === "object" ? resolveCallback(html, HtmlEscapedCallbackPhase.Stringify, false, {}).then(res) : res(html); + }; + /** + * `.redirect()` can Redirect, default status code is 302. + * + * @see {@link https://hono.dev/docs/api/context#redirect} + * + * @example + * ```ts + * app.get('/redirect', (c) => { + * return c.redirect('/') + * }) + * app.get('/redirect-permanently', (c) => { + * return c.redirect('/', 301) + * }) + * ``` + */ + redirect = (location, status) => { + const locationString = String(location); + this.header( + "Location", + // Multibyes should be encoded + // eslint-disable-next-line no-control-regex + !/[^\x00-\xFF]/.test(locationString) ? locationString : encodeURI(locationString) + ); + return this.newResponse(null, status ?? 302); + }; + /** + * `.notFound()` can return the Not Found Response. + * + * @see {@link https://hono.dev/docs/api/context#notfound} + * + * @example + * ```ts + * app.get('/notfound', (c) => { + * return c.notFound() + * }) + * ``` + */ + notFound = () => { + this.#notFoundHandler ??= () => createResponseInstance(); + return this.#notFoundHandler(this); + }; + }; + } +}); + +// cypher-executor/node_modules/.pnpm/hono@4.12.10/node_modules/hono/dist/router.js +var METHOD_NAME_ALL, METHOD_NAME_ALL_LOWERCASE, METHODS, MESSAGE_MATCHER_IS_ALREADY_BUILT, UnsupportedPathError; +var init_router = __esm({ + "cypher-executor/node_modules/.pnpm/hono@4.12.10/node_modules/hono/dist/router.js"() { + METHOD_NAME_ALL = "ALL"; + METHOD_NAME_ALL_LOWERCASE = "all"; + METHODS = ["get", "post", "put", "delete", "options", "patch"]; + MESSAGE_MATCHER_IS_ALREADY_BUILT = "Can not add a route since the matcher is already built."; + UnsupportedPathError = class extends Error { + }; + } +}); + +// cypher-executor/node_modules/.pnpm/hono@4.12.10/node_modules/hono/dist/utils/constants.js +var COMPOSED_HANDLER; +var init_constants2 = __esm({ + "cypher-executor/node_modules/.pnpm/hono@4.12.10/node_modules/hono/dist/utils/constants.js"() { + COMPOSED_HANDLER = "__COMPOSED_HANDLER"; + } +}); + +// cypher-executor/node_modules/.pnpm/hono@4.12.10/node_modules/hono/dist/hono-base.js +var notFoundHandler, errorHandler, Hono; +var init_hono_base = __esm({ + "cypher-executor/node_modules/.pnpm/hono@4.12.10/node_modules/hono/dist/hono-base.js"() { + init_compose(); + init_context(); + init_router(); + init_constants2(); + init_url(); + notFoundHandler = (c) => { + return c.text("404 Not Found", 404); + }; + errorHandler = (err, c) => { + if ("getResponse" in err) { + const res = err.getResponse(); + return c.newResponse(res.body, res); + } + console.error(err); + return c.text("Internal Server Error", 500); + }; + Hono = class _Hono { + get; + post; + put; + delete; + options; + patch; + all; + on; + use; + /* + This class is like an abstract class and does not have a router. + To use it, inherit the class and implement router in the constructor. + */ + router; + getPath; + // Cannot use `#` because it requires visibility at JavaScript runtime. + _basePath = "/"; + #path = "/"; + routes = []; + constructor(options = {}) { + const allMethods = [...METHODS, METHOD_NAME_ALL_LOWERCASE]; + allMethods.forEach((method) => { + this[method] = (args1, ...args) => { + if (typeof args1 === "string") { + this.#path = args1; + } else { + this.#addRoute(method, this.#path, args1); + } + args.forEach((handler) => { + this.#addRoute(method, this.#path, handler); + }); + return this; + }; + }); + this.on = (method, path, ...handlers) => { + for (const p of [path].flat()) { + this.#path = p; + for (const m of [method].flat()) { + handlers.map((handler) => { + this.#addRoute(m.toUpperCase(), this.#path, handler); + }); + } + } + return this; + }; + this.use = (arg1, ...handlers) => { + if (typeof arg1 === "string") { + this.#path = arg1; + } else { + this.#path = "*"; + handlers.unshift(arg1); + } + handlers.forEach((handler) => { + this.#addRoute(METHOD_NAME_ALL, this.#path, handler); + }); + return this; + }; + const { strict, ...optionsWithoutStrict } = options; + Object.assign(this, optionsWithoutStrict); + this.getPath = strict ?? true ? options.getPath ?? getPath : getPathNoStrict; + } + #clone() { + const clone = new _Hono({ + router: this.router, + getPath: this.getPath + }); + clone.errorHandler = this.errorHandler; + clone.#notFoundHandler = this.#notFoundHandler; + clone.routes = this.routes; + return clone; + } + #notFoundHandler = notFoundHandler; + // Cannot use `#` because it requires visibility at JavaScript runtime. + errorHandler = errorHandler; + /** + * `.route()` allows grouping other Hono instance in routes. + * + * @see {@link https://hono.dev/docs/api/routing#grouping} + * + * @param {string} path - base Path + * @param {Hono} app - other Hono instance + * @returns {Hono} routed Hono instance + * + * @example + * ```ts + * const app = new Hono() + * const app2 = new Hono() + * + * app2.get("/user", (c) => c.text("user")) + * app.route("/api", app2) // GET /api/user + * ``` + */ + route(path, app2) { + const subApp = this.basePath(path); + app2.routes.map((r) => { + let handler; + if (app2.errorHandler === errorHandler) { + handler = r.handler; + } else { + handler = async (c, next) => (await compose([], app2.errorHandler)(c, () => r.handler(c, next))).res; + handler[COMPOSED_HANDLER] = r.handler; + } + subApp.#addRoute(r.method, r.path, handler); + }); + return this; + } + /** + * `.basePath()` allows base paths to be specified. + * + * @see {@link https://hono.dev/docs/api/routing#base-path} + * + * @param {string} path - base Path + * @returns {Hono} changed Hono instance + * + * @example + * ```ts + * const api = new Hono().basePath('/api') + * ``` + */ + basePath(path) { + const subApp = this.#clone(); + subApp._basePath = mergePath(this._basePath, path); + return subApp; + } + /** + * `.onError()` handles an error and returns a customized Response. + * + * @see {@link https://hono.dev/docs/api/hono#error-handling} + * + * @param {ErrorHandler} handler - request Handler for error + * @returns {Hono} changed Hono instance + * + * @example + * ```ts + * app.onError((err, c) => { + * console.error(`${err}`) + * return c.text('Custom Error Message', 500) + * }) + * ``` + */ + onError = (handler) => { + this.errorHandler = handler; + return this; + }; + /** + * `.notFound()` allows you to customize a Not Found Response. + * + * @see {@link https://hono.dev/docs/api/hono#not-found} + * + * @param {NotFoundHandler} handler - request handler for not-found + * @returns {Hono} changed Hono instance + * + * @example + * ```ts + * app.notFound((c) => { + * return c.text('Custom 404 Message', 404) + * }) + * ``` + */ + notFound = (handler) => { + this.#notFoundHandler = handler; + return this; + }; + /** + * `.mount()` allows you to mount applications built with other frameworks into your Hono application. + * + * @see {@link https://hono.dev/docs/api/hono#mount} + * + * @param {string} path - base Path + * @param {Function} applicationHandler - other Request Handler + * @param {MountOptions} [options] - options of `.mount()` + * @returns {Hono} mounted Hono instance + * + * @example + * ```ts + * import { Router as IttyRouter } from 'itty-router' + * import { Hono } from 'hono' + * // Create itty-router application + * const ittyRouter = IttyRouter() + * // GET /itty-router/hello + * ittyRouter.get('/hello', () => new Response('Hello from itty-router')) + * + * const app = new Hono() + * app.mount('/itty-router', ittyRouter.handle) + * ``` + * + * @example + * ```ts + * const app = new Hono() + * // Send the request to another application without modification. + * app.mount('/app', anotherApp, { + * replaceRequest: (req) => req, + * }) + * ``` + */ + mount(path, applicationHandler, options) { + let replaceRequest; + let optionHandler; + if (options) { + if (typeof options === "function") { + optionHandler = options; + } else { + optionHandler = options.optionHandler; + if (options.replaceRequest === false) { + replaceRequest = (request) => request; + } else { + replaceRequest = options.replaceRequest; + } + } + } + const getOptions = optionHandler ? (c) => { + const options2 = optionHandler(c); + return Array.isArray(options2) ? options2 : [options2]; + } : (c) => { + let executionContext = void 0; + try { + executionContext = c.executionCtx; + } catch { + } + return [c.env, executionContext]; + }; + replaceRequest ||= (() => { + const mergedPath = mergePath(this._basePath, path); + const pathPrefixLength = mergedPath === "/" ? 0 : mergedPath.length; + return (request) => { + const url = new URL(request.url); + url.pathname = url.pathname.slice(pathPrefixLength) || "/"; + return new Request(url, request); + }; + })(); + const handler = async (c, next) => { + const res = await applicationHandler(replaceRequest(c.req.raw), ...getOptions(c)); + if (res) { + return res; + } + await next(); + }; + this.#addRoute(METHOD_NAME_ALL, mergePath(path, "*"), handler); + return this; + } + #addRoute(method, path, handler) { + method = method.toUpperCase(); + path = mergePath(this._basePath, path); + const r = { basePath: this._basePath, path, method, handler }; + this.router.add(method, path, [handler, r]); + this.routes.push(r); + } + #handleError(err, c) { + if (err instanceof Error) { + return this.errorHandler(err, c); + } + throw err; + } + #dispatch(request, executionCtx, env, method) { + if (method === "HEAD") { + return (async () => new Response(null, await this.#dispatch(request, executionCtx, env, "GET")))(); + } + const path = this.getPath(request, { env }); + const matchResult = this.router.match(method, path); + const c = new Context(request, { + path, + matchResult, + env, + executionCtx, + notFoundHandler: this.#notFoundHandler + }); + if (matchResult[0].length === 1) { + let res; + try { + res = matchResult[0][0][0][0](c, async () => { + c.res = await this.#notFoundHandler(c); + }); + } catch (err) { + return this.#handleError(err, c); + } + return res instanceof Promise ? res.then( + (resolved) => resolved || (c.finalized ? c.res : this.#notFoundHandler(c)) + ).catch((err) => this.#handleError(err, c)) : res ?? this.#notFoundHandler(c); + } + const composed = compose(matchResult[0], this.errorHandler, this.#notFoundHandler); + return (async () => { + try { + const context = await composed(c); + if (!context.finalized) { + throw new Error( + "Context is not finalized. Did you forget to return a Response object or `await next()`?" + ); + } + return context.res; + } catch (err) { + return this.#handleError(err, c); + } + })(); + } + /** + * `.fetch()` will be entry point of your app. + * + * @see {@link https://hono.dev/docs/api/hono#fetch} + * + * @param {Request} request - request Object of request + * @param {Env} Env - env Object + * @param {ExecutionContext} - context of execution + * @returns {Response | Promise} response of request + * + */ + fetch = (request, ...rest) => { + return this.#dispatch(request, rest[1], rest[0], request.method); + }; + /** + * `.request()` is a useful method for testing. + * You can pass a URL or pathname to send a GET request. + * app will return a Response object. + * ```ts + * test('GET /hello is ok', async () => { + * const res = await app.request('/hello') + * expect(res.status).toBe(200) + * }) + * ``` + * @see https://hono.dev/docs/api/hono#request + */ + request = (input, requestInit, Env, executionCtx) => { + if (input instanceof Request) { + return this.fetch(requestInit ? new Request(input, requestInit) : input, Env, executionCtx); + } + input = input.toString(); + return this.fetch( + new Request( + /^https?:\/\//.test(input) ? input : `http://localhost${mergePath("/", input)}`, + requestInit + ), + Env, + executionCtx + ); + }; + /** + * `.fire()` automatically adds a global fetch event listener. + * This can be useful for environments that adhere to the Service Worker API, such as non-ES module Cloudflare Workers. + * @deprecated + * Use `fire` from `hono/service-worker` instead. + * ```ts + * import { Hono } from 'hono' + * import { fire } from 'hono/service-worker' + * + * const app = new Hono() + * // ... + * fire(app) + * ``` + * @see https://hono.dev/docs/api/hono#fire + * @see https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API + * @see https://developers.cloudflare.com/workers/reference/migrate-to-module-workers/ + */ + fire = () => { + addEventListener("fetch", (event) => { + event.respondWith(this.#dispatch(event.request, event, void 0, event.request.method)); + }); + }; + }; + } +}); + +// cypher-executor/node_modules/.pnpm/hono@4.12.10/node_modules/hono/dist/router/reg-exp-router/matcher.js +function match(method, path) { + const matchers = this.buildAllMatchers(); + const match2 = (method2, path2) => { + const matcher = matchers[method2] || matchers[METHOD_NAME_ALL]; + const staticMatch = matcher[2][path2]; + if (staticMatch) { + return staticMatch; + } + const match3 = path2.match(matcher[0]); + if (!match3) { + return [[], emptyParam]; + } + const index = match3.indexOf("", 1); + return [matcher[1][index], match3]; + }; + this.match = match2; + return match2(method, path); +} +var emptyParam; +var init_matcher = __esm({ + "cypher-executor/node_modules/.pnpm/hono@4.12.10/node_modules/hono/dist/router/reg-exp-router/matcher.js"() { + init_router(); + emptyParam = []; + } +}); + +// cypher-executor/node_modules/.pnpm/hono@4.12.10/node_modules/hono/dist/router/reg-exp-router/node.js +function compareKey(a, b) { + if (a.length === 1) { + return b.length === 1 ? a < b ? -1 : 1 : -1; + } + if (b.length === 1) { + return 1; + } + if (a === ONLY_WILDCARD_REG_EXP_STR || a === TAIL_WILDCARD_REG_EXP_STR) { + return 1; + } else if (b === ONLY_WILDCARD_REG_EXP_STR || b === TAIL_WILDCARD_REG_EXP_STR) { + return -1; + } + if (a === LABEL_REG_EXP_STR) { + return 1; + } else if (b === LABEL_REG_EXP_STR) { + return -1; + } + return a.length === b.length ? a < b ? -1 : 1 : b.length - a.length; +} +var LABEL_REG_EXP_STR, ONLY_WILDCARD_REG_EXP_STR, TAIL_WILDCARD_REG_EXP_STR, PATH_ERROR, regExpMetaChars, Node; +var init_node = __esm({ + "cypher-executor/node_modules/.pnpm/hono@4.12.10/node_modules/hono/dist/router/reg-exp-router/node.js"() { + LABEL_REG_EXP_STR = "[^/]+"; + ONLY_WILDCARD_REG_EXP_STR = ".*"; + TAIL_WILDCARD_REG_EXP_STR = "(?:|/.*)"; + PATH_ERROR = /* @__PURE__ */ Symbol(); + regExpMetaChars = new Set(".\\+*[^]$()"); + Node = class _Node { + #index; + #varIndex; + #children = /* @__PURE__ */ Object.create(null); + insert(tokens, index, paramMap, context, pathErrorCheckOnly) { + if (tokens.length === 0) { + if (this.#index !== void 0) { + throw PATH_ERROR; + } + if (pathErrorCheckOnly) { + return; + } + this.#index = index; + return; + } + const [token, ...restTokens] = tokens; + const pattern = token === "*" ? restTokens.length === 0 ? ["", "", ONLY_WILDCARD_REG_EXP_STR] : ["", "", LABEL_REG_EXP_STR] : token === "/*" ? ["", "", TAIL_WILDCARD_REG_EXP_STR] : token.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/); + let node; + if (pattern) { + const name = pattern[1]; + let regexpStr = pattern[2] || LABEL_REG_EXP_STR; + if (name && pattern[2]) { + if (regexpStr === ".*") { + throw PATH_ERROR; + } + regexpStr = regexpStr.replace(/^\((?!\?:)(?=[^)]+\)$)/, "(?:"); + if (/\((?!\?:)/.test(regexpStr)) { + throw PATH_ERROR; + } + } + node = this.#children[regexpStr]; + if (!node) { + if (Object.keys(this.#children).some( + (k) => k !== ONLY_WILDCARD_REG_EXP_STR && k !== TAIL_WILDCARD_REG_EXP_STR + )) { + throw PATH_ERROR; + } + if (pathErrorCheckOnly) { + return; + } + node = this.#children[regexpStr] = new _Node(); + if (name !== "") { + node.#varIndex = context.varIndex++; + } + } + if (!pathErrorCheckOnly && name !== "") { + paramMap.push([name, node.#varIndex]); + } + } else { + node = this.#children[token]; + if (!node) { + if (Object.keys(this.#children).some( + (k) => k.length > 1 && k !== ONLY_WILDCARD_REG_EXP_STR && k !== TAIL_WILDCARD_REG_EXP_STR + )) { + throw PATH_ERROR; + } + if (pathErrorCheckOnly) { + return; + } + node = this.#children[token] = new _Node(); + } + } + node.insert(restTokens, index, paramMap, context, pathErrorCheckOnly); + } + buildRegExpStr() { + const childKeys = Object.keys(this.#children).sort(compareKey); + const strList = childKeys.map((k) => { + const c = this.#children[k]; + return (typeof c.#varIndex === "number" ? `(${k})@${c.#varIndex}` : regExpMetaChars.has(k) ? `\\${k}` : k) + c.buildRegExpStr(); + }); + if (typeof this.#index === "number") { + strList.unshift(`#${this.#index}`); + } + if (strList.length === 0) { + return ""; + } + if (strList.length === 1) { + return strList[0]; + } + return "(?:" + strList.join("|") + ")"; + } + }; + } +}); + +// cypher-executor/node_modules/.pnpm/hono@4.12.10/node_modules/hono/dist/router/reg-exp-router/trie.js +var Trie; +var init_trie = __esm({ + "cypher-executor/node_modules/.pnpm/hono@4.12.10/node_modules/hono/dist/router/reg-exp-router/trie.js"() { + init_node(); + Trie = class { + #context = { varIndex: 0 }; + #root = new Node(); + insert(path, index, pathErrorCheckOnly) { + const paramAssoc = []; + const groups = []; + for (let i = 0; ; ) { + let replaced = false; + path = path.replace(/\{[^}]+\}/g, (m) => { + const mark = `@\\${i}`; + groups[i] = [mark, m]; + i++; + replaced = true; + return mark; + }); + if (!replaced) { + break; + } + } + const tokens = path.match(/(?::[^\/]+)|(?:\/\*$)|./g) || []; + for (let i = groups.length - 1; i >= 0; i--) { + const [mark] = groups[i]; + for (let j = tokens.length - 1; j >= 0; j--) { + if (tokens[j].indexOf(mark) !== -1) { + tokens[j] = tokens[j].replace(mark, groups[i][1]); + break; + } + } + } + this.#root.insert(tokens, index, paramAssoc, this.#context, pathErrorCheckOnly); + return paramAssoc; + } + buildRegExp() { + let regexp = this.#root.buildRegExpStr(); + if (regexp === "") { + return [/^$/, [], []]; + } + let captureIndex = 0; + const indexReplacementMap = []; + const paramReplacementMap = []; + regexp = regexp.replace(/#(\d+)|@(\d+)|\.\*\$/g, (_, handlerIndex, paramIndex) => { + if (handlerIndex !== void 0) { + indexReplacementMap[++captureIndex] = Number(handlerIndex); + return "$()"; + } + if (paramIndex !== void 0) { + paramReplacementMap[Number(paramIndex)] = ++captureIndex; + return ""; + } + return ""; + }); + return [new RegExp(`^${regexp}`), indexReplacementMap, paramReplacementMap]; + } + }; + } +}); + +// cypher-executor/node_modules/.pnpm/hono@4.12.10/node_modules/hono/dist/router/reg-exp-router/router.js +function buildWildcardRegExp(path) { + return wildcardRegExpCache[path] ??= new RegExp( + path === "*" ? "" : `^${path.replace( + /\/\*$|([.\\+*[^\]$()])/g, + (_, metaChar) => metaChar ? `\\${metaChar}` : "(?:|/.*)" + )}$` + ); +} +function clearWildcardRegExpCache() { + wildcardRegExpCache = /* @__PURE__ */ Object.create(null); +} +function buildMatcherFromPreprocessedRoutes(routes) { + const trie = new Trie(); + const handlerData = []; + if (routes.length === 0) { + return nullMatcher; + } + const routesWithStaticPathFlag = routes.map( + (route) => [!/\*|\/:/.test(route[0]), ...route] + ).sort( + ([isStaticA, pathA], [isStaticB, pathB]) => isStaticA ? 1 : isStaticB ? -1 : pathA.length - pathB.length + ); + const staticMap = /* @__PURE__ */ Object.create(null); + for (let i = 0, j = -1, len = routesWithStaticPathFlag.length; i < len; i++) { + const [pathErrorCheckOnly, path, handlers] = routesWithStaticPathFlag[i]; + if (pathErrorCheckOnly) { + staticMap[path] = [handlers.map(([h]) => [h, /* @__PURE__ */ Object.create(null)]), emptyParam]; + } else { + j++; + } + let paramAssoc; + try { + paramAssoc = trie.insert(path, j, pathErrorCheckOnly); + } catch (e) { + throw e === PATH_ERROR ? new UnsupportedPathError(path) : e; + } + if (pathErrorCheckOnly) { + continue; + } + handlerData[j] = handlers.map(([h, paramCount]) => { + const paramIndexMap = /* @__PURE__ */ Object.create(null); + paramCount -= 1; + for (; paramCount >= 0; paramCount--) { + const [key, value] = paramAssoc[paramCount]; + paramIndexMap[key] = value; + } + return [h, paramIndexMap]; + }); + } + const [regexp, indexReplacementMap, paramReplacementMap] = trie.buildRegExp(); + for (let i = 0, len = handlerData.length; i < len; i++) { + for (let j = 0, len2 = handlerData[i].length; j < len2; j++) { + const map = handlerData[i][j]?.[1]; + if (!map) { + continue; + } + const keys = Object.keys(map); + for (let k = 0, len3 = keys.length; k < len3; k++) { + map[keys[k]] = paramReplacementMap[map[keys[k]]]; + } + } + } + const handlerMap = []; + for (const i in indexReplacementMap) { + handlerMap[i] = handlerData[indexReplacementMap[i]]; + } + return [regexp, handlerMap, staticMap]; +} +function findMiddleware(middleware, path) { + if (!middleware) { + return void 0; + } + for (const k of Object.keys(middleware).sort((a, b) => b.length - a.length)) { + if (buildWildcardRegExp(k).test(path)) { + return [...middleware[k]]; + } + } + return void 0; +} +var nullMatcher, wildcardRegExpCache, RegExpRouter; +var init_router2 = __esm({ + "cypher-executor/node_modules/.pnpm/hono@4.12.10/node_modules/hono/dist/router/reg-exp-router/router.js"() { + init_router(); + init_url(); + init_matcher(); + init_node(); + init_trie(); + nullMatcher = [/^$/, [], /* @__PURE__ */ Object.create(null)]; + wildcardRegExpCache = /* @__PURE__ */ Object.create(null); + RegExpRouter = class { + name = "RegExpRouter"; + #middleware; + #routes; + constructor() { + this.#middleware = { [METHOD_NAME_ALL]: /* @__PURE__ */ Object.create(null) }; + this.#routes = { [METHOD_NAME_ALL]: /* @__PURE__ */ Object.create(null) }; + } + add(method, path, handler) { + const middleware = this.#middleware; + const routes = this.#routes; + if (!middleware || !routes) { + throw new Error(MESSAGE_MATCHER_IS_ALREADY_BUILT); + } + if (!middleware[method]) { + ; + [middleware, routes].forEach((handlerMap) => { + handlerMap[method] = /* @__PURE__ */ Object.create(null); + Object.keys(handlerMap[METHOD_NAME_ALL]).forEach((p) => { + handlerMap[method][p] = [...handlerMap[METHOD_NAME_ALL][p]]; + }); + }); + } + if (path === "/*") { + path = "*"; + } + const paramCount = (path.match(/\/:/g) || []).length; + if (/\*$/.test(path)) { + const re = buildWildcardRegExp(path); + if (method === METHOD_NAME_ALL) { + Object.keys(middleware).forEach((m) => { + middleware[m][path] ||= findMiddleware(middleware[m], path) || findMiddleware(middleware[METHOD_NAME_ALL], path) || []; + }); + } else { + middleware[method][path] ||= findMiddleware(middleware[method], path) || findMiddleware(middleware[METHOD_NAME_ALL], path) || []; + } + Object.keys(middleware).forEach((m) => { + if (method === METHOD_NAME_ALL || method === m) { + Object.keys(middleware[m]).forEach((p) => { + re.test(p) && middleware[m][p].push([handler, paramCount]); + }); + } + }); + Object.keys(routes).forEach((m) => { + if (method === METHOD_NAME_ALL || method === m) { + Object.keys(routes[m]).forEach( + (p) => re.test(p) && routes[m][p].push([handler, paramCount]) + ); + } + }); + return; + } + const paths = checkOptionalParameter(path) || [path]; + for (let i = 0, len = paths.length; i < len; i++) { + const path2 = paths[i]; + Object.keys(routes).forEach((m) => { + if (method === METHOD_NAME_ALL || method === m) { + routes[m][path2] ||= [ + ...findMiddleware(middleware[m], path2) || findMiddleware(middleware[METHOD_NAME_ALL], path2) || [] + ]; + routes[m][path2].push([handler, paramCount - len + i + 1]); + } + }); + } + } + match = match; + buildAllMatchers() { + const matchers = /* @__PURE__ */ Object.create(null); + Object.keys(this.#routes).concat(Object.keys(this.#middleware)).forEach((method) => { + matchers[method] ||= this.#buildMatcher(method); + }); + this.#middleware = this.#routes = void 0; + clearWildcardRegExpCache(); + return matchers; + } + #buildMatcher(method) { + const routes = []; + let hasOwnRoute = method === METHOD_NAME_ALL; + [this.#middleware, this.#routes].forEach((r) => { + const ownRoute = r[method] ? Object.keys(r[method]).map((path) => [path, r[method][path]]) : []; + if (ownRoute.length !== 0) { + hasOwnRoute ||= true; + routes.push(...ownRoute); + } else if (method !== METHOD_NAME_ALL) { + routes.push( + ...Object.keys(r[METHOD_NAME_ALL]).map((path) => [path, r[METHOD_NAME_ALL][path]]) + ); + } + }); + if (!hasOwnRoute) { + return null; + } else { + return buildMatcherFromPreprocessedRoutes(routes); + } + } + }; + } +}); + +// cypher-executor/node_modules/.pnpm/hono@4.12.10/node_modules/hono/dist/router/reg-exp-router/prepared-router.js +var init_prepared_router = __esm({ + "cypher-executor/node_modules/.pnpm/hono@4.12.10/node_modules/hono/dist/router/reg-exp-router/prepared-router.js"() { + init_router(); + init_matcher(); + init_router2(); + } +}); + +// cypher-executor/node_modules/.pnpm/hono@4.12.10/node_modules/hono/dist/router/reg-exp-router/index.js +var init_reg_exp_router = __esm({ + "cypher-executor/node_modules/.pnpm/hono@4.12.10/node_modules/hono/dist/router/reg-exp-router/index.js"() { + init_router2(); + init_prepared_router(); + } +}); + +// cypher-executor/node_modules/.pnpm/hono@4.12.10/node_modules/hono/dist/router/smart-router/router.js +var SmartRouter; +var init_router3 = __esm({ + "cypher-executor/node_modules/.pnpm/hono@4.12.10/node_modules/hono/dist/router/smart-router/router.js"() { + init_router(); + SmartRouter = class { + name = "SmartRouter"; + #routers = []; + #routes = []; + constructor(init) { + this.#routers = init.routers; + } + add(method, path, handler) { + if (!this.#routes) { + throw new Error(MESSAGE_MATCHER_IS_ALREADY_BUILT); + } + this.#routes.push([method, path, handler]); + } + match(method, path) { + if (!this.#routes) { + throw new Error("Fatal error"); + } + const routers = this.#routers; + const routes = this.#routes; + const len = routers.length; + let i = 0; + let res; + for (; i < len; i++) { + const router = routers[i]; + try { + for (let i2 = 0, len2 = routes.length; i2 < len2; i2++) { + router.add(...routes[i2]); + } + res = router.match(method, path); + } catch (e) { + if (e instanceof UnsupportedPathError) { + continue; + } + throw e; + } + this.match = router.match.bind(router); + this.#routers = [router]; + this.#routes = void 0; + break; + } + if (i === len) { + throw new Error("Fatal error"); + } + this.name = `SmartRouter + ${this.activeRouter.name}`; + return res; + } + get activeRouter() { + if (this.#routes || this.#routers.length !== 1) { + throw new Error("No active router has been determined yet."); + } + return this.#routers[0]; + } + }; + } +}); + +// cypher-executor/node_modules/.pnpm/hono@4.12.10/node_modules/hono/dist/router/smart-router/index.js +var init_smart_router = __esm({ + "cypher-executor/node_modules/.pnpm/hono@4.12.10/node_modules/hono/dist/router/smart-router/index.js"() { + init_router3(); + } +}); + +// cypher-executor/node_modules/.pnpm/hono@4.12.10/node_modules/hono/dist/router/trie-router/node.js +var emptyParams, hasChildren, Node2; +var init_node2 = __esm({ + "cypher-executor/node_modules/.pnpm/hono@4.12.10/node_modules/hono/dist/router/trie-router/node.js"() { + init_router(); + init_url(); + emptyParams = /* @__PURE__ */ Object.create(null); + hasChildren = (children) => { + for (const _ in children) { + return true; + } + return false; + }; + Node2 = class _Node2 { + #methods; + #children; + #patterns; + #order = 0; + #params = emptyParams; + constructor(method, handler, children) { + this.#children = children || /* @__PURE__ */ Object.create(null); + this.#methods = []; + if (method && handler) { + const m = /* @__PURE__ */ Object.create(null); + m[method] = { handler, possibleKeys: [], score: 0 }; + this.#methods = [m]; + } + this.#patterns = []; + } + insert(method, path, handler) { + this.#order = ++this.#order; + let curNode = this; + const parts = splitRoutingPath(path); + const possibleKeys = []; + for (let i = 0, len = parts.length; i < len; i++) { + const p = parts[i]; + const nextP = parts[i + 1]; + const pattern = getPattern(p, nextP); + const key = Array.isArray(pattern) ? pattern[0] : p; + if (key in curNode.#children) { + curNode = curNode.#children[key]; + if (pattern) { + possibleKeys.push(pattern[1]); + } + continue; + } + curNode.#children[key] = new _Node2(); + if (pattern) { + curNode.#patterns.push(pattern); + possibleKeys.push(pattern[1]); + } + curNode = curNode.#children[key]; + } + curNode.#methods.push({ + [method]: { + handler, + possibleKeys: possibleKeys.filter((v, i, a) => a.indexOf(v) === i), + score: this.#order + } + }); + return curNode; + } + #pushHandlerSets(handlerSets, node, method, nodeParams, params) { + for (let i = 0, len = node.#methods.length; i < len; i++) { + const m = node.#methods[i]; + const handlerSet = m[method] || m[METHOD_NAME_ALL]; + const processedSet = {}; + if (handlerSet !== void 0) { + handlerSet.params = /* @__PURE__ */ Object.create(null); + handlerSets.push(handlerSet); + if (nodeParams !== emptyParams || params && params !== emptyParams) { + for (let i2 = 0, len2 = handlerSet.possibleKeys.length; i2 < len2; i2++) { + const key = handlerSet.possibleKeys[i2]; + const processed = processedSet[handlerSet.score]; + handlerSet.params[key] = params?.[key] && !processed ? params[key] : nodeParams[key] ?? params?.[key]; + processedSet[handlerSet.score] = true; + } + } + } + } + } + search(method, path) { + const handlerSets = []; + this.#params = emptyParams; + const curNode = this; + let curNodes = [curNode]; + const parts = splitPath(path); + const curNodesQueue = []; + const len = parts.length; + let partOffsets = null; + for (let i = 0; i < len; i++) { + const part = parts[i]; + const isLast = i === len - 1; + const tempNodes = []; + for (let j = 0, len2 = curNodes.length; j < len2; j++) { + const node = curNodes[j]; + const nextNode = node.#children[part]; + if (nextNode) { + nextNode.#params = node.#params; + if (isLast) { + if (nextNode.#children["*"]) { + this.#pushHandlerSets(handlerSets, nextNode.#children["*"], method, node.#params); + } + this.#pushHandlerSets(handlerSets, nextNode, method, node.#params); + } else { + tempNodes.push(nextNode); + } + } + for (let k = 0, len3 = node.#patterns.length; k < len3; k++) { + const pattern = node.#patterns[k]; + const params = node.#params === emptyParams ? {} : { ...node.#params }; + if (pattern === "*") { + const astNode = node.#children["*"]; + if (astNode) { + this.#pushHandlerSets(handlerSets, astNode, method, node.#params); + astNode.#params = params; + tempNodes.push(astNode); + } + continue; + } + const [key, name, matcher] = pattern; + if (!part && !(matcher instanceof RegExp)) { + continue; + } + const child = node.#children[key]; + if (matcher instanceof RegExp) { + if (partOffsets === null) { + partOffsets = new Array(len); + let offset = path[0] === "/" ? 1 : 0; + for (let p = 0; p < len; p++) { + partOffsets[p] = offset; + offset += parts[p].length + 1; + } + } + const restPathString = path.substring(partOffsets[i]); + const m = matcher.exec(restPathString); + if (m) { + params[name] = m[0]; + this.#pushHandlerSets(handlerSets, child, method, node.#params, params); + if (hasChildren(child.#children)) { + child.#params = params; + const componentCount = m[0].match(/\//)?.length ?? 0; + const targetCurNodes = curNodesQueue[componentCount] ||= []; + targetCurNodes.push(child); + } + continue; + } + } + if (matcher === true || matcher.test(part)) { + params[name] = part; + if (isLast) { + this.#pushHandlerSets(handlerSets, child, method, params, node.#params); + if (child.#children["*"]) { + this.#pushHandlerSets( + handlerSets, + child.#children["*"], + method, + params, + node.#params + ); + } + } else { + child.#params = params; + tempNodes.push(child); + } + } + } + } + const shifted = curNodesQueue.shift(); + curNodes = shifted ? tempNodes.concat(shifted) : tempNodes; + } + if (handlerSets.length > 1) { + handlerSets.sort((a, b) => { + return a.score - b.score; + }); + } + return [handlerSets.map(({ handler, params }) => [handler, params])]; + } + }; + } +}); + +// cypher-executor/node_modules/.pnpm/hono@4.12.10/node_modules/hono/dist/router/trie-router/router.js +var TrieRouter; +var init_router4 = __esm({ + "cypher-executor/node_modules/.pnpm/hono@4.12.10/node_modules/hono/dist/router/trie-router/router.js"() { + init_url(); + init_node2(); + TrieRouter = class { + name = "TrieRouter"; + #node; + constructor() { + this.#node = new Node2(); + } + add(method, path, handler) { + const results = checkOptionalParameter(path); + if (results) { + for (let i = 0, len = results.length; i < len; i++) { + this.#node.insert(method, results[i], handler); + } + return; + } + this.#node.insert(method, path, handler); + } + match(method, path) { + return this.#node.search(method, path); + } + }; + } +}); + +// cypher-executor/node_modules/.pnpm/hono@4.12.10/node_modules/hono/dist/router/trie-router/index.js +var init_trie_router = __esm({ + "cypher-executor/node_modules/.pnpm/hono@4.12.10/node_modules/hono/dist/router/trie-router/index.js"() { + init_router4(); + } +}); + +// cypher-executor/node_modules/.pnpm/hono@4.12.10/node_modules/hono/dist/hono.js +var Hono2; +var init_hono = __esm({ + "cypher-executor/node_modules/.pnpm/hono@4.12.10/node_modules/hono/dist/hono.js"() { + init_hono_base(); + init_reg_exp_router(); + init_smart_router(); + init_trie_router(); + Hono2 = class extends Hono { + /** + * Creates an instance of the Hono class. + * + * @param options - Optional configuration options for the Hono instance. + */ + constructor(options = {}) { + super(options); + this.router = options.router ?? new SmartRouter({ + routers: [new RegExpRouter(), new TrieRouter()] + }); + } + }; + } +}); + +// cypher-executor/node_modules/.pnpm/hono@4.12.10/node_modules/hono/dist/index.js +var init_dist = __esm({ + "cypher-executor/node_modules/.pnpm/hono@4.12.10/node_modules/hono/dist/index.js"() { + init_hono(); + } +}); + +// cypher-executor/src/types.ts +async function kvGetNodeOutput(store, nodeId) { + try { + const val = await store.kv.get(`${store.runId}:node:${nodeId}`, "json"); + return val; + } catch { + return void 0; + } +} +async function kvSetNodeOutput(store, nodeId, output) { + try { + await store.kv.put( + `${store.runId}:node:${nodeId}`, + JSON.stringify(output), + { expirationTtl: 3600 } + ); + } catch { + } +} +var WorkflowPaused, ExecutionError; +var init_types = __esm({ + "cypher-executor/src/types.ts"() { + "use strict"; + WorkflowPaused = class extends Error { + task_id; + run_id; + paused_node_id; + trace_so_far; + constructor(task_id, run_id, paused_node_id, trace_so_far) { + super(`workflow paused at node ${paused_node_id} waiting for task ${task_id}`); + this.name = "WorkflowPaused"; + this.task_id = task_id; + this.run_id = run_id; + this.paused_node_id = paused_node_id; + this.trace_so_far = trace_so_far; + } + }; + ExecutionError = class extends Error { + failed_node; + failed_input; + trace; + constructor(message, failed_node, failed_input, trace) { + super(message); + this.name = "ExecutionError"; + this.failed_node = failed_node; + this.failed_input = failed_input; + this.trace = trace; + } + }; + } +}); + +// cypher-executor/src/lib/hash.ts +async function deriveRecipeHash(canonicalId) { + return "rec_" + await sha256Prefix(canonicalId); +} +function isComponentHash(id) { + return /^cmp_[0-9a-f]{8}$/.test(id); +} +function isRecipeHash(id) { + return /^rec_[0-9a-f]{8}$/.test(id); +} +async function sha256Prefix(input) { + const data = new TextEncoder().encode(input); + const buf = await crypto.subtle.digest("SHA-256", data); + return Array.from(new Uint8Array(buf)).map((b) => b.toString(16).padStart(2, "0")).join("").slice(0, 8); +} +var init_hash = __esm({ + "cypher-executor/src/lib/hash.ts"() { + "use strict"; + } +}); + +// cypher-executor/src/routes/recipes.ts +async function installRecipeRecord(kv, recipe) { + const uuid = recipe.uuid; + const { canonical_id, hash_id } = recipe; + const listRaw = await kv.get(kIdxCanonical(canonical_id)); + const uuids = listRaw ? JSON.parse(listRaw) : []; + if (!uuids.includes(uuid)) uuids.push(uuid); + await Promise.all([ + kv.put(`recipe:${uuid}`, JSON.stringify(recipe)), + kv.put(kIdxCanonical(canonical_id), JSON.stringify(uuids)), + kv.put(kIdxInstalled(canonical_id), uuid), + kv.put(`idx:${hash_id}`, canonical_id) + ]); +} +async function fetchMarketStat(env, canonicalId) { + try { + const base = (env.KBDB_BASE_URL ?? "https://kbdb.finally.click").replace(/\/$/, ""); + const headers = {}; + if (env.KBDB_INTERNAL_TOKEN) headers["Authorization"] = `Bearer ${env.KBDB_INTERNAL_TOKEN}`; + const res = await fetch(`${base}/recipe-stats/${encodeURIComponent(canonicalId)}`, { headers }); + if (!res.ok) return null; + const json = await res.json(); + if (!json.stat) return null; + return { + success_count: json.stat.success_count ?? 0, + failure_count: json.stat.failure_count ?? 0 + }; + } catch { + return null; + } +} +async function listAllRecipes(kv) { + const list = await kv.list({ prefix: "recipe:" }); + const all = (await Promise.all( + list.keys.map((k) => kv.get(k.name, "json")) + )).filter(Boolean); + const hasUuid = new Set(all.filter((r) => r.uuid).map((r) => r.canonical_id)); + return all.filter((r) => r.uuid || !hasUuid.has(r.canonical_id)); +} +async function resolveRecipe(id, kv) { + const direct = await kv.get(`recipe:${id}`, "json"); + if (direct && direct.uuid) return direct; + let canonicalId = id; + if (id.startsWith("rec_")) { + const looked = await kv.get(`idx:${id}`); + if (!looked) return direct; + canonicalId = looked; + } + const installedUuid = await kv.get(kIdxInstalled(canonicalId)); + if (installedUuid) { + const byUuid = await kv.get(`recipe:${installedUuid}`, "json"); + if (byUuid) return byUuid; + } + return direct ?? await kv.get(`recipe:${canonicalId}`, "json"); +} +async function resolveAuthRecipe(service, kv) { + return kv.get(`auth_recipe:${service}`, "json"); +} +var recipesRouter, kIdxCanonical, kIdxInstalled; +var init_recipes = __esm({ + "cypher-executor/src/routes/recipes.ts"() { + "use strict"; + init_dist(); + init_hash(); + recipesRouter = new Hono2(); + kIdxCanonical = (canonicalId) => `idx:canonical:${canonicalId}`; + kIdxInstalled = (canonicalId) => `idx:installed:${canonicalId}`; + recipesRouter.post("/recipes", async (c) => { + let body; + try { + body = await c.req.json(); + } catch { + return c.json({ success: false, error: "request body \u5FC5\u9808\u70BA JSON" }, 400); + } + const canonicalId = (body.canonical_id ?? "").trim().toLowerCase(); + if (!canonicalId) return c.json({ success: false, error: "canonical_id \u5FC5\u586B" }, 400); + if (!body.endpoint) return c.json({ success: false, error: "endpoint \u5FC5\u586B" }, 400); + const hashId = await deriveRecipeHash(canonicalId); + const now2 = Date.now(); + const existing = await resolveRecipe(canonicalId, c.env.RECIPES); + const recipe = { + uuid: existing?.uuid ?? crypto.randomUUID(), + author: body.author ?? existing?.author ?? "local", + derived_from: body.derived_from ?? existing?.derived_from, + canonical_id: canonicalId, + hash_id: hashId, + display_name: body.display_name, + description: body.description, + endpoint: body.endpoint, + method: (body.method ?? "POST").toUpperCase(), + headers: body.headers, + body: body.body, + // ③ payload/回應/binding 三層(3.12):全選填,沒給就是 undefined=既有行為 + body_template: body.body_template, + response_map: body.response_map, + auth: body.auth, + binding_name: body.binding_name, + auth_service: body.auth_service, + credentials_required: body.credentials_required, + created_at: existing?.created_at ?? now2, + updated_at: now2 + }; + await installRecipeRecord(c.env.RECIPES, recipe); + return c.json({ success: true, recipe }); + }); + recipesRouter.post("/recipes/submit", async (c) => { + let body; + try { + body = await c.req.json(); + } catch { + return c.json({ success: false, error: "request body \u5FC5\u9808\u70BA JSON" }, 400); + } + const canonicalId = (body.canonical_id ?? "").trim().toLowerCase(); + if (!canonicalId) return c.json({ success: false, error: "canonical_id \u5FC5\u586B" }, 400); + if (!body.endpoint) return c.json({ success: false, error: "endpoint \u5FC5\u586B" }, 400); + const hashId = await deriveRecipeHash(canonicalId); + const now2 = Date.now(); + const recipe = { + uuid: crypto.randomUUID(), + author: body.author ?? body.submitter ?? "anonymous", + derived_from: body.derived_from, + canonical_id: canonicalId, + hash_id: hashId, + display_name: body.display_name, + description: body.description, + endpoint: body.endpoint, + method: (body.method ?? "POST").toUpperCase(), + headers: body.headers, + body: body.body, + auth_service: body.auth_service, + credentials_required: body.credentials_required, + created_at: now2, + updated_at: now2 + }; + await installRecipeRecord(c.env.RECIPES, recipe); + const kbdbBase2 = (c.env.KBDB_BASE_URL ?? "https://kbdb.finally.click").replace(/\/$/, ""); + const evidence = { + content: canonicalId, + entry_type: "recipe_submission", + metadata_json: JSON.stringify({ + uuid: recipe.uuid, + canonical_id: canonicalId, + author: recipe.author, + submitter: body.submitter ?? "unknown", + claimed_stat: body.stat ?? null, + submitted_at: now2 + }) + }; + const kbdbHeaders = { "Content-Type": "application/json" }; + if (c.env.KBDB_INTERNAL_TOKEN) kbdbHeaders["Authorization"] = `Bearer ${c.env.KBDB_INTERNAL_TOKEN}`; + c.executionCtx.waitUntil( + fetch(`${kbdbBase2}/entries`, { + method: "POST", + headers: kbdbHeaders, + body: JSON.stringify(evidence) + }).catch(() => void 0) + ); + return c.json({ success: true, recipe, evidence_recorded: true }); + }); + recipesRouter.post("/recipes/migrate-uuid", async (c) => { + const list = await c.env.RECIPES.list({ prefix: "recipe:" }); + let migrated = 0, skipped = 0; + const errors = []; + for (const k of list.keys) { + try { + const rec = await c.env.RECIPES.get(k.name, "json"); + if (!rec || !rec.canonical_id) { + skipped++; + continue; + } + if (rec.uuid) { + skipped++; + continue; + } + const migrated_recipe = { + ...rec, + uuid: crypto.randomUUID(), + author: rec.author ?? "system" + // 舊種子歸 system + }; + await installRecipeRecord(c.env.RECIPES, migrated_recipe); + migrated++; + } catch (e) { + errors.push(`${k.name}: ${e instanceof Error ? e.message : String(e)}`); + } + } + return c.json({ success: errors.length === 0, migrated, skipped, errors }); + }); + recipesRouter.get("/recipes/:id", async (c) => { + const id = c.req.param("id"); + const recipe = await resolveRecipe(id, c.env.RECIPES); + if (!recipe) return c.json({ success: false, error: `\u627E\u4E0D\u5230 recipe: ${id}` }, 404); + return c.json({ success: true, recipe }); + }); + recipesRouter.get("/recipes", async (c) => { + const list = await c.env.RECIPES.list({ prefix: "recipe:" }); + const all = (await Promise.all( + list.keys.map((k) => c.env.RECIPES.get(k.name, "json")) + )).filter(Boolean); + const hasUuidVersion = new Set(all.filter((r) => r.uuid).map((r) => r.canonical_id)); + const recipes = all.filter((r) => r.uuid || !hasUuidVersion.has(r.canonical_id)); + return c.json({ success: true, recipes, count: recipes.length }); + }); + recipesRouter.get("/public-recipes", async (c) => { + const q = (c.req.query("q") ?? "").trim().toLowerCase(); + const limit = Math.min(Number(c.req.query("limit") ?? 50), 200); + const offset = Number(c.req.query("offset") ?? 0); + const all = await listAllRecipes(c.env.RECIPES); + const matched = q ? all.filter((r) => r.canonical_id.toLowerCase().includes(q) || (r.display_name ?? "").toLowerCase().includes(q) || (r.description ?? "").toLowerCase().includes(q)) : all; + if (q && matched.length === 0) { + return c.json({ + found: false, + query: q, + hint: `\u516C\u5EAB\u7121\u7B26\u5408\u300C${q}\u300D\u7684 recipe\u3002\u53EF\u81EA\u884C\u5EFA\u7ACB\u4E26 submit-p \u6295\u7A3F\u6210\u70BA\u4F5C\u8005\uFF08app-store \u6A21\u578B\uFF09\u3002` + }); + } + const page = matched.slice(offset, offset + limit); + const withStats = await Promise.all( + page.map(async (r) => ({ + uuid: r.uuid, + canonical_id: r.canonical_id, + author: r.author, + display_name: r.display_name, + description: r.description, + market_stat: await fetchMarketStat(c.env, r.uuid ?? r.canonical_id) + // §7.5.h per-uuid + })) + ); + return c.json({ found: true, recipes: withStats, count: matched.length }); + }); + recipesRouter.get("/public-recipes/:canonical_id", async (c) => { + const canonicalId = c.req.param("canonical_id").trim().toLowerCase(); + const author = c.req.query("author"); + const all = await listAllRecipes(c.env.RECIPES); + let versions = all.filter((r) => r.canonical_id === canonicalId); + if (author) versions = versions.filter((r) => r.author === author); + if (versions.length === 0) { + return c.json({ + found: false, + canonical_id: canonicalId, + hint: `\u516C\u5EAB\u7121 recipe\u300C${canonicalId}\u300D${author ? `\uFF08author=${author}\uFF09` : ""}\u3002\u53EF\u81EA\u884C\u5EFA\u7ACB\u4E26 submit-p \u6295\u7A3F\u6210\u70BA\u4F5C\u8005\uFF08app-store \u6A21\u578B\uFF09\u3002` + }); + } + let best = versions[0]; + let bestStat = null; + let bestScore = -1; + for (const v of versions) { + const stat = await fetchMarketStat(c.env, v.uuid ?? v.canonical_id); + const score = stat?.success_count ?? 0; + if (score > bestScore) { + bestScore = score; + best = v; + bestStat = stat; + } + } + return c.json({ found: true, recipe: best, market_stat: bestStat }); + }); + recipesRouter.delete("/recipes/:id", async (c) => { + const id = c.req.param("id"); + const recipe = await resolveRecipe(id, c.env.RECIPES); + if (!recipe) return c.json({ success: false, error: `\u627E\u4E0D\u5230 recipe: ${id}` }, 404); + const canonicalId = recipe.canonical_id; + const ops = [ + c.env.RECIPES.delete(`idx:${recipe.hash_id}`), + c.env.RECIPES.delete(`recipe:${canonicalId}`) + // 舊 key(若存在) + ]; + if (recipe.uuid) { + ops.push(c.env.RECIPES.delete(`recipe:${recipe.uuid}`)); + const listRaw = await c.env.RECIPES.get(kIdxCanonical(canonicalId)); + const uuids = listRaw ? JSON.parse(listRaw) : []; + const left = uuids.filter((u) => u !== recipe.uuid); + if (left.length > 0) { + ops.push(c.env.RECIPES.put(kIdxCanonical(canonicalId), JSON.stringify(left))); + const installed = await c.env.RECIPES.get(kIdxInstalled(canonicalId)); + if (installed === recipe.uuid) ops.push(c.env.RECIPES.put(kIdxInstalled(canonicalId), left[0])); + } else { + ops.push(c.env.RECIPES.delete(kIdxCanonical(canonicalId))); + ops.push(c.env.RECIPES.delete(kIdxInstalled(canonicalId))); + } + } + await Promise.all(ops); + return c.json({ success: true, deleted: recipe.uuid ?? canonicalId }); + }); + recipesRouter.post("/auth-recipes", async (c) => { + let body; + try { + body = await c.req.json(); + } catch { + return c.json({ success: false, error: "request body \u5FC5\u9808\u70BA JSON" }, 400); + } + const service = (body.service ?? "").trim().toLowerCase(); + if (!service) return c.json({ success: false, error: "service \u5FC5\u586B" }, 400); + if (!body.primitive) return c.json({ success: false, error: "primitive \u5FC5\u586B" }, 400); + if (!body.base_url) return c.json({ success: false, error: "base_url \u5FC5\u586B" }, 400); + if (!body.required_secrets?.length) return c.json({ success: false, error: "required_secrets \u5FC5\u586B" }, 400); + if (!body.inject) return c.json({ success: false, error: "inject \u5FC5\u586B" }, 400); + const missingHelp = body.required_secrets.filter((s) => !s.help_url || !/^https?:\/\//.test(s.help_url)); + if (missingHelp.length > 0) { + return c.json({ + success: false, + error: `\u6BCF\u500B required_secret \u5FC5\u9808\u6709 help_url\uFF08\u5B98\u65B9\u6587\u4EF6\u9023\u7D50\uFF0Chttp(s)://\uFF09\u3002\u7F3A\uFF1A${missingHelp.map((s) => s.key).join(", ")}`, + requires: "help_url" + }, 400); + } + const now2 = Date.now(); + const existing = await c.env.RECIPES.get(`auth_recipe:${service}`, "json"); + const recipe = { + kind: "auth_recipe", + service, + version: body.version ?? 1, + primitive: body.primitive, + base_url: body.base_url, + display_name: body.display_name, + description: body.description, + service_account_kind: body.service_account_kind, + token_exchange: body.token_exchange, + required_secrets: body.required_secrets, + inject: body.inject, + created_at: existing?.created_at ?? now2, + updated_at: now2 + }; + await c.env.RECIPES.put(`auth_recipe:${service}`, JSON.stringify(recipe)); + return c.json({ success: true, recipe }); + }); + recipesRouter.get("/auth-recipes", async (c) => { + const list = await c.env.RECIPES.list({ prefix: "auth_recipe:" }); + const recipes = await Promise.all( + list.keys.map((k) => c.env.RECIPES.get(k.name, "json")) + ); + return c.json({ success: true, recipes: recipes.filter(Boolean), count: recipes.length }); + }); + recipesRouter.get("/auth-recipes/:service", async (c) => { + const service = c.req.param("service"); + const recipe = await resolveAuthRecipe(service, c.env.RECIPES); + if (!recipe) return c.json({ success: false, error: `\u627E\u4E0D\u5230 auth recipe: ${service}` }, 404); + return c.json({ success: true, recipe }); + }); + recipesRouter.delete("/auth-recipes/:service", async (c) => { + const service = c.req.param("service"); + const recipe = await resolveAuthRecipe(service, c.env.RECIPES); + if (!recipe) return c.json({ success: false, error: `\u627E\u4E0D\u5230 auth recipe: ${service}` }, 404); + await c.env.RECIPES.delete(`auth_recipe:${service}`); + return c.json({ success: true, deleted: service }); + }); + } +}); + +// cypher-executor/src/lib/constants.ts +var VALID_EDGE_TYPES, SEMANTIC_EDGE_MAP, BUILTIN_COMPONENTS; +var init_constants3 = __esm({ + "cypher-executor/src/lib/constants.ts"() { + "use strict"; + VALID_EDGE_TYPES = /* @__PURE__ */ new Set([ + // 現有 + "PIPE", + "IF", + "FOREACH", + "CONTINUE", + // 新增:執行語意 + "IS_A", + "ON_SUCCESS", + "ON_FAIL", + // 新增:條件語意(SDD workflow-discovery 3.11)—— 讀上游 if_control/switch 的 branch + "ON_TRUE", + "ON_FALSE", + "ON_BRANCH", + // 新增:觸發語意 + "ON_CLICK", + "CALLS_SUBFLOW", + // 新增:結構語意(記錄圖結構,不執行) + "CONTAINS", + "HAS_STYLE", + "HAS_BEHAVIOR" + ]); + SEMANTIC_EDGE_MAP = { + // 中文語意詞 + "\u5B8C\u6210\u5F8C": "PIPE", + "\u5931\u6557\u6642": "ON_FAIL", + "\u5C0D\u6BCF\u500B": "FOREACH", + "\u689D\u4EF6\u6EFF\u8DB3\u6642": "IF", + // 條件分支語意(SDD workflow-discovery 3.11):讓意圖工作流寫得出兩條路 + "\u6210\u7ACB\u6642": "ON_TRUE", + "\u70BA\u771F\u6642": "ON_TRUE", + "\u4E0D\u6210\u7ACB\u6642": "ON_FALSE", + "\u70BA\u5047\u6642": "ON_FALSE", + "\u5426\u5247": "ON_FALSE", + // 英文別名 + "SUCCESS": "ON_SUCCESS", + "FAIL": "ON_FAIL", + "TRUE": "ON_TRUE", + "FALSE": "ON_FALSE", + "ELSE": "ON_FALSE", + "BRANCH": "ON_BRANCH", + "CLICK": "ON_CLICK", + "SUBFLOW": "CALLS_SUBFLOW" + }; + BUILTIN_COMPONENTS = /* @__PURE__ */ new Map([ + ["comp_passthrough", (ctx) => ctx], + ["comp_uppercase", (ctx) => { + const c = ctx; + return { ...c, text: String(c.text || "").toUpperCase() }; + }], + ["comp_counter", (ctx) => { + const c = ctx; + return { ...c, count: (Number(c.count) || 0) + 1 }; + }] + ]); + } +}); + +// cypher-executor/src/lib/recipe-payload.ts +function getPath2(obj, path) { + let cur = obj; + for (const part of path.split(".")) { + if (cur === null || cur === void 0) return void 0; + if (typeof cur !== "object") return void 0; + cur = cur[part]; + } + return cur; +} +function renderBodyTemplate(template, ctx) { + if (template === void 0 || template === null) return void 0; + return renderValue(template, ctx); +} +function renderValue(v, ctx) { + if (typeof v === "string") return renderString(v, ctx); + if (Array.isArray(v)) return v.map((item) => renderValue(item, ctx)); + if (v !== null && typeof v === "object") { + const out = {}; + for (const [k, val] of Object.entries(v)) { + out[k] = renderValue(val, ctx); + } + return out; + } + return v; +} +function renderString(s, ctx) { + const single = s.match(/^\s*\{\{([\w.]+)\}\}\s*$/); + if (single) { + const val = getPath2(ctx, single[1]); + return val === void 0 ? s : val; + } + return s.replace(/\{\{([\w.]+)\}\}/g, (_, key) => { + const val = getPath2(ctx, key); + if (val === void 0) return `{{${key}}}`; + return typeof val === "string" ? val : JSON.stringify(val); + }); +} +function applyResponseMap(body, map) { + if (!map) return { raw: body }; + let picked = map.text_path ? getPath2(body, map.text_path) : body; + if (map.thinking_model && Array.isArray(picked)) { + const real = picked.filter( + (p) => !(p && typeof p === "object" && p.thought === true) + ); + const last = real[real.length - 1]; + picked = last && typeof last === "object" ? last.text : last; + } + if (typeof picked !== "string") return { text: void 0, raw: body }; + return { text: sanitize(picked, map), raw: body }; +} +function sanitize(input, map) { + let s = input.trim(); + if (map.answer_marker) { + const idx = s.lastIndexOf(map.answer_marker); + if (idx >= 0) s = s.slice(idx + map.answer_marker.length); + } + const prefixes = map.strip_prefixes ?? []; + if (prefixes.length > 0) { + let changed = true; + while (changed) { + changed = false; + s = s.trimStart(); + for (const p of prefixes) { + if (p && s.startsWith(p)) { + s = s.slice(p.length); + changed = true; + } + } + } + } + return s.trim(); +} +var init_recipe_payload = __esm({ + "cypher-executor/src/lib/recipe-payload.ts"() { + "use strict"; + } +}); + +// cypher-executor/src/lib/component-loader.ts +function wasmWorkerUrl(canonicalId, subdomain) { + const kebab = canonicalId.replace(/_/g, "-"); + return `https://arcrun-${kebab}.${subdomain}.workers.dev`; +} +function createComponentLoader(env) { + return async (componentId) => { + if (componentId === "trigger_workflow") { + return makeTriggerWorkflowRunner(env); + } + const builtin = BUILTIN_COMPONENTS.get(componentId); + if (builtin) return builtin; + if (componentId.startsWith("http://") || componentId.startsWith("https://")) { + return makeHttpRunner(componentId); + } + if (isComponentHash(componentId)) { + const canonicalId = await env.WEBHOOKS.get(`idx:${componentId}`); + if (canonicalId) { + const runner = makeLogicRunner(canonicalId, env); + if (runner) return runner; + } + throw new Error(`\u627E\u4E0D\u5230\u96F6\u4EF6 hash "${componentId}"\uFF0C\u8ACB\u78BA\u8A8D\u5DF2\u900F\u904E acr push \u4E0A\u50B3`); + } + if (isRecipeHash(componentId)) { + const recipe = await resolveRecipe(componentId, env.RECIPES); + if (recipe) return pickRecipeRunner(recipe, env); + throw new Error(`\u627E\u4E0D\u5230 recipe hash "${componentId}"\uFF0C\u8ACB\u78BA\u8A8D\u5DF2\u900F\u904E acr push \u4E0A\u50B3`); + } + const logicRunner = makeLogicRunner(componentId, env); + if (logicRunner) return logicRunner; + const authRecipe = await resolveAuthRecipe(componentId, env.RECIPES); + if (authRecipe) return makeAuthRecipeRunner(authRecipe); + const kvRecipe = await resolveRecipe(componentId, env.RECIPES); + if (kvRecipe) return pickRecipeRunner(kvRecipe, env); + if (WASM_HTTP_RUNNER_IDS.has(componentId)) { + return makeHttpRunner(wasmWorkerUrl(componentId, env.WORKER_SUBDOMAIN)); + } + throw new Error( + `\u627E\u4E0D\u5230\u96F6\u4EF6 "${componentId}"\u3002 +\u908F\u8F2F\u96F6\u4EF6\uFF1A${Object.keys(LOGIC_BINDING_MAP).join(", ")} +\u6216\u50B3\u5165\u5916\u90E8 URL\uFF08https://...\uFF09\u3001recipe hash\uFF08rec_xxxxxxxx\uFF09\u3001\u96F6\u4EF6 hash\uFF08cmp_xxxxxxxx\uFF09` + ); + }; +} +function makeTriggerWorkflowRunner(env) { + return async (ctx) => { + const c = ctx && typeof ctx === "object" ? ctx : {}; + const workflowName = String(c.workflow_name ?? ""); + const apiKey = String(c.api_key ?? ""); + const input = c.input && typeof c.input === "object" ? c.input : {}; + const wait = c.wait !== false; + if (!workflowName) return { success: false, error: "trigger_workflow \u7F3A workflow_name" }; + if (!apiKey) return { success: false, error: "trigger_workflow \u7F3A api_key" }; + const wfKey = `${apiKey}:wf:${workflowName}`; + const wfRaw = await env.WEBHOOKS.get(wfKey, "text"); + if (!wfRaw) return { success: false, error: `\u627E\u4E0D\u5230 workflow "${workflowName}" (key=${wfKey})` }; + let record; + try { + record = JSON.parse(wfRaw); + } catch { + return { success: false, error: `workflow "${workflowName}" KV \u5167\u5BB9\u975E JSON` }; + } + if (!record.graph) return { success: false, error: `workflow "${workflowName}" \u7F3A graph \u6B04\u4F4D` }; + const { executeWebhookGraph: executeWebhookGraph2 } = await Promise.resolve().then(() => (init_webhook_handlers(), webhook_handlers_exports)); + const triggerContext = { ...input, _triggered_by: "trigger_workflow" }; + if (wait) { + const r = await executeWebhookGraph2(env, record.graph, triggerContext, workflowName, apiKey); + const isPaused = !r.success && typeof r.error === "string" && /workflow paused/i.test(r.error); + return { + success: r.success || isPaused, + triggered_workflow: workflowName, + status: r.success ? "completed" : isPaused ? "running_async" : "failed", + sub_result: r + }; + } else { + void executeWebhookGraph2(env, record.graph, triggerContext, workflowName, apiKey).catch((e) => console.error("[trigger_workflow] fire-and-forget fail", workflowName, e)); + return { success: true, triggered_workflow: workflowName, mode: "fire_and_forget" }; + } + }; +} +function makeHttpRunner(url) { + return async (ctx) => { + const res = await fetch(url, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(ctx) + }); + if (!res.ok) { + const text = await res.text(); + return { success: false, status: res.status, error: text.slice(0, 200) }; + } + try { + return await res.json(); + } catch { + return { success: true, data: await res.text() }; + } + }; +} +function makeLogicRunner(canonicalId, env) { + const bindingKey = LOGIC_BINDING_MAP[canonicalId]; + if (!bindingKey) return null; + const svc = env[bindingKey]; + if (svc) { + return async (ctx) => { + const res = await svc.fetch(new Request("https://component/", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(ctx) + })); + if (!res.ok) { + const text = await res.text(); + return { success: false, error: `${canonicalId} \u56DE\u50B3 ${res.status}: ${text.slice(0, 200)}` }; + } + try { + return await res.json(); + } catch { + return { success: false, error: `${canonicalId} \u56DE\u50B3\u975E JSON` }; + } + }; + } + return makeHttpRunner(wasmWorkerUrl(canonicalId, env.WORKER_SUBDOMAIN)); +} +function pickRecipeRunner(recipe, env) { + return recipe.auth === "binding" ? makeBindingRecipeRunner(recipe, env) : makeRecipeRunner(recipe); +} +function makeBindingRecipeRunner(recipe, env) { + return async (ctx) => { + const ctxObj = ctx && typeof ctx === "object" ? ctx : {}; + const name = recipe.binding_name ?? "AI"; + const binding = env[name]; + if (!binding) { + return { + success: false, + error: `recipe "${recipe.canonical_id}" \u5BA3\u544A auth: binding\u3001binding_name: "${name}"\uFF0C\u4F46\u9019\u500B\u90E8\u7F72\u6C92\u6709\u7D81\u5B9A ${name}\u3002\u8ACB\u5728 wrangler.toml \u88DC\u4E0A\u8A72 binding \u5F8C\u91CD\u65B0\u90E8\u7F72\u3002` + }; + } + const target = recipe.endpoint; + const payload = renderBodyTemplate(recipe.body_template ?? recipe.body, ctxObj) ?? Object.fromEntries(Object.entries(ctxObj).filter(([k]) => !k.startsWith("_"))); + try { + const runner = binding; + if (typeof runner.run !== "function") { + return { + success: false, + error: `binding "${name}" \u6C92\u6709 run() \u65B9\u6CD5\uFF0C\u76EE\u524D binding \u578B\u53EA\u652F\u63F4 run(model, input) \u5F62\u72C0\uFF08\u5982 env.AI\uFF09\u3002` + }; + } + const data = await runner.run(target, payload); + if (recipe.response_map) { + const normalized = applyResponseMap(data, recipe.response_map); + return { success: true, data, text: normalized.text }; + } + return { success: true, data }; + } catch (e) { + return { + success: false, + error: `binding "${name}" \u547C\u53EB\u5931\u6557\uFF08${target}\uFF09\uFF1A${e instanceof Error ? e.message : String(e)}` + }; + } + }; +} +function makeRecipeRunner(recipe) { + return async (ctx) => { + const ctxObj = ctx && typeof ctx === "object" ? ctx : {}; + const authPath = ctxObj._auth_path ?? {}; + const interpolate2 = (s) => s.replace( + /\{\{(auth\.)?(\w+)\}\}/g, + (_, authPrefix, k) => String(authPrefix ? authPath[k] ?? "" : ctxObj[k] ?? "") + ); + const method = (recipe.method ?? "POST").toUpperCase(); + const authHeaders = ctxObj._auth_headers ?? {}; + const headers = { + "Content-Type": "application/json", + ...authHeaders + }; + for (const [k, v] of Object.entries(recipe.headers ?? {})) { + headers[k] = interpolate2(v); + } + let bodyStr; + if (recipe.body_template) { + bodyStr = JSON.stringify(renderBodyTemplate(recipe.body_template, ctxObj)); + } else if (recipe.body) { + bodyStr = interpolate2(JSON.stringify(recipe.body)); + } else if (method !== "GET") { + const bodyObj = Object.fromEntries( + Object.entries(ctxObj).filter(([k]) => !k.startsWith("_")) + ); + bodyStr = JSON.stringify(bodyObj); + } + const res = await fetch(interpolate2(recipe.endpoint), { + method, + headers, + body: bodyStr + }); + const data = await readBodyOnce(res); + if (recipe.response_map) { + const normalized = applyResponseMap(data, recipe.response_map); + return { success: res.ok, status: res.status, data, text: normalized.text }; + } + return { success: res.ok, status: res.status, data }; + }; +} +function makeAuthRecipeRunner(recipe) { + return async (ctx) => { + const ctxObj = ctx && typeof ctx === "object" ? ctx : {}; + const authHeaders = ctxObj._auth_headers ?? {}; + const authQuery = ctxObj._auth_query ?? {}; + const path = typeof ctxObj._path === "string" ? ctxObj._path : ""; + const method = (ctxObj.method ?? "POST").toUpperCase(); + const url = new URL(recipe.base_url.replace(/\/$/, "") + path); + for (const [k, v] of Object.entries(authQuery)) { + url.searchParams.set(k, v); + } + const headers = { + "Content-Type": "application/json", + ...authHeaders + }; + const bodyObj = Object.fromEntries( + Object.entries(ctxObj).filter(([k]) => !k.startsWith("_") && k !== "method") + ); + const res = await fetch(url.toString(), { + method, + headers, + body: method !== "GET" ? JSON.stringify(bodyObj) : void 0 + }); + const data = await readBodyOnce(res); + return { success: res.ok, status: res.status, data }; + }; +} +async function readBodyOnce(res) { + const text = await res.text(); + try { + return JSON.parse(text); + } catch { + return text; + } +} +var WASM_HTTP_RUNNER_IDS, LOGIC_BINDING_MAP; +var init_component_loader = __esm({ + "cypher-executor/src/lib/component-loader.ts"() { + "use strict"; + init_constants3(); + init_hash(); + init_recipes(); + init_recipe_payload(); + WASM_HTTP_RUNNER_IDS = /* @__PURE__ */ new Set([ + // 通用 HTTP 零件 + "http_request", + // 通用 code 零件(sandbox inline JS,Arcrun#10 / 07-thin-shell §3.5 code-node):獨立 Worker, + // URL 走 wasmWorkerUrl 通用推導(arcrun-code.{WORKER_SUBDOMAIN}.workers.dev, + // self-hosted 由 WORKER_SUBDOMAIN var 注入自己的 subdomain,無寫死官方域名)。 + // 漏這行 = workflow 寫 `component: code` 落到 step 8 直接「找不到零件」(#29 發現)。 + "code", + // gmail / telegram / line_notify / google_sheets 已降級為 recipe(2026-05-29 Phase 2): + // recipe:gmail_send / telegram_send / line_notify_send / google_sheets_read|append + // 走 step 6 KV recipe 解析,不再是零件。零件目錄已刪。 + "cron", + // Auth primitives + "auth_static_key", + "auth_service_account", + "auth_oauth2", + "auth_mtls" + ]); + LOGIC_BINDING_MAP = { + if_control: "SVC_IF_CONTROL", + switch: "SVC_SWITCH", + foreach_control: "SVC_FOREACH_CONTROL", + filter: "SVC_FILTER", + merge: "SVC_MERGE", + try_catch: "SVC_TRY_CATCH", + wait: "SVC_WAIT", + set: "SVC_SET", + array_ops: "SVC_ARRAY_OPS", + string_ops: "SVC_STRING_OPS", + number_ops: "SVC_NUMBER_OPS", + date_ops: "SVC_DATE_OPS", + validate_json: "SVC_VALIDATE_JSON" + // ai_transform_compile / ai_transform_run 已刪除(2026-05-29): + // Arcrun 是 AI 呼叫的工具,工作流不該內嵌 AI 節點回頭呼叫 AI(n8n 才需要,因它沒大腦)。 + }; + } +}); + +// cypher-executor/src/lib/wasi-shim.ts +async function routedKvGet(env, apiKey, key) { + if (key.startsWith("auth_recipe:")) { + return env.RECIPES.get(key); + } + const credMatch = key.match(/^([^:]+):cred:.+$/); + if (credMatch) { + if (credMatch[1] !== apiKey) { + return null; + } + return env.CREDENTIALS_KV.get(key); + } + return null; +} +async function routedKvPut(env, apiKey, key, value, ttlSeconds) { + const oauth2Match = key.match(/^([^:]+):oauth2:.+$/); + if (oauth2Match && oauth2Match[1] === apiKey) { + const opts = ttlSeconds > 0 ? { expirationTtl: ttlSeconds } : void 0; + await env.CREDENTIALS_KV.put(key, value, opts); + return; + } +} +async function rsaPkcs1Sha256Sign(data, pkcs8) { + const cryptoKey = await crypto.subtle.importKey( + "pkcs8", + pkcs8, + { name: "RSASSA-PKCS1-v1_5", hash: "SHA-256" }, + false, + ["sign"] + ); + const sig = await crypto.subtle.sign("RSASSA-PKCS1-v1_5", cryptoKey, data); + return new Uint8Array(sig); +} +function secretGet(env, ref) { + if (!/^CRED_/.test(ref)) return null; + const value = env[ref]; + return typeof value === "string" ? value : null; +} +function createArcrunHostFunctions(env, apiKey) { + return { + kv_get: (key) => routedKvGet(env, apiKey, key), + kv_put: (key, value, ttlSeconds) => routedKvPut(env, apiKey, key, value, ttlSeconds), + crypto_sign_rs256: (data, pkcs8) => rsaPkcs1Sha256Sign(data, pkcs8), + secret_get: async (ref) => secretGet(env, ref) + }; +} +var init_wasi_shim = __esm({ + "cypher-executor/src/lib/wasi-shim.ts"() { + "use strict"; + } +}); + +// cypher-executor/src/routes/kbdb-proxy.ts +function kbdbBase(env) { + const base = (env.KBDB_BASE_URL ?? "https://arcrun-kbdb.uncle6-me.workers.dev").replace(/\/$/, ""); + const headers = { "Content-Type": "application/json" }; + if (env.KBDB_INTERNAL_TOKEN) headers["Authorization"] = `Bearer ${env.KBDB_INTERNAL_TOKEN}`; + return { base, headers }; +} +function tenant(c) { + return c.req.header("X-Arcrun-API-Key") ?? null; +} +function graphBase(env) { + if (env.KBDB_GRAPH_URL) return env.KBDB_GRAPH_URL.replace(/\/$/, ""); + return `https://kbdb-graph-plugin.${env.WORKER_SUBDOMAIN}.workers.dev`; +} +var kbdbProxyRouter, NEED_KEY; +var init_kbdb_proxy = __esm({ + "cypher-executor/src/routes/kbdb-proxy.ts"() { + "use strict"; + init_dist(); + kbdbProxyRouter = new Hono2(); + NEED_KEY = { error: "\u7F3A\u5C11 X-Arcrun-API-Key header" }; + kbdbProxyRouter.post("/kbdb/templates", async (c) => { + const owner = tenant(c); + if (!owner) return c.json(NEED_KEY, 401); + const body = await c.req.json().catch(() => null); + if (!body || !body.name || !Array.isArray(body.slots)) { + return c.json({ error: "name \u8207 slots[] \u5FC5\u586B" }, 400); + } + const { base, headers } = kbdbBase(c.env); + const res = await fetch(`${base}/templates`, { + method: "POST", + headers, + // created_by 帶上租戶當溯源,但 template 本身全域可見可用 + body: JSON.stringify({ name: body.name, slots: body.slots, description: body.description, created_by: owner }) + }); + return new Response(res.body, { status: res.status, headers: { "Content-Type": "application/json" } }); + }); + kbdbProxyRouter.get("/kbdb/templates", async (c) => { + if (!tenant(c)) return c.json(NEED_KEY, 401); + const { base, headers } = kbdbBase(c.env); + const res = await fetch(`${base}/templates`, { headers }); + return new Response(res.body, { status: res.status, headers: { "Content-Type": "application/json" } }); + }); + kbdbProxyRouter.get("/kbdb/templates/:idOrName", async (c) => { + if (!tenant(c)) return c.json(NEED_KEY, 401); + const { base, headers } = kbdbBase(c.env); + const res = await fetch(`${base}/templates/${encodeURIComponent(c.req.param("idOrName"))}`, { headers }); + return new Response(res.body, { status: res.status, headers: { "Content-Type": "application/json" } }); + }); + kbdbProxyRouter.post("/kbdb/records", async (c) => { + const owner = tenant(c); + if (!owner) return c.json(NEED_KEY, 401); + const body = await c.req.json().catch(() => null); + if (!body || !body.template || !body.values) { + return c.json({ error: "template \u8207 values \u5FC5\u586B" }, 400); + } + const { base, headers } = kbdbBase(c.env); + const res = await fetch(`${base}/records`, { + method: "POST", + headers, + // 強制以租戶身份隔離:忽略 caller 自帶 owner_id,一律用 header 身份(防跨租戶寫入) + body: JSON.stringify({ template: body.template, values: body.values, owner_id: owner }) + }); + return new Response(res.body, { status: res.status, headers: { "Content-Type": "application/json" } }); + }); + kbdbProxyRouter.get("/kbdb/records/by-template/:template", async (c) => { + const owner = tenant(c); + if (!owner) return c.json(NEED_KEY, 401); + const { base, headers } = kbdbBase(c.env); + const res = await fetch( + `${base}/records/by-template/${encodeURIComponent(c.req.param("template"))}?owner_id=${encodeURIComponent(owner)}`, + { headers } + ); + return new Response(res.body, { status: res.status, headers: { "Content-Type": "application/json" } }); + }); + kbdbProxyRouter.get("/kbdb/records/:recordId", async (c) => { + if (!tenant(c)) return c.json(NEED_KEY, 401); + const { base, headers } = kbdbBase(c.env); + const res = await fetch(`${base}/records/${encodeURIComponent(c.req.param("recordId"))}`, { headers }); + return new Response(res.body, { status: res.status, headers: { "Content-Type": "application/json" } }); + }); + kbdbProxyRouter.get("/kbdb/search", async (c) => { + const owner = tenant(c); + if (!owner) return c.json(NEED_KEY, 401); + const q = c.req.query("q"); + if (!q) return c.json({ error: "q \u5FC5\u586B" }, 400); + const { base, headers } = kbdbBase(c.env); + const params = new URLSearchParams({ q, owner_id: owner }); + for (const k of ["entry_type", "source", "library", "mode"]) { + const v = c.req.query(k); + if (v) params.set(k, v); + } + const res = await fetch(`${base}/entries/search?${params.toString()}`, { headers }); + return new Response(res.body, { status: res.status, headers: { "Content-Type": "application/json" } }); + }); + kbdbProxyRouter.post("/kbdb/entries", async (c) => { + const owner = tenant(c); + if (!owner) return c.json(NEED_KEY, 401); + const body = await c.req.json().catch(() => null); + if (!body || !body.entry_type) return c.json({ error: "entry_type \u5FC5\u586B" }, 400); + const { base, headers } = kbdbBase(c.env); + const res = await fetch(`${base}/entries`, { + method: "POST", + headers, + // 強制以租戶身份隔離:忽略 caller 自帶 owner_id,一律用 header 身份(防跨租戶寫入) + body: JSON.stringify({ ...body, owner_id: owner }) + }); + return new Response(res.body, { status: res.status, headers: { "Content-Type": "application/json" } }); + }); + kbdbProxyRouter.get("/kbdb/entries", async (c) => { + const owner = tenant(c); + if (!owner) return c.json(NEED_KEY, 401); + const { base, headers } = kbdbBase(c.env); + const params = new URLSearchParams(); + params.set("owner_id", owner); + for (const k of ["entry_type", "parent_id", "page_name", "source", "library", "limit", "offset"]) { + const v = c.req.query(k); + if (v) params.set(k, v); + } + const q = c.req.query("q") || c.req.query("search"); + if (q) params.set("q", q); + const res = await fetch(`${base}/entries?${params.toString()}`, { headers }); + return new Response(res.body, { status: res.status, headers: { "Content-Type": "application/json" } }); + }); + kbdbProxyRouter.get("/kbdb/entries/:id", async (c) => { + if (!tenant(c)) return c.json(NEED_KEY, 401); + const { base, headers } = kbdbBase(c.env); + const res = await fetch(`${base}/entries/${encodeURIComponent(c.req.param("id"))}`, { headers }); + return new Response(res.body, { status: res.status, headers: { "Content-Type": "application/json" } }); + }); + kbdbProxyRouter.get("/kbdb/graph/neighbors/:name", async (c) => { + if (!tenant(c)) return c.json(NEED_KEY, 401); + const base = graphBase(c.env); + const headers = {}; + if (c.env.KBDB_INTERNAL_TOKEN) headers["Authorization"] = `Bearer ${c.env.KBDB_INTERNAL_TOKEN}`; + try { + const res = await fetch(`${base}/graph/neighbors/${encodeURIComponent(c.req.param("name"))}`, { headers }); + return new Response(res.body, { status: res.status, headers: { "Content-Type": "application/json" } }); + } catch (e) { + return c.json({ error: `kbdb-graph-plugin \u4E0D\u53EF\u9054\uFF08${base}\uFF09\uFF1A${e instanceof Error ? e.message : String(e)}` }, 502); + } + }); + kbdbProxyRouter.get("/kbdb/map", async (c) => { + if (!tenant(c)) return c.json(NEED_KEY, 401); + const { base, headers } = kbdbBase(c.env); + const owner = c.req.query("owner_id"); + const qs = owner ? `?owner_id=${encodeURIComponent(owner)}` : ""; + try { + const res = await fetch(`${base}/map${qs}`, { headers }); + return new Response(res.body, { status: res.status, headers: { "Content-Type": "application/json" } }); + } catch (e) { + return c.json({ success: false, error: `KBDB \u4E0D\u53EF\u9054\uFF08${base}\uFF09\uFF1A${e instanceof Error ? e.message : String(e)}` }, 502); + } + }); + kbdbProxyRouter.get("/kbdb/map/:library", async (c) => { + if (!tenant(c)) return c.json(NEED_KEY, 401); + const { base, headers } = kbdbBase(c.env); + const owner = c.req.query("owner_id"); + const qs = owner ? `?owner_id=${encodeURIComponent(owner)}` : ""; + try { + const res = await fetch(`${base}/map/${encodeURIComponent(c.req.param("library"))}${qs}`, { headers }); + return new Response(res.body, { status: res.status, headers: { "Content-Type": "application/json" } }); + } catch (e) { + return c.json({ success: false, error: `KBDB \u4E0D\u53EF\u9054\uFF08${base}\uFF09\uFF1A${e instanceof Error ? e.message : String(e)}` }, 502); + } + }); + kbdbProxyRouter.patch("/kbdb/entries/:id", async (c) => { + if (!tenant(c)) return c.json(NEED_KEY, 401); + const body = await c.req.json().catch(() => ({})); + const { owner_id: _drop, ...patch } = body ?? {}; + const { base, headers } = kbdbBase(c.env); + const res = await fetch(`${base}/entries/${encodeURIComponent(c.req.param("id"))}`, { + method: "PATCH", + headers, + body: JSON.stringify(patch) + }); + return new Response(res.body, { status: res.status, headers: { "Content-Type": "application/json" } }); + }); + } +}); + +// cypher-executor/src/routes/credentials.ts +async function deriveSecretRef(apiKey, name) { + const hash8 = await sha256Prefix(apiKey); + return `CRED_${name.toUpperCase()}_${hash8.toUpperCase()}`; +} +async function storeCredential(env, apiKey, name, value, service) { + const secretRef = await deriveSecretRef(apiKey, name); + await putWorkerSecret(env, secretRef, value); + await upsertCredentialEntry(env, apiKey, name, service, "standard", secretRef); +} +function validateName(name) { + return typeof name === "string" && /^\w+$/.test(name); +} +function validSensitivity(s) { + return s === "standard" || s === "high"; +} +async function putWorkerSecret(env, secretRef, value) { + if (!env.CF_SECRETS_API_TOKEN || !env.CF_ACCOUNT_ID) { + throw new Error( + "\u6B64 worker \u7F3A CF_SECRETS_API_TOKEN / CF_ACCOUNT_ID \u8A2D\u5B9A\uFF0C\u5BEB\u5165\u8DEF\u5F91\u672A\u5C31\u7DD2\uFF08\u898B credential-store-migration.md T3\uFF1Aacr init/update \u61C9\u78BA\u4FDD\u9019\u5169\u9805\u5C31\u7DD2\uFF09" + ); + } + const url = `https://api.cloudflare.com/client/v4/accounts/${env.CF_ACCOUNT_ID}/workers/scripts/${CYPHER_SCRIPT_NAME}/secrets`; + const res = await fetch(url, { + method: "PUT", + headers: { + Authorization: `Bearer ${env.CF_SECRETS_API_TOKEN}`, + "Content-Type": "application/json" + }, + body: JSON.stringify({ name: secretRef, text: value, type: "secret_text" }) + }); + const body = await res.json().catch(() => null); + if (!res.ok || !body?.success) { + const detail = body?.errors?.map((e) => e.message).filter(Boolean).join("; ") || `HTTP ${res.status}`; + throw new Error(`CF Workers Secrets \u5BEB\u5165\u5931\u6557\uFF1A${detail}`); + } +} +async function deleteWorkerSecret(env, secretRef) { + if (!env.CF_SECRETS_API_TOKEN || !env.CF_ACCOUNT_ID) { + throw new Error("\u6B64 worker \u7F3A CF_SECRETS_API_TOKEN / CF_ACCOUNT_ID \u8A2D\u5B9A\uFF0C\u522A\u9664\u8DEF\u5F91\u672A\u5C31\u7DD2"); + } + const url = `https://api.cloudflare.com/client/v4/accounts/${env.CF_ACCOUNT_ID}/workers/scripts/${CYPHER_SCRIPT_NAME}/secrets/${secretRef}`; + const res = await fetch(url, { + method: "DELETE", + headers: { Authorization: `Bearer ${env.CF_SECRETS_API_TOKEN}` } + }); + if (res.status === 404) return; + const body = await res.json().catch(() => null); + if (!res.ok || !body?.success) { + const detail = body?.errors?.map((e) => e.message).filter(Boolean).join("; ") || `HTTP ${res.status}`; + throw new Error(`CF Workers Secrets \u522A\u9664\u5931\u6557\uFF1A${detail}`); + } +} +function parseMeta(row) { + try { + const m = row.metadata_json ? JSON.parse(row.metadata_json) : {}; + return { + service: typeof m.service === "string" ? m.service : null, + sensitivity: m.sensitivity === "high" ? "high" : "standard", + secret_ref: typeof m.secret_ref === "string" ? m.secret_ref : "", + last_used_at: typeof m.last_used_at === "number" ? m.last_used_at : null + }; + } catch { + return { service: null, sensitivity: "standard", secret_ref: "", last_used_at: null }; + } +} +async function kbdbCredFetch(env, path, init) { + const { base, headers } = kbdbBase(env); + return fetch(`${base}${path}`, { + ...init, + headers: { ...headers, ...init?.headers } + }); +} +function invalidateCredentialCache(apiKey) { + delete dirCache[apiKey]; +} +async function getCredentialDirectory(env, apiKey) { + const now2 = Date.now(); + const cached = dirCache[apiKey]; + if (cached && now2 - cached.fetchedAt < DIR_CACHE_TTL_MS) return cached.rows; + const qs = new URLSearchParams({ owner_id: apiKey, entry_type: CREDENTIAL_ENTRY_TYPE, limit: "200" }); + const res = await kbdbCredFetch(env, `/entries?${qs.toString()}`); + if (!res.ok) { + return []; + } + const body = await res.json().catch(() => null); + const rows = (body?.entries ?? []).filter((e) => !!e.page_name).map((e) => { + const meta = parseMeta(e); + return { + id: e.id, + name: e.page_name, + secret_ref: meta.secret_ref, + service: meta.service, + sensitivity: meta.sensitivity, + last_used_at: meta.last_used_at + }; + }); + dirCache[apiKey] = { rows, fetchedAt: now2 }; + return rows; +} +async function getCredentialSecretRefs(env, apiKey) { + const rows = await getCredentialDirectory(env, apiKey); + const out = {}; + for (const r of rows) { + if (r.secret_ref) out[r.name] = r.secret_ref; + } + return out; +} +function touchLastUsed(env, apiKey, names) { + const cached = dirCache[apiKey]; + if (!cached || names.length === 0) return; + const now2 = Math.floor(Date.now() / 1e3); + for (const r of cached.rows) { + if (!names.includes(r.name)) continue; + const meta = { + service: r.service, + sensitivity: r.sensitivity, + secret_ref: r.secret_ref, + last_used_at: now2 + }; + kbdbCredFetch(env, `/entries/${encodeURIComponent(r.id)}`, { + method: "PATCH", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ metadata_json: JSON.stringify(meta) }) + }).catch(() => { + }); + r.last_used_at = now2; + } +} +async function findCredentialEntry(env, apiKey, name) { + const qs = new URLSearchParams({ + owner_id: apiKey, + entry_type: CREDENTIAL_ENTRY_TYPE, + page_name: name, + limit: "1" + }); + const res = await kbdbCredFetch(env, `/entries?${qs.toString()}`); + if (!res.ok) throw new Error(`KBDB /entries \u67E5\u8A62\u5931\u6557\uFF1AHTTP ${res.status}`); + const body = await res.json().catch(() => null); + return body?.entries?.[0] ?? null; +} +async function upsertCredentialEntry(env, apiKey, name, service, sensitivity, secretRef) { + const existing = await findCredentialEntry(env, apiKey, name); + const meta = { + service, + sensitivity, + secret_ref: secretRef, + last_used_at: existing ? parseMeta(existing).last_used_at : null + }; + if (existing) { + const res = await kbdbCredFetch(env, `/entries/${encodeURIComponent(existing.id)}`, { + method: "PATCH", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ metadata_json: JSON.stringify(meta) }) + }); + if (!res.ok) throw new Error(`credential \u76EE\u9304\u66F4\u65B0\u5931\u6557\uFF1AHTTP ${res.status}`); + } else { + const res = await kbdbCredFetch(env, `/entries`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + entry_type: CREDENTIAL_ENTRY_TYPE, + owner_id: apiKey, + page_name: name, + metadata_json: JSON.stringify(meta) + }) + }); + if (!res.ok) throw new Error(`credential \u76EE\u9304\u5EFA\u7ACB\u5931\u6557\uFF1AHTTP ${res.status}`); + } + invalidateCredentialCache(apiKey); +} +async function listCredentialRows(env, apiKey) { + const qs = new URLSearchParams({ owner_id: apiKey, entry_type: CREDENTIAL_ENTRY_TYPE, limit: "200" }); + const res = await kbdbCredFetch(env, `/entries?${qs.toString()}`); + if (!res.ok) throw new Error(`credential \u76EE\u9304\u67E5\u8A62\u5931\u6557\uFF1AHTTP ${res.status}`); + const body = await res.json().catch(() => null); + const rows = (body?.entries ?? []).filter((e) => !!e.page_name).map((e) => { + const meta = parseMeta(e); + return { name: e.page_name, service: meta.service, sensitivity: meta.sensitivity, created_at: e.created_at, last_used_at: meta.last_used_at }; + }); + return rows; +} +async function hasCredential(env, apiKey, name) { + const entry = await findCredentialEntry(env, apiKey, name); + return entry !== null; +} +async function writeCredential(env, apiKey, name, value, service, sensitivityRaw) { + const sensitivity = validSensitivity(sensitivityRaw) ? sensitivityRaw : "standard"; + const secretRef = await deriveSecretRef(apiKey, name); + await putWorkerSecret(env, secretRef, value); + await upsertCredentialEntry(env, apiKey, name, service ?? null, sensitivity, secretRef); + return { secretRef, sensitivity }; +} +var credentialsRouter, CYPHER_SCRIPT_NAME, CREDENTIAL_ENTRY_TYPE, DIR_CACHE_TTL_MS, dirCache; +var init_credentials = __esm({ + "cypher-executor/src/routes/credentials.ts"() { + "use strict"; + init_dist(); + init_hash(); + init_kbdb_proxy(); + credentialsRouter = new Hono2(); + CYPHER_SCRIPT_NAME = "arcrun-cypher-executor"; + CREDENTIAL_ENTRY_TYPE = "credential"; + DIR_CACHE_TTL_MS = 6e4; + dirCache = {}; + credentialsRouter.post("/credentials", async (c) => { + const apiKey = c.req.header("X-Arcrun-API-Key"); + if (!apiKey) { + return c.json({ error: "\u7F3A\u5C11 X-Arcrun-API-Key header" }, 401); + } + const body = await c.req.json().catch(() => null); + if (!validateName(body?.name)) { + return c.json({ error: "name \u5FC5\u586B\uFF0C\u53EA\u80FD\u5305\u542B\u82F1\u6587\u5B57\u6BCD\u3001\u6578\u5B57\u548C\u5E95\u7DDA" }, 400); + } + if (!body?.value || typeof body.value !== "string") { + return c.json({ error: "value \u5FC5\u586B\uFF08credential \u660E\u6587\u503C\uFF0C\u7D93 TLS \u50B3\u8F38\uFF09" }, 400); + } + try { + const { secretRef, sensitivity } = await writeCredential( + c.env, + apiKey, + body.name, + body.value, + body.service, + body.sensitivity + ); + return c.json({ success: true, name: body.name, service: body.service ?? null, sensitivity, secret_ref: secretRef }); + } catch (e) { + return c.json({ success: false, error: e instanceof Error ? e.message : String(e) }, 502); + } + }); + credentialsRouter.put("/credentials/:name", async (c) => { + const apiKey = c.req.header("X-Arcrun-API-Key"); + if (!apiKey) { + return c.json({ error: "\u7F3A\u5C11 X-Arcrun-API-Key header" }, 401); + } + const name = c.req.param("name"); + if (!validateName(name)) { + return c.json({ error: "name \u53EA\u80FD\u5305\u542B\u82F1\u6587\u5B57\u6BCD\u3001\u6578\u5B57\u548C\u5E95\u7DDA" }, 400); + } + const body = await c.req.json().catch(() => null); + if (!body?.value || typeof body.value !== "string") { + return c.json({ error: "value \u5FC5\u586B\uFF08credential \u660E\u6587\u503C\uFF0C\u7D93 TLS \u50B3\u8F38\uFF09" }, 400); + } + try { + const { secretRef, sensitivity } = await writeCredential( + c.env, + apiKey, + name, + body.value, + body.service, + body.sensitivity + ); + return c.json({ success: true, name, service: body.service ?? null, sensitivity, secret_ref: secretRef }); + } catch (e) { + return c.json({ success: false, error: e instanceof Error ? e.message : String(e) }, 502); + } + }); + credentialsRouter.delete("/credentials/:name", async (c) => { + const apiKey = c.req.header("X-Arcrun-API-Key"); + if (!apiKey) { + return c.json({ error: "\u7F3A\u5C11 X-Arcrun-API-Key header" }, 401); + } + const name = c.req.param("name"); + try { + const entry = await findCredentialEntry(c.env, apiKey, name); + if (entry) { + const meta = parseMeta(entry); + if (meta.secret_ref) await deleteWorkerSecret(c.env, meta.secret_ref); + const res = await kbdbCredFetch(c.env, `/entries/${encodeURIComponent(entry.id)}`, { method: "DELETE" }); + if (!res.ok) throw new Error(`credential \u76EE\u9304\u522A\u9664\u5931\u6557\uFF1AHTTP ${res.status}`); + invalidateCredentialCache(apiKey); + return c.json({ success: true, name, source: "workers-secrets" }); + } + await c.env.CREDENTIALS_KV.delete(`${apiKey}:cred:${name}`); + return c.json({ success: true, name, source: "legacy-kv" }); + } catch (e) { + return c.json({ success: false, error: e instanceof Error ? e.message : String(e) }, 502); + } + }); + credentialsRouter.get("/credentials/catalog", async (c) => { + const apiKey = c.req.header("X-Arcrun-API-Key"); + if (!apiKey) { + return c.json({ error: "\u7F3A\u5C11 X-Arcrun-API-Key header" }, 401); + } + try { + const rows = await listCredentialRows(c.env, apiKey); + return c.json({ success: true, credentials: rows, total: rows.length }); + } catch (e) { + return c.json({ success: false, error: e instanceof Error ? e.message : String(e) }, 502); + } + }); + credentialsRouter.get("/credentials", async (c) => { + const apiKey = c.req.header("X-Arcrun-API-Key"); + if (!apiKey) { + return c.json({ error: "\u7F3A\u5C11 X-Arcrun-API-Key header" }, 401); + } + try { + const rows = await listCredentialRows(c.env, apiKey); + return c.json({ success: true, credentials: rows, total: rows.length }); + } catch (e) { + return c.json({ success: false, error: e instanceof Error ? e.message : String(e) }, 502); + } + }); + } +}); + +// cypher-executor/src/actions/auth-dispatcher.ts +async function resolveSecretsFromNewHome(env, apiKey, names) { + const resolved = {}; + if (names.length === 0) return resolved; + const refs = await getCredentialSecretRefs(env, apiKey); + if (Object.keys(refs).length === 0) return resolved; + const secretGet2 = createArcrunHostFunctions(env, apiKey).secret_get; + if (!secretGet2) return resolved; + const resolvedNames = []; + for (const name of names) { + const ref = refs[name]; + if (!ref) continue; + const value = await secretGet2(ref); + if (value === null) continue; + resolved[name] = value; + resolvedNames.push(name); + } + if (resolvedNames.length > 0) touchLastUsed(env, apiKey, resolvedNames); + return resolved; +} +async function tryAuthDispatch(componentId, input, env, apiKey) { + if (AUTH_PRIMITIVE_IDS.has(componentId)) { + return null; + } + let service = componentId; + const apiRecipe = await resolveRecipe(componentId, env.RECIPES); + if (apiRecipe?.auth_service) { + service = apiRecipe.auth_service; + } + const recipe = await resolveAuthRecipe(service, env.RECIPES); + if (!recipe) return null; + if (!SUPPORTED_PRIMITIVES.has(recipe.primitive)) return null; + const secretNames = recipe.required_secrets.filter((s) => !s.optional).map((s) => s.key); + const resolvedSecrets = await resolveSecretsFromNewHome(env, apiKey, secretNames); + const primitiveUrl = wasmWorkerUrl(`auth_${recipe.primitive}`, env.WORKER_SUBDOMAIN); + const res = await fetch(primitiveUrl, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + action: "authenticate", + api_key: apiKey, + service, + // 只在有取到值時帶上(空物件也無妨,WASM 對 nil/空 map 同樣 fallback) + resolved_secrets: resolvedSecrets + }) + }); + if (!res.ok) { + const text = await res.text().catch(() => ""); + throw new Error( + `auth primitive "${recipe.primitive}" \u56DE\u50B3 ${res.status}: ${text.slice(0, 200)}` + ); + } + const result = await res.json().catch(() => null); + if (!result || result.success === false) { + throw new Error( + `auth primitive \u5931\u6557: ${result?.error ?? "\u672A\u77E5\u932F\u8AA4"}` + ); + } + return { + ...input, + _auth_headers: result.auth_headers ?? {}, + _auth_query: result.auth_query ?? {}, + _auth_body: result.auth_body ?? {}, + _auth_path: result.auth_path ?? {} + }; +} +function collectCredentialNames(value, out) { + if (typeof value === "string") { + for (const m of value.matchAll(CREDENTIAL_REF)) out.add(m[1]); + } else if (Array.isArray(value)) { + for (const v of value) collectCredentialNames(v, out); + } else if (value && typeof value === "object") { + for (const v of Object.values(value)) collectCredentialNames(v, out); + } +} +function replaceCredentialRefs(value, resolved) { + if (typeof value === "string") { + return value.replace( + CREDENTIAL_REF, + (orig, name) => Object.prototype.hasOwnProperty.call(resolved, name) ? resolved[name] : orig + ); + } + if (Array.isArray(value)) return value.map((v) => replaceCredentialRefs(v, resolved)); + if (value && typeof value === "object") { + const out = {}; + for (const [k, v] of Object.entries(value)) { + out[k] = replaceCredentialRefs(v, resolved); + } + return out; + } + return value; +} +async function resolveCredentialRefs(data, env, apiKey) { + const names = /* @__PURE__ */ new Set(); + collectCredentialNames(data, names); + if (names.size === 0) return data; + const nameList = [...names]; + const resolvedSecrets = await resolveSecretsFromNewHome(env, apiKey, nameList); + const url = wasmWorkerUrl("auth_static_key", env.WORKER_SUBDOMAIN); + const res = await fetch(url, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + action: "resolve_credentials", + api_key: apiKey, + names: nameList, + resolved_secrets: resolvedSecrets + }) + }); + if (!res.ok) { + const text = await res.text().catch(() => ""); + throw new Error(`credential resolve \u56DE\u50B3 ${res.status}: ${text.slice(0, 200)}`); + } + const result = await res.json().catch(() => null); + if (!result || result.success === false) { + throw new Error(`credential resolve \u5931\u6557: ${result?.error ?? "\u672A\u77E5\u932F\u8AA4"}`); + } + return replaceCredentialRefs(data, result.credentials ?? {}); +} +var SUPPORTED_PRIMITIVES, AUTH_PRIMITIVE_IDS, CREDENTIAL_REF; +var init_auth_dispatcher = __esm({ + "cypher-executor/src/actions/auth-dispatcher.ts"() { + "use strict"; + init_recipes(); + init_component_loader(); + init_wasi_shim(); + init_credentials(); + SUPPORTED_PRIMITIVES = /* @__PURE__ */ new Set(["static_key", "service_account", "oauth2"]); + AUTH_PRIMITIVE_IDS = /* @__PURE__ */ new Set([ + "auth_static_key", + "auth_service_account", + "auth_oauth2", + "auth_mtls" + ]); + CREDENTIAL_REF = /\{\{credential\.(\w+)\}\}/g; + } +}); + +// cypher-executor/node_modules/.pnpm/zod@3.23.8/node_modules/zod/lib/index.mjs +function setErrorMap(map) { + overrideErrorMap = map; +} +function getErrorMap() { + return overrideErrorMap; +} +function addIssueToContext(ctx, issueData) { + const overrideMap = getErrorMap(); + const issue = makeIssue({ + issueData, + data: ctx.data, + path: ctx.path, + errorMaps: [ + ctx.common.contextualErrorMap, + ctx.schemaErrorMap, + overrideMap, + overrideMap === errorMap ? void 0 : errorMap + // then global default map + ].filter((x) => !!x) + }); + ctx.common.issues.push(issue); +} +function __classPrivateFieldGet(receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); +} +function __classPrivateFieldSet(receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value), value; +} +function processCreateParams(params) { + if (!params) + return {}; + const { errorMap: errorMap2, invalid_type_error, required_error, description } = params; + if (errorMap2 && (invalid_type_error || required_error)) { + throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`); + } + if (errorMap2) + return { errorMap: errorMap2, description }; + const customMap = (iss, ctx) => { + var _a, _b; + const { message } = params; + if (iss.code === "invalid_enum_value") { + return { message: message !== null && message !== void 0 ? message : ctx.defaultError }; + } + if (typeof ctx.data === "undefined") { + return { message: (_a = message !== null && message !== void 0 ? message : required_error) !== null && _a !== void 0 ? _a : ctx.defaultError }; + } + if (iss.code !== "invalid_type") + return { message: ctx.defaultError }; + return { message: (_b = message !== null && message !== void 0 ? message : invalid_type_error) !== null && _b !== void 0 ? _b : ctx.defaultError }; + }; + return { errorMap: customMap, description }; +} +function timeRegexSource(args) { + let regex = `([01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d`; + if (args.precision) { + regex = `${regex}\\.\\d{${args.precision}}`; + } else if (args.precision == null) { + regex = `${regex}(\\.\\d+)?`; + } + return regex; +} +function timeRegex(args) { + return new RegExp(`^${timeRegexSource(args)}$`); +} +function datetimeRegex(args) { + let regex = `${dateRegexSource}T${timeRegexSource(args)}`; + const opts = []; + opts.push(args.local ? `Z?` : `Z`); + if (args.offset) + opts.push(`([+-]\\d{2}:?\\d{2})`); + regex = `${regex}(${opts.join("|")})`; + return new RegExp(`^${regex}$`); +} +function isValidIP(ip, version) { + if ((version === "v4" || !version) && ipv4Regex.test(ip)) { + return true; + } + if ((version === "v6" || !version) && ipv6Regex.test(ip)) { + return true; + } + return false; +} +function floatSafeRemainder(val, step) { + const valDecCount = (val.toString().split(".")[1] || "").length; + const stepDecCount = (step.toString().split(".")[1] || "").length; + const decCount = valDecCount > stepDecCount ? valDecCount : stepDecCount; + const valInt = parseInt(val.toFixed(decCount).replace(".", "")); + const stepInt = parseInt(step.toFixed(decCount).replace(".", "")); + return valInt % stepInt / Math.pow(10, decCount); +} +function deepPartialify(schema) { + if (schema instanceof ZodObject) { + const newShape = {}; + for (const key in schema.shape) { + const fieldSchema = schema.shape[key]; + newShape[key] = ZodOptional.create(deepPartialify(fieldSchema)); + } + return new ZodObject({ + ...schema._def, + shape: () => newShape + }); + } else if (schema instanceof ZodArray) { + return new ZodArray({ + ...schema._def, + type: deepPartialify(schema.element) + }); + } else if (schema instanceof ZodOptional) { + return ZodOptional.create(deepPartialify(schema.unwrap())); + } else if (schema instanceof ZodNullable) { + return ZodNullable.create(deepPartialify(schema.unwrap())); + } else if (schema instanceof ZodTuple) { + return ZodTuple.create(schema.items.map((item) => deepPartialify(item))); + } else { + return schema; + } +} +function mergeValues(a, b) { + const aType = getParsedType(a); + const bType = getParsedType(b); + if (a === b) { + return { valid: true, data: a }; + } else if (aType === ZodParsedType.object && bType === ZodParsedType.object) { + const bKeys = util.objectKeys(b); + const sharedKeys = util.objectKeys(a).filter((key) => bKeys.indexOf(key) !== -1); + const newObj = { ...a, ...b }; + for (const key of sharedKeys) { + const sharedValue = mergeValues(a[key], b[key]); + if (!sharedValue.valid) { + return { valid: false }; + } + newObj[key] = sharedValue.data; + } + return { valid: true, data: newObj }; + } else if (aType === ZodParsedType.array && bType === ZodParsedType.array) { + if (a.length !== b.length) { + return { valid: false }; + } + const newArray = []; + for (let index = 0; index < a.length; index++) { + const itemA = a[index]; + const itemB = b[index]; + const sharedValue = mergeValues(itemA, itemB); + if (!sharedValue.valid) { + return { valid: false }; + } + newArray.push(sharedValue.data); + } + return { valid: true, data: newArray }; + } else if (aType === ZodParsedType.date && bType === ZodParsedType.date && +a === +b) { + return { valid: true, data: a }; + } else { + return { valid: false }; + } +} +function createZodEnum(values, params) { + return new ZodEnum({ + values, + typeName: ZodFirstPartyTypeKind.ZodEnum, + ...processCreateParams(params) + }); +} +function custom(check, params = {}, fatal) { + if (check) + return ZodAny.create().superRefine((data, ctx) => { + var _a, _b; + if (!check(data)) { + const p = typeof params === "function" ? params(data) : typeof params === "string" ? { message: params } : params; + const _fatal = (_b = (_a = p.fatal) !== null && _a !== void 0 ? _a : fatal) !== null && _b !== void 0 ? _b : true; + const p2 = typeof p === "string" ? { message: p } : p; + ctx.addIssue({ code: "custom", ...p2, fatal: _fatal }); + } + }); + return ZodAny.create(); +} +var util, objectUtil, ZodParsedType, getParsedType, ZodIssueCode, quotelessJson, ZodError, errorMap, overrideErrorMap, makeIssue, EMPTY_PATH, ParseStatus, INVALID, DIRTY, OK, isAborted, isDirty, isValid, isAsync, errorUtil, _ZodEnum_cache, _ZodNativeEnum_cache, ParseInputLazyPath, handleResult, ZodType, cuidRegex, cuid2Regex, ulidRegex, uuidRegex, nanoidRegex, durationRegex, emailRegex, _emojiRegex, emojiRegex, ipv4Regex, ipv6Regex, base64Regex, dateRegexSource, dateRegex, ZodString, ZodNumber, ZodBigInt, ZodBoolean, ZodDate, ZodSymbol, ZodUndefined, ZodNull, ZodAny, ZodUnknown, ZodNever, ZodVoid, ZodArray, ZodObject, ZodUnion, getDiscriminator, ZodDiscriminatedUnion, ZodIntersection, ZodTuple, ZodRecord, ZodMap, ZodSet, ZodFunction, ZodLazy, ZodLiteral, ZodEnum, ZodNativeEnum, ZodPromise, ZodEffects, ZodOptional, ZodNullable, ZodDefault, ZodCatch, ZodNaN, BRAND, ZodBranded, ZodPipeline, ZodReadonly, late, ZodFirstPartyTypeKind, instanceOfType, stringType, numberType, nanType, bigIntType, booleanType, dateType, symbolType, undefinedType, nullType, anyType, unknownType, neverType, voidType, arrayType, objectType, strictObjectType, unionType, discriminatedUnionType, intersectionType, tupleType, recordType, mapType, setType, functionType, lazyType, literalType, enumType, nativeEnumType, promiseType, effectsType, optionalType, nullableType, preprocessType, pipelineType, ostring, onumber, oboolean, coerce, NEVER, z; +var init_lib = __esm({ + "cypher-executor/node_modules/.pnpm/zod@3.23.8/node_modules/zod/lib/index.mjs"() { + (function(util2) { + util2.assertEqual = (val) => val; + function assertIs(_arg) { + } + util2.assertIs = assertIs; + function assertNever(_x) { + throw new Error(); + } + util2.assertNever = assertNever; + util2.arrayToEnum = (items) => { + const obj = {}; + for (const item of items) { + obj[item] = item; + } + return obj; + }; + util2.getValidEnumValues = (obj) => { + const validKeys = util2.objectKeys(obj).filter((k) => typeof obj[obj[k]] !== "number"); + const filtered = {}; + for (const k of validKeys) { + filtered[k] = obj[k]; + } + return util2.objectValues(filtered); + }; + util2.objectValues = (obj) => { + return util2.objectKeys(obj).map(function(e) { + return obj[e]; + }); + }; + util2.objectKeys = typeof Object.keys === "function" ? (obj) => Object.keys(obj) : (object) => { + const keys = []; + for (const key in object) { + if (Object.prototype.hasOwnProperty.call(object, key)) { + keys.push(key); + } + } + return keys; + }; + util2.find = (arr, checker) => { + for (const item of arr) { + if (checker(item)) + return item; + } + return void 0; + }; + util2.isInteger = typeof Number.isInteger === "function" ? (val) => Number.isInteger(val) : (val) => typeof val === "number" && isFinite(val) && Math.floor(val) === val; + function joinValues(array, separator = " | ") { + return array.map((val) => typeof val === "string" ? `'${val}'` : val).join(separator); + } + util2.joinValues = joinValues; + util2.jsonStringifyReplacer = (_, value) => { + if (typeof value === "bigint") { + return value.toString(); + } + return value; + }; + })(util || (util = {})); + (function(objectUtil2) { + objectUtil2.mergeShapes = (first, second) => { + return { + ...first, + ...second + // second overwrites first + }; + }; + })(objectUtil || (objectUtil = {})); + ZodParsedType = util.arrayToEnum([ + "string", + "nan", + "number", + "integer", + "float", + "boolean", + "date", + "bigint", + "symbol", + "function", + "undefined", + "null", + "array", + "object", + "unknown", + "promise", + "void", + "never", + "map", + "set" + ]); + getParsedType = (data) => { + const t = typeof data; + switch (t) { + case "undefined": + return ZodParsedType.undefined; + case "string": + return ZodParsedType.string; + case "number": + return isNaN(data) ? ZodParsedType.nan : ZodParsedType.number; + case "boolean": + return ZodParsedType.boolean; + case "function": + return ZodParsedType.function; + case "bigint": + return ZodParsedType.bigint; + case "symbol": + return ZodParsedType.symbol; + case "object": + if (Array.isArray(data)) { + return ZodParsedType.array; + } + if (data === null) { + return ZodParsedType.null; + } + if (data.then && typeof data.then === "function" && data.catch && typeof data.catch === "function") { + return ZodParsedType.promise; + } + if (typeof Map !== "undefined" && data instanceof Map) { + return ZodParsedType.map; + } + if (typeof Set !== "undefined" && data instanceof Set) { + return ZodParsedType.set; + } + if (typeof Date !== "undefined" && data instanceof Date) { + return ZodParsedType.date; + } + return ZodParsedType.object; + default: + return ZodParsedType.unknown; + } + }; + ZodIssueCode = util.arrayToEnum([ + "invalid_type", + "invalid_literal", + "custom", + "invalid_union", + "invalid_union_discriminator", + "invalid_enum_value", + "unrecognized_keys", + "invalid_arguments", + "invalid_return_type", + "invalid_date", + "invalid_string", + "too_small", + "too_big", + "invalid_intersection_types", + "not_multiple_of", + "not_finite" + ]); + quotelessJson = (obj) => { + const json = JSON.stringify(obj, null, 2); + return json.replace(/"([^"]+)":/g, "$1:"); + }; + ZodError = class _ZodError extends Error { + constructor(issues) { + super(); + this.issues = []; + this.addIssue = (sub) => { + this.issues = [...this.issues, sub]; + }; + this.addIssues = (subs = []) => { + this.issues = [...this.issues, ...subs]; + }; + const actualProto = new.target.prototype; + if (Object.setPrototypeOf) { + Object.setPrototypeOf(this, actualProto); + } else { + this.__proto__ = actualProto; + } + this.name = "ZodError"; + this.issues = issues; + } + get errors() { + return this.issues; + } + format(_mapper) { + const mapper = _mapper || function(issue) { + return issue.message; + }; + const fieldErrors = { _errors: [] }; + const processError = (error) => { + for (const issue of error.issues) { + if (issue.code === "invalid_union") { + issue.unionErrors.map(processError); + } else if (issue.code === "invalid_return_type") { + processError(issue.returnTypeError); + } else if (issue.code === "invalid_arguments") { + processError(issue.argumentsError); + } else if (issue.path.length === 0) { + fieldErrors._errors.push(mapper(issue)); + } else { + let curr = fieldErrors; + let i = 0; + while (i < issue.path.length) { + const el = issue.path[i]; + const terminal = i === issue.path.length - 1; + if (!terminal) { + curr[el] = curr[el] || { _errors: [] }; + } else { + curr[el] = curr[el] || { _errors: [] }; + curr[el]._errors.push(mapper(issue)); + } + curr = curr[el]; + i++; + } + } + } + }; + processError(this); + return fieldErrors; + } + static assert(value) { + if (!(value instanceof _ZodError)) { + throw new Error(`Not a ZodError: ${value}`); + } + } + toString() { + return this.message; + } + get message() { + return JSON.stringify(this.issues, util.jsonStringifyReplacer, 2); + } + get isEmpty() { + return this.issues.length === 0; + } + flatten(mapper = (issue) => issue.message) { + const fieldErrors = {}; + const formErrors = []; + for (const sub of this.issues) { + if (sub.path.length > 0) { + fieldErrors[sub.path[0]] = fieldErrors[sub.path[0]] || []; + fieldErrors[sub.path[0]].push(mapper(sub)); + } else { + formErrors.push(mapper(sub)); + } + } + return { formErrors, fieldErrors }; + } + get formErrors() { + return this.flatten(); + } + }; + ZodError.create = (issues) => { + const error = new ZodError(issues); + return error; + }; + errorMap = (issue, _ctx) => { + let message; + switch (issue.code) { + case ZodIssueCode.invalid_type: + if (issue.received === ZodParsedType.undefined) { + message = "Required"; + } else { + message = `Expected ${issue.expected}, received ${issue.received}`; + } + break; + case ZodIssueCode.invalid_literal: + message = `Invalid literal value, expected ${JSON.stringify(issue.expected, util.jsonStringifyReplacer)}`; + break; + case ZodIssueCode.unrecognized_keys: + message = `Unrecognized key(s) in object: ${util.joinValues(issue.keys, ", ")}`; + break; + case ZodIssueCode.invalid_union: + message = `Invalid input`; + break; + case ZodIssueCode.invalid_union_discriminator: + message = `Invalid discriminator value. Expected ${util.joinValues(issue.options)}`; + break; + case ZodIssueCode.invalid_enum_value: + message = `Invalid enum value. Expected ${util.joinValues(issue.options)}, received '${issue.received}'`; + break; + case ZodIssueCode.invalid_arguments: + message = `Invalid function arguments`; + break; + case ZodIssueCode.invalid_return_type: + message = `Invalid function return type`; + break; + case ZodIssueCode.invalid_date: + message = `Invalid date`; + break; + case ZodIssueCode.invalid_string: + if (typeof issue.validation === "object") { + if ("includes" in issue.validation) { + message = `Invalid input: must include "${issue.validation.includes}"`; + if (typeof issue.validation.position === "number") { + message = `${message} at one or more positions greater than or equal to ${issue.validation.position}`; + } + } else if ("startsWith" in issue.validation) { + message = `Invalid input: must start with "${issue.validation.startsWith}"`; + } else if ("endsWith" in issue.validation) { + message = `Invalid input: must end with "${issue.validation.endsWith}"`; + } else { + util.assertNever(issue.validation); + } + } else if (issue.validation !== "regex") { + message = `Invalid ${issue.validation}`; + } else { + message = "Invalid"; + } + break; + case ZodIssueCode.too_small: + if (issue.type === "array") + message = `Array must contain ${issue.exact ? "exactly" : issue.inclusive ? `at least` : `more than`} ${issue.minimum} element(s)`; + else if (issue.type === "string") + message = `String must contain ${issue.exact ? "exactly" : issue.inclusive ? `at least` : `over`} ${issue.minimum} character(s)`; + else if (issue.type === "number") + message = `Number must be ${issue.exact ? `exactly equal to ` : issue.inclusive ? `greater than or equal to ` : `greater than `}${issue.minimum}`; + else if (issue.type === "date") + message = `Date must be ${issue.exact ? `exactly equal to ` : issue.inclusive ? `greater than or equal to ` : `greater than `}${new Date(Number(issue.minimum))}`; + else + message = "Invalid input"; + break; + case ZodIssueCode.too_big: + if (issue.type === "array") + message = `Array must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `less than`} ${issue.maximum} element(s)`; + else if (issue.type === "string") + message = `String must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `under`} ${issue.maximum} character(s)`; + else if (issue.type === "number") + message = `Number must be ${issue.exact ? `exactly` : issue.inclusive ? `less than or equal to` : `less than`} ${issue.maximum}`; + else if (issue.type === "bigint") + message = `BigInt must be ${issue.exact ? `exactly` : issue.inclusive ? `less than or equal to` : `less than`} ${issue.maximum}`; + else if (issue.type === "date") + message = `Date must be ${issue.exact ? `exactly` : issue.inclusive ? `smaller than or equal to` : `smaller than`} ${new Date(Number(issue.maximum))}`; + else + message = "Invalid input"; + break; + case ZodIssueCode.custom: + message = `Invalid input`; + break; + case ZodIssueCode.invalid_intersection_types: + message = `Intersection results could not be merged`; + break; + case ZodIssueCode.not_multiple_of: + message = `Number must be a multiple of ${issue.multipleOf}`; + break; + case ZodIssueCode.not_finite: + message = "Number must be finite"; + break; + default: + message = _ctx.defaultError; + util.assertNever(issue); + } + return { message }; + }; + overrideErrorMap = errorMap; + makeIssue = (params) => { + const { data, path, errorMaps, issueData } = params; + const fullPath = [...path, ...issueData.path || []]; + const fullIssue = { + ...issueData, + path: fullPath + }; + if (issueData.message !== void 0) { + return { + ...issueData, + path: fullPath, + message: issueData.message + }; + } + let errorMessage = ""; + const maps = errorMaps.filter((m) => !!m).slice().reverse(); + for (const map of maps) { + errorMessage = map(fullIssue, { data, defaultError: errorMessage }).message; + } + return { + ...issueData, + path: fullPath, + message: errorMessage + }; + }; + EMPTY_PATH = []; + ParseStatus = class _ParseStatus { + constructor() { + this.value = "valid"; + } + dirty() { + if (this.value === "valid") + this.value = "dirty"; + } + abort() { + if (this.value !== "aborted") + this.value = "aborted"; + } + static mergeArray(status, results) { + const arrayValue = []; + for (const s of results) { + if (s.status === "aborted") + return INVALID; + if (s.status === "dirty") + status.dirty(); + arrayValue.push(s.value); + } + return { status: status.value, value: arrayValue }; + } + static async mergeObjectAsync(status, pairs) { + const syncPairs = []; + for (const pair of pairs) { + const key = await pair.key; + const value = await pair.value; + syncPairs.push({ + key, + value + }); + } + return _ParseStatus.mergeObjectSync(status, syncPairs); + } + static mergeObjectSync(status, pairs) { + const finalObject = {}; + for (const pair of pairs) { + const { key, value } = pair; + if (key.status === "aborted") + return INVALID; + if (value.status === "aborted") + return INVALID; + if (key.status === "dirty") + status.dirty(); + if (value.status === "dirty") + status.dirty(); + if (key.value !== "__proto__" && (typeof value.value !== "undefined" || pair.alwaysSet)) { + finalObject[key.value] = value.value; + } + } + return { status: status.value, value: finalObject }; + } + }; + INVALID = Object.freeze({ + status: "aborted" + }); + DIRTY = (value) => ({ status: "dirty", value }); + OK = (value) => ({ status: "valid", value }); + isAborted = (x) => x.status === "aborted"; + isDirty = (x) => x.status === "dirty"; + isValid = (x) => x.status === "valid"; + isAsync = (x) => typeof Promise !== "undefined" && x instanceof Promise; + (function(errorUtil2) { + errorUtil2.errToObj = (message) => typeof message === "string" ? { message } : message || {}; + errorUtil2.toString = (message) => typeof message === "string" ? message : message === null || message === void 0 ? void 0 : message.message; + })(errorUtil || (errorUtil = {})); + ParseInputLazyPath = class { + constructor(parent, value, path, key) { + this._cachedPath = []; + this.parent = parent; + this.data = value; + this._path = path; + this._key = key; + } + get path() { + if (!this._cachedPath.length) { + if (this._key instanceof Array) { + this._cachedPath.push(...this._path, ...this._key); + } else { + this._cachedPath.push(...this._path, this._key); + } + } + return this._cachedPath; + } + }; + handleResult = (ctx, result) => { + if (isValid(result)) { + return { success: true, data: result.value }; + } else { + if (!ctx.common.issues.length) { + throw new Error("Validation failed but no issues detected."); + } + return { + success: false, + get error() { + if (this._error) + return this._error; + const error = new ZodError(ctx.common.issues); + this._error = error; + return this._error; + } + }; + } + }; + ZodType = class { + constructor(def) { + this.spa = this.safeParseAsync; + this._def = def; + this.parse = this.parse.bind(this); + this.safeParse = this.safeParse.bind(this); + this.parseAsync = this.parseAsync.bind(this); + this.safeParseAsync = this.safeParseAsync.bind(this); + this.spa = this.spa.bind(this); + this.refine = this.refine.bind(this); + this.refinement = this.refinement.bind(this); + this.superRefine = this.superRefine.bind(this); + this.optional = this.optional.bind(this); + this.nullable = this.nullable.bind(this); + this.nullish = this.nullish.bind(this); + this.array = this.array.bind(this); + this.promise = this.promise.bind(this); + this.or = this.or.bind(this); + this.and = this.and.bind(this); + this.transform = this.transform.bind(this); + this.brand = this.brand.bind(this); + this.default = this.default.bind(this); + this.catch = this.catch.bind(this); + this.describe = this.describe.bind(this); + this.pipe = this.pipe.bind(this); + this.readonly = this.readonly.bind(this); + this.isNullable = this.isNullable.bind(this); + this.isOptional = this.isOptional.bind(this); + } + get description() { + return this._def.description; + } + _getType(input) { + return getParsedType(input.data); + } + _getOrReturnCtx(input, ctx) { + return ctx || { + common: input.parent.common, + data: input.data, + parsedType: getParsedType(input.data), + schemaErrorMap: this._def.errorMap, + path: input.path, + parent: input.parent + }; + } + _processInputParams(input) { + return { + status: new ParseStatus(), + ctx: { + common: input.parent.common, + data: input.data, + parsedType: getParsedType(input.data), + schemaErrorMap: this._def.errorMap, + path: input.path, + parent: input.parent + } + }; + } + _parseSync(input) { + const result = this._parse(input); + if (isAsync(result)) { + throw new Error("Synchronous parse encountered promise."); + } + return result; + } + _parseAsync(input) { + const result = this._parse(input); + return Promise.resolve(result); + } + parse(data, params) { + const result = this.safeParse(data, params); + if (result.success) + return result.data; + throw result.error; + } + safeParse(data, params) { + var _a; + const ctx = { + common: { + issues: [], + async: (_a = params === null || params === void 0 ? void 0 : params.async) !== null && _a !== void 0 ? _a : false, + contextualErrorMap: params === null || params === void 0 ? void 0 : params.errorMap + }, + path: (params === null || params === void 0 ? void 0 : params.path) || [], + schemaErrorMap: this._def.errorMap, + parent: null, + data, + parsedType: getParsedType(data) + }; + const result = this._parseSync({ data, path: ctx.path, parent: ctx }); + return handleResult(ctx, result); + } + async parseAsync(data, params) { + const result = await this.safeParseAsync(data, params); + if (result.success) + return result.data; + throw result.error; + } + async safeParseAsync(data, params) { + const ctx = { + common: { + issues: [], + contextualErrorMap: params === null || params === void 0 ? void 0 : params.errorMap, + async: true + }, + path: (params === null || params === void 0 ? void 0 : params.path) || [], + schemaErrorMap: this._def.errorMap, + parent: null, + data, + parsedType: getParsedType(data) + }; + const maybeAsyncResult = this._parse({ data, path: ctx.path, parent: ctx }); + const result = await (isAsync(maybeAsyncResult) ? maybeAsyncResult : Promise.resolve(maybeAsyncResult)); + return handleResult(ctx, result); + } + refine(check, message) { + const getIssueProperties = (val) => { + if (typeof message === "string" || typeof message === "undefined") { + return { message }; + } else if (typeof message === "function") { + return message(val); + } else { + return message; + } + }; + return this._refinement((val, ctx) => { + const result = check(val); + const setError = () => ctx.addIssue({ + code: ZodIssueCode.custom, + ...getIssueProperties(val) + }); + if (typeof Promise !== "undefined" && result instanceof Promise) { + return result.then((data) => { + if (!data) { + setError(); + return false; + } else { + return true; + } + }); + } + if (!result) { + setError(); + return false; + } else { + return true; + } + }); + } + refinement(check, refinementData) { + return this._refinement((val, ctx) => { + if (!check(val)) { + ctx.addIssue(typeof refinementData === "function" ? refinementData(val, ctx) : refinementData); + return false; + } else { + return true; + } + }); + } + _refinement(refinement) { + return new ZodEffects({ + schema: this, + typeName: ZodFirstPartyTypeKind.ZodEffects, + effect: { type: "refinement", refinement } + }); + } + superRefine(refinement) { + return this._refinement(refinement); + } + optional() { + return ZodOptional.create(this, this._def); + } + nullable() { + return ZodNullable.create(this, this._def); + } + nullish() { + return this.nullable().optional(); + } + array() { + return ZodArray.create(this, this._def); + } + promise() { + return ZodPromise.create(this, this._def); + } + or(option) { + return ZodUnion.create([this, option], this._def); + } + and(incoming) { + return ZodIntersection.create(this, incoming, this._def); + } + transform(transform) { + return new ZodEffects({ + ...processCreateParams(this._def), + schema: this, + typeName: ZodFirstPartyTypeKind.ZodEffects, + effect: { type: "transform", transform } + }); + } + default(def) { + const defaultValueFunc = typeof def === "function" ? def : () => def; + return new ZodDefault({ + ...processCreateParams(this._def), + innerType: this, + defaultValue: defaultValueFunc, + typeName: ZodFirstPartyTypeKind.ZodDefault + }); + } + brand() { + return new ZodBranded({ + typeName: ZodFirstPartyTypeKind.ZodBranded, + type: this, + ...processCreateParams(this._def) + }); + } + catch(def) { + const catchValueFunc = typeof def === "function" ? def : () => def; + return new ZodCatch({ + ...processCreateParams(this._def), + innerType: this, + catchValue: catchValueFunc, + typeName: ZodFirstPartyTypeKind.ZodCatch + }); + } + describe(description) { + const This = this.constructor; + return new This({ + ...this._def, + description + }); + } + pipe(target) { + return ZodPipeline.create(this, target); + } + readonly() { + return ZodReadonly.create(this); + } + isOptional() { + return this.safeParse(void 0).success; + } + isNullable() { + return this.safeParse(null).success; + } + }; + cuidRegex = /^c[^\s-]{8,}$/i; + cuid2Regex = /^[0-9a-z]+$/; + ulidRegex = /^[0-9A-HJKMNP-TV-Z]{26}$/; + uuidRegex = /^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/i; + nanoidRegex = /^[a-z0-9_-]{21}$/i; + durationRegex = /^[-+]?P(?!$)(?:(?:[-+]?\d+Y)|(?:[-+]?\d+[.,]\d+Y$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:(?:[-+]?\d+W)|(?:[-+]?\d+[.,]\d+W$))?(?:(?:[-+]?\d+D)|(?:[-+]?\d+[.,]\d+D$))?(?:T(?=[\d+-])(?:(?:[-+]?\d+H)|(?:[-+]?\d+[.,]\d+H$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:[-+]?\d+(?:[.,]\d+)?S)?)??$/; + emailRegex = /^(?!\.)(?!.*\.\.)([A-Z0-9_'+\-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i; + _emojiRegex = `^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$`; + ipv4Regex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/; + ipv6Regex = /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/; + base64Regex = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/; + dateRegexSource = `((\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\d|30)|(02)-(0[1-9]|1\\d|2[0-8])))`; + dateRegex = new RegExp(`^${dateRegexSource}$`); + ZodString = class _ZodString extends ZodType { + _parse(input) { + if (this._def.coerce) { + input.data = String(input.data); + } + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.string) { + const ctx2 = this._getOrReturnCtx(input); + addIssueToContext(ctx2, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.string, + received: ctx2.parsedType + }); + return INVALID; + } + const status = new ParseStatus(); + let ctx = void 0; + for (const check of this._def.checks) { + if (check.kind === "min") { + if (input.data.length < check.value) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + minimum: check.value, + type: "string", + inclusive: true, + exact: false, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "max") { + if (input.data.length > check.value) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + maximum: check.value, + type: "string", + inclusive: true, + exact: false, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "length") { + const tooBig = input.data.length > check.value; + const tooSmall = input.data.length < check.value; + if (tooBig || tooSmall) { + ctx = this._getOrReturnCtx(input, ctx); + if (tooBig) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + maximum: check.value, + type: "string", + inclusive: true, + exact: true, + message: check.message + }); + } else if (tooSmall) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + minimum: check.value, + type: "string", + inclusive: true, + exact: true, + message: check.message + }); + } + status.dirty(); + } + } else if (check.kind === "email") { + if (!emailRegex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "email", + code: ZodIssueCode.invalid_string, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "emoji") { + if (!emojiRegex) { + emojiRegex = new RegExp(_emojiRegex, "u"); + } + if (!emojiRegex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "emoji", + code: ZodIssueCode.invalid_string, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "uuid") { + if (!uuidRegex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "uuid", + code: ZodIssueCode.invalid_string, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "nanoid") { + if (!nanoidRegex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "nanoid", + code: ZodIssueCode.invalid_string, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "cuid") { + if (!cuidRegex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "cuid", + code: ZodIssueCode.invalid_string, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "cuid2") { + if (!cuid2Regex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "cuid2", + code: ZodIssueCode.invalid_string, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "ulid") { + if (!ulidRegex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "ulid", + code: ZodIssueCode.invalid_string, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "url") { + try { + new URL(input.data); + } catch (_a) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "url", + code: ZodIssueCode.invalid_string, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "regex") { + check.regex.lastIndex = 0; + const testResult = check.regex.test(input.data); + if (!testResult) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "regex", + code: ZodIssueCode.invalid_string, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "trim") { + input.data = input.data.trim(); + } else if (check.kind === "includes") { + if (!input.data.includes(check.value, check.position)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_string, + validation: { includes: check.value, position: check.position }, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "toLowerCase") { + input.data = input.data.toLowerCase(); + } else if (check.kind === "toUpperCase") { + input.data = input.data.toUpperCase(); + } else if (check.kind === "startsWith") { + if (!input.data.startsWith(check.value)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_string, + validation: { startsWith: check.value }, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "endsWith") { + if (!input.data.endsWith(check.value)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_string, + validation: { endsWith: check.value }, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "datetime") { + const regex = datetimeRegex(check); + if (!regex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_string, + validation: "datetime", + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "date") { + const regex = dateRegex; + if (!regex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_string, + validation: "date", + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "time") { + const regex = timeRegex(check); + if (!regex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_string, + validation: "time", + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "duration") { + if (!durationRegex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "duration", + code: ZodIssueCode.invalid_string, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "ip") { + if (!isValidIP(input.data, check.version)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "ip", + code: ZodIssueCode.invalid_string, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "base64") { + if (!base64Regex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "base64", + code: ZodIssueCode.invalid_string, + message: check.message + }); + status.dirty(); + } + } else { + util.assertNever(check); + } + } + return { status: status.value, value: input.data }; + } + _regex(regex, validation, message) { + return this.refinement((data) => regex.test(data), { + validation, + code: ZodIssueCode.invalid_string, + ...errorUtil.errToObj(message) + }); + } + _addCheck(check) { + return new _ZodString({ + ...this._def, + checks: [...this._def.checks, check] + }); + } + email(message) { + return this._addCheck({ kind: "email", ...errorUtil.errToObj(message) }); + } + url(message) { + return this._addCheck({ kind: "url", ...errorUtil.errToObj(message) }); + } + emoji(message) { + return this._addCheck({ kind: "emoji", ...errorUtil.errToObj(message) }); + } + uuid(message) { + return this._addCheck({ kind: "uuid", ...errorUtil.errToObj(message) }); + } + nanoid(message) { + return this._addCheck({ kind: "nanoid", ...errorUtil.errToObj(message) }); + } + cuid(message) { + return this._addCheck({ kind: "cuid", ...errorUtil.errToObj(message) }); + } + cuid2(message) { + return this._addCheck({ kind: "cuid2", ...errorUtil.errToObj(message) }); + } + ulid(message) { + return this._addCheck({ kind: "ulid", ...errorUtil.errToObj(message) }); + } + base64(message) { + return this._addCheck({ kind: "base64", ...errorUtil.errToObj(message) }); + } + ip(options) { + return this._addCheck({ kind: "ip", ...errorUtil.errToObj(options) }); + } + datetime(options) { + var _a, _b; + if (typeof options === "string") { + return this._addCheck({ + kind: "datetime", + precision: null, + offset: false, + local: false, + message: options + }); + } + return this._addCheck({ + kind: "datetime", + precision: typeof (options === null || options === void 0 ? void 0 : options.precision) === "undefined" ? null : options === null || options === void 0 ? void 0 : options.precision, + offset: (_a = options === null || options === void 0 ? void 0 : options.offset) !== null && _a !== void 0 ? _a : false, + local: (_b = options === null || options === void 0 ? void 0 : options.local) !== null && _b !== void 0 ? _b : false, + ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message) + }); + } + date(message) { + return this._addCheck({ kind: "date", message }); + } + time(options) { + if (typeof options === "string") { + return this._addCheck({ + kind: "time", + precision: null, + message: options + }); + } + return this._addCheck({ + kind: "time", + precision: typeof (options === null || options === void 0 ? void 0 : options.precision) === "undefined" ? null : options === null || options === void 0 ? void 0 : options.precision, + ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message) + }); + } + duration(message) { + return this._addCheck({ kind: "duration", ...errorUtil.errToObj(message) }); + } + regex(regex, message) { + return this._addCheck({ + kind: "regex", + regex, + ...errorUtil.errToObj(message) + }); + } + includes(value, options) { + return this._addCheck({ + kind: "includes", + value, + position: options === null || options === void 0 ? void 0 : options.position, + ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message) + }); + } + startsWith(value, message) { + return this._addCheck({ + kind: "startsWith", + value, + ...errorUtil.errToObj(message) + }); + } + endsWith(value, message) { + return this._addCheck({ + kind: "endsWith", + value, + ...errorUtil.errToObj(message) + }); + } + min(minLength, message) { + return this._addCheck({ + kind: "min", + value: minLength, + ...errorUtil.errToObj(message) + }); + } + max(maxLength, message) { + return this._addCheck({ + kind: "max", + value: maxLength, + ...errorUtil.errToObj(message) + }); + } + length(len, message) { + return this._addCheck({ + kind: "length", + value: len, + ...errorUtil.errToObj(message) + }); + } + /** + * @deprecated Use z.string().min(1) instead. + * @see {@link ZodString.min} + */ + nonempty(message) { + return this.min(1, errorUtil.errToObj(message)); + } + trim() { + return new _ZodString({ + ...this._def, + checks: [...this._def.checks, { kind: "trim" }] + }); + } + toLowerCase() { + return new _ZodString({ + ...this._def, + checks: [...this._def.checks, { kind: "toLowerCase" }] + }); + } + toUpperCase() { + return new _ZodString({ + ...this._def, + checks: [...this._def.checks, { kind: "toUpperCase" }] + }); + } + get isDatetime() { + return !!this._def.checks.find((ch) => ch.kind === "datetime"); + } + get isDate() { + return !!this._def.checks.find((ch) => ch.kind === "date"); + } + get isTime() { + return !!this._def.checks.find((ch) => ch.kind === "time"); + } + get isDuration() { + return !!this._def.checks.find((ch) => ch.kind === "duration"); + } + get isEmail() { + return !!this._def.checks.find((ch) => ch.kind === "email"); + } + get isURL() { + return !!this._def.checks.find((ch) => ch.kind === "url"); + } + get isEmoji() { + return !!this._def.checks.find((ch) => ch.kind === "emoji"); + } + get isUUID() { + return !!this._def.checks.find((ch) => ch.kind === "uuid"); + } + get isNANOID() { + return !!this._def.checks.find((ch) => ch.kind === "nanoid"); + } + get isCUID() { + return !!this._def.checks.find((ch) => ch.kind === "cuid"); + } + get isCUID2() { + return !!this._def.checks.find((ch) => ch.kind === "cuid2"); + } + get isULID() { + return !!this._def.checks.find((ch) => ch.kind === "ulid"); + } + get isIP() { + return !!this._def.checks.find((ch) => ch.kind === "ip"); + } + get isBase64() { + return !!this._def.checks.find((ch) => ch.kind === "base64"); + } + get minLength() { + let min = null; + for (const ch of this._def.checks) { + if (ch.kind === "min") { + if (min === null || ch.value > min) + min = ch.value; + } + } + return min; + } + get maxLength() { + let max = null; + for (const ch of this._def.checks) { + if (ch.kind === "max") { + if (max === null || ch.value < max) + max = ch.value; + } + } + return max; + } + }; + ZodString.create = (params) => { + var _a; + return new ZodString({ + checks: [], + typeName: ZodFirstPartyTypeKind.ZodString, + coerce: (_a = params === null || params === void 0 ? void 0 : params.coerce) !== null && _a !== void 0 ? _a : false, + ...processCreateParams(params) + }); + }; + ZodNumber = class _ZodNumber extends ZodType { + constructor() { + super(...arguments); + this.min = this.gte; + this.max = this.lte; + this.step = this.multipleOf; + } + _parse(input) { + if (this._def.coerce) { + input.data = Number(input.data); + } + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.number) { + const ctx2 = this._getOrReturnCtx(input); + addIssueToContext(ctx2, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.number, + received: ctx2.parsedType + }); + return INVALID; + } + let ctx = void 0; + const status = new ParseStatus(); + for (const check of this._def.checks) { + if (check.kind === "int") { + if (!util.isInteger(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: "integer", + received: "float", + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "min") { + const tooSmall = check.inclusive ? input.data < check.value : input.data <= check.value; + if (tooSmall) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + minimum: check.value, + type: "number", + inclusive: check.inclusive, + exact: false, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "max") { + const tooBig = check.inclusive ? input.data > check.value : input.data >= check.value; + if (tooBig) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + maximum: check.value, + type: "number", + inclusive: check.inclusive, + exact: false, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "multipleOf") { + if (floatSafeRemainder(input.data, check.value) !== 0) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.not_multiple_of, + multipleOf: check.value, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "finite") { + if (!Number.isFinite(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.not_finite, + message: check.message + }); + status.dirty(); + } + } else { + util.assertNever(check); + } + } + return { status: status.value, value: input.data }; + } + gte(value, message) { + return this.setLimit("min", value, true, errorUtil.toString(message)); + } + gt(value, message) { + return this.setLimit("min", value, false, errorUtil.toString(message)); + } + lte(value, message) { + return this.setLimit("max", value, true, errorUtil.toString(message)); + } + lt(value, message) { + return this.setLimit("max", value, false, errorUtil.toString(message)); + } + setLimit(kind, value, inclusive, message) { + return new _ZodNumber({ + ...this._def, + checks: [ + ...this._def.checks, + { + kind, + value, + inclusive, + message: errorUtil.toString(message) + } + ] + }); + } + _addCheck(check) { + return new _ZodNumber({ + ...this._def, + checks: [...this._def.checks, check] + }); + } + int(message) { + return this._addCheck({ + kind: "int", + message: errorUtil.toString(message) + }); + } + positive(message) { + return this._addCheck({ + kind: "min", + value: 0, + inclusive: false, + message: errorUtil.toString(message) + }); + } + negative(message) { + return this._addCheck({ + kind: "max", + value: 0, + inclusive: false, + message: errorUtil.toString(message) + }); + } + nonpositive(message) { + return this._addCheck({ + kind: "max", + value: 0, + inclusive: true, + message: errorUtil.toString(message) + }); + } + nonnegative(message) { + return this._addCheck({ + kind: "min", + value: 0, + inclusive: true, + message: errorUtil.toString(message) + }); + } + multipleOf(value, message) { + return this._addCheck({ + kind: "multipleOf", + value, + message: errorUtil.toString(message) + }); + } + finite(message) { + return this._addCheck({ + kind: "finite", + message: errorUtil.toString(message) + }); + } + safe(message) { + return this._addCheck({ + kind: "min", + inclusive: true, + value: Number.MIN_SAFE_INTEGER, + message: errorUtil.toString(message) + })._addCheck({ + kind: "max", + inclusive: true, + value: Number.MAX_SAFE_INTEGER, + message: errorUtil.toString(message) + }); + } + get minValue() { + let min = null; + for (const ch of this._def.checks) { + if (ch.kind === "min") { + if (min === null || ch.value > min) + min = ch.value; + } + } + return min; + } + get maxValue() { + let max = null; + for (const ch of this._def.checks) { + if (ch.kind === "max") { + if (max === null || ch.value < max) + max = ch.value; + } + } + return max; + } + get isInt() { + return !!this._def.checks.find((ch) => ch.kind === "int" || ch.kind === "multipleOf" && util.isInteger(ch.value)); + } + get isFinite() { + let max = null, min = null; + for (const ch of this._def.checks) { + if (ch.kind === "finite" || ch.kind === "int" || ch.kind === "multipleOf") { + return true; + } else if (ch.kind === "min") { + if (min === null || ch.value > min) + min = ch.value; + } else if (ch.kind === "max") { + if (max === null || ch.value < max) + max = ch.value; + } + } + return Number.isFinite(min) && Number.isFinite(max); + } + }; + ZodNumber.create = (params) => { + return new ZodNumber({ + checks: [], + typeName: ZodFirstPartyTypeKind.ZodNumber, + coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false, + ...processCreateParams(params) + }); + }; + ZodBigInt = class _ZodBigInt extends ZodType { + constructor() { + super(...arguments); + this.min = this.gte; + this.max = this.lte; + } + _parse(input) { + if (this._def.coerce) { + input.data = BigInt(input.data); + } + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.bigint) { + const ctx2 = this._getOrReturnCtx(input); + addIssueToContext(ctx2, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.bigint, + received: ctx2.parsedType + }); + return INVALID; + } + let ctx = void 0; + const status = new ParseStatus(); + for (const check of this._def.checks) { + if (check.kind === "min") { + const tooSmall = check.inclusive ? input.data < check.value : input.data <= check.value; + if (tooSmall) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + type: "bigint", + minimum: check.value, + inclusive: check.inclusive, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "max") { + const tooBig = check.inclusive ? input.data > check.value : input.data >= check.value; + if (tooBig) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + type: "bigint", + maximum: check.value, + inclusive: check.inclusive, + message: check.message + }); + status.dirty(); + } + } else if (check.kind === "multipleOf") { + if (input.data % check.value !== BigInt(0)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.not_multiple_of, + multipleOf: check.value, + message: check.message + }); + status.dirty(); + } + } else { + util.assertNever(check); + } + } + return { status: status.value, value: input.data }; + } + gte(value, message) { + return this.setLimit("min", value, true, errorUtil.toString(message)); + } + gt(value, message) { + return this.setLimit("min", value, false, errorUtil.toString(message)); + } + lte(value, message) { + return this.setLimit("max", value, true, errorUtil.toString(message)); + } + lt(value, message) { + return this.setLimit("max", value, false, errorUtil.toString(message)); + } + setLimit(kind, value, inclusive, message) { + return new _ZodBigInt({ + ...this._def, + checks: [ + ...this._def.checks, + { + kind, + value, + inclusive, + message: errorUtil.toString(message) + } + ] + }); + } + _addCheck(check) { + return new _ZodBigInt({ + ...this._def, + checks: [...this._def.checks, check] + }); + } + positive(message) { + return this._addCheck({ + kind: "min", + value: BigInt(0), + inclusive: false, + message: errorUtil.toString(message) + }); + } + negative(message) { + return this._addCheck({ + kind: "max", + value: BigInt(0), + inclusive: false, + message: errorUtil.toString(message) + }); + } + nonpositive(message) { + return this._addCheck({ + kind: "max", + value: BigInt(0), + inclusive: true, + message: errorUtil.toString(message) + }); + } + nonnegative(message) { + return this._addCheck({ + kind: "min", + value: BigInt(0), + inclusive: true, + message: errorUtil.toString(message) + }); + } + multipleOf(value, message) { + return this._addCheck({ + kind: "multipleOf", + value, + message: errorUtil.toString(message) + }); + } + get minValue() { + let min = null; + for (const ch of this._def.checks) { + if (ch.kind === "min") { + if (min === null || ch.value > min) + min = ch.value; + } + } + return min; + } + get maxValue() { + let max = null; + for (const ch of this._def.checks) { + if (ch.kind === "max") { + if (max === null || ch.value < max) + max = ch.value; + } + } + return max; + } + }; + ZodBigInt.create = (params) => { + var _a; + return new ZodBigInt({ + checks: [], + typeName: ZodFirstPartyTypeKind.ZodBigInt, + coerce: (_a = params === null || params === void 0 ? void 0 : params.coerce) !== null && _a !== void 0 ? _a : false, + ...processCreateParams(params) + }); + }; + ZodBoolean = class extends ZodType { + _parse(input) { + if (this._def.coerce) { + input.data = Boolean(input.data); + } + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.boolean) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.boolean, + received: ctx.parsedType + }); + return INVALID; + } + return OK(input.data); + } + }; + ZodBoolean.create = (params) => { + return new ZodBoolean({ + typeName: ZodFirstPartyTypeKind.ZodBoolean, + coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false, + ...processCreateParams(params) + }); + }; + ZodDate = class _ZodDate extends ZodType { + _parse(input) { + if (this._def.coerce) { + input.data = new Date(input.data); + } + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.date) { + const ctx2 = this._getOrReturnCtx(input); + addIssueToContext(ctx2, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.date, + received: ctx2.parsedType + }); + return INVALID; + } + if (isNaN(input.data.getTime())) { + const ctx2 = this._getOrReturnCtx(input); + addIssueToContext(ctx2, { + code: ZodIssueCode.invalid_date + }); + return INVALID; + } + const status = new ParseStatus(); + let ctx = void 0; + for (const check of this._def.checks) { + if (check.kind === "min") { + if (input.data.getTime() < check.value) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + message: check.message, + inclusive: true, + exact: false, + minimum: check.value, + type: "date" + }); + status.dirty(); + } + } else if (check.kind === "max") { + if (input.data.getTime() > check.value) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + message: check.message, + inclusive: true, + exact: false, + maximum: check.value, + type: "date" + }); + status.dirty(); + } + } else { + util.assertNever(check); + } + } + return { + status: status.value, + value: new Date(input.data.getTime()) + }; + } + _addCheck(check) { + return new _ZodDate({ + ...this._def, + checks: [...this._def.checks, check] + }); + } + min(minDate, message) { + return this._addCheck({ + kind: "min", + value: minDate.getTime(), + message: errorUtil.toString(message) + }); + } + max(maxDate, message) { + return this._addCheck({ + kind: "max", + value: maxDate.getTime(), + message: errorUtil.toString(message) + }); + } + get minDate() { + let min = null; + for (const ch of this._def.checks) { + if (ch.kind === "min") { + if (min === null || ch.value > min) + min = ch.value; + } + } + return min != null ? new Date(min) : null; + } + get maxDate() { + let max = null; + for (const ch of this._def.checks) { + if (ch.kind === "max") { + if (max === null || ch.value < max) + max = ch.value; + } + } + return max != null ? new Date(max) : null; + } + }; + ZodDate.create = (params) => { + return new ZodDate({ + checks: [], + coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false, + typeName: ZodFirstPartyTypeKind.ZodDate, + ...processCreateParams(params) + }); + }; + ZodSymbol = class extends ZodType { + _parse(input) { + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.symbol) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.symbol, + received: ctx.parsedType + }); + return INVALID; + } + return OK(input.data); + } + }; + ZodSymbol.create = (params) => { + return new ZodSymbol({ + typeName: ZodFirstPartyTypeKind.ZodSymbol, + ...processCreateParams(params) + }); + }; + ZodUndefined = class extends ZodType { + _parse(input) { + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.undefined) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.undefined, + received: ctx.parsedType + }); + return INVALID; + } + return OK(input.data); + } + }; + ZodUndefined.create = (params) => { + return new ZodUndefined({ + typeName: ZodFirstPartyTypeKind.ZodUndefined, + ...processCreateParams(params) + }); + }; + ZodNull = class extends ZodType { + _parse(input) { + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.null) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.null, + received: ctx.parsedType + }); + return INVALID; + } + return OK(input.data); + } + }; + ZodNull.create = (params) => { + return new ZodNull({ + typeName: ZodFirstPartyTypeKind.ZodNull, + ...processCreateParams(params) + }); + }; + ZodAny = class extends ZodType { + constructor() { + super(...arguments); + this._any = true; + } + _parse(input) { + return OK(input.data); + } + }; + ZodAny.create = (params) => { + return new ZodAny({ + typeName: ZodFirstPartyTypeKind.ZodAny, + ...processCreateParams(params) + }); + }; + ZodUnknown = class extends ZodType { + constructor() { + super(...arguments); + this._unknown = true; + } + _parse(input) { + return OK(input.data); + } + }; + ZodUnknown.create = (params) => { + return new ZodUnknown({ + typeName: ZodFirstPartyTypeKind.ZodUnknown, + ...processCreateParams(params) + }); + }; + ZodNever = class extends ZodType { + _parse(input) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.never, + received: ctx.parsedType + }); + return INVALID; + } + }; + ZodNever.create = (params) => { + return new ZodNever({ + typeName: ZodFirstPartyTypeKind.ZodNever, + ...processCreateParams(params) + }); + }; + ZodVoid = class extends ZodType { + _parse(input) { + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.undefined) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.void, + received: ctx.parsedType + }); + return INVALID; + } + return OK(input.data); + } + }; + ZodVoid.create = (params) => { + return new ZodVoid({ + typeName: ZodFirstPartyTypeKind.ZodVoid, + ...processCreateParams(params) + }); + }; + ZodArray = class _ZodArray extends ZodType { + _parse(input) { + const { ctx, status } = this._processInputParams(input); + const def = this._def; + if (ctx.parsedType !== ZodParsedType.array) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.array, + received: ctx.parsedType + }); + return INVALID; + } + if (def.exactLength !== null) { + const tooBig = ctx.data.length > def.exactLength.value; + const tooSmall = ctx.data.length < def.exactLength.value; + if (tooBig || tooSmall) { + addIssueToContext(ctx, { + code: tooBig ? ZodIssueCode.too_big : ZodIssueCode.too_small, + minimum: tooSmall ? def.exactLength.value : void 0, + maximum: tooBig ? def.exactLength.value : void 0, + type: "array", + inclusive: true, + exact: true, + message: def.exactLength.message + }); + status.dirty(); + } + } + if (def.minLength !== null) { + if (ctx.data.length < def.minLength.value) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + minimum: def.minLength.value, + type: "array", + inclusive: true, + exact: false, + message: def.minLength.message + }); + status.dirty(); + } + } + if (def.maxLength !== null) { + if (ctx.data.length > def.maxLength.value) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + maximum: def.maxLength.value, + type: "array", + inclusive: true, + exact: false, + message: def.maxLength.message + }); + status.dirty(); + } + } + if (ctx.common.async) { + return Promise.all([...ctx.data].map((item, i) => { + return def.type._parseAsync(new ParseInputLazyPath(ctx, item, ctx.path, i)); + })).then((result2) => { + return ParseStatus.mergeArray(status, result2); + }); + } + const result = [...ctx.data].map((item, i) => { + return def.type._parseSync(new ParseInputLazyPath(ctx, item, ctx.path, i)); + }); + return ParseStatus.mergeArray(status, result); + } + get element() { + return this._def.type; + } + min(minLength, message) { + return new _ZodArray({ + ...this._def, + minLength: { value: minLength, message: errorUtil.toString(message) } + }); + } + max(maxLength, message) { + return new _ZodArray({ + ...this._def, + maxLength: { value: maxLength, message: errorUtil.toString(message) } + }); + } + length(len, message) { + return new _ZodArray({ + ...this._def, + exactLength: { value: len, message: errorUtil.toString(message) } + }); + } + nonempty(message) { + return this.min(1, message); + } + }; + ZodArray.create = (schema, params) => { + return new ZodArray({ + type: schema, + minLength: null, + maxLength: null, + exactLength: null, + typeName: ZodFirstPartyTypeKind.ZodArray, + ...processCreateParams(params) + }); + }; + ZodObject = class _ZodObject extends ZodType { + constructor() { + super(...arguments); + this._cached = null; + this.nonstrict = this.passthrough; + this.augment = this.extend; + } + _getCached() { + if (this._cached !== null) + return this._cached; + const shape = this._def.shape(); + const keys = util.objectKeys(shape); + return this._cached = { shape, keys }; + } + _parse(input) { + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.object) { + const ctx2 = this._getOrReturnCtx(input); + addIssueToContext(ctx2, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.object, + received: ctx2.parsedType + }); + return INVALID; + } + const { status, ctx } = this._processInputParams(input); + const { shape, keys: shapeKeys } = this._getCached(); + const extraKeys = []; + if (!(this._def.catchall instanceof ZodNever && this._def.unknownKeys === "strip")) { + for (const key in ctx.data) { + if (!shapeKeys.includes(key)) { + extraKeys.push(key); + } + } + } + const pairs = []; + for (const key of shapeKeys) { + const keyValidator = shape[key]; + const value = ctx.data[key]; + pairs.push({ + key: { status: "valid", value: key }, + value: keyValidator._parse(new ParseInputLazyPath(ctx, value, ctx.path, key)), + alwaysSet: key in ctx.data + }); + } + if (this._def.catchall instanceof ZodNever) { + const unknownKeys = this._def.unknownKeys; + if (unknownKeys === "passthrough") { + for (const key of extraKeys) { + pairs.push({ + key: { status: "valid", value: key }, + value: { status: "valid", value: ctx.data[key] } + }); + } + } else if (unknownKeys === "strict") { + if (extraKeys.length > 0) { + addIssueToContext(ctx, { + code: ZodIssueCode.unrecognized_keys, + keys: extraKeys + }); + status.dirty(); + } + } else if (unknownKeys === "strip") ; + else { + throw new Error(`Internal ZodObject error: invalid unknownKeys value.`); + } + } else { + const catchall = this._def.catchall; + for (const key of extraKeys) { + const value = ctx.data[key]; + pairs.push({ + key: { status: "valid", value: key }, + value: catchall._parse( + new ParseInputLazyPath(ctx, value, ctx.path, key) + //, ctx.child(key), value, getParsedType(value) + ), + alwaysSet: key in ctx.data + }); + } + } + if (ctx.common.async) { + return Promise.resolve().then(async () => { + const syncPairs = []; + for (const pair of pairs) { + const key = await pair.key; + const value = await pair.value; + syncPairs.push({ + key, + value, + alwaysSet: pair.alwaysSet + }); + } + return syncPairs; + }).then((syncPairs) => { + return ParseStatus.mergeObjectSync(status, syncPairs); + }); + } else { + return ParseStatus.mergeObjectSync(status, pairs); + } + } + get shape() { + return this._def.shape(); + } + strict(message) { + errorUtil.errToObj; + return new _ZodObject({ + ...this._def, + unknownKeys: "strict", + ...message !== void 0 ? { + errorMap: (issue, ctx) => { + var _a, _b, _c, _d; + const defaultError = (_c = (_b = (_a = this._def).errorMap) === null || _b === void 0 ? void 0 : _b.call(_a, issue, ctx).message) !== null && _c !== void 0 ? _c : ctx.defaultError; + if (issue.code === "unrecognized_keys") + return { + message: (_d = errorUtil.errToObj(message).message) !== null && _d !== void 0 ? _d : defaultError + }; + return { + message: defaultError + }; + } + } : {} + }); + } + strip() { + return new _ZodObject({ + ...this._def, + unknownKeys: "strip" + }); + } + passthrough() { + return new _ZodObject({ + ...this._def, + unknownKeys: "passthrough" + }); + } + // const AugmentFactory = + // (def: Def) => + // ( + // augmentation: Augmentation + // ): ZodObject< + // extendShape, Augmentation>, + // Def["unknownKeys"], + // Def["catchall"] + // > => { + // return new ZodObject({ + // ...def, + // shape: () => ({ + // ...def.shape(), + // ...augmentation, + // }), + // }) as any; + // }; + extend(augmentation) { + return new _ZodObject({ + ...this._def, + shape: () => ({ + ...this._def.shape(), + ...augmentation + }) + }); + } + /** + * Prior to zod@1.0.12 there was a bug in the + * inferred type of merged objects. Please + * upgrade if you are experiencing issues. + */ + merge(merging) { + const merged = new _ZodObject({ + unknownKeys: merging._def.unknownKeys, + catchall: merging._def.catchall, + shape: () => ({ + ...this._def.shape(), + ...merging._def.shape() + }), + typeName: ZodFirstPartyTypeKind.ZodObject + }); + return merged; + } + // merge< + // Incoming extends AnyZodObject, + // Augmentation extends Incoming["shape"], + // NewOutput extends { + // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation + // ? Augmentation[k]["_output"] + // : k extends keyof Output + // ? Output[k] + // : never; + // }, + // NewInput extends { + // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation + // ? Augmentation[k]["_input"] + // : k extends keyof Input + // ? Input[k] + // : never; + // } + // >( + // merging: Incoming + // ): ZodObject< + // extendShape>, + // Incoming["_def"]["unknownKeys"], + // Incoming["_def"]["catchall"], + // NewOutput, + // NewInput + // > { + // const merged: any = new ZodObject({ + // unknownKeys: merging._def.unknownKeys, + // catchall: merging._def.catchall, + // shape: () => + // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()), + // typeName: ZodFirstPartyTypeKind.ZodObject, + // }) as any; + // return merged; + // } + setKey(key, schema) { + return this.augment({ [key]: schema }); + } + // merge( + // merging: Incoming + // ): //ZodObject = (merging) => { + // ZodObject< + // extendShape>, + // Incoming["_def"]["unknownKeys"], + // Incoming["_def"]["catchall"] + // > { + // // const mergedShape = objectUtil.mergeShapes( + // // this._def.shape(), + // // merging._def.shape() + // // ); + // const merged: any = new ZodObject({ + // unknownKeys: merging._def.unknownKeys, + // catchall: merging._def.catchall, + // shape: () => + // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()), + // typeName: ZodFirstPartyTypeKind.ZodObject, + // }) as any; + // return merged; + // } + catchall(index) { + return new _ZodObject({ + ...this._def, + catchall: index + }); + } + pick(mask) { + const shape = {}; + util.objectKeys(mask).forEach((key) => { + if (mask[key] && this.shape[key]) { + shape[key] = this.shape[key]; + } + }); + return new _ZodObject({ + ...this._def, + shape: () => shape + }); + } + omit(mask) { + const shape = {}; + util.objectKeys(this.shape).forEach((key) => { + if (!mask[key]) { + shape[key] = this.shape[key]; + } + }); + return new _ZodObject({ + ...this._def, + shape: () => shape + }); + } + /** + * @deprecated + */ + deepPartial() { + return deepPartialify(this); + } + partial(mask) { + const newShape = {}; + util.objectKeys(this.shape).forEach((key) => { + const fieldSchema = this.shape[key]; + if (mask && !mask[key]) { + newShape[key] = fieldSchema; + } else { + newShape[key] = fieldSchema.optional(); + } + }); + return new _ZodObject({ + ...this._def, + shape: () => newShape + }); + } + required(mask) { + const newShape = {}; + util.objectKeys(this.shape).forEach((key) => { + if (mask && !mask[key]) { + newShape[key] = this.shape[key]; + } else { + const fieldSchema = this.shape[key]; + let newField = fieldSchema; + while (newField instanceof ZodOptional) { + newField = newField._def.innerType; + } + newShape[key] = newField; + } + }); + return new _ZodObject({ + ...this._def, + shape: () => newShape + }); + } + keyof() { + return createZodEnum(util.objectKeys(this.shape)); + } + }; + ZodObject.create = (shape, params) => { + return new ZodObject({ + shape: () => shape, + unknownKeys: "strip", + catchall: ZodNever.create(), + typeName: ZodFirstPartyTypeKind.ZodObject, + ...processCreateParams(params) + }); + }; + ZodObject.strictCreate = (shape, params) => { + return new ZodObject({ + shape: () => shape, + unknownKeys: "strict", + catchall: ZodNever.create(), + typeName: ZodFirstPartyTypeKind.ZodObject, + ...processCreateParams(params) + }); + }; + ZodObject.lazycreate = (shape, params) => { + return new ZodObject({ + shape, + unknownKeys: "strip", + catchall: ZodNever.create(), + typeName: ZodFirstPartyTypeKind.ZodObject, + ...processCreateParams(params) + }); + }; + ZodUnion = class extends ZodType { + _parse(input) { + const { ctx } = this._processInputParams(input); + const options = this._def.options; + function handleResults(results) { + for (const result of results) { + if (result.result.status === "valid") { + return result.result; + } + } + for (const result of results) { + if (result.result.status === "dirty") { + ctx.common.issues.push(...result.ctx.common.issues); + return result.result; + } + } + const unionErrors = results.map((result) => new ZodError(result.ctx.common.issues)); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_union, + unionErrors + }); + return INVALID; + } + if (ctx.common.async) { + return Promise.all(options.map(async (option) => { + const childCtx = { + ...ctx, + common: { + ...ctx.common, + issues: [] + }, + parent: null + }; + return { + result: await option._parseAsync({ + data: ctx.data, + path: ctx.path, + parent: childCtx + }), + ctx: childCtx + }; + })).then(handleResults); + } else { + let dirty = void 0; + const issues = []; + for (const option of options) { + const childCtx = { + ...ctx, + common: { + ...ctx.common, + issues: [] + }, + parent: null + }; + const result = option._parseSync({ + data: ctx.data, + path: ctx.path, + parent: childCtx + }); + if (result.status === "valid") { + return result; + } else if (result.status === "dirty" && !dirty) { + dirty = { result, ctx: childCtx }; + } + if (childCtx.common.issues.length) { + issues.push(childCtx.common.issues); + } + } + if (dirty) { + ctx.common.issues.push(...dirty.ctx.common.issues); + return dirty.result; + } + const unionErrors = issues.map((issues2) => new ZodError(issues2)); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_union, + unionErrors + }); + return INVALID; + } + } + get options() { + return this._def.options; + } + }; + ZodUnion.create = (types, params) => { + return new ZodUnion({ + options: types, + typeName: ZodFirstPartyTypeKind.ZodUnion, + ...processCreateParams(params) + }); + }; + getDiscriminator = (type) => { + if (type instanceof ZodLazy) { + return getDiscriminator(type.schema); + } else if (type instanceof ZodEffects) { + return getDiscriminator(type.innerType()); + } else if (type instanceof ZodLiteral) { + return [type.value]; + } else if (type instanceof ZodEnum) { + return type.options; + } else if (type instanceof ZodNativeEnum) { + return util.objectValues(type.enum); + } else if (type instanceof ZodDefault) { + return getDiscriminator(type._def.innerType); + } else if (type instanceof ZodUndefined) { + return [void 0]; + } else if (type instanceof ZodNull) { + return [null]; + } else if (type instanceof ZodOptional) { + return [void 0, ...getDiscriminator(type.unwrap())]; + } else if (type instanceof ZodNullable) { + return [null, ...getDiscriminator(type.unwrap())]; + } else if (type instanceof ZodBranded) { + return getDiscriminator(type.unwrap()); + } else if (type instanceof ZodReadonly) { + return getDiscriminator(type.unwrap()); + } else if (type instanceof ZodCatch) { + return getDiscriminator(type._def.innerType); + } else { + return []; + } + }; + ZodDiscriminatedUnion = class _ZodDiscriminatedUnion extends ZodType { + _parse(input) { + const { ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.object) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.object, + received: ctx.parsedType + }); + return INVALID; + } + const discriminator = this.discriminator; + const discriminatorValue = ctx.data[discriminator]; + const option = this.optionsMap.get(discriminatorValue); + if (!option) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_union_discriminator, + options: Array.from(this.optionsMap.keys()), + path: [discriminator] + }); + return INVALID; + } + if (ctx.common.async) { + return option._parseAsync({ + data: ctx.data, + path: ctx.path, + parent: ctx + }); + } else { + return option._parseSync({ + data: ctx.data, + path: ctx.path, + parent: ctx + }); + } + } + get discriminator() { + return this._def.discriminator; + } + get options() { + return this._def.options; + } + get optionsMap() { + return this._def.optionsMap; + } + /** + * The constructor of the discriminated union schema. Its behaviour is very similar to that of the normal z.union() constructor. + * However, it only allows a union of objects, all of which need to share a discriminator property. This property must + * have a different value for each object in the union. + * @param discriminator the name of the discriminator property + * @param types an array of object schemas + * @param params + */ + static create(discriminator, options, params) { + const optionsMap = /* @__PURE__ */ new Map(); + for (const type of options) { + const discriminatorValues = getDiscriminator(type.shape[discriminator]); + if (!discriminatorValues.length) { + throw new Error(`A discriminator value for key \`${discriminator}\` could not be extracted from all schema options`); + } + for (const value of discriminatorValues) { + if (optionsMap.has(value)) { + throw new Error(`Discriminator property ${String(discriminator)} has duplicate value ${String(value)}`); + } + optionsMap.set(value, type); + } + } + return new _ZodDiscriminatedUnion({ + typeName: ZodFirstPartyTypeKind.ZodDiscriminatedUnion, + discriminator, + options, + optionsMap, + ...processCreateParams(params) + }); + } + }; + ZodIntersection = class extends ZodType { + _parse(input) { + const { status, ctx } = this._processInputParams(input); + const handleParsed = (parsedLeft, parsedRight) => { + if (isAborted(parsedLeft) || isAborted(parsedRight)) { + return INVALID; + } + const merged = mergeValues(parsedLeft.value, parsedRight.value); + if (!merged.valid) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_intersection_types + }); + return INVALID; + } + if (isDirty(parsedLeft) || isDirty(parsedRight)) { + status.dirty(); + } + return { status: status.value, value: merged.data }; + }; + if (ctx.common.async) { + return Promise.all([ + this._def.left._parseAsync({ + data: ctx.data, + path: ctx.path, + parent: ctx + }), + this._def.right._parseAsync({ + data: ctx.data, + path: ctx.path, + parent: ctx + }) + ]).then(([left, right]) => handleParsed(left, right)); + } else { + return handleParsed(this._def.left._parseSync({ + data: ctx.data, + path: ctx.path, + parent: ctx + }), this._def.right._parseSync({ + data: ctx.data, + path: ctx.path, + parent: ctx + })); + } + } + }; + ZodIntersection.create = (left, right, params) => { + return new ZodIntersection({ + left, + right, + typeName: ZodFirstPartyTypeKind.ZodIntersection, + ...processCreateParams(params) + }); + }; + ZodTuple = class _ZodTuple extends ZodType { + _parse(input) { + const { status, ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.array) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.array, + received: ctx.parsedType + }); + return INVALID; + } + if (ctx.data.length < this._def.items.length) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + minimum: this._def.items.length, + inclusive: true, + exact: false, + type: "array" + }); + return INVALID; + } + const rest = this._def.rest; + if (!rest && ctx.data.length > this._def.items.length) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + maximum: this._def.items.length, + inclusive: true, + exact: false, + type: "array" + }); + status.dirty(); + } + const items = [...ctx.data].map((item, itemIndex) => { + const schema = this._def.items[itemIndex] || this._def.rest; + if (!schema) + return null; + return schema._parse(new ParseInputLazyPath(ctx, item, ctx.path, itemIndex)); + }).filter((x) => !!x); + if (ctx.common.async) { + return Promise.all(items).then((results) => { + return ParseStatus.mergeArray(status, results); + }); + } else { + return ParseStatus.mergeArray(status, items); + } + } + get items() { + return this._def.items; + } + rest(rest) { + return new _ZodTuple({ + ...this._def, + rest + }); + } + }; + ZodTuple.create = (schemas, params) => { + if (!Array.isArray(schemas)) { + throw new Error("You must pass an array of schemas to z.tuple([ ... ])"); + } + return new ZodTuple({ + items: schemas, + typeName: ZodFirstPartyTypeKind.ZodTuple, + rest: null, + ...processCreateParams(params) + }); + }; + ZodRecord = class _ZodRecord extends ZodType { + get keySchema() { + return this._def.keyType; + } + get valueSchema() { + return this._def.valueType; + } + _parse(input) { + const { status, ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.object) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.object, + received: ctx.parsedType + }); + return INVALID; + } + const pairs = []; + const keyType = this._def.keyType; + const valueType = this._def.valueType; + for (const key in ctx.data) { + pairs.push({ + key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, key)), + value: valueType._parse(new ParseInputLazyPath(ctx, ctx.data[key], ctx.path, key)), + alwaysSet: key in ctx.data + }); + } + if (ctx.common.async) { + return ParseStatus.mergeObjectAsync(status, pairs); + } else { + return ParseStatus.mergeObjectSync(status, pairs); + } + } + get element() { + return this._def.valueType; + } + static create(first, second, third) { + if (second instanceof ZodType) { + return new _ZodRecord({ + keyType: first, + valueType: second, + typeName: ZodFirstPartyTypeKind.ZodRecord, + ...processCreateParams(third) + }); + } + return new _ZodRecord({ + keyType: ZodString.create(), + valueType: first, + typeName: ZodFirstPartyTypeKind.ZodRecord, + ...processCreateParams(second) + }); + } + }; + ZodMap = class extends ZodType { + get keySchema() { + return this._def.keyType; + } + get valueSchema() { + return this._def.valueType; + } + _parse(input) { + const { status, ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.map) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.map, + received: ctx.parsedType + }); + return INVALID; + } + const keyType = this._def.keyType; + const valueType = this._def.valueType; + const pairs = [...ctx.data.entries()].map(([key, value], index) => { + return { + key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, [index, "key"])), + value: valueType._parse(new ParseInputLazyPath(ctx, value, ctx.path, [index, "value"])) + }; + }); + if (ctx.common.async) { + const finalMap = /* @__PURE__ */ new Map(); + return Promise.resolve().then(async () => { + for (const pair of pairs) { + const key = await pair.key; + const value = await pair.value; + if (key.status === "aborted" || value.status === "aborted") { + return INVALID; + } + if (key.status === "dirty" || value.status === "dirty") { + status.dirty(); + } + finalMap.set(key.value, value.value); + } + return { status: status.value, value: finalMap }; + }); + } else { + const finalMap = /* @__PURE__ */ new Map(); + for (const pair of pairs) { + const key = pair.key; + const value = pair.value; + if (key.status === "aborted" || value.status === "aborted") { + return INVALID; + } + if (key.status === "dirty" || value.status === "dirty") { + status.dirty(); + } + finalMap.set(key.value, value.value); + } + return { status: status.value, value: finalMap }; + } + } + }; + ZodMap.create = (keyType, valueType, params) => { + return new ZodMap({ + valueType, + keyType, + typeName: ZodFirstPartyTypeKind.ZodMap, + ...processCreateParams(params) + }); + }; + ZodSet = class _ZodSet extends ZodType { + _parse(input) { + const { status, ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.set) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.set, + received: ctx.parsedType + }); + return INVALID; + } + const def = this._def; + if (def.minSize !== null) { + if (ctx.data.size < def.minSize.value) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + minimum: def.minSize.value, + type: "set", + inclusive: true, + exact: false, + message: def.minSize.message + }); + status.dirty(); + } + } + if (def.maxSize !== null) { + if (ctx.data.size > def.maxSize.value) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + maximum: def.maxSize.value, + type: "set", + inclusive: true, + exact: false, + message: def.maxSize.message + }); + status.dirty(); + } + } + const valueType = this._def.valueType; + function finalizeSet(elements2) { + const parsedSet = /* @__PURE__ */ new Set(); + for (const element of elements2) { + if (element.status === "aborted") + return INVALID; + if (element.status === "dirty") + status.dirty(); + parsedSet.add(element.value); + } + return { status: status.value, value: parsedSet }; + } + const elements = [...ctx.data.values()].map((item, i) => valueType._parse(new ParseInputLazyPath(ctx, item, ctx.path, i))); + if (ctx.common.async) { + return Promise.all(elements).then((elements2) => finalizeSet(elements2)); + } else { + return finalizeSet(elements); + } + } + min(minSize, message) { + return new _ZodSet({ + ...this._def, + minSize: { value: minSize, message: errorUtil.toString(message) } + }); + } + max(maxSize, message) { + return new _ZodSet({ + ...this._def, + maxSize: { value: maxSize, message: errorUtil.toString(message) } + }); + } + size(size, message) { + return this.min(size, message).max(size, message); + } + nonempty(message) { + return this.min(1, message); + } + }; + ZodSet.create = (valueType, params) => { + return new ZodSet({ + valueType, + minSize: null, + maxSize: null, + typeName: ZodFirstPartyTypeKind.ZodSet, + ...processCreateParams(params) + }); + }; + ZodFunction = class _ZodFunction extends ZodType { + constructor() { + super(...arguments); + this.validate = this.implement; + } + _parse(input) { + const { ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.function) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.function, + received: ctx.parsedType + }); + return INVALID; + } + function makeArgsIssue(args, error) { + return makeIssue({ + data: args, + path: ctx.path, + errorMaps: [ + ctx.common.contextualErrorMap, + ctx.schemaErrorMap, + getErrorMap(), + errorMap + ].filter((x) => !!x), + issueData: { + code: ZodIssueCode.invalid_arguments, + argumentsError: error + } + }); + } + function makeReturnsIssue(returns, error) { + return makeIssue({ + data: returns, + path: ctx.path, + errorMaps: [ + ctx.common.contextualErrorMap, + ctx.schemaErrorMap, + getErrorMap(), + errorMap + ].filter((x) => !!x), + issueData: { + code: ZodIssueCode.invalid_return_type, + returnTypeError: error + } + }); + } + const params = { errorMap: ctx.common.contextualErrorMap }; + const fn = ctx.data; + if (this._def.returns instanceof ZodPromise) { + const me = this; + return OK(async function(...args) { + const error = new ZodError([]); + const parsedArgs = await me._def.args.parseAsync(args, params).catch((e) => { + error.addIssue(makeArgsIssue(args, e)); + throw error; + }); + const result = await Reflect.apply(fn, this, parsedArgs); + const parsedReturns = await me._def.returns._def.type.parseAsync(result, params).catch((e) => { + error.addIssue(makeReturnsIssue(result, e)); + throw error; + }); + return parsedReturns; + }); + } else { + const me = this; + return OK(function(...args) { + const parsedArgs = me._def.args.safeParse(args, params); + if (!parsedArgs.success) { + throw new ZodError([makeArgsIssue(args, parsedArgs.error)]); + } + const result = Reflect.apply(fn, this, parsedArgs.data); + const parsedReturns = me._def.returns.safeParse(result, params); + if (!parsedReturns.success) { + throw new ZodError([makeReturnsIssue(result, parsedReturns.error)]); + } + return parsedReturns.data; + }); + } + } + parameters() { + return this._def.args; + } + returnType() { + return this._def.returns; + } + args(...items) { + return new _ZodFunction({ + ...this._def, + args: ZodTuple.create(items).rest(ZodUnknown.create()) + }); + } + returns(returnType) { + return new _ZodFunction({ + ...this._def, + returns: returnType + }); + } + implement(func) { + const validatedFunc = this.parse(func); + return validatedFunc; + } + strictImplement(func) { + const validatedFunc = this.parse(func); + return validatedFunc; + } + static create(args, returns, params) { + return new _ZodFunction({ + args: args ? args : ZodTuple.create([]).rest(ZodUnknown.create()), + returns: returns || ZodUnknown.create(), + typeName: ZodFirstPartyTypeKind.ZodFunction, + ...processCreateParams(params) + }); + } + }; + ZodLazy = class extends ZodType { + get schema() { + return this._def.getter(); + } + _parse(input) { + const { ctx } = this._processInputParams(input); + const lazySchema = this._def.getter(); + return lazySchema._parse({ data: ctx.data, path: ctx.path, parent: ctx }); + } + }; + ZodLazy.create = (getter, params) => { + return new ZodLazy({ + getter, + typeName: ZodFirstPartyTypeKind.ZodLazy, + ...processCreateParams(params) + }); + }; + ZodLiteral = class extends ZodType { + _parse(input) { + if (input.data !== this._def.value) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + received: ctx.data, + code: ZodIssueCode.invalid_literal, + expected: this._def.value + }); + return INVALID; + } + return { status: "valid", value: input.data }; + } + get value() { + return this._def.value; + } + }; + ZodLiteral.create = (value, params) => { + return new ZodLiteral({ + value, + typeName: ZodFirstPartyTypeKind.ZodLiteral, + ...processCreateParams(params) + }); + }; + ZodEnum = class _ZodEnum extends ZodType { + constructor() { + super(...arguments); + _ZodEnum_cache.set(this, void 0); + } + _parse(input) { + if (typeof input.data !== "string") { + const ctx = this._getOrReturnCtx(input); + const expectedValues = this._def.values; + addIssueToContext(ctx, { + expected: util.joinValues(expectedValues), + received: ctx.parsedType, + code: ZodIssueCode.invalid_type + }); + return INVALID; + } + if (!__classPrivateFieldGet(this, _ZodEnum_cache, "f")) { + __classPrivateFieldSet(this, _ZodEnum_cache, new Set(this._def.values), "f"); + } + if (!__classPrivateFieldGet(this, _ZodEnum_cache, "f").has(input.data)) { + const ctx = this._getOrReturnCtx(input); + const expectedValues = this._def.values; + addIssueToContext(ctx, { + received: ctx.data, + code: ZodIssueCode.invalid_enum_value, + options: expectedValues + }); + return INVALID; + } + return OK(input.data); + } + get options() { + return this._def.values; + } + get enum() { + const enumValues = {}; + for (const val of this._def.values) { + enumValues[val] = val; + } + return enumValues; + } + get Values() { + const enumValues = {}; + for (const val of this._def.values) { + enumValues[val] = val; + } + return enumValues; + } + get Enum() { + const enumValues = {}; + for (const val of this._def.values) { + enumValues[val] = val; + } + return enumValues; + } + extract(values, newDef = this._def) { + return _ZodEnum.create(values, { + ...this._def, + ...newDef + }); + } + exclude(values, newDef = this._def) { + return _ZodEnum.create(this.options.filter((opt) => !values.includes(opt)), { + ...this._def, + ...newDef + }); + } + }; + _ZodEnum_cache = /* @__PURE__ */ new WeakMap(); + ZodEnum.create = createZodEnum; + ZodNativeEnum = class extends ZodType { + constructor() { + super(...arguments); + _ZodNativeEnum_cache.set(this, void 0); + } + _parse(input) { + const nativeEnumValues = util.getValidEnumValues(this._def.values); + const ctx = this._getOrReturnCtx(input); + if (ctx.parsedType !== ZodParsedType.string && ctx.parsedType !== ZodParsedType.number) { + const expectedValues = util.objectValues(nativeEnumValues); + addIssueToContext(ctx, { + expected: util.joinValues(expectedValues), + received: ctx.parsedType, + code: ZodIssueCode.invalid_type + }); + return INVALID; + } + if (!__classPrivateFieldGet(this, _ZodNativeEnum_cache, "f")) { + __classPrivateFieldSet(this, _ZodNativeEnum_cache, new Set(util.getValidEnumValues(this._def.values)), "f"); + } + if (!__classPrivateFieldGet(this, _ZodNativeEnum_cache, "f").has(input.data)) { + const expectedValues = util.objectValues(nativeEnumValues); + addIssueToContext(ctx, { + received: ctx.data, + code: ZodIssueCode.invalid_enum_value, + options: expectedValues + }); + return INVALID; + } + return OK(input.data); + } + get enum() { + return this._def.values; + } + }; + _ZodNativeEnum_cache = /* @__PURE__ */ new WeakMap(); + ZodNativeEnum.create = (values, params) => { + return new ZodNativeEnum({ + values, + typeName: ZodFirstPartyTypeKind.ZodNativeEnum, + ...processCreateParams(params) + }); + }; + ZodPromise = class extends ZodType { + unwrap() { + return this._def.type; + } + _parse(input) { + const { ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.promise && ctx.common.async === false) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.promise, + received: ctx.parsedType + }); + return INVALID; + } + const promisified = ctx.parsedType === ZodParsedType.promise ? ctx.data : Promise.resolve(ctx.data); + return OK(promisified.then((data) => { + return this._def.type.parseAsync(data, { + path: ctx.path, + errorMap: ctx.common.contextualErrorMap + }); + })); + } + }; + ZodPromise.create = (schema, params) => { + return new ZodPromise({ + type: schema, + typeName: ZodFirstPartyTypeKind.ZodPromise, + ...processCreateParams(params) + }); + }; + ZodEffects = class extends ZodType { + innerType() { + return this._def.schema; + } + sourceType() { + return this._def.schema._def.typeName === ZodFirstPartyTypeKind.ZodEffects ? this._def.schema.sourceType() : this._def.schema; + } + _parse(input) { + const { status, ctx } = this._processInputParams(input); + const effect = this._def.effect || null; + const checkCtx = { + addIssue: (arg) => { + addIssueToContext(ctx, arg); + if (arg.fatal) { + status.abort(); + } else { + status.dirty(); + } + }, + get path() { + return ctx.path; + } + }; + checkCtx.addIssue = checkCtx.addIssue.bind(checkCtx); + if (effect.type === "preprocess") { + const processed = effect.transform(ctx.data, checkCtx); + if (ctx.common.async) { + return Promise.resolve(processed).then(async (processed2) => { + if (status.value === "aborted") + return INVALID; + const result = await this._def.schema._parseAsync({ + data: processed2, + path: ctx.path, + parent: ctx + }); + if (result.status === "aborted") + return INVALID; + if (result.status === "dirty") + return DIRTY(result.value); + if (status.value === "dirty") + return DIRTY(result.value); + return result; + }); + } else { + if (status.value === "aborted") + return INVALID; + const result = this._def.schema._parseSync({ + data: processed, + path: ctx.path, + parent: ctx + }); + if (result.status === "aborted") + return INVALID; + if (result.status === "dirty") + return DIRTY(result.value); + if (status.value === "dirty") + return DIRTY(result.value); + return result; + } + } + if (effect.type === "refinement") { + const executeRefinement = (acc) => { + const result = effect.refinement(acc, checkCtx); + if (ctx.common.async) { + return Promise.resolve(result); + } + if (result instanceof Promise) { + throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead."); + } + return acc; + }; + if (ctx.common.async === false) { + const inner = this._def.schema._parseSync({ + data: ctx.data, + path: ctx.path, + parent: ctx + }); + if (inner.status === "aborted") + return INVALID; + if (inner.status === "dirty") + status.dirty(); + executeRefinement(inner.value); + return { status: status.value, value: inner.value }; + } else { + return this._def.schema._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }).then((inner) => { + if (inner.status === "aborted") + return INVALID; + if (inner.status === "dirty") + status.dirty(); + return executeRefinement(inner.value).then(() => { + return { status: status.value, value: inner.value }; + }); + }); + } + } + if (effect.type === "transform") { + if (ctx.common.async === false) { + const base = this._def.schema._parseSync({ + data: ctx.data, + path: ctx.path, + parent: ctx + }); + if (!isValid(base)) + return base; + const result = effect.transform(base.value, checkCtx); + if (result instanceof Promise) { + throw new Error(`Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.`); + } + return { status: status.value, value: result }; + } else { + return this._def.schema._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }).then((base) => { + if (!isValid(base)) + return base; + return Promise.resolve(effect.transform(base.value, checkCtx)).then((result) => ({ status: status.value, value: result })); + }); + } + } + util.assertNever(effect); + } + }; + ZodEffects.create = (schema, effect, params) => { + return new ZodEffects({ + schema, + typeName: ZodFirstPartyTypeKind.ZodEffects, + effect, + ...processCreateParams(params) + }); + }; + ZodEffects.createWithPreprocess = (preprocess, schema, params) => { + return new ZodEffects({ + schema, + effect: { type: "preprocess", transform: preprocess }, + typeName: ZodFirstPartyTypeKind.ZodEffects, + ...processCreateParams(params) + }); + }; + ZodOptional = class extends ZodType { + _parse(input) { + const parsedType = this._getType(input); + if (parsedType === ZodParsedType.undefined) { + return OK(void 0); + } + return this._def.innerType._parse(input); + } + unwrap() { + return this._def.innerType; + } + }; + ZodOptional.create = (type, params) => { + return new ZodOptional({ + innerType: type, + typeName: ZodFirstPartyTypeKind.ZodOptional, + ...processCreateParams(params) + }); + }; + ZodNullable = class extends ZodType { + _parse(input) { + const parsedType = this._getType(input); + if (parsedType === ZodParsedType.null) { + return OK(null); + } + return this._def.innerType._parse(input); + } + unwrap() { + return this._def.innerType; + } + }; + ZodNullable.create = (type, params) => { + return new ZodNullable({ + innerType: type, + typeName: ZodFirstPartyTypeKind.ZodNullable, + ...processCreateParams(params) + }); + }; + ZodDefault = class extends ZodType { + _parse(input) { + const { ctx } = this._processInputParams(input); + let data = ctx.data; + if (ctx.parsedType === ZodParsedType.undefined) { + data = this._def.defaultValue(); + } + return this._def.innerType._parse({ + data, + path: ctx.path, + parent: ctx + }); + } + removeDefault() { + return this._def.innerType; + } + }; + ZodDefault.create = (type, params) => { + return new ZodDefault({ + innerType: type, + typeName: ZodFirstPartyTypeKind.ZodDefault, + defaultValue: typeof params.default === "function" ? params.default : () => params.default, + ...processCreateParams(params) + }); + }; + ZodCatch = class extends ZodType { + _parse(input) { + const { ctx } = this._processInputParams(input); + const newCtx = { + ...ctx, + common: { + ...ctx.common, + issues: [] + } + }; + const result = this._def.innerType._parse({ + data: newCtx.data, + path: newCtx.path, + parent: { + ...newCtx + } + }); + if (isAsync(result)) { + return result.then((result2) => { + return { + status: "valid", + value: result2.status === "valid" ? result2.value : this._def.catchValue({ + get error() { + return new ZodError(newCtx.common.issues); + }, + input: newCtx.data + }) + }; + }); + } else { + return { + status: "valid", + value: result.status === "valid" ? result.value : this._def.catchValue({ + get error() { + return new ZodError(newCtx.common.issues); + }, + input: newCtx.data + }) + }; + } + } + removeCatch() { + return this._def.innerType; + } + }; + ZodCatch.create = (type, params) => { + return new ZodCatch({ + innerType: type, + typeName: ZodFirstPartyTypeKind.ZodCatch, + catchValue: typeof params.catch === "function" ? params.catch : () => params.catch, + ...processCreateParams(params) + }); + }; + ZodNaN = class extends ZodType { + _parse(input) { + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.nan) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.nan, + received: ctx.parsedType + }); + return INVALID; + } + return { status: "valid", value: input.data }; + } + }; + ZodNaN.create = (params) => { + return new ZodNaN({ + typeName: ZodFirstPartyTypeKind.ZodNaN, + ...processCreateParams(params) + }); + }; + BRAND = Symbol("zod_brand"); + ZodBranded = class extends ZodType { + _parse(input) { + const { ctx } = this._processInputParams(input); + const data = ctx.data; + return this._def.type._parse({ + data, + path: ctx.path, + parent: ctx + }); + } + unwrap() { + return this._def.type; + } + }; + ZodPipeline = class _ZodPipeline extends ZodType { + _parse(input) { + const { status, ctx } = this._processInputParams(input); + if (ctx.common.async) { + const handleAsync = async () => { + const inResult = await this._def.in._parseAsync({ + data: ctx.data, + path: ctx.path, + parent: ctx + }); + if (inResult.status === "aborted") + return INVALID; + if (inResult.status === "dirty") { + status.dirty(); + return DIRTY(inResult.value); + } else { + return this._def.out._parseAsync({ + data: inResult.value, + path: ctx.path, + parent: ctx + }); + } + }; + return handleAsync(); + } else { + const inResult = this._def.in._parseSync({ + data: ctx.data, + path: ctx.path, + parent: ctx + }); + if (inResult.status === "aborted") + return INVALID; + if (inResult.status === "dirty") { + status.dirty(); + return { + status: "dirty", + value: inResult.value + }; + } else { + return this._def.out._parseSync({ + data: inResult.value, + path: ctx.path, + parent: ctx + }); + } + } + } + static create(a, b) { + return new _ZodPipeline({ + in: a, + out: b, + typeName: ZodFirstPartyTypeKind.ZodPipeline + }); + } + }; + ZodReadonly = class extends ZodType { + _parse(input) { + const result = this._def.innerType._parse(input); + const freeze = (data) => { + if (isValid(data)) { + data.value = Object.freeze(data.value); + } + return data; + }; + return isAsync(result) ? result.then((data) => freeze(data)) : freeze(result); + } + unwrap() { + return this._def.innerType; + } + }; + ZodReadonly.create = (type, params) => { + return new ZodReadonly({ + innerType: type, + typeName: ZodFirstPartyTypeKind.ZodReadonly, + ...processCreateParams(params) + }); + }; + late = { + object: ZodObject.lazycreate + }; + (function(ZodFirstPartyTypeKind2) { + ZodFirstPartyTypeKind2["ZodString"] = "ZodString"; + ZodFirstPartyTypeKind2["ZodNumber"] = "ZodNumber"; + ZodFirstPartyTypeKind2["ZodNaN"] = "ZodNaN"; + ZodFirstPartyTypeKind2["ZodBigInt"] = "ZodBigInt"; + ZodFirstPartyTypeKind2["ZodBoolean"] = "ZodBoolean"; + ZodFirstPartyTypeKind2["ZodDate"] = "ZodDate"; + ZodFirstPartyTypeKind2["ZodSymbol"] = "ZodSymbol"; + ZodFirstPartyTypeKind2["ZodUndefined"] = "ZodUndefined"; + ZodFirstPartyTypeKind2["ZodNull"] = "ZodNull"; + ZodFirstPartyTypeKind2["ZodAny"] = "ZodAny"; + ZodFirstPartyTypeKind2["ZodUnknown"] = "ZodUnknown"; + ZodFirstPartyTypeKind2["ZodNever"] = "ZodNever"; + ZodFirstPartyTypeKind2["ZodVoid"] = "ZodVoid"; + ZodFirstPartyTypeKind2["ZodArray"] = "ZodArray"; + ZodFirstPartyTypeKind2["ZodObject"] = "ZodObject"; + ZodFirstPartyTypeKind2["ZodUnion"] = "ZodUnion"; + ZodFirstPartyTypeKind2["ZodDiscriminatedUnion"] = "ZodDiscriminatedUnion"; + ZodFirstPartyTypeKind2["ZodIntersection"] = "ZodIntersection"; + ZodFirstPartyTypeKind2["ZodTuple"] = "ZodTuple"; + ZodFirstPartyTypeKind2["ZodRecord"] = "ZodRecord"; + ZodFirstPartyTypeKind2["ZodMap"] = "ZodMap"; + ZodFirstPartyTypeKind2["ZodSet"] = "ZodSet"; + ZodFirstPartyTypeKind2["ZodFunction"] = "ZodFunction"; + ZodFirstPartyTypeKind2["ZodLazy"] = "ZodLazy"; + ZodFirstPartyTypeKind2["ZodLiteral"] = "ZodLiteral"; + ZodFirstPartyTypeKind2["ZodEnum"] = "ZodEnum"; + ZodFirstPartyTypeKind2["ZodEffects"] = "ZodEffects"; + ZodFirstPartyTypeKind2["ZodNativeEnum"] = "ZodNativeEnum"; + ZodFirstPartyTypeKind2["ZodOptional"] = "ZodOptional"; + ZodFirstPartyTypeKind2["ZodNullable"] = "ZodNullable"; + ZodFirstPartyTypeKind2["ZodDefault"] = "ZodDefault"; + ZodFirstPartyTypeKind2["ZodCatch"] = "ZodCatch"; + ZodFirstPartyTypeKind2["ZodPromise"] = "ZodPromise"; + ZodFirstPartyTypeKind2["ZodBranded"] = "ZodBranded"; + ZodFirstPartyTypeKind2["ZodPipeline"] = "ZodPipeline"; + ZodFirstPartyTypeKind2["ZodReadonly"] = "ZodReadonly"; + })(ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {})); + instanceOfType = (cls, params = { + message: `Input not instance of ${cls.name}` + }) => custom((data) => data instanceof cls, params); + stringType = ZodString.create; + numberType = ZodNumber.create; + nanType = ZodNaN.create; + bigIntType = ZodBigInt.create; + booleanType = ZodBoolean.create; + dateType = ZodDate.create; + symbolType = ZodSymbol.create; + undefinedType = ZodUndefined.create; + nullType = ZodNull.create; + anyType = ZodAny.create; + unknownType = ZodUnknown.create; + neverType = ZodNever.create; + voidType = ZodVoid.create; + arrayType = ZodArray.create; + objectType = ZodObject.create; + strictObjectType = ZodObject.strictCreate; + unionType = ZodUnion.create; + discriminatedUnionType = ZodDiscriminatedUnion.create; + intersectionType = ZodIntersection.create; + tupleType = ZodTuple.create; + recordType = ZodRecord.create; + mapType = ZodMap.create; + setType = ZodSet.create; + functionType = ZodFunction.create; + lazyType = ZodLazy.create; + literalType = ZodLiteral.create; + enumType = ZodEnum.create; + nativeEnumType = ZodNativeEnum.create; + promiseType = ZodPromise.create; + effectsType = ZodEffects.create; + optionalType = ZodOptional.create; + nullableType = ZodNullable.create; + preprocessType = ZodEffects.createWithPreprocess; + pipelineType = ZodPipeline.create; + ostring = () => stringType().optional(); + onumber = () => numberType().optional(); + oboolean = () => booleanType().optional(); + coerce = { + string: (arg) => ZodString.create({ ...arg, coerce: true }), + number: (arg) => ZodNumber.create({ ...arg, coerce: true }), + boolean: (arg) => ZodBoolean.create({ + ...arg, + coerce: true + }), + bigint: (arg) => ZodBigInt.create({ ...arg, coerce: true }), + date: (arg) => ZodDate.create({ ...arg, coerce: true }) + }; + NEVER = INVALID; + z = /* @__PURE__ */ Object.freeze({ + __proto__: null, + defaultErrorMap: errorMap, + setErrorMap, + getErrorMap, + makeIssue, + EMPTY_PATH, + addIssueToContext, + ParseStatus, + INVALID, + DIRTY, + OK, + isAborted, + isDirty, + isValid, + isAsync, + get util() { + return util; + }, + get objectUtil() { + return objectUtil; + }, + ZodParsedType, + getParsedType, + ZodType, + datetimeRegex, + ZodString, + ZodNumber, + ZodBigInt, + ZodBoolean, + ZodDate, + ZodSymbol, + ZodUndefined, + ZodNull, + ZodAny, + ZodUnknown, + ZodNever, + ZodVoid, + ZodArray, + ZodObject, + ZodUnion, + ZodDiscriminatedUnion, + ZodIntersection, + ZodTuple, + ZodRecord, + ZodMap, + ZodSet, + ZodFunction, + ZodLazy, + ZodLiteral, + ZodEnum, + ZodNativeEnum, + ZodPromise, + ZodEffects, + ZodTransformer: ZodEffects, + ZodOptional, + ZodNullable, + ZodDefault, + ZodCatch, + ZodNaN, + BRAND, + ZodBranded, + ZodPipeline, + ZodReadonly, + custom, + Schema: ZodType, + ZodSchema: ZodType, + late, + get ZodFirstPartyTypeKind() { + return ZodFirstPartyTypeKind; + }, + coerce, + any: anyType, + array: arrayType, + bigint: bigIntType, + boolean: booleanType, + date: dateType, + discriminatedUnion: discriminatedUnionType, + effect: effectsType, + "enum": enumType, + "function": functionType, + "instanceof": instanceOfType, + intersection: intersectionType, + lazy: lazyType, + literal: literalType, + map: mapType, + nan: nanType, + nativeEnum: nativeEnumType, + never: neverType, + "null": nullType, + nullable: nullableType, + number: numberType, + object: objectType, + oboolean, + onumber, + optional: optionalType, + ostring, + pipeline: pipelineType, + preprocess: preprocessType, + promise: promiseType, + record: recordType, + set: setType, + strictObject: strictObjectType, + string: stringType, + symbol: symbolType, + transformer: effectsType, + tuple: tupleType, + "undefined": undefinedType, + union: unionType, + unknown: unknownType, + "void": voidType, + NEVER, + ZodIssueCode, + quotelessJson, + ZodError + }); + } +}); + +// cypher-executor/src/lib/prompt-recipe-schema.ts +var TransformSchema, KBDBBlockFragmentSchema, KVFragmentSchema, FragmentSchema, InputSchema, PromptAssemblySchema, OutputSpecSchema, PromptRecipeSchema; +var init_prompt_recipe_schema = __esm({ + "cypher-executor/src/lib/prompt-recipe-schema.ts"() { + "use strict"; + init_lib(); + TransformSchema = z.string().regex(/^[a-z_]+(:.+)?$/, "transform \u5FC5\u9808\u70BA name \u6216 name:arg \u683C\u5F0F"); + KBDBBlockFragmentSchema = z.object({ + var: z.string().min(1), + // prompt template 內的變數名 + source: z.literal("kbdb_block"), + block_id: z.string().optional(), + // 二擇一 + block_page_name: z.string().optional(), + // 比 block_id 穩定 + field: z.string().default("content") + // 抓 block 的哪個欄位 + }); + KVFragmentSchema = z.object({ + var: z.string().min(1), + source: z.literal("kv"), + key: z.string().min(1) + }); + FragmentSchema = z.discriminatedUnion("source", [ + KBDBBlockFragmentSchema, + KVFragmentSchema + ]).superRefine((d, ctx) => { + if (d.source === "kbdb_block" && !d.block_id && !d.block_page_name) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: "block_id \u6216 block_page_name \u5FC5\u586B\u5176\u4E00" + }); + } + }); + InputSchema = z.object({ + var: z.string().min(1), + from: z.string().min(1), + // JSONPath-lite,如 "ctx.read_drafts.blocks" + transform: TransformSchema.optional(), + default: z.unknown().optional() + // from 取不到時的預設值(避免炸 prompt) + }); + PromptAssemblySchema = z.object({ + system: z.string().min(1), + // 模板,可含 {{var}} + user: z.string().min(1) + }); + OutputSpecSchema = z.object({ + format: z.enum(["text", "json"]).default("text"), + // 若 format=json,可選 schema 做 parse 後驗證(簡化版,列必填欄位即可) + required_fields: z.array(z.string()).optional() + }); + PromptRecipeSchema = z.object({ + kind: z.literal("prompt_recipe"), + name: z.string().min(1).regex(/^[a-z][a-z0-9_]*$/, "name \u70BA lowercase + underscore"), + version: z.number().int().positive().default(1), + description: z.string().optional(), + model: z.enum(["haiku", "sonnet", "opus"]).default("sonnet"), + fragments: z.array(FragmentSchema).default([]), + inputs: z.array(InputSchema).default([]), + prompt_assembly: PromptAssemblySchema, + output: OutputSpecSchema.default({ format: "text" }) + }); + } +}); + +// cypher-executor/src/lib/recipe-loader.ts +async function loadPromptRecipe(recipeRef, recipesKv) { + const key = recipeRef.startsWith("prompt_recipe:") ? recipeRef : `prompt_recipe:${recipeRef}`; + const raw2 = await recipesKv.get(key); + if (!raw2) { + throw new RecipeLoadError(`\u627E\u4E0D\u5230 recipe: ${key}`, key); + } + let parsed; + try { + parsed = JSON.parse(raw2); + } catch (e) { + throw new RecipeLoadError( + `recipe ${key} \u4E0D\u662F\u5408\u6CD5 JSON: ${e instanceof Error ? e.message : String(e)}`, + key + ); + } + const result = PromptRecipeSchema.safeParse(parsed); + if (!result.success) { + const issues = result.error.issues.map((i) => `${i.path.join(".")}: ${i.message}`).join("; "); + throw new RecipeLoadError(`recipe ${key} schema \u9A57\u8B49\u5931\u6557: ${issues}`, key); + } + return result.data; +} +var RecipeLoadError; +var init_recipe_loader = __esm({ + "cypher-executor/src/lib/recipe-loader.ts"() { + "use strict"; + init_prompt_recipe_schema(); + RecipeLoadError = class extends Error { + constructor(message, recipe) { + super(message); + this.recipe = recipe; + } + }; + } +}); + +// cypher-executor/src/lib/recipe-transforms.ts +function applyTransform(value, spec) { + const colonIdx = spec.indexOf(":"); + const name = colonIdx === -1 ? spec : spec.slice(0, colonIdx); + const arg = colonIdx === -1 ? void 0 : spec.slice(colonIdx + 1); + const fn = transforms[name]; + if (!fn) throw new Error(`\u672A\u77E5 transform: ${name}`); + return fn(value, arg); +} +var transforms; +var init_recipe_transforms = __esm({ + "cypher-executor/src/lib/recipe-transforms.ts"() { + "use strict"; + transforms = { + json_array: (v) => JSON.stringify(v ?? []), + to_string: (v) => { + if (v === null || v === void 0) return ""; + if (typeof v === "object") return JSON.stringify(v); + return String(v); + }, + join: (v, sep) => { + if (!Array.isArray(v)) throw new Error("join: input \u4E0D\u662F array"); + return v.map((x) => typeof x === "string" ? x : JSON.stringify(x)).join(sep ?? "\n"); + }, + markdown_list: (v) => { + if (!Array.isArray(v)) throw new Error("markdown_list: input \u4E0D\u662F array"); + return v.map((x) => `- ${typeof x === "string" ? x : JSON.stringify(x)}`).join("\n"); + }, + extract_field: (v, field) => { + if (!field) throw new Error("extract_field: \u9700\u8981 field \u53C3\u6578\uFF0C\u4F8B\u5982 extract_field:page_name"); + if (!Array.isArray(v)) throw new Error("extract_field: input \u4E0D\u662F array"); + return v.map((x) => x && typeof x === "object" ? x[field] : void 0); + }, + first: (v) => { + if (!Array.isArray(v)) return v; + return v[0]; + }, + pluck_content: (v) => { + if (!Array.isArray(v)) throw new Error("pluck_content: input \u4E0D\u662F array"); + return v.map((b) => b && typeof b === "object" ? String(b.content ?? "") : "").filter((s) => s.length > 0).join("\n\n---\n\n"); + } + }; + } +}); + +// cypher-executor/src/lib/recipe-expander.ts +function getByPath(ctx, path) { + const parts = path.split("."); + let cur = ctx; + for (const p of parts) { + if (cur === null || cur === void 0) return void 0; + if (typeof cur !== "object") return void 0; + cur = cur[p]; + } + return cur; +} +function interpolate(template, vars) { + return template.replace(/\{\{(\w+)\}\}/g, (_, key) => vars[key] !== void 0 ? vars[key] : `{{${key}}}`); +} +async function fetchKbdbBlock(env, apiKey, fragment) { + const base = (env.KBDB_BASE_URL ?? "https://kbdb.finally.click").replace(/\/$/, ""); + let url; + if (fragment.block_id) { + url = `${base}/blocks/${encodeURIComponent(fragment.block_id)}`; + } else { + url = `${base}/blocks?page_name=${encodeURIComponent(fragment.block_page_name)}&limit=1`; + } + const res = await fetch(url, { headers: { Authorization: `Bearer ${apiKey}` } }); + if (!res.ok) throw new Error(`KBDB fragment \u6293\u53D6\u5931\u6557 (${res.status}): ${url}`); + const data = await res.json(); + const block = fragment.block_id ? data : data.blocks?.[0] ?? {}; + if (!block) throw new Error(`KBDB block \u4E0D\u5B58\u5728: ${fragment.block_id ?? fragment.block_page_name}`); + const fieldVal = block[fragment.field]; + if (fieldVal === void 0) throw new Error(`block \u7F3A\u6B04\u4F4D "${fragment.field}"`); + return fieldVal; +} +async function resolveFragment(env, apiKey, frag) { + if (frag.source === "kv") { + const val = await env.RECIPES.get(frag.key); + if (val === null) throw new Error(`KV \u627E\u4E0D\u5230 key: ${frag.key}`); + return { var: frag.var, value: val }; + } + return { var: frag.var, value: await fetchKbdbBlock(env, apiKey, frag) }; +} +function resolveInput(input, ctx) { + let val = getByPath(ctx, input.from); + const beforeDefault = val; + if (val === void 0) val = input.default; + try { + if (input.transform) val = applyTransform(val, input.transform); + return { var: input.var, value: val }; + } catch (e) { + const valType = Array.isArray(beforeDefault) ? `array(${beforeDefault.length})` : beforeDefault === void 0 ? "undefined(default applied)" : typeof beforeDefault; + throw new Error(`${e instanceof Error ? e.message : String(e)} [path=${input.from}, type=${valType}]`); + } +} +async function expandPromptRecipe(recipeRef, ctx, env, apiKey) { + const recipe = await loadPromptRecipe(recipeRef, env.RECIPES); + const vars = {}; + for (const frag of recipe.fragments) { + const { var: name, value } = await resolveFragment(env, apiKey, frag); + vars[name] = typeof value === "string" ? value : JSON.stringify(value); + } + for (const inp of recipe.inputs) { + const { var: name, value } = resolveInput(inp, ctx); + vars[name] = typeof value === "string" ? value : JSON.stringify(value); + } + const system = interpolate(recipe.prompt_assembly.system, vars); + const user = interpolate(recipe.prompt_assembly.user, vars); + const prompt = `${system} + +--- USER --- + +${user}`; + return { + prompt, + model: recipe.model, + output_format: recipe.output.format, + output_required_fields: recipe.output.required_fields + }; +} +var init_recipe_expander = __esm({ + "cypher-executor/src/lib/recipe-expander.ts"() { + "use strict"; + init_recipe_loader(); + init_recipe_transforms(); + } +}); + +// cypher-executor/src/lib/paused-runs.ts +async function readIndex(kv, apiKey) { + const raw2 = await kv.get(`${IDX_PREFIX}${apiKey}`); + if (!raw2) return []; + try { + const arr = JSON.parse(raw2); + return Array.isArray(arr) ? arr : []; + } catch { + return []; + } +} +async function writeIndex(kv, apiKey, entries) { + const now2 = Date.now(); + const fresh = entries.filter((e) => e.expires_at > now2); + await kv.put(`${IDX_PREFIX}${apiKey}`, JSON.stringify(fresh), { expirationTtl: TTL_SECONDS }); +} +async function persistPausedRun(kv, taskId, state) { + await kv.put(`${KEY_PREFIX}${taskId}`, JSON.stringify(state), { expirationTtl: TTL_SECONDS }); + if (state.api_key) { + const idx = await readIndex(kv, state.api_key); + const filtered = idx.filter((e) => e.task_id !== taskId); + filtered.unshift({ + task_id: taskId, + run_id: state.run_id, + paused_node_id: state.paused_node_id, + workflow_name: state.graph.name, + expires_at: state.expires_at, + persisted_at: Date.now() + }); + await writeIndex(kv, state.api_key, filtered.slice(0, 100)); + } +} +async function loadPausedRun(kv, taskId) { + const raw2 = await kv.get(`${KEY_PREFIX}${taskId}`); + if (!raw2) return null; + try { + return JSON.parse(raw2); + } catch { + return null; + } +} +async function listPausedRunsByApiKey(kv, apiKey, limit = 20) { + const idx = await readIndex(kv, apiKey); + const now2 = Date.now(); + return idx.filter((e) => e.expires_at > now2).slice(0, limit); +} +async function consumePausedRun(kv, taskId) { + const state = await loadPausedRun(kv, taskId); + if (!state) return null; + await kv.delete(`${KEY_PREFIX}${taskId}`).catch(() => { + }); + if (state.api_key) { + const idx = await readIndex(kv, state.api_key); + const filtered = idx.filter((e) => e.task_id !== taskId); + await writeIndex(kv, state.api_key, filtered).catch(() => { + }); + } + return state; +} +function isResumablePending(result) { + if (!result || typeof result !== "object") return null; + const r = result; + if (r.pending !== true) return null; + if (typeof r.task_id !== "string" || !r.task_id) return null; + return { task_id: r.task_id }; +} +function parseRecipeOutput(result, format, requiredFields) { + if (format !== "json" || !result || typeof result !== "object") return result; + const r = result; + const text = r.data?.text ?? r.text; + if (typeof text !== "string") return result; + let jsonText = String(text).trim(); + const fenceMatch = jsonText.match(/^```(?:json)?\s*\n([\s\S]*?)\n```$/); + if (fenceMatch) jsonText = fenceMatch[1].trim(); + try { + const parsed = JSON.parse(jsonText); + if (requiredFields && parsed && typeof parsed === "object") { + const missing = requiredFields.filter((f) => !(f in parsed)); + if (missing.length > 0) { + return { success: false, error: `recipe output \u7F3A\u6B04\u4F4D: ${missing.join(", ")}`, raw: parsed }; + } + } + return { success: true, data: parsed, ...parsed && typeof parsed === "object" ? parsed : {} }; + } catch (e) { + return { success: false, error: `recipe output JSON parse \u5931\u6557: ${e instanceof Error ? e.message : String(e)}`, raw_text: text }; + } +} +var KEY_PREFIX, IDX_PREFIX, TTL_SECONDS; +var init_paused_runs = __esm({ + "cypher-executor/src/lib/paused-runs.ts"() { + "use strict"; + KEY_PREFIX = "paused_run:"; + IDX_PREFIX = "paused_idx:"; + TTL_SECONDS = 24 * 60 * 60; + } +}); + +// cypher-executor/src/lib/magic-vars.ts +function isoWeekNumber(d) { + const target = new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate())); + const dayNum = (target.getUTCDay() + 6) % 7; + target.setUTCDate(target.getUTCDate() - dayNum + 3); + const firstThursday = new Date(Date.UTC(target.getUTCFullYear(), 0, 4)); + const weekNum = 1 + Math.round( + ((target.getTime() - firstThursday.getTime()) / 864e5 - 3 + (firstThursday.getUTCDay() + 6) % 7) / 7 + ); + return { year: target.getUTCFullYear(), week: weekNum }; +} +function pad2(n) { + return n.toString().padStart(2, "0"); +} +function buildMagicVars(now2 = /* @__PURE__ */ new Date()) { + const iso = now2.toISOString(); + const yyyy = now2.getUTCFullYear(); + const mm = pad2(now2.getUTCMonth() + 1); + const dd = pad2(now2.getUTCDate()); + const hh = pad2(now2.getUTCHours()); + const mi = pad2(now2.getUTCMinutes()); + const ss = pad2(now2.getUTCSeconds()); + const yesterday = new Date(now2.getTime() - 864e5); + const yMm = pad2(yesterday.getUTCMonth() + 1); + const yDd = pad2(yesterday.getUTCDate()); + const { year: isoYear, week: isoWeek } = isoWeekNumber(now2); + return { + // 日期 / 時間(UTC) + _today: `${yyyy}-${mm}-${dd}`, + // 2026-05-16 + _yesterday: `${yesterday.getUTCFullYear()}-${yMm}-${yDd}`, + // 2026-05-15 + _now: iso, + // ISO 8601 + _now_unix: now2.getTime(), + // unix ms + _now_unix_s: Math.floor(now2.getTime() / 1e3), + // unix sec + // 個別欄位(給 path / page_name 拼) + _year: yyyy, + _month: mm, + _day: dd, + _hour: hh, + _minute: mi, + _second: ss, + // ISO 週(roadmap weekly archive 必備) + _iso_week: `${isoYear}-W${pad2(isoWeek)}`, + // 2026-W20 + _iso_week_num: isoWeek, + _iso_year: isoYear, + // 簡單時間 slot(cron-friendly) + _yyyymm: `${yyyy}${mm}`, + // 202605 + _yyyymmdd: `${yyyy}${mm}${dd}`, + // 20260516 + // 週幾(0=週日,1=週一 ... 6=週六;ISO 風格在 _iso_weekday) + _weekday: now2.getUTCDay(), + _iso_weekday: (now2.getUTCDay() + 6) % 7 + 1 + // 1=Mon...7=Sun + }; +} +var init_magic_vars = __esm({ + "cypher-executor/src/lib/magic-vars.ts"() { + "use strict"; + } +}); + +// cypher-executor/src/lib/telemetry.ts +async function hashApiKey(apiKey) { + if (!apiKey) return "anon"; + const encoder = new TextEncoder(); + const data = encoder.encode(apiKey); + const hashBuffer = await crypto.subtle.digest("SHA-256", data); + const hashArray = Array.from(new Uint8Array(hashBuffer)); + return hashArray.slice(0, 8).map((b) => b.toString(16).padStart(2, "0")).join(""); +} +function kbdbCreateBlockUrl(env) { + const subdomain = env.WORKER_SUBDOMAIN || "uncle6-me"; + return `https://arcrun-kbdb-create-block.${subdomain}.workers.dev`; +} +function recordTelemetry(env, apiKey, record, ctx) { + const promise = (async () => { + try { + const api_key_hash = await hashApiKey(apiKey ?? ""); + const platformKey = env.PLATFORM_API_KEY || apiKey || ""; + if (!platformKey) { + console.warn("[telemetry] no api_key, skipping"); + return; + } + const body = { + api_key: platformKey, + type: "agent-telemetry", + source: "cypher-executor", + user_id: "platform_telemetry", + content: JSON.stringify(record), + metadata_json: JSON.stringify({ ...record, api_key_hash }), + tags_json: JSON.stringify([ + "agent-telemetry", + `event:${record.event_type}` + ]) + }; + const res = await fetch(kbdbCreateBlockUrl(env), { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(body) + }); + if (!res.ok) { + console.warn( + "[telemetry] write failed", + res.status, + await res.text().catch(() => "no body") + ); + } + } catch (e) { + console.warn("[telemetry] exception", e); + } + })(); + if (ctx?.waitUntil) { + ctx.waitUntil(promise); + } +} +var init_telemetry = __esm({ + "cypher-executor/src/lib/telemetry.ts"() { + "use strict"; + } +}); + +// cypher-executor/src/graph-executor.ts +function propagateCtx(context, upstreamResult, upstreamNodeId) { + const baseCtx = typeof context === "object" && context !== null ? context : {}; + const baseResult = typeof upstreamResult === "object" && upstreamResult !== null ? upstreamResult : {}; + return { + ...baseCtx, + ...baseResult, + [upstreamNodeId]: upstreamResult + }; +} +function interpolateString(s, ctx) { + const single = s.match(/^\s*\{\{([\w.]+)\}\}\s*$/); + if (single) { + const val = getNestedValue(ctx, single[1]); + return val === void 0 ? s : val; + } + return s.replace(/\{\{([\w.]+)\}\}/g, (_, key) => { + const val = getNestedValue(ctx, key); + if (val === void 0) return `{{${key}}}`; + if (typeof val === "string") return val; + return JSON.stringify(val); + }); +} +function interpolateValue(v, ctx) { + if (typeof v === "string") return interpolateString(v, ctx); + if (Array.isArray(v)) return v.map((item) => interpolateValue(item, ctx)); + if (v !== null && typeof v === "object") { + const result = {}; + for (const [k, val] of Object.entries(v)) { + result[k] = interpolateValue(val, ctx); + } + return result; + } + return v; +} +function interpolateData(data, ctx) { + if (!data) return {}; + return interpolateValue(data, ctx); +} +function getNestedValue(ctx, path) { + const parts = path.split("."); + let cur = ctx; + for (const p of parts) { + if (cur === null || cur === void 0) return void 0; + if (typeof cur !== "object") return void 0; + cur = cur[p]; + } + return cur; +} +function readBranch(result) { + if (!result || typeof result !== "object") return void 0; + const r = result; + const data = r.data && typeof r.data === "object" ? r.data : void 0; + const named = data?.branch ?? r.branch; + if (typeof named === "string") return named; + const bool = data?.result ?? r.result; + if (typeof bool === "boolean") return bool ? "true" : "false"; + return void 0; +} +function isFailure(result) { + if (!result || typeof result !== "object") return false; + const r = result; + return r["success"] === false || "error" in r; +} +function evaluateCondition(condition, context) { + if (!context || typeof context !== "object") return false; + const ctx = context; + const expr = condition.replace(/result\./g, "").replace(/ctx\./g, ""); + const eqMatch = expr.match(/^(\w+)\s*===?\s*(.+)$/); + if (eqMatch) { + const key2 = eqMatch[1]; + const rawVal = eqMatch[2].trim(); + const expected = rawVal === "true" ? true : rawVal === "false" ? false : rawVal.replace(/['"]/g, ""); + return ctx[key2] === expected; + } + const gtMatch = expr.match(/^(\w+)\s*>\s*(\d+)$/); + if (gtMatch) { + return Number(ctx[gtMatch[1]]) > Number(gtMatch[2]); + } + const key = expr.trim(); + if (key && key in ctx) return !!ctx[key]; + return true; +} +function getIterableFromContext(context, key) { + if (!context || typeof context !== "object") return []; + const variants = [ + key + "s", + // paragraph → paragraphs + key.replace(/y$/, "ies"), + // entity → entities + key.replace(/(s|x|z|ch|sh)$/, "$1es"), + // box → boxes + key + // singular fallback + ]; + const obj = context; + for (const v of variants) { + if (Array.isArray(obj[v])) return obj[v]; + } + for (const val of Object.values(obj)) { + if (val !== null && typeof val === "object" && !Array.isArray(val)) { + for (const v of variants) { + const nested = val[v]; + if (Array.isArray(nested)) return nested; + } + } + } + return []; +} +var GraphExecutor; +var init_graph_executor = __esm({ + "cypher-executor/src/graph-executor.ts"() { + "use strict"; + init_types(); + init_auth_dispatcher(); + init_recipe_expander(); + init_recipes(); + init_paused_runs(); + init_magic_vars(); + init_telemetry(); + GraphExecutor = class _GraphExecutor { + loader; + workflowLoader; + env; + apiKey; + recordComponentReference; + // kbdb-base §7.1+§7.5.h:本次執行用到的 recipe **key**(uuid 優先,舊資料 fallback canonical_id)。 + // 判定單位是「工作流執行」(n8n execution):執行結束後由 executeWebhookGraph 一次性把這組 key + // 各記成功/失敗到 KBDB 市場星數(per-uuid → 能區分同 canonical 的不同作者版本,§7.5.5)。執行中只收集。 + usedRecipeKeys = /* @__PURE__ */ new Set(); + // resumable workflow(SDD: resumable-workflow/design.md) + // 暫停時持久化 state 用,需在 execute 進入時設定 + currentGraph; + currentRunId; + constructor(loader, workflowLoader, env, apiKey) { + this.loader = loader; + this.workflowLoader = workflowLoader; + this.env = env; + this.apiKey = apiKey; + } + async execute(graph, initialContext, kvNamespace) { + const trace = []; + const kvStore = kvNamespace ? { runId: `${graph.id}-${Date.now()}`, kv: kvNamespace } : void 0; + this.currentGraph = graph; + this.currentRunId = kvStore?.runId ?? `${graph.id}-${Date.now()}`; + const ctxWithMagic = { + ...initialContext, + ...buildMagicVars() + }; + const hasIncoming = new Set(graph.edges.map((e) => e.to)); + const startNodes = graph.nodes.filter((n) => !hasIncoming.has(n.id)); + if (startNodes.length === 0) { + return { data: ctxWithMagic, trace }; + } + const fanIn = /* @__PURE__ */ new Map(); + for (const node of graph.nodes) { + const inDeg = graph.edges.filter((e) => e.to === node.id).length; + if (inDeg > 1) { + fanIn.set(node.id, { ctx: { ...ctxWithMagic }, remaining: inDeg }); + } + } + const results = await Promise.all( + startNodes.map( + (node) => this.executeNode(node, graph, ctxWithMagic, /* @__PURE__ */ new Set(), trace, fanIn, kvStore) + ) + ); + let mergedResult; + if (results.length === 1) { + mergedResult = results[0]; + } else { + mergedResult = results.reduce( + (acc, r) => ({ + ...acc, + ...typeof r === "object" && r !== null ? r : {} + }), + {} + ); + } + return { data: mergedResult, trace }; + } + /** + * 從 paused state 繼續執行 workflow + * SDD: resumable-workflow/design.md §3.2 + * + * 流程: + * 1. 把 paused_node 當已執行(result = callbackResult,注入進 context) + * 2. 找出 paused_node 的所有下游節點當新起點 + * 3. 執行下游節點直到結束(或再次 paused) + */ + async resumeFromPaused(args) { + const { graph, paused_node_id, paused_context, prior_trace, kvNamespace } = args; + let { callback_result } = args; + callback_result = parseRecipeOutput( + callback_result, + args.recipe_output_format, + args.recipe_output_required_fields + ); + this.currentGraph = graph; + this.currentRunId = `${graph.id}-resume-${Date.now()}`; + const trace = [...prior_trace]; + const kvStore = kvNamespace ? { runId: this.currentRunId, kv: kvNamespace } : void 0; + if (kvStore) { + await kvSetNodeOutput(kvStore, paused_node_id, callback_result); + } + const mergedContext = { + ...paused_context, + ...callback_result && typeof callback_result === "object" ? callback_result : {}, + [paused_node_id]: callback_result + }; + if (kvStore) { + if (!mergedContext._kv_outputs) mergedContext._kv_outputs = {}; + mergedContext._kv_outputs[paused_node_id] = callback_result; + } + const downstreamEdges = graph.edges.filter((e) => e.from === paused_node_id); + if (downstreamEdges.length === 0) { + return { data: callback_result, trace }; + } + const fanIn = /* @__PURE__ */ new Map(); + for (const node of graph.nodes) { + const inDeg = graph.edges.filter((e) => e.to === node.id).length; + if (inDeg > 1) { + fanIn.set(node.id, { ctx: { ...mergedContext }, remaining: inDeg }); + } + } + const visited = /* @__PURE__ */ new Set([`${paused_node_id}:${JSON.stringify(paused_context).slice(0, 50)}`]); + const downstreamNodes = downstreamEdges.map((e) => graph.nodes.find((n) => n.id === e.to)).filter((n) => !!n); + const results = await Promise.all( + downstreamNodes.map( + (node) => this.executeNode(node, graph, mergedContext, visited, trace, fanIn, kvStore) + ) + ); + let mergedResult; + if (results.length === 1) { + mergedResult = results[0]; + } else { + mergedResult = results.reduce( + (acc, r) => ({ + ...acc, + ...typeof r === "object" && r !== null ? r : {} + }), + {} + ); + } + return { data: mergedResult, trace }; + } + async executeNode(node, graph, context, visited, trace, fanIn, kvStore) { + const nodeKey = `${node.id}:${JSON.stringify(context).slice(0, 50)}`; + if (visited.has(nodeKey)) return context; + visited.add(nodeKey); + const start = Date.now(); + let result = context; + let nodeInput = context; + try { + switch (node.type) { + case "Input": + result = node.data ?? context; + nodeInput = result; + break; + case "Component": { + if (!node.componentId) throw new Error(`\u7BC0\u9EDE ${node.id} \u7F3A\u5C11 componentId`); + const runner = await this.loader(node.componentId); + const ctx = context; + const resolvedData = interpolateData(node.data, ctx); + let mergedContext = { + ...ctx, + ...resolvedData + }; + if (this.env && this.apiKey) { + mergedContext = await resolveCredentialRefs(mergedContext, this.env, this.apiKey); + } + if (node.componentId === "claude_api") { + const baseUrl = this.env?.PUBLIC_BASE_URL ?? "https://cypher.arcrun.dev"; + mergedContext.callback_url = `${baseUrl.replace(/\/$/, "")}/workflows/resume`; + } + if (typeof resolvedData.recipe === "string" && this.env?.RECIPES) { + try { + const expanded = await expandPromptRecipe( + resolvedData.recipe, + ctx, + this.env, + this.apiKey ?? "" + ); + mergedContext = { + ...mergedContext, + prompt: expanded.prompt, + model: expanded.model, + _recipe_output_format: expanded.output_format, + _recipe_output_required_fields: expanded.output_required_fields + }; + } catch (e) { + throw new Error(`recipe \u5C55\u958B\u5931\u6557 (${resolvedData.recipe}): ${e instanceof Error ? e.message : String(e)}`); + } + } + if (this.env && this.apiKey) { + const dispatched = await tryAuthDispatch(node.componentId, mergedContext, this.env, this.apiKey); + if (dispatched) { + mergedContext = dispatched; + } + } + if (this.env?.RECIPES) { + try { + const apiRecipe = await resolveRecipe(node.componentId, this.env.RECIPES); + if (apiRecipe) this.usedRecipeKeys.add(apiRecipe.uuid ?? apiRecipe.canonical_id); + } catch { + } + } + nodeInput = mergedContext; + result = await runner(mergedContext); + const pending = isResumablePending(result); + if (pending && this.env?.EXEC_CONTEXT && this.currentGraph && this.currentRunId) { + trace.push({ + nodeId: node.id, + type: node.type, + input: nodeInput, + output: result, + duration_ms: Date.now() - start + }); + await persistPausedRun(this.env.EXEC_CONTEXT, pending.task_id, { + run_id: this.currentRunId, + graph: this.currentGraph, + paused_node_id: node.id, + paused_context: context, + paused_pending_result: result, + trace_so_far: trace, + api_key: this.apiKey, + expires_at: Date.now() + 24 * 60 * 60 * 1e3, + recipe_output_format: mergedContext._recipe_output_format, + recipe_output_required_fields: mergedContext._recipe_output_required_fields + }); + throw new WorkflowPaused(pending.task_id, this.currentRunId, node.id, trace); + } + result = parseRecipeOutput( + result, + mergedContext._recipe_output_format, + mergedContext._recipe_output_required_fields + ); + if (kvStore && result !== null && result !== void 0 && graph.edges.some((e) => e.from === node.id && e.type === "PIPE")) { + await kvSetNodeOutput(kvStore, node.id, result); + } + void this.recordComponentReference?.(node.componentId, graph.id).catch(() => { + }); + break; + } + case "Output": + result = context; + break; + } + } catch (e) { + if (e instanceof WorkflowPaused) throw e; + const errMsg = e.message || String(e); + const duration_ms2 = Date.now() - start; + trace.push({ + nodeId: node.id, + type: node.type, + input: nodeInput, + output: null, + error: errMsg, + duration_ms: duration_ms2 + }); + if (this.env && node.type === "Component") { + recordTelemetry(this.env, this.apiKey, { + event_type: "node_failure", + workflow_name: graph.name, + component_id: node.componentId, + error_code: "node_error", + duration_ms: duration_ms2 + }); + } + if (e instanceof ExecutionError) throw e; + throw new ExecutionError( + `Node ${node.id} failed: ${errMsg}`, + node.id, + nodeInput, + trace + ); + } + const duration_ms = Date.now() - start; + trace.push({ + nodeId: node.id, + type: node.type, + input: nodeInput, + output: result, + duration_ms + }); + if (this.env && node.type === "Component") { + recordTelemetry(this.env, this.apiKey, { + event_type: "node_success", + workflow_name: graph.name, + component_id: node.componentId, + duration_ms + }); + } + const outEdges = graph.edges.filter((e) => e.from === node.id); + for (const edge of outEdges) { + const nextNode = graph.nodes.find((n) => n.id === edge.to); + if (!nextNode) continue; + switch (edge.type) { + case "PIPE": { + const pipeContext = propagateCtx(context, result, node.id); + if (kvStore) { + const kvOutput = await kvGetNodeOutput(kvStore, node.id); + if (kvOutput !== void 0) { + if (!pipeContext._kv_outputs) pipeContext._kv_outputs = {}; + pipeContext._kv_outputs[node.id] = kvOutput; + } + } + const fanInState = fanIn.get(nextNode.id); + if (fanInState) { + Object.assign(fanInState.ctx, pipeContext); + fanInState.remaining--; + if (fanInState.remaining === 0) { + result = await this.executeNode(nextNode, graph, fanInState.ctx, visited, trace, fanIn, kvStore); + } + } else { + result = await this.executeNode(nextNode, graph, pipeContext, visited, trace, fanIn, kvStore); + } + break; + } + case "ON_SUCCESS": { + if (!isFailure(result)) { + const mergedCtx = propagateCtx(context, result, node.id); + result = await this.executeNode(nextNode, graph, mergedCtx, visited, trace, fanIn, kvStore); + } + break; + } + case "ON_FAIL": { + if (isFailure(result)) { + const mergedCtx = propagateCtx(context, result, node.id); + result = await this.executeNode(nextNode, graph, mergedCtx, visited, trace, fanIn, kvStore); + } + break; + } + case "IF": { + const passes = evaluateCondition(edge.condition ?? "true", result); + if (passes) { + const mergedCtx = propagateCtx(context, result, node.id); + result = await this.executeNode(nextNode, graph, mergedCtx, visited, trace, fanIn, kvStore); + } + break; + } + // ── 條件邊(SDD workflow-discovery 3.11 / CP arcrun-usable 步驟 5 缺口①)── + // 為什麼要有:`if_control` 回 {result, branch} 卻沒有邊讀得懂它, + // AI 照規矩用了零件仍得寫 code 判斷走哪條 ⇒「全變成 code」的根(Arcrun#5)。 + // 讀法對齊零件 output_schema:優先 data.branch(if_control/switch 的正式形狀), + // 相容 top-level branch / result 布林。讀不出分支=不走(誠實,不亂挑一條)。 + case "ON_TRUE": { + if (readBranch(result) === "true") { + const mergedCtx = propagateCtx(context, result, node.id); + result = await this.executeNode(nextNode, graph, mergedCtx, visited, trace, fanIn, kvStore); + } + break; + } + case "ON_FALSE": { + if (readBranch(result) === "false") { + const mergedCtx = propagateCtx(context, result, node.id); + result = await this.executeNode(nextNode, graph, mergedCtx, visited, trace, fanIn, kvStore); + } + break; + } + case "ON_BRANCH": { + const actual = readBranch(result); + if (edge.branch !== void 0 && actual !== void 0 && actual === edge.branch) { + const mergedCtx = propagateCtx(context, result, node.id); + result = await this.executeNode(nextNode, graph, mergedCtx, visited, trace, fanIn, kvStore); + } + break; + } + case "FOREACH": { + const iteratorKey = edge.iterator ?? "item"; + let items = getIterableFromContext(result, iteratorKey); + if (items.length === 0) { + items = getIterableFromContext(context, iteratorKey); + } + const iterResults = []; + const baseForeachCtx = propagateCtx(context, result, node.id); + for (const item of items) { + const itemContext = { + ...baseForeachCtx, + [iteratorKey]: item + }; + const itemResult = await this.executeNode(nextNode, graph, itemContext, /* @__PURE__ */ new Set(), trace, fanIn, kvStore); + iterResults.push(itemResult); + } + if (iterResults.length > 0) { + const failures = iterResults.filter( + (r) => r !== null && typeof r === "object" && r.success === false + ); + if (failures.length === iterResults.length) { + const first = failures[0]; + const errParts = []; + if (first.error) errParts.push(String(first.error)); + if (typeof first.status === "number") errParts.push(`HTTP ${first.status}`); + const bodyData = first.data; + if (bodyData && typeof bodyData.body === "string" && bodyData.body) { + errParts.push(bodyData.body.slice(0, 200)); + } + throw new Error( + `FOREACH \u6240\u6709 ${iterResults.length} \u9805\u76EE\u5747\u5931\u6557\uFF08\u9996\u9805\uFF1A${errParts.join("\uFF1B") || "\u672A\u77E5\u932F\u8AA4"}\uFF09` + ); + } + } + result = { ...result, results: iterResults }; + break; + } + case "CALLS_SUBFLOW": { + const subWorkflowId = nextNode.componentId?.replace("workflow://", "") ?? nextNode.id; + if (this.workflowLoader) { + const subGraph = await this.workflowLoader(subWorkflowId); + const subExecutor = new _GraphExecutor(this.loader, this.workflowLoader); + const subResult = await subExecutor.execute( + subGraph, + result, + kvStore?.kv + ); + result = { + ...result, + ...subResult.data + }; + } + break; + } + case "ON_CLICK": { + const mergedCtx = propagateCtx(context, result, node.id); + result = await this.executeNode(nextNode, graph, mergedCtx, visited, trace, fanIn, kvStore); + break; + } + case "IS_A": { + break; + } + case "CONTAINS": + case "HAS_STYLE": + case "HAS_BEHAVIOR": { + break; + } + case "CONTINUE": + break; + } + } + return result; + } + }; + } +}); + +// cypher-executor/src/lib/schemas.ts +var graphSchema, executeSchema; +var init_schemas = __esm({ + "cypher-executor/src/lib/schemas.ts"() { + "use strict"; + init_lib(); + graphSchema = z.object({ + id: z.string().min(1), + name: z.string().min(1), + nodes: z.array(z.object({ + id: z.string(), + type: z.enum(["Input", "Component", "Output"]), + componentId: z.string().optional(), + label: z.string().optional(), + data: z.record(z.unknown()).optional() + })), + edges: z.array(z.object({ + from: z.string(), + to: z.string(), + type: z.enum(["PIPE", "IF", "FOREACH", "CONTINUE", "IS_A", "ON_SUCCESS", "ON_FAIL", "ON_TRUE", "ON_FALSE", "ON_BRANCH", "ON_CLICK", "CALLS_SUBFLOW", "CONTAINS", "HAS_STYLE", "HAS_BEHAVIOR"]), + condition: z.string().optional(), + iterator: z.string().optional(), + branch: z.string().optional() + // ON_BRANCH 的具名分支(SDD workflow-discovery 3.11) + })) + }); + executeSchema = z.object({ + graph: graphSchema, + context: z.record(z.unknown()).default({}) + }); + } +}); + +// cypher-executor/src/actions/execution-evaluator.ts +function componentVerdictsFromTrace(nodes, trace) { + const componentByNodeId = /* @__PURE__ */ new Map(); + for (const n of nodes) { + if (n.type === "Component" && n.componentId) componentByNodeId.set(n.id, n.componentId); + } + const verdicts = []; + for (const step of trace) { + const componentId = componentByNodeId.get(step.nodeId); + if (!componentId) continue; + const out = step.output; + const outputSaysFailed = typeof out === "object" && out !== null && !Array.isArray(out) && out.success === false; + verdicts.push({ + component_id: componentId, + success: !step.error && !outputSaysFailed, + duration_ms: Math.max(0, Number(step.duration_ms) || 0) + }); + } + return verdicts; +} +async function recordComponentStats(env, nodes, trace) { + try { + const base = (env.REGISTRY_BASE_URL ?? (env.WORKER_SUBDOMAIN ? wasmWorkerUrl("registry", env.WORKER_SUBDOMAIN) : void 0))?.replace(/\/$/, ""); + if (!base) return; + const verdicts = componentVerdictsFromTrace(nodes, trace); + if (verdicts.length === 0) return; + await Promise.all( + verdicts.map( + (v) => fetch(`${base}/analytics/record`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + canonical_id: v.component_id, + success: v.success, + duration_ms: v.duration_ms + }) + }).catch(() => void 0) + // 統計失敗不影響執行 + ) + ); + } catch { + } +} +var init_execution_evaluator = __esm({ + "cypher-executor/src/actions/execution-evaluator.ts"() { + "use strict"; + init_component_loader(); + } +}); + +// cypher-executor/src/actions/webhook-handlers.ts +var webhook_handlers_exports = {}; +__export(webhook_handlers_exports, { + executeWebhookGraph: () => executeWebhookGraph, + generateToken: () => generateToken, + validateAndParseWebhook: () => validateAndParseWebhook +}); +function recordRecipeStats(env, recipeKeys, ok, at, ctx) { + if (recipeKeys.size === 0) return; + const base = (env.KBDB_BASE_URL ?? "https://kbdb.finally.click").replace(/\/$/, ""); + const headers = { "Content-Type": "application/json" }; + if (env.KBDB_INTERNAL_TOKEN) headers["Authorization"] = `Bearer ${env.KBDB_INTERNAL_TOKEN}`; + const promise = Promise.all( + [...recipeKeys].map( + (key) => fetch(`${base}/recipe-stats/record`, { + method: "POST", + headers, + body: JSON.stringify({ canonical_id: key, ok, at }) + }).catch(() => void 0) + ) + ).then(() => void 0); + if (ctx?.waitUntil) ctx.waitUntil(promise); + else ; +} +function generateToken() { + const tokenBytes = crypto.getRandomValues(new Uint8Array(16)); + return Array.from(tokenBytes).map((b) => b.toString(16).padStart(2, "0")).join(""); +} +async function validateAndParseWebhook(raw2) { + try { + return JSON.parse(raw2); + } catch { + return null; + } +} +async function executeWebhookGraph(env, graph, triggerContext, token, apiKey, ctx, userAgent) { + const parsed = graphSchema.safeParse(graph); + if (!parsed.success) { + return { success: false, error: "\u5716\u5B9A\u7FA9\u5DF2\u5931\u6548", duration_ms: 0 }; + } + const loader = createComponentLoader(env); + const executor = new GraphExecutor(loader, void 0, env, apiKey); + const start = Date.now(); + try { + const result = await executor.execute( + parsed.data, + { ...triggerContext, _webhook_token: token }, + env.EXEC_CONTEXT + ); + const duration_ms = Date.now() - start; + recordTelemetry(env, apiKey, { + event_type: "run_success", + workflow_name: token, + duration_ms, + agent_user_agent: userAgent + }, ctx); + recordRecipeStats(env, executor.usedRecipeKeys, true, Date.now(), ctx); + { + const statsPromise = recordComponentStats( + env, + parsed.data.nodes, + result.trace + ); + if (ctx?.waitUntil) ctx.waitUntil(statsPromise); + else ; + } + return { success: true, data: result.data, duration_ms }; + } catch (err) { + const duration_ms = Date.now() - start; + const errMsg = err instanceof Error ? err.message : String(err); + const isPaused = /workflow paused/i.test(errMsg); + recordTelemetry(env, apiKey, { + event_type: isPaused ? "run_success" : "run_fail", + workflow_name: token, + error_code: isPaused ? "paused_awaiting_resume" : "execution_error", + duration_ms, + agent_user_agent: userAgent + }, ctx); + if (!isPaused) { + recordRecipeStats(env, executor.usedRecipeKeys, false, Date.now(), ctx); + } + if (!isPaused && err instanceof ExecutionError) { + const statsPromise = recordComponentStats( + env, + parsed.data.nodes, + err.trace + ); + if (ctx?.waitUntil) ctx.waitUntil(statsPromise); + else ; + } + if (err instanceof ExecutionError) { + const traceFormatted = err.trace.map((s) => ({ + node: s.nodeId, + status: s.error ? "failed" : "success", + ...s.error ? { error: s.error } : {} + })); + return { + success: false, + error: errMsg, + trace: traceFormatted, + duration_ms + }; + } + return { success: false, error: errMsg, duration_ms }; + } +} +var init_webhook_handlers = __esm({ + "cypher-executor/src/actions/webhook-handlers.ts"() { + "use strict"; + init_types(); + init_graph_executor(); + init_schemas(); + init_component_loader(); + init_telemetry(); + init_execution_evaluator(); + } +}); + +// cypher-executor/src/index.ts +init_dist(); + +// cypher-executor/node_modules/.pnpm/hono@4.12.10/node_modules/hono/dist/middleware/cors/index.js +var cors = (options) => { + const defaults = { + origin: "*", + allowMethods: ["GET", "HEAD", "PUT", "POST", "DELETE", "PATCH"], + allowHeaders: [], + exposeHeaders: [] + }; + const opts = { + ...defaults, + ...options + }; + const findAllowOrigin = ((optsOrigin) => { + if (typeof optsOrigin === "string") { + if (optsOrigin === "*") { + if (opts.credentials) { + return (origin) => origin || null; + } + return () => optsOrigin; + } else { + return (origin) => optsOrigin === origin ? origin : null; + } + } else if (typeof optsOrigin === "function") { + return optsOrigin; + } else { + return (origin) => optsOrigin.includes(origin) ? origin : null; + } + })(opts.origin); + const findAllowMethods = ((optsAllowMethods) => { + if (typeof optsAllowMethods === "function") { + return optsAllowMethods; + } else if (Array.isArray(optsAllowMethods)) { + return () => optsAllowMethods; + } else { + return () => []; + } + })(opts.allowMethods); + return async function cors2(c, next) { + function set(key, value) { + c.res.headers.set(key, value); + } + const allowOrigin = await findAllowOrigin(c.req.header("origin") || "", c); + if (allowOrigin) { + set("Access-Control-Allow-Origin", allowOrigin); + } + if (opts.credentials) { + set("Access-Control-Allow-Credentials", "true"); + } + if (opts.exposeHeaders?.length) { + set("Access-Control-Expose-Headers", opts.exposeHeaders.join(",")); + } + if (c.req.method === "OPTIONS") { + if (opts.origin !== "*" || opts.credentials) { + set("Vary", "Origin"); + } + if (opts.maxAge != null) { + set("Access-Control-Max-Age", opts.maxAge.toString()); + } + const allowMethods = await findAllowMethods(c.req.header("origin") || "", c); + if (allowMethods.length) { + set("Access-Control-Allow-Methods", allowMethods.join(",")); + } + let headers = opts.allowHeaders; + if (!headers?.length) { + const requestHeaders = c.req.header("Access-Control-Request-Headers"); + if (requestHeaders) { + headers = requestHeaders.split(/\s*,\s*/); + } + } + if (headers?.length) { + set("Access-Control-Allow-Headers", headers.join(",")); + c.res.headers.append("Vary", "Access-Control-Request-Headers"); + } + c.res.headers.delete("Content-Length"); + c.res.headers.delete("Content-Type"); + return new Response(null, { + headers: c.res.headers, + status: 204, + statusText: "No Content" + }); + } + await next(); + if (opts.origin !== "*" || opts.credentials) { + c.header("Vary", "Origin", { append: true }); + } + }; +}; + +// cypher-executor/src/lib/cron-match.ts +function matchField(expr, value, min, max) { + if (expr === "*") return true; + for (const part of expr.split(",")) { + if (matchPart(part.trim(), value, min, max)) return true; + } + return false; +} +function matchPart(part, value, min, max) { + if (part.startsWith("*/")) { + const step = parseInt(part.slice(2), 10); + if (!Number.isFinite(step) || step <= 0) return false; + return (value - min) % step === 0; + } + if (part.includes("-")) { + const [rangePart, stepStr] = part.split("/"); + const [aStr, bStr] = rangePart.split("-"); + const a = parseInt(aStr, 10); + const b = parseInt(bStr, 10); + if (!Number.isFinite(a) || !Number.isFinite(b)) return false; + if (value < a || value > b) return false; + if (stepStr === void 0) return true; + const step = parseInt(stepStr, 10); + if (!Number.isFinite(step) || step <= 0) return false; + return (value - a) % step === 0; + } + const n = parseInt(part, 10); + if (!Number.isFinite(n)) return false; + if (n < min || n > max) return false; + return value === n; +} +function cronMatch(expr, date) { + const fields = expr.trim().split(/\s+/); + if (fields.length !== 5) return false; + const [m, h, dom, mon, dow] = fields; + return matchField(m, date.getUTCMinutes(), 0, 59) && matchField(h, date.getUTCHours(), 0, 23) && matchField(dom, date.getUTCDate(), 1, 31) && matchField(mon, date.getUTCMonth() + 1, 1, 12) && matchField(dow, date.getUTCDay(), 0, 6); +} +function extractCronExpr(graph) { + if (!graph || typeof graph !== "object") return null; + const nodes = graph.nodes; + if (!Array.isArray(nodes)) return null; + for (const node of nodes) { + if (node.componentId !== "cron") continue; + const expr = node.data?.cron_expr; + if (typeof expr === "string" && expr.trim()) return expr.trim(); + } + return null; +} + +// cypher-executor/src/lib/cron-index.ts +var CRON_INDEX_KEY = "cron-idx:_all"; +function cronEntryKey(apiKey, name) { + return `${apiKey}:${name}`; +} +function parseCronEntryKey(entryKey) { + const idx = entryKey.indexOf(":"); + if (idx <= 0) return null; + return { apiKey: entryKey.slice(0, idx), name: entryKey.slice(idx + 1) }; +} +async function readCronIndex(kv) { + const raw2 = await kv.get(CRON_INDEX_KEY, "text"); + if (!raw2) return {}; + try { + const parsed = JSON.parse(raw2); + return parsed && typeof parsed === "object" ? parsed : {}; + } catch { + return {}; + } +} +async function updateCronIndexEntry(kv, apiKey, name, cronExpr) { + const index = await readCronIndex(kv); + const entryKey = cronEntryKey(apiKey, name); + if (cronExpr) { + if (index[entryKey] === cronExpr) return; + index[entryKey] = cronExpr; + } else { + if (!(entryKey in index)) return; + delete index[entryKey]; + } + await kv.put(CRON_INDEX_KEY, JSON.stringify(index)); +} + +// cypher-executor/src/scheduled.ts +init_webhook_handlers(); +init_kbdb_proxy(); +async function handleScheduled(controller, env, ctx) { + const now2 = new Date(controller.scheduledTime); + console.log("[scheduled] tick", now2.toISOString(), "controller.cron=", controller.cron); + const index = await readCronIndex(env.WEBHOOKS); + const entries = Object.entries(index); + let triggered = 0; + for (const [entryKey, cronExpr] of entries) { + const parsed = parseCronEntryKey(entryKey); + if (!parsed) continue; + const { apiKey, name } = parsed; + if (!cronExpr) continue; + if (!cronMatch(cronExpr, now2)) continue; + const wfKey = `${apiKey}:wf:${name}`; + const wfRaw = await env.WEBHOOKS.get(wfKey, "text"); + if (!wfRaw) { + console.warn("[scheduled] cron-idx \u5C0D\u61C9 workflow \u4E0D\u5B58\u5728", wfKey); + continue; + } + let record; + try { + record = JSON.parse(wfRaw); + } catch { + continue; + } + triggered++; + console.log("[scheduled] trigger", name, "apiKey=", apiKey.slice(0, 12) + "...", "cron=", cronExpr); + const triggerContext = { + api_key: apiKey, + _triggered_by: "cron", + _scheduled_at: now2.toISOString() + }; + ctx.waitUntil( + executeWebhookGraph(env, record.graph, triggerContext, name, apiKey).then( + (r) => console.log("[scheduled] done", name, r.success, r.duration_ms + "ms"), + (e) => console.error("[scheduled] fail", name, e) + ) + ); + } + console.log(`[scheduled] scanned ${entries.length} cron-idx entries, ${triggered} triggered`); + if (now2.getUTCHours() === 2 && now2.getUTCMinutes() === 30) { + const { base, headers } = kbdbBase(env); + ctx.waitUntil( + fetch(`${base}/execution-log/cleanup`, { method: "POST", headers }).then(async (r) => { + const body = await r.json().catch(() => null); + console.log("[scheduled] execution-log cleanup", r.status, JSON.stringify(body)); + }).catch((e) => console.error("[scheduled] execution-log cleanup failed", e)) + ); + } +} + +// cypher-executor/src/routes/health.ts +init_dist(); + +// cypher-executor/src/lib/portal-auth-store.ts +init_credentials(); +var AUTH_STORE_PREFIX = "ARCRUN_AUTH_STORE"; +var SHARD_MAX_BYTES = 4600; +var AUTH_OVERLAY_TTL_MS = 18e4; +var ACCEL_KEY = "auth_store_recent"; +var ACCEL_TTL_SECONDS = 600; +var AUTH_ID_PREFIX = "auth:"; +var AuthStoreWriteError = class extends Error { +}; +var overlay = null; +var overlayAt = 0; +function emptyStore() { + return { version: 1, console: null, users: [] }; +} +function shardNames(env) { + const bag = env; + return Object.keys(bag).filter((k) => k === AUTH_STORE_PREFIX || /^ARCRUN_AUTH_STORE_\d+$/.test(k)).filter((k) => typeof bag[k] === "string" && bag[k].length > 0).sort((a, b) => shardIndex(a) - shardIndex(b)); +} +function shardIndex(name) { + if (name === AUTH_STORE_PREFIX) return 0; + return Number.parseInt(name.slice(AUTH_STORE_PREFIX.length + 1), 10) || 0; +} +function shardNameOf(index) { + return index === 0 ? AUTH_STORE_PREFIX : `${AUTH_STORE_PREFIX}_${index}`; +} +function authStorePresent(env) { + return shardNames(env).length > 0 || overlay !== null && Date.now() - overlayAt < AUTH_OVERLAY_TTL_MS; +} +function authStoreWritable(env) { + return Boolean(env.CF_SECRETS_API_TOKEN && env.CF_ACCOUNT_ID); +} +function readAuthStore(env) { + if (overlay && Date.now() - overlayAt < AUTH_OVERLAY_TTL_MS) return overlay; + return readAuthStoreFromEnv(env); +} +function readAuthStoreFromEnv(env) { + const bag = env; + const out = emptyStore(); + for (const name of shardNames(env)) { + let parsed = null; + try { + parsed = JSON.parse(bag[name]); + } catch { + continue; + } + if (!parsed || typeof parsed !== "object") continue; + if (parsed.console && !out.console) out.console = parsed.console; + if (Array.isArray(parsed.users)) { + for (const u of parsed.users) { + if (u && typeof u.email === "string" && typeof u.id === "string") out.users.push(u); + } + } + } + return out; +} +function findAuthUserByEmail(env, email) { + const needle = email.trim().toLowerCase(); + return readAuthStore(env).users.find((u) => u.email.toLowerCase() === needle) ?? null; +} +function findAuthUserById(env, id) { + return readAuthStore(env).users.find((u) => u.id === id) ?? null; +} +function isAuthStoreId(recordId) { + return recordId.startsWith(AUTH_ID_PREFIX); +} +function newAuthUserId() { + const arr = new Uint8Array(12); + crypto.getRandomValues(arr); + return AUTH_ID_PREFIX + Array.from(arr).map((b) => b.toString(16).padStart(2, "0")).join(""); +} +async function writeAuthStore(env, data) { + if (!authStoreWritable(env)) { + throw new AuthStoreWriteError( + "\u9019\u53F0\u5BE6\u4F8B\u9084\u4E0D\u80FD\u5BEB\u5165\u8A8D\u8B49\u5132\u5B58\uFF08\u7F3A CF_SECRETS_API_TOKEN / CF_ACCOUNT_ID\uFF09\u3002\u8A8D\u8B49\u5206\u96E2\u9700\u8981\u9019\u5169\u9805\u624D\u5BEB\u5F97\u9032 Workers Secrets\u2014\u2014\u8ACB\u91CD\u65B0\u57F7\u884C\u5B89\u88DD\uFF0F\u66F4\u65B0\u8B93\u5B83\u5C31\u7DD2\u3002" + ); + } + const shards = []; + let current = { v: 1, console: data.console ?? null, users: [] }; + for (const u of data.users) { + const trial = { ...current, users: [...current.users ?? [], u] }; + const size = new TextEncoder().encode(JSON.stringify(trial)).length; + if (size > SHARD_MAX_BYTES && (current.users ?? []).length > 0) { + shards.push(JSON.stringify(current)); + current = { v: 1, users: [u] }; + } else { + current = trial; + } + } + shards.push(JSON.stringify(current)); + for (const s of shards) { + if (new TextEncoder().encode(s).length > 5e3) { + throw new AuthStoreWriteError("\u55AE\u7B46\u8A8D\u8B49\u8CC7\u6599\u8D85\u904E Cloudflare \u8B8A\u6578 5 KB \u4E0A\u9650\uFF0C\u7121\u6CD5\u5BEB\u5165\u3002"); + } + } + const existing = shardNames(env); + for (let i = 0; i < shards.length; i++) { + await putWorkerSecret(env, shardNameOf(i), shards[i]); + } + for (const name of existing) { + if (shardIndex(name) >= shards.length) await deleteWorkerSecret(env, name); + } + overlay = { version: 1, console: data.console ?? null, users: [...data.users] }; + overlayAt = Date.now(); + try { + await env.SESSIONS_KV.put( + ACCEL_KEY, + JSON.stringify({ written_at: Date.now(), data: overlay }), + { expirationTtl: ACCEL_TTL_SECONDS } + ); + } catch { + } +} +async function hydrateFromAccelerator(env) { + let raw2 = null; + try { + raw2 = await env.SESSIONS_KV.get(ACCEL_KEY); + } catch { + return false; + } + if (!raw2) return false; + try { + const parsed = JSON.parse(raw2); + if (!parsed?.data || !Array.isArray(parsed.data.users)) return false; + if (overlay && overlayAt >= (parsed.written_at ?? 0)) return false; + overlay = { version: 1, console: parsed.data.console ?? null, users: parsed.data.users }; + overlayAt = parsed.written_at ?? Date.now(); + return true; + } catch { + return false; + } +} +async function authStoreRecentlyWritten(env) { + try { + return Boolean(await env.SESSIONS_KV.get(ACCEL_KEY)); + } catch { + return false; + } +} +function unionStores(a, b) { + const byId = /* @__PURE__ */ new Map(); + for (const u of [...a.users, ...b.users]) { + const prev = byId.get(u.id); + if (!prev || (u.updated_at ?? "") >= (prev.updated_at ?? "")) byId.set(u.id, u); + } + return { version: 1, console: a.console ?? b.console ?? null, users: [...byId.values()] }; +} +async function mutateAuthStore(env, fn) { + await hydrateFromAccelerator(env); + const next = unionStores(readAuthStore(env), readAuthStoreFromEnv(env)); + await fn(next); + await writeAuthStore(env, next); + return next; +} +function authStoreStatus(env) { + const data = readAuthStore(env); + return { + present: authStorePresent(env), + writable: authStoreWritable(env), + users: data.users.length, + console_configured: Boolean(data.console), + shards: shardNames(env).length + }; +} + +// cypher-executor/src/routes/health.ts +var healthRouter = new Hono2(); +healthRouter.get("/health", (c) => { + const bundleVersion = c.env.ARCRUN_BUNDLE_VERSION; + return c.json({ + ok: true, + ...bundleVersion ? { bundle_version: bundleVersion } : {}, + auth_store: authStoreStatus(c.env), + // arcrun-rag#38/#69/#25(2026-08-11):安裝器判斷「要不要重推」只比 bundle_version—— + // 但這次要修的洞是「installer 從沒注入過 PORTAL_MAIL_RELAY_BASE」,跟 bundle 內容 + // 版本無關(同一個 cypher 版本,有的實例有這個 var、有的沒有)。純比版本號的話, + // 已經在最新版的實例(如 leo 自己那台)永遠不會因為「按更新」而重推,這個 var + // 就永遠補不進去。只回布林(有沒有設,不回值本身)——不洩漏郵差網址。 + mail_relay_configured: Boolean(String(c.env.PORTAL_MAIL_RELAY_BASE ?? "").trim()) + }); +}); +healthRouter.get( + "/", + (c) => c.json({ + service: "arcrun-cypher-executor", + version: "1.0.0", + status: "ok" + }) +); + +// cypher-executor/src/routes/execute.ts +init_dist(); +init_types(); +init_graph_executor(); +init_schemas(); +init_component_loader(); + +// cypher-executor/src/actions/execution-logger.ts +init_kbdb_proxy(); +function extractTarget(input) { + if (!input) return void 0; + const raw2 = input.page_name ?? input.path; + if (raw2 === void 0 || raw2 === null) return void 0; + return typeof raw2 === "string" ? raw2 : JSON.stringify(raw2); +} +async function writeExecutionVerdict(env, workflowId, nodes, verdict, durationMs, message, input, apiKey) { + try { + const { base, headers } = kbdbBase(env); + await fetch(`${base}/execution-log/record`, { + method: "POST", + headers, + body: JSON.stringify({ + workflow_id: workflowId, + owner_id: apiKey ?? null, + verdict, + duration_ms: Math.max(0, Math.round(durationMs)), + message: message ?? "", + target: extractTarget(input) ?? null + }) + }); + } catch { + } +} + +// cypher-executor/src/routes/execute.ts +var executeRouter = new Hono2(); +executeRouter.post("/execute", async (c) => { + const body = await c.req.json(); + const parsed = executeSchema.safeParse(body); + if (!parsed.success) { + return c.json({ error: "\u5716\u5B9A\u7FA9\u9A57\u8B49\u5931\u6557", details: parsed.error.issues }, 400); + } + const { graph, context } = parsed.data; + const apiKey = c.req.header("x-arcrun-api-key") ?? void 0; + const loader = createComponentLoader(c.env); + const executor = new GraphExecutor(loader, void 0, c.env, apiKey); + const start = Date.now(); + try { + const result = await executor.execute(graph, context, c.env.EXEC_CONTEXT); + const duration_ms = Date.now() - start; + c.executionCtx.waitUntil( + writeExecutionVerdict(c.env, graph.id, graph.nodes, "success", duration_ms, "\u57F7\u884C\u5B8C\u6210", context, apiKey) + ); + return c.json({ success: true, data: result.data, trace: result.trace, duration_ms }); + } catch (err) { + const duration_ms = Date.now() - start; + const errMsg = err instanceof Error ? err.message : String(err); + c.executionCtx.waitUntil( + writeExecutionVerdict(c.env, graph.id, graph.nodes, "failed", duration_ms, errMsg.slice(0, 100), context, apiKey) + ); + if (err instanceof ExecutionError) { + const traceFormatted = err.trace.map((s) => ({ + node: s.nodeId, + status: s.error ? "failed" : "success", + ...s.error ? { error: s.error } : {} + })); + return c.json({ + success: false, + error: errMsg, + failed_node: err.failed_node, + failed_input: err.failed_input, + trace: traceFormatted, + duration_ms + }, 500); + } + return c.json({ success: false, error: errMsg, failed_node: null, trace: [], duration_ms }, 500); + } +}); + +// cypher-executor/src/routes/cypher.ts +init_dist(); + +// cypher-executor/src/actions/cypher-handlers.ts +init_types(); +init_graph_executor(); +init_schemas(); +init_component_loader(); +init_execution_evaluator(); + +// cypher-executor/src/actions/triplet-parser.ts +init_constants3(); +function parseTriplets(rawTriplets) { + const edges = []; + const nodeNames = /* @__PURE__ */ new Set(); + const fromSet = /* @__PURE__ */ new Set(); + const toSet = /* @__PURE__ */ new Set(); + for (const line of rawTriplets) { + if (typeof line !== "string") continue; + const parts = line.split(">>").map((s) => s.trim()); + if (parts.length !== 3) continue; + const [from, action, to] = parts; + edges.push({ from, to, label: action }); + nodeNames.add(from); + nodeNames.add(to); + fromSet.add(from); + toSet.add(to); + } + if (nodeNames.size === 0) return null; + const sourceNodes = new Set([...fromSet].filter((n) => !toSet.has(n))); + const sinkNodes = new Set([...toSet].filter((n) => !fromSet.has(n))); + return { edges, nodeNames, sourceNodes, sinkNodes }; +} +var INPUT_NAMES = /* @__PURE__ */ new Set(["input", "trigger", "webhook", "start"]); +var OUTPUT_NAMES = /* @__PURE__ */ new Set(["output", "result", "end", "done"]); +function isVirtualIoName(name) { + const lower = name.toLowerCase(); + return INPUT_NAMES.has(lower) || OUTPUT_NAMES.has(lower); +} +function resolveNodeRole(name, parsed) { + if (INPUT_NAMES.has(name.toLowerCase())) return "Input"; + if (OUTPUT_NAMES.has(name.toLowerCase())) return "Output"; + if (parsed.sourceNodes.has(name)) return "Input"; + return "Component"; +} +function toEdgeType(label) { + const upper = label.toUpperCase(); + if (VALID_EDGE_TYPES.has(upper)) return upper; + return SEMANTIC_EDGE_MAP[label] ?? SEMANTIC_EDGE_MAP[upper] ?? "PIPE"; +} + +// cypher-executor/src/actions/search-nodes.ts +init_component_loader(); +init_recipes(); + +// cypher-executor/src/lib/branch-hints.ts +var BRANCH_HINTS = { + if_control: { + branch_field: "data.branch", + branches: ["true", "false"], + edge_types: ["ON_TRUE", "ON_FALSE"], + usage: '\u9019\u9846\u7B97\u5B8C\u6703\u8F38\u51FA data.branch\uFF08"true"\uFF0F"false"\uFF09\u3002\u4E0B\u6E38\u63A5\u5169\u689D\u908A\uFF1AON_TRUE \u63A5\u689D\u4EF6\u6210\u7ACB\u8981\u505A\u7684\u4E8B\uFF0CON_FALSE \u63A5\u4E0D\u6210\u7ACB\u8981\u505A\u7684\u4E8B\u3002**\u4E0D\u9700\u8981\u81EA\u5DF1\u5BEB code \u5224\u65B7\u8D70\u54EA\u689D**\u2014\u2014\u5F15\u64CE\u4F9D branch \u81EA\u52D5\u9078\u8DEF\u3002', + example: "\u5224\u65B7\u6709\u6C92\u6709\u65B0\u8CC7\u6599 >> ON_TRUE >> \u50B3\u5230 telegram\n\u5224\u65B7\u6709\u6C92\u6709\u65B0\u8CC7\u6599 >> ON_FALSE >> \u7D50\u675F\n\uFF08\u4E2D\u6587\u8A9E\u610F\u8A5E\u4EA6\u53EF\uFF1A\u300C\u6210\u7ACB\u6642\u300D\uFF1DON_TRUE\u3001\u300C\u5426\u5247\u300D\uFF1DON_FALSE\uFF09" + }, + switch: { + branch_field: "data.branch", + branches: "\u7531 input_schema.cases[].branch \u8207 default_branch \u6C7A\u5B9A\uFF08N \u8DEF\uFF0C\u975E\u56FA\u5B9A\u6E05\u55AE\uFF09", + edge_types: ["ON_BRANCH"], + usage: "\u9019\u9846\u4F9D value \u6BD4\u5C0D cases\uFF0C\u8F38\u51FA data.branch\uFF1D\u547D\u4E2D\u90A3\u500B case \u7684 branch \u540D\uFF08\u90FD\u6C92\u4E2D\u5247\u662F default_branch\uFF09\u3002\u4E0B\u6E38**\u6BCF\u689D\u8DEF\u5404\u63A5\u4E00\u689D ON_BRANCH \u908A\uFF0C\u4E26\u5728\u908A\u4E0A\u6A19 branch \u7B49\u65BC\u4F60\u5728 cases \u88E1\u53D6\u7684\u540D\u5B57**\u3002default_branch \u4E0D\u9700\u8981\u7279\u5225\u7684\u908A\u578B\uFF0C\u7167\u6A23\u7528 ON_BRANCH \u6A19\u5B83\u7684\u540D\u5B57\u5373\u53EF\u3002", + example: '{"cases":[{"match":"active","branch":"branch_active"}],"default_branch":"branch_default"}\nedges: [\n {"from":"my_switch","to":"\u8655\u7406\u555F\u7528","type":"ON_BRANCH","branch":"branch_active"},\n {"from":"my_switch","to":"\u8655\u7406\u5176\u4ED6","type":"ON_BRANCH","branch":"branch_default"}\n]' + }, + try_catch: { + branch_field: "data.branch", + branches: ["try", "catch"], + edge_types: ["ON_BRANCH"], + usage: '\u9019\u9846\u770B\u4E0A\u6E38 error \u662F\u5426\u975E\u7A7A\uFF0C\u8F38\u51FA data.branch\uFF08"try"\uFF1D\u6C92\u932F\uFF0F"catch"\uFF1D\u6709\u932F\uFF09\u3002\u4E0B\u6E38\u63A5\u5169\u689D ON_BRANCH \u908A\uFF0Cbranch \u5206\u5225\u6A19 "try" \u8207 "catch"\u3002**\u932F\u8AA4\u8655\u7406\u4E0D\u9700\u8981\u5BEB code**\u2014\u2014\u628A\u8981\u88DC\u6551\u7684\u7BC0\u9EDE\u63A5\u5728 catch \u90A3\u689D\u908A\u5F8C\u9762\u5373\u53EF\u3002', + example: 'edges: [\n {"from":"my_try_catch","to":"\u6B63\u5E38\u6D41\u7A0B","type":"ON_BRANCH","branch":"try"},\n {"from":"my_try_catch","to":"\u88DC\u6551\u6D41\u7A0B","type":"ON_BRANCH","branch":"catch"}\n]' + } +}; +function branchHintFor(componentId) { + if (!componentId) return void 0; + return BRANCH_HINTS[componentId.toLowerCase()]; +} + +// cypher-executor/src/actions/search-nodes.ts +async function searchNodes(parsed, config, env, mode = "discover", target) { + const nodeResults = {}; + const missingNodes = []; + if (mode === "compile") { + for (const nodeName of parsed.nodeNames) { + const role = resolveNodeRole(nodeName, parsed); + if ((role === "Input" || role === "Output") && isVirtualIoName(nodeName)) { + nodeResults[nodeName] = { status: "found", componentId: nodeName.toLowerCase(), type: role }; + continue; + } + const configComponent = config?.[nodeName]?.component; + nodeResults[nodeName] = { + status: configComponent ? "found" : "unchecked", + componentId: configComponent ?? nodeName, + type: role + }; + } + return { nodeResults, missingNodes }; + } + const sub = env?.WORKER_SUBDOMAIN; + const registryBase = env?.REGISTRY_BASE_URL ?? (sub ? wasmWorkerUrl("registry", sub) : void 0); + const wantComponents = target !== "recipe"; + const wantRecipes = target !== "component"; + const catalog = !wantComponents ? { status: "ok", entries: [] } : registryBase ? await fetchCatalog(registryBase) : { status: "unreachable", entries: [] }; + const recipes = wantRecipes && env?.RECIPES ? await listAllRecipes2(env.RECIPES) : []; + const byId = /* @__PURE__ */ new Map(); + for (const e of catalog.entries) { + const prev = byId.get(e.canonical_id); + if (!prev || (e.score ?? 0) > (prev.score ?? 0)) byId.set(e.canonical_id, e); + for (const a of e.aliases ?? []) if (!byId.has(a)) byId.set(a, e); + } + for (const nodeName of parsed.nodeNames) { + const role = resolveNodeRole(nodeName, parsed); + if ((role === "Input" || role === "Output") && isVirtualIoName(nodeName)) { + nodeResults[nodeName] = { status: "found", componentId: nodeName.toLowerCase(), type: role }; + continue; + } + const configComponent = config?.[nodeName]?.component; + const componentId = configComponent ?? nodeName; + if (configComponent) { + nodeResults[nodeName] = { status: "found", componentId, type: role }; + continue; + } + if (catalog.status === "unreachable") { + nodeResults[nodeName] = { status: "unknown", componentId, type: role }; + continue; + } + if (catalog.status === "no_endpoint") { + const legacy = await legacyPerNodeLookup(registryBase, componentId, nodeName, role, env, recipes); + nodeResults[nodeName] = legacy.info; + if (legacy.missing) missingNodes.push(nodeName); + continue; + } + const hit = byId.get(componentId); + if (hit) { + nodeResults[nodeName] = { + status: "found", + componentId, + type: role, + source: "component", + input_schema: hit.input_schema, + success_rate: typeof hit.success_rate === "number" ? hit.success_rate : void 0, + stability: typeof hit.stability === "string" ? hit.stability : void 0, + branch_hint: branchHintFor(componentId) + }; + continue; + } + const recipe = recipes.find((r) => r.canonical_id === componentId); + if (recipe) { + nodeResults[nodeName] = { + status: "found", + componentId: recipe.canonical_id, + type: role, + source: "recipe", + description: recipe.description, + endpoint: recipe.endpoint, + payload_hint: buildPayloadHint(recipe) + }; + continue; + } + const substituted = trySubstitution(nodeName, catalog.entries, recipes); + if (substituted) { + nodeResults[nodeName] = { ...substituted, type: role }; + continue; + } + const similarComponents = similarFromCatalog(catalog.entries, nodeName); + const similarRecipes = similarFromRecipes(recipes, nodeName); + nodeResults[nodeName] = { + status: "not_found", + componentId, + type: role, + suggestion: buildSuggestion(componentId), + ...similarComponents.length > 0 ? { similar_components: similarComponents } : {}, + ...similarRecipes.length > 0 ? { similar_recipes: similarRecipes } : {} + }; + missingNodes.push(nodeName); + } + return { nodeResults, missingNodes }; +} +async function fetchCatalog(registryBase) { + try { + const res = await fetch(`${registryBase}/components/catalog`, { signal: AbortSignal.timeout(1e4) }); + if (res.status === 404) return { status: "no_endpoint", entries: [] }; + if (!res.ok) return { status: "unreachable", entries: [] }; + const body = await res.json(); + return { status: "ok", entries: body.data?.components ?? [] }; + } catch { + return { status: "unreachable", entries: [] }; + } +} +async function listAllRecipes2(kv) { + try { + const list = await kv.list({ prefix: "recipe:" }); + return (await Promise.all( + list.keys.map((k) => kv.get(k.name, "json")) + )).filter(Boolean); + } catch { + return []; + } +} +function similarFromCatalog(entries, nodeName) { + const searchableOf = (e) => [e.canonical_id, e.display_name ?? "", e.description ?? "", ...e.aliases ?? [], ...e.tags ?? []].join(" ").toLowerCase(); + const full = nodeName.toLowerCase(); + const direct = entries.filter((e) => searchableOf(e).includes(full)).map((e) => e.canonical_id); + if (direct.length > 0) return [...new Set(direct)].slice(0, 3); + const tokens = extractTokens(nodeName); + if (tokens.length === 0) return []; + const count = /* @__PURE__ */ new Map(); + for (const e of entries) { + const hay = searchableOf(e); + const hits = tokens.filter((t) => hay.includes(t)).length; + if (hits > 0) count.set(e.canonical_id, Math.max(count.get(e.canonical_id) ?? 0, hits)); + } + return [...count.entries()].sort((a, b) => b[1] - a[1]).slice(0, 3).map(([id]) => id); +} +function similarFromRecipes(recipes, nodeName) { + const tokens = [nodeName.toLowerCase(), ...extractTokens(nodeName)]; + const seen = /* @__PURE__ */ new Set(); + const matched = []; + for (const r of recipes) { + if (seen.has(r.canonical_id)) continue; + const hay = `${r.canonical_id} ${r.display_name ?? ""} ${r.description ?? ""}`.toLowerCase(); + if (tokens.some((t) => hay.includes(t))) { + seen.add(r.canonical_id); + matched.push(r.canonical_id); + } + } + return matched.slice(0, 3); +} +async function legacyPerNodeLookup(registryBase, componentId, nodeName, role, env, recipes) { + const q = await fetchComponent(registryBase, componentId); + if (!q.ok) return { info: { status: "unknown", componentId, type: role }, missing: false }; + if (q.entry) { + return { + info: { + status: "found", + componentId, + type: role, + source: "component", + input_schema: q.entry.input_schema, + success_rate: q.entry.success_rate, + stability: q.entry.stability, + branch_hint: branchHintFor(componentId) + }, + missing: false + }; + } + const recipe = recipes.find((r) => r.canonical_id === componentId) ?? (env?.RECIPES ? await resolveRecipe(componentId, env.RECIPES) : null); + if (recipe) { + return { + info: { + status: "found", + componentId: recipe.canonical_id, + type: role, + source: "recipe", + description: recipe.description, + endpoint: recipe.endpoint, + payload_hint: buildPayloadHint(recipe) + }, + missing: false + }; + } + const similarComponents = await searchSimilarComponents(registryBase, nodeName); + const similarRecipes = similarFromRecipes(recipes, nodeName); + return { + info: { + status: "not_found", + componentId, + type: role, + suggestion: buildSuggestion(componentId), + ...similarComponents.length > 0 ? { similar_components: similarComponents } : {}, + ...similarRecipes.length > 0 ? { similar_recipes: similarRecipes } : {} + }, + missing: true + }; +} +function trySubstitution(nodeName, catalogEntries, recipes) { + const lower = nodeName.toLowerCase(); + const serviceHits = SERVICE_HINTS.filter((w) => lower.includes(w)); + if (serviceHits.length > 0) { + const matched = /* @__PURE__ */ new Map(); + for (const r of recipes) { + const hay = `${r.canonical_id} ${r.display_name ?? ""} ${r.description ?? ""}`.toLowerCase(); + if (serviceHits.every((h) => hay.includes(h))) matched.set(r.canonical_id, r); + } + if (matched.size !== 1) return null; + const recipe = [...matched.values()][0]; + return { + status: "resolved", + componentId: recipe.canonical_id, + source: "recipe", + description: recipe.description, + endpoint: recipe.endpoint, + substitution: { + from: nodeName, + componentId: "http_request", + // recipe=http_request+參數模板的具名封裝 + recipe: recipe.canonical_id, + reason: `\u670D\u52D9\u8A5E\u300C${serviceHits.join("\u3001")}\u300D\u552F\u4E00\u547D\u4E2D recipe\u300C${recipe.canonical_id}\u300D\uFF1Bworkflow config \u5BEB component: ${recipe.canonical_id}\uFF08\u5E95\u5C64\u96F6\u4EF6\uFF1Dhttp_request\uFF09\uFF0C\u53EA\u9700\u586B payload` + } + }; + } + const tokens = extractTokens(nodeName); + if (tokens.length === 0) return null; + const byCanonical = /* @__PURE__ */ new Map(); + for (const e of catalogEntries) { + const strongHay = [e.canonical_id, e.display_name ?? "", ...e.aliases ?? []].join(" ").toLowerCase(); + const weakHay = [e.description ?? "", ...e.tags ?? []].join(" ").toLowerCase(); + const strongHits = tokens.filter((t) => strongHay.includes(t)); + const weakCount = tokens.filter((t) => weakHay.includes(t)).length; + const score = strongHits.length * 10 + weakCount; + if (score === 0) continue; + const prev = byCanonical.get(e.canonical_id); + if (!prev || score > prev.score) byCanonical.set(e.canonical_id, { entry: e, score, strongHits }); + } + const ranked = [...byCanonical.values()].sort((a, b) => b.score - a.score); + const top = ranked[0]; + if (!top || top.strongHits.length === 0) return null; + if (ranked[1] && ranked[1].score >= top.score) return null; + return { + status: "resolved", + componentId: top.entry.canonical_id, + source: "component", + input_schema: top.entry.input_schema, + success_rate: typeof top.entry.success_rate === "number" ? top.entry.success_rate : void 0, + stability: typeof top.entry.stability === "string" ? top.entry.stability : void 0, + // 替換成分岔零件時(例「判斷有沒有新資料」→ if_control)一併附分支用法, + // 否則 AI 換到零件卻不知道怎麼接兩條路,仍會退回寫 code。 + branch_hint: branchHintFor(top.entry.canonical_id), + substitution: { + from: nodeName, + componentId: top.entry.canonical_id, + reason: `\u65B7\u8A5E\u300C${top.strongHits.join("\u3001")}\u300D\u547D\u4E2D\u96F6\u4EF6\u300C${top.entry.canonical_id}\u300D\uFF08${top.entry.display_name ?? ""}\uFF09\u5F37\u6B04\u4F4D\u4E14\u5206\u6578\u552F\u4E00\u6700\u9AD8\uFF1B\u53EA\u9700\u7167 input_schema \u586B payload` + } + }; +} +var SERVICE_HINTS = [ + "google", + "gmail", + "sheets", + "slides", + "gdocs", + "drive", + "calendar", + "youtube", + "slack", + "telegram", + "discord", + "line", + "whatsapp", + "twilio", + "notion", + "airtable", + "trello", + "jira", + "asana", + "linear", + "github", + "gitea", + "gitlab", + "bitbucket", + "stripe", + "paypal", + "shopify", + "hubspot", + "salesforce", + "openai", + "anthropic", + "claude", + "gemini", + "groq", + "twitter", + "facebook", + "instagram", + "linkedin", + "dropbox", + "zoom", + "sendgrid", + "mailgun", + "kbdb" +]; +var COMPUTE_HINTS = [ + "encrypt", + "decrypt", + "cipher", + "aes", + "rsa", + "sha", + "md5", + "hmac", + "hash", + "sign", + "verify", + "encode", + "decode", + "base64", + "hex", + "compress", + "decompress", + "zip", + "gzip", + "uuid", + "random", + "regex", + "math", + "calc", + "sort", + "dedup", + "diff", + "template", + "render", + "convert", + "transform", + "parse", + "format", + "csv", + "xml" +]; +function buildSuggestion(componentId) { + const lower = componentId.toLowerCase(); + const serviceHit = SERVICE_HINTS.find((w) => lower.includes(w)); + const computeHit = COMPUTE_HINTS.find((w) => lower.includes(w)); + if (serviceHit) { + return `\u5169\u5EAB\u90FD\u67E5\u904E\uFF0C\u96F6\u4EF6 registry \u8207 recipe \u5EAB\u7686\u7121\u300C${componentId}\u300D\u3002\u540D\u5B57\u542B\u670D\u52D9\u8A5E\u300C${serviceHit}\u300D\uFF1D\u5916\u90E8 API \u6A23\u8C8C \u2192 \u6C92\u6709\u6B64 recipe\uFF0C\u53EF\u81EA\u5DF1\u5BEB\uFF1A\u5BEB\u6CD5\u770B skill\u300Cwrite_recipe\u300D\uFF08arcrun_get_skill('write_recipe')\uFF09\uFF0C\u5BEB\u597D\u7528 acr recipe push \u6216 POST /recipes \u88DD\u4E0A\u5373\u53EF\u7528\uFF0C\u4E0D\u7528\u6539\u5E73\u53F0\u3002`; + } + if (computeHit) { + return `\u5169\u5EAB\u90FD\u67E5\u904E\uFF0C\u96F6\u4EF6 registry \u8207 recipe \u5EAB\u7686\u7121\u300C${componentId}\u300D\u3002\u540D\u5B57\u542B\u8A08\u7B97\u8A5E\u300C${computeHit}\u300D\uFF1D\u8A08\u7B97\u539F\u8A9E\u6A23\u8C8C \u2192 \u6C92\u6709\u6B64\u96F6\u4EF6\uFF0C\u53EF\u6295\u7A3F PR \u65B0\u589E WASM component\uFF1A\u505A\u6CD5\u770B skill\u300Cadd_new_wasm_component\u300D\uFF08arcrun_get_skill('add_new_wasm_component')\uFF09\u3002`; + } + return `\u5169\u5EAB\u90FD\u67E5\u904E\uFF0C\u96F6\u4EF6 registry \u8207 recipe \u5EAB\u7686\u7121\u300C${componentId}\u300D\uFF0C\u4E14\u540D\u5B57\u5224\u4E0D\u51FA\u578B\u3002\u7F3A\u5916\u90E8 API \u2192 \u81EA\u5DF1\u5BEB recipe\uFF08skill\u300Cwrite_recipe\u300D\uFF09\uFF1B\u7F3A\u8A08\u7B97\u80FD\u529B \u2192 \u6295\u7A3F\u96F6\u4EF6 PR\uFF08skill\u300Cadd_new_wasm_component\u300D\uFF0Ccomponent \u9032 WASM \u6C99\u7BB1\uFF09\u3002`; +} +function buildPayloadHint(recipe) { + const parts = []; + if (recipe.body_template) { + parts.push("payload \u5DF2\u6536\u5728 recipe \u7684 body_template \u88E1\uFF0C\u4F60\u53EA\u8981\u628A {{\u8B8A\u6578}} \u5C0D\u61C9\u7684\u503C\u653E\u9032\u7BC0\u9EDE context"); + } else if (recipe.body) { + parts.push("payload \u5F62\u72C0\u898B body \u6B04\u4F4D\uFF08{{\u8B8A\u6578}} \u7531\u7BC0\u9EDE context \u586B\uFF09"); + } else { + parts.push("\u672A\u5B9A\u7FA9 body_template\uFF1A\u7BC0\u9EDE context \u6703\u6574\u5305\u7576 body \u9001\u51FA\uFF08_ \u958B\u982D\u7684\u5167\u90E8\u6B04\u4F4D\u6703\u88AB\u5254\u9664\uFF09"); + } + if (recipe.response_map) { + parts.push("\u56DE\u61C9\u5DF2\u6B63\u898F\u5316\uFF1A\u57F7\u884C\u7D50\u679C\u9664\u4E86\u539F\u59CB data\uFF0C\u53E6\u9644 text\uFF08\u53D6\u503C\u8DEF\u5F91\u7B49\u898F\u5247\u5BEB\u5728 recipe \u88E1\uFF0C\u63DB\u6E90\u4E0D\u5FC5\u6539 workflow\uFF09"); + } else { + parts.push("\u672A\u5B9A\u7FA9 response_map\uFF1A\u56DE\u61C9\u539F\u6A23\u653E\u5728 data\uFF0C\u53D6\u503C\u8981\u81EA\u5DF1\u6307\u8DEF\u5F91"); + } + if (recipe.auth === "binding") { + parts.push(`\u8A8D\u8B49\uFF1Dbinding\uFF08\u514D\u91D1\u9470\uFF0C\u7528\u5E73\u53F0\u5167\u5EFA ${recipe.binding_name ?? "AI"}\uFF09`); + } else if (recipe.auth_service) { + parts.push(`\u8A8D\u8B49\u8D70 auth recipe\u300C${recipe.auth_service}\u300D\uFF08\u91D1\u9470\u7531\u7CFB\u7D71\u5728\u57F7\u884C\u524D\u6CE8\u5165\uFF0C\u4F60\u4E0D\u5FC5\u4E5F\u4E0D\u8A72\u586B\uFF09`); + } + return { + body_template: recipe.body_template, + response_map: recipe.response_map, + usage: parts.join("\uFF1B") + "\u3002" + }; +} +async function fetchComponent(registryBase, id) { + try { + const res = await fetch(`${registryBase}/components/${encodeURIComponent(id)}`, { + signal: AbortSignal.timeout(5e3) + }); + if (res.status === 404) return { ok: true }; + if (!res.ok) return { ok: false }; + const body = await res.json(); + if (body.success === false) return { ok: true }; + const d = body.data ?? body; + return { + ok: true, + entry: { + input_schema: d.input_schema, + success_rate: typeof d.success_rate === "number" ? d.success_rate : void 0, + stability: typeof d.stability === "string" ? d.stability : void 0 + } + }; + } catch { + return { ok: false }; + } +} +function extractTokens(name) { + const tokens = []; + const ascii = name.toLowerCase().match(/[a-z0-9]{3,}/g) ?? []; + tokens.push(...ascii); + const cjkRuns = name.match(/[一-鿿]+/g) ?? []; + for (const run2 of cjkRuns) { + for (let i = 0; i + 2 <= run2.length; i++) tokens.push(run2.slice(i, i + 2)); + } + return [...new Set(tokens)].slice(0, 8); +} +async function searchRegistryIds(registryBase, q) { + try { + const res = await fetch(`${registryBase}/components/search?q=${encodeURIComponent(q)}`, { + signal: AbortSignal.timeout(5e3) + }); + if (!res.ok) return []; + const body = await res.json(); + return (body.data?.results ?? []).map((r) => r.canonical_id).filter((s) => !!s); + } catch { + return []; + } +} +async function searchSimilarComponents(registryBase, nodeName) { + const direct = await searchRegistryIds(registryBase, nodeName); + if (direct.length > 0) return direct.slice(0, 3); + const tokens = extractTokens(nodeName); + if (tokens.length === 0) return []; + const hits = await Promise.all(tokens.map((t) => searchRegistryIds(registryBase, t))); + const count = /* @__PURE__ */ new Map(); + for (const ids of hits) { + for (const id of ids) count.set(id, (count.get(id) ?? 0) + 1); + } + return [...count.entries()].sort((a, b) => b[1] - a[1]).slice(0, 3).map(([id]) => id); +} + +// cypher-executor/src/actions/graph-builder.ts +function buildExecutionGraph(parsed, nodeResults, graphId, graphName, config) { + const nodes = [...parsed.nodeNames].map((name) => { + const nr = nodeResults[name]; + const id = name.toLowerCase().replace(/\s+/g, "-"); + const nodeConfig = config?.[name] ?? {}; + const componentId = nodeConfig.component ?? nr.componentId; + const { component: _component, ...staticParams } = nodeConfig; + const data = Object.keys(staticParams).length > 0 ? staticParams : void 0; + return { id, type: nr.type, componentId, label: name, data }; + }); + const edges = parsed.edges.map((e) => { + let iterator; + let label = e.label; + const foreachMatch = label.match(/^(?:對每個|FOREACH)\s+(\w+)$/i); + if (foreachMatch) { + iterator = foreachMatch[1]; + label = "\u5C0D\u6BCF\u500B"; + } + let branch; + const branchMatch = label.match(/^(?:ON_BRANCH|分支)\s*[((]\s*([\w-]+)\s*[))]$/i); + if (branchMatch) { + branch = branchMatch[1]; + label = "ON_BRANCH"; + } + const edge = { + from: e.from.toLowerCase().replace(/\s+/g, "-"), + to: e.to.toLowerCase().replace(/\s+/g, "-"), + type: toEdgeType(label) + }; + if (iterator) edge.iterator = iterator; + if (branch) edge.branch = branch; + return edge; + }); + return { id: graphId, name: graphName, nodes, edges }; +} + +// cypher-executor/src/actions/cypher-handlers.ts +async function handleCypherSearch(triplets, env, mode = "discover", target) { + const parsed = parseTriplets(triplets); + if (!parsed) { + throw new Error("\u7121\u6CD5\u89E3\u6790\u4EFB\u4F55\u7BC0\u9EDE"); + } + const { nodeResults, missingNodes } = await searchNodes(parsed, void 0, env, mode, target); + const graph = buildExecutionGraph(parsed, nodeResults, "cypher-search-result", "Cypher Search Result"); + return { nodes: nodeResults, cypher: { nodes: graph.nodes, edges: graph.edges }, missing: missingNodes }; +} +async function handleCypherExecute(triplets, context, graphId, graphName, config, env, waitUntil, apiKey) { + const parsed = parseTriplets(triplets); + if (!parsed) { + throw new Error("\u7121\u6CD5\u89E3\u6790\u4EFB\u4F55\u7BC0\u9EDE"); + } + const { nodeResults } = await searchNodes(parsed, config, env, "compile"); + const graph = buildExecutionGraph(parsed, nodeResults, graphId, graphName, config); + const parseResult = graphSchema.safeParse(graph); + if (!parseResult.success) { + throw new Error("\u5716\u5B9A\u7FA9\u7522\u751F\u5931\u6557"); + } + const loader = createComponentLoader(env); + const executor = new GraphExecutor(loader, void 0, env, apiKey); + const start = Date.now(); + try { + const result = await executor.execute(parseResult.data, context ?? {}, env.EXEC_CONTEXT); + const duration_ms = Date.now() - start; + waitUntil(recordComponentStats(env, graph.nodes, result.trace)); + return { success: true, data: result.data, trace: result.trace, duration_ms, graph }; + } catch (err) { + const duration_ms = Date.now() - start; + if (err instanceof WorkflowPaused) { + return { + success: true, + paused: true, + task_id: err.task_id, + run_id: err.run_id, + paused_node_id: err.paused_node_id, + trace: err.trace_so_far, + duration_ms, + graph + }; + } + const errMsg = err instanceof Error ? err.message : String(err); + if (err instanceof ExecutionError) { + waitUntil(recordComponentStats(env, graph.nodes, err.trace)); + const traceFormatted = err.trace.map((s) => ({ + node: s.nodeId, + status: s.error ? "failed" : "success", + ...s.error ? { error: s.error } : {} + })); + throw new Error(JSON.stringify({ + success: false, + error: errMsg, + failed_node: err.failed_node, + failed_input: err.failed_input, + trace: traceFormatted, + duration_ms + })); + } + throw err; + } +} + +// cypher-executor/src/actions/target-search.ts +init_component_loader(); + +// cypher-executor/src/lib/workflow-search.ts +async function fetchTenantWorkflowSearch(env, apiKey, q, mode = "semantic") { + const base = (env.KBDB_BASE_URL ?? "https://arcrun-kbdb.uncle6-me.workers.dev").replace(/\/$/, ""); + const headers = { "Content-Type": "application/json" }; + if (env.KBDB_INTERNAL_TOKEN) headers["Authorization"] = `Bearer ${env.KBDB_INTERNAL_TOKEN}`; + const params = new URLSearchParams({ + q, + owner_id: apiKey, + // 租戶隔離(只搜本租戶的 workflow) + entry_type: "workflow", + // base 通用 filter(Q4),只回 workflow entry + mode + }); + return fetch(`${base}/entries/search?${params.toString()}`, { headers }); +} + +// cypher-executor/src/actions/target-search.ts +async function searchByTarget(target, query, env, apiKey) { + if (target === "component") { + const sub = env.WORKER_SUBDOMAIN; + const registryBase = env.REGISTRY_BASE_URL ?? (sub ? wasmWorkerUrl("registry", sub) : void 0); + if (!registryBase) return { ok: false, status: 502, error: "registry \u4F4D\u7F6E\u672A\u8A2D\u5B9A\uFF08WORKER_SUBDOMAIN\uFF0FREGISTRY_BASE_URL \u7686\u7F3A\uFF09" }; + try { + const res2 = await fetch( + `${registryBase}/components/search?q=${encodeURIComponent(query)}`, + { signal: AbortSignal.timeout(1e4) } + ); + if (!res2.ok) return { ok: false, status: 502, error: `registry \u641C\u5C0B\u5931\u6557\uFF08HTTP ${res2.status}\uFF09` }; + const body2 = await res2.json(); + const results = (body2.data?.results ?? []).map((r) => { + if (!r || typeof r !== "object") return r; + const rec = r; + const hint = branchHintFor(typeof rec.canonical_id === "string" ? rec.canonical_id : void 0); + return hint ? { ...rec, branch_hint: hint } : rec; + }); + return { + ok: true, + body: { + target, + query, + results, + count: body2.data?.count ?? 0 + } + }; + } catch (e) { + return { ok: false, status: 502, error: `registry \u67E5\u4E0D\u901A\uFF1A${e instanceof Error ? e.message : String(e)}` }; + } + } + if (target === "recipe") { + if (!env.RECIPES) return { ok: false, status: 502, error: "RECIPES KV \u672A\u7D81\u5B9A" }; + const all = await listAllRecipes2(env.RECIPES); + const q = query.toLowerCase(); + const seen = /* @__PURE__ */ new Set(); + const results = []; + for (const r of all) { + if (seen.has(r.canonical_id)) continue; + const hay = `${r.canonical_id} ${r.display_name ?? ""} ${r.description ?? ""}`.toLowerCase(); + if (!hay.includes(q)) continue; + seen.add(r.canonical_id); + results.push({ + canonical_id: r.canonical_id, + display_name: r.display_name, + description: r.description, + endpoint: r.endpoint, + // 3.12:逐顆查 recipe 時也要說得出「payload 怎麼填、回應怎麼取值」 + payload_hint: buildPayloadHint(r) + }); + } + return { + ok: true, + body: { + target, + query, + results, + count: results.length, + note: "\u641C\u7684\u662F\u672C\u90E8\u7F72\u79C1\u5EAB\uFF08workflow \u53EF\u76F4\u63A5 component: \u5F15\u7528\uFF09\u3002\u516C\u5EAB\uFF08\u591A\u4F5C\u8005\u5E02\u5834\uFF09\u8D70 MCP arcrun_recipe_search\uFF0FGET /public-recipes\u3002" + } + }; + } + if (!apiKey) return { ok: false, status: 401, error: "target=workflow \u9700\u8981 X-Arcrun-API-Key header\uFF08workflow \u641C\u5C0B\u9650\u672C\u79DF\u6236\uFF09" }; + const res = await fetchTenantWorkflowSearch(env, apiKey, query); + if (!res.ok) return { ok: false, status: 502, error: `workflow \u641C\u5C0B\u5931\u6557\uFF08KBDB HTTP ${res.status}\uFF09` }; + const body = await res.json(); + return { ok: true, body: { target, query, ...body } }; +} + +// cypher-executor/src/routes/cypher.ts +var cypherRouter = new Hono2(); +var VALID_TARGETS = /* @__PURE__ */ new Set(["component", "recipe", "workflow"]); +cypherRouter.post("/cypher/search", async (c) => { + const body = await c.req.json(); + const rawTriplets = body?.triplets; + const target = typeof body?.target === "string" ? body.target : void 0; + if (target !== void 0 && !VALID_TARGETS.has(target)) { + return c.json({ error: `target \u53EA\u63A5\u53D7 component\uFF0Frecipe\uFF0Fworkflow\uFF0C\u6536\u5230\u300C${target}\u300D` }, 400); + } + const query = typeof body?.query === "string" ? body.query.trim() : ""; + if (query) { + if (!target) { + return c.json({ error: "\u7D66 query \u5FC5\u9808\u540C\u6642\u7D66 target\uFF08component\uFF0Frecipe\uFF0Fworkflow\uFF09\uFF0C\u6307\u660E\u8981\u641C\u54EA\u500B\u5EAB" }, 400); + } + const apiKey = c.req.header("X-Arcrun-API-Key") ?? void 0; + const r = await searchByTarget(target, query, c.env, apiKey); + if (!r.ok) return c.json({ error: r.error }, r.status); + return c.json(r.body); + } + if (!Array.isArray(rawTriplets) || rawTriplets.length === 0) { + return c.json({ error: "triplets \u5FC5\u9808\u70BA\u975E\u7A7A\u5B57\u4E32\u9663\u5217\uFF08\u6216\u7D66 query + target \u505A\u540D\u5B57\u641C\u5C0B\uFF09" }, 400); + } + const mode = body?.mode === "compile" ? "compile" : "discover"; + if (target && mode === "compile") { + return c.json({ error: "mode=compile\uFF08\u8907\u88FD\u8DEF\u5F91\uFF09\u4E0D\u67E5\u5EAB\uFF0C\u4E0D\u63A5\u53D7 target\uFF1B\u8981\u6307\u5B9A\u641C\u5C0B\u5C0D\u8C61\u8ACB\u7528 discover\uFF08\u9810\u8A2D\uFF09" }, 400); + } + if (target === "workflow") { + return c.json({ error: 'target=workflow \u662F\u540D\u5B57\u641C\u5C0B\uFF0C\u8ACB\u6539\u5E36 { target: "workflow", query: "..." }\uFF08\u4E0D\u5403 triplets\uFF09' }, 400); + } + try { + const now2 = /* @__PURE__ */ new Date(); + const timestamp = now2.toISOString(); + const versionId = `search-v1-${now2.getFullYear()}${String(now2.getMonth() + 1).padStart(2, "0")}${String(now2.getDate()).padStart(2, "0")}-${String(now2.getHours()).padStart(2, "0")}${String(now2.getMinutes()).padStart(2, "0")}${String(now2.getSeconds()).padStart(2, "0")}`; + const result = await handleCypherSearch(rawTriplets, c.env, mode, target); + const response = { + version: versionId, + timestamp, + triplets: rawTriplets, + nodes: result.nodes, + cypher: result.cypher, + missing: result.missing + }; + return c.json(response); + } catch (err) { + const errMsg = err instanceof Error ? err.message : String(err); + return c.json({ error: errMsg }, 400); + } +}); +cypherRouter.post("/cypher/execute", async (c) => { + const body = await c.req.json(); + if (!Array.isArray(body?.triplets) || body.triplets.length === 0) { + return c.json({ error: "triplets \u5FC5\u9808\u70BA\u975E\u7A7A\u5B57\u4E32\u9663\u5217" }, 400); + } + const graphId = typeof body.graph_id === "string" ? body.graph_id : `triplet-exec-${Date.now()}`; + const graphName = typeof body.graph_name === "string" ? body.graph_name : "Triplet Execution"; + const now2 = /* @__PURE__ */ new Date(); + const timestamp = now2.toISOString(); + const versionId = `execute-v1-${now2.getFullYear()}${String(now2.getMonth() + 1).padStart(2, "0")}${String(now2.getDate()).padStart(2, "0")}-${String(now2.getHours()).padStart(2, "0")}${String(now2.getMinutes()).padStart(2, "0")}${String(now2.getSeconds()).padStart(2, "0")}`; + const apiKey = c.req.header("X-Arcrun-API-Key") ?? void 0; + try { + const result = await handleCypherExecute( + body.triplets, + body.context, + graphId, + graphName, + body.config, + c.env, + (p) => c.executionCtx.waitUntil(p), + apiKey + ); + const response = { + version: versionId, + timestamp, + ...result + }; + return c.json(response); + } catch (err) { + const errMsg = err instanceof Error ? err.message : String(err); + try { + const parsed = JSON.parse(errMsg); + const response = { + version: versionId, + timestamp, + ...parsed + }; + return c.json(response, 500); + } catch { + return c.json({ version: versionId, timestamp, success: false, error: errMsg, duration_ms: 0 }, 500); + } + } +}); + +// cypher-executor/src/routes/validate.ts +init_dist(); +init_schemas(); +init_telemetry(); +var validateRouter = new Hono2(); +validateRouter.post("/validate", async (c) => { + const start = Date.now(); + const apiKey = c.req.header("X-Arcrun-API-Key"); + const userAgent = c.req.header("User-Agent") ?? void 0; + const body = await c.req.json(); + const parsed = graphSchema.safeParse(body); + if (!parsed.success) { + recordTelemetry(c.env, apiKey, { + event_type: "validation_error", + error_code: "schema_failed", + duration_ms: Date.now() - start, + agent_user_agent: userAgent + }, c.executionCtx); + return c.json({ valid: false, errors: parsed.error.issues }, 400); + } + const nodeIds = new Set(parsed.data.nodes.map((n) => n.id)); + const invalidEdges = parsed.data.edges.filter((e) => !nodeIds.has(e.from) || !nodeIds.has(e.to)); + if (invalidEdges.length > 0) { + recordTelemetry(c.env, apiKey, { + event_type: "validation_error", + error_code: "edge_node_missing", + duration_ms: Date.now() - start, + agent_user_agent: userAgent + }, c.executionCtx); + return c.json({ + valid: false, + errors: invalidEdges.map((e) => `\u908A ${e.from} \u2192 ${e.to} \u6307\u5411\u4E0D\u5B58\u5728\u7684\u7BC0\u9EDE`) + }, 400); + } + return c.json({ valid: true, nodeCount: parsed.data.nodes.length, edgeCount: parsed.data.edges.length }); +}); + +// cypher-executor/src/routes/docs.ts +init_dist(); + +// cypher-executor/src/lib/openapi.ts +var OPENAPI_SPEC = { + openapi: "3.0.3", + info: { + title: "arcrun cypher-executor API", + description: "AI Workflow Execution Engine \u2014 \u900F\u904E\u4E09\u5143\u7D44 Triplet \u6216\u5716 Graph \u5B9A\u7FA9\u5DE5\u4F5C\u6D41\uFF0C\u7CFB\u7D71\u57F7\u884C\u4E26\u56DE\u50B3\u7D50\u679C", + version: "1.0.0", + contact: { + name: "arcrun", + url: "https://github.com/arcrun/arcrun" + } + }, + servers: [ + { url: "https://cypher.arcrun.dev", description: "arcrun.dev Hosted" }, + { url: "http://localhost:8787", description: "Local Development" } + ], + paths: { + "/": { + get: { + summary: "Health Check", + tags: ["Health"], + responses: { + "200": { + description: "Service is running", + content: { + "application/json": { + schema: { + type: "object", + properties: { + service: { type: "string" }, + version: { type: "string" }, + status: { type: "string" } + } + } + } + } + } + } + } + }, + "/cypher/search": { + post: { + summary: "\u641C\u5C0B\u5DE5\u4F5C\u6D41\u9700\u8981\u7684\u96F6\u4EF6", + tags: ["Cypher"], + description: "\u7528\u4E09\u5143\u7D44\u63CF\u8FF0\u5DE5\u4F5C\u6D41\uFF0C\u7CFB\u7D71\u89E3\u6790\u4E26\u5F9E Registry \u67E5\u8A62\u5C0D\u61C9\u96F6\u4EF6", + requestBody: { + required: true, + content: { + "application/json": { + schema: { + type: "object", + properties: { + triplets: { + type: "array", + items: { type: "string" }, + example: ["start >> \u5B8C\u6210\u5F8C >> get-data", "get-data >> \u5B8C\u6210\u5F8C >> done"], + description: '\u4E09\u5143\u7D44\u9663\u5217\uFF0C\u683C\u5F0F\uFF1A"FROM >> ACTION >> TO"' + }, + auto_publish: { + type: "boolean", + default: true, + description: "\u7F3A\u5931\u7684\u96F6\u4EF6\u662F\u5426\u81EA\u52D5\u7522\u751F\u767C\u4F48" + } + }, + required: ["triplets"] + } + } + } + }, + responses: { + "200": { + description: "\u96F6\u4EF6\u641C\u5C0B\u6210\u529F\uFF08\u542B\u7248\u672C\u865F\u548C\u6642\u6233\uFF0C\u9069\u5408 Markdown \u6587\u6A94\u8FFD\u8E64\uFF09", + content: { + "application/json": { + schema: { + type: "object", + properties: { + version: { type: "string", example: "search-v1-20260327-143022", description: "\u7248\u672C\u865F\uFF08endpoint-v{major}-{timestamp}\uFF09" }, + timestamp: { type: "string", format: "date-time", description: "ISO 8601 \u6642\u6233" }, + triplets: { type: "array", items: { type: "string" }, description: "\u56DE\u9001\u7684\u4E09\u5143\u7D44\u5217\u8868" }, + nodes: { type: "object", description: "\u641C\u5C0B\u5230\u7684\u96F6\u4EF6\u53CA\u5176\u72C0\u614B" }, + cypher: { type: "object", description: "\u5DE5\u4F5C\u6D41\u5716\uFF08null \u82E5\u6709\u7F3A\u5931\u96F6\u4EF6\uFF09" }, + missing: { type: "array", items: { type: "string" }, description: "\u7F3A\u5931\u96F6\u4EF6\u5217\u8868" }, + auto_published: { type: "object", description: "\u81EA\u52D5\u767C\u4F48\u7684\u96F6\u4EF6\uFF08\u82E5 auto_publish=true\uFF09" } + } + } + } + } + }, + "400": { description: "\u7121\u6CD5\u89E3\u6790\u4E09\u5143\u7D44" } + } + } + }, + "/cypher/execute": { + post: { + summary: "\u57F7\u884C\u5DE5\u4F5C\u6D41", + tags: ["Cypher"], + description: "\u76F4\u63A5\u57F7\u884C triplets\uFF0C\u56DE\u50B3\u5B8C\u6574\u57F7\u884C\u7D50\u679C\u3002\u652F\u63F4\u81EA\u52D5\u767C\u4F48\u7F3A\u5931\u96F6\u4EF6\u3002", + requestBody: { + required: true, + content: { + "application/json": { + schema: { + type: "object", + properties: { + triplets: { + type: "array", + items: { type: "string" }, + description: '\u4E09\u5143\u7D44\u9663\u5217\uFF0C\u683C\u5F0F\uFF1A"FROM >> ACTION >> TO"' + }, + context: { + type: "object", + description: "\u57F7\u884C\u4E0A\u4E0B\u6587\uFF0C\u50B3\u5165\u5404\u7BC0\u9EDE\u4F5C\u70BA\u521D\u59CB\u53C3\u6578" + }, + auto_publish: { + type: "boolean", + default: true, + description: "\u7F3A\u5931\u7684\u96F6\u4EF6\u662F\u5426\u81EA\u52D5\u7522\u751F\u81E8\u6642\u5BE6\u4F5C" + } + }, + required: ["triplets"] + } + } + } + }, + responses: { + "200": { + description: "\u57F7\u884C\u6210\u529F\uFF08\u542B\u7248\u672C\u865F\u548C\u6642\u6233\uFF09", + content: { + "application/json": { + schema: { + type: "object", + properties: { + version: { type: "string", example: "execute-v1-20260327-143022", description: "\u7248\u672C\u865F\uFF08endpoint-v{major}-{timestamp}\uFF09" }, + timestamp: { type: "string", format: "date-time", description: "ISO 8601 \u6642\u6233" }, + success: { type: "boolean", enum: [true] }, + data: { type: "object", description: "\u57F7\u884C\u7D50\u679C" }, + trace: { type: "array", description: "\u57F7\u884C\u8DDF\u8E64" }, + duration_ms: { type: "number" } + } + } + } + } + }, + "500": { + description: "\u57F7\u884C\u5931\u6557\u6216\u90E8\u4EFD\u96F6\u4EF6\u7F3A\u5931\uFF08\u542B\u7248\u672C\u865F\u548C\u6642\u6233\uFF09", + content: { + "application/json": { + schema: { + type: "object", + properties: { + version: { type: "string", example: "execute-v1-20260327-143022", description: "\u7248\u672C\u865F\uFF08endpoint-v{major}-{timestamp}\uFF09" }, + timestamp: { type: "string", format: "date-time", description: "ISO 8601 \u6642\u6233" }, + success: { type: "boolean", enum: [false] }, + error: { type: "string" }, + missing: { type: "array", items: { type: "string" }, description: "\u7121\u6CD5\u81EA\u52D5\u767C\u4F48\u7684\u7F3A\u5931\u96F6\u4EF6" }, + auto_published: { + type: "object", + description: "\u81EA\u52D5\u767C\u4F48\u7684\u96F6\u4EF6\u8CC7\u8A0A", + additionalProperties: { + type: "object", + properties: { + ok: { type: "boolean" }, + componentId: { type: "string" }, + temporary_endpoint: { type: "string", format: "uri", description: "\u81E8\u6642\u5BE6\u4F5C\u7684 URL" }, + implement_by: { type: "string", format: "date-time", description: "\u5BE6\u4F5C\u622A\u6B62\u6642\u9593" } + } + } + }, + duration_ms: { type: "number" } + } + } + } + } + } + } + } + }, + "/webhooks": { + post: { + summary: "\u5EFA\u7ACB Webhook", + tags: ["Webhooks"], + description: "\u5C07\u5DE5\u4F5C\u6D41\u8A3B\u518A\u6210 Webhook\uFF0C\u5F97\u5230\u516C\u958B URL", + requestBody: { + required: true, + content: { + "application/json": { + schema: { + type: "object", + properties: { + triplets: { + type: "array", + items: { type: "string" } + }, + description: { type: "string" } + } + } + } + } + }, + responses: { + "201": { + description: "Webhook \u5EFA\u7ACB\u6210\u529F", + content: { + "application/json": { + schema: { + type: "object", + properties: { + token: { type: "string" }, + webhook_url: { type: "string", format: "uri" }, + description: { type: "string" }, + created_at: { type: "string", format: "date-time" } + } + } + } + } + } + } + }, + get: { + summary: "\u5217\u51FA\u6240\u6709 Webhooks", + tags: ["Webhooks"], + parameters: [ + { + name: "Authorization", + in: "header", + required: true, + schema: { type: "string", example: "Bearer u6u_xxxxx" }, + description: "API Key \u8A8D\u8B49" + } + ], + responses: { + "200": { + description: "Webhooks \u5217\u8868", + content: { + "application/json": { + schema: { + type: "object", + properties: { + webhooks: { + type: "array", + items: { + type: "object", + properties: { + token: { type: "string" }, + description: { type: "string" }, + created_at: { type: "string", format: "date-time" } + } + } + }, + total: { type: "number" } + } + } + } + } + }, + "401": { description: "\u672A\u6388\u6B0A" } + } + } + }, + "/webhooks/{token}": { + get: { + summary: "\u67E5\u8A62\u55AE\u500B Webhook", + tags: ["Webhooks"], + parameters: [ + { + name: "token", + in: "path", + required: true, + schema: { type: "string" } + } + ], + responses: { + "200": { + description: "Webhook \u8CC7\u8A0A" + }, + "404": { description: "Webhook \u4E0D\u5B58\u5728" } + } + }, + delete: { + summary: "\u522A\u9664 Webhook", + tags: ["Webhooks"], + parameters: [ + { + name: "token", + in: "path", + required: true, + schema: { type: "string" } + } + ], + responses: { + "200": { description: "Webhook \u5DF2\u522A\u9664" }, + "404": { description: "Webhook \u4E0D\u5B58\u5728" } + } + } + } + }, + components: { + securitySchemes: { + ApiKeyAuth: { + type: "apiKey", + in: "header", + name: "Authorization" + } + } + } +}; + +// cypher-executor/src/routes/docs.ts +var docsRouter = new Hono2(); +docsRouter.get("/openapi.json", (c) => { + return c.json(OPENAPI_SPEC); +}); +docsRouter.get("/docs", (c) => { + const specStr = JSON.stringify(OPENAPI_SPEC); + const htmlStr = ` + + + Cypher Executor API Docs + + + + + + +
+