@pome-sh/cli 0.19.0 → 0.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -4
- package/dist/agent-Q2UTRJYL.js +408 -0
- package/dist/build-info.json +3 -3
- package/dist/checks-C63QWUOI.js +290 -0
- package/dist/chunk-2Q7AYEUA.js +1207 -0
- package/dist/chunk-APAS34RJ.js +6614 -0
- package/dist/chunk-BSKITCXD.js +116 -0
- package/dist/chunk-CBFKZZBR.js +96 -0
- package/dist/chunk-D3GRORLQ.js +1614 -0
- package/dist/chunk-GEAGPLZZ.js +57 -0
- package/dist/chunk-IY6G5NWT.js +330 -0
- package/dist/chunk-LZIPGCQJ.js +1512 -0
- package/dist/chunk-NW7HGA2K.js +1 -0
- package/dist/chunk-NY55QTVQ.js +120 -0
- package/dist/chunk-OHKJGCWS.js +186 -0
- package/dist/chunk-OKDJRKJV.js +4390 -0
- package/dist/chunk-PPJUFV6S.js +1179 -0
- package/dist/chunk-RGZBC7NF.js +90 -0
- package/dist/chunk-SG6ZTIMT.js +145 -0
- package/dist/chunk-VBATFCWR.js +442 -0
- package/dist/chunk-W5EJAOWD.js +462 -0
- package/dist/chunk-WVWV7DLA.js +6061 -0
- package/dist/chunk-XDU6TD4O.js +20 -0
- package/dist/chunk-ZX4WNSZ5.js +71 -0
- package/dist/egress-4V6DVJZ7.js +1 -0
- package/dist/install-A2PSSNW6.js +19 -0
- package/dist/render-ZQQ4UMNO.js +40 -0
- package/dist/run-CFA4LZWQ.js +203 -0
- package/dist/runDemo-VWKBJRSL.js +327 -0
- package/dist/runTrialGroup-NCD4Q2QU.js +277 -0
- package/dist/server-Y52EIWDP.js +3 -0
- package/dist/src/cli/main.js +5381 -1079
- package/dist/src-4SVLX7UK.js +4398 -0
- package/dist/src-GGRWNJTK.js +2869 -0
- package/dist/src-JGOW5WYI.js +5 -0
- package/dist/src-KIHABGI5.js +5 -0
- package/dist/src-TUX5L2RC.js +4 -0
- package/dist/twinHarness-IZC72UQN.js +5 -0
- package/dist/twinStart-S2CCEZWQ.js +111 -0
- package/package.json +29 -39
- package/dist/examples/agents/llm-refund-agent.d.ts +0 -1
- package/dist/examples/agents/llm-refund-agent.js +0 -140
- package/dist/examples/agents/llm-triage-agent.d.ts +0 -1
- package/dist/examples/agents/llm-triage-agent.js +0 -136
- package/dist/examples/agents/mcp-loop-agent.d.ts +0 -1
- package/dist/examples/agents/mcp-loop-agent.js +0 -61
- package/dist/examples/agents/scripted-pr-reviewer-agent.d.ts +0 -1
- package/dist/examples/agents/scripted-pr-reviewer-agent.js +0 -77
- package/dist/examples/agents/scripted-triage-agent.d.ts +0 -1
- package/dist/examples/agents/scripted-triage-agent.js +0 -92
- package/dist/src/capture-server/egress.d.ts +0 -19
- package/dist/src/capture-server/egress.js +0 -152
- package/dist/src/capture-server/index.d.ts +0 -12
- package/dist/src/capture-server/index.js +0 -198
- package/dist/src/capture-server/run.d.ts +0 -7
- package/dist/src/capture-server/run.js +0 -26
- package/dist/src/cli/agent-identity.d.ts +0 -20
- package/dist/src/cli/agent-identity.js +0 -64
- package/dist/src/cli/agent-resolver.d.ts +0 -29
- package/dist/src/cli/agent-resolver.js +0 -131
- package/dist/src/cli/checks-add.d.ts +0 -27
- package/dist/src/cli/checks-add.js +0 -238
- package/dist/src/cli/checks-lint.d.ts +0 -1
- package/dist/src/cli/checks-lint.js +0 -59
- package/dist/src/cli/checks.d.ts +0 -36
- package/dist/src/cli/checks.js +0 -197
- package/dist/src/cli/compile-seeds.d.ts +0 -7
- package/dist/src/cli/compile-seeds.js +0 -260
- package/dist/src/cli/credentials.d.ts +0 -32
- package/dist/src/cli/credentials.js +0 -121
- package/dist/src/cli/criterion-binding.d.ts +0 -41
- package/dist/src/cli/criterion-binding.js +0 -111
- package/dist/src/cli/default-task.d.ts +0 -38
- package/dist/src/cli/default-task.js +0 -141
- package/dist/src/cli/defaults.d.ts +0 -4
- package/dist/src/cli/defaults.js +0 -5
- package/dist/src/cli/docs-topics.d.ts +0 -13
- package/dist/src/cli/docs-topics.js +0 -157
- package/dist/src/cli/docs.d.ts +0 -7
- package/dist/src/cli/docs.js +0 -178
- package/dist/src/cli/eval.d.ts +0 -83
- package/dist/src/cli/eval.js +0 -443
- package/dist/src/cli/frameworks.d.ts +0 -12
- package/dist/src/cli/frameworks.js +0 -62
- package/dist/src/cli/init-sdk.d.ts +0 -12
- package/dist/src/cli/init-sdk.js +0 -140
- package/dist/src/cli/install.d.ts +0 -4
- package/dist/src/cli/install.js +0 -36
- package/dist/src/cli/keychain.d.ts +0 -5
- package/dist/src/cli/keychain.js +0 -80
- package/dist/src/cli/link-cache.d.ts +0 -23
- package/dist/src/cli/link-cache.js +0 -91
- package/dist/src/cli/login.d.ts +0 -6
- package/dist/src/cli/login.js +0 -195
- package/dist/src/cli/main.d.ts +0 -3
- package/dist/src/cli/project-config.d.ts +0 -37
- package/dist/src/cli/project-config.js +0 -145
- package/dist/src/cli/register.d.ts +0 -33
- package/dist/src/cli/register.js +0 -194
- package/dist/src/cli/resolve-package-root.d.ts +0 -2
- package/dist/src/cli/resolve-package-root.js +0 -20
- package/dist/src/cli/session.d.ts +0 -35
- package/dist/src/cli/session.js +0 -294
- package/dist/src/cli/tasks-catalog.d.ts +0 -25
- package/dist/src/cli/tasks-catalog.js +0 -196
- package/dist/src/cli/tasks.d.ts +0 -13
- package/dist/src/cli/tasks.js +0 -144
- package/dist/src/cli/vocabulary-skew.d.ts +0 -64
- package/dist/src/cli/vocabulary-skew.js +0 -187
- package/dist/src/demo/agent.d.ts +0 -30
- package/dist/src/demo/agent.js +0 -231
- package/dist/src/demo/capacity.d.ts +0 -18
- package/dist/src/demo/capacity.js +0 -94
- package/dist/src/demo/gateway.d.ts +0 -66
- package/dist/src/demo/gateway.js +0 -76
- package/dist/src/demo/ids.d.ts +0 -4
- package/dist/src/demo/ids.js +0 -28
- package/dist/src/demo/mint.d.ts +0 -17
- package/dist/src/demo/mint.js +0 -78
- package/dist/src/demo/proxyRequest.d.ts +0 -21
- package/dist/src/demo/proxyRequest.js +0 -156
- package/dist/src/demo/render.d.ts +0 -32
- package/dist/src/demo/render.js +0 -96
- package/dist/src/demo/runDemo.d.ts +0 -33
- package/dist/src/demo/runDemo.js +0 -314
- package/dist/src/demo/task.d.ts +0 -10
- package/dist/src/demo/task.js +0 -32
- package/dist/src/doctor/checks.d.ts +0 -19
- package/dist/src/doctor/checks.js +0 -208
- package/dist/src/doctor/render.d.ts +0 -17
- package/dist/src/doctor/render.js +0 -39
- package/dist/src/doctor/scan.d.ts +0 -16
- package/dist/src/doctor/scan.js +0 -127
- package/dist/src/fix-prompt/index.d.ts +0 -20
- package/dist/src/fix-prompt/index.js +0 -31
- package/dist/src/fix-prompt/prompt.d.ts +0 -32
- package/dist/src/fix-prompt/prompt.js +0 -240
- package/dist/src/hosted/client.d.ts +0 -209
- package/dist/src/hosted/client.js +0 -722
- package/dist/src/hosted/errors.d.ts +0 -60
- package/dist/src/hosted/errors.js +0 -120
- package/dist/src/hosted/evalResultCache.d.ts +0 -71
- package/dist/src/hosted/evalResultCache.js +0 -219
- package/dist/src/hosted/evalResultView.d.ts +0 -40
- package/dist/src/hosted/evalResultView.js +0 -103
- package/dist/src/hosted/uploadAndFinalize.d.ts +0 -85
- package/dist/src/hosted/uploadAndFinalize.js +0 -238
- package/dist/src/recorder/artifacts.d.ts +0 -34
- package/dist/src/recorder/artifacts.js +0 -153
- package/dist/src/recorder/inspect.d.ts +0 -37
- package/dist/src/recorder/inspect.js +0 -195
- package/dist/src/recorder/recorder.d.ts +0 -14
- package/dist/src/recorder/recorder.js +0 -16
- package/dist/src/recorder/redaction.d.ts +0 -1
- package/dist/src/recorder/redaction.js +0 -2
- package/dist/src/recorder/specMeta.d.ts +0 -8
- package/dist/src/recorder/specMeta.js +0 -79
- package/dist/src/runner/agentRunner.d.ts +0 -12
- package/dist/src/runner/agentRunner.js +0 -163
- package/dist/src/runner/captureServerChild.d.ts +0 -16
- package/dist/src/runner/captureServerChild.js +0 -148
- package/dist/src/runner/groupRender.d.ts +0 -65
- package/dist/src/runner/groupRender.js +0 -144
- package/dist/src/runner/mergeAdapterSignals.d.ts +0 -27
- package/dist/src/runner/mergeAdapterSignals.js +0 -137
- package/dist/src/runner/ports.d.ts +0 -1
- package/dist/src/runner/ports.js +0 -21
- package/dist/src/runner/runTask.d.ts +0 -831
- package/dist/src/runner/runTask.js +0 -275
- package/dist/src/runner/runTaskCore.d.ts +0 -21
- package/dist/src/runner/runTaskCore.js +0 -26
- package/dist/src/runner/runTaskHosted.d.ts +0 -97
- package/dist/src/runner/runTaskHosted.js +0 -660
- package/dist/src/runner/runTrialGroup.d.ts +0 -49
- package/dist/src/runner/runTrialGroup.js +0 -264
- package/dist/src/runner/trialCount.d.ts +0 -8
- package/dist/src/runner/trialCount.js +0 -32
- package/dist/src/scaffolds/mcp-loop/loop.d.ts +0 -47
- package/dist/src/scaffolds/mcp-loop/loop.js +0 -331
- package/dist/src/scaffolds/mcp-loop/providers.d.ts +0 -29
- package/dist/src/scaffolds/mcp-loop/providers.js +0 -142
- package/dist/src/task/githubSeedCompat.d.ts +0 -3
- package/dist/src/task/githubSeedCompat.js +0 -48
- package/dist/src/task/insertCriterion.d.ts +0 -15
- package/dist/src/task/insertCriterion.js +0 -67
- package/dist/src/task/parseTask.d.ts +0 -35
- package/dist/src/task/parseTask.js +0 -398
- package/dist/src/task/seed-compiler-hosted.d.ts +0 -8
- package/dist/src/task/seed-compiler-hosted.js +0 -122
- package/dist/src/task/seed-compiler.d.ts +0 -11
- package/dist/src/task/seed-compiler.js +0 -61
- package/dist/src/task/seed-verifier.d.ts +0 -1
- package/dist/src/task/seed-verifier.js +0 -23
- package/dist/src/task/taskSchema.d.ts +0 -1978
- package/dist/src/task/taskSchema.js +0 -106
- package/dist/src/twin/githubCloneAdapter.d.ts +0 -70
- package/dist/src/twin/githubCloneAdapter.js +0 -19
- package/dist/src/twin/twinHarness.d.ts +0 -52
- package/dist/src/twin/twinHarness.js +0 -186
- package/dist/src/twin/twinStart.d.ts +0 -21
- package/dist/src/twin/twinStart.js +0 -174
- package/dist/src/types/shared.d.ts +0 -1
- package/dist/src/types/shared.js +0 -2
- package/node_modules/@hono/node-server/LICENSE +0 -21
- package/node_modules/@hono/node-server/README.md +0 -391
- package/node_modules/@hono/node-server/dist/conninfo.cjs +0 -22
- package/node_modules/@hono/node-server/dist/conninfo.d.cts +0 -11
- package/node_modules/@hono/node-server/dist/conninfo.d.mts +0 -11
- package/node_modules/@hono/node-server/dist/conninfo.mjs +0 -20
- package/node_modules/@hono/node-server/dist/constants-BLSFu_RU.mjs +0 -5
- package/node_modules/@hono/node-server/dist/constants-BXAKTxRC.cjs +0 -11
- package/node_modules/@hono/node-server/dist/index.cjs +0 -1172
- package/node_modules/@hono/node-server/dist/index.d.cts +0 -101
- package/node_modules/@hono/node-server/dist/index.d.mts +0 -101
- package/node_modules/@hono/node-server/dist/index.mjs +0 -1167
- package/node_modules/@hono/node-server/dist/serve-static.cjs +0 -151
- package/node_modules/@hono/node-server/dist/serve-static.d.cts +0 -18
- package/node_modules/@hono/node-server/dist/serve-static.d.mts +0 -18
- package/node_modules/@hono/node-server/dist/serve-static.mjs +0 -150
- package/node_modules/@hono/node-server/dist/utils/response.cjs +0 -8
- package/node_modules/@hono/node-server/dist/utils/response.d.cts +0 -4
- package/node_modules/@hono/node-server/dist/utils/response.d.mts +0 -4
- package/node_modules/@hono/node-server/dist/utils/response.mjs +0 -7
- package/node_modules/@hono/node-server/dist/utils/stream.cjs +0 -65
- package/node_modules/@hono/node-server/dist/utils/stream.d.cts +0 -6
- package/node_modules/@hono/node-server/dist/utils/stream.d.mts +0 -6
- package/node_modules/@hono/node-server/dist/utils/stream.mjs +0 -64
- package/node_modules/@hono/node-server/package.json +0 -116
- package/node_modules/@pome-sh/sdk/dist/admin-gate.d.ts +0 -35
- package/node_modules/@pome-sh/sdk/dist/admin-gate.js +0 -103
- package/node_modules/@pome-sh/sdk/dist/admin-gate.js.map +0 -1
- package/node_modules/@pome-sh/sdk/dist/auth.d.ts +0 -100
- package/node_modules/@pome-sh/sdk/dist/auth.js +0 -262
- package/node_modules/@pome-sh/sdk/dist/auth.js.map +0 -1
- package/node_modules/@pome-sh/sdk/dist/build-info.d.ts +0 -7
- package/node_modules/@pome-sh/sdk/dist/build-info.js +0 -14
- package/node_modules/@pome-sh/sdk/dist/build-info.js.map +0 -1
- package/node_modules/@pome-sh/sdk/dist/check-discrimination.d.ts +0 -7
- package/node_modules/@pome-sh/sdk/dist/check-discrimination.js +0 -81
- package/node_modules/@pome-sh/sdk/dist/check-discrimination.js.map +0 -1
- package/node_modules/@pome-sh/sdk/dist/check-state-path.d.ts +0 -71
- package/node_modules/@pome-sh/sdk/dist/check-state-path.js +0 -200
- package/node_modules/@pome-sh/sdk/dist/check-state-path.js.map +0 -1
- package/node_modules/@pome-sh/sdk/dist/checks.d.ts +0 -93
- package/node_modules/@pome-sh/sdk/dist/checks.js +0 -218
- package/node_modules/@pome-sh/sdk/dist/checks.js.map +0 -1
- package/node_modules/@pome-sh/sdk/dist/db.d.ts +0 -44
- package/node_modules/@pome-sh/sdk/dist/db.js +0 -113
- package/node_modules/@pome-sh/sdk/dist/db.js.map +0 -1
- package/node_modules/@pome-sh/sdk/dist/errors.d.ts +0 -24
- package/node_modules/@pome-sh/sdk/dist/errors.js +0 -61
- package/node_modules/@pome-sh/sdk/dist/errors.js.map +0 -1
- package/node_modules/@pome-sh/sdk/dist/failure-injection.d.ts +0 -43
- package/node_modules/@pome-sh/sdk/dist/failure-injection.js +0 -167
- package/node_modules/@pome-sh/sdk/dist/failure-injection.js.map +0 -1
- package/node_modules/@pome-sh/sdk/dist/fidelity-inventory.d.ts +0 -121
- package/node_modules/@pome-sh/sdk/dist/fidelity-inventory.js +0 -204
- package/node_modules/@pome-sh/sdk/dist/fidelity-inventory.js.map +0 -1
- package/node_modules/@pome-sh/sdk/dist/fidelity.d.ts +0 -8
- package/node_modules/@pome-sh/sdk/dist/fidelity.js +0 -39
- package/node_modules/@pome-sh/sdk/dist/fidelity.js.map +0 -1
- package/node_modules/@pome-sh/sdk/dist/index.d.ts +0 -380
- package/node_modules/@pome-sh/sdk/dist/index.js +0 -140
- package/node_modules/@pome-sh/sdk/dist/index.js.map +0 -1
- package/node_modules/@pome-sh/sdk/dist/mcp-jsonrpc.d.ts +0 -10
- package/node_modules/@pome-sh/sdk/dist/mcp-jsonrpc.js +0 -231
- package/node_modules/@pome-sh/sdk/dist/mcp-jsonrpc.js.map +0 -1
- package/node_modules/@pome-sh/sdk/dist/parity.d.ts +0 -61
- package/node_modules/@pome-sh/sdk/dist/parity.js +0 -123
- package/node_modules/@pome-sh/sdk/dist/parity.js.map +0 -1
- package/node_modules/@pome-sh/sdk/dist/recorder.d.ts +0 -129
- package/node_modules/@pome-sh/sdk/dist/recorder.js +0 -381
- package/node_modules/@pome-sh/sdk/dist/recorder.js.map +0 -1
- package/node_modules/@pome-sh/sdk/dist/redaction.d.ts +0 -1
- package/node_modules/@pome-sh/sdk/dist/redaction.js +0 -3
- package/node_modules/@pome-sh/sdk/dist/redaction.js.map +0 -1
- package/node_modules/@pome-sh/sdk/dist/request-capture.d.ts +0 -31
- package/node_modules/@pome-sh/sdk/dist/request-capture.js +0 -59
- package/node_modules/@pome-sh/sdk/dist/request-capture.js.map +0 -1
- package/node_modules/@pome-sh/sdk/dist/server-helpers.d.ts +0 -54
- package/node_modules/@pome-sh/sdk/dist/server-helpers.js +0 -181
- package/node_modules/@pome-sh/sdk/dist/server-helpers.js.map +0 -1
- package/node_modules/@pome-sh/sdk/dist/server.d.ts +0 -47
- package/node_modules/@pome-sh/sdk/dist/server.js +0 -407
- package/node_modules/@pome-sh/sdk/dist/server.js.map +0 -1
- package/node_modules/@pome-sh/sdk/dist/tool-context.d.ts +0 -8
- package/node_modules/@pome-sh/sdk/dist/tool-context.js +0 -22
- package/node_modules/@pome-sh/sdk/dist/tool-context.js.map +0 -1
- package/node_modules/@pome-sh/sdk/package.json +0 -58
- package/node_modules/@pome-sh/shared-types/dist/errors.d.ts +0 -39
- package/node_modules/@pome-sh/shared-types/dist/errors.js +0 -33
- package/node_modules/@pome-sh/shared-types/dist/errors.js.map +0 -1
- package/node_modules/@pome-sh/shared-types/dist/finalize-shapes.d.ts +0 -254
- package/node_modules/@pome-sh/shared-types/dist/finalize-shapes.js +0 -122
- package/node_modules/@pome-sh/shared-types/dist/finalize-shapes.js.map +0 -1
- package/node_modules/@pome-sh/shared-types/dist/github-access-control.d.ts +0 -175
- package/node_modules/@pome-sh/shared-types/dist/github-access-control.js +0 -182
- package/node_modules/@pome-sh/shared-types/dist/github-access-control.js.map +0 -1
- package/node_modules/@pome-sh/shared-types/dist/identity.d.ts +0 -90
- package/node_modules/@pome-sh/shared-types/dist/identity.js +0 -72
- package/node_modules/@pome-sh/shared-types/dist/identity.js.map +0 -1
- package/node_modules/@pome-sh/shared-types/dist/index.d.ts +0 -28
- package/node_modules/@pome-sh/shared-types/dist/index.js +0 -35
- package/node_modules/@pome-sh/shared-types/dist/index.js.map +0 -1
- package/node_modules/@pome-sh/shared-types/dist/manifest.d.ts +0 -31
- package/node_modules/@pome-sh/shared-types/dist/manifest.js +0 -76
- package/node_modules/@pome-sh/shared-types/dist/manifest.js.map +0 -1
- package/node_modules/@pome-sh/shared-types/dist/otel/event-schema.d.ts +0 -424
- package/node_modules/@pome-sh/shared-types/dist/otel/event-schema.js +0 -33
- package/node_modules/@pome-sh/shared-types/dist/otel/event-schema.js.map +0 -1
- package/node_modules/@pome-sh/shared-types/dist/otel/fixtures/data.d.ts +0 -65
- package/node_modules/@pome-sh/shared-types/dist/otel/fixtures/data.js +0 -455
- package/node_modules/@pome-sh/shared-types/dist/otel/fixtures/data.js.map +0 -1
- package/node_modules/@pome-sh/shared-types/dist/otel/fixtures/index.d.ts +0 -39
- package/node_modules/@pome-sh/shared-types/dist/otel/fixtures/index.js +0 -47
- package/node_modules/@pome-sh/shared-types/dist/otel/fixtures/index.js.map +0 -1
- package/node_modules/@pome-sh/shared-types/dist/otel/index.d.ts +0 -25
- package/node_modules/@pome-sh/shared-types/dist/otel/index.js +0 -27
- package/node_modules/@pome-sh/shared-types/dist/otel/index.js.map +0 -1
- package/node_modules/@pome-sh/shared-types/dist/otel/legacy-shim.d.ts +0 -105
- package/node_modules/@pome-sh/shared-types/dist/otel/legacy-shim.js +0 -198
- package/node_modules/@pome-sh/shared-types/dist/otel/legacy-shim.js.map +0 -1
- package/node_modules/@pome-sh/shared-types/dist/otel/map-span.d.ts +0 -64
- package/node_modules/@pome-sh/shared-types/dist/otel/map-span.js +0 -112
- package/node_modules/@pome-sh/shared-types/dist/otel/map-span.js.map +0 -1
- package/node_modules/@pome-sh/shared-types/dist/otel/nano.d.ts +0 -26
- package/node_modules/@pome-sh/shared-types/dist/otel/nano.js +0 -61
- package/node_modules/@pome-sh/shared-types/dist/otel/nano.js.map +0 -1
- package/node_modules/@pome-sh/shared-types/dist/otel/project.d.ts +0 -42
- package/node_modules/@pome-sh/shared-types/dist/otel/project.js +0 -104
- package/node_modules/@pome-sh/shared-types/dist/otel/project.js.map +0 -1
- package/node_modules/@pome-sh/shared-types/dist/otel/semconv.d.ts +0 -57
- package/node_modules/@pome-sh/shared-types/dist/otel/semconv.js +0 -102
- package/node_modules/@pome-sh/shared-types/dist/otel/semconv.js.map +0 -1
- package/node_modules/@pome-sh/shared-types/dist/otel/span-event.d.ts +0 -198
- package/node_modules/@pome-sh/shared-types/dist/otel/span-event.js +0 -166
- package/node_modules/@pome-sh/shared-types/dist/otel/span-event.js.map +0 -1
- package/node_modules/@pome-sh/shared-types/dist/recorder-events.d.ts +0 -526
- package/node_modules/@pome-sh/shared-types/dist/recorder-events.js +0 -381
- package/node_modules/@pome-sh/shared-types/dist/recorder-events.js.map +0 -1
- package/node_modules/@pome-sh/shared-types/dist/redaction.d.ts +0 -2
- package/node_modules/@pome-sh/shared-types/dist/redaction.js +0 -152
- package/node_modules/@pome-sh/shared-types/dist/redaction.js.map +0 -1
- package/node_modules/@pome-sh/shared-types/dist/rest.d.ts +0 -259
- package/node_modules/@pome-sh/shared-types/dist/rest.js +0 -346
- package/node_modules/@pome-sh/shared-types/dist/rest.js.map +0 -1
- package/node_modules/@pome-sh/shared-types/dist/run.d.ts +0 -208
- package/node_modules/@pome-sh/shared-types/dist/run.js +0 -170
- package/node_modules/@pome-sh/shared-types/dist/run.js.map +0 -1
- package/node_modules/@pome-sh/shared-types/dist/seed-envelope.d.ts +0 -14
- package/node_modules/@pome-sh/shared-types/dist/seed-envelope.js +0 -46
- package/node_modules/@pome-sh/shared-types/dist/seed-envelope.js.map +0 -1
- package/node_modules/@pome-sh/shared-types/dist/seed-state.d.ts +0 -1506
- package/node_modules/@pome-sh/shared-types/dist/seed-state.js +0 -462
- package/node_modules/@pome-sh/shared-types/dist/seed-state.js.map +0 -1
- package/node_modules/@pome-sh/shared-types/dist/sessions.d.ts +0 -53
- package/node_modules/@pome-sh/shared-types/dist/sessions.js +0 -51
- package/node_modules/@pome-sh/shared-types/dist/sessions.js.map +0 -1
- package/node_modules/@pome-sh/shared-types/dist/task-vocab.d.ts +0 -80
- package/node_modules/@pome-sh/shared-types/dist/task-vocab.js +0 -98
- package/node_modules/@pome-sh/shared-types/dist/task-vocab.js.map +0 -1
- package/node_modules/@pome-sh/shared-types/dist/task.d.ts +0 -1193
- package/node_modules/@pome-sh/shared-types/dist/task.js +0 -60
- package/node_modules/@pome-sh/shared-types/dist/task.js.map +0 -1
- package/node_modules/@pome-sh/shared-types/manifest-schema.json +0 -68
- package/node_modules/@pome-sh/shared-types/package.json +0 -55
- package/node_modules/@pome-sh/shared-types/trace-contract.json +0 -89
- package/node_modules/@pome-sh/twin-github/FIDELITY.md +0 -395
- package/node_modules/@pome-sh/twin-github/README.md +0 -254
- package/node_modules/@pome-sh/twin-github/dist/examples/claude-github-agent.d.ts +0 -1
- package/node_modules/@pome-sh/twin-github/dist/examples/claude-github-agent.js +0 -222
- package/node_modules/@pome-sh/twin-github/dist/examples/claude-github-agent.js.map +0 -1
- package/node_modules/@pome-sh/twin-github/dist/examples/mcp-node.d.ts +0 -1
- package/node_modules/@pome-sh/twin-github/dist/examples/mcp-node.js +0 -15
- package/node_modules/@pome-sh/twin-github/dist/examples/mcp-node.js.map +0 -1
- package/node_modules/@pome-sh/twin-github/dist/examples/mini-bot-flow.d.ts +0 -1
- package/node_modules/@pome-sh/twin-github/dist/examples/mini-bot-flow.js +0 -39
- package/node_modules/@pome-sh/twin-github/dist/examples/mini-bot-flow.js.map +0 -1
- package/node_modules/@pome-sh/twin-github/dist/src/access-control.d.ts +0 -32
- package/node_modules/@pome-sh/twin-github/dist/src/access-control.js +0 -20
- package/node_modules/@pome-sh/twin-github/dist/src/access-control.js.map +0 -1
- package/node_modules/@pome-sh/twin-github/dist/src/check-issues.d.ts +0 -30
- package/node_modules/@pome-sh/twin-github/dist/src/check-issues.js +0 -268
- package/node_modules/@pome-sh/twin-github/dist/src/check-issues.js.map +0 -1
- package/node_modules/@pome-sh/twin-github/dist/src/check-kind.d.ts +0 -3
- package/node_modules/@pome-sh/twin-github/dist/src/check-kind.js +0 -10
- package/node_modules/@pome-sh/twin-github/dist/src/check-kind.js.map +0 -1
- package/node_modules/@pome-sh/twin-github/dist/src/check-params.d.ts +0 -13
- package/node_modules/@pome-sh/twin-github/dist/src/check-params.js +0 -116
- package/node_modules/@pome-sh/twin-github/dist/src/check-params.js.map +0 -1
- package/node_modules/@pome-sh/twin-github/dist/src/check-pulls.d.ts +0 -15
- package/node_modules/@pome-sh/twin-github/dist/src/check-pulls.js +0 -237
- package/node_modules/@pome-sh/twin-github/dist/src/check-pulls.js.map +0 -1
- package/node_modules/@pome-sh/twin-github/dist/src/check-repos.d.ts +0 -13
- package/node_modules/@pome-sh/twin-github/dist/src/check-repos.js +0 -171
- package/node_modules/@pome-sh/twin-github/dist/src/check-repos.js.map +0 -1
- package/node_modules/@pome-sh/twin-github/dist/src/check-state.d.ts +0 -76
- package/node_modules/@pome-sh/twin-github/dist/src/check-state.js +0 -132
- package/node_modules/@pome-sh/twin-github/dist/src/check-state.js.map +0 -1
- package/node_modules/@pome-sh/twin-github/dist/src/check-tape.d.ts +0 -5
- package/node_modules/@pome-sh/twin-github/dist/src/check-tape.js +0 -182
- package/node_modules/@pome-sh/twin-github/dist/src/check-tape.js.map +0 -1
- package/node_modules/@pome-sh/twin-github/dist/src/check-worlds.d.ts +0 -13
- package/node_modules/@pome-sh/twin-github/dist/src/check-worlds.js +0 -33
- package/node_modules/@pome-sh/twin-github/dist/src/check-worlds.js.map +0 -1
- package/node_modules/@pome-sh/twin-github/dist/src/checks.d.ts +0 -48
- package/node_modules/@pome-sh/twin-github/dist/src/checks.js +0 -75
- package/node_modules/@pome-sh/twin-github/dist/src/checks.js.map +0 -1
- package/node_modules/@pome-sh/twin-github/dist/src/db.d.ts +0 -4
- package/node_modules/@pome-sh/twin-github/dist/src/db.js +0 -443
- package/node_modules/@pome-sh/twin-github/dist/src/db.js.map +0 -1
- package/node_modules/@pome-sh/twin-github/dist/src/domain/checks.d.ts +0 -153
- package/node_modules/@pome-sh/twin-github/dist/src/domain/checks.js +0 -66
- package/node_modules/@pome-sh/twin-github/dist/src/domain/checks.js.map +0 -1
- package/node_modules/@pome-sh/twin-github/dist/src/domain/git.d.ts +0 -567
- package/node_modules/@pome-sh/twin-github/dist/src/domain/git.js +0 -198
- package/node_modules/@pome-sh/twin-github/dist/src/domain/git.js.map +0 -1
- package/node_modules/@pome-sh/twin-github/dist/src/domain/github-domain.d.ts +0 -3106
- package/node_modules/@pome-sh/twin-github/dist/src/domain/github-domain.js +0 -842
- package/node_modules/@pome-sh/twin-github/dist/src/domain/github-domain.js.map +0 -1
- package/node_modules/@pome-sh/twin-github/dist/src/domain/helpers.d.ts +0 -5
- package/node_modules/@pome-sh/twin-github/dist/src/domain/helpers.js +0 -15
- package/node_modules/@pome-sh/twin-github/dist/src/domain/helpers.js.map +0 -1
- package/node_modules/@pome-sh/twin-github/dist/src/domain/index.d.ts +0 -2
- package/node_modules/@pome-sh/twin-github/dist/src/domain/index.js +0 -5
- package/node_modules/@pome-sh/twin-github/dist/src/domain/index.js.map +0 -1
- package/node_modules/@pome-sh/twin-github/dist/src/domain/issues.d.ts +0 -545
- package/node_modules/@pome-sh/twin-github/dist/src/domain/issues.js +0 -282
- package/node_modules/@pome-sh/twin-github/dist/src/domain/issues.js.map +0 -1
- package/node_modules/@pome-sh/twin-github/dist/src/domain/pulls.d.ts +0 -816
- package/node_modules/@pome-sh/twin-github/dist/src/domain/pulls.js +0 -256
- package/node_modules/@pome-sh/twin-github/dist/src/domain/pulls.js.map +0 -1
- package/node_modules/@pome-sh/twin-github/dist/src/domain/releases.d.ts +0 -160
- package/node_modules/@pome-sh/twin-github/dist/src/domain/releases.js +0 -63
- package/node_modules/@pome-sh/twin-github/dist/src/domain/releases.js.map +0 -1
- package/node_modules/@pome-sh/twin-github/dist/src/domain/repos.d.ts +0 -219
- package/node_modules/@pome-sh/twin-github/dist/src/domain/repos.js +0 -131
- package/node_modules/@pome-sh/twin-github/dist/src/domain/repos.js.map +0 -1
- package/node_modules/@pome-sh/twin-github/dist/src/domain/search.d.ts +0 -252
- package/node_modules/@pome-sh/twin-github/dist/src/domain/search.js +0 -83
- package/node_modules/@pome-sh/twin-github/dist/src/domain/search.js.map +0 -1
- package/node_modules/@pome-sh/twin-github/dist/src/domain/types.d.ts +0 -15
- package/node_modules/@pome-sh/twin-github/dist/src/domain/types.js +0 -2
- package/node_modules/@pome-sh/twin-github/dist/src/domain/types.js.map +0 -1
- package/node_modules/@pome-sh/twin-github/dist/src/errors.d.ts +0 -14
- package/node_modules/@pome-sh/twin-github/dist/src/errors.js +0 -35
- package/node_modules/@pome-sh/twin-github/dist/src/errors.js.map +0 -1
- package/node_modules/@pome-sh/twin-github/dist/src/index.d.ts +0 -9
- package/node_modules/@pome-sh/twin-github/dist/src/index.js +0 -7
- package/node_modules/@pome-sh/twin-github/dist/src/index.js.map +0 -1
- package/node_modules/@pome-sh/twin-github/dist/src/routes.d.ts +0 -4
- package/node_modules/@pome-sh/twin-github/dist/src/routes.js +0 -372
- package/node_modules/@pome-sh/twin-github/dist/src/routes.js.map +0 -1
- package/node_modules/@pome-sh/twin-github/dist/src/seed.d.ts +0 -84
- package/node_modules/@pome-sh/twin-github/dist/src/seed.js +0 -170
- package/node_modules/@pome-sh/twin-github/dist/src/seed.js.map +0 -1
- package/node_modules/@pome-sh/twin-github/dist/src/serializers.d.ts +0 -926
- package/node_modules/@pome-sh/twin-github/dist/src/serializers.js +0 -685
- package/node_modules/@pome-sh/twin-github/dist/src/serializers.js.map +0 -1
- package/node_modules/@pome-sh/twin-github/dist/src/server.d.ts +0 -2
- package/node_modules/@pome-sh/twin-github/dist/src/server.js +0 -43
- package/node_modules/@pome-sh/twin-github/dist/src/server.js.map +0 -1
- package/node_modules/@pome-sh/twin-github/dist/src/tools.d.ts +0 -2815
- package/node_modules/@pome-sh/twin-github/dist/src/tools.js +0 -621
- package/node_modules/@pome-sh/twin-github/dist/src/tools.js.map +0 -1
- package/node_modules/@pome-sh/twin-github/dist/src/twin.d.ts +0 -15
- package/node_modules/@pome-sh/twin-github/dist/src/twin.js +0 -193
- package/node_modules/@pome-sh/twin-github/dist/src/twin.js.map +0 -1
- package/node_modules/@pome-sh/twin-github/dist/src/types.d.ts +0 -244
- package/node_modules/@pome-sh/twin-github/dist/src/types.js +0 -2
- package/node_modules/@pome-sh/twin-github/dist/src/types.js.map +0 -1
- package/node_modules/@pome-sh/twin-github/dist/src/unsupported-envelope.d.ts +0 -10
- package/node_modules/@pome-sh/twin-github/dist/src/unsupported-envelope.js +0 -27
- package/node_modules/@pome-sh/twin-github/dist/src/unsupported-envelope.js.map +0 -1
- package/node_modules/@pome-sh/twin-github/dist/src/upstream-types.d.ts +0 -30
- package/node_modules/@pome-sh/twin-github/dist/src/upstream-types.js +0 -2
- package/node_modules/@pome-sh/twin-github/dist/src/upstream-types.js.map +0 -1
- package/node_modules/@pome-sh/twin-github/dist/src/util.d.ts +0 -12
- package/node_modules/@pome-sh/twin-github/dist/src/util.js +0 -63
- package/node_modules/@pome-sh/twin-github/dist/src/util.js.map +0 -1
- package/node_modules/@pome-sh/twin-github/fidelity.inventory.json +0 -773
- package/node_modules/@pome-sh/twin-github/package.json +0 -63
- package/node_modules/@pome-sh/twin-gmail/CHANGELOG.md +0 -119
- package/node_modules/@pome-sh/twin-gmail/HOSTED.md +0 -45
- package/node_modules/@pome-sh/twin-gmail/LIMITS.md +0 -51
- package/node_modules/@pome-sh/twin-gmail/README.md +0 -150
- package/node_modules/@pome-sh/twin-gmail/REFERENCE-DIVERGENCES.md +0 -42
- package/node_modules/@pome-sh/twin-gmail/dist/fixtures/mcp-tools-list.canonical.json +0 -1209
- package/node_modules/@pome-sh/twin-gmail/dist/src/check-drafts.d.ts +0 -7
- package/node_modules/@pome-sh/twin-gmail/dist/src/check-drafts.js +0 -153
- package/node_modules/@pome-sh/twin-gmail/dist/src/check-drafts.js.map +0 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/check-kind.d.ts +0 -3
- package/node_modules/@pome-sh/twin-gmail/dist/src/check-kind.js +0 -9
- package/node_modules/@pome-sh/twin-gmail/dist/src/check-kind.js.map +0 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/check-labels.d.ts +0 -4
- package/node_modules/@pome-sh/twin-gmail/dist/src/check-labels.js +0 -67
- package/node_modules/@pome-sh/twin-gmail/dist/src/check-labels.js.map +0 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/check-messages.d.ts +0 -14
- package/node_modules/@pome-sh/twin-gmail/dist/src/check-messages.js +0 -223
- package/node_modules/@pome-sh/twin-gmail/dist/src/check-messages.js.map +0 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/check-params.d.ts +0 -10
- package/node_modules/@pome-sh/twin-gmail/dist/src/check-params.js +0 -96
- package/node_modules/@pome-sh/twin-gmail/dist/src/check-params.js.map +0 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/check-state.d.ts +0 -138
- package/node_modules/@pome-sh/twin-gmail/dist/src/check-state.js +0 -181
- package/node_modules/@pome-sh/twin-gmail/dist/src/check-state.js.map +0 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/check-tape.d.ts +0 -2
- package/node_modules/@pome-sh/twin-gmail/dist/src/check-tape.js +0 -103
- package/node_modules/@pome-sh/twin-gmail/dist/src/check-tape.js.map +0 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/check-worlds.d.ts +0 -17
- package/node_modules/@pome-sh/twin-gmail/dist/src/check-worlds.js +0 -62
- package/node_modules/@pome-sh/twin-gmail/dist/src/check-worlds.js.map +0 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/checks.d.ts +0 -19
- package/node_modules/@pome-sh/twin-gmail/dist/src/checks.js +0 -42
- package/node_modules/@pome-sh/twin-gmail/dist/src/checks.js.map +0 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/db.d.ts +0 -4
- package/node_modules/@pome-sh/twin-gmail/dist/src/db.js +0 -212
- package/node_modules/@pome-sh/twin-gmail/dist/src/db.js.map +0 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain/drafts.d.ts +0 -41
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain/drafts.js +0 -138
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain/drafts.js.map +0 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain/filters.d.ts +0 -10
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain/filters.js +0 -105
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain/filters.js.map +0 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain/gmail-domain.d.ts +0 -121
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain/gmail-domain.js +0 -174
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain/gmail-domain.js.map +0 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain/hydrate.d.ts +0 -8
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain/hydrate.js +0 -122
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain/hydrate.js.map +0 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain/index.d.ts +0 -4
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain/index.js +0 -5
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain/index.js.map +0 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain/labels.d.ts +0 -40
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain/labels.js +0 -122
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain/labels.js.map +0 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain/messages.d.ts +0 -49
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain/messages.js +0 -276
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain/messages.js.map +0 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain/search-sql.d.ts +0 -19
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain/search-sql.js +0 -179
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain/search-sql.js.map +0 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain/settings.d.ts +0 -27
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain/settings.js +0 -98
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain/settings.js.map +0 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/errors.d.ts +0 -12
- package/node_modules/@pome-sh/twin-gmail/dist/src/errors.js +0 -117
- package/node_modules/@pome-sh/twin-gmail/dist/src/errors.js.map +0 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/faults.d.ts +0 -21
- package/node_modules/@pome-sh/twin-gmail/dist/src/faults.js +0 -52
- package/node_modules/@pome-sh/twin-gmail/dist/src/faults.js.map +0 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/identity.d.ts +0 -5
- package/node_modules/@pome-sh/twin-gmail/dist/src/identity.js +0 -18
- package/node_modules/@pome-sh/twin-gmail/dist/src/identity.js.map +0 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/index.d.ts +0 -15
- package/node_modules/@pome-sh/twin-gmail/dist/src/index.js +0 -17
- package/node_modules/@pome-sh/twin-gmail/dist/src/index.js.map +0 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/mcp-schemas.d.ts +0 -224
- package/node_modules/@pome-sh/twin-gmail/dist/src/mcp-schemas.js +0 -185
- package/node_modules/@pome-sh/twin-gmail/dist/src/mcp-schemas.js.map +0 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/mcp.d.ts +0 -3
- package/node_modules/@pome-sh/twin-gmail/dist/src/mcp.js +0 -306
- package/node_modules/@pome-sh/twin-gmail/dist/src/mcp.js.map +0 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/mime.d.ts +0 -49
- package/node_modules/@pome-sh/twin-gmail/dist/src/mime.js +0 -315
- package/node_modules/@pome-sh/twin-gmail/dist/src/mime.js.map +0 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/page-tokens.d.ts +0 -11
- package/node_modules/@pome-sh/twin-gmail/dist/src/page-tokens.js +0 -70
- package/node_modules/@pome-sh/twin-gmail/dist/src/page-tokens.js.map +0 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/recording.d.ts +0 -6
- package/node_modules/@pome-sh/twin-gmail/dist/src/recording.js +0 -74
- package/node_modules/@pome-sh/twin-gmail/dist/src/recording.js.map +0 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/rest-common.d.ts +0 -28
- package/node_modules/@pome-sh/twin-gmail/dist/src/rest-common.js +0 -120
- package/node_modules/@pome-sh/twin-gmail/dist/src/rest-common.js.map +0 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/rest-routes-drafts.d.ts +0 -3
- package/node_modules/@pome-sh/twin-gmail/dist/src/rest-routes-drafts.js +0 -84
- package/node_modules/@pome-sh/twin-gmail/dist/src/rest-routes-drafts.js.map +0 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/rest-routes-kit.d.ts +0 -18
- package/node_modules/@pome-sh/twin-gmail/dist/src/rest-routes-kit.js +0 -52
- package/node_modules/@pome-sh/twin-gmail/dist/src/rest-routes-kit.js.map +0 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/rest-routes-messages.d.ts +0 -3
- package/node_modules/@pome-sh/twin-gmail/dist/src/rest-routes-messages.js +0 -143
- package/node_modules/@pome-sh/twin-gmail/dist/src/rest-routes-messages.js.map +0 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/rest-routes-resources.d.ts +0 -3
- package/node_modules/@pome-sh/twin-gmail/dist/src/rest-routes-resources.js +0 -203
- package/node_modules/@pome-sh/twin-gmail/dist/src/rest-routes-resources.js.map +0 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/rest-routes.d.ts +0 -4
- package/node_modules/@pome-sh/twin-gmail/dist/src/rest-routes.js +0 -11
- package/node_modules/@pome-sh/twin-gmail/dist/src/rest-routes.js.map +0 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/rest-serializers.d.ts +0 -16
- package/node_modules/@pome-sh/twin-gmail/dist/src/rest-serializers.js +0 -151
- package/node_modules/@pome-sh/twin-gmail/dist/src/rest-serializers.js.map +0 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/rest-upload.d.ts +0 -12
- package/node_modules/@pome-sh/twin-gmail/dist/src/rest-upload.js +0 -127
- package/node_modules/@pome-sh/twin-gmail/dist/src/rest-upload.js.map +0 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/search-match.d.ts +0 -4
- package/node_modules/@pome-sh/twin-gmail/dist/src/search-match.js +0 -179
- package/node_modules/@pome-sh/twin-gmail/dist/src/search-match.js.map +0 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/search-parse.d.ts +0 -61
- package/node_modules/@pome-sh/twin-gmail/dist/src/search-parse.js +0 -318
- package/node_modules/@pome-sh/twin-gmail/dist/src/search-parse.js.map +0 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/search.d.ts +0 -3
- package/node_modules/@pome-sh/twin-gmail/dist/src/search.js +0 -3
- package/node_modules/@pome-sh/twin-gmail/dist/src/search.js.map +0 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/seed.d.ts +0 -239
- package/node_modules/@pome-sh/twin-gmail/dist/src/seed.js +0 -271
- package/node_modules/@pome-sh/twin-gmail/dist/src/seed.js.map +0 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/seeding.d.ts +0 -3
- package/node_modules/@pome-sh/twin-gmail/dist/src/seeding.js +0 -89
- package/node_modules/@pome-sh/twin-gmail/dist/src/seeding.js.map +0 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/server.d.ts +0 -2
- package/node_modules/@pome-sh/twin-gmail/dist/src/server.js +0 -21
- package/node_modules/@pome-sh/twin-gmail/dist/src/server.js.map +0 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/state.d.ts +0 -55
- package/node_modules/@pome-sh/twin-gmail/dist/src/state.js +0 -225
- package/node_modules/@pome-sh/twin-gmail/dist/src/state.js.map +0 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/storage.d.ts +0 -20
- package/node_modules/@pome-sh/twin-gmail/dist/src/storage.js +0 -171
- package/node_modules/@pome-sh/twin-gmail/dist/src/storage.js.map +0 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/twin.d.ts +0 -16
- package/node_modules/@pome-sh/twin-gmail/dist/src/twin.js +0 -96
- package/node_modules/@pome-sh/twin-gmail/dist/src/twin.js.map +0 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/types.d.ts +0 -150
- package/node_modules/@pome-sh/twin-gmail/dist/src/types.js +0 -2
- package/node_modules/@pome-sh/twin-gmail/dist/src/types.js.map +0 -1
- package/node_modules/@pome-sh/twin-gmail/fidelity.inventory.json +0 -565
- package/node_modules/@pome-sh/twin-gmail/fixtures/README.md +0 -28
- package/node_modules/@pome-sh/twin-gmail/fixtures/gmail-discovery-v1.meta.json +0 -6
- package/node_modules/@pome-sh/twin-gmail/fixtures/gmail-discovery-v1.raw.json +0 -4510
- package/node_modules/@pome-sh/twin-gmail/fixtures/mcp-initialize.meta.json +0 -8
- package/node_modules/@pome-sh/twin-gmail/fixtures/mcp-initialize.raw.json +0 -1
- package/node_modules/@pome-sh/twin-gmail/fixtures/mcp-tools-call-unauth-error.raw.json +0 -1
- package/node_modules/@pome-sh/twin-gmail/fixtures/mcp-tools-call.representative.json +0 -508
- package/node_modules/@pome-sh/twin-gmail/fixtures/mcp-tools-list.canonical.json +0 -1209
- package/node_modules/@pome-sh/twin-gmail/fixtures/mcp-tools-list.meta.json +0 -29
- package/node_modules/@pome-sh/twin-gmail/fixtures/mcp-tools-list.raw.json +0 -1
- package/node_modules/@pome-sh/twin-gmail/fixtures/rest-surface.json +0 -3502
- package/node_modules/@pome-sh/twin-gmail/package.json +0 -76
- package/node_modules/@pome-sh/twin-linear/CHANGELOG.md +0 -197
- package/node_modules/@pome-sh/twin-linear/FIDELITY.md +0 -62
- package/node_modules/@pome-sh/twin-linear/HOSTED.md +0 -46
- package/node_modules/@pome-sh/twin-linear/LIMITS.md +0 -54
- package/node_modules/@pome-sh/twin-linear/README.md +0 -151
- package/node_modules/@pome-sh/twin-linear/REFERENCE-DIVERGENCES.md +0 -50
- package/node_modules/@pome-sh/twin-linear/dist/fixtures/mcp-tools-list.canonical.json +0 -353
- package/node_modules/@pome-sh/twin-linear/dist/src/auth-credential.d.ts +0 -8
- package/node_modules/@pome-sh/twin-linear/dist/src/auth-credential.js +0 -55
- package/node_modules/@pome-sh/twin-linear/dist/src/auth-credential.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/dist/src/check-comments.d.ts +0 -10
- package/node_modules/@pome-sh/twin-linear/dist/src/check-comments.js +0 -129
- package/node_modules/@pome-sh/twin-linear/dist/src/check-comments.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/dist/src/check-issues.d.ts +0 -25
- package/node_modules/@pome-sh/twin-linear/dist/src/check-issues.js +0 -238
- package/node_modules/@pome-sh/twin-linear/dist/src/check-issues.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/dist/src/check-kind.d.ts +0 -3
- package/node_modules/@pome-sh/twin-linear/dist/src/check-kind.js +0 -9
- package/node_modules/@pome-sh/twin-linear/dist/src/check-kind.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/dist/src/check-params.d.ts +0 -8
- package/node_modules/@pome-sh/twin-linear/dist/src/check-params.js +0 -94
- package/node_modules/@pome-sh/twin-linear/dist/src/check-params.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/dist/src/check-state.d.ts +0 -123
- package/node_modules/@pome-sh/twin-linear/dist/src/check-state.js +0 -184
- package/node_modules/@pome-sh/twin-linear/dist/src/check-state.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/dist/src/check-tape.d.ts +0 -2
- package/node_modules/@pome-sh/twin-linear/dist/src/check-tape.js +0 -100
- package/node_modules/@pome-sh/twin-linear/dist/src/check-tape.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/dist/src/check-worlds.d.ts +0 -44
- package/node_modules/@pome-sh/twin-linear/dist/src/check-worlds.js +0 -93
- package/node_modules/@pome-sh/twin-linear/dist/src/check-worlds.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/dist/src/checks.d.ts +0 -29
- package/node_modules/@pome-sh/twin-linear/dist/src/checks.js +0 -52
- package/node_modules/@pome-sh/twin-linear/dist/src/checks.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/dist/src/db.d.ts +0 -10
- package/node_modules/@pome-sh/twin-linear/dist/src/db.js +0 -382
- package/node_modules/@pome-sh/twin-linear/dist/src/db.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/dist/src/domain/agents.d.ts +0 -32
- package/node_modules/@pome-sh/twin-linear/dist/src/domain/agents.js +0 -107
- package/node_modules/@pome-sh/twin-linear/dist/src/domain/agents.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/dist/src/domain/catalog.d.ts +0 -9
- package/node_modules/@pome-sh/twin-linear/dist/src/domain/catalog.js +0 -41
- package/node_modules/@pome-sh/twin-linear/dist/src/domain/catalog.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/dist/src/domain/comments.d.ts +0 -13
- package/node_modules/@pome-sh/twin-linear/dist/src/domain/comments.js +0 -108
- package/node_modules/@pome-sh/twin-linear/dist/src/domain/comments.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/dist/src/domain/documents.d.ts +0 -31
- package/node_modules/@pome-sh/twin-linear/dist/src/domain/documents.js +0 -113
- package/node_modules/@pome-sh/twin-linear/dist/src/domain/documents.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/dist/src/domain/index.d.ts +0 -4
- package/node_modules/@pome-sh/twin-linear/dist/src/domain/index.js +0 -6
- package/node_modules/@pome-sh/twin-linear/dist/src/domain/index.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/dist/src/domain/issue-relations.d.ts +0 -13
- package/node_modules/@pome-sh/twin-linear/dist/src/domain/issue-relations.js +0 -60
- package/node_modules/@pome-sh/twin-linear/dist/src/domain/issue-relations.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/dist/src/domain/issues.d.ts +0 -57
- package/node_modules/@pome-sh/twin-linear/dist/src/domain/issues.js +0 -359
- package/node_modules/@pome-sh/twin-linear/dist/src/domain/issues.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/dist/src/domain/labels.d.ts +0 -18
- package/node_modules/@pome-sh/twin-linear/dist/src/domain/labels.js +0 -117
- package/node_modules/@pome-sh/twin-linear/dist/src/domain/labels.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/dist/src/domain/linear-domain.d.ts +0 -177
- package/node_modules/@pome-sh/twin-linear/dist/src/domain/linear-domain.js +0 -315
- package/node_modules/@pome-sh/twin-linear/dist/src/domain/linear-domain.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/dist/src/domain/normalize.d.ts +0 -18
- package/node_modules/@pome-sh/twin-linear/dist/src/domain/normalize.js +0 -84
- package/node_modules/@pome-sh/twin-linear/dist/src/domain/normalize.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/dist/src/domain/oauth-store.d.ts +0 -55
- package/node_modules/@pome-sh/twin-linear/dist/src/domain/oauth-store.js +0 -127
- package/node_modules/@pome-sh/twin-linear/dist/src/domain/oauth-store.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/dist/src/domain/projects-cycles.d.ts +0 -17
- package/node_modules/@pome-sh/twin-linear/dist/src/domain/projects-cycles.js +0 -51
- package/node_modules/@pome-sh/twin-linear/dist/src/domain/projects-cycles.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/dist/src/domain/rows.d.ts +0 -211
- package/node_modules/@pome-sh/twin-linear/dist/src/domain/rows.js +0 -217
- package/node_modules/@pome-sh/twin-linear/dist/src/domain/rows.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/dist/src/domain/webhooks.d.ts +0 -5
- package/node_modules/@pome-sh/twin-linear/dist/src/domain/webhooks.js +0 -12
- package/node_modules/@pome-sh/twin-linear/dist/src/domain/webhooks.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/dist/src/errors.d.ts +0 -26
- package/node_modules/@pome-sh/twin-linear/dist/src/errors.js +0 -128
- package/node_modules/@pome-sh/twin-linear/dist/src/errors.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/dist/src/graphql/formatters.d.ts +0 -27
- package/node_modules/@pome-sh/twin-linear/dist/src/graphql/formatters.js +0 -261
- package/node_modules/@pome-sh/twin-linear/dist/src/graphql/formatters.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/dist/src/graphql/issue-filter.d.ts +0 -5
- package/node_modules/@pome-sh/twin-linear/dist/src/graphql/issue-filter.js +0 -122
- package/node_modules/@pome-sh/twin-linear/dist/src/graphql/issue-filter.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/dist/src/graphql/mutation-inputs.d.ts +0 -170
- package/node_modules/@pome-sh/twin-linear/dist/src/graphql/mutation-inputs.js +0 -260
- package/node_modules/@pome-sh/twin-linear/dist/src/graphql/mutation-inputs.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/dist/src/graphql/resolvers.d.ts +0 -6
- package/node_modules/@pome-sh/twin-linear/dist/src/graphql/resolvers.js +0 -169
- package/node_modules/@pome-sh/twin-linear/dist/src/graphql/resolvers.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/dist/src/graphql/routes.d.ts +0 -6
- package/node_modules/@pome-sh/twin-linear/dist/src/graphql/routes.js +0 -176
- package/node_modules/@pome-sh/twin-linear/dist/src/graphql/routes.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/dist/src/graphql/schema.d.ts +0 -3
- package/node_modules/@pome-sh/twin-linear/dist/src/graphql/schema.js +0 -522
- package/node_modules/@pome-sh/twin-linear/dist/src/graphql/schema.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/dist/src/identity.d.ts +0 -7
- package/node_modules/@pome-sh/twin-linear/dist/src/identity.js +0 -14
- package/node_modules/@pome-sh/twin-linear/dist/src/identity.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/dist/src/ids.d.ts +0 -5
- package/node_modules/@pome-sh/twin-linear/dist/src/ids.js +0 -28
- package/node_modules/@pome-sh/twin-linear/dist/src/ids.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/dist/src/index.d.ts +0 -18
- package/node_modules/@pome-sh/twin-linear/dist/src/index.js +0 -21
- package/node_modules/@pome-sh/twin-linear/dist/src/index.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/dist/src/mcp-schemas.d.ts +0 -121
- package/node_modules/@pome-sh/twin-linear/dist/src/mcp-schemas.js +0 -126
- package/node_modules/@pome-sh/twin-linear/dist/src/mcp-schemas.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/dist/src/mcp.d.ts +0 -4
- package/node_modules/@pome-sh/twin-linear/dist/src/mcp.js +0 -430
- package/node_modules/@pome-sh/twin-linear/dist/src/mcp.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/dist/src/oauth/routes.d.ts +0 -5
- package/node_modules/@pome-sh/twin-linear/dist/src/oauth/routes.js +0 -340
- package/node_modules/@pome-sh/twin-linear/dist/src/oauth/routes.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/dist/src/pagination.d.ts +0 -29
- package/node_modules/@pome-sh/twin-linear/dist/src/pagination.js +0 -101
- package/node_modules/@pome-sh/twin-linear/dist/src/pagination.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/dist/src/recording.d.ts +0 -2
- package/node_modules/@pome-sh/twin-linear/dist/src/recording.js +0 -46
- package/node_modules/@pome-sh/twin-linear/dist/src/recording.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/dist/src/routes.d.ts +0 -9
- package/node_modules/@pome-sh/twin-linear/dist/src/routes.js +0 -10
- package/node_modules/@pome-sh/twin-linear/dist/src/routes.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/dist/src/seed/apply.d.ts +0 -4
- package/node_modules/@pome-sh/twin-linear/dist/src/seed/apply.js +0 -186
- package/node_modules/@pome-sh/twin-linear/dist/src/seed/apply.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/dist/src/seed.d.ts +0 -158
- package/node_modules/@pome-sh/twin-linear/dist/src/seed.js +0 -541
- package/node_modules/@pome-sh/twin-linear/dist/src/seed.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/dist/src/serializers/comment.d.ts +0 -29
- package/node_modules/@pome-sh/twin-linear/dist/src/serializers/comment.js +0 -47
- package/node_modules/@pome-sh/twin-linear/dist/src/serializers/comment.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/dist/src/serializers/document.d.ts +0 -15
- package/node_modules/@pome-sh/twin-linear/dist/src/serializers/document.js +0 -17
- package/node_modules/@pome-sh/twin-linear/dist/src/serializers/document.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/dist/src/serializers/index.d.ts +0 -3
- package/node_modules/@pome-sh/twin-linear/dist/src/serializers/index.js +0 -5
- package/node_modules/@pome-sh/twin-linear/dist/src/serializers/index.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/dist/src/serializers/issue.d.ts +0 -86
- package/node_modules/@pome-sh/twin-linear/dist/src/serializers/issue.js +0 -102
- package/node_modules/@pome-sh/twin-linear/dist/src/serializers/issue.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/dist/src/server.d.ts +0 -2
- package/node_modules/@pome-sh/twin-linear/dist/src/server.js +0 -41
- package/node_modules/@pome-sh/twin-linear/dist/src/server.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/dist/src/state.d.ts +0 -51
- package/node_modules/@pome-sh/twin-linear/dist/src/state.js +0 -211
- package/node_modules/@pome-sh/twin-linear/dist/src/state.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/dist/src/twin.d.ts +0 -21
- package/node_modules/@pome-sh/twin-linear/dist/src/twin.js +0 -107
- package/node_modules/@pome-sh/twin-linear/dist/src/twin.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/dist/src/types.d.ts +0 -366
- package/node_modules/@pome-sh/twin-linear/dist/src/types.js +0 -19
- package/node_modules/@pome-sh/twin-linear/dist/src/types.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/dist/src/webhook-policy.d.ts +0 -27
- package/node_modules/@pome-sh/twin-linear/dist/src/webhook-policy.js +0 -107
- package/node_modules/@pome-sh/twin-linear/dist/src/webhook-policy.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/dist/src/webhook-url.d.ts +0 -3
- package/node_modules/@pome-sh/twin-linear/dist/src/webhook-url.js +0 -26
- package/node_modules/@pome-sh/twin-linear/dist/src/webhook-url.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/dist/src/webhooks/dispatch.d.ts +0 -30
- package/node_modules/@pome-sh/twin-linear/dist/src/webhooks/dispatch.js +0 -93
- package/node_modules/@pome-sh/twin-linear/dist/src/webhooks/dispatch.js.map +0 -1
- package/node_modules/@pome-sh/twin-linear/fidelity.inventory.json +0 -249
- package/node_modules/@pome-sh/twin-linear/fixtures/README.md +0 -11
- package/node_modules/@pome-sh/twin-linear/fixtures/graphql-surface.json +0 -59
- package/node_modules/@pome-sh/twin-linear/fixtures/linear-introspection.json +0 -66
- package/node_modules/@pome-sh/twin-linear/fixtures/mcp-tools-list.canonical.json +0 -353
- package/node_modules/@pome-sh/twin-linear/package.json +0 -72
- package/node_modules/@pome-sh/twin-slack/FIDELITY.md +0 -346
- package/node_modules/@pome-sh/twin-slack/README.md +0 -211
- package/node_modules/@pome-sh/twin-slack/dist/examples/claude-slack-agent.d.ts +0 -1
- package/node_modules/@pome-sh/twin-slack/dist/examples/claude-slack-agent.js +0 -105
- package/node_modules/@pome-sh/twin-slack/dist/examples/claude-slack-agent.js.map +0 -1
- package/node_modules/@pome-sh/twin-slack/dist/examples/mcp-node.d.ts +0 -1
- package/node_modules/@pome-sh/twin-slack/dist/examples/mcp-node.js +0 -20
- package/node_modules/@pome-sh/twin-slack/dist/examples/mcp-node.js.map +0 -1
- package/node_modules/@pome-sh/twin-slack/dist/examples/mini-bot-flow.d.ts +0 -1
- package/node_modules/@pome-sh/twin-slack/dist/examples/mini-bot-flow.js +0 -61
- package/node_modules/@pome-sh/twin-slack/dist/examples/mini-bot-flow.js.map +0 -1
- package/node_modules/@pome-sh/twin-slack/dist/scripts/fidelity-parity.d.ts +0 -1
- package/node_modules/@pome-sh/twin-slack/dist/scripts/fidelity-parity.js +0 -92
- package/node_modules/@pome-sh/twin-slack/dist/scripts/fidelity-parity.js.map +0 -1
- package/node_modules/@pome-sh/twin-slack/dist/scripts/seed.d.ts +0 -1
- package/node_modules/@pome-sh/twin-slack/dist/scripts/seed.js +0 -9
- package/node_modules/@pome-sh/twin-slack/dist/scripts/seed.js.map +0 -1
- package/node_modules/@pome-sh/twin-slack/dist/scripts/smoke.d.ts +0 -1
- package/node_modules/@pome-sh/twin-slack/dist/scripts/smoke.js +0 -209
- package/node_modules/@pome-sh/twin-slack/dist/scripts/smoke.js.map +0 -1
- package/node_modules/@pome-sh/twin-slack/dist/scripts/validate-mcp.d.ts +0 -1
- package/node_modules/@pome-sh/twin-slack/dist/scripts/validate-mcp.js +0 -116
- package/node_modules/@pome-sh/twin-slack/dist/scripts/validate-mcp.js.map +0 -1
- package/node_modules/@pome-sh/twin-slack/dist/scripts/verify-cloud-token.d.ts +0 -1
- package/node_modules/@pome-sh/twin-slack/dist/scripts/verify-cloud-token.js +0 -45
- package/node_modules/@pome-sh/twin-slack/dist/scripts/verify-cloud-token.js.map +0 -1
- package/node_modules/@pome-sh/twin-slack/dist/src/check-kind.d.ts +0 -3
- package/node_modules/@pome-sh/twin-slack/dist/src/check-kind.js +0 -9
- package/node_modules/@pome-sh/twin-slack/dist/src/check-kind.js.map +0 -1
- package/node_modules/@pome-sh/twin-slack/dist/src/check-messages.d.ts +0 -16
- package/node_modules/@pome-sh/twin-slack/dist/src/check-messages.js +0 -207
- package/node_modules/@pome-sh/twin-slack/dist/src/check-messages.js.map +0 -1
- package/node_modules/@pome-sh/twin-slack/dist/src/check-params.d.ts +0 -5
- package/node_modules/@pome-sh/twin-slack/dist/src/check-params.js +0 -56
- package/node_modules/@pome-sh/twin-slack/dist/src/check-params.js.map +0 -1
- package/node_modules/@pome-sh/twin-slack/dist/src/check-secrets.d.ts +0 -2
- package/node_modules/@pome-sh/twin-slack/dist/src/check-secrets.js +0 -138
- package/node_modules/@pome-sh/twin-slack/dist/src/check-secrets.js.map +0 -1
- package/node_modules/@pome-sh/twin-slack/dist/src/check-state.d.ts +0 -107
- package/node_modules/@pome-sh/twin-slack/dist/src/check-state.js +0 -128
- package/node_modules/@pome-sh/twin-slack/dist/src/check-state.js.map +0 -1
- package/node_modules/@pome-sh/twin-slack/dist/src/check-worlds.d.ts +0 -7
- package/node_modules/@pome-sh/twin-slack/dist/src/check-worlds.js +0 -37
- package/node_modules/@pome-sh/twin-slack/dist/src/check-worlds.js.map +0 -1
- package/node_modules/@pome-sh/twin-slack/dist/src/checks.d.ts +0 -14
- package/node_modules/@pome-sh/twin-slack/dist/src/checks.js +0 -39
- package/node_modules/@pome-sh/twin-slack/dist/src/checks.js.map +0 -1
- package/node_modules/@pome-sh/twin-slack/dist/src/db.d.ts +0 -4
- package/node_modules/@pome-sh/twin-slack/dist/src/db.js +0 -231
- package/node_modules/@pome-sh/twin-slack/dist/src/db.js.map +0 -1
- package/node_modules/@pome-sh/twin-slack/dist/src/domain/bookmarks.d.ts +0 -16
- package/node_modules/@pome-sh/twin-slack/dist/src/domain/bookmarks.js +0 -49
- package/node_modules/@pome-sh/twin-slack/dist/src/domain/bookmarks.js.map +0 -1
- package/node_modules/@pome-sh/twin-slack/dist/src/domain/canvases.d.ts +0 -37
- package/node_modules/@pome-sh/twin-slack/dist/src/domain/canvases.js +0 -182
- package/node_modules/@pome-sh/twin-slack/dist/src/domain/canvases.js.map +0 -1
- package/node_modules/@pome-sh/twin-slack/dist/src/domain/chat.d.ts +0 -40
- package/node_modules/@pome-sh/twin-slack/dist/src/domain/chat.js +0 -167
- package/node_modules/@pome-sh/twin-slack/dist/src/domain/chat.js.map +0 -1
- package/node_modules/@pome-sh/twin-slack/dist/src/domain/conversations.d.ts +0 -61
- package/node_modules/@pome-sh/twin-slack/dist/src/domain/conversations.js +0 -360
- package/node_modules/@pome-sh/twin-slack/dist/src/domain/conversations.js.map +0 -1
- package/node_modules/@pome-sh/twin-slack/dist/src/domain/emoji.d.ts +0 -13
- package/node_modules/@pome-sh/twin-slack/dist/src/domain/emoji.js +0 -31
- package/node_modules/@pome-sh/twin-slack/dist/src/domain/emoji.js.map +0 -1
- package/node_modules/@pome-sh/twin-slack/dist/src/domain/files.d.ts +0 -24
- package/node_modules/@pome-sh/twin-slack/dist/src/domain/files.js +0 -101
- package/node_modules/@pome-sh/twin-slack/dist/src/domain/files.js.map +0 -1
- package/node_modules/@pome-sh/twin-slack/dist/src/domain/helpers.d.ts +0 -5
- package/node_modules/@pome-sh/twin-slack/dist/src/domain/helpers.js +0 -42
- package/node_modules/@pome-sh/twin-slack/dist/src/domain/helpers.js.map +0 -1
- package/node_modules/@pome-sh/twin-slack/dist/src/domain/index.d.ts +0 -2
- package/node_modules/@pome-sh/twin-slack/dist/src/domain/index.js +0 -5
- package/node_modules/@pome-sh/twin-slack/dist/src/domain/index.js.map +0 -1
- package/node_modules/@pome-sh/twin-slack/dist/src/domain/pins.d.ts +0 -12
- package/node_modules/@pome-sh/twin-slack/dist/src/domain/pins.js +0 -63
- package/node_modules/@pome-sh/twin-slack/dist/src/domain/pins.js.map +0 -1
- package/node_modules/@pome-sh/twin-slack/dist/src/domain/reactions.d.ts +0 -16
- package/node_modules/@pome-sh/twin-slack/dist/src/domain/reactions.js +0 -73
- package/node_modules/@pome-sh/twin-slack/dist/src/domain/reactions.js.map +0 -1
- package/node_modules/@pome-sh/twin-slack/dist/src/domain/search.d.ts +0 -9
- package/node_modules/@pome-sh/twin-slack/dist/src/domain/search.js +0 -68
- package/node_modules/@pome-sh/twin-slack/dist/src/domain/search.js.map +0 -1
- package/node_modules/@pome-sh/twin-slack/dist/src/domain/slack-domain.d.ts +0 -258
- package/node_modules/@pome-sh/twin-slack/dist/src/domain/slack-domain.js +0 -510
- package/node_modules/@pome-sh/twin-slack/dist/src/domain/slack-domain.js.map +0 -1
- package/node_modules/@pome-sh/twin-slack/dist/src/domain/team.d.ts +0 -5
- package/node_modules/@pome-sh/twin-slack/dist/src/domain/team.js +0 -25
- package/node_modules/@pome-sh/twin-slack/dist/src/domain/team.js.map +0 -1
- package/node_modules/@pome-sh/twin-slack/dist/src/domain/topic.d.ts +0 -19
- package/node_modules/@pome-sh/twin-slack/dist/src/domain/topic.js +0 -43
- package/node_modules/@pome-sh/twin-slack/dist/src/domain/topic.js.map +0 -1
- package/node_modules/@pome-sh/twin-slack/dist/src/domain/users.d.ts +0 -24
- package/node_modules/@pome-sh/twin-slack/dist/src/domain/users.js +0 -82
- package/node_modules/@pome-sh/twin-slack/dist/src/domain/users.js.map +0 -1
- package/node_modules/@pome-sh/twin-slack/dist/src/errors.d.ts +0 -16
- package/node_modules/@pome-sh/twin-slack/dist/src/errors.js +0 -61
- package/node_modules/@pome-sh/twin-slack/dist/src/errors.js.map +0 -1
- package/node_modules/@pome-sh/twin-slack/dist/src/index.d.ts +0 -8
- package/node_modules/@pome-sh/twin-slack/dist/src/index.js +0 -8
- package/node_modules/@pome-sh/twin-slack/dist/src/index.js.map +0 -1
- package/node_modules/@pome-sh/twin-slack/dist/src/routes.d.ts +0 -4
- package/node_modules/@pome-sh/twin-slack/dist/src/routes.js +0 -211
- package/node_modules/@pome-sh/twin-slack/dist/src/routes.js.map +0 -1
- package/node_modules/@pome-sh/twin-slack/dist/src/seed.d.ts +0 -54
- package/node_modules/@pome-sh/twin-slack/dist/src/seed.js +0 -152
- package/node_modules/@pome-sh/twin-slack/dist/src/seed.js.map +0 -1
- package/node_modules/@pome-sh/twin-slack/dist/src/serializers.d.ts +0 -141
- package/node_modules/@pome-sh/twin-slack/dist/src/serializers.js +0 -378
- package/node_modules/@pome-sh/twin-slack/dist/src/serializers.js.map +0 -1
- package/node_modules/@pome-sh/twin-slack/dist/src/server.d.ts +0 -2
- package/node_modules/@pome-sh/twin-slack/dist/src/server.js +0 -42
- package/node_modules/@pome-sh/twin-slack/dist/src/server.js.map +0 -1
- package/node_modules/@pome-sh/twin-slack/dist/src/tools.d.ts +0 -123
- package/node_modules/@pome-sh/twin-slack/dist/src/tools.js +0 -219
- package/node_modules/@pome-sh/twin-slack/dist/src/tools.js.map +0 -1
- package/node_modules/@pome-sh/twin-slack/dist/src/twin.d.ts +0 -22
- package/node_modules/@pome-sh/twin-slack/dist/src/twin.js +0 -179
- package/node_modules/@pome-sh/twin-slack/dist/src/twin.js.map +0 -1
- package/node_modules/@pome-sh/twin-slack/dist/src/types.d.ts +0 -182
- package/node_modules/@pome-sh/twin-slack/dist/src/types.js +0 -2
- package/node_modules/@pome-sh/twin-slack/dist/src/types.js.map +0 -1
- package/node_modules/@pome-sh/twin-slack/dist/src/unsupported-envelope.d.ts +0 -12
- package/node_modules/@pome-sh/twin-slack/dist/src/unsupported-envelope.js +0 -68
- package/node_modules/@pome-sh/twin-slack/dist/src/unsupported-envelope.js.map +0 -1
- package/node_modules/@pome-sh/twin-slack/dist/src/upstream-types.d.ts +0 -16
- package/node_modules/@pome-sh/twin-slack/dist/src/upstream-types.js +0 -2
- package/node_modules/@pome-sh/twin-slack/dist/src/upstream-types.js.map +0 -1
- package/node_modules/@pome-sh/twin-slack/dist/src/util.d.ts +0 -30
- package/node_modules/@pome-sh/twin-slack/dist/src/util.js +0 -132
- package/node_modules/@pome-sh/twin-slack/dist/src/util.js.map +0 -1
- package/node_modules/@pome-sh/twin-slack/fidelity.inventory.json +0 -377
- package/node_modules/@pome-sh/twin-slack/package.json +0 -63
- package/node_modules/@pome-sh/twin-stripe/FIDELITY.md +0 -380
- package/node_modules/@pome-sh/twin-stripe/README.md +0 -280
- package/node_modules/@pome-sh/twin-stripe/dist/scripts/fidelity-parity.d.ts +0 -1
- package/node_modules/@pome-sh/twin-stripe/dist/scripts/fidelity-parity.js +0 -186
- package/node_modules/@pome-sh/twin-stripe/dist/scripts/fidelity-parity.js.map +0 -1
- package/node_modules/@pome-sh/twin-stripe/dist/scripts/seed.d.ts +0 -1
- package/node_modules/@pome-sh/twin-stripe/dist/scripts/seed.js +0 -9
- package/node_modules/@pome-sh/twin-stripe/dist/scripts/seed.js.map +0 -1
- package/node_modules/@pome-sh/twin-stripe/dist/scripts/smoke.d.ts +0 -1
- package/node_modules/@pome-sh/twin-stripe/dist/scripts/smoke.js +0 -224
- package/node_modules/@pome-sh/twin-stripe/dist/scripts/smoke.js.map +0 -1
- package/node_modules/@pome-sh/twin-stripe/dist/src/api-keys.d.ts +0 -27
- package/node_modules/@pome-sh/twin-stripe/dist/src/api-keys.js +0 -49
- package/node_modules/@pome-sh/twin-stripe/dist/src/api-keys.js.map +0 -1
- package/node_modules/@pome-sh/twin-stripe/dist/src/check-kind.d.ts +0 -3
- package/node_modules/@pome-sh/twin-stripe/dist/src/check-kind.js +0 -9
- package/node_modules/@pome-sh/twin-stripe/dist/src/check-kind.js.map +0 -1
- package/node_modules/@pome-sh/twin-stripe/dist/src/check-params.d.ts +0 -8
- package/node_modules/@pome-sh/twin-stripe/dist/src/check-params.js +0 -123
- package/node_modules/@pome-sh/twin-stripe/dist/src/check-params.js.map +0 -1
- package/node_modules/@pome-sh/twin-stripe/dist/src/check-payments.d.ts +0 -18
- package/node_modules/@pome-sh/twin-stripe/dist/src/check-payments.js +0 -280
- package/node_modules/@pome-sh/twin-stripe/dist/src/check-payments.js.map +0 -1
- package/node_modules/@pome-sh/twin-stripe/dist/src/check-refunds.d.ts +0 -8
- package/node_modules/@pome-sh/twin-stripe/dist/src/check-refunds.js +0 -130
- package/node_modules/@pome-sh/twin-stripe/dist/src/check-refunds.js.map +0 -1
- package/node_modules/@pome-sh/twin-stripe/dist/src/check-state.d.ts +0 -107
- package/node_modules/@pome-sh/twin-stripe/dist/src/check-state.js +0 -123
- package/node_modules/@pome-sh/twin-stripe/dist/src/check-state.js.map +0 -1
- package/node_modules/@pome-sh/twin-stripe/dist/src/check-tape.d.ts +0 -9
- package/node_modules/@pome-sh/twin-stripe/dist/src/check-tape.js +0 -338
- package/node_modules/@pome-sh/twin-stripe/dist/src/check-tape.js.map +0 -1
- package/node_modules/@pome-sh/twin-stripe/dist/src/check-worlds.d.ts +0 -24
- package/node_modules/@pome-sh/twin-stripe/dist/src/check-worlds.js +0 -131
- package/node_modules/@pome-sh/twin-stripe/dist/src/check-worlds.js.map +0 -1
- package/node_modules/@pome-sh/twin-stripe/dist/src/checks.d.ts +0 -22
- package/node_modules/@pome-sh/twin-stripe/dist/src/checks.js +0 -97
- package/node_modules/@pome-sh/twin-stripe/dist/src/checks.js.map +0 -1
- package/node_modules/@pome-sh/twin-stripe/dist/src/db.d.ts +0 -4
- package/node_modules/@pome-sh/twin-stripe/dist/src/db.js +0 -167
- package/node_modules/@pome-sh/twin-stripe/dist/src/db.js.map +0 -1
- package/node_modules/@pome-sh/twin-stripe/dist/src/domain/balance.d.ts +0 -53
- package/node_modules/@pome-sh/twin-stripe/dist/src/domain/balance.js +0 -77
- package/node_modules/@pome-sh/twin-stripe/dist/src/domain/balance.js.map +0 -1
- package/node_modules/@pome-sh/twin-stripe/dist/src/domain/billing.d.ts +0 -101
- package/node_modules/@pome-sh/twin-stripe/dist/src/domain/billing.js +0 -195
- package/node_modules/@pome-sh/twin-stripe/dist/src/domain/billing.js.map +0 -1
- package/node_modules/@pome-sh/twin-stripe/dist/src/domain/charges.d.ts +0 -45
- package/node_modules/@pome-sh/twin-stripe/dist/src/domain/charges.js +0 -59
- package/node_modules/@pome-sh/twin-stripe/dist/src/domain/charges.js.map +0 -1
- package/node_modules/@pome-sh/twin-stripe/dist/src/domain/constants.d.ts +0 -25
- package/node_modules/@pome-sh/twin-stripe/dist/src/domain/constants.js +0 -26
- package/node_modules/@pome-sh/twin-stripe/dist/src/domain/constants.js.map +0 -1
- package/node_modules/@pome-sh/twin-stripe/dist/src/domain/customers.d.ts +0 -47
- package/node_modules/@pome-sh/twin-stripe/dist/src/domain/customers.js +0 -103
- package/node_modules/@pome-sh/twin-stripe/dist/src/domain/customers.js.map +0 -1
- package/node_modules/@pome-sh/twin-stripe/dist/src/domain/events.d.ts +0 -27
- package/node_modules/@pome-sh/twin-stripe/dist/src/domain/events.js +0 -45
- package/node_modules/@pome-sh/twin-stripe/dist/src/domain/events.js.map +0 -1
- package/node_modules/@pome-sh/twin-stripe/dist/src/domain/index.d.ts +0 -18
- package/node_modules/@pome-sh/twin-stripe/dist/src/domain/index.js +0 -16
- package/node_modules/@pome-sh/twin-stripe/dist/src/domain/index.js.map +0 -1
- package/node_modules/@pome-sh/twin-stripe/dist/src/domain/payment-intents.d.ts +0 -150
- package/node_modules/@pome-sh/twin-stripe/dist/src/domain/payment-intents.js +0 -449
- package/node_modules/@pome-sh/twin-stripe/dist/src/domain/payment-intents.js.map +0 -1
- package/node_modules/@pome-sh/twin-stripe/dist/src/domain/payment-methods.d.ts +0 -45
- package/node_modules/@pome-sh/twin-stripe/dist/src/domain/payment-methods.js +0 -159
- package/node_modules/@pome-sh/twin-stripe/dist/src/domain/payment-methods.js.map +0 -1
- package/node_modules/@pome-sh/twin-stripe/dist/src/domain/refunds.d.ts +0 -48
- package/node_modules/@pome-sh/twin-stripe/dist/src/domain/refunds.js +0 -111
- package/node_modules/@pome-sh/twin-stripe/dist/src/domain/refunds.js.map +0 -1
- package/node_modules/@pome-sh/twin-stripe/dist/src/domain/schema.d.ts +0 -9
- package/node_modules/@pome-sh/twin-stripe/dist/src/domain/schema.js +0 -275
- package/node_modules/@pome-sh/twin-stripe/dist/src/domain/schema.js.map +0 -1
- package/node_modules/@pome-sh/twin-stripe/dist/src/domain/stripe-domain.d.ts +0 -779
- package/node_modules/@pome-sh/twin-stripe/dist/src/domain/stripe-domain.js +0 -670
- package/node_modules/@pome-sh/twin-stripe/dist/src/domain/stripe-domain.js.map +0 -1
- package/node_modules/@pome-sh/twin-stripe/dist/src/errors.d.ts +0 -76
- package/node_modules/@pome-sh/twin-stripe/dist/src/errors.js +0 -99
- package/node_modules/@pome-sh/twin-stripe/dist/src/errors.js.map +0 -1
- package/node_modules/@pome-sh/twin-stripe/dist/src/idempotency.d.ts +0 -25
- package/node_modules/@pome-sh/twin-stripe/dist/src/idempotency.js +0 -235
- package/node_modules/@pome-sh/twin-stripe/dist/src/idempotency.js.map +0 -1
- package/node_modules/@pome-sh/twin-stripe/dist/src/ids.d.ts +0 -30
- package/node_modules/@pome-sh/twin-stripe/dist/src/ids.js +0 -58
- package/node_modules/@pome-sh/twin-stripe/dist/src/ids.js.map +0 -1
- package/node_modules/@pome-sh/twin-stripe/dist/src/index.d.ts +0 -11
- package/node_modules/@pome-sh/twin-stripe/dist/src/index.js +0 -16
- package/node_modules/@pome-sh/twin-stripe/dist/src/index.js.map +0 -1
- package/node_modules/@pome-sh/twin-stripe/dist/src/routes/_helpers.d.ts +0 -37
- package/node_modules/@pome-sh/twin-stripe/dist/src/routes/_helpers.js +0 -264
- package/node_modules/@pome-sh/twin-stripe/dist/src/routes/_helpers.js.map +0 -1
- package/node_modules/@pome-sh/twin-stripe/dist/src/routes/balance.d.ts +0 -4
- package/node_modules/@pome-sh/twin-stripe/dist/src/routes/balance.js +0 -14
- package/node_modules/@pome-sh/twin-stripe/dist/src/routes/balance.js.map +0 -1
- package/node_modules/@pome-sh/twin-stripe/dist/src/routes/billing.d.ts +0 -4
- package/node_modules/@pome-sh/twin-stripe/dist/src/routes/billing.js +0 -117
- package/node_modules/@pome-sh/twin-stripe/dist/src/routes/billing.js.map +0 -1
- package/node_modules/@pome-sh/twin-stripe/dist/src/routes/charges.d.ts +0 -4
- package/node_modules/@pome-sh/twin-stripe/dist/src/routes/charges.js +0 -15
- package/node_modules/@pome-sh/twin-stripe/dist/src/routes/charges.js.map +0 -1
- package/node_modules/@pome-sh/twin-stripe/dist/src/routes/customers.d.ts +0 -4
- package/node_modules/@pome-sh/twin-stripe/dist/src/routes/customers.js +0 -47
- package/node_modules/@pome-sh/twin-stripe/dist/src/routes/customers.js.map +0 -1
- package/node_modules/@pome-sh/twin-stripe/dist/src/routes/events.d.ts +0 -4
- package/node_modules/@pome-sh/twin-stripe/dist/src/routes/events.js +0 -14
- package/node_modules/@pome-sh/twin-stripe/dist/src/routes/events.js.map +0 -1
- package/node_modules/@pome-sh/twin-stripe/dist/src/routes/index.d.ts +0 -4
- package/node_modules/@pome-sh/twin-stripe/dist/src/routes/index.js +0 -36
- package/node_modules/@pome-sh/twin-stripe/dist/src/routes/index.js.map +0 -1
- package/node_modules/@pome-sh/twin-stripe/dist/src/routes/payment-intents.d.ts +0 -4
- package/node_modules/@pome-sh/twin-stripe/dist/src/routes/payment-intents.js +0 -81
- package/node_modules/@pome-sh/twin-stripe/dist/src/routes/payment-intents.js.map +0 -1
- package/node_modules/@pome-sh/twin-stripe/dist/src/routes/payment-methods.d.ts +0 -4
- package/node_modules/@pome-sh/twin-stripe/dist/src/routes/payment-methods.js +0 -33
- package/node_modules/@pome-sh/twin-stripe/dist/src/routes/payment-methods.js.map +0 -1
- package/node_modules/@pome-sh/twin-stripe/dist/src/routes/refunds.d.ts +0 -4
- package/node_modules/@pome-sh/twin-stripe/dist/src/routes/refunds.js +0 -63
- package/node_modules/@pome-sh/twin-stripe/dist/src/routes/refunds.js.map +0 -1
- package/node_modules/@pome-sh/twin-stripe/dist/src/seed.d.ts +0 -205
- package/node_modules/@pome-sh/twin-stripe/dist/src/seed.js +0 -226
- package/node_modules/@pome-sh/twin-stripe/dist/src/seed.js.map +0 -1
- package/node_modules/@pome-sh/twin-stripe/dist/src/serializers.d.ts +0 -347
- package/node_modules/@pome-sh/twin-stripe/dist/src/serializers.js +0 -483
- package/node_modules/@pome-sh/twin-stripe/dist/src/serializers.js.map +0 -1
- package/node_modules/@pome-sh/twin-stripe/dist/src/server.d.ts +0 -2
- package/node_modules/@pome-sh/twin-stripe/dist/src/server.js +0 -53
- package/node_modules/@pome-sh/twin-stripe/dist/src/server.js.map +0 -1
- package/node_modules/@pome-sh/twin-stripe/dist/src/session.d.ts +0 -8
- package/node_modules/@pome-sh/twin-stripe/dist/src/session.js +0 -113
- package/node_modules/@pome-sh/twin-stripe/dist/src/session.js.map +0 -1
- package/node_modules/@pome-sh/twin-stripe/dist/src/tools.d.ts +0 -254
- package/node_modules/@pome-sh/twin-stripe/dist/src/tools.js +0 -375
- package/node_modules/@pome-sh/twin-stripe/dist/src/tools.js.map +0 -1
- package/node_modules/@pome-sh/twin-stripe/dist/src/twin.d.ts +0 -42
- package/node_modules/@pome-sh/twin-stripe/dist/src/twin.js +0 -286
- package/node_modules/@pome-sh/twin-stripe/dist/src/twin.js.map +0 -1
- package/node_modules/@pome-sh/twin-stripe/dist/src/types.d.ts +0 -252
- package/node_modules/@pome-sh/twin-stripe/dist/src/types.js +0 -2
- package/node_modules/@pome-sh/twin-stripe/dist/src/types.js.map +0 -1
- package/node_modules/@pome-sh/twin-stripe/dist/src/upstream-types.d.ts +0 -22
- package/node_modules/@pome-sh/twin-stripe/dist/src/upstream-types.js +0 -2
- package/node_modules/@pome-sh/twin-stripe/dist/src/upstream-types.js.map +0 -1
- package/node_modules/@pome-sh/twin-stripe/dist/src/util.d.ts +0 -3
- package/node_modules/@pome-sh/twin-stripe/dist/src/util.js +0 -12
- package/node_modules/@pome-sh/twin-stripe/dist/src/util.js.map +0 -1
- package/node_modules/@pome-sh/twin-stripe/dist/src/x402.d.ts +0 -162
- package/node_modules/@pome-sh/twin-stripe/dist/src/x402.js +0 -506
- package/node_modules/@pome-sh/twin-stripe/dist/src/x402.js.map +0 -1
- package/node_modules/@pome-sh/twin-stripe/fidelity.inventory.json +0 -425
- package/node_modules/@pome-sh/twin-stripe/package.json +0 -64
- package/node_modules/graphql/LICENSE +0 -21
- package/node_modules/graphql/NotSupportedTSVersion.d.ts +0 -1
- package/node_modules/graphql/README.md +0 -203
- package/node_modules/graphql/error/GraphQLError.d.ts +0 -288
- package/node_modules/graphql/error/GraphQLError.js +0 -398
- package/node_modules/graphql/error/GraphQLError.mjs +0 -384
- package/node_modules/graphql/error/index.d.ts +0 -15
- package/node_modules/graphql/error/index.js +0 -41
- package/node_modules/graphql/error/index.mjs +0 -9
- package/node_modules/graphql/error/locatedError.d.ts +0 -33
- package/node_modules/graphql/error/locatedError.js +0 -61
- package/node_modules/graphql/error/locatedError.mjs +0 -52
- package/node_modules/graphql/error/syntaxError.d.ts +0 -26
- package/node_modules/graphql/error/syntaxError.js +0 -35
- package/node_modules/graphql/error/syntaxError.mjs +0 -27
- package/node_modules/graphql/execution/collectFields.d.ts +0 -45
- package/node_modules/graphql/execution/collectFields.js +0 -235
- package/node_modules/graphql/execution/collectFields.mjs +0 -219
- package/node_modules/graphql/execution/execute.d.ts +0 -402
- package/node_modules/graphql/execution/execute.js +0 -1295
- package/node_modules/graphql/execution/execute.mjs +0 -1266
- package/node_modules/graphql/execution/index.d.ts +0 -24
- package/node_modules/graphql/execution/index.js +0 -73
- package/node_modules/graphql/execution/index.mjs +0 -19
- package/node_modules/graphql/execution/mapAsyncIterator.d.ts +0 -11
- package/node_modules/graphql/execution/mapAsyncIterator.js +0 -70
- package/node_modules/graphql/execution/mapAsyncIterator.mjs +0 -63
- package/node_modules/graphql/execution/subscribe.d.ts +0 -262
- package/node_modules/graphql/execution/subscribe.js +0 -388
- package/node_modules/graphql/execution/subscribe.mjs +0 -366
- package/node_modules/graphql/execution/values.d.ts +0 -236
- package/node_modules/graphql/execution/values.js +0 -444
- package/node_modules/graphql/execution/values.mjs +0 -406
- package/node_modules/graphql/graphql.d.ts +0 -189
- package/node_modules/graphql/graphql.js +0 -218
- package/node_modules/graphql/graphql.mjs +0 -212
- package/node_modules/graphql/index.d.ts +0 -423
- package/node_modules/graphql/index.js +0 -1311
- package/node_modules/graphql/index.mjs +0 -256
- package/node_modules/graphql/jsutils/Maybe.d.ts +0 -6
- package/node_modules/graphql/jsutils/Maybe.js +0 -5
- package/node_modules/graphql/jsutils/Maybe.mjs +0 -1
- package/node_modules/graphql/jsutils/ObjMap.d.ts +0 -20
- package/node_modules/graphql/jsutils/ObjMap.js +0 -5
- package/node_modules/graphql/jsutils/ObjMap.mjs +0 -1
- package/node_modules/graphql/jsutils/Path.d.ts +0 -50
- package/node_modules/graphql/jsutils/Path.js +0 -62
- package/node_modules/graphql/jsutils/Path.mjs +0 -54
- package/node_modules/graphql/jsutils/PromiseOrValue.d.ts +0 -2
- package/node_modules/graphql/jsutils/PromiseOrValue.js +0 -5
- package/node_modules/graphql/jsutils/PromiseOrValue.mjs +0 -1
- package/node_modules/graphql/jsutils/devAssert.d.ts +0 -2
- package/node_modules/graphql/jsutils/devAssert.js +0 -15
- package/node_modules/graphql/jsutils/devAssert.mjs +0 -8
- package/node_modules/graphql/jsutils/didYouMean.d.ts +0 -11
- package/node_modules/graphql/jsutils/didYouMean.js +0 -41
- package/node_modules/graphql/jsutils/didYouMean.mjs +0 -35
- package/node_modules/graphql/jsutils/groupBy.d.ts +0 -9
- package/node_modules/graphql/jsutils/groupBy.js +0 -28
- package/node_modules/graphql/jsutils/groupBy.mjs +0 -21
- package/node_modules/graphql/jsutils/identityFunc.d.ts +0 -6
- package/node_modules/graphql/jsutils/identityFunc.js +0 -15
- package/node_modules/graphql/jsutils/identityFunc.mjs +0 -8
- package/node_modules/graphql/jsutils/inspect.d.ts +0 -6
- package/node_modules/graphql/jsutils/inspect.js +0 -123
- package/node_modules/graphql/jsutils/inspect.mjs +0 -117
- package/node_modules/graphql/jsutils/instanceOf.d.ts +0 -18
- package/node_modules/graphql/jsutils/instanceOf.js +0 -67
- package/node_modules/graphql/jsutils/instanceOf.mjs +0 -59
- package/node_modules/graphql/jsutils/invariant.d.ts +0 -5
- package/node_modules/graphql/jsutils/invariant.js +0 -17
- package/node_modules/graphql/jsutils/invariant.mjs +0 -10
- package/node_modules/graphql/jsutils/isAsyncIterable.d.ts +0 -9
- package/node_modules/graphql/jsutils/isAsyncIterable.js +0 -20
- package/node_modules/graphql/jsutils/isAsyncIterable.mjs +0 -13
- package/node_modules/graphql/jsutils/isIterableObject.d.ts +0 -21
- package/node_modules/graphql/jsutils/isIterableObject.js +0 -33
- package/node_modules/graphql/jsutils/isIterableObject.mjs +0 -26
- package/node_modules/graphql/jsutils/isObjectLike.d.ts +0 -9
- package/node_modules/graphql/jsutils/isObjectLike.js +0 -16
- package/node_modules/graphql/jsutils/isObjectLike.mjs +0 -9
- package/node_modules/graphql/jsutils/isPromise.d.ts +0 -7
- package/node_modules/graphql/jsutils/isPromise.js +0 -19
- package/node_modules/graphql/jsutils/isPromise.mjs +0 -12
- package/node_modules/graphql/jsutils/keyMap.d.ts +0 -25
- package/node_modules/graphql/jsutils/keyMap.js +0 -36
- package/node_modules/graphql/jsutils/keyMap.mjs +0 -29
- package/node_modules/graphql/jsutils/keyValMap.d.ts +0 -26
- package/node_modules/graphql/jsutils/keyValMap.js +0 -36
- package/node_modules/graphql/jsutils/keyValMap.mjs +0 -29
- package/node_modules/graphql/jsutils/mapValue.d.ts +0 -11
- package/node_modules/graphql/jsutils/mapValue.js +0 -22
- package/node_modules/graphql/jsutils/mapValue.mjs +0 -15
- package/node_modules/graphql/jsutils/memoize3.d.ts +0 -11
- package/node_modules/graphql/jsutils/memoize3.js +0 -43
- package/node_modules/graphql/jsutils/memoize3.mjs +0 -36
- package/node_modules/graphql/jsutils/naturalCompare.d.ts +0 -10
- package/node_modules/graphql/jsutils/naturalCompare.js +0 -71
- package/node_modules/graphql/jsutils/naturalCompare.mjs +0 -63
- package/node_modules/graphql/jsutils/printPathArray.d.ts +0 -8
- package/node_modules/graphql/jsutils/printPathArray.js +0 -19
- package/node_modules/graphql/jsutils/printPathArray.mjs +0 -12
- package/node_modules/graphql/jsutils/promiseForObject.d.ts +0 -13
- package/node_modules/graphql/jsutils/promiseForObject.js +0 -27
- package/node_modules/graphql/jsutils/promiseForObject.mjs +0 -20
- package/node_modules/graphql/jsutils/promiseReduce.d.ts +0 -15
- package/node_modules/graphql/jsutils/promiseReduce.js +0 -29
- package/node_modules/graphql/jsutils/promiseReduce.mjs +0 -22
- package/node_modules/graphql/jsutils/suggestionList.d.ts +0 -10
- package/node_modules/graphql/jsutils/suggestionList.js +0 -143
- package/node_modules/graphql/jsutils/suggestionList.mjs +0 -134
- package/node_modules/graphql/jsutils/toError.d.ts +0 -6
- package/node_modules/graphql/jsutils/toError.js +0 -27
- package/node_modules/graphql/jsutils/toError.mjs +0 -20
- package/node_modules/graphql/jsutils/toObjMap.d.ts +0 -6
- package/node_modules/graphql/jsutils/toObjMap.js +0 -25
- package/node_modules/graphql/jsutils/toObjMap.mjs +0 -18
- package/node_modules/graphql/language/ast.d.ts +0 -949
- package/node_modules/graphql/language/ast.js +0 -301
- package/node_modules/graphql/language/ast.mjs +0 -285
- package/node_modules/graphql/language/blockString.d.ts +0 -26
- package/node_modules/graphql/language/blockString.js +0 -193
- package/node_modules/graphql/language/blockString.mjs +0 -176
- package/node_modules/graphql/language/characterClasses.d.ts +0 -47
- package/node_modules/graphql/language/characterClasses.js +0 -75
- package/node_modules/graphql/language/characterClasses.mjs +0 -64
- package/node_modules/graphql/language/directiveLocation.d.ts +0 -54
- package/node_modules/graphql/language/directiveLocation.js +0 -43
- package/node_modules/graphql/language/directiveLocation.mjs +0 -37
- package/node_modules/graphql/language/index.d.ts +0 -117
- package/node_modules/graphql/language/index.js +0 -227
- package/node_modules/graphql/language/index.mjs +0 -42
- package/node_modules/graphql/language/kinds.d.ts +0 -112
- package/node_modules/graphql/language/kinds.js +0 -72
- package/node_modules/graphql/language/kinds.mjs +0 -66
- package/node_modules/graphql/language/lexer.d.ts +0 -129
- package/node_modules/graphql/language/lexer.js +0 -1074
- package/node_modules/graphql/language/lexer.mjs +0 -972
- package/node_modules/graphql/language/location.d.ts +0 -29
- package/node_modules/graphql/language/location.js +0 -49
- package/node_modules/graphql/language/location.mjs +0 -41
- package/node_modules/graphql/language/parser.d.ts +0 -829
- package/node_modules/graphql/language/parser.js +0 -1949
- package/node_modules/graphql/language/parser.mjs +0 -1899
- package/node_modules/graphql/language/predicates.d.ts +0 -206
- package/node_modules/graphql/language/predicates.js +0 -292
- package/node_modules/graphql/language/predicates.mjs +0 -274
- package/node_modules/graphql/language/printLocation.d.ts +0 -42
- package/node_modules/graphql/language/printLocation.js +0 -103
- package/node_modules/graphql/language/printLocation.mjs +0 -94
- package/node_modules/graphql/language/printString.d.ts +0 -7
- package/node_modules/graphql/language/printString.js +0 -187
- package/node_modules/graphql/language/printString.mjs +0 -180
- package/node_modules/graphql/language/printer.d.ts +0 -18
- package/node_modules/graphql/language/printer.js +0 -411
- package/node_modules/graphql/language/printer.mjs +0 -398
- package/node_modules/graphql/language/schemaCoordinateLexer.d.ts +0 -45
- package/node_modules/graphql/language/schemaCoordinateLexer.js +0 -175
- package/node_modules/graphql/language/schemaCoordinateLexer.mjs +0 -126
- package/node_modules/graphql/language/source.d.ts +0 -53
- package/node_modules/graphql/language/source.js +0 -97
- package/node_modules/graphql/language/source.mjs +0 -81
- package/node_modules/graphql/language/tokenKind.d.ts +0 -63
- package/node_modules/graphql/language/tokenKind.js +0 -49
- package/node_modules/graphql/language/tokenKind.mjs +0 -43
- package/node_modules/graphql/language/visitor.d.ts +0 -322
- package/node_modules/graphql/language/visitor.js +0 -446
- package/node_modules/graphql/language/visitor.mjs +0 -426
- package/node_modules/graphql/package.json +0 -39
- package/node_modules/graphql/subscription/index.d.ts +0 -25
- package/node_modules/graphql/subscription/index.js +0 -19
- package/node_modules/graphql/subscription/index.mjs +0 -25
- package/node_modules/graphql/type/assertName.d.ts +0 -27
- package/node_modules/graphql/type/assertName.js +0 -77
- package/node_modules/graphql/type/assertName.mjs +0 -61
- package/node_modules/graphql/type/definition.d.ts +0 -3387
- package/node_modules/graphql/type/definition.js +0 -3515
- package/node_modules/graphql/type/definition.mjs +0 -3378
- package/node_modules/graphql/type/directives.d.ts +0 -273
- package/node_modules/graphql/type/directives.js +0 -424
- package/node_modules/graphql/type/directives.mjs +0 -388
- package/node_modules/graphql/type/index.d.ts +0 -157
- package/node_modules/graphql/type/index.js +0 -553
- package/node_modules/graphql/type/index.mjs +0 -110
- package/node_modules/graphql/type/introspection.d.ts +0 -66
- package/node_modules/graphql/type/introspection.js +0 -681
- package/node_modules/graphql/type/introspection.mjs +0 -623
- package/node_modules/graphql/type/scalars.d.ts +0 -46
- package/node_modules/graphql/type/scalars.js +0 -404
- package/node_modules/graphql/type/scalars.mjs +0 -343
- package/node_modules/graphql/type/schema.d.ts +0 -632
- package/node_modules/graphql/type/schema.js +0 -860
- package/node_modules/graphql/type/schema.mjs +0 -839
- package/node_modules/graphql/type/validate.d.ts +0 -48
- package/node_modules/graphql/type/validate.js +0 -738
- package/node_modules/graphql/type/validate.mjs +0 -712
- package/node_modules/graphql/utilities/TypeInfo.d.ts +0 -507
- package/node_modules/graphql/utilities/TypeInfo.js +0 -861
- package/node_modules/graphql/utilities/TypeInfo.mjs +0 -837
- package/node_modules/graphql/utilities/assertValidName.d.ts +0 -38
- package/node_modules/graphql/utilities/assertValidName.js +0 -77
- package/node_modules/graphql/utilities/assertValidName.mjs +0 -65
- package/node_modules/graphql/utilities/astFromValue.d.ts +0 -58
- package/node_modules/graphql/utilities/astFromValue.js +0 -223
- package/node_modules/graphql/utilities/astFromValue.mjs +0 -209
- package/node_modules/graphql/utilities/buildASTSchema.d.ts +0 -94
- package/node_modules/graphql/utilities/buildASTSchema.js +0 -178
- package/node_modules/graphql/utilities/buildASTSchema.mjs +0 -160
- package/node_modules/graphql/utilities/buildClientSchema.d.ts +0 -34
- package/node_modules/graphql/utilities/buildClientSchema.js +0 -404
- package/node_modules/graphql/utilities/buildClientSchema.mjs +0 -380
- package/node_modules/graphql/utilities/coerceInputValue.d.ts +0 -62
- package/node_modules/graphql/utilities/coerceInputValue.js +0 -264
- package/node_modules/graphql/utilities/coerceInputValue.mjs +0 -238
- package/node_modules/graphql/utilities/concatAST.d.ts +0 -21
- package/node_modules/graphql/utilities/concatAST.js +0 -39
- package/node_modules/graphql/utilities/concatAST.mjs +0 -31
- package/node_modules/graphql/utilities/extendSchema.d.ts +0 -93
- package/node_modules/graphql/utilities/extendSchema.js +0 -923
- package/node_modules/graphql/utilities/extendSchema.mjs +0 -912
- package/node_modules/graphql/utilities/findBreakingChanges.d.ts +0 -148
- package/node_modules/graphql/utilities/findBreakingChanges.js +0 -615
- package/node_modules/graphql/utilities/findBreakingChanges.mjs +0 -589
- package/node_modules/graphql/utilities/getIntrospectionQuery.d.ts +0 -336
- package/node_modules/graphql/utilities/getIntrospectionQuery.js +0 -179
- package/node_modules/graphql/utilities/getIntrospectionQuery.mjs +0 -172
- package/node_modules/graphql/utilities/getOperationAST.d.ts +0 -26
- package/node_modules/graphql/utilities/getOperationAST.js +0 -59
- package/node_modules/graphql/utilities/getOperationAST.mjs +0 -51
- package/node_modules/graphql/utilities/getOperationRootType.d.ts +0 -32
- package/node_modules/graphql/utilities/getOperationRootType.js +0 -85
- package/node_modules/graphql/utilities/getOperationRootType.mjs +0 -71
- package/node_modules/graphql/utilities/index.d.ts +0 -73
- package/node_modules/graphql/utilities/index.js +0 -247
- package/node_modules/graphql/utilities/index.mjs +0 -67
- package/node_modules/graphql/utilities/introspectionFromSchema.d.ts +0 -72
- package/node_modules/graphql/utilities/introspectionFromSchema.js +0 -99
- package/node_modules/graphql/utilities/introspectionFromSchema.mjs +0 -86
- package/node_modules/graphql/utilities/lexicographicSortSchema.d.ts +0 -44
- package/node_modules/graphql/utilities/lexicographicSortSchema.js +0 -213
- package/node_modules/graphql/utilities/lexicographicSortSchema.mjs +0 -207
- package/node_modules/graphql/utilities/printSchema.d.ts +0 -68
- package/node_modules/graphql/utilities/printSchema.js +0 -405
- package/node_modules/graphql/utilities/printSchema.mjs +0 -382
- package/node_modules/graphql/utilities/resolveSchemaCoordinate.d.ts +0 -142
- package/node_modules/graphql/utilities/resolveSchemaCoordinate.js +0 -324
- package/node_modules/graphql/utilities/resolveSchemaCoordinate.mjs +0 -306
- package/node_modules/graphql/utilities/separateOperations.d.ts +0 -41
- package/node_modules/graphql/utilities/separateOperations.js +0 -119
- package/node_modules/graphql/utilities/separateOperations.mjs +0 -110
- package/node_modules/graphql/utilities/sortValueNode.d.ts +0 -9
- package/node_modules/graphql/utilities/sortValueNode.js +0 -47
- package/node_modules/graphql/utilities/sortValueNode.mjs +0 -39
- package/node_modules/graphql/utilities/stripIgnoredCharacters.d.ts +0 -69
- package/node_modules/graphql/utilities/stripIgnoredCharacters.js +0 -131
- package/node_modules/graphql/utilities/stripIgnoredCharacters.mjs +0 -113
- package/node_modules/graphql/utilities/typeComparators.d.ts +0 -116
- package/node_modules/graphql/utilities/typeComparators.js +0 -201
- package/node_modules/graphql/utilities/typeComparators.mjs +0 -190
- package/node_modules/graphql/utilities/typeFromAST.d.ts +0 -118
- package/node_modules/graphql/utilities/typeFromAST.js +0 -30
- package/node_modules/graphql/utilities/typeFromAST.mjs +0 -21
- package/node_modules/graphql/utilities/typedQueryDocumentNode.d.ts +0 -26
- package/node_modules/graphql/utilities/typedQueryDocumentNode.js +0 -5
- package/node_modules/graphql/utilities/typedQueryDocumentNode.mjs +0 -1
- package/node_modules/graphql/utilities/valueFromAST.d.ts +0 -67
- package/node_modules/graphql/utilities/valueFromAST.js +0 -246
- package/node_modules/graphql/utilities/valueFromAST.mjs +0 -232
- package/node_modules/graphql/utilities/valueFromASTUntyped.d.ts +0 -36
- package/node_modules/graphql/utilities/valueFromASTUntyped.js +0 -75
- package/node_modules/graphql/utilities/valueFromASTUntyped.mjs +0 -66
- package/node_modules/graphql/validation/ValidationContext.d.ts +0 -495
- package/node_modules/graphql/validation/ValidationContext.js +0 -633
- package/node_modules/graphql/validation/ValidationContext.mjs +0 -614
- package/node_modules/graphql/validation/index.d.ts +0 -47
- package/node_modules/graphql/validation/index.js +0 -331
- package/node_modules/graphql/validation/index.mjs +0 -75
- package/node_modules/graphql/validation/rules/ExecutableDefinitionsRule.d.ts +0 -41
- package/node_modules/graphql/validation/rules/ExecutableDefinitionsRule.js +0 -75
- package/node_modules/graphql/validation/rules/ExecutableDefinitionsRule.mjs +0 -62
- package/node_modules/graphql/validation/rules/FieldsOnCorrectTypeRule.d.ts +0 -41
- package/node_modules/graphql/validation/rules/FieldsOnCorrectTypeRule.js +0 -178
- package/node_modules/graphql/validation/rules/FieldsOnCorrectTypeRule.mjs +0 -159
- package/node_modules/graphql/validation/rules/FragmentsOnCompositeTypesRule.d.ts +0 -42
- package/node_modules/graphql/validation/rules/FragmentsOnCompositeTypesRule.js +0 -98
- package/node_modules/graphql/validation/rules/FragmentsOnCompositeTypesRule.mjs +0 -81
- package/node_modules/graphql/validation/rules/KnownArgumentNamesRule.d.ts +0 -49
- package/node_modules/graphql/validation/rules/KnownArgumentNamesRule.js +0 -147
- package/node_modules/graphql/validation/rules/KnownArgumentNamesRule.mjs +0 -128
- package/node_modules/graphql/validation/rules/KnownDirectivesRule.d.ts +0 -44
- package/node_modules/graphql/validation/rules/KnownDirectivesRule.js +0 -200
- package/node_modules/graphql/validation/rules/KnownDirectivesRule.mjs +0 -182
- package/node_modules/graphql/validation/rules/KnownFragmentNamesRule.d.ts +0 -41
- package/node_modules/graphql/validation/rules/KnownFragmentNamesRule.js +0 -65
- package/node_modules/graphql/validation/rules/KnownFragmentNamesRule.mjs +0 -54
- package/node_modules/graphql/validation/rules/KnownTypeNamesRule.d.ts +0 -44
- package/node_modules/graphql/validation/rules/KnownTypeNamesRule.js +0 -118
- package/node_modules/graphql/validation/rules/KnownTypeNamesRule.mjs +0 -105
- package/node_modules/graphql/validation/rules/LoneAnonymousOperationRule.d.ts +0 -41
- package/node_modules/graphql/validation/rules/LoneAnonymousOperationRule.js +0 -71
- package/node_modules/graphql/validation/rules/LoneAnonymousOperationRule.mjs +0 -62
- package/node_modules/graphql/validation/rules/LoneSchemaDefinitionRule.d.ts +0 -31
- package/node_modules/graphql/validation/rules/LoneSchemaDefinitionRule.js +0 -89
- package/node_modules/graphql/validation/rules/LoneSchemaDefinitionRule.mjs +0 -78
- package/node_modules/graphql/validation/rules/MaxIntrospectionDepthRule.d.ts +0 -36
- package/node_modules/graphql/validation/rules/MaxIntrospectionDepthRule.js +0 -123
- package/node_modules/graphql/validation/rules/MaxIntrospectionDepthRule.mjs +0 -111
- package/node_modules/graphql/validation/rules/NoFragmentCyclesRule.d.ts +0 -41
- package/node_modules/graphql/validation/rules/NoFragmentCyclesRule.js +0 -114
- package/node_modules/graphql/validation/rules/NoFragmentCyclesRule.mjs +0 -106
- package/node_modules/graphql/validation/rules/NoUndefinedVariablesRule.d.ts +0 -41
- package/node_modules/graphql/validation/rules/NoUndefinedVariablesRule.js +0 -81
- package/node_modules/graphql/validation/rules/NoUndefinedVariablesRule.mjs +0 -73
- package/node_modules/graphql/validation/rules/NoUnusedFragmentsRule.d.ts +0 -41
- package/node_modules/graphql/validation/rules/NoUnusedFragmentsRule.js +0 -90
- package/node_modules/graphql/validation/rules/NoUnusedFragmentsRule.mjs +0 -79
- package/node_modules/graphql/validation/rules/NoUnusedVariablesRule.d.ts +0 -42
- package/node_modules/graphql/validation/rules/NoUnusedVariablesRule.js +0 -87
- package/node_modules/graphql/validation/rules/NoUnusedVariablesRule.mjs +0 -79
- package/node_modules/graphql/validation/rules/OverlappingFieldsCanBeMergedRule.d.ts +0 -47
- package/node_modules/graphql/validation/rules/OverlappingFieldsCanBeMergedRule.js +0 -907
- package/node_modules/graphql/validation/rules/OverlappingFieldsCanBeMergedRule.mjs +0 -892
- package/node_modules/graphql/validation/rules/PossibleFragmentSpreadsRule.d.ts +0 -48
- package/node_modules/graphql/validation/rules/PossibleFragmentSpreadsRule.js +0 -132
- package/node_modules/graphql/validation/rules/PossibleFragmentSpreadsRule.mjs +0 -109
- package/node_modules/graphql/validation/rules/PossibleTypeExtensionsRule.d.ts +0 -31
- package/node_modules/graphql/validation/rules/PossibleTypeExtensionsRule.js +0 -193
- package/node_modules/graphql/validation/rules/PossibleTypeExtensionsRule.mjs +0 -169
- package/node_modules/graphql/validation/rules/ProvidedRequiredArgumentsRule.d.ts +0 -46
- package/node_modules/graphql/validation/rules/ProvidedRequiredArgumentsRule.js +0 -189
- package/node_modules/graphql/validation/rules/ProvidedRequiredArgumentsRule.mjs +0 -168
- package/node_modules/graphql/validation/rules/ScalarLeafsRule.d.ts +0 -37
- package/node_modules/graphql/validation/rules/ScalarLeafsRule.js +0 -95
- package/node_modules/graphql/validation/rules/ScalarLeafsRule.mjs +0 -85
- package/node_modules/graphql/validation/rules/SingleFieldSubscriptionsRule.d.ts +0 -46
- package/node_modules/graphql/validation/rules/SingleFieldSubscriptionsRule.js +0 -120
- package/node_modules/graphql/validation/rules/SingleFieldSubscriptionsRule.mjs +0 -110
- package/node_modules/graphql/validation/rules/UniqueArgumentDefinitionNamesRule.d.ts +0 -32
- package/node_modules/graphql/validation/rules/UniqueArgumentDefinitionNamesRule.js +0 -114
- package/node_modules/graphql/validation/rules/UniqueArgumentDefinitionNamesRule.mjs +0 -102
- package/node_modules/graphql/validation/rules/UniqueArgumentNamesRule.d.ts +0 -41
- package/node_modules/graphql/validation/rules/UniqueArgumentNamesRule.js +0 -84
- package/node_modules/graphql/validation/rules/UniqueArgumentNamesRule.mjs +0 -72
- package/node_modules/graphql/validation/rules/UniqueDirectiveNamesRule.d.ts +0 -31
- package/node_modules/graphql/validation/rules/UniqueDirectiveNamesRule.js +0 -76
- package/node_modules/graphql/validation/rules/UniqueDirectiveNamesRule.mjs +0 -68
- package/node_modules/graphql/validation/rules/UniqueDirectivesPerLocationRule.d.ts +0 -44
- package/node_modules/graphql/validation/rules/UniqueDirectivesPerLocationRule.js +0 -136
- package/node_modules/graphql/validation/rules/UniqueDirectivesPerLocationRule.mjs +0 -125
- package/node_modules/graphql/validation/rules/UniqueEnumValueNamesRule.d.ts +0 -31
- package/node_modules/graphql/validation/rules/UniqueEnumValueNamesRule.js +0 -97
- package/node_modules/graphql/validation/rules/UniqueEnumValueNamesRule.mjs +0 -85
- package/node_modules/graphql/validation/rules/UniqueFieldDefinitionNamesRule.d.ts +0 -31
- package/node_modules/graphql/validation/rules/UniqueFieldDefinitionNamesRule.js +0 -109
- package/node_modules/graphql/validation/rules/UniqueFieldDefinitionNamesRule.mjs +0 -100
- package/node_modules/graphql/validation/rules/UniqueFragmentNamesRule.d.ts +0 -40
- package/node_modules/graphql/validation/rules/UniqueFragmentNamesRule.js +0 -70
- package/node_modules/graphql/validation/rules/UniqueFragmentNamesRule.mjs +0 -62
- package/node_modules/graphql/validation/rules/UniqueInputFieldNamesRule.d.ts +0 -45
- package/node_modules/graphql/validation/rules/UniqueInputFieldNamesRule.js +0 -87
- package/node_modules/graphql/validation/rules/UniqueInputFieldNamesRule.mjs +0 -78
- package/node_modules/graphql/validation/rules/UniqueOperationNamesRule.d.ts +0 -40
- package/node_modules/graphql/validation/rules/UniqueOperationNamesRule.js +0 -75
- package/node_modules/graphql/validation/rules/UniqueOperationNamesRule.mjs +0 -67
- package/node_modules/graphql/validation/rules/UniqueOperationTypesRule.d.ts +0 -31
- package/node_modules/graphql/validation/rules/UniqueOperationTypesRule.js +0 -93
- package/node_modules/graphql/validation/rules/UniqueOperationTypesRule.mjs +0 -85
- package/node_modules/graphql/validation/rules/UniqueTypeNamesRule.d.ts +0 -31
- package/node_modules/graphql/validation/rules/UniqueTypeNamesRule.js +0 -79
- package/node_modules/graphql/validation/rules/UniqueTypeNamesRule.mjs +0 -68
- package/node_modules/graphql/validation/rules/UniqueVariableNamesRule.d.ts +0 -38
- package/node_modules/graphql/validation/rules/UniqueVariableNamesRule.js +0 -78
- package/node_modules/graphql/validation/rules/UniqueVariableNamesRule.mjs +0 -69
- package/node_modules/graphql/validation/rules/ValuesOfCorrectTypeRule.d.ts +0 -41
- package/node_modules/graphql/validation/rules/ValuesOfCorrectTypeRule.js +0 -271
- package/node_modules/graphql/validation/rules/ValuesOfCorrectTypeRule.mjs +0 -247
- package/node_modules/graphql/validation/rules/VariablesAreInputTypesRule.d.ts +0 -45
- package/node_modules/graphql/validation/rules/VariablesAreInputTypesRule.js +0 -79
- package/node_modules/graphql/validation/rules/VariablesAreInputTypesRule.mjs +0 -65
- package/node_modules/graphql/validation/rules/VariablesInAllowedPositionRule.d.ts +0 -40
- package/node_modules/graphql/validation/rules/VariablesInAllowedPositionRule.js +0 -165
- package/node_modules/graphql/validation/rules/VariablesInAllowedPositionRule.mjs +0 -149
- package/node_modules/graphql/validation/rules/custom/NoDeprecatedCustomRule.d.ts +0 -56
- package/node_modules/graphql/validation/rules/custom/NoDeprecatedCustomRule.js +0 -173
- package/node_modules/graphql/validation/rules/custom/NoDeprecatedCustomRule.mjs +0 -158
- package/node_modules/graphql/validation/rules/custom/NoSchemaIntrospectionCustomRule.d.ts +0 -43
- package/node_modules/graphql/validation/rules/custom/NoSchemaIntrospectionCustomRule.js +0 -70
- package/node_modules/graphql/validation/rules/custom/NoSchemaIntrospectionCustomRule.mjs +0 -60
- package/node_modules/graphql/validation/specifiedRules.d.ts +0 -17
- package/node_modules/graphql/validation/specifiedRules.js +0 -175
- package/node_modules/graphql/validation/specifiedRules.mjs +0 -131
- package/node_modules/graphql/validation/validate.d.ts +0 -122
- package/node_modules/graphql/validation/validate.js +0 -219
- package/node_modules/graphql/validation/validate.mjs +0 -200
- package/node_modules/graphql/version.d.ts +0 -10
- package/node_modules/graphql/version.js +0 -23
- package/node_modules/graphql/version.mjs +0 -14
- package/node_modules/hono/LICENSE +0 -21
- package/node_modules/hono/README.md +0 -85
- package/node_modules/hono/dist/adapter/aws-lambda/conninfo.js +0 -24
- package/node_modules/hono/dist/adapter/aws-lambda/handler.js +0 -364
- package/node_modules/hono/dist/adapter/aws-lambda/index.js +0 -9
- package/node_modules/hono/dist/adapter/aws-lambda/types.js +0 -0
- package/node_modules/hono/dist/adapter/bun/conninfo.js +0 -27
- package/node_modules/hono/dist/adapter/bun/index.js +0 -16
- package/node_modules/hono/dist/adapter/bun/serve-static.js +0 -30
- package/node_modules/hono/dist/adapter/bun/server.js +0 -5
- package/node_modules/hono/dist/adapter/bun/ssg.js +0 -17
- package/node_modules/hono/dist/adapter/bun/websocket.js +0 -73
- package/node_modules/hono/dist/adapter/cloudflare-pages/conninfo.js +0 -9
- package/node_modules/hono/dist/adapter/cloudflare-pages/handler.js +0 -67
- package/node_modules/hono/dist/adapter/cloudflare-pages/index.js +0 -9
- package/node_modules/hono/dist/adapter/cloudflare-workers/conninfo.js +0 -9
- package/node_modules/hono/dist/adapter/cloudflare-workers/index.js +0 -9
- package/node_modules/hono/dist/adapter/cloudflare-workers/serve-static-module.js +0 -8
- package/node_modules/hono/dist/adapter/cloudflare-workers/serve-static.js +0 -22
- package/node_modules/hono/dist/adapter/cloudflare-workers/utils.js +0 -35
- package/node_modules/hono/dist/adapter/cloudflare-workers/websocket.js +0 -41
- package/node_modules/hono/dist/adapter/deno/conninfo.js +0 -14
- package/node_modules/hono/dist/adapter/deno/deno.d.js +0 -0
- package/node_modules/hono/dist/adapter/deno/index.js +0 -12
- package/node_modules/hono/dist/adapter/deno/serve-static.js +0 -40
- package/node_modules/hono/dist/adapter/deno/ssg.js +0 -18
- package/node_modules/hono/dist/adapter/deno/websocket.js +0 -32
- package/node_modules/hono/dist/adapter/lambda-edge/conninfo.js +0 -9
- package/node_modules/hono/dist/adapter/lambda-edge/handler.js +0 -96
- package/node_modules/hono/dist/adapter/lambda-edge/index.js +0 -7
- package/node_modules/hono/dist/adapter/netlify/conninfo.js +0 -9
- package/node_modules/hono/dist/adapter/netlify/handler.js +0 -9
- package/node_modules/hono/dist/adapter/netlify/index.js +0 -2
- package/node_modules/hono/dist/adapter/netlify/mod.js +0 -7
- package/node_modules/hono/dist/adapter/service-worker/handler.js +0 -20
- package/node_modules/hono/dist/adapter/service-worker/index.js +0 -9
- package/node_modules/hono/dist/adapter/service-worker/types.js +0 -0
- package/node_modules/hono/dist/adapter/vercel/conninfo.js +0 -10
- package/node_modules/hono/dist/adapter/vercel/handler.js +0 -7
- package/node_modules/hono/dist/adapter/vercel/index.js +0 -7
- package/node_modules/hono/dist/cjs/adapter/aws-lambda/conninfo.js +0 -46
- package/node_modules/hono/dist/cjs/adapter/aws-lambda/handler.js +0 -395
- package/node_modules/hono/dist/cjs/adapter/aws-lambda/index.js +0 -34
- package/node_modules/hono/dist/cjs/adapter/aws-lambda/types.js +0 -15
- package/node_modules/hono/dist/cjs/adapter/bun/conninfo.js +0 -49
- package/node_modules/hono/dist/cjs/adapter/bun/index.js +0 -45
- package/node_modules/hono/dist/cjs/adapter/bun/serve-static.js +0 -52
- package/node_modules/hono/dist/cjs/adapter/bun/server.js +0 -27
- package/node_modules/hono/dist/cjs/adapter/bun/ssg.js +0 -40
- package/node_modules/hono/dist/cjs/adapter/bun/websocket.js +0 -98
- package/node_modules/hono/dist/cjs/adapter/cloudflare-pages/conninfo.js +0 -31
- package/node_modules/hono/dist/cjs/adapter/cloudflare-pages/handler.js +0 -91
- package/node_modules/hono/dist/cjs/adapter/cloudflare-pages/index.js +0 -34
- package/node_modules/hono/dist/cjs/adapter/cloudflare-workers/conninfo.js +0 -31
- package/node_modules/hono/dist/cjs/adapter/cloudflare-workers/index.js +0 -33
- package/node_modules/hono/dist/cjs/adapter/cloudflare-workers/serve-static-module.js +0 -30
- package/node_modules/hono/dist/cjs/adapter/cloudflare-workers/serve-static.js +0 -44
- package/node_modules/hono/dist/cjs/adapter/cloudflare-workers/utils.js +0 -57
- package/node_modules/hono/dist/cjs/adapter/cloudflare-workers/websocket.js +0 -63
- package/node_modules/hono/dist/cjs/adapter/deno/conninfo.js +0 -36
- package/node_modules/hono/dist/cjs/adapter/deno/deno.d.js +0 -0
- package/node_modules/hono/dist/cjs/adapter/deno/index.js +0 -38
- package/node_modules/hono/dist/cjs/adapter/deno/serve-static.js +0 -62
- package/node_modules/hono/dist/cjs/adapter/deno/ssg.js +0 -41
- package/node_modules/hono/dist/cjs/adapter/deno/websocket.js +0 -54
- package/node_modules/hono/dist/cjs/adapter/lambda-edge/conninfo.js +0 -31
- package/node_modules/hono/dist/cjs/adapter/lambda-edge/handler.js +0 -130
- package/node_modules/hono/dist/cjs/adapter/lambda-edge/index.js +0 -30
- package/node_modules/hono/dist/cjs/adapter/netlify/conninfo.js +0 -31
- package/node_modules/hono/dist/cjs/adapter/netlify/handler.js +0 -31
- package/node_modules/hono/dist/cjs/adapter/netlify/index.js +0 -21
- package/node_modules/hono/dist/cjs/adapter/netlify/mod.js +0 -30
- package/node_modules/hono/dist/cjs/adapter/service-worker/handler.js +0 -42
- package/node_modules/hono/dist/cjs/adapter/service-worker/index.js +0 -32
- package/node_modules/hono/dist/cjs/adapter/service-worker/types.js +0 -15
- package/node_modules/hono/dist/cjs/adapter/vercel/conninfo.js +0 -32
- package/node_modules/hono/dist/cjs/adapter/vercel/handler.js +0 -29
- package/node_modules/hono/dist/cjs/adapter/vercel/index.js +0 -30
- package/node_modules/hono/dist/cjs/client/client.js +0 -204
- package/node_modules/hono/dist/cjs/client/fetch-result-please.js +0 -85
- package/node_modules/hono/dist/cjs/client/index.js +0 -32
- package/node_modules/hono/dist/cjs/client/types.js +0 -15
- package/node_modules/hono/dist/cjs/client/utils.js +0 -105
- package/node_modules/hono/dist/cjs/compose.js +0 -68
- package/node_modules/hono/dist/cjs/context.js +0 -435
- package/node_modules/hono/dist/cjs/helper/accepts/accepts.js +0 -43
- package/node_modules/hono/dist/cjs/helper/accepts/index.js +0 -27
- package/node_modules/hono/dist/cjs/helper/adapter/index.js +0 -81
- package/node_modules/hono/dist/cjs/helper/conninfo/index.js +0 -15
- package/node_modules/hono/dist/cjs/helper/conninfo/types.js +0 -15
- package/node_modules/hono/dist/cjs/helper/cookie/index.js +0 -130
- package/node_modules/hono/dist/cjs/helper/css/common.js +0 -273
- package/node_modules/hono/dist/cjs/helper/css/index.js +0 -157
- package/node_modules/hono/dist/cjs/helper/dev/index.js +0 -79
- package/node_modules/hono/dist/cjs/helper/factory/index.js +0 -54
- package/node_modules/hono/dist/cjs/helper/html/index.js +0 -64
- package/node_modules/hono/dist/cjs/helper/proxy/index.js +0 -111
- package/node_modules/hono/dist/cjs/helper/route/index.js +0 -71
- package/node_modules/hono/dist/cjs/helper/ssg/index.js +0 -43
- package/node_modules/hono/dist/cjs/helper/ssg/middleware.js +0 -73
- package/node_modules/hono/dist/cjs/helper/ssg/plugins.js +0 -70
- package/node_modules/hono/dist/cjs/helper/ssg/ssg.js +0 -320
- package/node_modules/hono/dist/cjs/helper/ssg/utils.js +0 -93
- package/node_modules/hono/dist/cjs/helper/streaming/index.js +0 -35
- package/node_modules/hono/dist/cjs/helper/streaming/sse.js +0 -91
- package/node_modules/hono/dist/cjs/helper/streaming/stream.js +0 -56
- package/node_modules/hono/dist/cjs/helper/streaming/text.js +0 -34
- package/node_modules/hono/dist/cjs/helper/streaming/utils.js +0 -35
- package/node_modules/hono/dist/cjs/helper/testing/index.js +0 -33
- package/node_modules/hono/dist/cjs/helper/websocket/index.js +0 -81
- package/node_modules/hono/dist/cjs/hono-base.js +0 -405
- package/node_modules/hono/dist/cjs/hono.js +0 -43
- package/node_modules/hono/dist/cjs/http-exception.js +0 -57
- package/node_modules/hono/dist/cjs/index.js +0 -30
- package/node_modules/hono/dist/cjs/jsx/base.js +0 -374
- package/node_modules/hono/dist/cjs/jsx/children.js +0 -44
- package/node_modules/hono/dist/cjs/jsx/components.js +0 -221
- package/node_modules/hono/dist/cjs/jsx/constants.js +0 -42
- package/node_modules/hono/dist/cjs/jsx/context.js +0 -188
- package/node_modules/hono/dist/cjs/jsx/dom/client.js +0 -76
- package/node_modules/hono/dist/cjs/jsx/dom/components.js +0 -55
- package/node_modules/hono/dist/cjs/jsx/dom/context.js +0 -71
- package/node_modules/hono/dist/cjs/jsx/dom/css.js +0 -168
- package/node_modules/hono/dist/cjs/jsx/dom/hooks/index.js +0 -74
- package/node_modules/hono/dist/cjs/jsx/dom/index.js +0 -181
- package/node_modules/hono/dist/cjs/jsx/dom/intrinsic-element/components.js +0 -399
- package/node_modules/hono/dist/cjs/jsx/dom/jsx-dev-runtime.js +0 -52
- package/node_modules/hono/dist/cjs/jsx/dom/jsx-runtime.js +0 -32
- package/node_modules/hono/dist/cjs/jsx/dom/render.js +0 -641
- package/node_modules/hono/dist/cjs/jsx/dom/server.js +0 -67
- package/node_modules/hono/dist/cjs/jsx/dom/utils.js +0 -32
- package/node_modules/hono/dist/cjs/jsx/hooks/index.js +0 -370
- package/node_modules/hono/dist/cjs/jsx/index.js +0 -138
- package/node_modules/hono/dist/cjs/jsx/intrinsic-element/common.js +0 -50
- package/node_modules/hono/dist/cjs/jsx/intrinsic-element/components.js +0 -189
- package/node_modules/hono/dist/cjs/jsx/intrinsic-elements.js +0 -15
- package/node_modules/hono/dist/cjs/jsx/jsx-dev-runtime.js +0 -41
- package/node_modules/hono/dist/cjs/jsx/jsx-runtime.js +0 -71
- package/node_modules/hono/dist/cjs/jsx/streaming.js +0 -179
- package/node_modules/hono/dist/cjs/jsx/types.js +0 -15
- package/node_modules/hono/dist/cjs/jsx/utils.js +0 -200
- package/node_modules/hono/dist/cjs/middleware/basic-auth/index.js +0 -88
- package/node_modules/hono/dist/cjs/middleware/bearer-auth/index.js +0 -114
- package/node_modules/hono/dist/cjs/middleware/body-limit/index.js +0 -75
- package/node_modules/hono/dist/cjs/middleware/cache/index.js +0 -124
- package/node_modules/hono/dist/cjs/middleware/combine/index.js +0 -101
- package/node_modules/hono/dist/cjs/middleware/compress/index.js +0 -92
- package/node_modules/hono/dist/cjs/middleware/context-storage/index.js +0 -47
- package/node_modules/hono/dist/cjs/middleware/cors/index.js +0 -106
- package/node_modules/hono/dist/cjs/middleware/csrf/index.js +0 -77
- package/node_modules/hono/dist/cjs/middleware/etag/digest.js +0 -55
- package/node_modules/hono/dist/cjs/middleware/etag/index.js +0 -96
- package/node_modules/hono/dist/cjs/middleware/ip-restriction/index.js +0 -176
- package/node_modules/hono/dist/cjs/middleware/jsx-renderer/index.js +0 -82
- package/node_modules/hono/dist/cjs/middleware/jwk/index.js +0 -27
- package/node_modules/hono/dist/cjs/middleware/jwk/jwk.js +0 -134
- package/node_modules/hono/dist/cjs/middleware/jwt/index.js +0 -38
- package/node_modules/hono/dist/cjs/middleware/jwt/jwt.js +0 -140
- package/node_modules/hono/dist/cjs/middleware/language/index.js +0 -35
- package/node_modules/hono/dist/cjs/middleware/language/language.js +0 -199
- package/node_modules/hono/dist/cjs/middleware/logger/index.js +0 -72
- package/node_modules/hono/dist/cjs/middleware/method-override/index.js +0 -106
- package/node_modules/hono/dist/cjs/middleware/powered-by/index.js +0 -32
- package/node_modules/hono/dist/cjs/middleware/pretty-json/index.js +0 -37
- package/node_modules/hono/dist/cjs/middleware/request-id/index.js +0 -27
- package/node_modules/hono/dist/cjs/middleware/request-id/request-id.js +0 -43
- package/node_modules/hono/dist/cjs/middleware/secure-headers/index.js +0 -29
- package/node_modules/hono/dist/cjs/middleware/secure-headers/permissions-policy.js +0 -15
- package/node_modules/hono/dist/cjs/middleware/secure-headers/secure-headers.js +0 -195
- package/node_modules/hono/dist/cjs/middleware/serve-static/index.js +0 -99
- package/node_modules/hono/dist/cjs/middleware/serve-static/path.js +0 -40
- package/node_modules/hono/dist/cjs/middleware/timeout/index.js +0 -47
- package/node_modules/hono/dist/cjs/middleware/timing/index.js +0 -35
- package/node_modules/hono/dist/cjs/middleware/timing/timing.js +0 -130
- package/node_modules/hono/dist/cjs/middleware/trailing-slash/index.js +0 -62
- package/node_modules/hono/dist/cjs/package.json +0 -3
- package/node_modules/hono/dist/cjs/preset/quick.js +0 -38
- package/node_modules/hono/dist/cjs/preset/tiny.js +0 -34
- package/node_modules/hono/dist/cjs/request/constants.js +0 -27
- package/node_modules/hono/dist/cjs/request.js +0 -344
- package/node_modules/hono/dist/cjs/router/linear-router/index.js +0 -27
- package/node_modules/hono/dist/cjs/router/linear-router/router.js +0 -140
- package/node_modules/hono/dist/cjs/router/pattern-router/index.js +0 -27
- package/node_modules/hono/dist/cjs/router/pattern-router/router.js +0 -70
- package/node_modules/hono/dist/cjs/router/reg-exp-router/index.js +0 -34
- package/node_modules/hono/dist/cjs/router/reg-exp-router/matcher.js +0 -48
- package/node_modules/hono/dist/cjs/router/reg-exp-router/node.js +0 -134
- package/node_modules/hono/dist/cjs/router/reg-exp-router/prepared-router.js +0 -166
- package/node_modules/hono/dist/cjs/router/reg-exp-router/router.js +0 -208
- package/node_modules/hono/dist/cjs/router/reg-exp-router/trie.js +0 -81
- package/node_modules/hono/dist/cjs/router/smart-router/index.js +0 -27
- package/node_modules/hono/dist/cjs/router/smart-router/router.js +0 -80
- package/node_modules/hono/dist/cjs/router/trie-router/index.js +0 -27
- package/node_modules/hono/dist/cjs/router/trie-router/node.js +0 -210
- package/node_modules/hono/dist/cjs/router/trie-router/router.js +0 -48
- package/node_modules/hono/dist/cjs/router.js +0 -40
- package/node_modules/hono/dist/cjs/types.js +0 -28
- package/node_modules/hono/dist/cjs/utils/accept.js +0 -245
- package/node_modules/hono/dist/cjs/utils/basic-auth.js +0 -45
- package/node_modules/hono/dist/cjs/utils/body.js +0 -111
- package/node_modules/hono/dist/cjs/utils/buffer.js +0 -103
- package/node_modules/hono/dist/cjs/utils/color.js +0 -48
- package/node_modules/hono/dist/cjs/utils/compress.js +0 -27
- package/node_modules/hono/dist/cjs/utils/concurrent.js +0 -61
- package/node_modules/hono/dist/cjs/utils/constants.js +0 -27
- package/node_modules/hono/dist/cjs/utils/cookie.js +0 -198
- package/node_modules/hono/dist/cjs/utils/crypto.js +0 -69
- package/node_modules/hono/dist/cjs/utils/encode.js +0 -54
- package/node_modules/hono/dist/cjs/utils/filepath.js +0 -58
- package/node_modules/hono/dist/cjs/utils/handler.js +0 -36
- package/node_modules/hono/dist/cjs/utils/headers.js +0 -15
- package/node_modules/hono/dist/cjs/utils/html.js +0 -150
- package/node_modules/hono/dist/cjs/utils/http-status.js +0 -15
- package/node_modules/hono/dist/cjs/utils/ipaddr.js +0 -318
- package/node_modules/hono/dist/cjs/utils/jwt/index.js +0 -28
- package/node_modules/hono/dist/cjs/utils/jwt/jwa.js +0 -42
- package/node_modules/hono/dist/cjs/utils/jwt/jws.js +0 -215
- package/node_modules/hono/dist/cjs/utils/jwt/jwt.js +0 -219
- package/node_modules/hono/dist/cjs/utils/jwt/types.js +0 -161
- package/node_modules/hono/dist/cjs/utils/jwt/utf8.js +0 -30
- package/node_modules/hono/dist/cjs/utils/mime.js +0 -106
- package/node_modules/hono/dist/cjs/utils/stream.js +0 -103
- package/node_modules/hono/dist/cjs/utils/types.js +0 -15
- package/node_modules/hono/dist/cjs/utils/url.js +0 -256
- package/node_modules/hono/dist/cjs/validator/index.js +0 -27
- package/node_modules/hono/dist/cjs/validator/utils.js +0 -15
- package/node_modules/hono/dist/cjs/validator/validator.js +0 -108
- package/node_modules/hono/dist/client/client.js +0 -189
- package/node_modules/hono/dist/client/fetch-result-please.js +0 -62
- package/node_modules/hono/dist/client/index.js +0 -8
- package/node_modules/hono/dist/client/types.js +0 -0
- package/node_modules/hono/dist/client/utils.js +0 -76
- package/node_modules/hono/dist/compose.js +0 -46
- package/node_modules/hono/dist/context.js +0 -412
- package/node_modules/hono/dist/helper/accepts/accepts.js +0 -20
- package/node_modules/hono/dist/helper/accepts/index.js +0 -5
- package/node_modules/hono/dist/helper/adapter/index.js +0 -56
- package/node_modules/hono/dist/helper/conninfo/index.js +0 -0
- package/node_modules/hono/dist/helper/conninfo/types.js +0 -0
- package/node_modules/hono/dist/helper/cookie/index.js +0 -102
- package/node_modules/hono/dist/helper/css/common.js +0 -236
- package/node_modules/hono/dist/helper/css/index.js +0 -140
- package/node_modules/hono/dist/helper/dev/index.js +0 -55
- package/node_modules/hono/dist/helper/factory/index.js +0 -30
- package/node_modules/hono/dist/helper/html/index.js +0 -41
- package/node_modules/hono/dist/helper/proxy/index.js +0 -89
- package/node_modules/hono/dist/helper/route/index.js +0 -46
- package/node_modules/hono/dist/helper/ssg/index.js +0 -19
- package/node_modules/hono/dist/helper/ssg/middleware.js +0 -45
- package/node_modules/hono/dist/helper/ssg/plugins.js +0 -47
- package/node_modules/hono/dist/helper/ssg/ssg.js +0 -297
- package/node_modules/hono/dist/helper/ssg/utils.js +0 -67
- package/node_modules/hono/dist/helper/streaming/index.js +0 -10
- package/node_modules/hono/dist/helper/streaming/sse.js +0 -68
- package/node_modules/hono/dist/helper/streaming/stream.js +0 -34
- package/node_modules/hono/dist/helper/streaming/text.js +0 -12
- package/node_modules/hono/dist/helper/streaming/utils.js +0 -13
- package/node_modules/hono/dist/helper/testing/index.js +0 -11
- package/node_modules/hono/dist/helper/websocket/index.js +0 -57
- package/node_modules/hono/dist/hono-base.js +0 -383
- package/node_modules/hono/dist/hono.js +0 -21
- package/node_modules/hono/dist/http-exception.js +0 -35
- package/node_modules/hono/dist/index.js +0 -7
- package/node_modules/hono/dist/jsx/base.js +0 -342
- package/node_modules/hono/dist/jsx/children.js +0 -21
- package/node_modules/hono/dist/jsx/components.js +0 -198
- package/node_modules/hono/dist/jsx/constants.js +0 -15
- package/node_modules/hono/dist/jsx/context.js +0 -162
- package/node_modules/hono/dist/jsx/dom/client.js +0 -53
- package/node_modules/hono/dist/jsx/dom/components.js +0 -32
- package/node_modules/hono/dist/jsx/dom/context.js +0 -48
- package/node_modules/hono/dist/jsx/dom/css.js +0 -150
- package/node_modules/hono/dist/jsx/dom/hooks/index.js +0 -48
- package/node_modules/hono/dist/jsx/dom/index.js +0 -142
- package/node_modules/hono/dist/jsx/dom/intrinsic-element/components.js +0 -374
- package/node_modules/hono/dist/jsx/dom/jsx-dev-runtime.js +0 -19
- package/node_modules/hono/dist/jsx/dom/jsx-runtime.js +0 -8
- package/node_modules/hono/dist/jsx/dom/render.js +0 -617
- package/node_modules/hono/dist/jsx/dom/server.js +0 -33
- package/node_modules/hono/dist/jsx/dom/utils.js +0 -10
- package/node_modules/hono/dist/jsx/hooks/index.js +0 -328
- package/node_modules/hono/dist/jsx/index.js +0 -103
- package/node_modules/hono/dist/jsx/intrinsic-element/common.js +0 -24
- package/node_modules/hono/dist/jsx/intrinsic-element/components.js +0 -165
- package/node_modules/hono/dist/jsx/intrinsic-elements.js +0 -0
- package/node_modules/hono/dist/jsx/jsx-dev-runtime.js +0 -18
- package/node_modules/hono/dist/jsx/jsx-runtime.js +0 -44
- package/node_modules/hono/dist/jsx/streaming.js +0 -155
- package/node_modules/hono/dist/jsx/types.js +0 -0
- package/node_modules/hono/dist/jsx/utils.js +0 -175
- package/node_modules/hono/dist/middleware/basic-auth/index.js +0 -66
- package/node_modules/hono/dist/middleware/bearer-auth/index.js +0 -92
- package/node_modules/hono/dist/middleware/body-limit/index.js +0 -53
- package/node_modules/hono/dist/middleware/cache/index.js +0 -102
- package/node_modules/hono/dist/middleware/combine/index.js +0 -77
- package/node_modules/hono/dist/middleware/compress/index.js +0 -69
- package/node_modules/hono/dist/middleware/context-storage/index.js +0 -23
- package/node_modules/hono/dist/middleware/cors/index.js +0 -84
- package/node_modules/hono/dist/middleware/csrf/index.js +0 -55
- package/node_modules/hono/dist/middleware/etag/digest.js +0 -33
- package/node_modules/hono/dist/middleware/etag/index.js +0 -73
- package/node_modules/hono/dist/middleware/ip-restriction/index.js +0 -162
- package/node_modules/hono/dist/middleware/jsx-renderer/index.js +0 -58
- package/node_modules/hono/dist/middleware/jwk/index.js +0 -5
- package/node_modules/hono/dist/middleware/jwk/jwk.js +0 -112
- package/node_modules/hono/dist/middleware/jwt/index.js +0 -11
- package/node_modules/hono/dist/middleware/jwt/jwt.js +0 -114
- package/node_modules/hono/dist/middleware/language/index.js +0 -15
- package/node_modules/hono/dist/middleware/language/language.js +0 -168
- package/node_modules/hono/dist/middleware/logger/index.js +0 -44
- package/node_modules/hono/dist/middleware/method-override/index.js +0 -84
- package/node_modules/hono/dist/middleware/powered-by/index.js +0 -10
- package/node_modules/hono/dist/middleware/pretty-json/index.js +0 -15
- package/node_modules/hono/dist/middleware/request-id/index.js +0 -5
- package/node_modules/hono/dist/middleware/request-id/request-id.js +0 -21
- package/node_modules/hono/dist/middleware/secure-headers/index.js +0 -6
- package/node_modules/hono/dist/middleware/secure-headers/permissions-policy.js +0 -0
- package/node_modules/hono/dist/middleware/secure-headers/secure-headers.js +0 -172
- package/node_modules/hono/dist/middleware/serve-static/index.js +0 -77
- package/node_modules/hono/dist/middleware/serve-static/path.js +0 -18
- package/node_modules/hono/dist/middleware/timeout/index.js +0 -25
- package/node_modules/hono/dist/middleware/timing/index.js +0 -9
- package/node_modules/hono/dist/middleware/timing/timing.js +0 -104
- package/node_modules/hono/dist/middleware/trailing-slash/index.js +0 -39
- package/node_modules/hono/dist/preset/quick.js +0 -16
- package/node_modules/hono/dist/preset/tiny.js +0 -12
- package/node_modules/hono/dist/request/constants.js +0 -5
- package/node_modules/hono/dist/request.js +0 -321
- package/node_modules/hono/dist/router/linear-router/index.js +0 -5
- package/node_modules/hono/dist/router/linear-router/router.js +0 -118
- package/node_modules/hono/dist/router/pattern-router/index.js +0 -5
- package/node_modules/hono/dist/router/pattern-router/router.js +0 -48
- package/node_modules/hono/dist/router/reg-exp-router/index.js +0 -9
- package/node_modules/hono/dist/router/reg-exp-router/matcher.js +0 -25
- package/node_modules/hono/dist/router/reg-exp-router/node.js +0 -111
- package/node_modules/hono/dist/router/reg-exp-router/prepared-router.js +0 -142
- package/node_modules/hono/dist/router/reg-exp-router/router.js +0 -190
- package/node_modules/hono/dist/router/reg-exp-router/trie.js +0 -59
- package/node_modules/hono/dist/router/smart-router/index.js +0 -5
- package/node_modules/hono/dist/router/smart-router/router.js +0 -58
- package/node_modules/hono/dist/router/trie-router/index.js +0 -5
- package/node_modules/hono/dist/router/trie-router/node.js +0 -188
- package/node_modules/hono/dist/router/trie-router/router.js +0 -26
- package/node_modules/hono/dist/router.js +0 -14
- package/node_modules/hono/dist/types/adapter/aws-lambda/conninfo.d.ts +0 -27
- package/node_modules/hono/dist/types/adapter/aws-lambda/handler.d.ts +0 -184
- package/node_modules/hono/dist/types/adapter/aws-lambda/index.d.ts +0 -8
- package/node_modules/hono/dist/types/adapter/aws-lambda/types.d.ts +0 -153
- package/node_modules/hono/dist/types/adapter/bun/conninfo.d.ts +0 -7
- package/node_modules/hono/dist/types/adapter/bun/index.d.ts +0 -10
- package/node_modules/hono/dist/types/adapter/bun/serve-static.d.ts +0 -3
- package/node_modules/hono/dist/types/adapter/bun/server.d.ts +0 -12
- package/node_modules/hono/dist/types/adapter/bun/ssg.d.ts +0 -13
- package/node_modules/hono/dist/types/adapter/bun/websocket.d.ts +0 -39
- package/node_modules/hono/dist/types/adapter/cloudflare-pages/conninfo.d.ts +0 -21
- package/node_modules/hono/dist/types/adapter/cloudflare-pages/handler.d.ts +0 -33
- package/node_modules/hono/dist/types/adapter/cloudflare-pages/index.d.ts +0 -7
- package/node_modules/hono/dist/types/adapter/cloudflare-workers/conninfo.d.ts +0 -2
- package/node_modules/hono/dist/types/adapter/cloudflare-workers/index.d.ts +0 -7
- package/node_modules/hono/dist/types/adapter/cloudflare-workers/serve-static-module.d.ts +0 -4
- package/node_modules/hono/dist/types/adapter/cloudflare-workers/serve-static.d.ts +0 -16
- package/node_modules/hono/dist/types/adapter/cloudflare-workers/utils.d.ts +0 -5
- package/node_modules/hono/dist/types/adapter/cloudflare-workers/websocket.d.ts +0 -2
- package/node_modules/hono/dist/types/adapter/deno/conninfo.d.ts +0 -7
- package/node_modules/hono/dist/types/adapter/deno/index.d.ts +0 -8
- package/node_modules/hono/dist/types/adapter/deno/serve-static.d.ts +0 -3
- package/node_modules/hono/dist/types/adapter/deno/ssg.d.ts +0 -13
- package/node_modules/hono/dist/types/adapter/deno/websocket.d.ts +0 -2
- package/node_modules/hono/dist/types/adapter/lambda-edge/conninfo.d.ts +0 -2
- package/node_modules/hono/dist/types/adapter/lambda-edge/handler.d.ts +0 -87
- package/node_modules/hono/dist/types/adapter/lambda-edge/index.d.ts +0 -7
- package/node_modules/hono/dist/types/adapter/netlify/conninfo.d.ts +0 -21
- package/node_modules/hono/dist/types/adapter/netlify/handler.d.ts +0 -2
- package/node_modules/hono/dist/types/adapter/netlify/index.d.ts +0 -5
- package/node_modules/hono/dist/types/adapter/netlify/mod.d.ts +0 -2
- package/node_modules/hono/dist/types/adapter/service-worker/handler.d.ts +0 -16
- package/node_modules/hono/dist/types/adapter/service-worker/index.d.ts +0 -28
- package/node_modules/hono/dist/types/adapter/service-worker/types.d.ts +0 -12
- package/node_modules/hono/dist/types/adapter/vercel/conninfo.d.ts +0 -2
- package/node_modules/hono/dist/types/adapter/vercel/handler.d.ts +0 -2
- package/node_modules/hono/dist/types/adapter/vercel/index.d.ts +0 -6
- package/node_modules/hono/dist/types/client/client.d.ts +0 -4
- package/node_modules/hono/dist/types/client/fetch-result-please.d.ts +0 -35
- package/node_modules/hono/dist/types/client/index.d.ts +0 -7
- package/node_modules/hono/dist/types/client/types.d.ts +0 -229
- package/node_modules/hono/dist/types/client/utils.d.ts +0 -18
- package/node_modules/hono/dist/types/compose.d.ts +0 -14
- package/node_modules/hono/dist/types/context.d.ts +0 -455
- package/node_modules/hono/dist/types/helper/accepts/accepts.d.ts +0 -30
- package/node_modules/hono/dist/types/helper/accepts/index.d.ts +0 -5
- package/node_modules/hono/dist/types/helper/adapter/index.d.ts +0 -12
- package/node_modules/hono/dist/types/helper/conninfo/index.d.ts +0 -5
- package/node_modules/hono/dist/types/helper/conninfo/types.d.ts +0 -36
- package/node_modules/hono/dist/types/helper/cookie/index.d.ts +0 -24
- package/node_modules/hono/dist/types/helper/css/common.d.ts +0 -59
- package/node_modules/hono/dist/types/helper/css/index.d.ts +0 -80
- package/node_modules/hono/dist/types/helper/dev/index.d.ts +0 -20
- package/node_modules/hono/dist/types/helper/factory/index.d.ts +0 -82
- package/node_modules/hono/dist/types/helper/html/index.d.ts +0 -8
- package/node_modules/hono/dist/types/helper/proxy/index.d.ts +0 -72
- package/node_modules/hono/dist/types/helper/route/index.d.ts +0 -75
- package/node_modules/hono/dist/types/helper/ssg/index.d.ts +0 -7
- package/node_modules/hono/dist/types/helper/ssg/middleware.d.ts +0 -44
- package/node_modules/hono/dist/types/helper/ssg/plugins.d.ts +0 -27
- package/node_modules/hono/dist/types/helper/ssg/ssg.d.ts +0 -91
- package/node_modules/hono/dist/types/helper/ssg/utils.d.ts +0 -16
- package/node_modules/hono/dist/types/helper/streaming/index.d.ts +0 -8
- package/node_modules/hono/dist/types/helper/streaming/sse.d.ts +0 -13
- package/node_modules/hono/dist/types/helper/streaming/stream.d.ts +0 -3
- package/node_modules/hono/dist/types/helper/streaming/text.d.ts +0 -3
- package/node_modules/hono/dist/types/helper/streaming/utils.d.ts +0 -1
- package/node_modules/hono/dist/types/helper/testing/index.d.ts +0 -12
- package/node_modules/hono/dist/types/helper/websocket/index.d.ts +0 -69
- package/node_modules/hono/dist/types/hono-base.d.ts +0 -220
- package/node_modules/hono/dist/types/hono.d.ts +0 -19
- package/node_modules/hono/dist/types/http-exception.d.ts +0 -59
- package/node_modules/hono/dist/types/index.d.ts +0 -37
- package/node_modules/hono/dist/types/jsx/base.d.ts +0 -56
- package/node_modules/hono/dist/types/jsx/children.d.ts +0 -9
- package/node_modules/hono/dist/types/jsx/components.d.ts +0 -15
- package/node_modules/hono/dist/types/jsx/constants.d.ts +0 -6
- package/node_modules/hono/dist/types/jsx/context.d.ts +0 -51
- package/node_modules/hono/dist/types/jsx/dom/client.d.ts +0 -31
- package/node_modules/hono/dist/types/jsx/dom/components.d.ts +0 -10
- package/node_modules/hono/dist/types/jsx/dom/context.d.ts +0 -3
- package/node_modules/hono/dist/types/jsx/dom/css.d.ts +0 -83
- package/node_modules/hono/dist/types/jsx/dom/hooks/index.d.ts +0 -39
- package/node_modules/hono/dist/types/jsx/dom/index.d.ts +0 -88
- package/node_modules/hono/dist/types/jsx/dom/intrinsic-element/components.d.ts +0 -16
- package/node_modules/hono/dist/types/jsx/dom/jsx-dev-runtime.d.ts +0 -8
- package/node_modules/hono/dist/types/jsx/dom/jsx-runtime.d.ts +0 -7
- package/node_modules/hono/dist/types/jsx/dom/render.d.ts +0 -73
- package/node_modules/hono/dist/types/jsx/dom/server.d.ts +0 -106
- package/node_modules/hono/dist/types/jsx/dom/utils.d.ts +0 -1
- package/node_modules/hono/dist/types/jsx/hooks/index.d.ts +0 -45
- package/node_modules/hono/dist/types/jsx/index.d.ts +0 -75
- package/node_modules/hono/dist/types/jsx/intrinsic-element/common.d.ts +0 -6
- package/node_modules/hono/dist/types/jsx/intrinsic-element/components.d.ts +0 -13
- package/node_modules/hono/dist/types/jsx/intrinsic-elements.d.ts +0 -722
- package/node_modules/hono/dist/types/jsx/jsx-dev-runtime.d.ts +0 -8
- package/node_modules/hono/dist/types/jsx/jsx-runtime.d.ts +0 -12
- package/node_modules/hono/dist/types/jsx/streaming.d.ts +0 -36
- package/node_modules/hono/dist/types/jsx/types.d.ts +0 -35
- package/node_modules/hono/dist/types/jsx/utils.d.ts +0 -4
- package/node_modules/hono/dist/types/middleware/basic-auth/index.d.ts +0 -75
- package/node_modules/hono/dist/types/middleware/bearer-auth/index.d.ts +0 -92
- package/node_modules/hono/dist/types/middleware/body-limit/index.d.ts +0 -45
- package/node_modules/hono/dist/types/middleware/cache/index.d.ts +0 -43
- package/node_modules/hono/dist/types/middleware/combine/index.d.ts +0 -85
- package/node_modules/hono/dist/types/middleware/compress/index.d.ts +0 -40
- package/node_modules/hono/dist/types/middleware/context-storage/index.d.ts +0 -40
- package/node_modules/hono/dist/types/middleware/cors/index.d.ts +0 -55
- package/node_modules/hono/dist/types/middleware/csrf/index.d.ts +0 -78
- package/node_modules/hono/dist/types/middleware/etag/digest.d.ts +0 -1
- package/node_modules/hono/dist/types/middleware/etag/index.d.ts +0 -42
- package/node_modules/hono/dist/types/middleware/ip-restriction/index.d.ts +0 -67
- package/node_modules/hono/dist/types/middleware/jsx-renderer/index.d.ts +0 -77
- package/node_modules/hono/dist/types/middleware/jwk/index.d.ts +0 -1
- package/node_modules/hono/dist/types/middleware/jwk/jwk.d.ts +0 -54
- package/node_modules/hono/dist/types/middleware/jwt/index.d.ts +0 -8
- package/node_modules/hono/dist/types/middleware/jwt/jwt.d.ts +0 -67
- package/node_modules/hono/dist/types/middleware/language/index.d.ts +0 -7
- package/node_modules/hono/dist/types/middleware/language/language.d.ts +0 -120
- package/node_modules/hono/dist/types/middleware/logger/index.d.ts +0 -24
- package/node_modules/hono/dist/types/middleware/method-override/index.d.ts +0 -48
- package/node_modules/hono/dist/types/middleware/powered-by/index.d.ts +0 -29
- package/node_modules/hono/dist/types/middleware/pretty-json/index.d.ts +0 -42
- package/node_modules/hono/dist/types/middleware/request-id/index.d.ts +0 -7
- package/node_modules/hono/dist/types/middleware/request-id/request-id.d.ts +0 -37
- package/node_modules/hono/dist/types/middleware/secure-headers/index.d.ts +0 -8
- package/node_modules/hono/dist/types/middleware/secure-headers/permissions-policy.d.ts +0 -14
- package/node_modules/hono/dist/types/middleware/secure-headers/secure-headers.d.ts +0 -109
- package/node_modules/hono/dist/types/middleware/serve-static/index.d.ts +0 -31
- package/node_modules/hono/dist/types/middleware/serve-static/path.d.ts +0 -5
- package/node_modules/hono/dist/types/middleware/timeout/index.d.ts +0 -31
- package/node_modules/hono/dist/types/middleware/timing/index.d.ts +0 -7
- package/node_modules/hono/dist/types/middleware/timing/timing.d.ts +0 -129
- package/node_modules/hono/dist/types/middleware/trailing-slash/index.d.ts +0 -94
- package/node_modules/hono/dist/types/package.json +0 -3
- package/node_modules/hono/dist/types/preset/quick.d.ts +0 -10
- package/node_modules/hono/dist/types/preset/tiny.d.ts +0 -10
- package/node_modules/hono/dist/types/request/constants.d.ts +0 -1
- package/node_modules/hono/dist/types/request.d.ts +0 -324
- package/node_modules/hono/dist/types/router/linear-router/index.d.ts +0 -5
- package/node_modules/hono/dist/types/router/linear-router/router.d.ts +0 -7
- package/node_modules/hono/dist/types/router/pattern-router/index.d.ts +0 -5
- package/node_modules/hono/dist/types/router/pattern-router/router.d.ts +0 -7
- package/node_modules/hono/dist/types/router/reg-exp-router/index.d.ts +0 -6
- package/node_modules/hono/dist/types/router/reg-exp-router/matcher.d.ts +0 -7
- package/node_modules/hono/dist/types/router/reg-exp-router/node.d.ts +0 -10
- package/node_modules/hono/dist/types/router/reg-exp-router/prepared-router.d.ts +0 -17
- package/node_modules/hono/dist/types/router/reg-exp-router/router.d.ts +0 -11
- package/node_modules/hono/dist/types/router/reg-exp-router/trie.d.ts +0 -7
- package/node_modules/hono/dist/types/router/smart-router/index.d.ts +0 -5
- package/node_modules/hono/dist/types/router/smart-router/router.d.ts +0 -11
- package/node_modules/hono/dist/types/router/trie-router/index.d.ts +0 -5
- package/node_modules/hono/dist/types/router/trie-router/node.d.ts +0 -7
- package/node_modules/hono/dist/types/router/trie-router/router.d.ts +0 -8
- package/node_modules/hono/dist/types/router.d.ts +0 -97
- package/node_modules/hono/dist/types/types.d.ts +0 -573
- package/node_modules/hono/dist/types/utils/accept.d.ts +0 -6
- package/node_modules/hono/dist/types/utils/basic-auth.d.ts +0 -5
- package/node_modules/hono/dist/types/utils/body.d.ts +0 -79
- package/node_modules/hono/dist/types/utils/buffer.d.ts +0 -17
- package/node_modules/hono/dist/types/utils/color.d.ts +0 -21
- package/node_modules/hono/dist/types/utils/compress.d.ts +0 -8
- package/node_modules/hono/dist/types/utils/concurrent.d.ts +0 -11
- package/node_modules/hono/dist/types/utils/constants.d.ts +0 -4
- package/node_modules/hono/dist/types/utils/cookie.d.ts +0 -40
- package/node_modules/hono/dist/types/utils/crypto.d.ts +0 -15
- package/node_modules/hono/dist/types/utils/encode.d.ts +0 -8
- package/node_modules/hono/dist/types/utils/filepath.d.ts +0 -12
- package/node_modules/hono/dist/types/utils/handler.d.ts +0 -6
- package/node_modules/hono/dist/types/utils/headers.d.ts +0 -8
- package/node_modules/hono/dist/types/utils/html.d.ts +0 -44
- package/node_modules/hono/dist/types/utils/http-status.d.ts +0 -32
- package/node_modules/hono/dist/types/utils/ipaddr.d.ts +0 -56
- package/node_modules/hono/dist/types/utils/jwt/index.d.ts +0 -18
- package/node_modules/hono/dist/types/utils/jwt/jwa.d.ts +0 -23
- package/node_modules/hono/dist/types/utils/jwt/jws.d.ts +0 -12
- package/node_modules/hono/dist/types/utils/jwt/jwt.d.ts +0 -43
- package/node_modules/hono/dist/types/utils/jwt/types.d.ts +0 -86
- package/node_modules/hono/dist/types/utils/jwt/utf8.d.ts +0 -6
- package/node_modules/hono/dist/types/utils/mime.d.ts +0 -70
- package/node_modules/hono/dist/types/utils/stream.d.ts +0 -31
- package/node_modules/hono/dist/types/utils/types.d.ts +0 -74
- package/node_modules/hono/dist/types/utils/url.d.ts +0 -39
- package/node_modules/hono/dist/types/validator/index.d.ts +0 -7
- package/node_modules/hono/dist/types/validator/utils.d.ts +0 -29
- package/node_modules/hono/dist/types/validator/validator.d.ts +0 -16
- package/node_modules/hono/dist/types.js +0 -6
- package/node_modules/hono/dist/utils/accept.js +0 -223
- package/node_modules/hono/dist/utils/basic-auth.js +0 -23
- package/node_modules/hono/dist/utils/body.js +0 -89
- package/node_modules/hono/dist/utils/buffer.js +0 -78
- package/node_modules/hono/dist/utils/color.js +0 -25
- package/node_modules/hono/dist/utils/compress.js +0 -5
- package/node_modules/hono/dist/utils/concurrent.js +0 -39
- package/node_modules/hono/dist/utils/constants.js +0 -5
- package/node_modules/hono/dist/utils/cookie.js +0 -173
- package/node_modules/hono/dist/utils/crypto.js +0 -44
- package/node_modules/hono/dist/utils/encode.js +0 -29
- package/node_modules/hono/dist/utils/filepath.js +0 -35
- package/node_modules/hono/dist/utils/handler.js +0 -13
- package/node_modules/hono/dist/utils/headers.js +0 -0
- package/node_modules/hono/dist/utils/html.js +0 -123
- package/node_modules/hono/dist/utils/http-status.js +0 -0
- package/node_modules/hono/dist/utils/ipaddr.js +0 -288
- package/node_modules/hono/dist/utils/jwt/index.js +0 -6
- package/node_modules/hono/dist/utils/jwt/jwa.js +0 -20
- package/node_modules/hono/dist/utils/jwt/jws.js +0 -192
- package/node_modules/hono/dist/utils/jwt/jwt.js +0 -207
- package/node_modules/hono/dist/utils/jwt/types.js +0 -124
- package/node_modules/hono/dist/utils/jwt/utf8.js +0 -7
- package/node_modules/hono/dist/utils/mime.js +0 -82
- package/node_modules/hono/dist/utils/stream.js +0 -81
- package/node_modules/hono/dist/utils/types.js +0 -0
- package/node_modules/hono/dist/utils/url.js +0 -222
- package/node_modules/hono/dist/validator/index.js +0 -5
- package/node_modules/hono/dist/validator/utils.js +0 -0
- package/node_modules/hono/dist/validator/validator.js +0 -86
- package/node_modules/hono/package.json +0 -699
- package/node_modules/zod/LICENSE +0 -21
- package/node_modules/zod/README.md +0 -191
- package/node_modules/zod/index.cjs +0 -33
- package/node_modules/zod/index.d.cts +0 -4
- package/node_modules/zod/index.d.ts +0 -4
- package/node_modules/zod/index.js +0 -4
- package/node_modules/zod/locales/index.cjs +0 -17
- package/node_modules/zod/locales/index.d.cts +0 -1
- package/node_modules/zod/locales/index.d.ts +0 -1
- package/node_modules/zod/locales/index.js +0 -1
- package/node_modules/zod/locales/package.json +0 -7
- package/node_modules/zod/mini/index.cjs +0 -32
- package/node_modules/zod/mini/index.d.cts +0 -3
- package/node_modules/zod/mini/index.d.ts +0 -3
- package/node_modules/zod/mini/index.js +0 -3
- package/node_modules/zod/mini/package.json +0 -7
- package/node_modules/zod/package.json +0 -135
- package/node_modules/zod/src/index.ts +0 -4
- package/node_modules/zod/src/locales/index.ts +0 -1
- package/node_modules/zod/src/mini/index.ts +0 -3
- package/node_modules/zod/src/v3/ZodError.ts +0 -330
- package/node_modules/zod/src/v3/benchmarks/datetime.ts +0 -58
- package/node_modules/zod/src/v3/benchmarks/discriminatedUnion.ts +0 -80
- package/node_modules/zod/src/v3/benchmarks/index.ts +0 -59
- package/node_modules/zod/src/v3/benchmarks/ipv4.ts +0 -57
- package/node_modules/zod/src/v3/benchmarks/object.ts +0 -69
- package/node_modules/zod/src/v3/benchmarks/primitives.ts +0 -162
- package/node_modules/zod/src/v3/benchmarks/realworld.ts +0 -63
- package/node_modules/zod/src/v3/benchmarks/string.ts +0 -55
- package/node_modules/zod/src/v3/benchmarks/union.ts +0 -80
- package/node_modules/zod/src/v3/errors.ts +0 -13
- package/node_modules/zod/src/v3/external.ts +0 -6
- package/node_modules/zod/src/v3/helpers/enumUtil.ts +0 -17
- package/node_modules/zod/src/v3/helpers/errorUtil.ts +0 -8
- package/node_modules/zod/src/v3/helpers/parseUtil.ts +0 -176
- package/node_modules/zod/src/v3/helpers/partialUtil.ts +0 -34
- package/node_modules/zod/src/v3/helpers/typeAliases.ts +0 -2
- package/node_modules/zod/src/v3/helpers/util.ts +0 -224
- package/node_modules/zod/src/v3/index.ts +0 -4
- package/node_modules/zod/src/v3/locales/en.ts +0 -124
- package/node_modules/zod/src/v3/standard-schema.ts +0 -113
- package/node_modules/zod/src/v3/tests/Mocker.ts +0 -54
- package/node_modules/zod/src/v3/tests/all-errors.test.ts +0 -157
- package/node_modules/zod/src/v3/tests/anyunknown.test.ts +0 -28
- package/node_modules/zod/src/v3/tests/array.test.ts +0 -71
- package/node_modules/zod/src/v3/tests/async-parsing.test.ts +0 -388
- package/node_modules/zod/src/v3/tests/async-refinements.test.ts +0 -46
- package/node_modules/zod/src/v3/tests/base.test.ts +0 -29
- package/node_modules/zod/src/v3/tests/bigint.test.ts +0 -55
- package/node_modules/zod/src/v3/tests/branded.test.ts +0 -53
- package/node_modules/zod/src/v3/tests/catch.test.ts +0 -220
- package/node_modules/zod/src/v3/tests/coerce.test.ts +0 -133
- package/node_modules/zod/src/v3/tests/complex.test.ts +0 -70
- package/node_modules/zod/src/v3/tests/custom.test.ts +0 -31
- package/node_modules/zod/src/v3/tests/date.test.ts +0 -32
- package/node_modules/zod/src/v3/tests/deepmasking.test.ts +0 -186
- package/node_modules/zod/src/v3/tests/default.test.ts +0 -112
- package/node_modules/zod/src/v3/tests/description.test.ts +0 -33
- package/node_modules/zod/src/v3/tests/discriminated-unions.test.ts +0 -315
- package/node_modules/zod/src/v3/tests/enum.test.ts +0 -80
- package/node_modules/zod/src/v3/tests/error.test.ts +0 -551
- package/node_modules/zod/src/v3/tests/firstparty.test.ts +0 -87
- package/node_modules/zod/src/v3/tests/firstpartyschematypes.test.ts +0 -21
- package/node_modules/zod/src/v3/tests/function.test.ts +0 -261
- package/node_modules/zod/src/v3/tests/generics.test.ts +0 -48
- package/node_modules/zod/src/v3/tests/instanceof.test.ts +0 -37
- package/node_modules/zod/src/v3/tests/intersection.test.ts +0 -110
- package/node_modules/zod/src/v3/tests/language-server.source.ts +0 -76
- package/node_modules/zod/src/v3/tests/language-server.test.ts +0 -207
- package/node_modules/zod/src/v3/tests/literal.test.ts +0 -36
- package/node_modules/zod/src/v3/tests/map.test.ts +0 -110
- package/node_modules/zod/src/v3/tests/masking.test.ts +0 -4
- package/node_modules/zod/src/v3/tests/mocker.test.ts +0 -19
- package/node_modules/zod/src/v3/tests/nan.test.ts +0 -24
- package/node_modules/zod/src/v3/tests/nativeEnum.test.ts +0 -87
- package/node_modules/zod/src/v3/tests/nullable.test.ts +0 -42
- package/node_modules/zod/src/v3/tests/number.test.ts +0 -176
- package/node_modules/zod/src/v3/tests/object-augmentation.test.ts +0 -29
- package/node_modules/zod/src/v3/tests/object-in-es5-env.test.ts +0 -29
- package/node_modules/zod/src/v3/tests/object.test.ts +0 -434
- package/node_modules/zod/src/v3/tests/optional.test.ts +0 -42
- package/node_modules/zod/src/v3/tests/parseUtil.test.ts +0 -23
- package/node_modules/zod/src/v3/tests/parser.test.ts +0 -41
- package/node_modules/zod/src/v3/tests/partials.test.ts +0 -243
- package/node_modules/zod/src/v3/tests/pickomit.test.ts +0 -111
- package/node_modules/zod/src/v3/tests/pipeline.test.ts +0 -29
- package/node_modules/zod/src/v3/tests/preprocess.test.ts +0 -186
- package/node_modules/zod/src/v3/tests/primitive.test.ts +0 -440
- package/node_modules/zod/src/v3/tests/promise.test.ts +0 -90
- package/node_modules/zod/src/v3/tests/readonly.test.ts +0 -194
- package/node_modules/zod/src/v3/tests/record.test.ts +0 -171
- package/node_modules/zod/src/v3/tests/recursive.test.ts +0 -197
- package/node_modules/zod/src/v3/tests/refine.test.ts +0 -313
- package/node_modules/zod/src/v3/tests/safeparse.test.ts +0 -27
- package/node_modules/zod/src/v3/tests/set.test.ts +0 -142
- package/node_modules/zod/src/v3/tests/standard-schema.test.ts +0 -83
- package/node_modules/zod/src/v3/tests/string.test.ts +0 -916
- package/node_modules/zod/src/v3/tests/transformer.test.ts +0 -233
- package/node_modules/zod/src/v3/tests/tuple.test.ts +0 -90
- package/node_modules/zod/src/v3/tests/unions.test.ts +0 -57
- package/node_modules/zod/src/v3/tests/validations.test.ts +0 -133
- package/node_modules/zod/src/v3/tests/void.test.ts +0 -15
- package/node_modules/zod/src/v3/types.ts +0 -5138
- package/node_modules/zod/src/v4/classic/checks.ts +0 -32
- package/node_modules/zod/src/v4/classic/coerce.ts +0 -27
- package/node_modules/zod/src/v4/classic/compat.ts +0 -70
- package/node_modules/zod/src/v4/classic/errors.ts +0 -82
- package/node_modules/zod/src/v4/classic/external.ts +0 -52
- package/node_modules/zod/src/v4/classic/from-json-schema.ts +0 -659
- package/node_modules/zod/src/v4/classic/index.ts +0 -5
- package/node_modules/zod/src/v4/classic/iso.ts +0 -90
- package/node_modules/zod/src/v4/classic/parse.ts +0 -82
- package/node_modules/zod/src/v4/classic/schemas.ts +0 -2672
- package/node_modules/zod/src/v4/classic/tests/anyunknown.test.ts +0 -26
- package/node_modules/zod/src/v4/classic/tests/apply.test.ts +0 -59
- package/node_modules/zod/src/v4/classic/tests/array.test.ts +0 -264
- package/node_modules/zod/src/v4/classic/tests/assignability.test.ts +0 -216
- package/node_modules/zod/src/v4/classic/tests/async-parsing.test.ts +0 -381
- package/node_modules/zod/src/v4/classic/tests/async-refinements.test.ts +0 -68
- package/node_modules/zod/src/v4/classic/tests/base.test.ts +0 -7
- package/node_modules/zod/src/v4/classic/tests/bigint.test.ts +0 -54
- package/node_modules/zod/src/v4/classic/tests/brand.test.ts +0 -106
- package/node_modules/zod/src/v4/classic/tests/catch.test.ts +0 -326
- package/node_modules/zod/src/v4/classic/tests/coalesce.test.ts +0 -20
- package/node_modules/zod/src/v4/classic/tests/codec-examples.test.ts +0 -573
- package/node_modules/zod/src/v4/classic/tests/codec.test.ts +0 -703
- package/node_modules/zod/src/v4/classic/tests/coerce.test.ts +0 -160
- package/node_modules/zod/src/v4/classic/tests/continuability.test.ts +0 -374
- package/node_modules/zod/src/v4/classic/tests/custom.test.ts +0 -40
- package/node_modules/zod/src/v4/classic/tests/date.test.ts +0 -62
- package/node_modules/zod/src/v4/classic/tests/datetime.test.ts +0 -302
- package/node_modules/zod/src/v4/classic/tests/default.test.ts +0 -409
- package/node_modules/zod/src/v4/classic/tests/describe-meta-checks.test.ts +0 -27
- package/node_modules/zod/src/v4/classic/tests/description.test.ts +0 -32
- package/node_modules/zod/src/v4/classic/tests/detached-methods.test.ts +0 -197
- package/node_modules/zod/src/v4/classic/tests/discriminated-unions.test.ts +0 -694
- package/node_modules/zod/src/v4/classic/tests/enum.test.ts +0 -285
- package/node_modules/zod/src/v4/classic/tests/error-utils.test.ts +0 -807
- package/node_modules/zod/src/v4/classic/tests/error.test.ts +0 -711
- package/node_modules/zod/src/v4/classic/tests/file.test.ts +0 -96
- package/node_modules/zod/src/v4/classic/tests/firstparty.test.ts +0 -179
- package/node_modules/zod/src/v4/classic/tests/fix-json-issue.test.ts +0 -26
- package/node_modules/zod/src/v4/classic/tests/from-json-schema.test.ts +0 -895
- package/node_modules/zod/src/v4/classic/tests/function.test.ts +0 -360
- package/node_modules/zod/src/v4/classic/tests/generics.test.ts +0 -72
- package/node_modules/zod/src/v4/classic/tests/global-config.test.ts +0 -39
- package/node_modules/zod/src/v4/classic/tests/hash.test.ts +0 -68
- package/node_modules/zod/src/v4/classic/tests/index.test.ts +0 -939
- package/node_modules/zod/src/v4/classic/tests/instanceof.test.ts +0 -60
- package/node_modules/zod/src/v4/classic/tests/intersection.test.ts +0 -198
- package/node_modules/zod/src/v4/classic/tests/jitless-allows-eval.test.ts +0 -46
- package/node_modules/zod/src/v4/classic/tests/json.test.ts +0 -109
- package/node_modules/zod/src/v4/classic/tests/lazy.test.ts +0 -227
- package/node_modules/zod/src/v4/classic/tests/literal.test.ts +0 -117
- package/node_modules/zod/src/v4/classic/tests/locales_ka.test.ts +0 -29
- package/node_modules/zod/src/v4/classic/tests/locales_ro.test.ts +0 -24
- package/node_modules/zod/src/v4/classic/tests/map.test.ts +0 -330
- package/node_modules/zod/src/v4/classic/tests/nan.test.ts +0 -21
- package/node_modules/zod/src/v4/classic/tests/nested-refine.test.ts +0 -168
- package/node_modules/zod/src/v4/classic/tests/nonoptional.test.ts +0 -101
- package/node_modules/zod/src/v4/classic/tests/nullable.test.ts +0 -22
- package/node_modules/zod/src/v4/classic/tests/number.test.ts +0 -325
- package/node_modules/zod/src/v4/classic/tests/object.test.ts +0 -717
- package/node_modules/zod/src/v4/classic/tests/optional.test.ts +0 -333
- package/node_modules/zod/src/v4/classic/tests/partial.test.ts +0 -450
- package/node_modules/zod/src/v4/classic/tests/pickomit.test.ts +0 -211
- package/node_modules/zod/src/v4/classic/tests/pipe.test.ts +0 -101
- package/node_modules/zod/src/v4/classic/tests/prefault.test.ts +0 -74
- package/node_modules/zod/src/v4/classic/tests/preprocess-types.test.ts +0 -26
- package/node_modules/zod/src/v4/classic/tests/preprocess.test.ts +0 -351
- package/node_modules/zod/src/v4/classic/tests/primitive.test.ts +0 -175
- package/node_modules/zod/src/v4/classic/tests/promise.test.ts +0 -81
- package/node_modules/zod/src/v4/classic/tests/prototypes.test.ts +0 -23
- package/node_modules/zod/src/v4/classic/tests/readonly.test.ts +0 -252
- package/node_modules/zod/src/v4/classic/tests/record.test.ts +0 -717
- package/node_modules/zod/src/v4/classic/tests/recursive-types.test.ts +0 -631
- package/node_modules/zod/src/v4/classic/tests/refine.test.ts +0 -633
- package/node_modules/zod/src/v4/classic/tests/registries.test.ts +0 -243
- package/node_modules/zod/src/v4/classic/tests/set.test.ts +0 -181
- package/node_modules/zod/src/v4/classic/tests/standard-schema.test.ts +0 -134
- package/node_modules/zod/src/v4/classic/tests/string-formats.test.ts +0 -125
- package/node_modules/zod/src/v4/classic/tests/string.test.ts +0 -1224
- package/node_modules/zod/src/v4/classic/tests/stringbool.test.ts +0 -106
- package/node_modules/zod/src/v4/classic/tests/template-literal.test.ts +0 -771
- package/node_modules/zod/src/v4/classic/tests/to-json-schema-methods.test.ts +0 -438
- package/node_modules/zod/src/v4/classic/tests/to-json-schema.test.ts +0 -3125
- package/node_modules/zod/src/v4/classic/tests/transform.test.ts +0 -378
- package/node_modules/zod/src/v4/classic/tests/tuple.test.ts +0 -496
- package/node_modules/zod/src/v4/classic/tests/union.test.ts +0 -273
- package/node_modules/zod/src/v4/classic/tests/url.test.ts +0 -13
- package/node_modules/zod/src/v4/classic/tests/validations.test.ts +0 -283
- package/node_modules/zod/src/v4/classic/tests/void.test.ts +0 -12
- package/node_modules/zod/src/v4/core/api.ts +0 -1823
- package/node_modules/zod/src/v4/core/checks.ts +0 -1293
- package/node_modules/zod/src/v4/core/config.ts +0 -15
- package/node_modules/zod/src/v4/core/core.ts +0 -153
- package/node_modules/zod/src/v4/core/doc.ts +0 -44
- package/node_modules/zod/src/v4/core/errors.ts +0 -455
- package/node_modules/zod/src/v4/core/index.ts +0 -16
- package/node_modules/zod/src/v4/core/json-schema-generator.ts +0 -126
- package/node_modules/zod/src/v4/core/json-schema-processors.ts +0 -666
- package/node_modules/zod/src/v4/core/json-schema.ts +0 -147
- package/node_modules/zod/src/v4/core/parse.ts +0 -195
- package/node_modules/zod/src/v4/core/regexes.ts +0 -190
- package/node_modules/zod/src/v4/core/registries.ts +0 -105
- package/node_modules/zod/src/v4/core/schemas.ts +0 -4730
- package/node_modules/zod/src/v4/core/standard-schema.ts +0 -159
- package/node_modules/zod/src/v4/core/tests/extend.test.ts +0 -59
- package/node_modules/zod/src/v4/core/tests/index.test.ts +0 -46
- package/node_modules/zod/src/v4/core/tests/locales/be.test.ts +0 -124
- package/node_modules/zod/src/v4/core/tests/locales/el.test.ts +0 -215
- package/node_modules/zod/src/v4/core/tests/locales/en.test.ts +0 -22
- package/node_modules/zod/src/v4/core/tests/locales/es.test.ts +0 -181
- package/node_modules/zod/src/v4/core/tests/locales/fr.test.ts +0 -72
- package/node_modules/zod/src/v4/core/tests/locales/he.test.ts +0 -379
- package/node_modules/zod/src/v4/core/tests/locales/hr.test.ts +0 -163
- package/node_modules/zod/src/v4/core/tests/locales/nl.test.ts +0 -46
- package/node_modules/zod/src/v4/core/tests/locales/ru.test.ts +0 -128
- package/node_modules/zod/src/v4/core/tests/locales/tr.test.ts +0 -69
- package/node_modules/zod/src/v4/core/tests/locales/uz.test.ts +0 -105
- package/node_modules/zod/src/v4/core/tests/record-constructor.test.ts +0 -125
- package/node_modules/zod/src/v4/core/tests/recursive-tuples.test.ts +0 -45
- package/node_modules/zod/src/v4/core/to-json-schema.ts +0 -622
- package/node_modules/zod/src/v4/core/util.ts +0 -983
- package/node_modules/zod/src/v4/core/versions.ts +0 -5
- package/node_modules/zod/src/v4/core/zsf.ts +0 -323
- package/node_modules/zod/src/v4/index.ts +0 -4
- package/node_modules/zod/src/v4/locales/ar.ts +0 -115
- package/node_modules/zod/src/v4/locales/az.ts +0 -111
- package/node_modules/zod/src/v4/locales/be.ts +0 -176
- package/node_modules/zod/src/v4/locales/bg.ts +0 -128
- package/node_modules/zod/src/v4/locales/ca.ts +0 -116
- package/node_modules/zod/src/v4/locales/cs.ts +0 -118
- package/node_modules/zod/src/v4/locales/da.ts +0 -123
- package/node_modules/zod/src/v4/locales/de.ts +0 -116
- package/node_modules/zod/src/v4/locales/el.ts +0 -121
- package/node_modules/zod/src/v4/locales/en.ts +0 -123
- package/node_modules/zod/src/v4/locales/eo.ts +0 -118
- package/node_modules/zod/src/v4/locales/es.ts +0 -141
- package/node_modules/zod/src/v4/locales/fa.ts +0 -126
- package/node_modules/zod/src/v4/locales/fi.ts +0 -121
- package/node_modules/zod/src/v4/locales/fr-CA.ts +0 -116
- package/node_modules/zod/src/v4/locales/fr.ts +0 -132
- package/node_modules/zod/src/v4/locales/he.ts +0 -246
- package/node_modules/zod/src/v4/locales/hr.ts +0 -131
- package/node_modules/zod/src/v4/locales/hu.ts +0 -117
- package/node_modules/zod/src/v4/locales/hy.ts +0 -164
- package/node_modules/zod/src/v4/locales/id.ts +0 -115
- package/node_modules/zod/src/v4/locales/index.ts +0 -52
- package/node_modules/zod/src/v4/locales/is.ts +0 -119
- package/node_modules/zod/src/v4/locales/it.ts +0 -116
- package/node_modules/zod/src/v4/locales/ja.ts +0 -114
- package/node_modules/zod/src/v4/locales/ka.ts +0 -123
- package/node_modules/zod/src/v4/locales/kh.ts +0 -7
- package/node_modules/zod/src/v4/locales/km.ts +0 -119
- package/node_modules/zod/src/v4/locales/ko.ts +0 -121
- package/node_modules/zod/src/v4/locales/lt.ts +0 -239
- package/node_modules/zod/src/v4/locales/mk.ts +0 -118
- package/node_modules/zod/src/v4/locales/ms.ts +0 -115
- package/node_modules/zod/src/v4/locales/nl.ts +0 -121
- package/node_modules/zod/src/v4/locales/no.ts +0 -116
- package/node_modules/zod/src/v4/locales/ota.ts +0 -117
- package/node_modules/zod/src/v4/locales/pl.ts +0 -118
- package/node_modules/zod/src/v4/locales/ps.ts +0 -126
- package/node_modules/zod/src/v4/locales/pt.ts +0 -116
- package/node_modules/zod/src/v4/locales/ro.ts +0 -129
- package/node_modules/zod/src/v4/locales/ru.ts +0 -176
- package/node_modules/zod/src/v4/locales/sl.ts +0 -118
- package/node_modules/zod/src/v4/locales/sv.ts +0 -119
- package/node_modules/zod/src/v4/locales/ta.ts +0 -118
- package/node_modules/zod/src/v4/locales/th.ts +0 -119
- package/node_modules/zod/src/v4/locales/tr.ts +0 -111
- package/node_modules/zod/src/v4/locales/ua.ts +0 -7
- package/node_modules/zod/src/v4/locales/uk.ts +0 -117
- package/node_modules/zod/src/v4/locales/ur.ts +0 -119
- package/node_modules/zod/src/v4/locales/uz.ts +0 -117
- package/node_modules/zod/src/v4/locales/vi.ts +0 -117
- package/node_modules/zod/src/v4/locales/yo.ts +0 -124
- package/node_modules/zod/src/v4/locales/zh-CN.ts +0 -116
- package/node_modules/zod/src/v4/locales/zh-TW.ts +0 -115
- package/node_modules/zod/src/v4/mini/checks.ts +0 -32
- package/node_modules/zod/src/v4/mini/coerce.ts +0 -27
- package/node_modules/zod/src/v4/mini/external.ts +0 -41
- package/node_modules/zod/src/v4/mini/index.ts +0 -3
- package/node_modules/zod/src/v4/mini/iso.ts +0 -66
- package/node_modules/zod/src/v4/mini/parse.ts +0 -14
- package/node_modules/zod/src/v4/mini/schemas.ts +0 -1947
- package/node_modules/zod/src/v4/mini/tests/apply.test.ts +0 -24
- package/node_modules/zod/src/v4/mini/tests/assignability.test.ts +0 -129
- package/node_modules/zod/src/v4/mini/tests/brand.test.ts +0 -94
- package/node_modules/zod/src/v4/mini/tests/checks.test.ts +0 -144
- package/node_modules/zod/src/v4/mini/tests/codec.test.ts +0 -548
- package/node_modules/zod/src/v4/mini/tests/computed.test.ts +0 -36
- package/node_modules/zod/src/v4/mini/tests/error.test.ts +0 -22
- package/node_modules/zod/src/v4/mini/tests/functions.test.ts +0 -5
- package/node_modules/zod/src/v4/mini/tests/index.test.ts +0 -993
- package/node_modules/zod/src/v4/mini/tests/number.test.ts +0 -95
- package/node_modules/zod/src/v4/mini/tests/object.test.ts +0 -227
- package/node_modules/zod/src/v4/mini/tests/prototypes.test.ts +0 -43
- package/node_modules/zod/src/v4/mini/tests/recursive-types.test.ts +0 -325
- package/node_modules/zod/src/v4/mini/tests/standard-schema.test.ts +0 -50
- package/node_modules/zod/src/v4/mini/tests/string.test.ts +0 -352
- package/node_modules/zod/src/v4-mini/index.ts +0 -3
- package/node_modules/zod/v3/ZodError.cjs +0 -138
- package/node_modules/zod/v3/ZodError.d.cts +0 -164
- package/node_modules/zod/v3/ZodError.d.ts +0 -164
- package/node_modules/zod/v3/ZodError.js +0 -133
- package/node_modules/zod/v3/errors.cjs +0 -17
- package/node_modules/zod/v3/errors.d.cts +0 -5
- package/node_modules/zod/v3/errors.d.ts +0 -5
- package/node_modules/zod/v3/errors.js +0 -9
- package/node_modules/zod/v3/external.cjs +0 -22
- package/node_modules/zod/v3/external.d.cts +0 -6
- package/node_modules/zod/v3/external.d.ts +0 -6
- package/node_modules/zod/v3/external.js +0 -6
- package/node_modules/zod/v3/helpers/enumUtil.cjs +0 -2
- package/node_modules/zod/v3/helpers/enumUtil.d.cts +0 -8
- package/node_modules/zod/v3/helpers/enumUtil.d.ts +0 -8
- package/node_modules/zod/v3/helpers/enumUtil.js +0 -1
- package/node_modules/zod/v3/helpers/errorUtil.cjs +0 -9
- package/node_modules/zod/v3/helpers/errorUtil.d.cts +0 -9
- package/node_modules/zod/v3/helpers/errorUtil.d.ts +0 -9
- package/node_modules/zod/v3/helpers/errorUtil.js +0 -6
- package/node_modules/zod/v3/helpers/parseUtil.cjs +0 -124
- package/node_modules/zod/v3/helpers/parseUtil.d.cts +0 -78
- package/node_modules/zod/v3/helpers/parseUtil.d.ts +0 -78
- package/node_modules/zod/v3/helpers/parseUtil.js +0 -109
- package/node_modules/zod/v3/helpers/partialUtil.cjs +0 -2
- package/node_modules/zod/v3/helpers/partialUtil.d.cts +0 -8
- package/node_modules/zod/v3/helpers/partialUtil.d.ts +0 -8
- package/node_modules/zod/v3/helpers/partialUtil.js +0 -1
- package/node_modules/zod/v3/helpers/typeAliases.cjs +0 -2
- package/node_modules/zod/v3/helpers/typeAliases.d.cts +0 -2
- package/node_modules/zod/v3/helpers/typeAliases.d.ts +0 -2
- package/node_modules/zod/v3/helpers/typeAliases.js +0 -1
- package/node_modules/zod/v3/helpers/util.cjs +0 -137
- package/node_modules/zod/v3/helpers/util.d.cts +0 -85
- package/node_modules/zod/v3/helpers/util.d.ts +0 -85
- package/node_modules/zod/v3/helpers/util.js +0 -133
- package/node_modules/zod/v3/index.cjs +0 -33
- package/node_modules/zod/v3/index.d.cts +0 -4
- package/node_modules/zod/v3/index.d.ts +0 -4
- package/node_modules/zod/v3/index.js +0 -4
- package/node_modules/zod/v3/locales/en.cjs +0 -112
- package/node_modules/zod/v3/locales/en.d.cts +0 -3
- package/node_modules/zod/v3/locales/en.d.ts +0 -3
- package/node_modules/zod/v3/locales/en.js +0 -109
- package/node_modules/zod/v3/package.json +0 -7
- package/node_modules/zod/v3/standard-schema.cjs +0 -2
- package/node_modules/zod/v3/standard-schema.d.cts +0 -102
- package/node_modules/zod/v3/standard-schema.d.ts +0 -102
- package/node_modules/zod/v3/standard-schema.js +0 -1
- package/node_modules/zod/v3/types.cjs +0 -3777
- package/node_modules/zod/v3/types.d.cts +0 -1034
- package/node_modules/zod/v3/types.d.ts +0 -1034
- package/node_modules/zod/v3/types.js +0 -3695
- package/node_modules/zod/v4/classic/checks.cjs +0 -33
- package/node_modules/zod/v4/classic/checks.d.cts +0 -1
- package/node_modules/zod/v4/classic/checks.d.ts +0 -1
- package/node_modules/zod/v4/classic/checks.js +0 -1
- package/node_modules/zod/v4/classic/coerce.cjs +0 -47
- package/node_modules/zod/v4/classic/coerce.d.cts +0 -17
- package/node_modules/zod/v4/classic/coerce.d.ts +0 -17
- package/node_modules/zod/v4/classic/coerce.js +0 -17
- package/node_modules/zod/v4/classic/compat.cjs +0 -61
- package/node_modules/zod/v4/classic/compat.d.cts +0 -50
- package/node_modules/zod/v4/classic/compat.d.ts +0 -50
- package/node_modules/zod/v4/classic/compat.js +0 -31
- package/node_modules/zod/v4/classic/errors.cjs +0 -74
- package/node_modules/zod/v4/classic/errors.d.cts +0 -30
- package/node_modules/zod/v4/classic/errors.d.ts +0 -30
- package/node_modules/zod/v4/classic/errors.js +0 -48
- package/node_modules/zod/v4/classic/external.cjs +0 -73
- package/node_modules/zod/v4/classic/external.d.cts +0 -16
- package/node_modules/zod/v4/classic/external.d.ts +0 -16
- package/node_modules/zod/v4/classic/external.js +0 -20
- package/node_modules/zod/v4/classic/from-json-schema.cjs +0 -625
- package/node_modules/zod/v4/classic/from-json-schema.d.cts +0 -12
- package/node_modules/zod/v4/classic/from-json-schema.d.ts +0 -12
- package/node_modules/zod/v4/classic/from-json-schema.js +0 -599
- package/node_modules/zod/v4/classic/index.cjs +0 -33
- package/node_modules/zod/v4/classic/index.d.cts +0 -4
- package/node_modules/zod/v4/classic/index.d.ts +0 -4
- package/node_modules/zod/v4/classic/index.js +0 -4
- package/node_modules/zod/v4/classic/iso.cjs +0 -60
- package/node_modules/zod/v4/classic/iso.d.cts +0 -22
- package/node_modules/zod/v4/classic/iso.d.ts +0 -22
- package/node_modules/zod/v4/classic/iso.js +0 -30
- package/node_modules/zod/v4/classic/package.json +0 -7
- package/node_modules/zod/v4/classic/parse.cjs +0 -41
- package/node_modules/zod/v4/classic/parse.d.cts +0 -31
- package/node_modules/zod/v4/classic/parse.d.ts +0 -31
- package/node_modules/zod/v4/classic/parse.js +0 -15
- package/node_modules/zod/v4/classic/schemas.cjs +0 -1511
- package/node_modules/zod/v4/classic/schemas.d.cts +0 -767
- package/node_modules/zod/v4/classic/schemas.d.ts +0 -767
- package/node_modules/zod/v4/classic/schemas.js +0 -1395
- package/node_modules/zod/v4/core/api.cjs +0 -1227
- package/node_modules/zod/v4/core/api.d.cts +0 -325
- package/node_modules/zod/v4/core/api.d.ts +0 -325
- package/node_modules/zod/v4/core/api.js +0 -1087
- package/node_modules/zod/v4/core/checks.cjs +0 -601
- package/node_modules/zod/v4/core/checks.d.cts +0 -278
- package/node_modules/zod/v4/core/checks.d.ts +0 -278
- package/node_modules/zod/v4/core/checks.js +0 -575
- package/node_modules/zod/v4/core/core.cjs +0 -85
- package/node_modules/zod/v4/core/core.d.cts +0 -70
- package/node_modules/zod/v4/core/core.d.ts +0 -70
- package/node_modules/zod/v4/core/core.js +0 -78
- package/node_modules/zod/v4/core/doc.cjs +0 -39
- package/node_modules/zod/v4/core/doc.d.cts +0 -14
- package/node_modules/zod/v4/core/doc.d.ts +0 -14
- package/node_modules/zod/v4/core/doc.js +0 -35
- package/node_modules/zod/v4/core/errors.cjs +0 -216
- package/node_modules/zod/v4/core/errors.d.cts +0 -221
- package/node_modules/zod/v4/core/errors.d.ts +0 -221
- package/node_modules/zod/v4/core/errors.js +0 -185
- package/node_modules/zod/v4/core/index.cjs +0 -47
- package/node_modules/zod/v4/core/index.d.cts +0 -16
- package/node_modules/zod/v4/core/index.d.ts +0 -16
- package/node_modules/zod/v4/core/index.js +0 -16
- package/node_modules/zod/v4/core/json-schema-generator.cjs +0 -99
- package/node_modules/zod/v4/core/json-schema-generator.d.cts +0 -65
- package/node_modules/zod/v4/core/json-schema-generator.d.ts +0 -65
- package/node_modules/zod/v4/core/json-schema-generator.js +0 -95
- package/node_modules/zod/v4/core/json-schema-processors.cjs +0 -644
- package/node_modules/zod/v4/core/json-schema-processors.d.cts +0 -49
- package/node_modules/zod/v4/core/json-schema-processors.d.ts +0 -49
- package/node_modules/zod/v4/core/json-schema-processors.js +0 -601
- package/node_modules/zod/v4/core/json-schema.cjs +0 -2
- package/node_modules/zod/v4/core/json-schema.d.cts +0 -88
- package/node_modules/zod/v4/core/json-schema.d.ts +0 -88
- package/node_modules/zod/v4/core/json-schema.js +0 -1
- package/node_modules/zod/v4/core/package.json +0 -7
- package/node_modules/zod/v4/core/parse.cjs +0 -131
- package/node_modules/zod/v4/core/parse.d.cts +0 -49
- package/node_modules/zod/v4/core/parse.d.ts +0 -49
- package/node_modules/zod/v4/core/parse.js +0 -93
- package/node_modules/zod/v4/core/regexes.cjs +0 -172
- package/node_modules/zod/v4/core/regexes.d.cts +0 -85
- package/node_modules/zod/v4/core/regexes.d.ts +0 -85
- package/node_modules/zod/v4/core/regexes.js +0 -139
- package/node_modules/zod/v4/core/registries.cjs +0 -56
- package/node_modules/zod/v4/core/registries.d.cts +0 -35
- package/node_modules/zod/v4/core/registries.d.ts +0 -35
- package/node_modules/zod/v4/core/registries.js +0 -51
- package/node_modules/zod/v4/core/schemas.cjs +0 -2270
- package/node_modules/zod/v4/core/schemas.d.cts +0 -1184
- package/node_modules/zod/v4/core/schemas.d.ts +0 -1184
- package/node_modules/zod/v4/core/schemas.js +0 -2239
- package/node_modules/zod/v4/core/standard-schema.cjs +0 -2
- package/node_modules/zod/v4/core/standard-schema.d.cts +0 -126
- package/node_modules/zod/v4/core/standard-schema.d.ts +0 -126
- package/node_modules/zod/v4/core/standard-schema.js +0 -1
- package/node_modules/zod/v4/core/to-json-schema.cjs +0 -457
- package/node_modules/zod/v4/core/to-json-schema.d.cts +0 -114
- package/node_modules/zod/v4/core/to-json-schema.d.ts +0 -114
- package/node_modules/zod/v4/core/to-json-schema.js +0 -448
- package/node_modules/zod/v4/core/util.cjs +0 -734
- package/node_modules/zod/v4/core/util.d.cts +0 -200
- package/node_modules/zod/v4/core/util.d.ts +0 -200
- package/node_modules/zod/v4/core/util.js +0 -674
- package/node_modules/zod/v4/core/versions.cjs +0 -8
- package/node_modules/zod/v4/core/versions.d.cts +0 -5
- package/node_modules/zod/v4/core/versions.d.ts +0 -5
- package/node_modules/zod/v4/core/versions.js +0 -5
- package/node_modules/zod/v4/index.cjs +0 -22
- package/node_modules/zod/v4/index.d.cts +0 -3
- package/node_modules/zod/v4/index.d.ts +0 -3
- package/node_modules/zod/v4/index.js +0 -3
- package/node_modules/zod/v4/locales/ar.cjs +0 -133
- package/node_modules/zod/v4/locales/ar.d.cts +0 -5
- package/node_modules/zod/v4/locales/ar.d.ts +0 -4
- package/node_modules/zod/v4/locales/ar.js +0 -106
- package/node_modules/zod/v4/locales/az.cjs +0 -132
- package/node_modules/zod/v4/locales/az.d.cts +0 -5
- package/node_modules/zod/v4/locales/az.d.ts +0 -4
- package/node_modules/zod/v4/locales/az.js +0 -105
- package/node_modules/zod/v4/locales/be.cjs +0 -183
- package/node_modules/zod/v4/locales/be.d.cts +0 -5
- package/node_modules/zod/v4/locales/be.d.ts +0 -4
- package/node_modules/zod/v4/locales/be.js +0 -156
- package/node_modules/zod/v4/locales/bg.cjs +0 -147
- package/node_modules/zod/v4/locales/bg.d.cts +0 -5
- package/node_modules/zod/v4/locales/bg.d.ts +0 -4
- package/node_modules/zod/v4/locales/bg.js +0 -120
- package/node_modules/zod/v4/locales/ca.cjs +0 -134
- package/node_modules/zod/v4/locales/ca.d.cts +0 -5
- package/node_modules/zod/v4/locales/ca.d.ts +0 -4
- package/node_modules/zod/v4/locales/ca.js +0 -107
- package/node_modules/zod/v4/locales/cs.cjs +0 -138
- package/node_modules/zod/v4/locales/cs.d.cts +0 -5
- package/node_modules/zod/v4/locales/cs.d.ts +0 -4
- package/node_modules/zod/v4/locales/cs.js +0 -111
- package/node_modules/zod/v4/locales/da.cjs +0 -142
- package/node_modules/zod/v4/locales/da.d.cts +0 -5
- package/node_modules/zod/v4/locales/da.d.ts +0 -4
- package/node_modules/zod/v4/locales/da.js +0 -115
- package/node_modules/zod/v4/locales/de.cjs +0 -135
- package/node_modules/zod/v4/locales/de.d.cts +0 -5
- package/node_modules/zod/v4/locales/de.d.ts +0 -4
- package/node_modules/zod/v4/locales/de.js +0 -108
- package/node_modules/zod/v4/locales/el.cjs +0 -136
- package/node_modules/zod/v4/locales/el.d.cts +0 -5
- package/node_modules/zod/v4/locales/el.d.ts +0 -4
- package/node_modules/zod/v4/locales/el.js +0 -109
- package/node_modules/zod/v4/locales/en.cjs +0 -140
- package/node_modules/zod/v4/locales/en.d.cts +0 -5
- package/node_modules/zod/v4/locales/en.d.ts +0 -4
- package/node_modules/zod/v4/locales/en.js +0 -113
- package/node_modules/zod/v4/locales/eo.cjs +0 -136
- package/node_modules/zod/v4/locales/eo.d.cts +0 -5
- package/node_modules/zod/v4/locales/eo.d.ts +0 -4
- package/node_modules/zod/v4/locales/eo.js +0 -109
- package/node_modules/zod/v4/locales/es.cjs +0 -159
- package/node_modules/zod/v4/locales/es.d.cts +0 -5
- package/node_modules/zod/v4/locales/es.d.ts +0 -4
- package/node_modules/zod/v4/locales/es.js +0 -132
- package/node_modules/zod/v4/locales/fa.cjs +0 -141
- package/node_modules/zod/v4/locales/fa.d.cts +0 -5
- package/node_modules/zod/v4/locales/fa.d.ts +0 -4
- package/node_modules/zod/v4/locales/fa.js +0 -114
- package/node_modules/zod/v4/locales/fi.cjs +0 -139
- package/node_modules/zod/v4/locales/fi.d.cts +0 -5
- package/node_modules/zod/v4/locales/fi.d.ts +0 -4
- package/node_modules/zod/v4/locales/fi.js +0 -112
- package/node_modules/zod/v4/locales/fr-CA.cjs +0 -134
- package/node_modules/zod/v4/locales/fr-CA.d.cts +0 -5
- package/node_modules/zod/v4/locales/fr-CA.d.ts +0 -4
- package/node_modules/zod/v4/locales/fr-CA.js +0 -107
- package/node_modules/zod/v4/locales/fr.cjs +0 -152
- package/node_modules/zod/v4/locales/fr.d.cts +0 -5
- package/node_modules/zod/v4/locales/fr.d.ts +0 -4
- package/node_modules/zod/v4/locales/fr.js +0 -125
- package/node_modules/zod/v4/locales/he.cjs +0 -241
- package/node_modules/zod/v4/locales/he.d.cts +0 -5
- package/node_modules/zod/v4/locales/he.d.ts +0 -4
- package/node_modules/zod/v4/locales/he.js +0 -214
- package/node_modules/zod/v4/locales/hr.cjs +0 -149
- package/node_modules/zod/v4/locales/hr.d.cts +0 -5
- package/node_modules/zod/v4/locales/hr.d.ts +0 -4
- package/node_modules/zod/v4/locales/hr.js +0 -122
- package/node_modules/zod/v4/locales/hu.cjs +0 -135
- package/node_modules/zod/v4/locales/hu.d.cts +0 -5
- package/node_modules/zod/v4/locales/hu.d.ts +0 -4
- package/node_modules/zod/v4/locales/hu.js +0 -108
- package/node_modules/zod/v4/locales/hy.cjs +0 -174
- package/node_modules/zod/v4/locales/hy.d.cts +0 -5
- package/node_modules/zod/v4/locales/hy.d.ts +0 -4
- package/node_modules/zod/v4/locales/hy.js +0 -147
- package/node_modules/zod/v4/locales/id.cjs +0 -133
- package/node_modules/zod/v4/locales/id.d.cts +0 -5
- package/node_modules/zod/v4/locales/id.d.ts +0 -4
- package/node_modules/zod/v4/locales/id.js +0 -106
- package/node_modules/zod/v4/locales/index.cjs +0 -111
- package/node_modules/zod/v4/locales/index.d.cts +0 -52
- package/node_modules/zod/v4/locales/index.d.ts +0 -52
- package/node_modules/zod/v4/locales/index.js +0 -52
- package/node_modules/zod/v4/locales/is.cjs +0 -136
- package/node_modules/zod/v4/locales/is.d.cts +0 -5
- package/node_modules/zod/v4/locales/is.d.ts +0 -4
- package/node_modules/zod/v4/locales/is.js +0 -109
- package/node_modules/zod/v4/locales/it.cjs +0 -135
- package/node_modules/zod/v4/locales/it.d.cts +0 -5
- package/node_modules/zod/v4/locales/it.d.ts +0 -4
- package/node_modules/zod/v4/locales/it.js +0 -108
- package/node_modules/zod/v4/locales/ja.cjs +0 -134
- package/node_modules/zod/v4/locales/ja.d.cts +0 -5
- package/node_modules/zod/v4/locales/ja.d.ts +0 -4
- package/node_modules/zod/v4/locales/ja.js +0 -107
- package/node_modules/zod/v4/locales/ka.cjs +0 -139
- package/node_modules/zod/v4/locales/ka.d.cts +0 -5
- package/node_modules/zod/v4/locales/ka.d.ts +0 -4
- package/node_modules/zod/v4/locales/ka.js +0 -112
- package/node_modules/zod/v4/locales/kh.cjs +0 -12
- package/node_modules/zod/v4/locales/kh.d.cts +0 -5
- package/node_modules/zod/v4/locales/kh.d.ts +0 -5
- package/node_modules/zod/v4/locales/kh.js +0 -5
- package/node_modules/zod/v4/locales/km.cjs +0 -137
- package/node_modules/zod/v4/locales/km.d.cts +0 -5
- package/node_modules/zod/v4/locales/km.d.ts +0 -4
- package/node_modules/zod/v4/locales/km.js +0 -110
- package/node_modules/zod/v4/locales/ko.cjs +0 -138
- package/node_modules/zod/v4/locales/ko.d.cts +0 -5
- package/node_modules/zod/v4/locales/ko.d.ts +0 -4
- package/node_modules/zod/v4/locales/ko.js +0 -111
- package/node_modules/zod/v4/locales/lt.cjs +0 -230
- package/node_modules/zod/v4/locales/lt.d.cts +0 -5
- package/node_modules/zod/v4/locales/lt.d.ts +0 -4
- package/node_modules/zod/v4/locales/lt.js +0 -203
- package/node_modules/zod/v4/locales/mk.cjs +0 -136
- package/node_modules/zod/v4/locales/mk.d.cts +0 -5
- package/node_modules/zod/v4/locales/mk.d.ts +0 -4
- package/node_modules/zod/v4/locales/mk.js +0 -109
- package/node_modules/zod/v4/locales/ms.cjs +0 -134
- package/node_modules/zod/v4/locales/ms.d.cts +0 -5
- package/node_modules/zod/v4/locales/ms.d.ts +0 -4
- package/node_modules/zod/v4/locales/ms.js +0 -107
- package/node_modules/zod/v4/locales/nl.cjs +0 -137
- package/node_modules/zod/v4/locales/nl.d.cts +0 -5
- package/node_modules/zod/v4/locales/nl.d.ts +0 -4
- package/node_modules/zod/v4/locales/nl.js +0 -110
- package/node_modules/zod/v4/locales/no.cjs +0 -135
- package/node_modules/zod/v4/locales/no.d.cts +0 -5
- package/node_modules/zod/v4/locales/no.d.ts +0 -4
- package/node_modules/zod/v4/locales/no.js +0 -108
- package/node_modules/zod/v4/locales/ota.cjs +0 -136
- package/node_modules/zod/v4/locales/ota.d.cts +0 -5
- package/node_modules/zod/v4/locales/ota.d.ts +0 -4
- package/node_modules/zod/v4/locales/ota.js +0 -109
- package/node_modules/zod/v4/locales/package.json +0 -7
- package/node_modules/zod/v4/locales/pl.cjs +0 -136
- package/node_modules/zod/v4/locales/pl.d.cts +0 -5
- package/node_modules/zod/v4/locales/pl.d.ts +0 -4
- package/node_modules/zod/v4/locales/pl.js +0 -109
- package/node_modules/zod/v4/locales/ps.cjs +0 -141
- package/node_modules/zod/v4/locales/ps.d.cts +0 -5
- package/node_modules/zod/v4/locales/ps.d.ts +0 -4
- package/node_modules/zod/v4/locales/ps.js +0 -114
- package/node_modules/zod/v4/locales/pt.cjs +0 -135
- package/node_modules/zod/v4/locales/pt.d.cts +0 -5
- package/node_modules/zod/v4/locales/pt.d.ts +0 -4
- package/node_modules/zod/v4/locales/pt.js +0 -108
- package/node_modules/zod/v4/locales/ro.cjs +0 -146
- package/node_modules/zod/v4/locales/ro.d.cts +0 -5
- package/node_modules/zod/v4/locales/ro.d.ts +0 -4
- package/node_modules/zod/v4/locales/ro.js +0 -119
- package/node_modules/zod/v4/locales/ru.cjs +0 -183
- package/node_modules/zod/v4/locales/ru.d.cts +0 -5
- package/node_modules/zod/v4/locales/ru.d.ts +0 -4
- package/node_modules/zod/v4/locales/ru.js +0 -156
- package/node_modules/zod/v4/locales/sl.cjs +0 -136
- package/node_modules/zod/v4/locales/sl.d.cts +0 -5
- package/node_modules/zod/v4/locales/sl.d.ts +0 -4
- package/node_modules/zod/v4/locales/sl.js +0 -109
- package/node_modules/zod/v4/locales/sv.cjs +0 -137
- package/node_modules/zod/v4/locales/sv.d.cts +0 -5
- package/node_modules/zod/v4/locales/sv.d.ts +0 -4
- package/node_modules/zod/v4/locales/sv.js +0 -110
- package/node_modules/zod/v4/locales/ta.cjs +0 -137
- package/node_modules/zod/v4/locales/ta.d.cts +0 -5
- package/node_modules/zod/v4/locales/ta.d.ts +0 -4
- package/node_modules/zod/v4/locales/ta.js +0 -110
- package/node_modules/zod/v4/locales/th.cjs +0 -137
- package/node_modules/zod/v4/locales/th.d.cts +0 -5
- package/node_modules/zod/v4/locales/th.d.ts +0 -4
- package/node_modules/zod/v4/locales/th.js +0 -110
- package/node_modules/zod/v4/locales/tr.cjs +0 -132
- package/node_modules/zod/v4/locales/tr.d.cts +0 -5
- package/node_modules/zod/v4/locales/tr.d.ts +0 -4
- package/node_modules/zod/v4/locales/tr.js +0 -105
- package/node_modules/zod/v4/locales/ua.cjs +0 -12
- package/node_modules/zod/v4/locales/ua.d.cts +0 -5
- package/node_modules/zod/v4/locales/ua.d.ts +0 -5
- package/node_modules/zod/v4/locales/ua.js +0 -5
- package/node_modules/zod/v4/locales/uk.cjs +0 -135
- package/node_modules/zod/v4/locales/uk.d.cts +0 -5
- package/node_modules/zod/v4/locales/uk.d.ts +0 -4
- package/node_modules/zod/v4/locales/uk.js +0 -108
- package/node_modules/zod/v4/locales/ur.cjs +0 -137
- package/node_modules/zod/v4/locales/ur.d.cts +0 -5
- package/node_modules/zod/v4/locales/ur.d.ts +0 -4
- package/node_modules/zod/v4/locales/ur.js +0 -110
- package/node_modules/zod/v4/locales/uz.cjs +0 -137
- package/node_modules/zod/v4/locales/uz.d.cts +0 -5
- package/node_modules/zod/v4/locales/uz.d.ts +0 -4
- package/node_modules/zod/v4/locales/uz.js +0 -110
- package/node_modules/zod/v4/locales/vi.cjs +0 -135
- package/node_modules/zod/v4/locales/vi.d.cts +0 -5
- package/node_modules/zod/v4/locales/vi.d.ts +0 -4
- package/node_modules/zod/v4/locales/vi.js +0 -108
- package/node_modules/zod/v4/locales/yo.cjs +0 -134
- package/node_modules/zod/v4/locales/yo.d.cts +0 -5
- package/node_modules/zod/v4/locales/yo.d.ts +0 -4
- package/node_modules/zod/v4/locales/yo.js +0 -107
- package/node_modules/zod/v4/locales/zh-CN.cjs +0 -136
- package/node_modules/zod/v4/locales/zh-CN.d.cts +0 -5
- package/node_modules/zod/v4/locales/zh-CN.d.ts +0 -4
- package/node_modules/zod/v4/locales/zh-CN.js +0 -109
- package/node_modules/zod/v4/locales/zh-TW.cjs +0 -134
- package/node_modules/zod/v4/locales/zh-TW.d.cts +0 -5
- package/node_modules/zod/v4/locales/zh-TW.d.ts +0 -4
- package/node_modules/zod/v4/locales/zh-TW.js +0 -107
- package/node_modules/zod/v4/mini/checks.cjs +0 -34
- package/node_modules/zod/v4/mini/checks.d.cts +0 -1
- package/node_modules/zod/v4/mini/checks.d.ts +0 -1
- package/node_modules/zod/v4/mini/checks.js +0 -1
- package/node_modules/zod/v4/mini/coerce.cjs +0 -52
- package/node_modules/zod/v4/mini/coerce.d.cts +0 -7
- package/node_modules/zod/v4/mini/coerce.d.ts +0 -7
- package/node_modules/zod/v4/mini/coerce.js +0 -22
- package/node_modules/zod/v4/mini/external.cjs +0 -63
- package/node_modules/zod/v4/mini/external.d.cts +0 -13
- package/node_modules/zod/v4/mini/external.d.ts +0 -13
- package/node_modules/zod/v4/mini/external.js +0 -14
- package/node_modules/zod/v4/mini/index.cjs +0 -32
- package/node_modules/zod/v4/mini/index.d.cts +0 -3
- package/node_modules/zod/v4/mini/index.d.ts +0 -3
- package/node_modules/zod/v4/mini/index.js +0 -3
- package/node_modules/zod/v4/mini/iso.cjs +0 -64
- package/node_modules/zod/v4/mini/iso.d.cts +0 -22
- package/node_modules/zod/v4/mini/iso.d.ts +0 -22
- package/node_modules/zod/v4/mini/iso.js +0 -34
- package/node_modules/zod/v4/mini/package.json +0 -7
- package/node_modules/zod/v4/mini/parse.cjs +0 -16
- package/node_modules/zod/v4/mini/parse.d.cts +0 -1
- package/node_modules/zod/v4/mini/parse.d.ts +0 -1
- package/node_modules/zod/v4/mini/parse.js +0 -1
- package/node_modules/zod/v4/mini/schemas.cjs +0 -1083
- package/node_modules/zod/v4/mini/schemas.d.cts +0 -445
- package/node_modules/zod/v4/mini/schemas.d.ts +0 -445
- package/node_modules/zod/v4/mini/schemas.js +0 -961
- package/node_modules/zod/v4/package.json +0 -7
- package/node_modules/zod/v4-mini/index.cjs +0 -32
- package/node_modules/zod/v4-mini/index.d.cts +0 -3
- package/node_modules/zod/v4-mini/index.d.ts +0 -3
- package/node_modules/zod/v4-mini/index.js +0 -3
- package/node_modules/zod/v4-mini/package.json +0 -7
- /package/{dist/src → assets}/demo/first-run-demo.md +0 -0
- /package/{dist/src → assets}/demo/first-run-demo.seed.json +0 -0
- /package/{dist/src → assets}/fix-prompt/prompts/fix-prompt-v1.md +0 -0
|
@@ -0,0 +1,4398 @@
|
|
|
1
|
+
import { failureInjectionRuleSchema, openTwinDatabase, createFailureInjectionStore, defineTwin, twinBuildInfo, failureInjectionMiddleware, createApp, FAILURE_INJECTION_OVERRIDE_KEY, recordedRequestHeaders, UnknownToolError } from './chunk-LZIPGCQJ.js';
|
|
2
|
+
import './chunk-VBATFCWR.js';
|
|
3
|
+
import './chunk-SG6ZTIMT.js';
|
|
4
|
+
import { z, ZodError } from 'zod';
|
|
5
|
+
import { createHash, randomUUID, randomBytes } from 'node:crypto';
|
|
6
|
+
|
|
7
|
+
var BASE62 = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
|
8
|
+
var ID_PREFIXES = {
|
|
9
|
+
customer: "cus_",
|
|
10
|
+
payment_method: "pm_",
|
|
11
|
+
payment_intent: "pi_",
|
|
12
|
+
charge: "ch_",
|
|
13
|
+
refund: "re_",
|
|
14
|
+
product: "prod_",
|
|
15
|
+
price: "price_",
|
|
16
|
+
subscription: "sub_",
|
|
17
|
+
subscription_item: "si_",
|
|
18
|
+
setup_intent: "seti_",
|
|
19
|
+
checkout_session: "cs_test_",
|
|
20
|
+
webhook_endpoint: "we_",
|
|
21
|
+
event: "evt_",
|
|
22
|
+
shared_payment_issued: "spt_",
|
|
23
|
+
shared_payment_granted: "spt_",
|
|
24
|
+
profile: "profile_",
|
|
25
|
+
balance_transaction: "txn_",
|
|
26
|
+
// API keys are minted via api-keys.ts but the prefix lives here for parity.
|
|
27
|
+
api_key: "sk_test_pome_",
|
|
28
|
+
api_key_restricted: "rk_test_pome_"
|
|
29
|
+
};
|
|
30
|
+
function randomBase62(count) {
|
|
31
|
+
const buf = randomBytes(count * 2);
|
|
32
|
+
let out = "";
|
|
33
|
+
let i = 0;
|
|
34
|
+
while (out.length < count && i < buf.length) {
|
|
35
|
+
const byte = buf[i++];
|
|
36
|
+
if (byte < 248) {
|
|
37
|
+
out += BASE62[byte % 62];
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
if (out.length < count) {
|
|
41
|
+
out += randomBase62(count - out.length);
|
|
42
|
+
}
|
|
43
|
+
return out;
|
|
44
|
+
}
|
|
45
|
+
function newId(kind) {
|
|
46
|
+
return `${ID_PREFIXES[kind]}${randomBase62(24)}`;
|
|
47
|
+
}
|
|
48
|
+
function newClientSecret(piId) {
|
|
49
|
+
return `${piId}_secret_${randomBase62(24)}`;
|
|
50
|
+
}
|
|
51
|
+
function newApiKey() {
|
|
52
|
+
return newId("api_key");
|
|
53
|
+
}
|
|
54
|
+
function nowIso() {
|
|
55
|
+
return (/* @__PURE__ */ new Date()).toISOString();
|
|
56
|
+
}
|
|
57
|
+
function nowUnix() {
|
|
58
|
+
return Math.floor(Date.now() / 1e3);
|
|
59
|
+
}
|
|
60
|
+
function requestId() {
|
|
61
|
+
return `req_${randomUUID()}`;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// ../packages/twin-stripe/dist/src/api-keys.js
|
|
65
|
+
function mintApiKey(db, input) {
|
|
66
|
+
const key = input.key ?? newApiKey();
|
|
67
|
+
const account_id = input.account_id ?? `acct_${input.sid}`;
|
|
68
|
+
const created_at = nowIso();
|
|
69
|
+
db.prepare(`INSERT INTO api_keys (key, sid, account_id, created_at, revoked_at)
|
|
70
|
+
VALUES (?, ?, ?, ?, NULL)
|
|
71
|
+
ON CONFLICT(key) DO UPDATE SET
|
|
72
|
+
sid = excluded.sid,
|
|
73
|
+
account_id = excluded.account_id,
|
|
74
|
+
revoked_at = NULL`).run(key, input.sid, account_id, created_at);
|
|
75
|
+
return { key, sid: input.sid, account_id, created_at, revoked_at: null };
|
|
76
|
+
}
|
|
77
|
+
function revokeApiKey(db, key) {
|
|
78
|
+
db.prepare(`UPDATE api_keys SET revoked_at = ? WHERE key = ?`).run(nowIso(), key);
|
|
79
|
+
}
|
|
80
|
+
function resolveSidFromKey(db, token) {
|
|
81
|
+
const row = db.prepare(`SELECT key, sid, account_id, created_at, revoked_at
|
|
82
|
+
FROM api_keys
|
|
83
|
+
WHERE key = ? AND revoked_at IS NULL`).get(token);
|
|
84
|
+
if (!row)
|
|
85
|
+
return void 0;
|
|
86
|
+
return { sid: row.sid, account_id: row.account_id };
|
|
87
|
+
}
|
|
88
|
+
function looksLikeApiKey(token) {
|
|
89
|
+
return token.startsWith("sk_test_pome_") || token.startsWith("rk_test_pome_") || // Tolerate raw Stripe-style sk_test_* / rk_test_* in case a downstream
|
|
90
|
+
// user mints their own non-pome-prefixed test keys via the admin API.
|
|
91
|
+
token.startsWith("sk_test_") || token.startsWith("rk_test_");
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// ../packages/twin-stripe/dist/src/domain/schema.js
|
|
95
|
+
var STRIPE_TABLES_SQL = `
|
|
96
|
+
CREATE TABLE IF NOT EXISTS payment_intents (
|
|
97
|
+
id TEXT PRIMARY KEY,
|
|
98
|
+
account_id TEXT NOT NULL,
|
|
99
|
+
amount INTEGER NOT NULL,
|
|
100
|
+
currency TEXT NOT NULL,
|
|
101
|
+
status TEXT NOT NULL,
|
|
102
|
+
payment_method_types_json TEXT NOT NULL,
|
|
103
|
+
next_action_json TEXT,
|
|
104
|
+
latest_charge_id TEXT,
|
|
105
|
+
capture_method TEXT NOT NULL DEFAULT 'automatic',
|
|
106
|
+
confirmation_method TEXT NOT NULL DEFAULT 'automatic',
|
|
107
|
+
idempotency_key TEXT,
|
|
108
|
+
metadata_json TEXT NOT NULL DEFAULT '{}',
|
|
109
|
+
crypto_deposit_json TEXT,
|
|
110
|
+
client_secret TEXT NOT NULL,
|
|
111
|
+
created INTEGER NOT NULL,
|
|
112
|
+
updated INTEGER NOT NULL,
|
|
113
|
+
canceled_at INTEGER,
|
|
114
|
+
captured_at INTEGER,
|
|
115
|
+
payment_method_id TEXT,
|
|
116
|
+
customer_id TEXT,
|
|
117
|
+
last_payment_error_json TEXT
|
|
118
|
+
);
|
|
119
|
+
|
|
120
|
+
CREATE INDEX IF NOT EXISTS idx_payment_intents_created ON payment_intents(created);
|
|
121
|
+
CREATE INDEX IF NOT EXISTS idx_payment_intents_status ON payment_intents(status);
|
|
122
|
+
CREATE INDEX IF NOT EXISTS idx_payment_intents_account_id ON payment_intents(account_id);
|
|
123
|
+
|
|
124
|
+
CREATE TABLE IF NOT EXISTS charges (
|
|
125
|
+
id TEXT PRIMARY KEY,
|
|
126
|
+
account_id TEXT NOT NULL,
|
|
127
|
+
payment_intent_id TEXT NOT NULL,
|
|
128
|
+
amount INTEGER NOT NULL,
|
|
129
|
+
amount_captured INTEGER NOT NULL DEFAULT 0,
|
|
130
|
+
amount_refunded INTEGER NOT NULL DEFAULT 0,
|
|
131
|
+
status TEXT NOT NULL,
|
|
132
|
+
balance_transaction_id TEXT,
|
|
133
|
+
captured INTEGER NOT NULL DEFAULT 0,
|
|
134
|
+
currency TEXT NOT NULL,
|
|
135
|
+
created INTEGER NOT NULL,
|
|
136
|
+
payment_method_id TEXT,
|
|
137
|
+
payment_method_details_json TEXT,
|
|
138
|
+
failure_code TEXT,
|
|
139
|
+
failure_decline_code TEXT,
|
|
140
|
+
failure_message TEXT,
|
|
141
|
+
customer_id TEXT,
|
|
142
|
+
FOREIGN KEY (payment_intent_id) REFERENCES payment_intents(id) ON DELETE CASCADE
|
|
143
|
+
);
|
|
144
|
+
|
|
145
|
+
CREATE INDEX IF NOT EXISTS idx_charges_pi ON charges(payment_intent_id);
|
|
146
|
+
CREATE INDEX IF NOT EXISTS idx_charges_created ON charges(created);
|
|
147
|
+
CREATE INDEX IF NOT EXISTS idx_charges_account_id ON charges(account_id);
|
|
148
|
+
|
|
149
|
+
CREATE TABLE IF NOT EXISTS balance_transactions (
|
|
150
|
+
id TEXT PRIMARY KEY,
|
|
151
|
+
account_id TEXT NOT NULL,
|
|
152
|
+
type TEXT NOT NULL,
|
|
153
|
+
amount INTEGER NOT NULL,
|
|
154
|
+
fee INTEGER NOT NULL DEFAULT 0,
|
|
155
|
+
net INTEGER NOT NULL,
|
|
156
|
+
currency TEXT NOT NULL,
|
|
157
|
+
source_id TEXT,
|
|
158
|
+
source_type TEXT,
|
|
159
|
+
available_on INTEGER NOT NULL,
|
|
160
|
+
status TEXT NOT NULL DEFAULT 'available',
|
|
161
|
+
created INTEGER NOT NULL
|
|
162
|
+
);
|
|
163
|
+
|
|
164
|
+
CREATE INDEX IF NOT EXISTS idx_balance_tx_created ON balance_transactions(created);
|
|
165
|
+
CREATE INDEX IF NOT EXISTS idx_balance_tx_source ON balance_transactions(source_id);
|
|
166
|
+
CREATE INDEX IF NOT EXISTS idx_balance_tx_account_id ON balance_transactions(account_id);
|
|
167
|
+
|
|
168
|
+
CREATE TABLE IF NOT EXISTS events (
|
|
169
|
+
id TEXT PRIMARY KEY,
|
|
170
|
+
account_id TEXT NOT NULL,
|
|
171
|
+
type TEXT NOT NULL,
|
|
172
|
+
data_json TEXT NOT NULL,
|
|
173
|
+
request_idempotency_key TEXT,
|
|
174
|
+
livemode INTEGER NOT NULL DEFAULT 0,
|
|
175
|
+
api_version TEXT NOT NULL,
|
|
176
|
+
created INTEGER NOT NULL
|
|
177
|
+
);
|
|
178
|
+
|
|
179
|
+
CREATE INDEX IF NOT EXISTS idx_events_type ON events(type);
|
|
180
|
+
CREATE INDEX IF NOT EXISTS idx_events_created ON events(created);
|
|
181
|
+
CREATE INDEX IF NOT EXISTS idx_events_account_id ON events(account_id);
|
|
182
|
+
|
|
183
|
+
CREATE TABLE IF NOT EXISTS refunds (
|
|
184
|
+
id TEXT PRIMARY KEY,
|
|
185
|
+
account_id TEXT NOT NULL,
|
|
186
|
+
charge_id TEXT NOT NULL,
|
|
187
|
+
payment_intent_id TEXT NOT NULL,
|
|
188
|
+
amount INTEGER NOT NULL,
|
|
189
|
+
currency TEXT NOT NULL,
|
|
190
|
+
status TEXT NOT NULL,
|
|
191
|
+
reason TEXT,
|
|
192
|
+
balance_transaction_id TEXT,
|
|
193
|
+
idempotency_key TEXT,
|
|
194
|
+
created INTEGER NOT NULL,
|
|
195
|
+
FOREIGN KEY (charge_id) REFERENCES charges(id) ON DELETE CASCADE
|
|
196
|
+
);
|
|
197
|
+
|
|
198
|
+
CREATE INDEX IF NOT EXISTS idx_refunds_charge ON refunds(charge_id);
|
|
199
|
+
CREATE INDEX IF NOT EXISTS idx_refunds_payment_intent ON refunds(payment_intent_id);
|
|
200
|
+
CREATE INDEX IF NOT EXISTS idx_refunds_created ON refunds(created);
|
|
201
|
+
CREATE INDEX IF NOT EXISTS idx_refunds_account_id ON refunds(account_id);
|
|
202
|
+
|
|
203
|
+
CREATE TABLE IF NOT EXISTS customers (
|
|
204
|
+
id TEXT PRIMARY KEY,
|
|
205
|
+
account_id TEXT NOT NULL,
|
|
206
|
+
name TEXT,
|
|
207
|
+
email TEXT,
|
|
208
|
+
description TEXT,
|
|
209
|
+
phone TEXT,
|
|
210
|
+
metadata_json TEXT NOT NULL DEFAULT '{}',
|
|
211
|
+
deleted INTEGER NOT NULL DEFAULT 0,
|
|
212
|
+
created INTEGER NOT NULL
|
|
213
|
+
);
|
|
214
|
+
|
|
215
|
+
CREATE INDEX IF NOT EXISTS idx_customers_created ON customers(created);
|
|
216
|
+
CREATE INDEX IF NOT EXISTS idx_customers_email ON customers(email);
|
|
217
|
+
CREATE INDEX IF NOT EXISTS idx_customers_account_id ON customers(account_id);
|
|
218
|
+
|
|
219
|
+
CREATE TABLE IF NOT EXISTS payment_methods (
|
|
220
|
+
id TEXT PRIMARY KEY,
|
|
221
|
+
account_id TEXT NOT NULL,
|
|
222
|
+
type TEXT NOT NULL,
|
|
223
|
+
card_brand TEXT NOT NULL,
|
|
224
|
+
card_last4 TEXT NOT NULL,
|
|
225
|
+
card_exp_month INTEGER NOT NULL,
|
|
226
|
+
card_exp_year INTEGER NOT NULL,
|
|
227
|
+
card_fingerprint TEXT NOT NULL,
|
|
228
|
+
customer_id TEXT,
|
|
229
|
+
detached INTEGER NOT NULL DEFAULT 0,
|
|
230
|
+
created INTEGER NOT NULL
|
|
231
|
+
);
|
|
232
|
+
|
|
233
|
+
CREATE INDEX IF NOT EXISTS idx_payment_methods_customer ON payment_methods(customer_id);
|
|
234
|
+
CREATE INDEX IF NOT EXISTS idx_payment_methods_created ON payment_methods(created);
|
|
235
|
+
CREATE INDEX IF NOT EXISTS idx_payment_methods_account_id ON payment_methods(account_id);
|
|
236
|
+
|
|
237
|
+
-- F-734 billing tables (warm surfaces, shape tier): plain stored rows served
|
|
238
|
+
-- back in Stripe shape. No invoices table \u2014 invoices are reads-only and
|
|
239
|
+
-- nothing in the twin mints one (loud shape divergence, see FIDELITY.md).
|
|
240
|
+
|
|
241
|
+
CREATE TABLE IF NOT EXISTS products (
|
|
242
|
+
id TEXT PRIMARY KEY,
|
|
243
|
+
account_id TEXT NOT NULL,
|
|
244
|
+
name TEXT NOT NULL,
|
|
245
|
+
description TEXT,
|
|
246
|
+
active INTEGER NOT NULL DEFAULT 1,
|
|
247
|
+
metadata_json TEXT NOT NULL DEFAULT '{}',
|
|
248
|
+
created INTEGER NOT NULL,
|
|
249
|
+
updated INTEGER NOT NULL
|
|
250
|
+
);
|
|
251
|
+
|
|
252
|
+
CREATE INDEX IF NOT EXISTS idx_products_created ON products(created);
|
|
253
|
+
CREATE INDEX IF NOT EXISTS idx_products_account_id ON products(account_id);
|
|
254
|
+
|
|
255
|
+
CREATE TABLE IF NOT EXISTS prices (
|
|
256
|
+
id TEXT PRIMARY KEY,
|
|
257
|
+
account_id TEXT NOT NULL,
|
|
258
|
+
product_id TEXT NOT NULL,
|
|
259
|
+
currency TEXT NOT NULL,
|
|
260
|
+
unit_amount INTEGER,
|
|
261
|
+
recurring_interval TEXT,
|
|
262
|
+
recurring_interval_count INTEGER,
|
|
263
|
+
active INTEGER NOT NULL DEFAULT 1,
|
|
264
|
+
nickname TEXT,
|
|
265
|
+
lookup_key TEXT,
|
|
266
|
+
metadata_json TEXT NOT NULL DEFAULT '{}',
|
|
267
|
+
created INTEGER NOT NULL
|
|
268
|
+
);
|
|
269
|
+
|
|
270
|
+
CREATE INDEX IF NOT EXISTS idx_prices_created ON prices(created);
|
|
271
|
+
CREATE INDEX IF NOT EXISTS idx_prices_product ON prices(product_id);
|
|
272
|
+
CREATE INDEX IF NOT EXISTS idx_prices_account_id ON prices(account_id);
|
|
273
|
+
|
|
274
|
+
CREATE TABLE IF NOT EXISTS subscriptions (
|
|
275
|
+
id TEXT PRIMARY KEY,
|
|
276
|
+
account_id TEXT NOT NULL,
|
|
277
|
+
customer_id TEXT NOT NULL,
|
|
278
|
+
status TEXT NOT NULL,
|
|
279
|
+
items_json TEXT NOT NULL,
|
|
280
|
+
cancel_at_period_end INTEGER NOT NULL DEFAULT 0,
|
|
281
|
+
canceled_at INTEGER,
|
|
282
|
+
ended_at INTEGER,
|
|
283
|
+
metadata_json TEXT NOT NULL DEFAULT '{}',
|
|
284
|
+
created INTEGER NOT NULL
|
|
285
|
+
);
|
|
286
|
+
|
|
287
|
+
CREATE INDEX IF NOT EXISTS idx_subscriptions_created ON subscriptions(created);
|
|
288
|
+
CREATE INDEX IF NOT EXISTS idx_subscriptions_customer ON subscriptions(customer_id);
|
|
289
|
+
CREATE INDEX IF NOT EXISTS idx_subscriptions_account_id ON subscriptions(account_id);
|
|
290
|
+
`;
|
|
291
|
+
var STRIPE_TABLES = [
|
|
292
|
+
"refunds",
|
|
293
|
+
"events",
|
|
294
|
+
"balance_transactions",
|
|
295
|
+
"charges",
|
|
296
|
+
"payment_intents",
|
|
297
|
+
"payment_methods",
|
|
298
|
+
"customers",
|
|
299
|
+
"subscriptions",
|
|
300
|
+
"prices",
|
|
301
|
+
"products"
|
|
302
|
+
];
|
|
303
|
+
function ensureStripeTables(db) {
|
|
304
|
+
db.pragma("busy_timeout = 5000");
|
|
305
|
+
db.pragma("journal_mode = WAL");
|
|
306
|
+
db.pragma("foreign_keys = ON");
|
|
307
|
+
db.exec(STRIPE_TABLES_SQL);
|
|
308
|
+
ensureMigratedColumns(db);
|
|
309
|
+
}
|
|
310
|
+
var MIGRATED_COLUMNS = {
|
|
311
|
+
payment_intents: [
|
|
312
|
+
["payment_method_id", "payment_method_id TEXT"],
|
|
313
|
+
["customer_id", "customer_id TEXT"],
|
|
314
|
+
["last_payment_error_json", "last_payment_error_json TEXT"]
|
|
315
|
+
],
|
|
316
|
+
charges: [
|
|
317
|
+
["payment_method_id", "payment_method_id TEXT"],
|
|
318
|
+
["payment_method_details_json", "payment_method_details_json TEXT"],
|
|
319
|
+
["failure_code", "failure_code TEXT"],
|
|
320
|
+
["failure_decline_code", "failure_decline_code TEXT"],
|
|
321
|
+
["failure_message", "failure_message TEXT"],
|
|
322
|
+
["customer_id", "customer_id TEXT"]
|
|
323
|
+
],
|
|
324
|
+
refunds: [["balance_transaction_id", "balance_transaction_id TEXT"]]
|
|
325
|
+
};
|
|
326
|
+
function ensureMigratedColumns(db) {
|
|
327
|
+
for (const [table, columns] of Object.entries(MIGRATED_COLUMNS)) {
|
|
328
|
+
const existing = new Set(db.prepare(`SELECT name FROM pragma_table_info(?)`).all(table).map((row) => row.name));
|
|
329
|
+
if (existing.size === 0)
|
|
330
|
+
continue;
|
|
331
|
+
for (const [column, ddl] of columns) {
|
|
332
|
+
if (!existing.has(column))
|
|
333
|
+
db.exec(`ALTER TABLE ${table} ADD COLUMN ${ddl};`);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
function resetStripeTables(db) {
|
|
338
|
+
for (const table of STRIPE_TABLES) {
|
|
339
|
+
db.exec(`DELETE FROM ${table};`);
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
// ../packages/twin-stripe/dist/src/db.js
|
|
344
|
+
var MIGRATION_SQL = `
|
|
345
|
+
-- ----- chassis tables -------------------------------------------------------
|
|
346
|
+
|
|
347
|
+
CREATE TABLE IF NOT EXISTS api_keys (
|
|
348
|
+
key TEXT PRIMARY KEY,
|
|
349
|
+
sid TEXT NOT NULL,
|
|
350
|
+
account_id TEXT NOT NULL,
|
|
351
|
+
created_at TEXT NOT NULL,
|
|
352
|
+
revoked_at TEXT
|
|
353
|
+
);
|
|
354
|
+
|
|
355
|
+
CREATE INDEX IF NOT EXISTS idx_api_keys_sid ON api_keys(sid);
|
|
356
|
+
|
|
357
|
+
CREATE TABLE IF NOT EXISTS idempotency_keys (
|
|
358
|
+
key TEXT NOT NULL,
|
|
359
|
+
account_id TEXT NOT NULL,
|
|
360
|
+
method TEXT NOT NULL,
|
|
361
|
+
path TEXT NOT NULL,
|
|
362
|
+
request_hash TEXT NOT NULL,
|
|
363
|
+
response_status INTEGER NOT NULL,
|
|
364
|
+
response_body_json TEXT NOT NULL,
|
|
365
|
+
created_at TEXT NOT NULL,
|
|
366
|
+
PRIMARY KEY (key, account_id, method, path)
|
|
367
|
+
);
|
|
368
|
+
|
|
369
|
+
-- ----- v1 Stripe domain tables ---------------------------------------------
|
|
370
|
+
|
|
371
|
+
CREATE TABLE IF NOT EXISTS payment_intents (
|
|
372
|
+
id TEXT PRIMARY KEY,
|
|
373
|
+
account_id TEXT NOT NULL,
|
|
374
|
+
amount INTEGER NOT NULL,
|
|
375
|
+
currency TEXT NOT NULL,
|
|
376
|
+
status TEXT NOT NULL,
|
|
377
|
+
payment_method_types_json TEXT NOT NULL DEFAULT '[]',
|
|
378
|
+
next_action_json TEXT,
|
|
379
|
+
latest_charge_id TEXT,
|
|
380
|
+
capture_method TEXT NOT NULL DEFAULT 'automatic',
|
|
381
|
+
confirmation_method TEXT NOT NULL DEFAULT 'automatic',
|
|
382
|
+
idempotency_key TEXT,
|
|
383
|
+
metadata_json TEXT NOT NULL DEFAULT '{}',
|
|
384
|
+
crypto_deposit_json TEXT,
|
|
385
|
+
client_secret TEXT NOT NULL,
|
|
386
|
+
created INTEGER NOT NULL,
|
|
387
|
+
updated INTEGER NOT NULL,
|
|
388
|
+
canceled_at INTEGER,
|
|
389
|
+
captured_at INTEGER,
|
|
390
|
+
payment_method_id TEXT,
|
|
391
|
+
customer_id TEXT,
|
|
392
|
+
last_payment_error_json TEXT
|
|
393
|
+
);
|
|
394
|
+
|
|
395
|
+
CREATE INDEX IF NOT EXISTS idx_payment_intents_created ON payment_intents(created);
|
|
396
|
+
CREATE INDEX IF NOT EXISTS idx_payment_intents_status ON payment_intents(status);
|
|
397
|
+
CREATE INDEX IF NOT EXISTS idx_payment_intents_account_id ON payment_intents(account_id);
|
|
398
|
+
|
|
399
|
+
CREATE TABLE IF NOT EXISTS charges (
|
|
400
|
+
id TEXT PRIMARY KEY,
|
|
401
|
+
account_id TEXT NOT NULL,
|
|
402
|
+
payment_intent_id TEXT NOT NULL,
|
|
403
|
+
amount INTEGER NOT NULL,
|
|
404
|
+
amount_captured INTEGER NOT NULL DEFAULT 0,
|
|
405
|
+
amount_refunded INTEGER NOT NULL DEFAULT 0,
|
|
406
|
+
status TEXT NOT NULL,
|
|
407
|
+
balance_transaction_id TEXT,
|
|
408
|
+
captured INTEGER NOT NULL DEFAULT 0,
|
|
409
|
+
created INTEGER NOT NULL,
|
|
410
|
+
currency TEXT NOT NULL,
|
|
411
|
+
payment_method_id TEXT,
|
|
412
|
+
payment_method_details_json TEXT,
|
|
413
|
+
failure_code TEXT,
|
|
414
|
+
failure_decline_code TEXT,
|
|
415
|
+
failure_message TEXT,
|
|
416
|
+
customer_id TEXT
|
|
417
|
+
);
|
|
418
|
+
|
|
419
|
+
CREATE INDEX IF NOT EXISTS idx_charges_payment_intent ON charges(payment_intent_id);
|
|
420
|
+
CREATE INDEX IF NOT EXISTS idx_charges_created ON charges(created);
|
|
421
|
+
CREATE INDEX IF NOT EXISTS idx_charges_account_id ON charges(account_id);
|
|
422
|
+
|
|
423
|
+
CREATE TABLE IF NOT EXISTS balance_transactions (
|
|
424
|
+
id TEXT PRIMARY KEY,
|
|
425
|
+
account_id TEXT NOT NULL,
|
|
426
|
+
type TEXT NOT NULL,
|
|
427
|
+
amount INTEGER NOT NULL,
|
|
428
|
+
fee INTEGER NOT NULL DEFAULT 0,
|
|
429
|
+
net INTEGER NOT NULL,
|
|
430
|
+
currency TEXT NOT NULL,
|
|
431
|
+
source_id TEXT,
|
|
432
|
+
source_type TEXT,
|
|
433
|
+
available_on INTEGER NOT NULL,
|
|
434
|
+
created INTEGER NOT NULL,
|
|
435
|
+
status TEXT NOT NULL DEFAULT 'pending'
|
|
436
|
+
);
|
|
437
|
+
|
|
438
|
+
CREATE INDEX IF NOT EXISTS idx_balance_transactions_created ON balance_transactions(created);
|
|
439
|
+
CREATE INDEX IF NOT EXISTS idx_balance_transactions_source ON balance_transactions(source_id);
|
|
440
|
+
CREATE INDEX IF NOT EXISTS idx_balance_transactions_account_id ON balance_transactions(account_id);
|
|
441
|
+
|
|
442
|
+
CREATE TABLE IF NOT EXISTS events (
|
|
443
|
+
id TEXT PRIMARY KEY,
|
|
444
|
+
account_id TEXT NOT NULL,
|
|
445
|
+
type TEXT NOT NULL,
|
|
446
|
+
data_json TEXT NOT NULL,
|
|
447
|
+
request_idempotency_key TEXT,
|
|
448
|
+
livemode INTEGER NOT NULL DEFAULT 0,
|
|
449
|
+
created INTEGER NOT NULL,
|
|
450
|
+
api_version TEXT NOT NULL
|
|
451
|
+
);
|
|
452
|
+
|
|
453
|
+
CREATE INDEX IF NOT EXISTS idx_events_type ON events(type);
|
|
454
|
+
CREATE INDEX IF NOT EXISTS idx_events_created ON events(created);
|
|
455
|
+
CREATE INDEX IF NOT EXISTS idx_events_account_id ON events(account_id);
|
|
456
|
+
|
|
457
|
+
-- ----- audit log (writes through admin/seed/reset) ------------------------
|
|
458
|
+
|
|
459
|
+
CREATE TABLE IF NOT EXISTS audit_log (
|
|
460
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
461
|
+
ts TEXT NOT NULL,
|
|
462
|
+
action TEXT NOT NULL,
|
|
463
|
+
payload_json TEXT NOT NULL
|
|
464
|
+
);
|
|
465
|
+
`;
|
|
466
|
+
var RESET_SQL = `
|
|
467
|
+
DELETE FROM audit_log;
|
|
468
|
+
DELETE FROM refunds;
|
|
469
|
+
DELETE FROM events;
|
|
470
|
+
DELETE FROM balance_transactions;
|
|
471
|
+
DELETE FROM charges;
|
|
472
|
+
DELETE FROM payment_intents;
|
|
473
|
+
DELETE FROM payment_methods;
|
|
474
|
+
DELETE FROM customers;
|
|
475
|
+
DELETE FROM subscriptions;
|
|
476
|
+
DELETE FROM prices;
|
|
477
|
+
DELETE FROM products;
|
|
478
|
+
DELETE FROM idempotency_keys;
|
|
479
|
+
DELETE FROM api_keys;
|
|
480
|
+
`;
|
|
481
|
+
function openTwinStripeDatabase(path = process.env.STRIPE_CLONE_DB ?? ":memory:") {
|
|
482
|
+
return openTwinDatabase(path, { migrate });
|
|
483
|
+
}
|
|
484
|
+
function migrate(db) {
|
|
485
|
+
db.exec(MIGRATION_SQL);
|
|
486
|
+
ensureMigratedColumns(db);
|
|
487
|
+
}
|
|
488
|
+
function resetDatabase(db) {
|
|
489
|
+
ensureStripeTables(db);
|
|
490
|
+
db.exec(RESET_SQL);
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
// ../packages/twin-stripe/dist/src/errors.js
|
|
494
|
+
var TwinError = class extends Error {
|
|
495
|
+
status;
|
|
496
|
+
type;
|
|
497
|
+
code;
|
|
498
|
+
param;
|
|
499
|
+
doc_url;
|
|
500
|
+
fidelity;
|
|
501
|
+
supported_surfaces;
|
|
502
|
+
decline_code;
|
|
503
|
+
payment_intent;
|
|
504
|
+
state_mutation;
|
|
505
|
+
state_delta;
|
|
506
|
+
constructor(type, code, message, opts = {}) {
|
|
507
|
+
super(message);
|
|
508
|
+
this.type = type;
|
|
509
|
+
this.code = code;
|
|
510
|
+
this.status = opts.statusCode ?? 400;
|
|
511
|
+
this.param = opts.param;
|
|
512
|
+
this.doc_url = opts.doc_url;
|
|
513
|
+
this.fidelity = opts.fidelity;
|
|
514
|
+
this.supported_surfaces = opts.supported_surfaces;
|
|
515
|
+
this.decline_code = opts.decline_code;
|
|
516
|
+
this.payment_intent = opts.payment_intent;
|
|
517
|
+
this.state_mutation = opts.state_mutation;
|
|
518
|
+
this.state_delta = opts.state_delta;
|
|
519
|
+
}
|
|
520
|
+
toEnvelope() {
|
|
521
|
+
return stripeError(this.type, this.code, this.message, {
|
|
522
|
+
param: this.param,
|
|
523
|
+
doc_url: this.doc_url,
|
|
524
|
+
fidelity: this.fidelity,
|
|
525
|
+
supported_surfaces: this.supported_surfaces,
|
|
526
|
+
decline_code: this.decline_code,
|
|
527
|
+
payment_intent: this.payment_intent
|
|
528
|
+
}).body;
|
|
529
|
+
}
|
|
530
|
+
};
|
|
531
|
+
function stripeError(type, code, message, opts = {}) {
|
|
532
|
+
const error = { type, code, message };
|
|
533
|
+
if (opts.param !== void 0)
|
|
534
|
+
error.param = opts.param;
|
|
535
|
+
if (opts.doc_url !== void 0)
|
|
536
|
+
error.doc_url = opts.doc_url;
|
|
537
|
+
if (opts.fidelity !== void 0)
|
|
538
|
+
error.fidelity = opts.fidelity;
|
|
539
|
+
if (opts.supported_surfaces !== void 0) {
|
|
540
|
+
error.supported_surfaces = opts.supported_surfaces;
|
|
541
|
+
}
|
|
542
|
+
if (opts.decline_code !== void 0)
|
|
543
|
+
error.decline_code = opts.decline_code;
|
|
544
|
+
if (opts.payment_intent !== void 0)
|
|
545
|
+
error.payment_intent = opts.payment_intent;
|
|
546
|
+
return {
|
|
547
|
+
status: opts.statusCode ?? 400,
|
|
548
|
+
body: { error }
|
|
549
|
+
};
|
|
550
|
+
}
|
|
551
|
+
function unauthorized(message = "Invalid API Key provided.") {
|
|
552
|
+
return stripeError("invalid_request_error", "unauthorized", message, {
|
|
553
|
+
statusCode: 401
|
|
554
|
+
});
|
|
555
|
+
}
|
|
556
|
+
function forbidden(message = "Forbidden") {
|
|
557
|
+
return stripeError("invalid_request_error", "forbidden", message, {
|
|
558
|
+
statusCode: 403
|
|
559
|
+
});
|
|
560
|
+
}
|
|
561
|
+
function unsupported() {
|
|
562
|
+
return stripeError("invalid_request_error", "endpoint_not_supported", "This endpoint is not supported by this Stripe twin clone.", {
|
|
563
|
+
statusCode: 501,
|
|
564
|
+
fidelity: "unsupported",
|
|
565
|
+
supported_surfaces: [
|
|
566
|
+
"Stripe-shaped REST under /v1/*",
|
|
567
|
+
"GET /s/:sid/mcp/tools",
|
|
568
|
+
"POST /s/:sid/mcp/call",
|
|
569
|
+
"POST /s/:sid/mcp/tools/:name"
|
|
570
|
+
]
|
|
571
|
+
});
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
// ../packages/twin-stripe/dist/src/domain/constants.js
|
|
575
|
+
var STRIPE_API_VERSION = "2026-03-04.preview";
|
|
576
|
+
var DEFAULT_CAPTURE_METHOD = "automatic";
|
|
577
|
+
var DEFAULT_CONFIRMATION_METHOD = "automatic";
|
|
578
|
+
var BASE_USDC_CONTRACT_ADDRESS = "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913";
|
|
579
|
+
var SUPPORTED_NETWORKS = ["base"];
|
|
580
|
+
var CRYPTO_CURRENCIES = ["usd"];
|
|
581
|
+
|
|
582
|
+
// ../packages/twin-stripe/dist/src/domain/payment-intents.js
|
|
583
|
+
var PaymentIntentsDomain = class {
|
|
584
|
+
db;
|
|
585
|
+
constructor(db) {
|
|
586
|
+
this.db = db;
|
|
587
|
+
ensureStripeTables(db);
|
|
588
|
+
}
|
|
589
|
+
// ---------- create ----------
|
|
590
|
+
/**
|
|
591
|
+
* Insert a fresh PI. The caller (StripeDomain) has already resolved and
|
|
592
|
+
* cross-validated `payment_method` / `customer` for the card rail —
|
|
593
|
+
* `resolved` carries the validated ids so this module stays free of the
|
|
594
|
+
* sibling domains.
|
|
595
|
+
*/
|
|
596
|
+
create(accountId2, input, resolved) {
|
|
597
|
+
if (!Number.isInteger(input.amount) || input.amount <= 0) {
|
|
598
|
+
throw new TwinError("invalid_request_error", "parameter_invalid_integer", "Amount must be a positive integer.", { param: "amount", statusCode: 400 });
|
|
599
|
+
}
|
|
600
|
+
const currency = (input.currency ?? "").toLowerCase();
|
|
601
|
+
if (!currency) {
|
|
602
|
+
throw new TwinError("invalid_request_error", "parameter_missing", "Missing required param: currency.", { param: "currency", statusCode: 400 });
|
|
603
|
+
}
|
|
604
|
+
if (!CRYPTO_CURRENCIES.includes(currency)) {
|
|
605
|
+
throw new TwinError("invalid_request_error", "currency_not_supported", `Currency '${currency}' is not supported by this twin (v1 supports: ${CRYPTO_CURRENCIES.join(", ")}).`, { param: "currency", statusCode: 400 });
|
|
606
|
+
}
|
|
607
|
+
const pmTypes = input.payment_method_types ?? [];
|
|
608
|
+
const pmType = pmTypes.length === 1 ? pmTypes[0] : void 0;
|
|
609
|
+
if (pmType !== "crypto" && pmType !== "card") {
|
|
610
|
+
throw new TwinError("invalid_request_error", "parameter_invalid_string", 'payment_method_types must be exactly ["crypto"] or ["card"] for this twin.', { param: "payment_method_types", statusCode: 400 });
|
|
611
|
+
}
|
|
612
|
+
const id = newId("payment_intent");
|
|
613
|
+
const clientSecret = newClientSecret(id);
|
|
614
|
+
const now = nowUnix();
|
|
615
|
+
let status;
|
|
616
|
+
let nextActionJson = null;
|
|
617
|
+
let cryptoDepositJson = null;
|
|
618
|
+
if (pmType === "crypto") {
|
|
619
|
+
if (input.payment_method || input.customer || input.confirm) {
|
|
620
|
+
throw new TwinError("invalid_request_error", "parameter_invalid_string", 'payment_method, customer, and confirm are only valid with payment_method_types ["card"].', { param: "payment_method", statusCode: 400 });
|
|
621
|
+
}
|
|
622
|
+
const cryptoOpts = input.payment_method_options?.crypto;
|
|
623
|
+
if (!cryptoOpts || cryptoOpts.mode !== "deposit") {
|
|
624
|
+
throw new TwinError("invalid_request_error", "parameter_invalid_string", 'payment_method_options.crypto.mode must be "deposit" for crypto PaymentIntents.', { param: "payment_method_options[crypto][mode]", statusCode: 400 });
|
|
625
|
+
}
|
|
626
|
+
const networks = cryptoOpts.deposit_options?.networks ?? [];
|
|
627
|
+
const network = networks[0];
|
|
628
|
+
if (!network || !SUPPORTED_NETWORKS.includes(network)) {
|
|
629
|
+
throw new TwinError("invalid_request_error", "parameter_invalid_string", `payment_method_options.crypto.deposit_options.networks must include one of: ${SUPPORTED_NETWORKS.join(", ")}.`, { param: "payment_method_options[crypto][deposit_options][networks]", statusCode: 400 });
|
|
630
|
+
}
|
|
631
|
+
const address = depositAddressFromId(id);
|
|
632
|
+
const cryptoDeposit = {
|
|
633
|
+
deposit_addresses: {
|
|
634
|
+
[network]: {
|
|
635
|
+
address,
|
|
636
|
+
supported_tokens: [
|
|
637
|
+
{
|
|
638
|
+
token_currency: "usdc",
|
|
639
|
+
token_contract_address: BASE_USDC_CONTRACT_ADDRESS
|
|
640
|
+
}
|
|
641
|
+
]
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
};
|
|
645
|
+
status = "requires_action";
|
|
646
|
+
nextActionJson = JSON.stringify({
|
|
647
|
+
type: "display_crypto_deposit_information",
|
|
648
|
+
crypto_display_details: cryptoDeposit
|
|
649
|
+
});
|
|
650
|
+
cryptoDepositJson = JSON.stringify(cryptoDeposit);
|
|
651
|
+
} else {
|
|
652
|
+
if (input.payment_method_options?.crypto) {
|
|
653
|
+
throw new TwinError("invalid_request_error", "parameter_invalid_string", 'payment_method_options.crypto is only valid with payment_method_types ["crypto"].', { param: "payment_method_options[crypto]", statusCode: 400 });
|
|
654
|
+
}
|
|
655
|
+
status = resolved.paymentMethodId ? "requires_confirmation" : "requires_payment_method";
|
|
656
|
+
}
|
|
657
|
+
this.db.prepare(`INSERT INTO payment_intents (
|
|
658
|
+
id, account_id, amount, currency, status,
|
|
659
|
+
payment_method_types_json, next_action_json,
|
|
660
|
+
latest_charge_id, capture_method, confirmation_method,
|
|
661
|
+
idempotency_key, metadata_json, crypto_deposit_json,
|
|
662
|
+
client_secret, created, updated, canceled_at, captured_at,
|
|
663
|
+
payment_method_id, customer_id, last_payment_error_json
|
|
664
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, NULL, ?, ?, ?, ?, ?, ?, ?, ?, NULL, NULL, ?, ?, NULL)`).run(id, accountId2, input.amount, currency, status, JSON.stringify(pmTypes), nextActionJson, input.capture_method ?? DEFAULT_CAPTURE_METHOD, input.confirmation_method ?? DEFAULT_CONFIRMATION_METHOD, input.idempotency_key ?? null, JSON.stringify(input.metadata ?? {}), cryptoDepositJson, clientSecret, now, now, resolved.paymentMethodId, resolved.customerId);
|
|
665
|
+
return this.requireById(accountId2, id);
|
|
666
|
+
}
|
|
667
|
+
// ---------- confirm ----------
|
|
668
|
+
/**
|
|
669
|
+
* Crypto-deposit confirm is idempotent. If the PI is already in
|
|
670
|
+
* `requires_action`, return it unchanged. If it's mid- or post-flight
|
|
671
|
+
* (`processing` / `succeeded`), return it. Only `canceled` is rejected.
|
|
672
|
+
*/
|
|
673
|
+
confirm(accountId2, id) {
|
|
674
|
+
const pi = this.requireById(accountId2, id);
|
|
675
|
+
if (pi.status === "canceled") {
|
|
676
|
+
throw piUnexpectedState(pi.status);
|
|
677
|
+
}
|
|
678
|
+
return pi;
|
|
679
|
+
}
|
|
680
|
+
/**
|
|
681
|
+
* Card confirm leg 1: CAS the observed pre-confirm status
|
|
682
|
+
* (`requires_confirmation` or `requires_payment_method`) → `processing`,
|
|
683
|
+
* stamping the PM being attempted. Exactly one of N parallel confirms
|
|
684
|
+
* wins this CAS; losers see `payment_intent_unexpected_state`.
|
|
685
|
+
*/
|
|
686
|
+
confirmCardLeg1(accountId2, id, expected, paymentMethodId) {
|
|
687
|
+
return this.casStatusOrThrow(accountId2, id, expected, "processing", {
|
|
688
|
+
payment_method_id: paymentMethodId
|
|
689
|
+
});
|
|
690
|
+
}
|
|
691
|
+
/** Card confirm leg 2, success: processing → succeeded with the charge. */
|
|
692
|
+
finalizeCardSuccess(accountId2, id, latestChargeId) {
|
|
693
|
+
return this.casStatusOrThrow(accountId2, id, "processing", "succeeded", {
|
|
694
|
+
latest_charge_id: latestChargeId,
|
|
695
|
+
captured_at: nowUnix(),
|
|
696
|
+
last_payment_error_json: null
|
|
697
|
+
});
|
|
698
|
+
}
|
|
699
|
+
/**
|
|
700
|
+
* Card confirm leg 2, decline: processing → requires_payment_method with
|
|
701
|
+
* the failed charge and `last_payment_error` on the record. The declined
|
|
702
|
+
* PM is dropped from the PI, like real Stripe.
|
|
703
|
+
*/
|
|
704
|
+
finalizeCardDecline(accountId2, id, failedChargeId, lastPaymentErrorJson) {
|
|
705
|
+
return this.casStatusOrThrow(accountId2, id, "processing", "requires_payment_method", {
|
|
706
|
+
latest_charge_id: failedChargeId,
|
|
707
|
+
payment_method_id: null,
|
|
708
|
+
last_payment_error_json: lastPaymentErrorJson
|
|
709
|
+
});
|
|
710
|
+
}
|
|
711
|
+
// ---------- update (POST /v1/payment_intents/:id, F-731) ----------
|
|
712
|
+
/**
|
|
713
|
+
* Update a non-terminal PI. Metadata merges per-key (empty/null unsets,
|
|
714
|
+
* Stripe's metadata contract). `payment_method` / `customer` are only
|
|
715
|
+
* valid on the card rail and have been resolved by the caller;
|
|
716
|
+
* attaching a PM moves requires_payment_method → requires_confirmation.
|
|
717
|
+
* The UPDATE is guarded on the observed status so a racing confirm wins.
|
|
718
|
+
*/
|
|
719
|
+
update(accountId2, id, input, resolved = {}) {
|
|
720
|
+
const pi = this.requireById(accountId2, id);
|
|
721
|
+
const updatable = /* @__PURE__ */ new Set([
|
|
722
|
+
"requires_payment_method",
|
|
723
|
+
"requires_confirmation",
|
|
724
|
+
"requires_action"
|
|
725
|
+
]);
|
|
726
|
+
if (!updatable.has(pi.status)) {
|
|
727
|
+
throw piUnexpectedState(pi.status);
|
|
728
|
+
}
|
|
729
|
+
const isCard = piTypes(pi).includes("card");
|
|
730
|
+
if (!isCard && (input.amount !== void 0 || input.payment_method !== void 0 || input.customer !== void 0)) {
|
|
731
|
+
throw new TwinError("invalid_request_error", "parameter_invalid_string", "Only metadata can be updated on crypto PaymentIntents.", { param: "payment_method", statusCode: 400 });
|
|
732
|
+
}
|
|
733
|
+
if (input.amount !== void 0 && (!Number.isInteger(input.amount) || input.amount <= 0)) {
|
|
734
|
+
throw new TwinError("invalid_request_error", "parameter_invalid_integer", "Amount must be a positive integer.", { param: "amount", statusCode: 400 });
|
|
735
|
+
}
|
|
736
|
+
const metadata = JSON.parse(pi.metadata_json);
|
|
737
|
+
for (const [key, value] of Object.entries(input.metadata ?? {})) {
|
|
738
|
+
if (value === null || value === "")
|
|
739
|
+
delete metadata[key];
|
|
740
|
+
else
|
|
741
|
+
metadata[key] = value;
|
|
742
|
+
}
|
|
743
|
+
const nextPaymentMethodId = input.payment_method !== void 0 ? resolved.paymentMethodId ?? null : pi.payment_method_id;
|
|
744
|
+
const nextCustomerId = input.customer !== void 0 ? resolved.customerId ?? null : pi.customer_id;
|
|
745
|
+
let nextStatus = pi.status;
|
|
746
|
+
if (isCard) {
|
|
747
|
+
if (nextPaymentMethodId && pi.status === "requires_payment_method") {
|
|
748
|
+
nextStatus = "requires_confirmation";
|
|
749
|
+
} else if (!nextPaymentMethodId && pi.status === "requires_confirmation") {
|
|
750
|
+
nextStatus = "requires_payment_method";
|
|
751
|
+
}
|
|
752
|
+
}
|
|
753
|
+
const updated = this.db.prepare(`UPDATE payment_intents SET
|
|
754
|
+
amount = ?, metadata_json = ?, payment_method_id = ?, customer_id = ?,
|
|
755
|
+
status = ?, updated = ?
|
|
756
|
+
WHERE id = ? AND account_id = ? AND status = ? RETURNING *`).get(input.amount ?? pi.amount, JSON.stringify(metadata), nextPaymentMethodId, nextCustomerId, nextStatus, nowUnix(), id, accountId2, pi.status);
|
|
757
|
+
if (!updated) {
|
|
758
|
+
const fresh = this.requireById(accountId2, id);
|
|
759
|
+
throw piUnexpectedState(fresh.status);
|
|
760
|
+
}
|
|
761
|
+
return updated;
|
|
762
|
+
}
|
|
763
|
+
// ---------- cancel ----------
|
|
764
|
+
cancel(accountId2, id) {
|
|
765
|
+
const pi = this.requireById(accountId2, id);
|
|
766
|
+
if (pi.status === "succeeded") {
|
|
767
|
+
throw piUnexpectedState(pi.status, "Cannot cancel a succeeded PaymentIntent.");
|
|
768
|
+
}
|
|
769
|
+
if (pi.status === "canceled") {
|
|
770
|
+
return pi;
|
|
771
|
+
}
|
|
772
|
+
const updated = this.casStatus(accountId2, id, pi.status, "canceled", { canceled_at: nowUnix() });
|
|
773
|
+
if (!updated)
|
|
774
|
+
throw piUnexpectedState(pi.status);
|
|
775
|
+
return updated;
|
|
776
|
+
}
|
|
777
|
+
// ---------- simulate_crypto_deposit (test_helpers) ----------
|
|
778
|
+
/**
|
|
779
|
+
* Drive a PI from requires_action → processing → succeeded.
|
|
780
|
+
* Both transitions are CAS — exactly one parallel call wins each leg.
|
|
781
|
+
* Returns { pi, charge, balanceTx, events: rows of side-effect ids }.
|
|
782
|
+
* Side-effect emission (events, charge mint, balance txn) is the
|
|
783
|
+
* caller's job — `simulate` is the bare state-advancement here. To keep
|
|
784
|
+
* the routes simple we colocate it. See routes/payment-intents.ts.
|
|
785
|
+
*/
|
|
786
|
+
simulateCryptoDepositLeg1(accountId2, id) {
|
|
787
|
+
const pi = this.requireById(accountId2, id);
|
|
788
|
+
if (pi.status === "succeeded" || pi.status === "canceled") {
|
|
789
|
+
throw piUnexpectedState(pi.status, `PaymentIntent is in terminal state '${pi.status}' and cannot be advanced.`);
|
|
790
|
+
}
|
|
791
|
+
if (pi.status !== "requires_action") {
|
|
792
|
+
throw piUnexpectedState(pi.status);
|
|
793
|
+
}
|
|
794
|
+
return this.casStatusOrThrow(accountId2, id, "requires_action", "processing");
|
|
795
|
+
}
|
|
796
|
+
/** Second CAS leg: processing → succeeded. */
|
|
797
|
+
simulateCryptoDepositLeg2(accountId2, id, latestChargeId) {
|
|
798
|
+
return this.casStatusOrThrow(accountId2, id, "processing", "succeeded", {
|
|
799
|
+
latest_charge_id: latestChargeId,
|
|
800
|
+
captured_at: nowUnix()
|
|
801
|
+
});
|
|
802
|
+
}
|
|
803
|
+
// ---------- read ----------
|
|
804
|
+
getById(accountId2, id) {
|
|
805
|
+
return this.db.prepare("SELECT * FROM payment_intents WHERE id = ? AND account_id = ?").get(id, accountId2) ?? null;
|
|
806
|
+
}
|
|
807
|
+
requireById(accountId2, id) {
|
|
808
|
+
const pi = this.getById(accountId2, id);
|
|
809
|
+
if (!pi) {
|
|
810
|
+
throw new TwinError("invalid_request_error", "resource_missing", `No such payment_intent: '${id}'.`, { param: "intent", statusCode: 404 });
|
|
811
|
+
}
|
|
812
|
+
return pi;
|
|
813
|
+
}
|
|
814
|
+
list(accountId2, input) {
|
|
815
|
+
return listPaginated(this.db, "payment_intents", accountId2, input);
|
|
816
|
+
}
|
|
817
|
+
// ---------- internals ----------
|
|
818
|
+
/**
|
|
819
|
+
* casStatus + the shared lost-the-race contract: re-read the fresh row
|
|
820
|
+
* so the loser's `payment_intent_unexpected_state` names the status that
|
|
821
|
+
* actually beat it. Every CAS leg on both rails goes through here.
|
|
822
|
+
*/
|
|
823
|
+
casStatusOrThrow(accountId2, id, expected, next, extras = {}) {
|
|
824
|
+
const updated = this.casStatus(accountId2, id, expected, next, extras);
|
|
825
|
+
if (!updated) {
|
|
826
|
+
const fresh = this.requireById(accountId2, id);
|
|
827
|
+
throw piUnexpectedState(fresh.status);
|
|
828
|
+
}
|
|
829
|
+
return updated;
|
|
830
|
+
}
|
|
831
|
+
/**
|
|
832
|
+
* Compare-and-swap on `status`. Returns the new row, or `null` if no row
|
|
833
|
+
* matched the predicate. The predicate is `(id = ? AND account_id = ? AND status = ?)`.
|
|
834
|
+
*/
|
|
835
|
+
casStatus(accountId2, id, expected, next, extras = {}) {
|
|
836
|
+
const sets = ["status = ?", "updated = ?"];
|
|
837
|
+
const values = [next, nowUnix()];
|
|
838
|
+
if ("latest_charge_id" in extras) {
|
|
839
|
+
sets.push("latest_charge_id = ?");
|
|
840
|
+
values.push(extras.latest_charge_id ?? null);
|
|
841
|
+
}
|
|
842
|
+
if ("canceled_at" in extras) {
|
|
843
|
+
sets.push("canceled_at = ?");
|
|
844
|
+
values.push(extras.canceled_at ?? null);
|
|
845
|
+
}
|
|
846
|
+
if ("captured_at" in extras) {
|
|
847
|
+
sets.push("captured_at = ?");
|
|
848
|
+
values.push(extras.captured_at ?? null);
|
|
849
|
+
}
|
|
850
|
+
if ("payment_method_id" in extras) {
|
|
851
|
+
sets.push("payment_method_id = ?");
|
|
852
|
+
values.push(extras.payment_method_id ?? null);
|
|
853
|
+
}
|
|
854
|
+
if ("last_payment_error_json" in extras) {
|
|
855
|
+
sets.push("last_payment_error_json = ?");
|
|
856
|
+
values.push(extras.last_payment_error_json ?? null);
|
|
857
|
+
}
|
|
858
|
+
const sql = `UPDATE payment_intents SET ${sets.join(", ")} WHERE id = ? AND account_id = ? AND status = ? RETURNING *`;
|
|
859
|
+
values.push(id, accountId2, expected);
|
|
860
|
+
return this.db.prepare(sql).get(...values) ?? null;
|
|
861
|
+
}
|
|
862
|
+
};
|
|
863
|
+
function piTypes(pi) {
|
|
864
|
+
try {
|
|
865
|
+
const parsed = JSON.parse(pi.payment_method_types_json);
|
|
866
|
+
return Array.isArray(parsed) ? parsed : ["crypto"];
|
|
867
|
+
} catch {
|
|
868
|
+
return ["crypto"];
|
|
869
|
+
}
|
|
870
|
+
}
|
|
871
|
+
function piUnexpectedState(currentStatus, message) {
|
|
872
|
+
return new TwinError("invalid_request_error", "payment_intent_unexpected_state", message ?? `The PaymentIntent has a status of '${currentStatus}'. The requested action could not be performed.`, { statusCode: 400 });
|
|
873
|
+
}
|
|
874
|
+
function depositAddressFromId(id) {
|
|
875
|
+
const digest = createHash("sha256").update(id).digest("hex");
|
|
876
|
+
return `0x${digest.slice(0, 40)}`;
|
|
877
|
+
}
|
|
878
|
+
function listPaginated(db, table, accountId2, input, extraWheres = []) {
|
|
879
|
+
const limitRaw = input.limit ?? 10;
|
|
880
|
+
const limit = Math.min(100, Math.max(1, Math.floor(limitRaw)));
|
|
881
|
+
const wheres = ["account_id = ?"];
|
|
882
|
+
const args = [accountId2];
|
|
883
|
+
if (input.starting_after) {
|
|
884
|
+
const cursor = cursorRow(db, table, accountId2, input.starting_after);
|
|
885
|
+
if (cursor) {
|
|
886
|
+
wheres.push("(created < ? OR (created = ? AND id < ?))");
|
|
887
|
+
args.push(cursor.created, cursor.created, cursor.id);
|
|
888
|
+
}
|
|
889
|
+
}
|
|
890
|
+
if (input.ending_before) {
|
|
891
|
+
const cursor = cursorRow(db, table, accountId2, input.ending_before);
|
|
892
|
+
if (cursor) {
|
|
893
|
+
wheres.push("(created > ? OR (created = ? AND id > ?))");
|
|
894
|
+
args.push(cursor.created, cursor.created, cursor.id);
|
|
895
|
+
}
|
|
896
|
+
}
|
|
897
|
+
if (typeof input.created_gt === "number") {
|
|
898
|
+
wheres.push("created > ?");
|
|
899
|
+
args.push(input.created_gt);
|
|
900
|
+
}
|
|
901
|
+
if (typeof input.created_gte === "number") {
|
|
902
|
+
wheres.push("created >= ?");
|
|
903
|
+
args.push(input.created_gte);
|
|
904
|
+
}
|
|
905
|
+
if (typeof input.created_lt === "number") {
|
|
906
|
+
wheres.push("created < ?");
|
|
907
|
+
args.push(input.created_lt);
|
|
908
|
+
}
|
|
909
|
+
if (typeof input.created_lte === "number") {
|
|
910
|
+
wheres.push("created <= ?");
|
|
911
|
+
args.push(input.created_lte);
|
|
912
|
+
}
|
|
913
|
+
if (input.type) {
|
|
914
|
+
wheres.push("type = ?");
|
|
915
|
+
args.push(input.type);
|
|
916
|
+
}
|
|
917
|
+
if (input.payment_intent) {
|
|
918
|
+
wheres.push("payment_intent_id = ?");
|
|
919
|
+
args.push(input.payment_intent);
|
|
920
|
+
}
|
|
921
|
+
for (const extra of extraWheres) {
|
|
922
|
+
wheres.push(extra.sql);
|
|
923
|
+
args.push(...extra.args);
|
|
924
|
+
}
|
|
925
|
+
const where = `WHERE ${wheres.join(" AND ")}`;
|
|
926
|
+
const sql = `SELECT * FROM ${table} ${where} ORDER BY created DESC, id DESC LIMIT ?`;
|
|
927
|
+
const rows = db.prepare(sql).all(...args, limit + 1);
|
|
928
|
+
const hasMore = rows.length > limit;
|
|
929
|
+
return { rows: hasMore ? rows.slice(0, limit) : rows, hasMore, limit };
|
|
930
|
+
}
|
|
931
|
+
function cursorRow(db, table, accountId2, id) {
|
|
932
|
+
return db.prepare(`SELECT id, created FROM ${table} WHERE id = ? AND account_id = ?`).get(id, accountId2) ?? null;
|
|
933
|
+
}
|
|
934
|
+
var PaymentMethodsDomain = class {
|
|
935
|
+
db;
|
|
936
|
+
constructor(db) {
|
|
937
|
+
this.db = db;
|
|
938
|
+
ensureStripeTables(db);
|
|
939
|
+
}
|
|
940
|
+
create(accountId2, input) {
|
|
941
|
+
if (typeof input.type !== "string" || input.type.length === 0) {
|
|
942
|
+
throw new TwinError("invalid_request_error", "parameter_missing", "Missing required param: type.", { param: "type", statusCode: 400 });
|
|
943
|
+
}
|
|
944
|
+
if (input.type !== "card") {
|
|
945
|
+
throw new TwinError("invalid_request_error", "parameter_invalid_string", `payment method type must be "card" for v1 of this twin (got '${input.type}').`, { param: "type", statusCode: 400 });
|
|
946
|
+
}
|
|
947
|
+
const card = input.card;
|
|
948
|
+
if (!card || typeof card !== "object") {
|
|
949
|
+
throw new TwinError("invalid_request_error", "parameter_missing", "Missing required param: card.", { param: "card", statusCode: 400 });
|
|
950
|
+
}
|
|
951
|
+
const number = typeof card.number === "string" ? card.number.replace(/[\s-]/g, "") : "";
|
|
952
|
+
if (!/^\d{12,19}$/.test(number) || !passesLuhn(number)) {
|
|
953
|
+
throw new TwinError("card_error", "incorrect_number", "Your card number is incorrect.", {
|
|
954
|
+
param: "card[number]",
|
|
955
|
+
statusCode: 402
|
|
956
|
+
});
|
|
957
|
+
}
|
|
958
|
+
const expMonth = Number(card.exp_month);
|
|
959
|
+
if (!Number.isInteger(expMonth) || expMonth < 1 || expMonth > 12) {
|
|
960
|
+
throw new TwinError("card_error", "invalid_expiry_month", "Your card's expiration month is invalid.", { param: "card[exp_month]", statusCode: 402 });
|
|
961
|
+
}
|
|
962
|
+
const expYear = Number(card.exp_year);
|
|
963
|
+
const now = new Date(nowUnix() * 1e3);
|
|
964
|
+
const currentYear = now.getUTCFullYear();
|
|
965
|
+
if (!Number.isInteger(expYear) || expYear < currentYear) {
|
|
966
|
+
throw new TwinError("card_error", "invalid_expiry_year", "Your card's expiration year is invalid.", { param: "card[exp_year]", statusCode: 402 });
|
|
967
|
+
}
|
|
968
|
+
if (expYear === currentYear && expMonth < now.getUTCMonth() + 1) {
|
|
969
|
+
throw new TwinError("card_error", "invalid_expiry_month", "Your card's expiration month is invalid.", { param: "card[exp_month]", statusCode: 402 });
|
|
970
|
+
}
|
|
971
|
+
const id = newId("payment_method");
|
|
972
|
+
this.db.prepare(`INSERT INTO payment_methods (
|
|
973
|
+
id, account_id, type, card_brand, card_last4, card_exp_month,
|
|
974
|
+
card_exp_year, card_fingerprint, customer_id, detached, created
|
|
975
|
+
) VALUES (?, ?, 'card', ?, ?, ?, ?, ?, NULL, 0, ?)`).run(
|
|
976
|
+
id,
|
|
977
|
+
accountId2,
|
|
978
|
+
brandFromNumber(number),
|
|
979
|
+
number.slice(-4),
|
|
980
|
+
expMonth,
|
|
981
|
+
expYear,
|
|
982
|
+
// Stable per PAN, like Stripe's card fingerprint — but derived, so
|
|
983
|
+
// the PAN itself is never persisted anywhere.
|
|
984
|
+
fingerprintOf(number),
|
|
985
|
+
nowUnix()
|
|
986
|
+
);
|
|
987
|
+
return this.requireById(accountId2, id);
|
|
988
|
+
}
|
|
989
|
+
getById(accountId2, id) {
|
|
990
|
+
return this.db.prepare("SELECT * FROM payment_methods WHERE id = ? AND account_id = ?").get(id, accountId2) ?? null;
|
|
991
|
+
}
|
|
992
|
+
requireById(accountId2, id) {
|
|
993
|
+
const row = this.getById(accountId2, id);
|
|
994
|
+
if (!row) {
|
|
995
|
+
throw new TwinError("invalid_request_error", "resource_missing", `No such payment_method: '${id}'.`, { param: "payment_method", statusCode: 404 });
|
|
996
|
+
}
|
|
997
|
+
return row;
|
|
998
|
+
}
|
|
999
|
+
/**
|
|
1000
|
+
* Attach to a customer. Caller has already resolved the customer as live.
|
|
1001
|
+
* Stripe rules: one customer per PM, and a previously-detached PM may
|
|
1002
|
+
* never be reattached.
|
|
1003
|
+
*/
|
|
1004
|
+
attach(accountId2, id, customerId) {
|
|
1005
|
+
const pm = this.requireById(accountId2, id);
|
|
1006
|
+
if (pm.customer_id) {
|
|
1007
|
+
throw new TwinError("invalid_request_error", "payment_method_already_attached", "This PaymentMethod has already been attached to a customer.", { param: "payment_method", statusCode: 400 });
|
|
1008
|
+
}
|
|
1009
|
+
if (pm.detached) {
|
|
1010
|
+
throw new TwinError("invalid_request_error", "payment_method_previously_detached", "A payment method that has been previously detached from a customer may not be reattached.", { param: "payment_method", statusCode: 400 });
|
|
1011
|
+
}
|
|
1012
|
+
this.db.prepare("UPDATE payment_methods SET customer_id = ? WHERE id = ? AND account_id = ?").run(customerId, id, accountId2);
|
|
1013
|
+
return this.requireById(accountId2, id);
|
|
1014
|
+
}
|
|
1015
|
+
detach(accountId2, id) {
|
|
1016
|
+
const pm = this.requireById(accountId2, id);
|
|
1017
|
+
if (!pm.customer_id) {
|
|
1018
|
+
throw new TwinError("invalid_request_error", "payment_method_not_attached", "The payment method you provided is not attached to a customer.", { param: "payment_method", statusCode: 400 });
|
|
1019
|
+
}
|
|
1020
|
+
this.db.prepare("UPDATE payment_methods SET customer_id = NULL, detached = 1 WHERE id = ? AND account_id = ?").run(id, accountId2);
|
|
1021
|
+
return this.requireById(accountId2, id);
|
|
1022
|
+
}
|
|
1023
|
+
/** All PMs currently attached to a customer (no pagination — used by
|
|
1024
|
+
* customer deletion to emit one detached event per PM). */
|
|
1025
|
+
allAttachedToCustomer(accountId2, customerId) {
|
|
1026
|
+
return this.db.prepare("SELECT * FROM payment_methods WHERE customer_id = ? AND account_id = ?").all(customerId, accountId2);
|
|
1027
|
+
}
|
|
1028
|
+
listForCustomer(accountId2, customerId, input) {
|
|
1029
|
+
return listPaginated(this.db, "payment_methods", accountId2, input, [
|
|
1030
|
+
{ sql: "customer_id = ?", args: [customerId] }
|
|
1031
|
+
]);
|
|
1032
|
+
}
|
|
1033
|
+
};
|
|
1034
|
+
var MAGIC_DECLINES = [
|
|
1035
|
+
["4000000000000002", { code: "card_declined", decline_code: "generic_decline", message: "Your card was declined." }],
|
|
1036
|
+
["4000000000009995", { code: "card_declined", decline_code: "insufficient_funds", message: "Your card has insufficient funds." }],
|
|
1037
|
+
["4000000000000069", { code: "expired_card", decline_code: "expired_card", message: "Your card has expired." }],
|
|
1038
|
+
["4000000000000127", { code: "incorrect_cvc", decline_code: "incorrect_cvc", message: "Your card's security code is incorrect." }]
|
|
1039
|
+
];
|
|
1040
|
+
var DECLINE_BY_FINGERPRINT = new Map(MAGIC_DECLINES.map(([pan, decline]) => [fingerprintOf(pan), decline]));
|
|
1041
|
+
function fingerprintOf(number) {
|
|
1042
|
+
return createHash("sha256").update(number).digest("hex").slice(0, 16);
|
|
1043
|
+
}
|
|
1044
|
+
function declineForFingerprint(fingerprint) {
|
|
1045
|
+
return DECLINE_BY_FINGERPRINT.get(fingerprint) ?? null;
|
|
1046
|
+
}
|
|
1047
|
+
function passesLuhn(number) {
|
|
1048
|
+
let sum = 0;
|
|
1049
|
+
let double = false;
|
|
1050
|
+
for (let i = number.length - 1; i >= 0; i--) {
|
|
1051
|
+
let digit = number.charCodeAt(i) - 48;
|
|
1052
|
+
if (double) {
|
|
1053
|
+
digit *= 2;
|
|
1054
|
+
if (digit > 9)
|
|
1055
|
+
digit -= 9;
|
|
1056
|
+
}
|
|
1057
|
+
sum += digit;
|
|
1058
|
+
double = !double;
|
|
1059
|
+
}
|
|
1060
|
+
return sum % 10 === 0;
|
|
1061
|
+
}
|
|
1062
|
+
function brandFromNumber(number) {
|
|
1063
|
+
if (/^4/.test(number))
|
|
1064
|
+
return "visa";
|
|
1065
|
+
if (/^(5[1-5]|2[2-7])/.test(number))
|
|
1066
|
+
return "mastercard";
|
|
1067
|
+
if (/^3[47]/.test(number))
|
|
1068
|
+
return "amex";
|
|
1069
|
+
if (/^6(011|5)/.test(number))
|
|
1070
|
+
return "discover";
|
|
1071
|
+
return "unknown";
|
|
1072
|
+
}
|
|
1073
|
+
|
|
1074
|
+
// ../packages/twin-stripe/dist/src/domain/charges.js
|
|
1075
|
+
var ChargesDomain = class {
|
|
1076
|
+
db;
|
|
1077
|
+
constructor(db) {
|
|
1078
|
+
this.db = db;
|
|
1079
|
+
ensureStripeTables(db);
|
|
1080
|
+
}
|
|
1081
|
+
/**
|
|
1082
|
+
* Mint a fresh charge attached to a PI. Defaults to `succeeded` +
|
|
1083
|
+
* `captured` (the settle paths); a declined card attempt passes
|
|
1084
|
+
* `status: "failed"` and the failure columns instead.
|
|
1085
|
+
*/
|
|
1086
|
+
createForPI(accountId2, input) {
|
|
1087
|
+
const id = newId("charge");
|
|
1088
|
+
const now = nowUnix();
|
|
1089
|
+
const status = input.status ?? "succeeded";
|
|
1090
|
+
const succeeded = status === "succeeded";
|
|
1091
|
+
this.db.prepare(`INSERT INTO charges (
|
|
1092
|
+
id, account_id, payment_intent_id, amount, amount_captured, amount_refunded,
|
|
1093
|
+
status, balance_transaction_id, captured, currency, created,
|
|
1094
|
+
payment_method_id, payment_method_details_json,
|
|
1095
|
+
failure_code, failure_decline_code, failure_message, customer_id
|
|
1096
|
+
) VALUES (?, ?, ?, ?, ?, 0, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(id, accountId2, input.payment_intent_id, input.amount, succeeded ? input.amount : 0, status, input.balance_transaction_id ?? null, succeeded ? 1 : 0, input.currency, now, input.payment_method_id ?? null, input.payment_method_details_json ?? null, input.failure_code ?? null, input.failure_decline_code ?? null, input.failure_message ?? null, input.customer_id ?? null);
|
|
1097
|
+
return this.requireById(accountId2, id);
|
|
1098
|
+
}
|
|
1099
|
+
getById(accountId2, id) {
|
|
1100
|
+
return this.db.prepare("SELECT * FROM charges WHERE id = ? AND account_id = ?").get(id, accountId2) ?? null;
|
|
1101
|
+
}
|
|
1102
|
+
requireById(accountId2, id) {
|
|
1103
|
+
const row = this.getById(accountId2, id);
|
|
1104
|
+
if (!row) {
|
|
1105
|
+
throw new TwinError("invalid_request_error", "resource_missing", `No such charge: '${id}'.`, { param: "charge", statusCode: 404 });
|
|
1106
|
+
}
|
|
1107
|
+
return row;
|
|
1108
|
+
}
|
|
1109
|
+
list(accountId2, input) {
|
|
1110
|
+
const { customer, ...rest } = input;
|
|
1111
|
+
const extra = customer ? [{ sql: "customer_id = ?", args: [customer] }] : [];
|
|
1112
|
+
return listPaginated(this.db, "charges", accountId2, rest, extra);
|
|
1113
|
+
}
|
|
1114
|
+
/** Count charges for a PI. Used by the concurrency test. */
|
|
1115
|
+
countForPI(accountId2, piId) {
|
|
1116
|
+
const row = this.db.prepare("SELECT COUNT(*) as n FROM charges WHERE payment_intent_id = ? AND account_id = ?").get(piId, accountId2);
|
|
1117
|
+
return row.n;
|
|
1118
|
+
}
|
|
1119
|
+
};
|
|
1120
|
+
|
|
1121
|
+
// ../packages/twin-stripe/dist/src/domain/balance.js
|
|
1122
|
+
var BalanceDomain = class {
|
|
1123
|
+
db;
|
|
1124
|
+
constructor(db) {
|
|
1125
|
+
this.db = db;
|
|
1126
|
+
ensureStripeTables(db);
|
|
1127
|
+
}
|
|
1128
|
+
create(accountId2, input) {
|
|
1129
|
+
const id = newId("balance_transaction");
|
|
1130
|
+
const now = nowUnix();
|
|
1131
|
+
const fee = input.fee ?? 0;
|
|
1132
|
+
const net = input.amount - fee;
|
|
1133
|
+
this.db.prepare(`INSERT INTO balance_transactions (
|
|
1134
|
+
id, account_id, type, amount, fee, net, currency, source_id, source_type,
|
|
1135
|
+
available_on, status, created
|
|
1136
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'available', ?)`).run(id, accountId2, input.type, input.amount, fee, net, input.currency, input.source_id ?? null, input.source_type ?? null, now, now);
|
|
1137
|
+
return this.requireById(accountId2, id);
|
|
1138
|
+
}
|
|
1139
|
+
getById(accountId2, id) {
|
|
1140
|
+
return this.db.prepare("SELECT * FROM balance_transactions WHERE id = ? AND account_id = ?").get(id, accountId2) ?? null;
|
|
1141
|
+
}
|
|
1142
|
+
requireById(accountId2, id) {
|
|
1143
|
+
const row = this.getById(accountId2, id);
|
|
1144
|
+
if (!row) {
|
|
1145
|
+
throw new TwinError("invalid_request_error", "resource_missing", `No such balance_transaction: '${id}'.`, { param: "balance_transaction", statusCode: 404 });
|
|
1146
|
+
}
|
|
1147
|
+
return row;
|
|
1148
|
+
}
|
|
1149
|
+
list(accountId2, input) {
|
|
1150
|
+
return listPaginated(this.db, "balance_transactions", accountId2, input);
|
|
1151
|
+
}
|
|
1152
|
+
/**
|
|
1153
|
+
* Compute current balance grouped by currency. v1 deviation: we lump
|
|
1154
|
+
* everything into `available`; `pending` is always [].
|
|
1155
|
+
*/
|
|
1156
|
+
current(accountId2) {
|
|
1157
|
+
const rows = this.db.prepare("SELECT currency, COALESCE(SUM(net), 0) AS amount FROM balance_transactions WHERE account_id = ? GROUP BY currency").all(accountId2);
|
|
1158
|
+
const available = rows.map((row) => ({
|
|
1159
|
+
currency: row.currency,
|
|
1160
|
+
amount: row.amount,
|
|
1161
|
+
source_types: { card: 0 }
|
|
1162
|
+
}));
|
|
1163
|
+
return { available, pending: [] };
|
|
1164
|
+
}
|
|
1165
|
+
/** Count balance txns for a given source (PI). Used by concurrency test. */
|
|
1166
|
+
countForSource(accountId2, sourceId) {
|
|
1167
|
+
const row = this.db.prepare("SELECT COUNT(*) as n FROM balance_transactions WHERE source_id = ? AND account_id = ?").get(sourceId, accountId2);
|
|
1168
|
+
return row.n;
|
|
1169
|
+
}
|
|
1170
|
+
/** Sum of all `net` amounts. Used by concurrency test (assert total == PI amount). */
|
|
1171
|
+
totalNet(accountId2, currency = "usd") {
|
|
1172
|
+
const row = this.db.prepare("SELECT COALESCE(SUM(net), 0) AS total FROM balance_transactions WHERE currency = ? AND account_id = ?").get(currency, accountId2);
|
|
1173
|
+
return row.total;
|
|
1174
|
+
}
|
|
1175
|
+
};
|
|
1176
|
+
|
|
1177
|
+
// ../packages/twin-stripe/dist/src/domain/events.js
|
|
1178
|
+
var EventsDomain = class {
|
|
1179
|
+
db;
|
|
1180
|
+
constructor(db) {
|
|
1181
|
+
this.db = db;
|
|
1182
|
+
ensureStripeTables(db);
|
|
1183
|
+
}
|
|
1184
|
+
create(accountId2, input) {
|
|
1185
|
+
const id = newId("event");
|
|
1186
|
+
const now = nowUnix();
|
|
1187
|
+
this.db.prepare(`INSERT INTO events (
|
|
1188
|
+
id, account_id, type, data_json, request_idempotency_key, livemode,
|
|
1189
|
+
api_version, created
|
|
1190
|
+
) VALUES (?, ?, ?, ?, ?, 0, ?, ?)`).run(id, accountId2, input.type, JSON.stringify({ object: input.object }), input.request_idempotency_key ?? null, STRIPE_API_VERSION, now);
|
|
1191
|
+
return this.requireById(accountId2, id);
|
|
1192
|
+
}
|
|
1193
|
+
getById(accountId2, id) {
|
|
1194
|
+
return this.db.prepare("SELECT * FROM events WHERE id = ? AND account_id = ?").get(id, accountId2) ?? null;
|
|
1195
|
+
}
|
|
1196
|
+
requireById(accountId2, id) {
|
|
1197
|
+
const row = this.getById(accountId2, id);
|
|
1198
|
+
if (!row) {
|
|
1199
|
+
throw new TwinError("invalid_request_error", "resource_missing", `No such event: '${id}'.`, { param: "event", statusCode: 404 });
|
|
1200
|
+
}
|
|
1201
|
+
return row;
|
|
1202
|
+
}
|
|
1203
|
+
list(accountId2, input) {
|
|
1204
|
+
return listPaginated(this.db, "events", accountId2, input);
|
|
1205
|
+
}
|
|
1206
|
+
};
|
|
1207
|
+
|
|
1208
|
+
// ../packages/twin-stripe/dist/src/domain/refunds.js
|
|
1209
|
+
var RefundsDomain = class {
|
|
1210
|
+
db;
|
|
1211
|
+
constructor(db) {
|
|
1212
|
+
this.db = db;
|
|
1213
|
+
ensureStripeTables(db);
|
|
1214
|
+
}
|
|
1215
|
+
/**
|
|
1216
|
+
* Create a refund against an existing charge. The INSERT into `refunds`
|
|
1217
|
+
* and the UPDATE of `charges.amount_refunded` run inside a single
|
|
1218
|
+
* better-sqlite3 transaction (synchronous + atomic). Returns the new
|
|
1219
|
+
* refund row alongside the post-update charge row so the route can
|
|
1220
|
+
* emit the recorder `state_delta`.
|
|
1221
|
+
*/
|
|
1222
|
+
create(accountId2, input) {
|
|
1223
|
+
if (!input.charge) {
|
|
1224
|
+
throw new TwinError("invalid_request_error", "parameter_missing", "Missing required param: charge.", { param: "charge", statusCode: 400 });
|
|
1225
|
+
}
|
|
1226
|
+
if (input.amount !== void 0) {
|
|
1227
|
+
if (!Number.isInteger(input.amount) || input.amount <= 0) {
|
|
1228
|
+
throw new TwinError("invalid_request_error", "parameter_invalid_integer", "Amount must be a positive integer.", { param: "amount", statusCode: 400 });
|
|
1229
|
+
}
|
|
1230
|
+
}
|
|
1231
|
+
const tx = this.db.transaction(() => {
|
|
1232
|
+
const charge = this.requireCharge(accountId2, input.charge);
|
|
1233
|
+
if (charge.status !== "succeeded") {
|
|
1234
|
+
throw new TwinError("invalid_request_error", "charge_not_refundable", `This charge (${charge.id}) has a status of '${charge.status}' and cannot be refunded.`, { param: "charge", statusCode: 400 });
|
|
1235
|
+
}
|
|
1236
|
+
const refundable = charge.amount - charge.amount_refunded;
|
|
1237
|
+
const amount = input.amount ?? refundable;
|
|
1238
|
+
if (amount <= 0 || amount > refundable) {
|
|
1239
|
+
throw new TwinError("invalid_request_error", "charge_already_refunded", amount <= 0 ? "Refund amount must be positive." : `Refund amount exceeds the remaining refundable balance of ${refundable}.`, { param: "amount", statusCode: 400 });
|
|
1240
|
+
}
|
|
1241
|
+
const id = newId("refund");
|
|
1242
|
+
const now = nowUnix();
|
|
1243
|
+
this.db.prepare(`INSERT INTO refunds (
|
|
1244
|
+
id, account_id, charge_id, payment_intent_id, amount, currency,
|
|
1245
|
+
status, reason, idempotency_key, created
|
|
1246
|
+
) VALUES (?, ?, ?, ?, ?, ?, 'succeeded', ?, ?, ?)`).run(id, accountId2, charge.id, charge.payment_intent_id, amount, charge.currency, input.reason ?? null, input.idempotency_key ?? null, now);
|
|
1247
|
+
this.db.prepare("UPDATE charges SET amount_refunded = amount_refunded + ? WHERE id = ? AND account_id = ?").run(amount, charge.id, accountId2);
|
|
1248
|
+
const row = this.requireById(accountId2, id);
|
|
1249
|
+
const updatedCharge = this.requireCharge(accountId2, charge.id);
|
|
1250
|
+
return { row, charge: updatedCharge };
|
|
1251
|
+
});
|
|
1252
|
+
return tx();
|
|
1253
|
+
}
|
|
1254
|
+
/**
|
|
1255
|
+
* Backfill the ledger link after StripeDomain mints the refund's balance
|
|
1256
|
+
* transaction (the txn needs the refund row's id/amount first, so the two
|
|
1257
|
+
* inserts can't be reordered). Runs inside the coordinator's transaction.
|
|
1258
|
+
*/
|
|
1259
|
+
linkBalanceTransaction(accountId2, id, balanceTransactionId) {
|
|
1260
|
+
this.db.prepare("UPDATE refunds SET balance_transaction_id = ? WHERE id = ? AND account_id = ?").run(balanceTransactionId, id, accountId2);
|
|
1261
|
+
return this.requireById(accountId2, id);
|
|
1262
|
+
}
|
|
1263
|
+
getById(accountId2, id) {
|
|
1264
|
+
return this.db.prepare("SELECT * FROM refunds WHERE id = ? AND account_id = ?").get(id, accountId2) ?? null;
|
|
1265
|
+
}
|
|
1266
|
+
requireById(accountId2, id) {
|
|
1267
|
+
const row = this.getById(accountId2, id);
|
|
1268
|
+
if (!row) {
|
|
1269
|
+
throw new TwinError("invalid_request_error", "resource_missing", `No such refund: '${id}'.`, { param: "refund", statusCode: 404 });
|
|
1270
|
+
}
|
|
1271
|
+
return row;
|
|
1272
|
+
}
|
|
1273
|
+
list(accountId2, input) {
|
|
1274
|
+
if (input.charge) {
|
|
1275
|
+
const wide = listPaginated(this.db, "refunds", accountId2, input);
|
|
1276
|
+
const filtered = wide.rows.filter((r) => r.charge_id === input.charge);
|
|
1277
|
+
return { rows: filtered, hasMore: wide.hasMore, limit: wide.limit };
|
|
1278
|
+
}
|
|
1279
|
+
return listPaginated(this.db, "refunds", accountId2, input);
|
|
1280
|
+
}
|
|
1281
|
+
requireCharge(accountId2, id) {
|
|
1282
|
+
const row = this.db.prepare("SELECT * FROM charges WHERE id = ? AND account_id = ?").get(id, accountId2);
|
|
1283
|
+
if (!row) {
|
|
1284
|
+
throw new TwinError("invalid_request_error", "resource_missing", `No such charge: '${id}'.`, { param: "charge", statusCode: 404 });
|
|
1285
|
+
}
|
|
1286
|
+
return row;
|
|
1287
|
+
}
|
|
1288
|
+
};
|
|
1289
|
+
|
|
1290
|
+
// ../packages/twin-stripe/dist/src/domain/customers.js
|
|
1291
|
+
var CustomersDomain = class {
|
|
1292
|
+
db;
|
|
1293
|
+
constructor(db) {
|
|
1294
|
+
this.db = db;
|
|
1295
|
+
ensureStripeTables(db);
|
|
1296
|
+
}
|
|
1297
|
+
create(accountId2, input) {
|
|
1298
|
+
const id = newId("customer");
|
|
1299
|
+
const metadata = {};
|
|
1300
|
+
for (const [key, value] of Object.entries(input.metadata ?? {})) {
|
|
1301
|
+
if (value !== null && value !== "")
|
|
1302
|
+
metadata[key] = value;
|
|
1303
|
+
}
|
|
1304
|
+
this.db.prepare(`INSERT INTO customers (
|
|
1305
|
+
id, account_id, name, email, description, phone, metadata_json, deleted, created
|
|
1306
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, 0, ?)`).run(id, accountId2, input.name ?? null, input.email ?? null, input.description ?? null, input.phone ?? null, JSON.stringify(metadata), nowUnix());
|
|
1307
|
+
return this.requireById(accountId2, id);
|
|
1308
|
+
}
|
|
1309
|
+
getById(accountId2, id) {
|
|
1310
|
+
return this.db.prepare("SELECT * FROM customers WHERE id = ? AND account_id = ?").get(id, accountId2) ?? null;
|
|
1311
|
+
}
|
|
1312
|
+
/** Any row, deleted or live. Missing id → Stripe's 404 resource_missing. */
|
|
1313
|
+
requireById(accountId2, id) {
|
|
1314
|
+
const row = this.getById(accountId2, id);
|
|
1315
|
+
if (!row)
|
|
1316
|
+
throw noSuchCustomer(id);
|
|
1317
|
+
return row;
|
|
1318
|
+
}
|
|
1319
|
+
/** Live row only. Deleted customers 404 for writes and sub-resources. */
|
|
1320
|
+
requireLive(accountId2, id) {
|
|
1321
|
+
const row = this.requireById(accountId2, id);
|
|
1322
|
+
if (row.deleted)
|
|
1323
|
+
throw noSuchCustomer(id);
|
|
1324
|
+
return row;
|
|
1325
|
+
}
|
|
1326
|
+
/**
|
|
1327
|
+
* Update fields; metadata merges per-key, an empty/null value unsets the
|
|
1328
|
+
* key (real Stripe's metadata contract).
|
|
1329
|
+
*/
|
|
1330
|
+
update(accountId2, id, input) {
|
|
1331
|
+
const existing = this.requireLive(accountId2, id);
|
|
1332
|
+
const metadata = JSON.parse(existing.metadata_json);
|
|
1333
|
+
for (const [key, value] of Object.entries(input.metadata ?? {})) {
|
|
1334
|
+
if (value === null || value === "")
|
|
1335
|
+
delete metadata[key];
|
|
1336
|
+
else
|
|
1337
|
+
metadata[key] = value;
|
|
1338
|
+
}
|
|
1339
|
+
this.db.prepare(`UPDATE customers SET name = ?, email = ?, description = ?, phone = ?, metadata_json = ?
|
|
1340
|
+
WHERE id = ? AND account_id = ?`).run(input.name !== void 0 ? input.name : existing.name, input.email !== void 0 ? input.email : existing.email, input.description !== void 0 ? input.description : existing.description, input.phone !== void 0 ? input.phone : existing.phone, JSON.stringify(metadata), id, accountId2);
|
|
1341
|
+
return this.requireById(accountId2, id);
|
|
1342
|
+
}
|
|
1343
|
+
/**
|
|
1344
|
+
* Soft-delete. Detaches the customer's payment methods in the same
|
|
1345
|
+
* transaction (real Stripe invalidates them on customer deletion).
|
|
1346
|
+
* Idempotent: deleting an already-deleted customer returns the row.
|
|
1347
|
+
*/
|
|
1348
|
+
delete(accountId2, id) {
|
|
1349
|
+
const tx = this.db.transaction(() => {
|
|
1350
|
+
const existing = this.requireById(accountId2, id);
|
|
1351
|
+
if (existing.deleted)
|
|
1352
|
+
return { row: existing, alreadyDeleted: true };
|
|
1353
|
+
this.db.prepare("UPDATE customers SET deleted = 1 WHERE id = ? AND account_id = ?").run(id, accountId2);
|
|
1354
|
+
this.db.prepare("UPDATE payment_methods SET customer_id = NULL, detached = 1 WHERE customer_id = ? AND account_id = ?").run(id, accountId2);
|
|
1355
|
+
return { row: this.requireById(accountId2, id), alreadyDeleted: false };
|
|
1356
|
+
});
|
|
1357
|
+
return tx();
|
|
1358
|
+
}
|
|
1359
|
+
list(accountId2, input) {
|
|
1360
|
+
const extra = [{ sql: "deleted = 0", args: [] }];
|
|
1361
|
+
if (input.email)
|
|
1362
|
+
extra.push({ sql: "email = ?", args: [input.email] });
|
|
1363
|
+
return listPaginated(this.db, "customers", accountId2, input, extra);
|
|
1364
|
+
}
|
|
1365
|
+
};
|
|
1366
|
+
function noSuchCustomer(id) {
|
|
1367
|
+
return new TwinError("invalid_request_error", "resource_missing", `No such customer: '${id}'.`, { param: "customer", statusCode: 404 });
|
|
1368
|
+
}
|
|
1369
|
+
|
|
1370
|
+
// ../packages/twin-stripe/dist/src/domain/billing.js
|
|
1371
|
+
var BillingDomain = class {
|
|
1372
|
+
db;
|
|
1373
|
+
constructor(db) {
|
|
1374
|
+
this.db = db;
|
|
1375
|
+
ensureStripeTables(db);
|
|
1376
|
+
}
|
|
1377
|
+
// ---------- Products ----------
|
|
1378
|
+
createProduct(accountId2, input) {
|
|
1379
|
+
if (!input.name)
|
|
1380
|
+
throw missingParam("name");
|
|
1381
|
+
const now = nowUnix();
|
|
1382
|
+
const id = newId("product");
|
|
1383
|
+
this.db.prepare(`INSERT INTO products (id, account_id, name, description, active, metadata_json, created, updated)
|
|
1384
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)`).run(id, accountId2, input.name, input.description ?? null, input.active === false ? 0 : 1, JSON.stringify(liveMetadata(input.metadata)), now, now);
|
|
1385
|
+
return this.requireProduct(accountId2, id);
|
|
1386
|
+
}
|
|
1387
|
+
requireProduct(accountId2, id) {
|
|
1388
|
+
const row = this.db.prepare("SELECT * FROM products WHERE id = ? AND account_id = ?").get(id, accountId2);
|
|
1389
|
+
if (!row)
|
|
1390
|
+
throw noSuch("product", id);
|
|
1391
|
+
return row;
|
|
1392
|
+
}
|
|
1393
|
+
listProducts(accountId2, input) {
|
|
1394
|
+
const extra = [];
|
|
1395
|
+
if (input.active !== void 0) {
|
|
1396
|
+
extra.push({ sql: "active = ?", args: [input.active ? 1 : 0] });
|
|
1397
|
+
}
|
|
1398
|
+
return listPaginated(this.db, "products", accountId2, input, extra);
|
|
1399
|
+
}
|
|
1400
|
+
// ---------- Prices ----------
|
|
1401
|
+
createPrice(accountId2, input) {
|
|
1402
|
+
if (!input.currency)
|
|
1403
|
+
throw missingParam("currency");
|
|
1404
|
+
if (!input.product)
|
|
1405
|
+
throw missingParam("product");
|
|
1406
|
+
this.requireProduct(accountId2, input.product);
|
|
1407
|
+
const id = newId("price");
|
|
1408
|
+
this.db.prepare(`INSERT INTO prices (
|
|
1409
|
+
id, account_id, product_id, currency, unit_amount, recurring_interval,
|
|
1410
|
+
recurring_interval_count, active, nickname, lookup_key, metadata_json, created
|
|
1411
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(id, accountId2, input.product, input.currency.toLowerCase(), input.unit_amount ?? null, input.recurring?.interval ?? null, input.recurring ? input.recurring.interval_count ?? 1 : null, input.active === false ? 0 : 1, input.nickname ?? null, input.lookup_key ?? null, JSON.stringify(liveMetadata(input.metadata)), nowUnix());
|
|
1412
|
+
return this.requirePrice(accountId2, id);
|
|
1413
|
+
}
|
|
1414
|
+
requirePrice(accountId2, id) {
|
|
1415
|
+
const row = this.db.prepare("SELECT * FROM prices WHERE id = ? AND account_id = ?").get(id, accountId2);
|
|
1416
|
+
if (!row)
|
|
1417
|
+
throw noSuch("price", id);
|
|
1418
|
+
return row;
|
|
1419
|
+
}
|
|
1420
|
+
listPrices(accountId2, input) {
|
|
1421
|
+
const extra = [];
|
|
1422
|
+
if (input.product)
|
|
1423
|
+
extra.push({ sql: "product_id = ?", args: [input.product] });
|
|
1424
|
+
if (input.active !== void 0) {
|
|
1425
|
+
extra.push({ sql: "active = ?", args: [input.active ? 1 : 0] });
|
|
1426
|
+
}
|
|
1427
|
+
return listPaginated(this.db, "prices", accountId2, input, extra);
|
|
1428
|
+
}
|
|
1429
|
+
// ---------- Subscriptions ----------
|
|
1430
|
+
createSubscription(accountId2, input) {
|
|
1431
|
+
if (!input.customer)
|
|
1432
|
+
throw missingParam("customer");
|
|
1433
|
+
if (!Array.isArray(input.items) || input.items.length === 0) {
|
|
1434
|
+
throw missingParam("items");
|
|
1435
|
+
}
|
|
1436
|
+
const items = input.items.map((item, index) => {
|
|
1437
|
+
if (!item.price)
|
|
1438
|
+
throw missingParam(`items[${index}][price]`);
|
|
1439
|
+
this.requirePrice(accountId2, item.price);
|
|
1440
|
+
return {
|
|
1441
|
+
id: newId("subscription_item"),
|
|
1442
|
+
price: item.price,
|
|
1443
|
+
quantity: item.quantity ?? 1
|
|
1444
|
+
};
|
|
1445
|
+
});
|
|
1446
|
+
const id = newId("subscription");
|
|
1447
|
+
this.db.prepare(`INSERT INTO subscriptions (
|
|
1448
|
+
id, account_id, customer_id, status, items_json, cancel_at_period_end,
|
|
1449
|
+
canceled_at, ended_at, metadata_json, created
|
|
1450
|
+
) VALUES (?, ?, ?, 'active', ?, ?, NULL, NULL, ?, ?)`).run(id, accountId2, input.customer, JSON.stringify(items), input.cancel_at_period_end ? 1 : 0, JSON.stringify(liveMetadata(input.metadata)), nowUnix());
|
|
1451
|
+
return this.requireSubscription(accountId2, id);
|
|
1452
|
+
}
|
|
1453
|
+
requireSubscription(accountId2, id) {
|
|
1454
|
+
const row = this.db.prepare("SELECT * FROM subscriptions WHERE id = ? AND account_id = ?").get(id, accountId2);
|
|
1455
|
+
if (!row)
|
|
1456
|
+
throw noSuch("subscription", id);
|
|
1457
|
+
return row;
|
|
1458
|
+
}
|
|
1459
|
+
/**
|
|
1460
|
+
* Update: metadata merges per-key (empty/null unsets — Stripe's metadata
|
|
1461
|
+
* contract, same as customers), cancel_at_period_end flips. A canceled
|
|
1462
|
+
* subscription accepts metadata-only updates and refuses everything else,
|
|
1463
|
+
* like real Stripe.
|
|
1464
|
+
*/
|
|
1465
|
+
updateSubscription(accountId2, id, input) {
|
|
1466
|
+
const existing = this.requireSubscription(accountId2, id);
|
|
1467
|
+
if (existing.status === "canceled" && input.cancel_at_period_end !== void 0) {
|
|
1468
|
+
throw new TwinError("invalid_request_error", "subscription_canceled", "You cannot update a subscription that is `canceled` or `incomplete_expired`.", { param: "subscription", statusCode: 400 });
|
|
1469
|
+
}
|
|
1470
|
+
const metadata = JSON.parse(existing.metadata_json);
|
|
1471
|
+
for (const [key, value] of Object.entries(input.metadata ?? {})) {
|
|
1472
|
+
if (value === null || value === "")
|
|
1473
|
+
delete metadata[key];
|
|
1474
|
+
else
|
|
1475
|
+
metadata[key] = value;
|
|
1476
|
+
}
|
|
1477
|
+
this.db.prepare("UPDATE subscriptions SET cancel_at_period_end = ?, metadata_json = ? WHERE id = ? AND account_id = ?").run(input.cancel_at_period_end === void 0 ? existing.cancel_at_period_end : input.cancel_at_period_end ? 1 : 0, JSON.stringify(metadata), id, accountId2);
|
|
1478
|
+
return this.requireSubscription(accountId2, id);
|
|
1479
|
+
}
|
|
1480
|
+
/**
|
|
1481
|
+
* DELETE /v1/subscriptions/:id — immediate cancel: status → canceled with
|
|
1482
|
+
* canceled_at/ended_at stamped. Idempotent (re-cancel returns the row);
|
|
1483
|
+
* shape tier, so no invoice settlement or proration runs.
|
|
1484
|
+
*/
|
|
1485
|
+
cancelSubscription(accountId2, id) {
|
|
1486
|
+
const existing = this.requireSubscription(accountId2, id);
|
|
1487
|
+
if (existing.status === "canceled")
|
|
1488
|
+
return existing;
|
|
1489
|
+
const now = nowUnix();
|
|
1490
|
+
this.db.prepare("UPDATE subscriptions SET status = 'canceled', canceled_at = ?, ended_at = ? WHERE id = ? AND account_id = ?").run(now, now, id, accountId2);
|
|
1491
|
+
return this.requireSubscription(accountId2, id);
|
|
1492
|
+
}
|
|
1493
|
+
/**
|
|
1494
|
+
* Like real Stripe, the default list excludes canceled subscriptions;
|
|
1495
|
+
* `status=canceled` selects them and `status=all` lifts the filter.
|
|
1496
|
+
*/
|
|
1497
|
+
listSubscriptions(accountId2, input) {
|
|
1498
|
+
const extra = [];
|
|
1499
|
+
if (input.customer)
|
|
1500
|
+
extra.push({ sql: "customer_id = ?", args: [input.customer] });
|
|
1501
|
+
if (input.status === void 0) {
|
|
1502
|
+
extra.push({ sql: "status != 'canceled'", args: [] });
|
|
1503
|
+
} else if (input.status !== "all") {
|
|
1504
|
+
extra.push({ sql: "status = ?", args: [input.status] });
|
|
1505
|
+
}
|
|
1506
|
+
return listPaginated(this.db, "subscriptions", accountId2, input, extra);
|
|
1507
|
+
}
|
|
1508
|
+
};
|
|
1509
|
+
function liveMetadata(metadata) {
|
|
1510
|
+
const out = {};
|
|
1511
|
+
for (const [key, value] of Object.entries(metadata ?? {})) {
|
|
1512
|
+
if (value !== null && value !== "")
|
|
1513
|
+
out[key] = value;
|
|
1514
|
+
}
|
|
1515
|
+
return out;
|
|
1516
|
+
}
|
|
1517
|
+
function missingParam(param) {
|
|
1518
|
+
return new TwinError("invalid_request_error", "parameter_missing", `Missing required param: ${param}.`, { param, statusCode: 400 });
|
|
1519
|
+
}
|
|
1520
|
+
function noSuch(kind, id) {
|
|
1521
|
+
return new TwinError("invalid_request_error", "resource_missing", `No such ${kind}: '${id}'.`, { param: kind, statusCode: 404 });
|
|
1522
|
+
}
|
|
1523
|
+
|
|
1524
|
+
// ../packages/twin-stripe/dist/src/serializers.js
|
|
1525
|
+
function paymentIntentJson(row) {
|
|
1526
|
+
const types = piTypes(row);
|
|
1527
|
+
const wireLift = {
|
|
1528
|
+
payment_method_options: types.includes("card") ? {
|
|
1529
|
+
card: {
|
|
1530
|
+
installments: null,
|
|
1531
|
+
mandate_options: null,
|
|
1532
|
+
network: null,
|
|
1533
|
+
request_three_d_secure: "automatic"
|
|
1534
|
+
}
|
|
1535
|
+
} : {
|
|
1536
|
+
crypto: {
|
|
1537
|
+
mode: "deposit",
|
|
1538
|
+
deposit_options: { networks: ["base"] }
|
|
1539
|
+
}
|
|
1540
|
+
},
|
|
1541
|
+
invoice: null
|
|
1542
|
+
};
|
|
1543
|
+
return {
|
|
1544
|
+
id: row.id,
|
|
1545
|
+
object: "payment_intent",
|
|
1546
|
+
amount: row.amount,
|
|
1547
|
+
amount_capturable: 0,
|
|
1548
|
+
amount_received: row.status === "succeeded" ? row.amount : 0,
|
|
1549
|
+
amount_details: { tip: {} },
|
|
1550
|
+
application: null,
|
|
1551
|
+
application_fee_amount: null,
|
|
1552
|
+
automatic_payment_methods: null,
|
|
1553
|
+
canceled_at: row.canceled_at,
|
|
1554
|
+
cancellation_reason: null,
|
|
1555
|
+
// Twin row columns carry the literal Stripe values; the row type is a free
|
|
1556
|
+
// `string`. Narrow to the upstream literal union for the type anchor only
|
|
1557
|
+
// (FDRS-454: the twin faithfully emits a real upstream value), runtime unchanged.
|
|
1558
|
+
capture_method: row.capture_method,
|
|
1559
|
+
client_secret: row.client_secret,
|
|
1560
|
+
confirmation_method: row.confirmation_method,
|
|
1561
|
+
created: row.created,
|
|
1562
|
+
currency: row.currency,
|
|
1563
|
+
customer: row.customer_id,
|
|
1564
|
+
description: null,
|
|
1565
|
+
// Card declines (F-731): the last failed attempt, parsed from the row.
|
|
1566
|
+
// The stored blob is Stripe's LastPaymentError shape; narrow for the
|
|
1567
|
+
// type anchor only (FDRS-454), runtime unchanged.
|
|
1568
|
+
last_payment_error: parseJson(row.last_payment_error_json, null),
|
|
1569
|
+
latest_charge: row.latest_charge_id,
|
|
1570
|
+
livemode: false,
|
|
1571
|
+
metadata: parseJson(row.metadata_json, {}),
|
|
1572
|
+
next_action: row.status === "requires_action" ? parseJson(row.next_action_json, null) : null,
|
|
1573
|
+
on_behalf_of: null,
|
|
1574
|
+
payment_method: row.payment_method_id,
|
|
1575
|
+
payment_method_configuration_details: null,
|
|
1576
|
+
payment_method_types: types,
|
|
1577
|
+
processing: null,
|
|
1578
|
+
receipt_email: null,
|
|
1579
|
+
review: null,
|
|
1580
|
+
setup_future_usage: null,
|
|
1581
|
+
shipping: null,
|
|
1582
|
+
statement_descriptor: null,
|
|
1583
|
+
statement_descriptor_suffix: null,
|
|
1584
|
+
status: row.status,
|
|
1585
|
+
transfer_data: null,
|
|
1586
|
+
transfer_group: null,
|
|
1587
|
+
...wireLift
|
|
1588
|
+
};
|
|
1589
|
+
}
|
|
1590
|
+
function chargeJson(row) {
|
|
1591
|
+
const wireLift = { invoice: null };
|
|
1592
|
+
const failed = row.status === "failed";
|
|
1593
|
+
const paymentMethodDetails = parseJson(row.payment_method_details_json, {
|
|
1594
|
+
type: "crypto",
|
|
1595
|
+
crypto: {
|
|
1596
|
+
// Upstream `Charge.PaymentMethodDetails.Crypto.{buyer_address,transaction_hash}`
|
|
1597
|
+
// are `string | undefined`; the twin surfaces `null` pre-settlement (no
|
|
1598
|
+
// on-chain tx yet). Narrow the pre-resolution null for the type anchor only
|
|
1599
|
+
// (FDRS-454), runtime value (null) unchanged.
|
|
1600
|
+
buyer_address: null,
|
|
1601
|
+
network: "base",
|
|
1602
|
+
token_currency: "usdc",
|
|
1603
|
+
transaction_hash: null
|
|
1604
|
+
}
|
|
1605
|
+
});
|
|
1606
|
+
return {
|
|
1607
|
+
id: row.id,
|
|
1608
|
+
object: "charge",
|
|
1609
|
+
amount: row.amount,
|
|
1610
|
+
amount_captured: row.amount_captured,
|
|
1611
|
+
amount_refunded: row.amount_refunded,
|
|
1612
|
+
application: null,
|
|
1613
|
+
application_fee: null,
|
|
1614
|
+
application_fee_amount: null,
|
|
1615
|
+
balance_transaction: row.balance_transaction_id,
|
|
1616
|
+
billing_details: {
|
|
1617
|
+
address: { city: null, country: null, line1: null, line2: null, postal_code: null, state: null },
|
|
1618
|
+
email: null,
|
|
1619
|
+
name: null,
|
|
1620
|
+
phone: null
|
|
1621
|
+
},
|
|
1622
|
+
calculated_statement_descriptor: null,
|
|
1623
|
+
captured: Boolean(row.captured),
|
|
1624
|
+
created: row.created,
|
|
1625
|
+
currency: row.currency,
|
|
1626
|
+
customer: row.customer_id,
|
|
1627
|
+
description: null,
|
|
1628
|
+
disputed: false,
|
|
1629
|
+
failure_balance_transaction: null,
|
|
1630
|
+
// Twin failure columns carry Stripe's literal decline codes; the row
|
|
1631
|
+
// type is a free `string`. Narrow for the type anchor only (FDRS-454).
|
|
1632
|
+
failure_code: row.failure_code,
|
|
1633
|
+
failure_message: row.failure_message,
|
|
1634
|
+
fraud_details: {},
|
|
1635
|
+
livemode: false,
|
|
1636
|
+
metadata: {},
|
|
1637
|
+
on_behalf_of: null,
|
|
1638
|
+
outcome: failed ? {
|
|
1639
|
+
network_status: "declined_by_network",
|
|
1640
|
+
reason: row.failure_decline_code,
|
|
1641
|
+
risk_level: "normal",
|
|
1642
|
+
seller_message: "The bank did not return any further details with this decline.",
|
|
1643
|
+
type: "issuer_declined"
|
|
1644
|
+
} : {
|
|
1645
|
+
network_status: "approved_by_network",
|
|
1646
|
+
reason: null,
|
|
1647
|
+
risk_level: "normal",
|
|
1648
|
+
seller_message: "Payment complete.",
|
|
1649
|
+
type: "authorized"
|
|
1650
|
+
},
|
|
1651
|
+
paid: row.status === "succeeded",
|
|
1652
|
+
payment_intent: row.payment_intent_id,
|
|
1653
|
+
payment_method: row.payment_method_id,
|
|
1654
|
+
// Stored blob is spec-faithful (built from the PM row at mint time);
|
|
1655
|
+
// narrow for the type anchor only (FDRS-454).
|
|
1656
|
+
payment_method_details: paymentMethodDetails,
|
|
1657
|
+
receipt_email: null,
|
|
1658
|
+
receipt_number: null,
|
|
1659
|
+
receipt_url: null,
|
|
1660
|
+
// Stripe semantics: `refunded` is true iff the charge is FULLY refunded.
|
|
1661
|
+
// Partial refunds leave `amount_refunded > 0` but `refunded === false`.
|
|
1662
|
+
refunded: row.amount_refunded >= row.amount,
|
|
1663
|
+
review: null,
|
|
1664
|
+
shipping: null,
|
|
1665
|
+
source_transfer: null,
|
|
1666
|
+
statement_descriptor: null,
|
|
1667
|
+
statement_descriptor_suffix: null,
|
|
1668
|
+
status: row.status,
|
|
1669
|
+
transfer_data: null,
|
|
1670
|
+
transfer_group: null,
|
|
1671
|
+
...wireLift
|
|
1672
|
+
};
|
|
1673
|
+
}
|
|
1674
|
+
function refundJson(row) {
|
|
1675
|
+
return {
|
|
1676
|
+
id: row.id,
|
|
1677
|
+
object: "refund",
|
|
1678
|
+
amount: row.amount,
|
|
1679
|
+
balance_transaction: row.balance_transaction_id,
|
|
1680
|
+
charge: row.charge_id,
|
|
1681
|
+
created: row.created,
|
|
1682
|
+
currency: row.currency,
|
|
1683
|
+
metadata: {},
|
|
1684
|
+
payment_intent: row.payment_intent_id,
|
|
1685
|
+
// Twin row `reason` is a free `string`; upstream `Refund.Reason` is a literal
|
|
1686
|
+
// union. Narrow for the type anchor only (FDRS-454), runtime unchanged.
|
|
1687
|
+
reason: row.reason,
|
|
1688
|
+
receipt_number: null,
|
|
1689
|
+
source_transfer_reversal: null,
|
|
1690
|
+
status: row.status,
|
|
1691
|
+
transfer_reversal: null
|
|
1692
|
+
};
|
|
1693
|
+
}
|
|
1694
|
+
function customerJson(row) {
|
|
1695
|
+
return {
|
|
1696
|
+
id: row.id,
|
|
1697
|
+
object: "customer",
|
|
1698
|
+
address: null,
|
|
1699
|
+
balance: 0,
|
|
1700
|
+
created: row.created,
|
|
1701
|
+
currency: null,
|
|
1702
|
+
default_source: null,
|
|
1703
|
+
delinquent: false,
|
|
1704
|
+
description: row.description,
|
|
1705
|
+
discount: null,
|
|
1706
|
+
email: row.email,
|
|
1707
|
+
invoice_settings: {
|
|
1708
|
+
custom_fields: null,
|
|
1709
|
+
default_payment_method: null,
|
|
1710
|
+
footer: null,
|
|
1711
|
+
rendering_options: null
|
|
1712
|
+
},
|
|
1713
|
+
livemode: false,
|
|
1714
|
+
metadata: parseJson(row.metadata_json, {}),
|
|
1715
|
+
name: row.name,
|
|
1716
|
+
phone: row.phone,
|
|
1717
|
+
preferred_locales: [],
|
|
1718
|
+
shipping: null,
|
|
1719
|
+
tax_exempt: "none",
|
|
1720
|
+
test_clock: null
|
|
1721
|
+
};
|
|
1722
|
+
}
|
|
1723
|
+
function deletedCustomerJson(row) {
|
|
1724
|
+
return {
|
|
1725
|
+
id: row.id,
|
|
1726
|
+
object: "customer",
|
|
1727
|
+
deleted: true
|
|
1728
|
+
};
|
|
1729
|
+
}
|
|
1730
|
+
function cardJson(row) {
|
|
1731
|
+
return {
|
|
1732
|
+
brand: row.card_brand,
|
|
1733
|
+
exp_month: row.card_exp_month,
|
|
1734
|
+
exp_year: row.card_exp_year,
|
|
1735
|
+
fingerprint: row.card_fingerprint,
|
|
1736
|
+
funding: "credit",
|
|
1737
|
+
last4: row.card_last4
|
|
1738
|
+
};
|
|
1739
|
+
}
|
|
1740
|
+
function paymentMethodJson(row) {
|
|
1741
|
+
return {
|
|
1742
|
+
id: row.id,
|
|
1743
|
+
object: "payment_method",
|
|
1744
|
+
billing_details: {
|
|
1745
|
+
address: { city: null, country: null, line1: null, line2: null, postal_code: null, state: null },
|
|
1746
|
+
email: null,
|
|
1747
|
+
name: null,
|
|
1748
|
+
phone: null
|
|
1749
|
+
},
|
|
1750
|
+
card: cardJson(row),
|
|
1751
|
+
created: row.created,
|
|
1752
|
+
customer: row.customer_id,
|
|
1753
|
+
livemode: false,
|
|
1754
|
+
metadata: {},
|
|
1755
|
+
// Twin row `type` is a free `string`; upstream `PaymentMethod.type` is a
|
|
1756
|
+
// literal union. Narrow for the type anchor only (FDRS-454), runtime
|
|
1757
|
+
// value ("card") unchanged.
|
|
1758
|
+
type: row.type
|
|
1759
|
+
};
|
|
1760
|
+
}
|
|
1761
|
+
function balanceTransactionJson(row) {
|
|
1762
|
+
return {
|
|
1763
|
+
id: row.id,
|
|
1764
|
+
object: "balance_transaction",
|
|
1765
|
+
amount: row.amount,
|
|
1766
|
+
available_on: row.available_on,
|
|
1767
|
+
created: row.created,
|
|
1768
|
+
currency: row.currency,
|
|
1769
|
+
description: null,
|
|
1770
|
+
exchange_rate: null,
|
|
1771
|
+
fee: row.fee,
|
|
1772
|
+
fee_details: [],
|
|
1773
|
+
net: row.net,
|
|
1774
|
+
reporting_category: row.type,
|
|
1775
|
+
source: row.source_id,
|
|
1776
|
+
status: row.status,
|
|
1777
|
+
// Upstream `BalanceTransaction.Type` is a literal union; the twin's ledger
|
|
1778
|
+
// `type` column is a free `string` (carries the x402 deposit categories).
|
|
1779
|
+
// Narrow for the type anchor only (FDRS-454), runtime value unchanged.
|
|
1780
|
+
type: row.type
|
|
1781
|
+
};
|
|
1782
|
+
}
|
|
1783
|
+
function eventJson(row) {
|
|
1784
|
+
const parsedData = parseJson(row.data_json, { object: null });
|
|
1785
|
+
return {
|
|
1786
|
+
id: row.id,
|
|
1787
|
+
object: "event",
|
|
1788
|
+
api_version: row.api_version,
|
|
1789
|
+
created: row.created,
|
|
1790
|
+
// LIFT (ST-DIV-014): the twin stores the event payload as an opaque parsed
|
|
1791
|
+
// JSON blob (`data.object: unknown`); upstream `Event.Data.object` is a typed
|
|
1792
|
+
// resource union. Narrow for the type anchor only (FDRS-454), runtime unchanged.
|
|
1793
|
+
data: parsedData,
|
|
1794
|
+
livemode: Boolean(row.livemode),
|
|
1795
|
+
pending_webhooks: 0,
|
|
1796
|
+
request: {
|
|
1797
|
+
id: null,
|
|
1798
|
+
idempotency_key: row.request_idempotency_key
|
|
1799
|
+
},
|
|
1800
|
+
// LIFT (ST-DIV-014): twin emits a free `string`; official `EventBase.type`
|
|
1801
|
+
// is the `Event.Type` literal union. Narrow for the anchor only (FDRS-454).
|
|
1802
|
+
type: row.type
|
|
1803
|
+
};
|
|
1804
|
+
}
|
|
1805
|
+
function productJson(row) {
|
|
1806
|
+
return {
|
|
1807
|
+
id: row.id,
|
|
1808
|
+
object: "product",
|
|
1809
|
+
active: Boolean(row.active),
|
|
1810
|
+
created: row.created,
|
|
1811
|
+
default_price: null,
|
|
1812
|
+
description: row.description,
|
|
1813
|
+
images: [],
|
|
1814
|
+
livemode: false,
|
|
1815
|
+
marketing_features: [],
|
|
1816
|
+
metadata: parseJson(row.metadata_json, {}),
|
|
1817
|
+
name: row.name,
|
|
1818
|
+
package_dimensions: null,
|
|
1819
|
+
shippable: null,
|
|
1820
|
+
tax_code: null,
|
|
1821
|
+
type: "service",
|
|
1822
|
+
unit_label: null,
|
|
1823
|
+
updated: row.updated,
|
|
1824
|
+
url: null
|
|
1825
|
+
};
|
|
1826
|
+
}
|
|
1827
|
+
function priceJson(row) {
|
|
1828
|
+
const recurring = row.recurring_interval ? {
|
|
1829
|
+
// Twin row `recurring_interval` is a free `string`; upstream
|
|
1830
|
+
// `Price.Recurring.interval` is a literal union. Narrow for the type
|
|
1831
|
+
// anchor only (FDRS-454), runtime unchanged.
|
|
1832
|
+
interval: row.recurring_interval,
|
|
1833
|
+
interval_count: row.recurring_interval_count ?? 1,
|
|
1834
|
+
meter: null,
|
|
1835
|
+
usage_type: "licensed"
|
|
1836
|
+
} : null;
|
|
1837
|
+
return {
|
|
1838
|
+
id: row.id,
|
|
1839
|
+
object: "price",
|
|
1840
|
+
active: Boolean(row.active),
|
|
1841
|
+
billing_scheme: "per_unit",
|
|
1842
|
+
created: row.created,
|
|
1843
|
+
currency: row.currency,
|
|
1844
|
+
custom_unit_amount: null,
|
|
1845
|
+
livemode: false,
|
|
1846
|
+
lookup_key: row.lookup_key,
|
|
1847
|
+
metadata: parseJson(row.metadata_json, {}),
|
|
1848
|
+
nickname: row.nickname,
|
|
1849
|
+
product: row.product_id,
|
|
1850
|
+
recurring,
|
|
1851
|
+
tax_behavior: "unspecified",
|
|
1852
|
+
tiers_mode: null,
|
|
1853
|
+
transform_quantity: null,
|
|
1854
|
+
type: recurring ? "recurring" : "one_time",
|
|
1855
|
+
unit_amount: row.unit_amount,
|
|
1856
|
+
unit_amount_decimal: row.unit_amount === null ? null : String(row.unit_amount)
|
|
1857
|
+
};
|
|
1858
|
+
}
|
|
1859
|
+
function subscriptionJson(row, itemPrices) {
|
|
1860
|
+
const items = parseJson(row.items_json, []);
|
|
1861
|
+
const firstPrice = items[0] ? itemPrices.get(items[0].price) : void 0;
|
|
1862
|
+
const itemsData = items.map((item) => {
|
|
1863
|
+
const price = itemPrices.get(item.price);
|
|
1864
|
+
return {
|
|
1865
|
+
id: item.id,
|
|
1866
|
+
object: "subscription_item",
|
|
1867
|
+
created: row.created,
|
|
1868
|
+
metadata: {},
|
|
1869
|
+
// Anchor bridge: every stored item price resolves (referential check at
|
|
1870
|
+
// create time); the Map lookup type keeps `undefined` in the signature.
|
|
1871
|
+
price: price ? priceJson(price) : void 0,
|
|
1872
|
+
quantity: item.quantity,
|
|
1873
|
+
subscription: row.id
|
|
1874
|
+
};
|
|
1875
|
+
});
|
|
1876
|
+
return {
|
|
1877
|
+
id: row.id,
|
|
1878
|
+
object: "subscription",
|
|
1879
|
+
billing_cycle_anchor: row.created,
|
|
1880
|
+
cancel_at: null,
|
|
1881
|
+
cancel_at_period_end: Boolean(row.cancel_at_period_end),
|
|
1882
|
+
canceled_at: row.canceled_at,
|
|
1883
|
+
collection_method: "charge_automatically",
|
|
1884
|
+
created: row.created,
|
|
1885
|
+
currency: firstPrice?.currency ?? "usd",
|
|
1886
|
+
customer: row.customer_id,
|
|
1887
|
+
days_until_due: null,
|
|
1888
|
+
default_payment_method: null,
|
|
1889
|
+
description: null,
|
|
1890
|
+
ended_at: row.ended_at,
|
|
1891
|
+
items: {
|
|
1892
|
+
object: "list",
|
|
1893
|
+
data: itemsData,
|
|
1894
|
+
has_more: false,
|
|
1895
|
+
url: `/v1/subscription_items?subscription=${row.id}`
|
|
1896
|
+
},
|
|
1897
|
+
latest_invoice: null,
|
|
1898
|
+
livemode: false,
|
|
1899
|
+
metadata: parseJson(row.metadata_json, {}),
|
|
1900
|
+
start_date: row.created,
|
|
1901
|
+
status: row.status,
|
|
1902
|
+
trial_end: null,
|
|
1903
|
+
trial_start: null
|
|
1904
|
+
};
|
|
1905
|
+
}
|
|
1906
|
+
function serializedList(data, hasMore, _limit, url) {
|
|
1907
|
+
const envelope = {
|
|
1908
|
+
object: "list",
|
|
1909
|
+
data,
|
|
1910
|
+
has_more: hasMore,
|
|
1911
|
+
url
|
|
1912
|
+
};
|
|
1913
|
+
return envelope;
|
|
1914
|
+
}
|
|
1915
|
+
function balanceJson(available, pending) {
|
|
1916
|
+
return {
|
|
1917
|
+
object: "balance",
|
|
1918
|
+
// The twin's per-currency balance entries are spec-faithful {amount, currency}
|
|
1919
|
+
// shapes; bridge the domain layer's opaque arrays to the upstream entry type.
|
|
1920
|
+
available,
|
|
1921
|
+
pending,
|
|
1922
|
+
livemode: false
|
|
1923
|
+
};
|
|
1924
|
+
}
|
|
1925
|
+
function parseJson(value, fallback) {
|
|
1926
|
+
if (!value)
|
|
1927
|
+
return fallback;
|
|
1928
|
+
try {
|
|
1929
|
+
return JSON.parse(value);
|
|
1930
|
+
} catch {
|
|
1931
|
+
return fallback;
|
|
1932
|
+
}
|
|
1933
|
+
}
|
|
1934
|
+
|
|
1935
|
+
// ../packages/twin-stripe/dist/src/domain/stripe-domain.js
|
|
1936
|
+
var StripeDomain = class {
|
|
1937
|
+
db;
|
|
1938
|
+
paymentIntents;
|
|
1939
|
+
charges;
|
|
1940
|
+
balance;
|
|
1941
|
+
events;
|
|
1942
|
+
refunds;
|
|
1943
|
+
customers;
|
|
1944
|
+
paymentMethods;
|
|
1945
|
+
billing;
|
|
1946
|
+
constructor(db) {
|
|
1947
|
+
this.db = db;
|
|
1948
|
+
ensureStripeTables(db);
|
|
1949
|
+
this.paymentIntents = new PaymentIntentsDomain(db);
|
|
1950
|
+
this.charges = new ChargesDomain(db);
|
|
1951
|
+
this.balance = new BalanceDomain(db);
|
|
1952
|
+
this.events = new EventsDomain(db);
|
|
1953
|
+
this.refunds = new RefundsDomain(db);
|
|
1954
|
+
this.customers = new CustomersDomain(db);
|
|
1955
|
+
this.paymentMethods = new PaymentMethodsDomain(db);
|
|
1956
|
+
this.billing = new BillingDomain(db);
|
|
1957
|
+
}
|
|
1958
|
+
/** Reset Stripe-domain state. Used by `/admin/reset`. */
|
|
1959
|
+
reset() {
|
|
1960
|
+
resetStripeTables(this.db);
|
|
1961
|
+
}
|
|
1962
|
+
// ---------- PI flows ----------
|
|
1963
|
+
createPaymentIntent(accountId2, input) {
|
|
1964
|
+
const isCard = Array.isArray(input.payment_method_types) && input.payment_method_types.length === 1 && input.payment_method_types[0] === "card";
|
|
1965
|
+
let resolved = {
|
|
1966
|
+
paymentMethodId: null,
|
|
1967
|
+
customerId: null
|
|
1968
|
+
};
|
|
1969
|
+
if (isCard) {
|
|
1970
|
+
const customerId = input.customer ? this.customers.requireLive(accountId2, input.customer).id : null;
|
|
1971
|
+
let paymentMethodId = null;
|
|
1972
|
+
if (input.payment_method) {
|
|
1973
|
+
const pm = this.paymentMethods.requireById(accountId2, input.payment_method);
|
|
1974
|
+
assertPMUsable(pm, customerId);
|
|
1975
|
+
paymentMethodId = pm.id;
|
|
1976
|
+
}
|
|
1977
|
+
resolved = { paymentMethodId, customerId };
|
|
1978
|
+
if (input.confirm && !resolved.paymentMethodId) {
|
|
1979
|
+
throw missingPaymentMethod();
|
|
1980
|
+
}
|
|
1981
|
+
}
|
|
1982
|
+
const pi = this.paymentIntents.create(accountId2, input, resolved);
|
|
1983
|
+
this.events.create(accountId2, { type: "payment_intent.created", object: paymentIntentJson(pi) });
|
|
1984
|
+
if (pi.status === "requires_action") {
|
|
1985
|
+
this.events.create(accountId2, {
|
|
1986
|
+
type: "payment_intent.requires_action",
|
|
1987
|
+
object: paymentIntentJson(pi)
|
|
1988
|
+
});
|
|
1989
|
+
}
|
|
1990
|
+
if (isCard && input.confirm) {
|
|
1991
|
+
const confirmed = this.confirmPaymentIntent(accountId2, pi.id);
|
|
1992
|
+
return {
|
|
1993
|
+
body: confirmed.body,
|
|
1994
|
+
delta: { before: null, after: confirmed.delta?.after ?? rowToRecord(pi) }
|
|
1995
|
+
};
|
|
1996
|
+
}
|
|
1997
|
+
return {
|
|
1998
|
+
body: paymentIntentJson(pi),
|
|
1999
|
+
delta: { before: null, after: rowToRecord(pi) }
|
|
2000
|
+
};
|
|
2001
|
+
}
|
|
2002
|
+
retrievePaymentIntent(accountId2, id) {
|
|
2003
|
+
return paymentIntentJson(this.paymentIntents.requireById(accountId2, id));
|
|
2004
|
+
}
|
|
2005
|
+
listPaymentIntents(accountId2, input) {
|
|
2006
|
+
const { rows, hasMore, limit } = this.paymentIntents.list(accountId2, input);
|
|
2007
|
+
return serializedList(rows.map(paymentIntentJson), hasMore, limit, "/v1/payment_intents");
|
|
2008
|
+
}
|
|
2009
|
+
confirmPaymentIntent(accountId2, id, opts = {}) {
|
|
2010
|
+
const before = this.paymentIntents.requireById(accountId2, id);
|
|
2011
|
+
if (!piTypes(before).includes("card")) {
|
|
2012
|
+
const pi = this.paymentIntents.confirm(accountId2, id);
|
|
2013
|
+
return {
|
|
2014
|
+
body: paymentIntentJson(pi),
|
|
2015
|
+
delta: { before: rowToRecord(before), after: rowToRecord(pi) }
|
|
2016
|
+
};
|
|
2017
|
+
}
|
|
2018
|
+
if (before.status !== "requires_confirmation" && before.status !== "requires_payment_method") {
|
|
2019
|
+
throw piUnexpectedState(before.status);
|
|
2020
|
+
}
|
|
2021
|
+
const pmId = (opts.payment_method || void 0) ?? before.payment_method_id;
|
|
2022
|
+
if (!pmId) {
|
|
2023
|
+
throw missingPaymentMethod();
|
|
2024
|
+
}
|
|
2025
|
+
const pm = this.paymentMethods.requireById(accountId2, pmId);
|
|
2026
|
+
assertPMUsable(pm, before.customer_id);
|
|
2027
|
+
const decline = declineForFingerprint(pm.card_fingerprint);
|
|
2028
|
+
const tx = this.db.transaction(() => {
|
|
2029
|
+
const inFlight = this.paymentIntents.confirmCardLeg1(accountId2, id, before.status, pm.id);
|
|
2030
|
+
const detailsJson = JSON.stringify(cardChargeDetails(pm));
|
|
2031
|
+
if (decline) {
|
|
2032
|
+
const failedCharge = this.charges.createForPI(accountId2, {
|
|
2033
|
+
payment_intent_id: id,
|
|
2034
|
+
amount: inFlight.amount,
|
|
2035
|
+
currency: inFlight.currency,
|
|
2036
|
+
payment_method_id: pm.id,
|
|
2037
|
+
payment_method_details_json: detailsJson,
|
|
2038
|
+
customer_id: inFlight.customer_id,
|
|
2039
|
+
status: "failed",
|
|
2040
|
+
failure_code: decline.code,
|
|
2041
|
+
failure_decline_code: decline.decline_code,
|
|
2042
|
+
failure_message: decline.message
|
|
2043
|
+
});
|
|
2044
|
+
const lastPaymentError = {
|
|
2045
|
+
type: "card_error",
|
|
2046
|
+
code: decline.code,
|
|
2047
|
+
decline_code: decline.decline_code,
|
|
2048
|
+
message: decline.message,
|
|
2049
|
+
payment_method: paymentMethodJson(pm)
|
|
2050
|
+
};
|
|
2051
|
+
const pi2 = this.paymentIntents.finalizeCardDecline(accountId2, id, failedCharge.id, JSON.stringify(lastPaymentError));
|
|
2052
|
+
this.events.create(accountId2, {
|
|
2053
|
+
type: "payment_intent.payment_failed",
|
|
2054
|
+
object: paymentIntentJson(pi2)
|
|
2055
|
+
});
|
|
2056
|
+
this.events.create(accountId2, {
|
|
2057
|
+
type: "charge.failed",
|
|
2058
|
+
object: chargeJson(failedCharge)
|
|
2059
|
+
});
|
|
2060
|
+
return { declined: decline, pi: pi2 };
|
|
2061
|
+
}
|
|
2062
|
+
const balanceTx = this.balance.create(accountId2, {
|
|
2063
|
+
type: "charge",
|
|
2064
|
+
amount: inFlight.amount,
|
|
2065
|
+
fee: 0,
|
|
2066
|
+
currency: inFlight.currency,
|
|
2067
|
+
source_id: id,
|
|
2068
|
+
source_type: "payment_intent"
|
|
2069
|
+
});
|
|
2070
|
+
const charge = this.charges.createForPI(accountId2, {
|
|
2071
|
+
payment_intent_id: id,
|
|
2072
|
+
amount: inFlight.amount,
|
|
2073
|
+
currency: inFlight.currency,
|
|
2074
|
+
balance_transaction_id: balanceTx.id,
|
|
2075
|
+
payment_method_id: pm.id,
|
|
2076
|
+
payment_method_details_json: detailsJson,
|
|
2077
|
+
customer_id: inFlight.customer_id
|
|
2078
|
+
});
|
|
2079
|
+
const pi = this.paymentIntents.finalizeCardSuccess(accountId2, id, charge.id);
|
|
2080
|
+
this.events.create(accountId2, {
|
|
2081
|
+
type: "payment_intent.succeeded",
|
|
2082
|
+
object: paymentIntentJson(pi)
|
|
2083
|
+
});
|
|
2084
|
+
this.events.create(accountId2, {
|
|
2085
|
+
type: "charge.succeeded",
|
|
2086
|
+
object: chargeJson(charge)
|
|
2087
|
+
});
|
|
2088
|
+
return { declined: null, pi };
|
|
2089
|
+
});
|
|
2090
|
+
const result = tx();
|
|
2091
|
+
if (result.declined) {
|
|
2092
|
+
throw new TwinError("card_error", result.declined.code, result.declined.message, {
|
|
2093
|
+
statusCode: 402,
|
|
2094
|
+
decline_code: result.declined.decline_code,
|
|
2095
|
+
payment_intent: paymentIntentJson(result.pi),
|
|
2096
|
+
state_mutation: true,
|
|
2097
|
+
state_delta: { before: rowToRecord(before), after: rowToRecord(result.pi) }
|
|
2098
|
+
});
|
|
2099
|
+
}
|
|
2100
|
+
return {
|
|
2101
|
+
body: paymentIntentJson(result.pi),
|
|
2102
|
+
delta: { before: rowToRecord(before), after: rowToRecord(result.pi) }
|
|
2103
|
+
};
|
|
2104
|
+
}
|
|
2105
|
+
/**
|
|
2106
|
+
* POST /v1/payment_intents/:id (F-731). The ruled retry-with-new-PM step:
|
|
2107
|
+
* metadata merges per-key, and attaching a PM moves the card PI back to
|
|
2108
|
+
* requires_confirmation. PM/customer resolution happens here so unknown
|
|
2109
|
+
* ids 404 with Stripe's resource_missing before any state gate fires.
|
|
2110
|
+
*/
|
|
2111
|
+
updatePaymentIntent(accountId2, id, input) {
|
|
2112
|
+
const before = this.paymentIntents.requireById(accountId2, id);
|
|
2113
|
+
const resolved = {};
|
|
2114
|
+
if (input.customer !== void 0) {
|
|
2115
|
+
resolved.customerId = input.customer ? this.customers.requireLive(accountId2, input.customer).id : null;
|
|
2116
|
+
}
|
|
2117
|
+
const effectiveCustomerId = resolved.customerId !== void 0 ? resolved.customerId : before.customer_id;
|
|
2118
|
+
if (input.payment_method !== void 0) {
|
|
2119
|
+
if (input.payment_method) {
|
|
2120
|
+
const pm = this.paymentMethods.requireById(accountId2, input.payment_method);
|
|
2121
|
+
assertPMUsable(pm, effectiveCustomerId);
|
|
2122
|
+
resolved.paymentMethodId = pm.id;
|
|
2123
|
+
} else {
|
|
2124
|
+
resolved.paymentMethodId = null;
|
|
2125
|
+
}
|
|
2126
|
+
} else if (input.customer !== void 0 && before.payment_method_id) {
|
|
2127
|
+
assertPMUsable(this.paymentMethods.requireById(accountId2, before.payment_method_id), effectiveCustomerId);
|
|
2128
|
+
}
|
|
2129
|
+
const pi = this.paymentIntents.update(accountId2, id, input, resolved);
|
|
2130
|
+
return {
|
|
2131
|
+
body: paymentIntentJson(pi),
|
|
2132
|
+
delta: { before: rowToRecord(before), after: rowToRecord(pi) }
|
|
2133
|
+
};
|
|
2134
|
+
}
|
|
2135
|
+
cancelPaymentIntent(accountId2, id) {
|
|
2136
|
+
const before = this.paymentIntents.requireById(accountId2, id);
|
|
2137
|
+
if (before.status === "canceled") {
|
|
2138
|
+
return {
|
|
2139
|
+
body: paymentIntentJson(before),
|
|
2140
|
+
delta: { before: rowToRecord(before), after: rowToRecord(before) }
|
|
2141
|
+
};
|
|
2142
|
+
}
|
|
2143
|
+
const pi = this.paymentIntents.cancel(accountId2, id);
|
|
2144
|
+
this.events.create(accountId2, { type: "payment_intent.canceled", object: paymentIntentJson(pi) });
|
|
2145
|
+
return {
|
|
2146
|
+
body: paymentIntentJson(pi),
|
|
2147
|
+
delta: { before: rowToRecord(before), after: rowToRecord(pi) }
|
|
2148
|
+
};
|
|
2149
|
+
}
|
|
2150
|
+
/**
|
|
2151
|
+
* Drive a PI through requires_action → processing → succeeded.
|
|
2152
|
+
* Emits payment_intent.processing, payment_intent.succeeded,
|
|
2153
|
+
* charge.succeeded events. Mints exactly one charge + one
|
|
2154
|
+
* balance_transaction. CAS guarantees only one parallel caller wins.
|
|
2155
|
+
*
|
|
2156
|
+
* F2: the entire flow runs inside a single better-sqlite3 transaction.
|
|
2157
|
+
* If anything throws between Leg 1 and the final event emit, the
|
|
2158
|
+
* transaction rolls back — no orphan charges/balance txns and no PI
|
|
2159
|
+
* stuck in `processing`. better-sqlite3 transactions are synchronous
|
|
2160
|
+
* and atomic, and the CAS works inside the transaction the same way it
|
|
2161
|
+
* does outside it.
|
|
2162
|
+
*/
|
|
2163
|
+
simulateCryptoDeposit(accountId2, id) {
|
|
2164
|
+
const before = this.paymentIntents.requireById(accountId2, id);
|
|
2165
|
+
const tx = this.db.transaction(() => {
|
|
2166
|
+
let pi = this.paymentIntents.simulateCryptoDepositLeg1(accountId2, id);
|
|
2167
|
+
this.events.create(accountId2, {
|
|
2168
|
+
type: "payment_intent.processing",
|
|
2169
|
+
object: paymentIntentJson(pi)
|
|
2170
|
+
});
|
|
2171
|
+
const balanceTx = this.balance.create(accountId2, {
|
|
2172
|
+
type: "charge",
|
|
2173
|
+
amount: pi.amount,
|
|
2174
|
+
fee: 0,
|
|
2175
|
+
currency: pi.currency,
|
|
2176
|
+
source_id: pi.id,
|
|
2177
|
+
source_type: "payment_intent"
|
|
2178
|
+
});
|
|
2179
|
+
const charge = this.charges.createForPI(accountId2, {
|
|
2180
|
+
payment_intent_id: pi.id,
|
|
2181
|
+
amount: pi.amount,
|
|
2182
|
+
currency: pi.currency,
|
|
2183
|
+
balance_transaction_id: balanceTx.id
|
|
2184
|
+
});
|
|
2185
|
+
pi = this.paymentIntents.simulateCryptoDepositLeg2(accountId2, id, charge.id);
|
|
2186
|
+
const finalCharge = this.charges.requireById(accountId2, charge.id);
|
|
2187
|
+
this.events.create(accountId2, {
|
|
2188
|
+
type: "payment_intent.succeeded",
|
|
2189
|
+
object: paymentIntentJson(pi)
|
|
2190
|
+
});
|
|
2191
|
+
this.events.create(accountId2, {
|
|
2192
|
+
type: "charge.succeeded",
|
|
2193
|
+
object: chargeJson(finalCharge)
|
|
2194
|
+
});
|
|
2195
|
+
return { body: paymentIntentJson(pi), after: pi };
|
|
2196
|
+
});
|
|
2197
|
+
const result = tx();
|
|
2198
|
+
return {
|
|
2199
|
+
body: result.body,
|
|
2200
|
+
delta: { before: rowToRecord(before), after: rowToRecord(result.after) }
|
|
2201
|
+
};
|
|
2202
|
+
}
|
|
2203
|
+
// ---------- Refunds ----------
|
|
2204
|
+
/**
|
|
2205
|
+
* Create a refund. Returns the serialized API shape plus a canonical
|
|
2206
|
+
* `state_delta` so the route can hand both to `respond()`.
|
|
2207
|
+
*
|
|
2208
|
+
* F-733: the whole flow — refund INSERT + charges.amount_refunded UPDATE
|
|
2209
|
+
* (inside `refunds.create()`, nested as a savepoint), the negative
|
|
2210
|
+
* refund-type balance transaction, the ledger link backfill, and the
|
|
2211
|
+
* charge.refunded / refund.created events — commits in one better-sqlite3
|
|
2212
|
+
* transaction, mirroring the settle flows.
|
|
2213
|
+
*/
|
|
2214
|
+
createRefund(accountId2, input) {
|
|
2215
|
+
const tx = this.db.transaction(() => {
|
|
2216
|
+
const { row: row2, charge } = this.refunds.create(accountId2, input);
|
|
2217
|
+
const balanceTx = this.balance.create(accountId2, {
|
|
2218
|
+
type: "refund",
|
|
2219
|
+
amount: -row2.amount,
|
|
2220
|
+
fee: 0,
|
|
2221
|
+
currency: row2.currency,
|
|
2222
|
+
source_id: row2.id,
|
|
2223
|
+
source_type: "refund"
|
|
2224
|
+
});
|
|
2225
|
+
const linked = this.refunds.linkBalanceTransaction(accountId2, row2.id, balanceTx.id);
|
|
2226
|
+
this.events.create(accountId2, { type: "charge.refunded", object: chargeJson(charge) });
|
|
2227
|
+
this.events.create(accountId2, { type: "refund.created", object: refundJson(linked) });
|
|
2228
|
+
return linked;
|
|
2229
|
+
});
|
|
2230
|
+
const row = tx();
|
|
2231
|
+
return {
|
|
2232
|
+
body: refundJson(row),
|
|
2233
|
+
delta: { before: null, after: rowToRecord(row) }
|
|
2234
|
+
};
|
|
2235
|
+
}
|
|
2236
|
+
retrieveRefund(accountId2, id) {
|
|
2237
|
+
return refundJson(this.refunds.requireById(accountId2, id));
|
|
2238
|
+
}
|
|
2239
|
+
listRefunds(accountId2, input) {
|
|
2240
|
+
const { rows, hasMore, limit } = this.refunds.list(accountId2, input);
|
|
2241
|
+
return serializedList(rows.map(refundJson), hasMore, limit, "/v1/refunds");
|
|
2242
|
+
}
|
|
2243
|
+
// ---------- Customers ----------
|
|
2244
|
+
createCustomer(accountId2, input) {
|
|
2245
|
+
const row = this.customers.create(accountId2, input);
|
|
2246
|
+
this.events.create(accountId2, { type: "customer.created", object: customerJson(row) });
|
|
2247
|
+
return {
|
|
2248
|
+
body: customerJson(row),
|
|
2249
|
+
delta: { before: null, after: rowToRecord(row) }
|
|
2250
|
+
};
|
|
2251
|
+
}
|
|
2252
|
+
/** Deleted customers serve the `{deleted: true}` stub, like real Stripe. */
|
|
2253
|
+
retrieveCustomer(accountId2, id) {
|
|
2254
|
+
const row = this.customers.requireById(accountId2, id);
|
|
2255
|
+
return row.deleted ? deletedCustomerJson(row) : customerJson(row);
|
|
2256
|
+
}
|
|
2257
|
+
updateCustomer(accountId2, id, input) {
|
|
2258
|
+
const before = this.customers.requireLive(accountId2, id);
|
|
2259
|
+
const row = this.customers.update(accountId2, id, input);
|
|
2260
|
+
this.events.create(accountId2, { type: "customer.updated", object: customerJson(row) });
|
|
2261
|
+
return {
|
|
2262
|
+
body: customerJson(row),
|
|
2263
|
+
delta: { before: rowToRecord(before), after: rowToRecord(row) }
|
|
2264
|
+
};
|
|
2265
|
+
}
|
|
2266
|
+
deleteCustomer(accountId2, id) {
|
|
2267
|
+
const before = this.customers.requireById(accountId2, id);
|
|
2268
|
+
const attached = this.paymentMethods.allAttachedToCustomer(accountId2, id);
|
|
2269
|
+
const { row, alreadyDeleted } = this.customers.delete(accountId2, id);
|
|
2270
|
+
if (!alreadyDeleted) {
|
|
2271
|
+
this.events.create(accountId2, { type: "customer.deleted", object: deletedCustomerJson(row) });
|
|
2272
|
+
for (const pm of attached) {
|
|
2273
|
+
this.events.create(accountId2, {
|
|
2274
|
+
type: "payment_method.detached",
|
|
2275
|
+
object: paymentMethodJson(this.paymentMethods.requireById(accountId2, pm.id))
|
|
2276
|
+
});
|
|
2277
|
+
}
|
|
2278
|
+
}
|
|
2279
|
+
return {
|
|
2280
|
+
body: deletedCustomerJson(row),
|
|
2281
|
+
delta: { before: rowToRecord(before), after: rowToRecord(row) }
|
|
2282
|
+
};
|
|
2283
|
+
}
|
|
2284
|
+
listCustomers(accountId2, input) {
|
|
2285
|
+
const { rows, hasMore, limit } = this.customers.list(accountId2, input);
|
|
2286
|
+
return serializedList(rows.map(customerJson), hasMore, limit, "/v1/customers");
|
|
2287
|
+
}
|
|
2288
|
+
listCustomerPaymentMethods(accountId2, customerId, input) {
|
|
2289
|
+
this.customers.requireLive(accountId2, customerId);
|
|
2290
|
+
const { rows, hasMore, limit } = this.paymentMethods.listForCustomer(accountId2, customerId, input);
|
|
2291
|
+
return serializedList(rows.map(paymentMethodJson), hasMore, limit, `/v1/customers/${customerId}/payment_methods`);
|
|
2292
|
+
}
|
|
2293
|
+
// ---------- Payment methods ----------
|
|
2294
|
+
createPaymentMethod(accountId2, input) {
|
|
2295
|
+
const row = this.paymentMethods.create(accountId2, input);
|
|
2296
|
+
return {
|
|
2297
|
+
body: paymentMethodJson(row),
|
|
2298
|
+
delta: { before: null, after: rowToRecord(row) }
|
|
2299
|
+
};
|
|
2300
|
+
}
|
|
2301
|
+
retrievePaymentMethod(accountId2, id) {
|
|
2302
|
+
return paymentMethodJson(this.paymentMethods.requireById(accountId2, id));
|
|
2303
|
+
}
|
|
2304
|
+
attachPaymentMethod(accountId2, id, customerId) {
|
|
2305
|
+
this.customers.requireLive(accountId2, customerId);
|
|
2306
|
+
const before = this.paymentMethods.requireById(accountId2, id);
|
|
2307
|
+
const row = this.paymentMethods.attach(accountId2, id, customerId);
|
|
2308
|
+
this.events.create(accountId2, {
|
|
2309
|
+
type: "payment_method.attached",
|
|
2310
|
+
object: paymentMethodJson(row)
|
|
2311
|
+
});
|
|
2312
|
+
return {
|
|
2313
|
+
body: paymentMethodJson(row),
|
|
2314
|
+
delta: { before: rowToRecord(before), after: rowToRecord(row) }
|
|
2315
|
+
};
|
|
2316
|
+
}
|
|
2317
|
+
detachPaymentMethod(accountId2, id) {
|
|
2318
|
+
const before = this.paymentMethods.requireById(accountId2, id);
|
|
2319
|
+
const row = this.paymentMethods.detach(accountId2, id);
|
|
2320
|
+
this.events.create(accountId2, {
|
|
2321
|
+
type: "payment_method.detached",
|
|
2322
|
+
object: paymentMethodJson(row)
|
|
2323
|
+
});
|
|
2324
|
+
return {
|
|
2325
|
+
body: paymentMethodJson(row),
|
|
2326
|
+
delta: { before: rowToRecord(before), after: rowToRecord(row) }
|
|
2327
|
+
};
|
|
2328
|
+
}
|
|
2329
|
+
// ---------- Charges ----------
|
|
2330
|
+
retrieveCharge(accountId2, id) {
|
|
2331
|
+
return chargeJson(this.charges.requireById(accountId2, id));
|
|
2332
|
+
}
|
|
2333
|
+
listCharges(accountId2, input) {
|
|
2334
|
+
const { rows, hasMore, limit } = this.charges.list(accountId2, input);
|
|
2335
|
+
return serializedList(rows.map(chargeJson), hasMore, limit, "/v1/charges");
|
|
2336
|
+
}
|
|
2337
|
+
// ---------- Balance ----------
|
|
2338
|
+
retrieveBalance(accountId2) {
|
|
2339
|
+
const { available, pending } = this.balance.current(accountId2);
|
|
2340
|
+
return balanceJson(available, pending);
|
|
2341
|
+
}
|
|
2342
|
+
listBalanceTransactions(accountId2, input) {
|
|
2343
|
+
const { rows, hasMore, limit } = this.balance.list(accountId2, input);
|
|
2344
|
+
return serializedList(rows.map(balanceTransactionJson), hasMore, limit, "/v1/balance_transactions");
|
|
2345
|
+
}
|
|
2346
|
+
// ---------- Events ----------
|
|
2347
|
+
retrieveEvent(accountId2, id) {
|
|
2348
|
+
return eventJson(this.events.requireById(accountId2, id));
|
|
2349
|
+
}
|
|
2350
|
+
listEvents(accountId2, input) {
|
|
2351
|
+
const { rows, hasMore, limit } = this.events.list(accountId2, input);
|
|
2352
|
+
return serializedList(rows.map(eventJson), hasMore, limit, "/v1/events");
|
|
2353
|
+
}
|
|
2354
|
+
// ---------- Billing (F-734, shape tier) ----------
|
|
2355
|
+
//
|
|
2356
|
+
// Warm surfaces per the F-729 ruling: stored rows served in Stripe shape,
|
|
2357
|
+
// deliberately WITHOUT the semantic billing machine — creating a product,
|
|
2358
|
+
// price, or subscription emits no events and mints no invoices; the
|
|
2359
|
+
// recorder deltas stay truthful to the single-row writes.
|
|
2360
|
+
createProduct(accountId2, input) {
|
|
2361
|
+
const row = this.billing.createProduct(accountId2, input);
|
|
2362
|
+
return { body: productJson(row), delta: { before: null, after: rowToRecord(row) } };
|
|
2363
|
+
}
|
|
2364
|
+
retrieveProduct(accountId2, id) {
|
|
2365
|
+
return productJson(this.billing.requireProduct(accountId2, id));
|
|
2366
|
+
}
|
|
2367
|
+
listProducts(accountId2, input) {
|
|
2368
|
+
const { rows, hasMore, limit } = this.billing.listProducts(accountId2, input);
|
|
2369
|
+
return serializedList(rows.map(productJson), hasMore, limit, "/v1/products");
|
|
2370
|
+
}
|
|
2371
|
+
createPrice(accountId2, input) {
|
|
2372
|
+
const row = this.billing.createPrice(accountId2, input);
|
|
2373
|
+
return { body: priceJson(row), delta: { before: null, after: rowToRecord(row) } };
|
|
2374
|
+
}
|
|
2375
|
+
retrievePrice(accountId2, id) {
|
|
2376
|
+
return priceJson(this.billing.requirePrice(accountId2, id));
|
|
2377
|
+
}
|
|
2378
|
+
listPrices(accountId2, input) {
|
|
2379
|
+
const { rows, hasMore, limit } = this.billing.listPrices(accountId2, input);
|
|
2380
|
+
return serializedList(rows.map(priceJson), hasMore, limit, "/v1/prices");
|
|
2381
|
+
}
|
|
2382
|
+
createSubscription(accountId2, input) {
|
|
2383
|
+
if (input.customer)
|
|
2384
|
+
this.customers.requireLive(accountId2, input.customer);
|
|
2385
|
+
const row = this.billing.createSubscription(accountId2, input);
|
|
2386
|
+
return {
|
|
2387
|
+
body: this.subscriptionBody(accountId2, row),
|
|
2388
|
+
delta: { before: null, after: rowToRecord(row) }
|
|
2389
|
+
};
|
|
2390
|
+
}
|
|
2391
|
+
retrieveSubscription(accountId2, id) {
|
|
2392
|
+
return this.subscriptionBody(accountId2, this.billing.requireSubscription(accountId2, id));
|
|
2393
|
+
}
|
|
2394
|
+
updateSubscription(accountId2, id, input) {
|
|
2395
|
+
const before = this.billing.requireSubscription(accountId2, id);
|
|
2396
|
+
const row = this.billing.updateSubscription(accountId2, id, input);
|
|
2397
|
+
return {
|
|
2398
|
+
body: this.subscriptionBody(accountId2, row),
|
|
2399
|
+
delta: { before: rowToRecord(before), after: rowToRecord(row) }
|
|
2400
|
+
};
|
|
2401
|
+
}
|
|
2402
|
+
cancelSubscription(accountId2, id) {
|
|
2403
|
+
const before = this.billing.requireSubscription(accountId2, id);
|
|
2404
|
+
const row = this.billing.cancelSubscription(accountId2, id);
|
|
2405
|
+
return {
|
|
2406
|
+
body: this.subscriptionBody(accountId2, row),
|
|
2407
|
+
delta: { before: rowToRecord(before), after: rowToRecord(row) }
|
|
2408
|
+
};
|
|
2409
|
+
}
|
|
2410
|
+
listSubscriptions(accountId2, input) {
|
|
2411
|
+
const { rows, hasMore, limit } = this.billing.listSubscriptions(accountId2, input);
|
|
2412
|
+
return serializedList(rows.map((row) => this.subscriptionBody(accountId2, row)), hasMore, limit, "/v1/subscriptions");
|
|
2413
|
+
}
|
|
2414
|
+
/** Resolve item price rows so the serializer can expand SubscriptionItem.price. */
|
|
2415
|
+
subscriptionBody(accountId2, row) {
|
|
2416
|
+
const items = JSON.parse(row.items_json);
|
|
2417
|
+
const prices = /* @__PURE__ */ new Map();
|
|
2418
|
+
for (const item of items) {
|
|
2419
|
+
if (!prices.has(item.price)) {
|
|
2420
|
+
prices.set(item.price, this.billing.requirePrice(accountId2, item.price));
|
|
2421
|
+
}
|
|
2422
|
+
}
|
|
2423
|
+
return subscriptionJson(row, prices);
|
|
2424
|
+
}
|
|
2425
|
+
// Invoices are reads-only (F-729 ruling point 2: create/finalize/pay stay
|
|
2426
|
+
// unlisted-cold) and nothing in the twin mints one, so the list is always
|
|
2427
|
+
// empty and retrieve always 404s — loud, Stripe-shaped, documented.
|
|
2428
|
+
retrieveInvoice(accountId2, id) {
|
|
2429
|
+
throw noSuch("invoice", id);
|
|
2430
|
+
}
|
|
2431
|
+
listInvoices(accountId2, input) {
|
|
2432
|
+
const limit = Math.min(100, Math.max(1, Math.floor(input.limit ?? 10)));
|
|
2433
|
+
return serializedList([], false, limit, "/v1/invoices");
|
|
2434
|
+
}
|
|
2435
|
+
// ---------- State export (for _pome/state) ----------
|
|
2436
|
+
/**
|
|
2437
|
+
* Account-scoped state export. Used by `/_pome/state` to surface only
|
|
2438
|
+
* the calling session's data. Two sessions hitting `_pome/state` see
|
|
2439
|
+
* disjoint views of the same DB.
|
|
2440
|
+
*
|
|
2441
|
+
* Ordering is `created DESC, rowid DESC`: `created` has unix-second
|
|
2442
|
+
* resolution, so rows minted within the same second tied and flipped
|
|
2443
|
+
* order run-to-run (the F-683 export-race class). The insertion-order
|
|
2444
|
+
* tiebreak keeps the export deterministic — same seed + same ops =>
|
|
2445
|
+
* same state (test/state-export.test.ts).
|
|
2446
|
+
*/
|
|
2447
|
+
exportState(accountId2) {
|
|
2448
|
+
const pis = this.db.prepare("SELECT * FROM payment_intents WHERE account_id = ? ORDER BY created DESC, rowid DESC").all(accountId2);
|
|
2449
|
+
const charges = this.db.prepare("SELECT * FROM charges WHERE account_id = ? ORDER BY created DESC, rowid DESC").all(accountId2);
|
|
2450
|
+
const balanceTxs = this.db.prepare("SELECT * FROM balance_transactions WHERE account_id = ? ORDER BY created DESC, rowid DESC").all(accountId2);
|
|
2451
|
+
const events = this.db.prepare("SELECT * FROM events WHERE account_id = ? ORDER BY created DESC, rowid DESC").all(accountId2);
|
|
2452
|
+
const refunds = this.db.prepare("SELECT * FROM refunds WHERE account_id = ? ORDER BY created DESC, rowid DESC").all(accountId2);
|
|
2453
|
+
const customers = this.db.prepare("SELECT * FROM customers WHERE account_id = ? ORDER BY created DESC, rowid DESC").all(accountId2);
|
|
2454
|
+
const paymentMethods = this.db.prepare("SELECT * FROM payment_methods WHERE account_id = ? ORDER BY created DESC, rowid DESC").all(accountId2);
|
|
2455
|
+
const products = this.db.prepare("SELECT * FROM products WHERE account_id = ? ORDER BY created DESC, rowid DESC").all(accountId2);
|
|
2456
|
+
const prices = this.db.prepare("SELECT * FROM prices WHERE account_id = ? ORDER BY created DESC, rowid DESC").all(accountId2);
|
|
2457
|
+
const subscriptions = this.db.prepare("SELECT * FROM subscriptions WHERE account_id = ? ORDER BY created DESC, rowid DESC").all(accountId2);
|
|
2458
|
+
return {
|
|
2459
|
+
payment_intents: pis.map(paymentIntentJson),
|
|
2460
|
+
charges: charges.map(chargeJson),
|
|
2461
|
+
balance_transactions: balanceTxs.map(balanceTransactionJson),
|
|
2462
|
+
events: events.map(eventJson),
|
|
2463
|
+
refunds: refunds.map(refundJson),
|
|
2464
|
+
customers: customers.map((row) => row.deleted ? deletedCustomerJson(row) : customerJson(row)),
|
|
2465
|
+
payment_methods: paymentMethods.map(paymentMethodJson),
|
|
2466
|
+
products: products.map(productJson),
|
|
2467
|
+
prices: prices.map(priceJson),
|
|
2468
|
+
subscriptions: subscriptions.map((row) => this.subscriptionBody(accountId2, row))
|
|
2469
|
+
};
|
|
2470
|
+
}
|
|
2471
|
+
};
|
|
2472
|
+
function rowToRecord(row) {
|
|
2473
|
+
return { ...row };
|
|
2474
|
+
}
|
|
2475
|
+
function missingPaymentMethod() {
|
|
2476
|
+
return new TwinError("invalid_request_error", "payment_intent_unexpected_state", "You cannot confirm this PaymentIntent because it's missing a payment method. Update the PaymentIntent with a payment_method and then confirm it again.", { statusCode: 400 });
|
|
2477
|
+
}
|
|
2478
|
+
function assertPMUsable(pm, customerId) {
|
|
2479
|
+
if (pm.detached) {
|
|
2480
|
+
throw new TwinError("invalid_request_error", "payment_method_previously_detached", "A payment method that has been previously detached from a customer may not be used again.", { param: "payment_method", statusCode: 400 });
|
|
2481
|
+
}
|
|
2482
|
+
if (pm.customer_id && pm.customer_id !== customerId) {
|
|
2483
|
+
throw new TwinError("invalid_request_error", "payment_method_customer_mismatch", "The payment method you provided is attached to a customer. You may only use it with that customer via the `customer` parameter.", { param: "payment_method", statusCode: 400 });
|
|
2484
|
+
}
|
|
2485
|
+
}
|
|
2486
|
+
function cardChargeDetails(pm) {
|
|
2487
|
+
return { type: "card", card: cardJson(pm) };
|
|
2488
|
+
}
|
|
2489
|
+
var CACHEABLE_METHODS = /* @__PURE__ */ new Set(["POST", "PUT", "PATCH", "DELETE"]);
|
|
2490
|
+
var HANDLER_RESULT_KEY = "twinStripeHandlerResult";
|
|
2491
|
+
function setHandlerResult(c, result) {
|
|
2492
|
+
c.set(HANDLER_RESULT_KEY, result);
|
|
2493
|
+
}
|
|
2494
|
+
function getHandlerResult(c) {
|
|
2495
|
+
return c.get(HANDLER_RESULT_KEY) ?? null;
|
|
2496
|
+
}
|
|
2497
|
+
function hashRequest(method, path, body) {
|
|
2498
|
+
return createHash("sha256").update(method).update("\0").update(path).update("\0").update(body).digest("hex");
|
|
2499
|
+
}
|
|
2500
|
+
function getAccountId(c) {
|
|
2501
|
+
const session = c.get("session");
|
|
2502
|
+
if (session)
|
|
2503
|
+
return session.account_id;
|
|
2504
|
+
const sid = c.req.param("sid");
|
|
2505
|
+
return sid ? `acct_${sid}` : "_anon";
|
|
2506
|
+
}
|
|
2507
|
+
function idempotencyMiddleware(db, recorder, runId = "local") {
|
|
2508
|
+
const select = db.prepare(`SELECT key, account_id, method, path, request_hash, response_status, response_body_json, created_at
|
|
2509
|
+
FROM idempotency_keys
|
|
2510
|
+
WHERE key = ? AND account_id = ? AND method = ? AND path = ?`);
|
|
2511
|
+
const insert = db.prepare(`INSERT INTO idempotency_keys
|
|
2512
|
+
(key, account_id, method, path, request_hash, response_status, response_body_json, created_at)
|
|
2513
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
2514
|
+
ON CONFLICT(key, account_id, method, path) DO NOTHING`);
|
|
2515
|
+
const pending = /* @__PURE__ */ new Map();
|
|
2516
|
+
return async (c, next) => {
|
|
2517
|
+
const method = c.req.method.toUpperCase();
|
|
2518
|
+
if (!CACHEABLE_METHODS.has(method)) {
|
|
2519
|
+
await next();
|
|
2520
|
+
return;
|
|
2521
|
+
}
|
|
2522
|
+
const headerKey = c.req.header("Idempotency-Key") ?? c.req.header("idempotency-key");
|
|
2523
|
+
if (!headerKey) {
|
|
2524
|
+
await next();
|
|
2525
|
+
return;
|
|
2526
|
+
}
|
|
2527
|
+
const startedAt = Date.now();
|
|
2528
|
+
const account_id = getAccountId(c);
|
|
2529
|
+
const path = new URL(c.req.url).pathname;
|
|
2530
|
+
const rawBody = await c.req.raw.clone().text().catch(() => "");
|
|
2531
|
+
const requestHash = hashRequest(method, path, rawBody);
|
|
2532
|
+
const pendingKey = [headerKey, account_id, method, path].join("\0");
|
|
2533
|
+
const existing = select.get(headerKey, account_id, method, path);
|
|
2534
|
+
if (existing) {
|
|
2535
|
+
if (existing.request_hash !== requestHash) {
|
|
2536
|
+
const env = stripeError("idempotency_error", "idempotency_key_in_use", `Keys for idempotent requests can only be used with the same parameters they were first used with. Try using a key other than '${headerKey}'.`, { statusCode: 400 });
|
|
2537
|
+
return c.json(env.body, env.status);
|
|
2538
|
+
}
|
|
2539
|
+
let cachedBody;
|
|
2540
|
+
try {
|
|
2541
|
+
cachedBody = JSON.parse(existing.response_body_json);
|
|
2542
|
+
} catch {
|
|
2543
|
+
cachedBody = null;
|
|
2544
|
+
}
|
|
2545
|
+
recordDedupeEvent(c, recorder, runId, startedAt, rawBody, {
|
|
2546
|
+
status: existing.response_status,
|
|
2547
|
+
body: cachedBody
|
|
2548
|
+
});
|
|
2549
|
+
return c.json(cachedBody, existing.response_status);
|
|
2550
|
+
}
|
|
2551
|
+
const inFlight = pending.get(pendingKey);
|
|
2552
|
+
if (inFlight) {
|
|
2553
|
+
if (inFlight.requestHash !== requestHash) {
|
|
2554
|
+
const env = stripeError("idempotency_error", "idempotency_key_in_use", `Keys for idempotent requests can only be used with the same parameters they were first used with. Try using a key other than '${headerKey}'.`, { statusCode: 400 });
|
|
2555
|
+
return c.json(env.body, env.status);
|
|
2556
|
+
}
|
|
2557
|
+
const cached = await inFlight.promise;
|
|
2558
|
+
if (cached.status < 400) {
|
|
2559
|
+
const cachedBody = parseCachedBody(cached.bodyText);
|
|
2560
|
+
recordDedupeEvent(c, recorder, runId, startedAt, rawBody, {
|
|
2561
|
+
status: cached.status,
|
|
2562
|
+
body: cachedBody
|
|
2563
|
+
});
|
|
2564
|
+
return c.json(cachedBody, cached.status);
|
|
2565
|
+
}
|
|
2566
|
+
await next();
|
|
2567
|
+
return;
|
|
2568
|
+
}
|
|
2569
|
+
let resolvePending;
|
|
2570
|
+
let rejectPending;
|
|
2571
|
+
const promise = new Promise((resolve, reject) => {
|
|
2572
|
+
resolvePending = resolve;
|
|
2573
|
+
rejectPending = reject;
|
|
2574
|
+
});
|
|
2575
|
+
pending.set(pendingKey, { requestHash, promise });
|
|
2576
|
+
try {
|
|
2577
|
+
await next();
|
|
2578
|
+
} catch (error) {
|
|
2579
|
+
rejectPending(error);
|
|
2580
|
+
pending.delete(pendingKey);
|
|
2581
|
+
throw error;
|
|
2582
|
+
}
|
|
2583
|
+
try {
|
|
2584
|
+
const handled = getHandlerResult(c);
|
|
2585
|
+
const status = handled ? handled.status : c.res.status;
|
|
2586
|
+
if (status >= 400) {
|
|
2587
|
+
resolvePending({ status, bodyText: "null" });
|
|
2588
|
+
return;
|
|
2589
|
+
}
|
|
2590
|
+
let bodyText = "";
|
|
2591
|
+
if (handled) {
|
|
2592
|
+
bodyText = JSON.stringify(handled.body);
|
|
2593
|
+
} else {
|
|
2594
|
+
const cloned = c.res.clone();
|
|
2595
|
+
try {
|
|
2596
|
+
bodyText = await cloned.text();
|
|
2597
|
+
} catch {
|
|
2598
|
+
bodyText = "";
|
|
2599
|
+
}
|
|
2600
|
+
}
|
|
2601
|
+
try {
|
|
2602
|
+
JSON.parse(bodyText);
|
|
2603
|
+
} catch {
|
|
2604
|
+
bodyText = "null";
|
|
2605
|
+
}
|
|
2606
|
+
insert.run(headerKey, account_id, method, path, requestHash, status, bodyText, nowIso());
|
|
2607
|
+
resolvePending({ status, bodyText });
|
|
2608
|
+
} catch (error) {
|
|
2609
|
+
rejectPending(error);
|
|
2610
|
+
throw error;
|
|
2611
|
+
} finally {
|
|
2612
|
+
pending.delete(pendingKey);
|
|
2613
|
+
}
|
|
2614
|
+
};
|
|
2615
|
+
}
|
|
2616
|
+
function recordDedupeEvent(c, recorder, runId, startedAt, rawBody, cached) {
|
|
2617
|
+
if (!recorder)
|
|
2618
|
+
return;
|
|
2619
|
+
const reqId = requestId();
|
|
2620
|
+
const stepId = c.req.header("x-pome-scenario-step-id") ?? null;
|
|
2621
|
+
recorder.record({
|
|
2622
|
+
ts: (/* @__PURE__ */ new Date()).toISOString(),
|
|
2623
|
+
run_id: runId,
|
|
2624
|
+
twin: "stripe",
|
|
2625
|
+
request_id: reqId,
|
|
2626
|
+
correlation_id: c.req.header("x-pome-correlation-id") ?? reqId,
|
|
2627
|
+
task_step_id: stepId,
|
|
2628
|
+
scenario_step_id: stepId,
|
|
2629
|
+
step_id: null,
|
|
2630
|
+
tool_call_id: null,
|
|
2631
|
+
method: c.req.method,
|
|
2632
|
+
path: new URL(c.req.url).pathname,
|
|
2633
|
+
request_body: rawBody === "" ? null : rawBody,
|
|
2634
|
+
// F-1125 — the replay's own headers, which is where `Idempotency-Key`
|
|
2635
|
+
// lives. Recording the dedupe outcome while hiding the key that caused it
|
|
2636
|
+
// would leave the reason unreadable on the one row that is about it.
|
|
2637
|
+
request_headers: recordedRequestHeaders(c),
|
|
2638
|
+
tool: null,
|
|
2639
|
+
status: cached.status,
|
|
2640
|
+
response_body: cached.body,
|
|
2641
|
+
latency_ms: Date.now() - startedAt,
|
|
2642
|
+
fidelity: "semantic",
|
|
2643
|
+
state_mutation: false,
|
|
2644
|
+
state_delta: null,
|
|
2645
|
+
idempotency_dedupe: true,
|
|
2646
|
+
error: null
|
|
2647
|
+
});
|
|
2648
|
+
}
|
|
2649
|
+
function parseCachedBody(bodyText) {
|
|
2650
|
+
try {
|
|
2651
|
+
return JSON.parse(bodyText);
|
|
2652
|
+
} catch {
|
|
2653
|
+
return null;
|
|
2654
|
+
}
|
|
2655
|
+
}
|
|
2656
|
+
function accountId(c) {
|
|
2657
|
+
const session = c.get("session");
|
|
2658
|
+
if (!session) {
|
|
2659
|
+
throw new TwinError("api_error", "internal_error", "Missing session context (auth middleware did not run).", { statusCode: 500 });
|
|
2660
|
+
}
|
|
2661
|
+
return session.account_id;
|
|
2662
|
+
}
|
|
2663
|
+
function ok(body, mutation = false, stateDelta) {
|
|
2664
|
+
return { status: 200, body, mutation, stateDelta };
|
|
2665
|
+
}
|
|
2666
|
+
function created(body, stateDelta) {
|
|
2667
|
+
return { status: 200, body, mutation: true, stateDelta };
|
|
2668
|
+
}
|
|
2669
|
+
async function handle(c, recorder, runId, fn) {
|
|
2670
|
+
const started = Date.now();
|
|
2671
|
+
let requestBody = null;
|
|
2672
|
+
try {
|
|
2673
|
+
if (c.req.method !== "GET" && c.req.method !== "HEAD") {
|
|
2674
|
+
try {
|
|
2675
|
+
requestBody = await c.req.raw.clone().text();
|
|
2676
|
+
} catch {
|
|
2677
|
+
requestBody = null;
|
|
2678
|
+
}
|
|
2679
|
+
}
|
|
2680
|
+
const result = await fn();
|
|
2681
|
+
return respond(c, recorder, runId, started, requestBody, result.status, result.body, result.mutation, "semantic", result.stateDelta ?? null);
|
|
2682
|
+
} catch (error) {
|
|
2683
|
+
if (error instanceof TwinError) {
|
|
2684
|
+
return respond(c, recorder, runId, started, requestBody, error.status, error.toEnvelope(), error.state_mutation ?? false, error.fidelity ?? "semantic", error.state_delta ?? null);
|
|
2685
|
+
}
|
|
2686
|
+
if (error instanceof z.ZodError) {
|
|
2687
|
+
const first = error.issues[0];
|
|
2688
|
+
const envelope2 = stripeError("invalid_request_error", "parameter_invalid", first?.message ?? "Invalid request parameters.", { param: first?.path?.join(".") });
|
|
2689
|
+
return respond(c, recorder, runId, started, requestBody, envelope2.status, envelope2.body, false, "semantic", null);
|
|
2690
|
+
}
|
|
2691
|
+
if (error instanceof SyntaxError) {
|
|
2692
|
+
const envelope2 = stripeError("invalid_request_error", "invalid_json", "Could not parse request body as JSON.");
|
|
2693
|
+
return respond(c, recorder, runId, started, requestBody, envelope2.status, envelope2.body, false, "semantic", null);
|
|
2694
|
+
}
|
|
2695
|
+
const envelope = stripeError("api_error", "internal_error", error instanceof Error ? error.message : "Internal Server Error", { statusCode: 500 });
|
|
2696
|
+
return respond(c, recorder, runId, started, requestBody, envelope.status, envelope.body, false, "semantic", null);
|
|
2697
|
+
}
|
|
2698
|
+
}
|
|
2699
|
+
function respond(c, recorder, runId, started, requestBody, status, responseBody, stateMutation, fidelity = "semantic", stateDelta = null) {
|
|
2700
|
+
const reqId = requestId();
|
|
2701
|
+
setHandlerResult(c, { status, body: responseBody });
|
|
2702
|
+
const override = c.get(FAILURE_INJECTION_OVERRIDE_KEY) ?? null;
|
|
2703
|
+
const finalStatus = override ? override.status : status;
|
|
2704
|
+
const finalBody = override ? override.body : responseBody;
|
|
2705
|
+
const stepId = c.req.header("x-pome-scenario-step-id") ?? null;
|
|
2706
|
+
recorder?.record({
|
|
2707
|
+
ts: (/* @__PURE__ */ new Date()).toISOString(),
|
|
2708
|
+
run_id: runId,
|
|
2709
|
+
twin: "stripe",
|
|
2710
|
+
request_id: reqId,
|
|
2711
|
+
correlation_id: c.req.header("x-pome-correlation-id") ?? reqId,
|
|
2712
|
+
task_step_id: stepId,
|
|
2713
|
+
scenario_step_id: stepId,
|
|
2714
|
+
step_id: null,
|
|
2715
|
+
tool_call_id: null,
|
|
2716
|
+
method: c.req.method,
|
|
2717
|
+
path: new URL(c.req.url).pathname,
|
|
2718
|
+
request_body: requestBody,
|
|
2719
|
+
// F-1125 — one shared implementation with the engine's own emit(), so
|
|
2720
|
+
// "which headers get recorded" has a single answer across every site.
|
|
2721
|
+
request_headers: recordedRequestHeaders(c),
|
|
2722
|
+
// Stripe's REST routes are not declared as twin actions: no criterion asks
|
|
2723
|
+
// whether a stripe TOOL was called, and stamping a name here that no check
|
|
2724
|
+
// can bind would be an unverifiable claim. MCP dispatch still stamps its
|
|
2725
|
+
// own name through the engine.
|
|
2726
|
+
tool: null,
|
|
2727
|
+
status: finalStatus,
|
|
2728
|
+
response_body: finalBody,
|
|
2729
|
+
latency_ms: Date.now() - started,
|
|
2730
|
+
fidelity,
|
|
2731
|
+
state_mutation: stateMutation,
|
|
2732
|
+
state_delta: stateDelta,
|
|
2733
|
+
error: finalStatus >= 400 ? errorMessage(finalBody) : null
|
|
2734
|
+
});
|
|
2735
|
+
return c.json(finalBody, finalStatus);
|
|
2736
|
+
}
|
|
2737
|
+
function errorMessage(body) {
|
|
2738
|
+
if (body && typeof body === "object" && "error" in body) {
|
|
2739
|
+
const err = body.error;
|
|
2740
|
+
if (err && typeof err.message === "string")
|
|
2741
|
+
return err.message;
|
|
2742
|
+
}
|
|
2743
|
+
return "request failed";
|
|
2744
|
+
}
|
|
2745
|
+
function parseListQuery(c) {
|
|
2746
|
+
const limit = c.req.query("limit");
|
|
2747
|
+
const numericLimit = limit !== void 0 ? Number(limit) : void 0;
|
|
2748
|
+
const created2 = createdRangeFromQuery(c);
|
|
2749
|
+
return {
|
|
2750
|
+
limit: Number.isFinite(numericLimit) ? numericLimit : void 0,
|
|
2751
|
+
starting_after: c.req.query("starting_after"),
|
|
2752
|
+
ending_before: c.req.query("ending_before"),
|
|
2753
|
+
...created2
|
|
2754
|
+
};
|
|
2755
|
+
}
|
|
2756
|
+
async function readBodyForm(c) {
|
|
2757
|
+
const contentType = c.req.header("content-type") ?? "";
|
|
2758
|
+
if (contentType.includes("application/json")) {
|
|
2759
|
+
try {
|
|
2760
|
+
return await c.req.json();
|
|
2761
|
+
} catch {
|
|
2762
|
+
return {};
|
|
2763
|
+
}
|
|
2764
|
+
}
|
|
2765
|
+
if (contentType.includes("application/x-www-form-urlencoded") || contentType.includes("multipart/form-data")) {
|
|
2766
|
+
try {
|
|
2767
|
+
const form = await c.req.parseBody({ all: true });
|
|
2768
|
+
return formToObject(form);
|
|
2769
|
+
} catch {
|
|
2770
|
+
return {};
|
|
2771
|
+
}
|
|
2772
|
+
}
|
|
2773
|
+
try {
|
|
2774
|
+
return await c.req.json();
|
|
2775
|
+
} catch {
|
|
2776
|
+
try {
|
|
2777
|
+
const form = await c.req.parseBody({ all: true });
|
|
2778
|
+
return formToObject(form);
|
|
2779
|
+
} catch {
|
|
2780
|
+
return {};
|
|
2781
|
+
}
|
|
2782
|
+
}
|
|
2783
|
+
}
|
|
2784
|
+
function formToObject(form) {
|
|
2785
|
+
const out = {};
|
|
2786
|
+
for (const [rawKey, value] of Object.entries(form)) {
|
|
2787
|
+
const path = parseBracketPath(rawKey);
|
|
2788
|
+
setDeep(out, path, value);
|
|
2789
|
+
}
|
|
2790
|
+
return out;
|
|
2791
|
+
}
|
|
2792
|
+
var POLLUTION_KEYS = /* @__PURE__ */ new Set(["__proto__", "constructor", "prototype"]);
|
|
2793
|
+
function parseBracketPath(key) {
|
|
2794
|
+
const parts = [];
|
|
2795
|
+
const regex = /([^\[\]]+)|\[([^\[\]]*)\]/g;
|
|
2796
|
+
let match;
|
|
2797
|
+
while ((match = regex.exec(key)) !== null) {
|
|
2798
|
+
const piece = match[1] ?? match[2] ?? "";
|
|
2799
|
+
if (/^\d+$/.test(piece))
|
|
2800
|
+
parts.push(Number(piece));
|
|
2801
|
+
else
|
|
2802
|
+
parts.push(piece);
|
|
2803
|
+
}
|
|
2804
|
+
return parts;
|
|
2805
|
+
}
|
|
2806
|
+
function setDeep(target, path, value) {
|
|
2807
|
+
for (const key of path) {
|
|
2808
|
+
if (typeof key === "string" && POLLUTION_KEYS.has(key)) {
|
|
2809
|
+
return;
|
|
2810
|
+
}
|
|
2811
|
+
}
|
|
2812
|
+
let cursor = target;
|
|
2813
|
+
for (let i = 0; i < path.length; i++) {
|
|
2814
|
+
const key = path[i];
|
|
2815
|
+
const isLast = i === path.length - 1;
|
|
2816
|
+
if (isLast) {
|
|
2817
|
+
cursor[key] = value;
|
|
2818
|
+
} else {
|
|
2819
|
+
const nextKey = path[i + 1];
|
|
2820
|
+
if (cursor[key] === void 0) {
|
|
2821
|
+
cursor[key] = typeof nextKey === "number" ? [] : {};
|
|
2822
|
+
}
|
|
2823
|
+
cursor = cursor[key];
|
|
2824
|
+
}
|
|
2825
|
+
}
|
|
2826
|
+
}
|
|
2827
|
+
function createdRangeFromQuery(c) {
|
|
2828
|
+
const out = {};
|
|
2829
|
+
const flat = c.req.query("created");
|
|
2830
|
+
if (flat !== void 0 && /^\d+$/.test(flat)) {
|
|
2831
|
+
out.created_gte = Number(flat);
|
|
2832
|
+
out.created_lte = Number(flat);
|
|
2833
|
+
}
|
|
2834
|
+
const gt = c.req.query("created[gt]");
|
|
2835
|
+
const gte = c.req.query("created[gte]");
|
|
2836
|
+
const lt = c.req.query("created[lt]");
|
|
2837
|
+
const lte = c.req.query("created[lte]");
|
|
2838
|
+
if (gt && /^\d+$/.test(gt))
|
|
2839
|
+
out.created_gt = Number(gt);
|
|
2840
|
+
if (gte && /^\d+$/.test(gte))
|
|
2841
|
+
out.created_gte = Number(gte);
|
|
2842
|
+
if (lt && /^\d+$/.test(lt))
|
|
2843
|
+
out.created_lt = Number(lt);
|
|
2844
|
+
if (lte && /^\d+$/.test(lte))
|
|
2845
|
+
out.created_lte = Number(lte);
|
|
2846
|
+
return out;
|
|
2847
|
+
}
|
|
2848
|
+
var formBool = z.union([z.boolean(), z.enum(["true", "false"]).transform((v) => v === "true")]).optional();
|
|
2849
|
+
var createPISchema = z.object({
|
|
2850
|
+
amount: z.coerce.number().int().positive(),
|
|
2851
|
+
currency: z.string().min(1),
|
|
2852
|
+
payment_method_types: z.array(z.string()).min(1),
|
|
2853
|
+
payment_method_options: z.object({
|
|
2854
|
+
crypto: z.object({
|
|
2855
|
+
mode: z.literal("deposit"),
|
|
2856
|
+
deposit_options: z.object({
|
|
2857
|
+
networks: z.array(z.string()).min(1).optional()
|
|
2858
|
+
}).optional()
|
|
2859
|
+
})
|
|
2860
|
+
}).optional(),
|
|
2861
|
+
payment_method: z.string().optional(),
|
|
2862
|
+
customer: z.string().optional(),
|
|
2863
|
+
confirm: formBool,
|
|
2864
|
+
metadata: z.record(z.string(), z.string()).optional(),
|
|
2865
|
+
capture_method: z.string().optional(),
|
|
2866
|
+
confirmation_method: z.string().optional()
|
|
2867
|
+
});
|
|
2868
|
+
var confirmPISchema = z.object({
|
|
2869
|
+
payment_method: z.string().optional()
|
|
2870
|
+
});
|
|
2871
|
+
var updatePISchema = z.object({
|
|
2872
|
+
amount: z.coerce.number().int().optional(),
|
|
2873
|
+
metadata: z.record(z.string(), z.string().nullable()).optional(),
|
|
2874
|
+
payment_method: z.string().optional(),
|
|
2875
|
+
customer: z.string().optional()
|
|
2876
|
+
});
|
|
2877
|
+
function registerPaymentIntentRoutes(router, domain, recorder, runId) {
|
|
2878
|
+
router.post("/v1/payment_intents", (c) => handle(c, recorder, runId, async () => {
|
|
2879
|
+
const body = await readBodyForm(c);
|
|
2880
|
+
const input = createPISchema.parse(body);
|
|
2881
|
+
const { body: piBody, delta } = domain.createPaymentIntent(accountId(c), input);
|
|
2882
|
+
return created(piBody, delta);
|
|
2883
|
+
}));
|
|
2884
|
+
router.get("/v1/payment_intents/:id", (c) => handle(c, recorder, runId, () => ok(domain.retrievePaymentIntent(accountId(c), c.req.param("id")))));
|
|
2885
|
+
router.get("/v1/payment_intents", (c) => handle(c, recorder, runId, () => {
|
|
2886
|
+
const list = parseListQuery(c);
|
|
2887
|
+
return ok(domain.listPaymentIntents(accountId(c), list));
|
|
2888
|
+
}));
|
|
2889
|
+
router.post("/v1/payment_intents/:id/confirm", (c) => handle(c, recorder, runId, async () => {
|
|
2890
|
+
const input = confirmPISchema.parse(await readBodyForm(c));
|
|
2891
|
+
const { body, delta } = domain.confirmPaymentIntent(accountId(c), c.req.param("id"), input);
|
|
2892
|
+
return ok(body, true, delta);
|
|
2893
|
+
}));
|
|
2894
|
+
router.post("/v1/payment_intents/:id", (c) => handle(c, recorder, runId, async () => {
|
|
2895
|
+
const input = updatePISchema.parse(await readBodyForm(c));
|
|
2896
|
+
const { body, delta } = domain.updatePaymentIntent(accountId(c), c.req.param("id"), input);
|
|
2897
|
+
return ok(body, true, delta);
|
|
2898
|
+
}));
|
|
2899
|
+
router.post("/v1/payment_intents/:id/cancel", (c) => handle(c, recorder, runId, () => {
|
|
2900
|
+
const { body, delta } = domain.cancelPaymentIntent(accountId(c), c.req.param("id"));
|
|
2901
|
+
return ok(body, true, delta);
|
|
2902
|
+
}));
|
|
2903
|
+
router.post("/v1/test_helpers/payment_intents/:id/simulate_crypto_deposit", (c) => handle(c, recorder, runId, () => {
|
|
2904
|
+
const { body, delta } = domain.simulateCryptoDeposit(accountId(c), c.req.param("id"));
|
|
2905
|
+
return ok(body, true, delta);
|
|
2906
|
+
}));
|
|
2907
|
+
}
|
|
2908
|
+
|
|
2909
|
+
// ../packages/twin-stripe/dist/src/routes/charges.js
|
|
2910
|
+
function registerChargesRoutes(router, domain, recorder, runId) {
|
|
2911
|
+
router.get("/v1/charges/:id", (c) => handle(c, recorder, runId, () => ok(domain.retrieveCharge(accountId(c), c.req.param("id")))));
|
|
2912
|
+
router.get("/v1/charges", (c) => handle(c, recorder, runId, () => {
|
|
2913
|
+
const list = parseListQuery(c);
|
|
2914
|
+
return ok(domain.listCharges(accountId(c), {
|
|
2915
|
+
...list,
|
|
2916
|
+
payment_intent: c.req.query("payment_intent"),
|
|
2917
|
+
customer: c.req.query("customer")
|
|
2918
|
+
}));
|
|
2919
|
+
}));
|
|
2920
|
+
}
|
|
2921
|
+
|
|
2922
|
+
// ../packages/twin-stripe/dist/src/routes/balance.js
|
|
2923
|
+
function registerBalanceRoutes(router, domain, recorder, runId) {
|
|
2924
|
+
router.get("/v1/balance", (c) => handle(c, recorder, runId, () => ok(domain.retrieveBalance(accountId(c)))));
|
|
2925
|
+
router.get("/v1/balance_transactions", (c) => handle(c, recorder, runId, () => {
|
|
2926
|
+
const list = parseListQuery(c);
|
|
2927
|
+
return ok(domain.listBalanceTransactions(accountId(c), {
|
|
2928
|
+
...list,
|
|
2929
|
+
type: c.req.query("type")
|
|
2930
|
+
}));
|
|
2931
|
+
}));
|
|
2932
|
+
}
|
|
2933
|
+
|
|
2934
|
+
// ../packages/twin-stripe/dist/src/routes/events.js
|
|
2935
|
+
function registerEventsRoutes(router, domain, recorder, runId) {
|
|
2936
|
+
router.get("/v1/events/:id", (c) => handle(c, recorder, runId, () => ok(domain.retrieveEvent(accountId(c), c.req.param("id")))));
|
|
2937
|
+
router.get("/v1/events", (c) => handle(c, recorder, runId, () => {
|
|
2938
|
+
const list = parseListQuery(c);
|
|
2939
|
+
return ok(domain.listEvents(accountId(c), {
|
|
2940
|
+
...list,
|
|
2941
|
+
type: c.req.query("type")
|
|
2942
|
+
}));
|
|
2943
|
+
}));
|
|
2944
|
+
}
|
|
2945
|
+
|
|
2946
|
+
// ../packages/twin-stripe/dist/src/routes/refunds.js
|
|
2947
|
+
function registerRefundsRoutes(router, domain, recorder, runId) {
|
|
2948
|
+
router.post("/v1/refunds", (c) => handle(c, recorder, runId, async () => {
|
|
2949
|
+
const body = await readJson(c);
|
|
2950
|
+
const { body: response, delta } = domain.createRefund(accountId(c), {
|
|
2951
|
+
charge: typeof body.charge === "string" ? body.charge : "",
|
|
2952
|
+
amount: typeof body.amount === "number" ? body.amount : void 0,
|
|
2953
|
+
reason: typeof body.reason === "string" ? body.reason : null,
|
|
2954
|
+
idempotency_key: c.req.header("Idempotency-Key") ?? c.req.header("idempotency-key") ?? null
|
|
2955
|
+
});
|
|
2956
|
+
return created(response, delta);
|
|
2957
|
+
}));
|
|
2958
|
+
router.get("/v1/refunds/:id", (c) => handle(c, recorder, runId, () => ok(domain.retrieveRefund(accountId(c), c.req.param("id")))));
|
|
2959
|
+
router.get("/v1/refunds", (c) => handle(c, recorder, runId, () => {
|
|
2960
|
+
const list = parseListQuery(c);
|
|
2961
|
+
return ok(domain.listRefunds(accountId(c), {
|
|
2962
|
+
...list,
|
|
2963
|
+
charge: c.req.query("charge"),
|
|
2964
|
+
payment_intent: c.req.query("payment_intent")
|
|
2965
|
+
}));
|
|
2966
|
+
}));
|
|
2967
|
+
}
|
|
2968
|
+
async function readJson(c) {
|
|
2969
|
+
const contentType = c.req.header("content-type") ?? "";
|
|
2970
|
+
if (contentType.includes("application/x-www-form-urlencoded")) {
|
|
2971
|
+
try {
|
|
2972
|
+
const parsed = await c.req.parseBody();
|
|
2973
|
+
return coerceFormBody(parsed);
|
|
2974
|
+
} catch {
|
|
2975
|
+
return {};
|
|
2976
|
+
}
|
|
2977
|
+
}
|
|
2978
|
+
try {
|
|
2979
|
+
const body = await c.req.json();
|
|
2980
|
+
return body && typeof body === "object" ? body : {};
|
|
2981
|
+
} catch {
|
|
2982
|
+
return {};
|
|
2983
|
+
}
|
|
2984
|
+
}
|
|
2985
|
+
function coerceFormBody(form) {
|
|
2986
|
+
const out = {};
|
|
2987
|
+
for (const [k, v] of Object.entries(form)) {
|
|
2988
|
+
if (typeof v === "string" && /^-?\d+$/.test(v) && k === "amount") {
|
|
2989
|
+
out[k] = Number(v);
|
|
2990
|
+
} else {
|
|
2991
|
+
out[k] = v;
|
|
2992
|
+
}
|
|
2993
|
+
}
|
|
2994
|
+
return out;
|
|
2995
|
+
}
|
|
2996
|
+
var customerFieldsSchema = z.object({
|
|
2997
|
+
name: z.string().nullish(),
|
|
2998
|
+
email: z.string().nullish(),
|
|
2999
|
+
description: z.string().nullish(),
|
|
3000
|
+
phone: z.string().nullish(),
|
|
3001
|
+
metadata: z.record(z.string(), z.string().nullable()).optional()
|
|
3002
|
+
});
|
|
3003
|
+
function registerCustomersRoutes(router, domain, recorder, runId) {
|
|
3004
|
+
router.post("/v1/customers", (c) => handle(c, recorder, runId, async () => {
|
|
3005
|
+
const input = customerFieldsSchema.parse(await readBodyForm(c));
|
|
3006
|
+
const { body, delta } = domain.createCustomer(accountId(c), input);
|
|
3007
|
+
return created(body, delta);
|
|
3008
|
+
}));
|
|
3009
|
+
router.get("/v1/customers/:id/payment_methods", (c) => handle(c, recorder, runId, () => {
|
|
3010
|
+
const list = parseListQuery(c);
|
|
3011
|
+
return ok(domain.listCustomerPaymentMethods(accountId(c), c.req.param("id"), {
|
|
3012
|
+
...list,
|
|
3013
|
+
type: c.req.query("type")
|
|
3014
|
+
}));
|
|
3015
|
+
}));
|
|
3016
|
+
router.get("/v1/customers/:id", (c) => handle(c, recorder, runId, () => ok(domain.retrieveCustomer(accountId(c), c.req.param("id")))));
|
|
3017
|
+
router.post("/v1/customers/:id", (c) => handle(c, recorder, runId, async () => {
|
|
3018
|
+
const input = customerFieldsSchema.parse(await readBodyForm(c));
|
|
3019
|
+
const { body, delta } = domain.updateCustomer(accountId(c), c.req.param("id"), input);
|
|
3020
|
+
return ok(body, true, delta);
|
|
3021
|
+
}));
|
|
3022
|
+
router.delete("/v1/customers/:id", (c) => handle(c, recorder, runId, () => {
|
|
3023
|
+
const { body, delta } = domain.deleteCustomer(accountId(c), c.req.param("id"));
|
|
3024
|
+
return ok(body, true, delta);
|
|
3025
|
+
}));
|
|
3026
|
+
router.get("/v1/customers", (c) => handle(c, recorder, runId, () => {
|
|
3027
|
+
const list = parseListQuery(c);
|
|
3028
|
+
return ok(domain.listCustomers(accountId(c), { ...list, email: c.req.query("email") }));
|
|
3029
|
+
}));
|
|
3030
|
+
}
|
|
3031
|
+
|
|
3032
|
+
// ../packages/twin-stripe/dist/src/routes/payment-methods.js
|
|
3033
|
+
function registerPaymentMethodsRoutes(router, domain, recorder, runId) {
|
|
3034
|
+
router.post("/v1/payment_methods", (c) => handle(c, recorder, runId, async () => {
|
|
3035
|
+
const body = await readBodyForm(c);
|
|
3036
|
+
const { body: response, delta } = domain.createPaymentMethod(accountId(c), body);
|
|
3037
|
+
return created(response, delta);
|
|
3038
|
+
}));
|
|
3039
|
+
router.get("/v1/payment_methods/:id", (c) => handle(c, recorder, runId, () => ok(domain.retrievePaymentMethod(accountId(c), c.req.param("id")))));
|
|
3040
|
+
router.post("/v1/payment_methods/:id/attach", (c) => handle(c, recorder, runId, async () => {
|
|
3041
|
+
const body = await readBodyForm(c);
|
|
3042
|
+
const customer = typeof body.customer === "string" ? body.customer : "";
|
|
3043
|
+
if (!customer) {
|
|
3044
|
+
throw new TwinError("invalid_request_error", "parameter_missing", "Missing required param: customer.", { param: "customer", statusCode: 400 });
|
|
3045
|
+
}
|
|
3046
|
+
const { body: response, delta } = domain.attachPaymentMethod(accountId(c), c.req.param("id"), customer);
|
|
3047
|
+
return ok(response, true, delta);
|
|
3048
|
+
}));
|
|
3049
|
+
router.post("/v1/payment_methods/:id/detach", (c) => handle(c, recorder, runId, () => {
|
|
3050
|
+
const { body, delta } = domain.detachPaymentMethod(accountId(c), c.req.param("id"));
|
|
3051
|
+
return ok(body, true, delta);
|
|
3052
|
+
}));
|
|
3053
|
+
}
|
|
3054
|
+
var formBool2 = z.union([z.boolean(), z.enum(["true", "false"]).transform((v) => v === "true")]).optional();
|
|
3055
|
+
var metadataSchema = z.record(z.string(), z.string().nullable()).optional();
|
|
3056
|
+
var productFieldsSchema = z.object({
|
|
3057
|
+
name: z.string().min(1).optional(),
|
|
3058
|
+
description: z.string().nullish(),
|
|
3059
|
+
active: formBool2,
|
|
3060
|
+
metadata: metadataSchema
|
|
3061
|
+
});
|
|
3062
|
+
var createPriceSchema = z.object({
|
|
3063
|
+
currency: z.string().min(1).optional(),
|
|
3064
|
+
product: z.string().min(1).optional(),
|
|
3065
|
+
unit_amount: z.coerce.number().int().nonnegative().optional(),
|
|
3066
|
+
recurring: z.object({
|
|
3067
|
+
interval: z.string().min(1),
|
|
3068
|
+
interval_count: z.coerce.number().int().positive().optional()
|
|
3069
|
+
}).optional(),
|
|
3070
|
+
nickname: z.string().nullish(),
|
|
3071
|
+
lookup_key: z.string().nullish(),
|
|
3072
|
+
active: formBool2,
|
|
3073
|
+
metadata: metadataSchema
|
|
3074
|
+
});
|
|
3075
|
+
var createSubscriptionSchema = z.object({
|
|
3076
|
+
customer: z.string().min(1).optional(),
|
|
3077
|
+
items: z.array(z.object({
|
|
3078
|
+
price: z.string().min(1).optional(),
|
|
3079
|
+
quantity: z.coerce.number().int().positive().optional()
|
|
3080
|
+
})).optional(),
|
|
3081
|
+
cancel_at_period_end: formBool2,
|
|
3082
|
+
metadata: metadataSchema
|
|
3083
|
+
});
|
|
3084
|
+
var updateSubscriptionSchema = z.object({
|
|
3085
|
+
cancel_at_period_end: formBool2,
|
|
3086
|
+
metadata: metadataSchema
|
|
3087
|
+
});
|
|
3088
|
+
function registerBillingRoutes(router, domain, recorder, runId) {
|
|
3089
|
+
router.post("/v1/products", (c) => handle(c, recorder, runId, async () => {
|
|
3090
|
+
const input = productFieldsSchema.parse(await readBodyForm(c));
|
|
3091
|
+
const { body, delta } = domain.createProduct(accountId(c), input);
|
|
3092
|
+
return created(body, delta);
|
|
3093
|
+
}));
|
|
3094
|
+
router.get("/v1/products/:id", (c) => handle(c, recorder, runId, () => ok(domain.retrieveProduct(accountId(c), c.req.param("id")))));
|
|
3095
|
+
router.get("/v1/products", (c) => handle(c, recorder, runId, () => {
|
|
3096
|
+
const list = parseListQuery(c);
|
|
3097
|
+
return ok(domain.listProducts(accountId(c), { ...list, active: queryBool(c.req.query("active")) }));
|
|
3098
|
+
}));
|
|
3099
|
+
router.post("/v1/prices", (c) => handle(c, recorder, runId, async () => {
|
|
3100
|
+
const input = createPriceSchema.parse(await readBodyForm(c));
|
|
3101
|
+
const { body, delta } = domain.createPrice(accountId(c), input);
|
|
3102
|
+
return created(body, delta);
|
|
3103
|
+
}));
|
|
3104
|
+
router.get("/v1/prices/:id", (c) => handle(c, recorder, runId, () => ok(domain.retrievePrice(accountId(c), c.req.param("id")))));
|
|
3105
|
+
router.get("/v1/prices", (c) => handle(c, recorder, runId, () => {
|
|
3106
|
+
const list = parseListQuery(c);
|
|
3107
|
+
return ok(domain.listPrices(accountId(c), {
|
|
3108
|
+
...list,
|
|
3109
|
+
product: c.req.query("product"),
|
|
3110
|
+
active: queryBool(c.req.query("active"))
|
|
3111
|
+
}));
|
|
3112
|
+
}));
|
|
3113
|
+
router.post("/v1/subscriptions", (c) => handle(c, recorder, runId, async () => {
|
|
3114
|
+
const input = createSubscriptionSchema.parse(await readBodyForm(c));
|
|
3115
|
+
const { body, delta } = domain.createSubscription(accountId(c), input);
|
|
3116
|
+
return created(body, delta);
|
|
3117
|
+
}));
|
|
3118
|
+
router.get("/v1/subscriptions/:id", (c) => handle(c, recorder, runId, () => ok(domain.retrieveSubscription(accountId(c), c.req.param("id")))));
|
|
3119
|
+
router.post("/v1/subscriptions/:id", (c) => handle(c, recorder, runId, async () => {
|
|
3120
|
+
const input = updateSubscriptionSchema.parse(await readBodyForm(c));
|
|
3121
|
+
const { body, delta } = domain.updateSubscription(accountId(c), c.req.param("id"), input);
|
|
3122
|
+
return ok(body, true, delta);
|
|
3123
|
+
}));
|
|
3124
|
+
router.delete("/v1/subscriptions/:id", (c) => handle(c, recorder, runId, () => {
|
|
3125
|
+
const { body, delta } = domain.cancelSubscription(accountId(c), c.req.param("id"));
|
|
3126
|
+
return ok(body, true, delta);
|
|
3127
|
+
}));
|
|
3128
|
+
router.get("/v1/subscriptions", (c) => handle(c, recorder, runId, () => {
|
|
3129
|
+
const list = parseListQuery(c);
|
|
3130
|
+
return ok(domain.listSubscriptions(accountId(c), {
|
|
3131
|
+
...list,
|
|
3132
|
+
customer: c.req.query("customer"),
|
|
3133
|
+
status: c.req.query("status")
|
|
3134
|
+
}));
|
|
3135
|
+
}));
|
|
3136
|
+
router.get("/v1/invoices/:id", (c) => handle(c, recorder, runId, () => ok(domain.retrieveInvoice(accountId(c), c.req.param("id")))));
|
|
3137
|
+
router.get("/v1/invoices", (c) => handle(c, recorder, runId, () => ok(domain.listInvoices(accountId(c), parseListQuery(c)))));
|
|
3138
|
+
}
|
|
3139
|
+
function queryBool(value) {
|
|
3140
|
+
if (value === "true")
|
|
3141
|
+
return true;
|
|
3142
|
+
if (value === "false")
|
|
3143
|
+
return false;
|
|
3144
|
+
return void 0;
|
|
3145
|
+
}
|
|
3146
|
+
|
|
3147
|
+
// ../packages/twin-stripe/dist/src/routes/index.js
|
|
3148
|
+
function registerStripeRoutes(router, domain, recorder, runId) {
|
|
3149
|
+
registerPaymentIntentRoutes(router, domain, recorder, runId);
|
|
3150
|
+
registerChargesRoutes(router, domain, recorder, runId);
|
|
3151
|
+
registerRefundsRoutes(router, domain, recorder, runId);
|
|
3152
|
+
registerCustomersRoutes(router, domain, recorder, runId);
|
|
3153
|
+
registerPaymentMethodsRoutes(router, domain, recorder, runId);
|
|
3154
|
+
registerBillingRoutes(router, domain, recorder, runId);
|
|
3155
|
+
registerBalanceRoutes(router, domain, recorder, runId);
|
|
3156
|
+
registerEventsRoutes(router, domain, recorder, runId);
|
|
3157
|
+
router.all("/v1/*", (c) => {
|
|
3158
|
+
const envelope = unsupported();
|
|
3159
|
+
return respond(c, recorder, runId, Date.now(), null, envelope.status, envelope.body, false, "unsupported");
|
|
3160
|
+
});
|
|
3161
|
+
}
|
|
3162
|
+
var DEFAULT_SID = "default";
|
|
3163
|
+
var DEFAULT_API_KEY = "sk_test_pome_default";
|
|
3164
|
+
var PI_STATUSES = [
|
|
3165
|
+
"requires_payment_method",
|
|
3166
|
+
"requires_confirmation",
|
|
3167
|
+
"requires_action",
|
|
3168
|
+
"processing",
|
|
3169
|
+
"requires_capture",
|
|
3170
|
+
"canceled",
|
|
3171
|
+
"succeeded"
|
|
3172
|
+
];
|
|
3173
|
+
var CHARGE_STATUSES = ["pending", "succeeded", "failed"];
|
|
3174
|
+
var REFUND_STATUSES = ["succeeded", "pending", "failed", "canceled"];
|
|
3175
|
+
var BALANCE_TX_STATUSES = ["pending", "available"];
|
|
3176
|
+
var paymentIntentSeedSchema = z.object({
|
|
3177
|
+
id: z.string().min(1),
|
|
3178
|
+
account_id: z.string().min(1),
|
|
3179
|
+
amount: z.number().int(),
|
|
3180
|
+
currency: z.string().min(1),
|
|
3181
|
+
status: z.enum(PI_STATUSES),
|
|
3182
|
+
payment_method_types: z.array(z.string()).default(["crypto"]),
|
|
3183
|
+
next_action: z.unknown().nullable().optional(),
|
|
3184
|
+
latest_charge_id: z.string().nullable().optional(),
|
|
3185
|
+
capture_method: z.string().default("automatic"),
|
|
3186
|
+
confirmation_method: z.string().default("automatic"),
|
|
3187
|
+
idempotency_key: z.string().nullable().optional(),
|
|
3188
|
+
metadata: z.record(z.string(), z.string()).default({}),
|
|
3189
|
+
crypto_deposit: z.unknown().nullable().optional(),
|
|
3190
|
+
client_secret: z.string().min(1),
|
|
3191
|
+
created: z.number().int(),
|
|
3192
|
+
updated: z.number().int(),
|
|
3193
|
+
canceled_at: z.number().int().nullable().optional(),
|
|
3194
|
+
captured_at: z.number().int().nullable().optional()
|
|
3195
|
+
});
|
|
3196
|
+
var chargeSeedSchema = z.object({
|
|
3197
|
+
id: z.string().min(1),
|
|
3198
|
+
account_id: z.string().min(1),
|
|
3199
|
+
payment_intent_id: z.string().min(1),
|
|
3200
|
+
amount: z.number().int(),
|
|
3201
|
+
amount_captured: z.number().int().default(0),
|
|
3202
|
+
amount_refunded: z.number().int().default(0),
|
|
3203
|
+
status: z.enum(CHARGE_STATUSES),
|
|
3204
|
+
balance_transaction_id: z.string().nullable().optional(),
|
|
3205
|
+
captured: z.boolean().default(true),
|
|
3206
|
+
currency: z.string().min(1),
|
|
3207
|
+
created: z.number().int()
|
|
3208
|
+
});
|
|
3209
|
+
var refundSeedSchema = z.object({
|
|
3210
|
+
id: z.string().min(1),
|
|
3211
|
+
account_id: z.string().min(1),
|
|
3212
|
+
charge_id: z.string().min(1),
|
|
3213
|
+
payment_intent_id: z.string().min(1),
|
|
3214
|
+
amount: z.number().int(),
|
|
3215
|
+
currency: z.string().min(1),
|
|
3216
|
+
status: z.enum(REFUND_STATUSES),
|
|
3217
|
+
reason: z.string().nullable().optional(),
|
|
3218
|
+
balance_transaction_id: z.string().nullable().optional(),
|
|
3219
|
+
idempotency_key: z.string().nullable().optional(),
|
|
3220
|
+
created: z.number().int()
|
|
3221
|
+
});
|
|
3222
|
+
var balanceTransactionSeedSchema = z.object({
|
|
3223
|
+
id: z.string().min(1),
|
|
3224
|
+
account_id: z.string().min(1),
|
|
3225
|
+
type: z.string().min(1),
|
|
3226
|
+
amount: z.number().int(),
|
|
3227
|
+
fee: z.number().int().default(0),
|
|
3228
|
+
net: z.number().int(),
|
|
3229
|
+
currency: z.string().min(1),
|
|
3230
|
+
source_id: z.string().nullable().optional(),
|
|
3231
|
+
source_type: z.string().nullable().optional(),
|
|
3232
|
+
available_on: z.number().int(),
|
|
3233
|
+
status: z.enum(BALANCE_TX_STATUSES).default("available"),
|
|
3234
|
+
created: z.number().int()
|
|
3235
|
+
});
|
|
3236
|
+
var seedSchema = z.object({
|
|
3237
|
+
api_keys: z.array(z.object({
|
|
3238
|
+
key: z.string().min(1),
|
|
3239
|
+
sid: z.string().min(1),
|
|
3240
|
+
account_id: z.string().min(1).optional()
|
|
3241
|
+
})).default([]),
|
|
3242
|
+
failure_injection: z.array(failureInjectionRuleSchema).default([]),
|
|
3243
|
+
payment_intents: z.array(paymentIntentSeedSchema).default([]),
|
|
3244
|
+
charges: z.array(chargeSeedSchema).default([]),
|
|
3245
|
+
refunds: z.array(refundSeedSchema).default([]),
|
|
3246
|
+
balance_transactions: z.array(balanceTransactionSeedSchema).default([])
|
|
3247
|
+
});
|
|
3248
|
+
function parseSeed(input) {
|
|
3249
|
+
return seedSchema.parse(input);
|
|
3250
|
+
}
|
|
3251
|
+
function loadSeedFromEnv(env = process.env) {
|
|
3252
|
+
const raw = env.POME_SEED_JSON;
|
|
3253
|
+
if (raw === void 0 || raw === "") {
|
|
3254
|
+
return defaultSeed();
|
|
3255
|
+
}
|
|
3256
|
+
let parsed;
|
|
3257
|
+
try {
|
|
3258
|
+
parsed = JSON.parse(raw);
|
|
3259
|
+
} catch (err) {
|
|
3260
|
+
throw new Error(`POME_SEED_JSON is not valid JSON: ${err.message}`);
|
|
3261
|
+
}
|
|
3262
|
+
const unwrapped = unwrapStripeSeed(parsed);
|
|
3263
|
+
return parseSeed(unwrapped);
|
|
3264
|
+
}
|
|
3265
|
+
function unwrapStripeSeed(value) {
|
|
3266
|
+
if (value && typeof value === "object" && !Array.isArray(value)) {
|
|
3267
|
+
const stripeKey = value.stripe;
|
|
3268
|
+
if (stripeKey && typeof stripeKey === "object" && !Array.isArray(stripeKey)) {
|
|
3269
|
+
const inner = stripeKey.seed;
|
|
3270
|
+
if (inner !== void 0) {
|
|
3271
|
+
return inner;
|
|
3272
|
+
}
|
|
3273
|
+
}
|
|
3274
|
+
}
|
|
3275
|
+
return value;
|
|
3276
|
+
}
|
|
3277
|
+
function defaultSeed() {
|
|
3278
|
+
return {
|
|
3279
|
+
api_keys: [
|
|
3280
|
+
{ key: DEFAULT_API_KEY, sid: DEFAULT_SID, account_id: `acct_${DEFAULT_SID}` }
|
|
3281
|
+
],
|
|
3282
|
+
failure_injection: [],
|
|
3283
|
+
payment_intents: [],
|
|
3284
|
+
charges: [],
|
|
3285
|
+
refunds: [],
|
|
3286
|
+
balance_transactions: []
|
|
3287
|
+
};
|
|
3288
|
+
}
|
|
3289
|
+
function applySeed(db, seed, failureInjection) {
|
|
3290
|
+
ensureStripeTables(db);
|
|
3291
|
+
for (const entry of seed.api_keys ?? []) {
|
|
3292
|
+
mintApiKey(db, {
|
|
3293
|
+
sid: entry.sid,
|
|
3294
|
+
account_id: entry.account_id,
|
|
3295
|
+
key: entry.key
|
|
3296
|
+
});
|
|
3297
|
+
}
|
|
3298
|
+
for (const row of seed.payment_intents ?? []) {
|
|
3299
|
+
insertSeedPaymentIntent(db, row);
|
|
3300
|
+
}
|
|
3301
|
+
for (const row of seed.charges ?? []) {
|
|
3302
|
+
insertSeedCharge(db, row);
|
|
3303
|
+
}
|
|
3304
|
+
for (const row of seed.balance_transactions ?? []) {
|
|
3305
|
+
insertSeedBalanceTransaction(db, row);
|
|
3306
|
+
}
|
|
3307
|
+
for (const row of seed.refunds ?? []) {
|
|
3308
|
+
insertSeedRefund(db, row);
|
|
3309
|
+
}
|
|
3310
|
+
if (failureInjection) {
|
|
3311
|
+
failureInjection.setRules(seed.failure_injection ?? []);
|
|
3312
|
+
}
|
|
3313
|
+
}
|
|
3314
|
+
function insertSeedPaymentIntent(db, row) {
|
|
3315
|
+
db.prepare(`INSERT INTO payment_intents (
|
|
3316
|
+
id, account_id, amount, currency, status,
|
|
3317
|
+
payment_method_types_json, next_action_json,
|
|
3318
|
+
latest_charge_id, capture_method, confirmation_method,
|
|
3319
|
+
idempotency_key, metadata_json, crypto_deposit_json,
|
|
3320
|
+
client_secret, created, updated, canceled_at, captured_at
|
|
3321
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(row.id, row.account_id, row.amount, row.currency, row.status, JSON.stringify(row.payment_method_types), row.next_action === void 0 || row.next_action === null ? null : JSON.stringify(row.next_action), row.latest_charge_id ?? null, row.capture_method, row.confirmation_method, row.idempotency_key ?? null, JSON.stringify(row.metadata), row.crypto_deposit === void 0 || row.crypto_deposit === null ? null : JSON.stringify(row.crypto_deposit), row.client_secret, row.created, row.updated, row.canceled_at ?? null, row.captured_at ?? null);
|
|
3322
|
+
}
|
|
3323
|
+
function insertSeedCharge(db, row) {
|
|
3324
|
+
db.prepare(`INSERT INTO charges (
|
|
3325
|
+
id, account_id, payment_intent_id, amount, amount_captured, amount_refunded,
|
|
3326
|
+
status, balance_transaction_id, captured, currency, created
|
|
3327
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(row.id, row.account_id, row.payment_intent_id, row.amount, row.amount_captured, row.amount_refunded, row.status, row.balance_transaction_id ?? null, row.captured ? 1 : 0, row.currency, row.created);
|
|
3328
|
+
}
|
|
3329
|
+
function insertSeedRefund(db, row) {
|
|
3330
|
+
db.prepare(`INSERT INTO refunds (
|
|
3331
|
+
id, account_id, charge_id, payment_intent_id, amount, currency,
|
|
3332
|
+
status, reason, balance_transaction_id, idempotency_key, created
|
|
3333
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(row.id, row.account_id, row.charge_id, row.payment_intent_id, row.amount, row.currency, row.status, row.reason ?? null, row.balance_transaction_id ?? null, row.idempotency_key ?? null, row.created);
|
|
3334
|
+
}
|
|
3335
|
+
function insertSeedBalanceTransaction(db, row) {
|
|
3336
|
+
db.prepare(`INSERT INTO balance_transactions (
|
|
3337
|
+
id, account_id, type, amount, fee, net, currency, source_id, source_type,
|
|
3338
|
+
available_on, status, created
|
|
3339
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(row.id, row.account_id, row.type, row.amount, row.fee, row.net, row.currency, row.source_id ?? null, row.source_type ?? null, row.available_on, row.status, row.created);
|
|
3340
|
+
}
|
|
3341
|
+
|
|
3342
|
+
// ../packages/twin-stripe/dist/src/x402.js
|
|
3343
|
+
function parsePriceToBaseUnits(price) {
|
|
3344
|
+
const trimmed = price.trim();
|
|
3345
|
+
const match = trimmed.match(/^\$?\s*(\d+(?:\.\d+)?)\s*([A-Za-z]+)?$/);
|
|
3346
|
+
if (!match) {
|
|
3347
|
+
throw new Error(`paymentMiddleware: cannot parse price "${price}"`);
|
|
3348
|
+
}
|
|
3349
|
+
const numStr = match[1];
|
|
3350
|
+
const asset = (match[2] ?? "USDC").toUpperCase();
|
|
3351
|
+
const decimals = 6;
|
|
3352
|
+
const [whole, frac = ""] = numStr.split(".");
|
|
3353
|
+
const fracPadded = (frac + "0".repeat(decimals)).slice(0, decimals);
|
|
3354
|
+
const combined = `${whole}${fracPadded}`.replace(/^0+(?=\d)/, "");
|
|
3355
|
+
return {
|
|
3356
|
+
amount: combined === "" ? "0" : combined,
|
|
3357
|
+
asset,
|
|
3358
|
+
decimals
|
|
3359
|
+
};
|
|
3360
|
+
}
|
|
3361
|
+
var TwinFacilitatorClient = class {
|
|
3362
|
+
opts;
|
|
3363
|
+
constructor(opts) {
|
|
3364
|
+
this.opts = opts;
|
|
3365
|
+
}
|
|
3366
|
+
get fetch_() {
|
|
3367
|
+
return this.opts.fetch ?? globalThis.fetch;
|
|
3368
|
+
}
|
|
3369
|
+
url(path) {
|
|
3370
|
+
let base = this.opts.twinBaseUrl;
|
|
3371
|
+
while (base.endsWith("/")) {
|
|
3372
|
+
base = base.slice(0, -1);
|
|
3373
|
+
}
|
|
3374
|
+
return `${base}/s/${encodeURIComponent(this.opts.sid)}${path}`;
|
|
3375
|
+
}
|
|
3376
|
+
headers(extra = {}) {
|
|
3377
|
+
return {
|
|
3378
|
+
Authorization: `Bearer ${this.opts.apiKey}`,
|
|
3379
|
+
"Content-Type": "application/json",
|
|
3380
|
+
...extra
|
|
3381
|
+
};
|
|
3382
|
+
}
|
|
3383
|
+
/**
|
|
3384
|
+
* Create a crypto-mode PaymentIntent on the twin and pull the deposit
|
|
3385
|
+
* address out of `next_action.crypto_display_details.deposit_addresses.<network>.address`.
|
|
3386
|
+
*
|
|
3387
|
+
* Network parsing: `eip155:84532` → `base`. (We accept either form; v1
|
|
3388
|
+
* supports `base` only.)
|
|
3389
|
+
*/
|
|
3390
|
+
async createCryptoPaymentIntent(args) {
|
|
3391
|
+
const networkSlug = networkToSlug(args.network);
|
|
3392
|
+
const body = {
|
|
3393
|
+
amount: args.amount,
|
|
3394
|
+
currency: args.currency,
|
|
3395
|
+
payment_method_types: ["crypto"],
|
|
3396
|
+
payment_method_options: {
|
|
3397
|
+
crypto: {
|
|
3398
|
+
mode: "deposit",
|
|
3399
|
+
deposit_options: { networks: [networkSlug] }
|
|
3400
|
+
}
|
|
3401
|
+
},
|
|
3402
|
+
metadata: args.metadata ?? {}
|
|
3403
|
+
};
|
|
3404
|
+
const res = await this.fetch_(this.url("/v1/payment_intents"), {
|
|
3405
|
+
method: "POST",
|
|
3406
|
+
headers: this.headers(),
|
|
3407
|
+
body: JSON.stringify(body)
|
|
3408
|
+
});
|
|
3409
|
+
if (!res.ok) {
|
|
3410
|
+
const text = await safeReadText(res);
|
|
3411
|
+
throw new Error(`TwinFacilitatorClient.createCryptoPaymentIntent: twin returned ${res.status}: ${text}`);
|
|
3412
|
+
}
|
|
3413
|
+
const pi = await res.json();
|
|
3414
|
+
const id = String(pi.id ?? "");
|
|
3415
|
+
const status = String(pi.status ?? "");
|
|
3416
|
+
const depositAddress = extractDepositAddress(pi, networkSlug);
|
|
3417
|
+
if (!id || !depositAddress) {
|
|
3418
|
+
throw new Error(`TwinFacilitatorClient.createCryptoPaymentIntent: malformed PI from twin: ${JSON.stringify(pi).slice(0, 256)}`);
|
|
3419
|
+
}
|
|
3420
|
+
return { id, depositAddress, status };
|
|
3421
|
+
}
|
|
3422
|
+
async retrievePaymentIntent(id) {
|
|
3423
|
+
const res = await this.fetch_(this.url(`/v1/payment_intents/${encodeURIComponent(id)}`), {
|
|
3424
|
+
method: "GET",
|
|
3425
|
+
headers: this.headers()
|
|
3426
|
+
});
|
|
3427
|
+
if (!res.ok) {
|
|
3428
|
+
const text = await safeReadText(res);
|
|
3429
|
+
throw new Error(`retrievePaymentIntent ${id}: ${res.status} ${text}`);
|
|
3430
|
+
}
|
|
3431
|
+
return await res.json();
|
|
3432
|
+
}
|
|
3433
|
+
/** Settle a crypto-mode PI by calling the test helper. */
|
|
3434
|
+
async simulateCryptoDeposit(piId) {
|
|
3435
|
+
const res = await this.fetch_(this.url(`/v1/test_helpers/payment_intents/${encodeURIComponent(piId)}/simulate_crypto_deposit`), {
|
|
3436
|
+
method: "POST",
|
|
3437
|
+
headers: this.headers(),
|
|
3438
|
+
body: JSON.stringify({})
|
|
3439
|
+
});
|
|
3440
|
+
if (!res.ok) {
|
|
3441
|
+
const text = await safeReadText(res);
|
|
3442
|
+
throw new Error(`simulateCryptoDeposit ${piId}: ${res.status} ${text}`);
|
|
3443
|
+
}
|
|
3444
|
+
return await res.json();
|
|
3445
|
+
}
|
|
3446
|
+
};
|
|
3447
|
+
function networkToSlug(network) {
|
|
3448
|
+
if (/^eip155:/i.test(network))
|
|
3449
|
+
return "base";
|
|
3450
|
+
return network.toLowerCase();
|
|
3451
|
+
}
|
|
3452
|
+
function extractDepositAddress(pi, networkSlug) {
|
|
3453
|
+
const next = pi.next_action ?? null;
|
|
3454
|
+
const display = next?.crypto_display_details ?? null;
|
|
3455
|
+
const addrs = display?.deposit_addresses ?? null;
|
|
3456
|
+
if (!addrs)
|
|
3457
|
+
return void 0;
|
|
3458
|
+
const entry = addrs[networkSlug] ?? addrs["base"] ?? null;
|
|
3459
|
+
if (!entry)
|
|
3460
|
+
return void 0;
|
|
3461
|
+
return typeof entry === "string" ? entry : entry.address;
|
|
3462
|
+
}
|
|
3463
|
+
async function safeReadText(res) {
|
|
3464
|
+
try {
|
|
3465
|
+
return await res.text();
|
|
3466
|
+
} catch {
|
|
3467
|
+
return "<unreadable>";
|
|
3468
|
+
}
|
|
3469
|
+
}
|
|
3470
|
+
function decodeXPayment(header) {
|
|
3471
|
+
const json = base64decodeToString(header);
|
|
3472
|
+
const obj = JSON.parse(json);
|
|
3473
|
+
if (!obj || typeof obj !== "object") {
|
|
3474
|
+
throw new Error("X-PAYMENT: not a JSON object");
|
|
3475
|
+
}
|
|
3476
|
+
const auth = obj?.payload?.authorization;
|
|
3477
|
+
if (!auth || typeof auth.to !== "string" || typeof auth.value !== "string") {
|
|
3478
|
+
throw new Error("X-PAYMENT: missing authorization.to or authorization.value");
|
|
3479
|
+
}
|
|
3480
|
+
return obj;
|
|
3481
|
+
}
|
|
3482
|
+
function base64decodeToString(b64) {
|
|
3483
|
+
if (typeof Buffer !== "undefined") {
|
|
3484
|
+
return Buffer.from(b64, "base64").toString("utf8");
|
|
3485
|
+
}
|
|
3486
|
+
return atob(b64);
|
|
3487
|
+
}
|
|
3488
|
+
function base64encodeFromString(s) {
|
|
3489
|
+
if (typeof Buffer !== "undefined") {
|
|
3490
|
+
return Buffer.from(s, "utf8").toString("base64");
|
|
3491
|
+
}
|
|
3492
|
+
return btoa(s);
|
|
3493
|
+
}
|
|
3494
|
+
var ChallengeCache = class {
|
|
3495
|
+
ttlMs;
|
|
3496
|
+
byPayTo = /* @__PURE__ */ new Map();
|
|
3497
|
+
byPaymentHeader = /* @__PURE__ */ new Map();
|
|
3498
|
+
constructor(ttlMs) {
|
|
3499
|
+
this.ttlMs = ttlMs;
|
|
3500
|
+
}
|
|
3501
|
+
rememberChallenge(c) {
|
|
3502
|
+
this.byPayTo.set(c.payTo.toLowerCase(), c);
|
|
3503
|
+
}
|
|
3504
|
+
lookupByPayTo(payTo) {
|
|
3505
|
+
const hit = this.byPayTo.get(payTo.toLowerCase());
|
|
3506
|
+
if (!hit)
|
|
3507
|
+
return void 0;
|
|
3508
|
+
if (Date.now() - hit.createdAt > this.ttlMs) {
|
|
3509
|
+
this.byPayTo.delete(payTo.toLowerCase());
|
|
3510
|
+
return void 0;
|
|
3511
|
+
}
|
|
3512
|
+
return hit;
|
|
3513
|
+
}
|
|
3514
|
+
rememberSettled(headerB64, result) {
|
|
3515
|
+
this.byPaymentHeader.set(headerB64, { piId: result.piId, status: result.status, result: result.result });
|
|
3516
|
+
}
|
|
3517
|
+
lookupSettled(headerB64) {
|
|
3518
|
+
return this.byPaymentHeader.get(headerB64);
|
|
3519
|
+
}
|
|
3520
|
+
/** Test-only: clear in-memory state. */
|
|
3521
|
+
clear() {
|
|
3522
|
+
this.byPayTo.clear();
|
|
3523
|
+
this.byPaymentHeader.clear();
|
|
3524
|
+
}
|
|
3525
|
+
};
|
|
3526
|
+
function paymentMiddleware(routes, twinOpts) {
|
|
3527
|
+
const facilitator = new TwinFacilitatorClient(resolveStaticTwinOptions(twinOpts));
|
|
3528
|
+
const cache = new ChallengeCache(twinOpts.challengeTtlMs ?? 5 * 6e4);
|
|
3529
|
+
for (const [key, cfg] of Object.entries(routes)) {
|
|
3530
|
+
if (!/^[A-Z]+\s+\//.test(key)) {
|
|
3531
|
+
throw new Error(`paymentMiddleware: route keys must look like "GET /paid"; got "${key}"`);
|
|
3532
|
+
}
|
|
3533
|
+
if (!cfg.accepts || cfg.accepts.length === 0) {
|
|
3534
|
+
throw new Error(`paymentMiddleware: route "${key}" must declare at least one accepts entry`);
|
|
3535
|
+
}
|
|
3536
|
+
for (const a of cfg.accepts) {
|
|
3537
|
+
if (a.scheme !== "exact") {
|
|
3538
|
+
throw new Error(`paymentMiddleware: only scheme "exact" is supported in v1, got "${a.scheme}"`);
|
|
3539
|
+
}
|
|
3540
|
+
}
|
|
3541
|
+
}
|
|
3542
|
+
const handler = async (c, next) => {
|
|
3543
|
+
const method = c.req.method.toUpperCase();
|
|
3544
|
+
const url = new URL(c.req.url);
|
|
3545
|
+
const routeKey = resolveRouteKey(method, url.pathname, routes);
|
|
3546
|
+
const config = routeKey ? routes[routeKey] : void 0;
|
|
3547
|
+
if (!config || !routeKey) {
|
|
3548
|
+
return next();
|
|
3549
|
+
}
|
|
3550
|
+
const requestFacilitator = new TwinFacilitatorClient(await resolveTwinOptions(c, twinOpts));
|
|
3551
|
+
const headerB64 = c.req.header("X-PAYMENT") ?? c.req.header("x-payment");
|
|
3552
|
+
if (!headerB64) {
|
|
3553
|
+
const body = await build402Body(c, config, requestFacilitator, cache, routeKey);
|
|
3554
|
+
return c.json(body, 402);
|
|
3555
|
+
}
|
|
3556
|
+
let payload;
|
|
3557
|
+
try {
|
|
3558
|
+
payload = decodeXPayment(headerB64);
|
|
3559
|
+
} catch (err) {
|
|
3560
|
+
return c.json({
|
|
3561
|
+
x402Version: 1,
|
|
3562
|
+
error: `X-PAYMENT: malformed (${err.message})`,
|
|
3563
|
+
accepts: await buildAcceptsList(c, config, requestFacilitator, cache, routeKey)
|
|
3564
|
+
}, 402);
|
|
3565
|
+
}
|
|
3566
|
+
const seen = cache.lookupSettled(headerB64);
|
|
3567
|
+
if (seen) {
|
|
3568
|
+
return next();
|
|
3569
|
+
}
|
|
3570
|
+
const auth = payload.payload.authorization;
|
|
3571
|
+
const challenge = cache.lookupByPayTo(auth.to);
|
|
3572
|
+
if (!challenge) {
|
|
3573
|
+
return c.json({
|
|
3574
|
+
x402Version: 1,
|
|
3575
|
+
error: `X-PAYMENT.authorization.to=${auth.to} does not match any active challenge`,
|
|
3576
|
+
accepts: await buildAcceptsList(c, config, requestFacilitator, cache, routeKey)
|
|
3577
|
+
}, 402);
|
|
3578
|
+
}
|
|
3579
|
+
if (auth.value !== challenge.amount) {
|
|
3580
|
+
return c.json({
|
|
3581
|
+
x402Version: 1,
|
|
3582
|
+
error: `X-PAYMENT.authorization.value=${auth.value} does not match required ${challenge.amount}`,
|
|
3583
|
+
accepts: await buildAcceptsList(c, config, requestFacilitator, cache, routeKey)
|
|
3584
|
+
}, 402);
|
|
3585
|
+
}
|
|
3586
|
+
if (challenge.network !== payload.network) {
|
|
3587
|
+
return c.json({
|
|
3588
|
+
x402Version: 1,
|
|
3589
|
+
error: `X-PAYMENT.network=${payload.network} does not match challenge.network=${challenge.network}`,
|
|
3590
|
+
accepts: await buildAcceptsList(c, config, requestFacilitator, cache, routeKey)
|
|
3591
|
+
}, 402);
|
|
3592
|
+
}
|
|
3593
|
+
try {
|
|
3594
|
+
let pi;
|
|
3595
|
+
try {
|
|
3596
|
+
pi = await requestFacilitator.simulateCryptoDeposit(challenge.paymentIntentId);
|
|
3597
|
+
} catch (err) {
|
|
3598
|
+
pi = await requestFacilitator.retrievePaymentIntent(challenge.paymentIntentId);
|
|
3599
|
+
if (pi.status !== "succeeded") {
|
|
3600
|
+
throw err;
|
|
3601
|
+
}
|
|
3602
|
+
}
|
|
3603
|
+
if (pi.status !== "succeeded") {
|
|
3604
|
+
return c.json({
|
|
3605
|
+
x402Version: 1,
|
|
3606
|
+
error: `settlement: PI ${challenge.paymentIntentId} did not advance to succeeded (status=${pi.status})`,
|
|
3607
|
+
accepts: await buildAcceptsList(c, config, requestFacilitator, cache, routeKey, twinOpts)
|
|
3608
|
+
}, 402);
|
|
3609
|
+
}
|
|
3610
|
+
cache.rememberSettled(headerB64, {
|
|
3611
|
+
piId: challenge.paymentIntentId,
|
|
3612
|
+
status: 200,
|
|
3613
|
+
result: pi
|
|
3614
|
+
});
|
|
3615
|
+
} catch (err) {
|
|
3616
|
+
return c.json({
|
|
3617
|
+
x402Version: 1,
|
|
3618
|
+
error: `settlement: ${err.message}`,
|
|
3619
|
+
accepts: await buildAcceptsList(c, config, requestFacilitator, cache, routeKey)
|
|
3620
|
+
}, 402);
|
|
3621
|
+
}
|
|
3622
|
+
const respHeader = base64encodeFromString(JSON.stringify({
|
|
3623
|
+
success: true,
|
|
3624
|
+
transaction: challenge.paymentIntentId,
|
|
3625
|
+
network: challenge.network,
|
|
3626
|
+
payer: auth.from
|
|
3627
|
+
}));
|
|
3628
|
+
c.header("X-PAYMENT-RESPONSE", respHeader);
|
|
3629
|
+
await next();
|
|
3630
|
+
};
|
|
3631
|
+
return Object.assign(handler, {
|
|
3632
|
+
facilitator,
|
|
3633
|
+
_resetCache: () => cache.clear()
|
|
3634
|
+
});
|
|
3635
|
+
}
|
|
3636
|
+
function resolveRouteKey(method, pathname, routes) {
|
|
3637
|
+
const direct = `${method} ${pathname}`;
|
|
3638
|
+
if (routes[direct])
|
|
3639
|
+
return direct;
|
|
3640
|
+
const sessionless = pathname.replace(/^\/s\/[^/]+/, "") || "/";
|
|
3641
|
+
const stripped = `${method} ${sessionless}`;
|
|
3642
|
+
return routes[stripped] ? stripped : void 0;
|
|
3643
|
+
}
|
|
3644
|
+
function resolveStaticTwinOptions(opts) {
|
|
3645
|
+
return {
|
|
3646
|
+
...opts,
|
|
3647
|
+
apiKey: typeof opts.apiKey === "function" ? "sk_test_pome_default" : opts.apiKey,
|
|
3648
|
+
sid: typeof opts.sid === "function" ? "default" : opts.sid
|
|
3649
|
+
};
|
|
3650
|
+
}
|
|
3651
|
+
async function resolveTwinOptions(c, opts) {
|
|
3652
|
+
return {
|
|
3653
|
+
...opts,
|
|
3654
|
+
apiKey: await resolveContextValue(c, opts.apiKey),
|
|
3655
|
+
sid: await resolveContextValue(c, opts.sid)
|
|
3656
|
+
};
|
|
3657
|
+
}
|
|
3658
|
+
async function resolveContextValue(c, value) {
|
|
3659
|
+
if (typeof value === "function") {
|
|
3660
|
+
return value(c);
|
|
3661
|
+
}
|
|
3662
|
+
return value;
|
|
3663
|
+
}
|
|
3664
|
+
async function build402Body(c, config, facilitator, cache, routeKey, twinOpts) {
|
|
3665
|
+
const accepts = await buildAcceptsList(c, config, facilitator, cache, routeKey);
|
|
3666
|
+
return {
|
|
3667
|
+
x402Version: 1,
|
|
3668
|
+
accepts,
|
|
3669
|
+
error: "payment required"
|
|
3670
|
+
};
|
|
3671
|
+
}
|
|
3672
|
+
async function buildAcceptsList(c, config, facilitator, cache, routeKey, twinOpts) {
|
|
3673
|
+
const out = [];
|
|
3674
|
+
for (let i = 0; i < config.accepts.length; i++) {
|
|
3675
|
+
const a = config.accepts[i];
|
|
3676
|
+
const parsed = parsePriceToBaseUnits(a.price);
|
|
3677
|
+
const explicitPayTo = await resolveExplicitPayTo(a.payTo, c);
|
|
3678
|
+
let payTo;
|
|
3679
|
+
let piId;
|
|
3680
|
+
if (explicitPayTo) {
|
|
3681
|
+
const created2 = await facilitator.createCryptoPaymentIntent({
|
|
3682
|
+
amount: Number(parsed.amount),
|
|
3683
|
+
// PI currency is always USD per Stripe x402 docs (the on-chain leg
|
|
3684
|
+
// is USDC but Stripe captures the PI in USD). parsed.asset is the
|
|
3685
|
+
// wire asset name (USDC) and stays in the x402 accepts entry below.
|
|
3686
|
+
currency: "usd",
|
|
3687
|
+
network: a.network,
|
|
3688
|
+
metadata: { x402_route: routeKey, x402_explicit_payTo: explicitPayTo }
|
|
3689
|
+
});
|
|
3690
|
+
payTo = explicitPayTo;
|
|
3691
|
+
piId = created2.id;
|
|
3692
|
+
} else {
|
|
3693
|
+
const cached = findReusable(cache, routeKey, i, parsed.amount);
|
|
3694
|
+
if (cached) {
|
|
3695
|
+
payTo = cached.payTo;
|
|
3696
|
+
piId = cached.paymentIntentId;
|
|
3697
|
+
} else {
|
|
3698
|
+
const created2 = await facilitator.createCryptoPaymentIntent({
|
|
3699
|
+
amount: Number(parsed.amount),
|
|
3700
|
+
// PI currency is always USD per Stripe x402 docs (the on-chain leg
|
|
3701
|
+
// is USDC but Stripe captures the PI in USD). parsed.asset is the
|
|
3702
|
+
// wire asset name (USDC) and stays in the x402 accepts entry below.
|
|
3703
|
+
currency: "usd",
|
|
3704
|
+
network: a.network,
|
|
3705
|
+
metadata: { x402_route: routeKey }
|
|
3706
|
+
});
|
|
3707
|
+
payTo = created2.depositAddress;
|
|
3708
|
+
piId = created2.id;
|
|
3709
|
+
}
|
|
3710
|
+
}
|
|
3711
|
+
const entry = {
|
|
3712
|
+
scheme: "exact",
|
|
3713
|
+
network: a.network,
|
|
3714
|
+
maxAmountRequired: parsed.amount,
|
|
3715
|
+
resource: a.resource ?? c.req.url,
|
|
3716
|
+
description: a.description ?? config.description ?? "",
|
|
3717
|
+
mimeType: a.mimeType ?? config.mimeType ?? "application/json",
|
|
3718
|
+
payTo,
|
|
3719
|
+
maxTimeoutSeconds: a.maxTimeoutSeconds ?? 60,
|
|
3720
|
+
asset: a.asset ?? parsed.asset,
|
|
3721
|
+
outputSchema: null,
|
|
3722
|
+
extra: a.extra
|
|
3723
|
+
};
|
|
3724
|
+
out.push(entry);
|
|
3725
|
+
cache.rememberChallenge({
|
|
3726
|
+
routeKey,
|
|
3727
|
+
acceptsIndex: i,
|
|
3728
|
+
payTo,
|
|
3729
|
+
amount: parsed.amount,
|
|
3730
|
+
asset: entry.asset,
|
|
3731
|
+
network: a.network,
|
|
3732
|
+
paymentIntentId: piId,
|
|
3733
|
+
createdAt: Date.now()
|
|
3734
|
+
});
|
|
3735
|
+
}
|
|
3736
|
+
return out;
|
|
3737
|
+
}
|
|
3738
|
+
function findReusable(cache, routeKey, acceptsIndex, amount) {
|
|
3739
|
+
for (const c of cache.byPayTo.values()) {
|
|
3740
|
+
if (c.routeKey === routeKey && c.acceptsIndex === acceptsIndex && c.amount === amount && Date.now() - c.createdAt < cache.ttlMs) {
|
|
3741
|
+
return c;
|
|
3742
|
+
}
|
|
3743
|
+
}
|
|
3744
|
+
return void 0;
|
|
3745
|
+
}
|
|
3746
|
+
async function resolveExplicitPayTo(payTo, c) {
|
|
3747
|
+
if (!payTo)
|
|
3748
|
+
return void 0;
|
|
3749
|
+
if (typeof payTo === "string")
|
|
3750
|
+
return payTo;
|
|
3751
|
+
return await payTo(c);
|
|
3752
|
+
}
|
|
3753
|
+
|
|
3754
|
+
// ../packages/twin-stripe/dist/src/session.js
|
|
3755
|
+
function recordGatedExchange(recorder, runId) {
|
|
3756
|
+
return async (c, next) => {
|
|
3757
|
+
const started = Date.now();
|
|
3758
|
+
await next();
|
|
3759
|
+
let responseBody = null;
|
|
3760
|
+
try {
|
|
3761
|
+
responseBody = await c.res.clone().json();
|
|
3762
|
+
} catch {
|
|
3763
|
+
responseBody = null;
|
|
3764
|
+
}
|
|
3765
|
+
const status = c.res.status;
|
|
3766
|
+
recorder.record({
|
|
3767
|
+
ts: (/* @__PURE__ */ new Date()).toISOString(),
|
|
3768
|
+
run_id: runId,
|
|
3769
|
+
twin: "stripe",
|
|
3770
|
+
request_id: `req_${crypto.randomUUID()}`,
|
|
3771
|
+
correlation_id: c.req.header("x-pome-correlation-id") ?? `req_${crypto.randomUUID()}`,
|
|
3772
|
+
task_step_id: c.req.header("x-pome-scenario-step-id") ?? null,
|
|
3773
|
+
scenario_step_id: c.req.header("x-pome-scenario-step-id") ?? null,
|
|
3774
|
+
step_id: null,
|
|
3775
|
+
tool_call_id: null,
|
|
3776
|
+
method: c.req.method,
|
|
3777
|
+
path: new URL(c.req.url).pathname,
|
|
3778
|
+
request_body: null,
|
|
3779
|
+
request_headers: recordedRequestHeaders(c),
|
|
3780
|
+
// No MCP counterpart — x402 is a wire protocol, not a twin action.
|
|
3781
|
+
tool: null,
|
|
3782
|
+
status,
|
|
3783
|
+
response_body: responseBody,
|
|
3784
|
+
latency_ms: Date.now() - started,
|
|
3785
|
+
fidelity: "semantic",
|
|
3786
|
+
state_mutation: false,
|
|
3787
|
+
state_delta: null,
|
|
3788
|
+
error: status >= 400 ? x402Error(responseBody) : null
|
|
3789
|
+
});
|
|
3790
|
+
};
|
|
3791
|
+
}
|
|
3792
|
+
function x402Error(body) {
|
|
3793
|
+
if (body && typeof body === "object" && "error" in body) {
|
|
3794
|
+
const message = body.error;
|
|
3795
|
+
if (typeof message === "string")
|
|
3796
|
+
return message;
|
|
3797
|
+
}
|
|
3798
|
+
return "payment required";
|
|
3799
|
+
}
|
|
3800
|
+
function registerX402Routes(session, opts) {
|
|
3801
|
+
session.use("/x402/*", recordGatedExchange(opts.recorder, opts.runId));
|
|
3802
|
+
session.use(paymentMiddleware({
|
|
3803
|
+
"GET /x402/protected-resource": {
|
|
3804
|
+
accepts: [
|
|
3805
|
+
{
|
|
3806
|
+
scheme: "exact",
|
|
3807
|
+
price: "$0.01",
|
|
3808
|
+
network: "eip155:84532",
|
|
3809
|
+
description: "Unlock the hosted Stripe x402 protected resource"
|
|
3810
|
+
}
|
|
3811
|
+
],
|
|
3812
|
+
description: "Hosted Stripe x402 protected resource",
|
|
3813
|
+
mimeType: "application/json"
|
|
3814
|
+
}
|
|
3815
|
+
}, {
|
|
3816
|
+
twinBaseUrl: opts.twinBaseUrl,
|
|
3817
|
+
sid: (c) => {
|
|
3818
|
+
const sess = c.get("session");
|
|
3819
|
+
return sess?.sid ?? "default";
|
|
3820
|
+
},
|
|
3821
|
+
apiKey: (c) => {
|
|
3822
|
+
const header = c.req.header("authorization") ?? c.req.header("Authorization") ?? "";
|
|
3823
|
+
return header.replace(/^bearer\s+/i, "");
|
|
3824
|
+
}
|
|
3825
|
+
}));
|
|
3826
|
+
session.get("/x402/protected-resource", (c) => c.json({
|
|
3827
|
+
ok: true,
|
|
3828
|
+
resource: "stripe-x402-protected-resource",
|
|
3829
|
+
message: "Payment verified by the Stripe twin."
|
|
3830
|
+
}));
|
|
3831
|
+
}
|
|
3832
|
+
var piPMTypes = z.array(z.enum(["crypto", "card"])).length(1);
|
|
3833
|
+
var cryptoOptions = z.object({
|
|
3834
|
+
mode: z.literal("deposit"),
|
|
3835
|
+
deposit_options: z.object({
|
|
3836
|
+
networks: z.array(z.string()).min(1).optional()
|
|
3837
|
+
}).optional()
|
|
3838
|
+
});
|
|
3839
|
+
var limitShape = {
|
|
3840
|
+
limit: z.coerce.number().int().min(1).max(100).optional()
|
|
3841
|
+
};
|
|
3842
|
+
var createdRange = {
|
|
3843
|
+
created: z.union([
|
|
3844
|
+
z.coerce.number().int(),
|
|
3845
|
+
z.object({
|
|
3846
|
+
gt: z.coerce.number().int().optional(),
|
|
3847
|
+
gte: z.coerce.number().int().optional(),
|
|
3848
|
+
lt: z.coerce.number().int().optional(),
|
|
3849
|
+
lte: z.coerce.number().int().optional()
|
|
3850
|
+
})
|
|
3851
|
+
]).optional()
|
|
3852
|
+
};
|
|
3853
|
+
function flattenCreated(input) {
|
|
3854
|
+
if (input.created === void 0)
|
|
3855
|
+
return {};
|
|
3856
|
+
if (typeof input.created === "number") {
|
|
3857
|
+
return { created_gte: input.created, created_lte: input.created };
|
|
3858
|
+
}
|
|
3859
|
+
return {
|
|
3860
|
+
created_gt: input.created.gt,
|
|
3861
|
+
created_gte: input.created.gte,
|
|
3862
|
+
created_lt: input.created.lt,
|
|
3863
|
+
created_lte: input.created.lte
|
|
3864
|
+
};
|
|
3865
|
+
}
|
|
3866
|
+
var toolDefinitions = [
|
|
3867
|
+
{
|
|
3868
|
+
name: "create_payment_intent",
|
|
3869
|
+
description: "Create a PaymentIntent: crypto-deposit (the x402 entry point) or card (optionally with payment_method / customer / confirm).",
|
|
3870
|
+
schema: z.object({
|
|
3871
|
+
amount: z.coerce.number().int().positive(),
|
|
3872
|
+
currency: z.string().min(1),
|
|
3873
|
+
payment_method_types: piPMTypes,
|
|
3874
|
+
payment_method_options: z.object({
|
|
3875
|
+
crypto: cryptoOptions
|
|
3876
|
+
}).optional(),
|
|
3877
|
+
payment_method: z.string().optional(),
|
|
3878
|
+
customer: z.string().optional(),
|
|
3879
|
+
confirm: z.boolean().optional(),
|
|
3880
|
+
metadata: z.record(z.string(), z.string()).optional(),
|
|
3881
|
+
capture_method: z.string().optional(),
|
|
3882
|
+
confirmation_method: z.string().optional()
|
|
3883
|
+
})
|
|
3884
|
+
},
|
|
3885
|
+
{
|
|
3886
|
+
name: "retrieve_payment_intent",
|
|
3887
|
+
description: "Retrieve a PaymentIntent by id.",
|
|
3888
|
+
schema: z.object({ id: z.string().min(1) })
|
|
3889
|
+
},
|
|
3890
|
+
{
|
|
3891
|
+
name: "list_payment_intents",
|
|
3892
|
+
description: "List PaymentIntents with optional filters.",
|
|
3893
|
+
schema: z.object({ ...limitShape, ...createdRange })
|
|
3894
|
+
},
|
|
3895
|
+
{
|
|
3896
|
+
name: "confirm_payment_intent",
|
|
3897
|
+
description: "Confirm a PaymentIntent. Card PIs attempt the charge synchronously (magic test PMs decline); crypto-deposit PIs are idempotent here.",
|
|
3898
|
+
schema: z.object({ id: z.string().min(1), payment_method: z.string().optional() })
|
|
3899
|
+
},
|
|
3900
|
+
{
|
|
3901
|
+
name: "update_payment_intent",
|
|
3902
|
+
description: "Update a non-terminal PaymentIntent (amount, metadata, payment_method, customer). The card retry step: attach a new PM after a decline, then confirm again.",
|
|
3903
|
+
schema: z.object({
|
|
3904
|
+
id: z.string().min(1),
|
|
3905
|
+
amount: z.coerce.number().int().optional(),
|
|
3906
|
+
metadata: z.record(z.string(), z.string().nullable()).optional(),
|
|
3907
|
+
payment_method: z.string().optional(),
|
|
3908
|
+
customer: z.string().optional()
|
|
3909
|
+
})
|
|
3910
|
+
},
|
|
3911
|
+
{
|
|
3912
|
+
name: "cancel_payment_intent",
|
|
3913
|
+
description: "Cancel a PaymentIntent. Refused once succeeded.",
|
|
3914
|
+
schema: z.object({ id: z.string().min(1) })
|
|
3915
|
+
},
|
|
3916
|
+
{
|
|
3917
|
+
name: "simulate_crypto_deposit",
|
|
3918
|
+
description: "Test helper: drive a crypto-deposit PI from requires_action through processing to succeeded.",
|
|
3919
|
+
schema: z.object({ id: z.string().min(1) })
|
|
3920
|
+
},
|
|
3921
|
+
{
|
|
3922
|
+
name: "retrieve_charge",
|
|
3923
|
+
description: "Retrieve a Charge by id.",
|
|
3924
|
+
schema: z.object({ id: z.string().min(1) })
|
|
3925
|
+
},
|
|
3926
|
+
{
|
|
3927
|
+
name: "list_charges",
|
|
3928
|
+
description: "List charges with optional payment_intent / customer / created filters.",
|
|
3929
|
+
schema: z.object({
|
|
3930
|
+
...limitShape,
|
|
3931
|
+
...createdRange,
|
|
3932
|
+
payment_intent: z.string().optional(),
|
|
3933
|
+
customer: z.string().optional()
|
|
3934
|
+
})
|
|
3935
|
+
},
|
|
3936
|
+
{
|
|
3937
|
+
name: "create_refund",
|
|
3938
|
+
description: "Refund a charge, fully or partially. Stripe refuses a refund on a charge that is already fully refunded, or one that would exceed the remaining refundable amount.",
|
|
3939
|
+
schema: z.object({
|
|
3940
|
+
charge: z.string().min(1),
|
|
3941
|
+
amount: z.coerce.number().int().positive().optional(),
|
|
3942
|
+
reason: z.string().optional()
|
|
3943
|
+
})
|
|
3944
|
+
},
|
|
3945
|
+
{
|
|
3946
|
+
name: "retrieve_refund",
|
|
3947
|
+
description: "Retrieve a Refund by id.",
|
|
3948
|
+
schema: z.object({ id: z.string().min(1) })
|
|
3949
|
+
},
|
|
3950
|
+
{
|
|
3951
|
+
name: "list_refunds",
|
|
3952
|
+
description: "List refunds, optionally filtered by charge or payment_intent.",
|
|
3953
|
+
schema: z.object({
|
|
3954
|
+
...limitShape,
|
|
3955
|
+
...createdRange,
|
|
3956
|
+
charge: z.string().optional(),
|
|
3957
|
+
payment_intent: z.string().optional()
|
|
3958
|
+
})
|
|
3959
|
+
},
|
|
3960
|
+
{
|
|
3961
|
+
name: "create_customer",
|
|
3962
|
+
description: "Create a customer. All fields optional, like real Stripe.",
|
|
3963
|
+
schema: z.object({
|
|
3964
|
+
name: z.string().optional(),
|
|
3965
|
+
email: z.string().optional(),
|
|
3966
|
+
description: z.string().optional(),
|
|
3967
|
+
phone: z.string().optional(),
|
|
3968
|
+
metadata: z.record(z.string(), z.string()).optional()
|
|
3969
|
+
})
|
|
3970
|
+
},
|
|
3971
|
+
{
|
|
3972
|
+
name: "retrieve_customer",
|
|
3973
|
+
description: "Retrieve a Customer by id. Deleted customers return the {deleted: true} stub.",
|
|
3974
|
+
schema: z.object({ id: z.string().min(1) })
|
|
3975
|
+
},
|
|
3976
|
+
{
|
|
3977
|
+
name: "update_customer",
|
|
3978
|
+
description: "Update a customer's fields. Metadata merges per-key; a null or empty value unsets the key.",
|
|
3979
|
+
schema: z.object({
|
|
3980
|
+
id: z.string().min(1),
|
|
3981
|
+
name: z.string().optional(),
|
|
3982
|
+
email: z.string().optional(),
|
|
3983
|
+
description: z.string().optional(),
|
|
3984
|
+
phone: z.string().optional(),
|
|
3985
|
+
// Nullable values mirror the REST surface: null (or "") unsets the key.
|
|
3986
|
+
metadata: z.record(z.string(), z.string().nullable()).optional()
|
|
3987
|
+
})
|
|
3988
|
+
},
|
|
3989
|
+
{
|
|
3990
|
+
name: "delete_customer",
|
|
3991
|
+
description: "Delete a customer (soft delete; its payment methods are detached).",
|
|
3992
|
+
schema: z.object({ id: z.string().min(1) })
|
|
3993
|
+
},
|
|
3994
|
+
{
|
|
3995
|
+
name: "list_customers",
|
|
3996
|
+
description: "List customers with optional email / created filters.",
|
|
3997
|
+
schema: z.object({
|
|
3998
|
+
...limitShape,
|
|
3999
|
+
...createdRange,
|
|
4000
|
+
email: z.string().optional()
|
|
4001
|
+
})
|
|
4002
|
+
},
|
|
4003
|
+
{
|
|
4004
|
+
name: "list_customer_payment_methods",
|
|
4005
|
+
description: "List the payment methods attached to a customer.",
|
|
4006
|
+
schema: z.object({
|
|
4007
|
+
customer: z.string().min(1),
|
|
4008
|
+
type: z.string().optional(),
|
|
4009
|
+
...limitShape
|
|
4010
|
+
})
|
|
4011
|
+
},
|
|
4012
|
+
{
|
|
4013
|
+
name: "create_payment_method",
|
|
4014
|
+
description: "Create a card payment method from test card details (e.g. number 4242424242424242).",
|
|
4015
|
+
schema: z.object({
|
|
4016
|
+
type: z.literal("card"),
|
|
4017
|
+
card: z.object({
|
|
4018
|
+
number: z.string().min(1),
|
|
4019
|
+
exp_month: z.coerce.number().int(),
|
|
4020
|
+
exp_year: z.coerce.number().int(),
|
|
4021
|
+
cvc: z.string().optional()
|
|
4022
|
+
})
|
|
4023
|
+
})
|
|
4024
|
+
},
|
|
4025
|
+
{
|
|
4026
|
+
name: "retrieve_payment_method",
|
|
4027
|
+
description: "Retrieve a PaymentMethod by id.",
|
|
4028
|
+
schema: z.object({ id: z.string().min(1) })
|
|
4029
|
+
},
|
|
4030
|
+
{
|
|
4031
|
+
name: "attach_payment_method",
|
|
4032
|
+
description: "Attach a payment method to a customer. One customer per PM; a detached PM cannot be reattached.",
|
|
4033
|
+
schema: z.object({ id: z.string().min(1), customer: z.string().min(1) })
|
|
4034
|
+
},
|
|
4035
|
+
{
|
|
4036
|
+
name: "detach_payment_method",
|
|
4037
|
+
description: "Detach a payment method from its customer.",
|
|
4038
|
+
schema: z.object({ id: z.string().min(1) })
|
|
4039
|
+
},
|
|
4040
|
+
{
|
|
4041
|
+
name: "retrieve_balance",
|
|
4042
|
+
description: "Retrieve the current balance (available + pending per currency).",
|
|
4043
|
+
schema: z.object({}).optional()
|
|
4044
|
+
},
|
|
4045
|
+
{
|
|
4046
|
+
name: "list_balance_transactions",
|
|
4047
|
+
description: "List balance transactions (charges, refunds, fees).",
|
|
4048
|
+
schema: z.object({
|
|
4049
|
+
...limitShape,
|
|
4050
|
+
...createdRange,
|
|
4051
|
+
type: z.string().optional()
|
|
4052
|
+
})
|
|
4053
|
+
},
|
|
4054
|
+
{
|
|
4055
|
+
name: "retrieve_event",
|
|
4056
|
+
description: "Retrieve an event by id.",
|
|
4057
|
+
schema: z.object({ id: z.string().min(1) })
|
|
4058
|
+
},
|
|
4059
|
+
{
|
|
4060
|
+
name: "list_events",
|
|
4061
|
+
description: "List events. Filter by type and created.",
|
|
4062
|
+
schema: z.object({
|
|
4063
|
+
...limitShape,
|
|
4064
|
+
...createdRange,
|
|
4065
|
+
type: z.string().optional()
|
|
4066
|
+
})
|
|
4067
|
+
}
|
|
4068
|
+
];
|
|
4069
|
+
function listTools() {
|
|
4070
|
+
return toolDefinitions.map((tool) => ({
|
|
4071
|
+
name: tool.name,
|
|
4072
|
+
description: tool.description,
|
|
4073
|
+
input_schema: schemaToJson(tool.schema)
|
|
4074
|
+
}));
|
|
4075
|
+
}
|
|
4076
|
+
function isMutatingTool(name) {
|
|
4077
|
+
return [
|
|
4078
|
+
"create_payment_intent",
|
|
4079
|
+
"confirm_payment_intent",
|
|
4080
|
+
"update_payment_intent",
|
|
4081
|
+
"cancel_payment_intent",
|
|
4082
|
+
"simulate_crypto_deposit",
|
|
4083
|
+
"create_refund",
|
|
4084
|
+
"create_customer",
|
|
4085
|
+
"update_customer",
|
|
4086
|
+
"delete_customer",
|
|
4087
|
+
"create_payment_method",
|
|
4088
|
+
"attach_payment_method",
|
|
4089
|
+
"detach_payment_method"
|
|
4090
|
+
].includes(name);
|
|
4091
|
+
}
|
|
4092
|
+
function executeTool(domain, accountId2, name, input) {
|
|
4093
|
+
const definition = toolDefinitions.find((tool) => tool.name === name);
|
|
4094
|
+
if (!definition) {
|
|
4095
|
+
throw new TwinError("invalid_request_error", "tool_unknown", `No such MCP tool: '${name}'.`, { param: "tool", statusCode: 400 });
|
|
4096
|
+
}
|
|
4097
|
+
const parsed = definition.schema.parse(input ?? {});
|
|
4098
|
+
switch (name) {
|
|
4099
|
+
case "create_payment_intent":
|
|
4100
|
+
return domain.createPaymentIntent(accountId2, parsed).body;
|
|
4101
|
+
case "retrieve_payment_intent":
|
|
4102
|
+
return domain.retrievePaymentIntent(accountId2, parsed.id);
|
|
4103
|
+
case "list_payment_intents": {
|
|
4104
|
+
const flat = flattenCreated(parsed);
|
|
4105
|
+
return domain.listPaymentIntents(accountId2, { ...parsed, ...flat });
|
|
4106
|
+
}
|
|
4107
|
+
case "confirm_payment_intent":
|
|
4108
|
+
return domain.confirmPaymentIntent(accountId2, parsed.id, {
|
|
4109
|
+
payment_method: parsed.payment_method
|
|
4110
|
+
}).body;
|
|
4111
|
+
case "update_payment_intent": {
|
|
4112
|
+
const { id, ...fields } = parsed;
|
|
4113
|
+
return domain.updatePaymentIntent(accountId2, id, fields).body;
|
|
4114
|
+
}
|
|
4115
|
+
case "cancel_payment_intent":
|
|
4116
|
+
return domain.cancelPaymentIntent(accountId2, parsed.id).body;
|
|
4117
|
+
case "simulate_crypto_deposit":
|
|
4118
|
+
return domain.simulateCryptoDeposit(accountId2, parsed.id).body;
|
|
4119
|
+
case "retrieve_charge":
|
|
4120
|
+
return domain.retrieveCharge(accountId2, parsed.id);
|
|
4121
|
+
case "list_charges": {
|
|
4122
|
+
const flat = flattenCreated(parsed);
|
|
4123
|
+
return domain.listCharges(accountId2, { ...parsed, ...flat });
|
|
4124
|
+
}
|
|
4125
|
+
case "create_refund":
|
|
4126
|
+
return domain.createRefund(accountId2, parsed).body;
|
|
4127
|
+
case "retrieve_refund":
|
|
4128
|
+
return domain.retrieveRefund(accountId2, parsed.id);
|
|
4129
|
+
case "list_refunds": {
|
|
4130
|
+
const flat = flattenCreated(parsed);
|
|
4131
|
+
return domain.listRefunds(accountId2, { ...parsed, ...flat });
|
|
4132
|
+
}
|
|
4133
|
+
case "create_customer":
|
|
4134
|
+
return domain.createCustomer(accountId2, parsed).body;
|
|
4135
|
+
case "retrieve_customer":
|
|
4136
|
+
return domain.retrieveCustomer(accountId2, parsed.id);
|
|
4137
|
+
case "update_customer": {
|
|
4138
|
+
const { id, ...fields } = parsed;
|
|
4139
|
+
return domain.updateCustomer(accountId2, id, fields).body;
|
|
4140
|
+
}
|
|
4141
|
+
case "delete_customer":
|
|
4142
|
+
return domain.deleteCustomer(accountId2, parsed.id).body;
|
|
4143
|
+
case "list_customers": {
|
|
4144
|
+
const flat = flattenCreated(parsed);
|
|
4145
|
+
return domain.listCustomers(accountId2, { ...parsed, ...flat });
|
|
4146
|
+
}
|
|
4147
|
+
case "list_customer_payment_methods": {
|
|
4148
|
+
const { customer, ...rest } = parsed;
|
|
4149
|
+
return domain.listCustomerPaymentMethods(accountId2, customer, rest);
|
|
4150
|
+
}
|
|
4151
|
+
case "create_payment_method":
|
|
4152
|
+
return domain.createPaymentMethod(accountId2, parsed).body;
|
|
4153
|
+
case "retrieve_payment_method":
|
|
4154
|
+
return domain.retrievePaymentMethod(accountId2, parsed.id);
|
|
4155
|
+
case "attach_payment_method":
|
|
4156
|
+
return domain.attachPaymentMethod(accountId2, parsed.id, parsed.customer).body;
|
|
4157
|
+
case "detach_payment_method":
|
|
4158
|
+
return domain.detachPaymentMethod(accountId2, parsed.id).body;
|
|
4159
|
+
case "retrieve_balance":
|
|
4160
|
+
return domain.retrieveBalance(accountId2);
|
|
4161
|
+
case "list_balance_transactions": {
|
|
4162
|
+
const flat = flattenCreated(parsed);
|
|
4163
|
+
return domain.listBalanceTransactions(accountId2, { ...parsed, ...flat });
|
|
4164
|
+
}
|
|
4165
|
+
case "retrieve_event":
|
|
4166
|
+
return domain.retrieveEvent(accountId2, parsed.id);
|
|
4167
|
+
case "list_events": {
|
|
4168
|
+
const flat = flattenCreated(parsed);
|
|
4169
|
+
return domain.listEvents(accountId2, { ...parsed, ...flat });
|
|
4170
|
+
}
|
|
4171
|
+
}
|
|
4172
|
+
}
|
|
4173
|
+
function schemaToJson(schema) {
|
|
4174
|
+
const candidate = z.toJSONSchema;
|
|
4175
|
+
if (typeof candidate === "function") {
|
|
4176
|
+
try {
|
|
4177
|
+
return candidate(schema);
|
|
4178
|
+
} catch {
|
|
4179
|
+
return {};
|
|
4180
|
+
}
|
|
4181
|
+
}
|
|
4182
|
+
return {};
|
|
4183
|
+
}
|
|
4184
|
+
|
|
4185
|
+
// ../packages/twin-stripe/dist/src/twin.js
|
|
4186
|
+
var stripeSeedSchema = z.preprocess((value) => value === null || value === void 0 ? defaultSeed() : value, seedSchema);
|
|
4187
|
+
function tthwSeconds(startedAtMs, nowMs = Date.now) {
|
|
4188
|
+
const ms = Math.max(0, nowMs() - startedAtMs);
|
|
4189
|
+
return Number((ms / 1e3).toFixed(3));
|
|
4190
|
+
}
|
|
4191
|
+
function accountIdFrom(session) {
|
|
4192
|
+
return typeof session?.account_id === "string" ? session.account_id : "acct_default";
|
|
4193
|
+
}
|
|
4194
|
+
function zodIssues(err) {
|
|
4195
|
+
if (err instanceof ZodError)
|
|
4196
|
+
return err.issues;
|
|
4197
|
+
if (err instanceof Error && err.name === "ZodError" && Array.isArray(err.issues)) {
|
|
4198
|
+
return err.issues;
|
|
4199
|
+
}
|
|
4200
|
+
return void 0;
|
|
4201
|
+
}
|
|
4202
|
+
function stripeErrorEnvelope(err) {
|
|
4203
|
+
if (err instanceof UnknownToolError) {
|
|
4204
|
+
return stripeError("invalid_request_error", "tool_unknown", `No such MCP tool: '${err.tool}'.`, {
|
|
4205
|
+
param: "tool",
|
|
4206
|
+
statusCode: 400
|
|
4207
|
+
});
|
|
4208
|
+
}
|
|
4209
|
+
if (err instanceof TwinError) {
|
|
4210
|
+
return { status: err.status, body: err.toEnvelope() };
|
|
4211
|
+
}
|
|
4212
|
+
const issues = zodIssues(err);
|
|
4213
|
+
if (issues) {
|
|
4214
|
+
const first = issues[0];
|
|
4215
|
+
return stripeError("invalid_request_error", "parameter_invalid", first?.message ?? "Invalid request parameters.", {
|
|
4216
|
+
param: first?.path?.join(".")
|
|
4217
|
+
});
|
|
4218
|
+
}
|
|
4219
|
+
if (err instanceof SyntaxError) {
|
|
4220
|
+
return stripeError("invalid_request_error", "invalid_json", "Could not parse request body as JSON.");
|
|
4221
|
+
}
|
|
4222
|
+
return stripeError("api_error", "internal_error", err instanceof Error ? err.message : "Internal Server Error", { statusCode: 500 });
|
|
4223
|
+
}
|
|
4224
|
+
var toolListing = new Map(listTools().map((tool) => [tool.name, tool]));
|
|
4225
|
+
function createStripeTwinDefinition(opts) {
|
|
4226
|
+
const { db } = opts;
|
|
4227
|
+
const startedAtMs = opts.startedAtMs ?? Date.now();
|
|
4228
|
+
const failureInjection = createFailureInjectionStore();
|
|
4229
|
+
return defineTwin({
|
|
4230
|
+
id: "stripe",
|
|
4231
|
+
version: process.env.POME_TWIN_VERSION ?? "0.1.0",
|
|
4232
|
+
implementation: "stripe_clone",
|
|
4233
|
+
packageName: "@pome-sh/twin-stripe",
|
|
4234
|
+
fidelity: { default: "semantic" },
|
|
4235
|
+
// Pre-port: `payload === null ? defaultSeed() : parseSeed(payload)` —
|
|
4236
|
+
// an absent/unparseable seed body applies the default world.
|
|
4237
|
+
seed: z.preprocess((value) => value === null || value === void 0 ? defaultSeed() : value, stripeSeedSchema),
|
|
4238
|
+
domain: ({ db: injected, seed }) => {
|
|
4239
|
+
if (injected && injected !== db) {
|
|
4240
|
+
throw new Error("twin-stripe: the db passed to createApp/serve must be the db the definition was created with");
|
|
4241
|
+
}
|
|
4242
|
+
const domain = new StripeDomain(db);
|
|
4243
|
+
if (seed !== void 0)
|
|
4244
|
+
applySeed(db, seed, failureInjection);
|
|
4245
|
+
return domain;
|
|
4246
|
+
},
|
|
4247
|
+
// Session-wide middleware (the pre-port `session.use("*")` position):
|
|
4248
|
+
// mounted by the engine BEFORE its MCP routes, so failure injection and
|
|
4249
|
+
// idempotency cover /mcp, /mcp/call, /mcp/tools/:name exactly as the
|
|
4250
|
+
// pre-port chassis did (F-684 review pin: an Idempotency-Key'd MCP
|
|
4251
|
+
// create must replay, and injected rules on MCP paths must fire).
|
|
4252
|
+
middleware: (app, ctx) => {
|
|
4253
|
+
app.use("*", failureInjectionMiddleware(failureInjection, {
|
|
4254
|
+
recorder: ctx.recorder,
|
|
4255
|
+
runId: ctx.runId,
|
|
4256
|
+
twin: "stripe"
|
|
4257
|
+
}));
|
|
4258
|
+
app.use("*", idempotencyMiddleware(db, ctx.recorder, ctx.runId));
|
|
4259
|
+
},
|
|
4260
|
+
// Frozen pre-port body parsing on the engine-owned surfaces (F-684
|
|
4261
|
+
// review pin). Two pre-port readers existed: /admin/seed was strict
|
|
4262
|
+
// JSON with a null fallback (null → default seed via the schema
|
|
4263
|
+
// preprocess below), while the MCP dispatch surfaces used
|
|
4264
|
+
// routes/index.ts's form-or-JSON reader ({} fallback).
|
|
4265
|
+
bodyReader: async (c) => {
|
|
4266
|
+
if (new URL(c.req.url).pathname.endsWith("/admin/seed")) {
|
|
4267
|
+
try {
|
|
4268
|
+
return await c.req.json();
|
|
4269
|
+
} catch {
|
|
4270
|
+
return null;
|
|
4271
|
+
}
|
|
4272
|
+
}
|
|
4273
|
+
const contentType = c.req.header("content-type") ?? "";
|
|
4274
|
+
if (contentType.includes("application/x-www-form-urlencoded")) {
|
|
4275
|
+
try {
|
|
4276
|
+
return await c.req.parseBody();
|
|
4277
|
+
} catch {
|
|
4278
|
+
return {};
|
|
4279
|
+
}
|
|
4280
|
+
}
|
|
4281
|
+
try {
|
|
4282
|
+
return await c.req.json();
|
|
4283
|
+
} catch {
|
|
4284
|
+
return {};
|
|
4285
|
+
}
|
|
4286
|
+
},
|
|
4287
|
+
routes: (app, ctx) => {
|
|
4288
|
+
opts.extendRoutes?.(app, ctx);
|
|
4289
|
+
registerStripeRoutes(app, ctx.domain, ctx.recorder, ctx.runId);
|
|
4290
|
+
if (opts.twinBaseUrl) {
|
|
4291
|
+
registerX402Routes(app, {
|
|
4292
|
+
twinBaseUrl: opts.twinBaseUrl,
|
|
4293
|
+
recorder: ctx.recorder,
|
|
4294
|
+
runId: ctx.runId
|
|
4295
|
+
});
|
|
4296
|
+
}
|
|
4297
|
+
},
|
|
4298
|
+
// Account-scoped state export (F1): two sessions sharing a DB see
|
|
4299
|
+
// disjoint `/_pome/state` views.
|
|
4300
|
+
state: ({ domain, session }) => session ? domain.exportState(accountIdFrom(session)) : { payment_intents: [], charges: [], balance_transactions: [], events: [] },
|
|
4301
|
+
admin: {
|
|
4302
|
+
reset: () => {
|
|
4303
|
+
resetDatabase(db);
|
|
4304
|
+
applySeed(db, defaultSeed(), failureInjection);
|
|
4305
|
+
return { ok: true, message: "Stripe twin state reset to default seed." };
|
|
4306
|
+
},
|
|
4307
|
+
seed: ({ seed }) => {
|
|
4308
|
+
resetDatabase(db);
|
|
4309
|
+
applySeed(db, seed, failureInjection);
|
|
4310
|
+
return {
|
|
4311
|
+
ok: true,
|
|
4312
|
+
api_keys: (seed.api_keys ?? []).length,
|
|
4313
|
+
failure_injection: (seed.failure_injection ?? []).length
|
|
4314
|
+
};
|
|
4315
|
+
},
|
|
4316
|
+
// Frozen tape shape: stripe's pre-port recorder never saw admin
|
|
4317
|
+
// traffic — /admin/reset|seed emit no events (F-684 review pin).
|
|
4318
|
+
recorded: false,
|
|
4319
|
+
// Frozen stripe admin-gate 403 body.
|
|
4320
|
+
forbidden: () => forbidden("Forbidden")
|
|
4321
|
+
},
|
|
4322
|
+
tools: toolDefinitions.map((def) => ({
|
|
4323
|
+
name: def.name,
|
|
4324
|
+
description: def.description,
|
|
4325
|
+
schema: def.schema,
|
|
4326
|
+
mutation: isMutatingTool(def.name),
|
|
4327
|
+
inputSchema: toolListing.get(def.name)?.input_schema,
|
|
4328
|
+
handler: (domain, args, ctx) => executeTool(domain, accountIdFrom(ctx.session), def.name, args)
|
|
4329
|
+
})),
|
|
4330
|
+
// Frozen healthz extras: fidelity + tthw_seconds on top of the contract
|
|
4331
|
+
// core {ok, twin, implementation, tools, runtime}.
|
|
4332
|
+
healthz: () => ({ fidelity: "semantic", tthw_seconds: tthwSeconds(startedAtMs) }),
|
|
4333
|
+
// Frozen per-session health shape: implementation/fidelity/tthw/runtime
|
|
4334
|
+
// plus recorder counters (bounded store: real dropped count, D-ENG-10).
|
|
4335
|
+
pomeHealth: ({ recorder }) => ({
|
|
4336
|
+
implementation: "stripe_clone",
|
|
4337
|
+
fidelity: "semantic",
|
|
4338
|
+
tthw_seconds: tthwSeconds(startedAtMs),
|
|
4339
|
+
runtime: twinBuildInfo("@pome-sh/twin-stripe"),
|
|
4340
|
+
recorder: { events: recorder.count(), dropped: recorder.dropped() }
|
|
4341
|
+
}),
|
|
4342
|
+
// Frozen per-twin difference: stripe has NO per-session /healthz (501).
|
|
4343
|
+
sessionHealthz: false,
|
|
4344
|
+
// F3 SDK-compat root mount: stripe-node/stripe-python URLs (/v1/*) hit
|
|
4345
|
+
// the same session router; the bearer alone resolves the sid.
|
|
4346
|
+
mountSessionAtRoot: true,
|
|
4347
|
+
unsupported: () => unsupported(),
|
|
4348
|
+
errorEnvelope: stripeErrorEnvelope,
|
|
4349
|
+
auth: {
|
|
4350
|
+
// F-712 pins: liberal bearer parsing ON (raw token + case-insensitive
|
|
4351
|
+
// "bearer"); sid mismatch → 403; api_keys table lookup ahead of
|
|
4352
|
+
// provider-shaped verify + JWT; no path sid required (root mount);
|
|
4353
|
+
// expired-vs-invalid classified by the engine and rendered through
|
|
4354
|
+
// the frozen unauthorized envelope.
|
|
4355
|
+
providerToken: { provider: "stripe", prefixes: ["sk_test_pome_"] },
|
|
4356
|
+
providerSession: (sid) => ({ account_id: `acct_${sid}`, via: "api_key" }),
|
|
4357
|
+
allowRawBearer: true,
|
|
4358
|
+
requirePathSid: false,
|
|
4359
|
+
resolveCredential: (token) => {
|
|
4360
|
+
if (!looksLikeApiKey(token))
|
|
4361
|
+
return void 0;
|
|
4362
|
+
const row = resolveSidFromKey(db, token);
|
|
4363
|
+
return row ? { sid: row.sid, account_id: row.account_id, via: "api_key" } : void 0;
|
|
4364
|
+
},
|
|
4365
|
+
unauthorized: (kind, info) => {
|
|
4366
|
+
const message = kind === "expired" ? "Token expired" : info?.token && looksLikeApiKey(info.token) ? "Invalid API Key provided." : "Bad credentials";
|
|
4367
|
+
const envelope = unauthorized(message);
|
|
4368
|
+
return { status: envelope.status, body: envelope.body };
|
|
4369
|
+
},
|
|
4370
|
+
sidMismatch: () => {
|
|
4371
|
+
const envelope = forbidden("Session id mismatch.");
|
|
4372
|
+
return { status: envelope.status, body: envelope.body };
|
|
4373
|
+
},
|
|
4374
|
+
sessionExtras: (claims) => ({
|
|
4375
|
+
account_id: typeof claims.account_id === "string" ? claims.account_id : `acct_${claims.sid}`,
|
|
4376
|
+
via: "jwt"
|
|
4377
|
+
})
|
|
4378
|
+
}
|
|
4379
|
+
});
|
|
4380
|
+
}
|
|
4381
|
+
function createTwinStripeApp(opts = {}) {
|
|
4382
|
+
const db = opts.db ?? openTwinStripeDatabase(":memory:");
|
|
4383
|
+
const definition = createStripeTwinDefinition({
|
|
4384
|
+
db,
|
|
4385
|
+
twinBaseUrl: opts.twinBaseUrl,
|
|
4386
|
+
startedAtMs: opts.startedAtMs,
|
|
4387
|
+
extendRoutes: opts.extendRoutes
|
|
4388
|
+
});
|
|
4389
|
+
const seed = opts.noSeed ? void 0 : opts.seed ?? (opts.db ? void 0 : defaultSeed());
|
|
4390
|
+
return createApp(definition, {
|
|
4391
|
+
db,
|
|
4392
|
+
recorder: opts.recorder,
|
|
4393
|
+
runId: opts.runId ?? "local",
|
|
4394
|
+
seed
|
|
4395
|
+
});
|
|
4396
|
+
}
|
|
4397
|
+
|
|
4398
|
+
export { DEFAULT_API_KEY, DEFAULT_SID, StripeDomain, applySeed, createStripeTwinDefinition, createTwinStripeApp, defaultSeed, executeTool, isMutatingTool, listTools, loadSeedFromEnv, migrate, mintApiKey, openTwinStripeDatabase, parseSeed, paymentMiddleware, registerStripeRoutes, registerX402Routes, resetDatabase, resolveSidFromKey, revokeApiKey, seedSchema, toolDefinitions, tthwSeconds };
|