From debf9efe96ef797bcc1a8142b1e5ca87dbf2fef4 Mon Sep 17 00:00:00 2001 From: Khaliq Date: Mon, 21 Sep 2026 07:59:08 -0700 Subject: [PATCH 1/4] feat(surface): give the gitlab helper its issue and merge-request surface MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit f.gitlab could only post: its writeback catalog was comments + discussions against GitHub's eight, so a GitLab-sourced factory could not list issues, read an issue, or open a merge request through the helper and authors fell back to glab. The helper is generated from WRITEBACK_PATH_CATALOG in @relayfile/adapter-core, reached through the relay-helpers pin here — so the catalog was the missing piece, not the helper. relayfile-adapters#282 added the GitLab writeback resources and relay-helpers 0.4.12 is the first release that depends on a core carrying them (npm could never resolve the old ^0.5.x range to 0.6.x). Bumping the pin to 0.4.12 and regenerating gives, verified against the built surface: f.gitlab.issues read/list/write/path f.gitlab.merge-requests read/list/write/path f.gitlab.refs read/list/write/path f.gitlab.merge read/list/write/path f.gitlab.close-merge-request read/list/write/path No GitLab method is hand-written; helpers/gitlab.ts is byte-identical, since a provider's resources come from the type of its client rather than from enumerated code. ramp.ts and clients.ts change because 0.4.12 exports a real rampClient, so the generator drops the generic providerClient fallback. Also adds workflows/gitlab-surface-parity.flow.ts, which performs this bump end to end (probe the registry for a relay-helpers whose transitive catalog really carries the resources, bump, regenerate, assert the built surface, update docs, open a PR) so the next catalog bump does not need a human. Co-Authored-By: Claude Opus 5 (1M context) --- packages/surface/package-lock.json | 226 ++++++++++++++---------- packages/surface/package.json | 2 +- packages/surface/src/helpers/clients.ts | 2 +- packages/surface/src/helpers/ramp.ts | 4 +- workflows/gitlab-surface-parity.flow.ts | 219 +++++++++++++++++++++++ 5 files changed, 359 insertions(+), 94 deletions(-) create mode 100644 workflows/gitlab-surface-parity.flow.ts diff --git a/packages/surface/package-lock.json b/packages/surface/package-lock.json index 3a27ec136..dcd3152ea 100644 --- a/packages/surface/package-lock.json +++ b/packages/surface/package-lock.json @@ -20,7 +20,7 @@ "node": ">=20.19.0 || >=22.12.0" }, "peerDependencies": { - "@relayfile/relay-helpers": "0.4.11" + "@relayfile/relay-helpers": "0.4.12" } }, "node_modules/@esbuild/aix-ppc64": { @@ -494,9 +494,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -507,9 +504,9 @@ } }, "node_modules/@relayfile/adapter-core": { - "version": "0.5.24", - "resolved": "https://registry.npmjs.org/@relayfile/adapter-core/-/adapter-core-0.5.24.tgz", - "integrity": "sha512-bOQRuBoAw2RlYs30RtKsOvXlXzcRx4owhHdj384hPrznBIY3U4ZYcb4pVfzreW9TStHEiX7EguUyqhD9g8DJmA==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@relayfile/adapter-core/-/adapter-core-0.6.2.tgz", + "integrity": "sha512-fVBwiK1W0af4wQ4w/Jr7GA1VBH1qz9Qw1lm90MrOJN0zQfVq1YRwRu9fPk4rp50TQDveLBKE0+MoaLMUmqr5Jg==", "license": "Apache-2.0", "peer": true, "dependencies": { @@ -529,13 +526,13 @@ } }, "node_modules/@relayfile/adapter-linear": { - "version": "0.4.12", - "resolved": "https://registry.npmjs.org/@relayfile/adapter-linear/-/adapter-linear-0.4.12.tgz", - "integrity": "sha512-obICrTmIkVKXX0vAjGiezOK/cu3iUH6i67fuKLe7Fqcp/Upwrsr70Ap68YxyMvpNOvE4TdbbM1vU+2uGXwM5sg==", + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/@relayfile/adapter-linear/-/adapter-linear-0.4.13.tgz", + "integrity": "sha512-cJtjrmhK2dV5o7QD61N2vuvl4XnMGjrcWX5zrM9otneVVA983GHRKdHv014Hq7QSIpG5FMSuLGPziYn6vFJI+A==", "license": "Apache-2.0", "peer": true, "dependencies": { - "@relayfile/adapter-core": "^0.5.18" + "@relayfile/adapter-core": "^0.6.1" }, "engines": { "node": ">=18" @@ -545,13 +542,13 @@ } }, "node_modules/@relayfile/adapter-reddit": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/@relayfile/adapter-reddit/-/adapter-reddit-0.2.9.tgz", - "integrity": "sha512-/ZWkr4SguRRCk4fY6DEtP5NVUHSMWP66GtMou4NJOcf5PaxYSa0ceSVxAN/IcTBG6JqdtbqB4IoWn8V9d/JC3g==", + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@relayfile/adapter-reddit/-/adapter-reddit-0.2.10.tgz", + "integrity": "sha512-FBGpWqJgOAC7nSE3SUAPil+pYxpBne1higJmSqGIrycbiIvBPxbluUsTb5Ct7XSyvDB3QmMbOMog5CDaVLhnKQ==", "license": "Apache-2.0", "peer": true, "dependencies": { - "@relayfile/adapter-core": "^0.5.15" + "@relayfile/adapter-core": "^0.6.1" }, "engines": { "node": ">=18" @@ -560,10 +557,94 @@ "@relayfile/sdk": ">=0.6.0 <1" } }, + "node_modules/@relayfile/cli-darwin-arm64": { + "version": "0.10.69", + "resolved": "https://registry.npmjs.org/@relayfile/cli-darwin-arm64/-/cli-darwin-arm64-0.10.69.tgz", + "integrity": "sha512-zJpbOfz4Iq2273TkQHvzOmQ06tA2jga6Pxa0WSYBHTfxMwWE7tk9gGwPrtU4ppOiyON6jvQuTQ3byBhwOwlLsQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "peer": true + }, + "node_modules/@relayfile/cli-darwin-x64": { + "version": "0.10.69", + "resolved": "https://registry.npmjs.org/@relayfile/cli-darwin-x64/-/cli-darwin-x64-0.10.69.tgz", + "integrity": "sha512-Tda09y7GP3cP8EsKYO0UJLoPOxQVYjrKGPcjF8Z/scWhpyU7cRTnMng9KsqnEDXZIVP/k8yiuku2PaylJjX0GA==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "peer": true + }, + "node_modules/@relayfile/cli-linux-arm64": { + "version": "0.10.69", + "resolved": "https://registry.npmjs.org/@relayfile/cli-linux-arm64/-/cli-linux-arm64-0.10.69.tgz", + "integrity": "sha512-5wZYIm55xkhf4UWBj7I/Evl7QU5/dYHsIEZEc/+QU70PTSGzMUKHjO66FcCyS0K5lSRJ6dngRP666kvl2G7vmQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@relayfile/cli-linux-x64": { + "version": "0.10.69", + "resolved": "https://registry.npmjs.org/@relayfile/cli-linux-x64/-/cli-linux-x64-0.10.69.tgz", + "integrity": "sha512-BgnmP4He93T+Hr2McVQoPxprmdEM4D7kHev5Xziyrjapd1juTZwe0lBkpa8ngn8wyoDk/pVui04s6llGeAU3cw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@relayfile/cli-win32-arm64": { + "version": "0.10.69", + "resolved": "https://registry.npmjs.org/@relayfile/cli-win32-arm64/-/cli-win32-arm64-0.10.69.tgz", + "integrity": "sha512-KITNWpQaHBX7iBA1TgOHdO2xMtSY+LH4UkafzXztfVjTKwOjM4nCgLXfS59Z70l94ae7UowvBjgG9psuiAyJoQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "peer": true + }, + "node_modules/@relayfile/cli-win32-x64": { + "version": "0.10.69", + "resolved": "https://registry.npmjs.org/@relayfile/cli-win32-x64/-/cli-win32-x64-0.10.69.tgz", + "integrity": "sha512-wpogN9nsnw2boMGOhuHyS9SV13Y3QzikE0hTYculUIdxN0tPZDsWgNj2IsN8s/E6edA+TfQ+uUpbExadM/Y/LA==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "peer": true + }, "node_modules/@relayfile/core": { - "version": "0.10.57", - "resolved": "https://registry.npmjs.org/@relayfile/core/-/core-0.10.57.tgz", - "integrity": "sha512-oKwNJKGovzdl/6IF3sSVZFsiG2ITH7jXnmFgxbCIYPZ+J7QsQ2zvBhT35sPGiNcD4FfiMpyX9OB8LJXOefNdcQ==", + "version": "0.10.69", + "resolved": "https://registry.npmjs.org/@relayfile/core/-/core-0.10.69.tgz", + "integrity": "sha512-ZN2UrobsvOOcLkI7mZ3HFW0VK1YWwaxL3q8T1pIPj6hRzufQCnaWwXtk7XVpIFRGerdUSrWbnYJZXfg/jgBtzA==", "license": "Apache-2.0", "peer": true, "engines": { @@ -571,9 +652,9 @@ } }, "node_modules/@relayfile/mount-darwin-arm64": { - "version": "0.10.57", - "resolved": "https://registry.npmjs.org/@relayfile/mount-darwin-arm64/-/mount-darwin-arm64-0.10.57.tgz", - "integrity": "sha512-yCcjQ7HoCJECnjtZeG7eZwLXa4RAT3RAVAAymdIqKZbMe3wbkF1kg3YNQHuRqYsDEIQzGkA4k5AsITmG1j2PfQ==", + "version": "0.10.69", + "resolved": "https://registry.npmjs.org/@relayfile/mount-darwin-arm64/-/mount-darwin-arm64-0.10.69.tgz", + "integrity": "sha512-IyZqcC+bKyP8yIfTbUAOvbtDp7JPcYCypMtv+CS+hew6TX7C6/wr+gUAn4Er3zELIjW3Ktjzi86O8c8TUoX7sQ==", "cpu": [ "arm64" ], @@ -585,9 +666,9 @@ "peer": true }, "node_modules/@relayfile/mount-darwin-x64": { - "version": "0.10.57", - "resolved": "https://registry.npmjs.org/@relayfile/mount-darwin-x64/-/mount-darwin-x64-0.10.57.tgz", - "integrity": "sha512-5Ze1a16Mxc2PTj2Q+AdtRZIMKQ4sxJIIXwPjdWD+9rTMEQeqs7xzSZ1WRIjI89FzyNHBjx/+gzD9FK8Kjuc7Yg==", + "version": "0.10.69", + "resolved": "https://registry.npmjs.org/@relayfile/mount-darwin-x64/-/mount-darwin-x64-0.10.69.tgz", + "integrity": "sha512-S6nFPo7lRRo0HFagqZtqa7QRVSiFxGbGl0fEs+1TVRWlQt5ibvbpPMpcE7zOd7z4I/g4EOw+pmOcHmXXkjPNSA==", "cpu": [ "x64" ], @@ -599,9 +680,9 @@ "peer": true }, "node_modules/@relayfile/mount-linux-arm64": { - "version": "0.10.57", - "resolved": "https://registry.npmjs.org/@relayfile/mount-linux-arm64/-/mount-linux-arm64-0.10.57.tgz", - "integrity": "sha512-+2MhcDwzb7KSC3qjKWOW+9EnZ8mFKJiVns5fiJwO1oThiAd3CnnCfJzYkbEWRKIL0dH5wg4npdayF23DiBtB5w==", + "version": "0.10.69", + "resolved": "https://registry.npmjs.org/@relayfile/mount-linux-arm64/-/mount-linux-arm64-0.10.69.tgz", + "integrity": "sha512-bhbHhwcd+wvpoz5mxqAF6h/74phb1mcxMzIDacAiuSQ9ymXxcc9IGd3nvFSr+h0wsyKfZN8tGppBN/Ez1h/ZLA==", "cpu": [ "arm64" ], @@ -613,9 +694,9 @@ "peer": true }, "node_modules/@relayfile/mount-linux-x64": { - "version": "0.10.57", - "resolved": "https://registry.npmjs.org/@relayfile/mount-linux-x64/-/mount-linux-x64-0.10.57.tgz", - "integrity": "sha512-Y0OGuGEpglQsUrrR0uzjBzqFyrM8wU5jG1tELJ8LBNhedNUEUupGKD7ixs+i4k9kR8Q68voVsQTfzdgqzW3M+Q==", + "version": "0.10.69", + "resolved": "https://registry.npmjs.org/@relayfile/mount-linux-x64/-/mount-linux-x64-0.10.69.tgz", + "integrity": "sha512-aTy6ZiYgF+8SuSF9hGDgJU/z9K6rh+UUAl6Emp/valiw3FmM0fLOt2rAt1/KyXtuhgJE09/XoPRYBLa8UyIeUg==", "cpu": [ "x64" ], @@ -627,25 +708,25 @@ "peer": true }, "node_modules/@relayfile/relay-helpers": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/@relayfile/relay-helpers/-/relay-helpers-0.4.11.tgz", - "integrity": "sha512-J9S2L+dVRQcxv32BxMq+xEqpBJoG1mNzo1E/CCXY4LYUSl0euZD0ZayaFMcpBhGqx+2IDNiSlGjFun/YQk9OqA==", + "version": "0.4.12", + "resolved": "https://registry.npmjs.org/@relayfile/relay-helpers/-/relay-helpers-0.4.12.tgz", + "integrity": "sha512-Izjl33HLCjxDFVZHK/+f+e/73IUiEg534QNBJGkRYZXjH6LvPKfGiPXViiY5zYLxFtgnzNQa+/TI6MB4X3BnEQ==", "license": "Apache-2.0", "peer": true, "dependencies": { - "@relayfile/adapter-core": "^0.5.15", - "@relayfile/adapter-linear": "^0.4.11", - "@relayfile/adapter-reddit": "^0.2.9" + "@relayfile/adapter-core": "^0.6.1", + "@relayfile/adapter-linear": "^0.4.13", + "@relayfile/adapter-reddit": "^0.2.10" } }, "node_modules/@relayfile/sdk": { - "version": "0.10.57", - "resolved": "https://registry.npmjs.org/@relayfile/sdk/-/sdk-0.10.57.tgz", - "integrity": "sha512-9AJIEyyruqVogbdqVfY7q0pjuXJy8IhzxR/1pvwWJiybU1BZO8LFNurlFePTAo/uhLG9cshr0YJRBxv2WbG0Sg==", + "version": "0.10.69", + "resolved": "https://registry.npmjs.org/@relayfile/sdk/-/sdk-0.10.69.tgz", + "integrity": "sha512-yKImAt0XrR7lqJTaWXCv4NlCyZe1YFxh1qEBKoKCPYhEiF31Rrbarq+PZlQybg4r2Kbiff4XtSERMy31iHvoSw==", "license": "Apache-2.0", "peer": true, "dependencies": { - "@relayfile/core": "0.10.57", + "@relayfile/core": "0.10.69", "ignore": "^7.0.5", "tar": "^7.5.10" }, @@ -653,10 +734,16 @@ "node": ">=18" }, "optionalDependencies": { - "@relayfile/mount-darwin-arm64": "0.10.57", - "@relayfile/mount-darwin-x64": "0.10.57", - "@relayfile/mount-linux-arm64": "0.10.57", - "@relayfile/mount-linux-x64": "0.10.57" + "@relayfile/cli-darwin-arm64": "0.10.69", + "@relayfile/cli-darwin-x64": "0.10.69", + "@relayfile/cli-linux-arm64": "0.10.69", + "@relayfile/cli-linux-x64": "0.10.69", + "@relayfile/cli-win32-arm64": "0.10.69", + "@relayfile/cli-win32-x64": "0.10.69", + "@relayfile/mount-darwin-arm64": "0.10.69", + "@relayfile/mount-darwin-x64": "0.10.69", + "@relayfile/mount-linux-arm64": "0.10.69", + "@relayfile/mount-linux-x64": "0.10.69" } }, "node_modules/@rollup/rollup-android-arm-eabi": { @@ -751,9 +838,6 @@ "arm" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -768,9 +852,6 @@ "arm" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -785,9 +866,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -802,9 +880,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -819,9 +894,6 @@ "loong64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -836,9 +908,6 @@ "loong64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -853,9 +922,6 @@ "ppc64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -870,9 +936,6 @@ "ppc64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -887,9 +950,6 @@ "riscv64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -904,9 +964,6 @@ "riscv64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -921,9 +978,6 @@ "s390x" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -938,9 +992,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -955,9 +1006,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -1340,9 +1388,9 @@ "peer": true }, "node_modules/brace-expansion": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", - "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz", + "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==", "license": "MIT", "peer": true, "dependencies": { @@ -3319,9 +3367,9 @@ } }, "node_modules/yaml": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", - "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.1.tgz", + "integrity": "sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==", "license": "ISC", "peer": true, "bin": { diff --git a/packages/surface/package.json b/packages/surface/package.json index f81a833b7..92ada43fe 100644 --- a/packages/surface/package.json +++ b/packages/surface/package.json @@ -56,7 +56,7 @@ "directory": "packages/surface" }, "peerDependencies": { - "@relayfile/relay-helpers": "0.4.11" + "@relayfile/relay-helpers": "0.4.12" }, "dependencies": { "ai-hist": "0.4.1" diff --git a/packages/surface/src/helpers/clients.ts b/packages/surface/src/helpers/clients.ts index f74167f7a..0f05e3a47 100644 --- a/packages/surface/src/helpers/clients.ts +++ b/packages/surface/src/helpers/clients.ts @@ -32,7 +32,7 @@ export const helperClients: Readonly> = { "onedrive": upstream.onedriveClient, "pipedrive": upstream.pipedriveClient, "postgres": upstream.postgresClient, - "ramp": (options) => upstream.providerClient("ramp", options), + "ramp": upstream.rampClient, "recall": upstream.recallClient, "reddit": upstream.redditClient, "redis": upstream.redisClient, diff --git a/packages/surface/src/helpers/ramp.ts b/packages/surface/src/helpers/ramp.ts index 9c42a021e..ba5c36737 100644 --- a/packages/surface/src/helpers/ramp.ts +++ b/packages/surface/src/helpers/ramp.ts @@ -1,9 +1,7 @@ // GENERATED by scripts/generate-helpers.mjs — do not edit. // Run `npm run gen --prefix packages/surface` from the repository root. -import { providerClient } from "@relayfile/relay-helpers"; -import type { RelayClientOptions } from "@relayfile/relay-helpers/transport"; -const rampClient = (options: RelayClientOptions) => providerClient("ramp", options); +import { rampClient } from "@relayfile/relay-helpers"; import { bindHelper, type EffectDispatcher, type JournalHelper } from "../effect-transport.js"; export type RampHelper = JournalHelper>; diff --git a/workflows/gitlab-surface-parity.flow.ts b/workflows/gitlab-surface-parity.flow.ts new file mode 100644 index 000000000..78e71e2a3 --- /dev/null +++ b/workflows/gitlab-surface-parity.flow.ts @@ -0,0 +1,219 @@ +// gitlab-surface-parity — close the `f.gitlab` read/list gap, a v2 relayflow. +// +// THE GAP. `Ctx` exposes a first-class `f.gitlab` helper and GitLab is listed +// as a supported provider with a generous trigger surface, but the helper can +// only post: its writeback catalog was `comments` and `discussions`, against +// GitHub's eight. A GitLab-sourced factory could not list issues, read an +// issue, or open a merge request through the helper, so authors reached for +// `glab` and split the integration across two mechanisms. +// +// WHY A DEPENDENCY BUMP IS THE FIX. `f.gitlab` is not hand-written. Its +// resources are generated (scripts/generate-helpers.mjs) from +// `WRITEBACK_PATH_CATALOG` in `@relayfile/adapter-core`, reached through the +// `@relayfile/relay-helpers` pin in packages/surface/package.json. Each +// catalog resource becomes `.read()` / `.list()` / `.write()` / `.path()`. +// So the helper was never the thing that was missing — the catalog was, and +// relayfile-adapters#282 filled it in: +// +// adapter-core 0.5.24 gitlab: comments, discussions +// adapter-core 0.6.0 gitlab: close-merge-request, comments, discussions, +// issues, merge, merge-requests, refs +// +// The helper gains `f.gitlab.issues.list()`, `.read()`, `.write()` and +// `f.gitlab["merge-requests"].write()` the moment this repository resolves a +// catalog that carries them. Nothing here should hand-write a GitLab method: +// that would be the second mechanism all over again. +// +// THE UPSTREAM PRECONDITION. `relay-helpers` must itself depend on the newer +// core — npm will never resolve `^0.5.15` to `0.6.0`. That was the blocker +// when this flow was written (published relay-helpers 0.4.11 still pointed at +// `^0.5.15`); relay-helpers 0.4.12 closed it. The flow still probes the +// registry rather than trusting this comment, so if a future core bump lands +// out of reach again it reports the exact dependency edge and declines +// instead of inventing a local fix. +// +// The pin this repository now carries (relay-helpers 0.4.12) was applied by +// hand in the same change that added this file, so a first run here is a +// no-op that declines at the "already resolved" branch. It earns its keep on +// the NEXT catalog bump. +// +// Local: flows run workflows/gitlab-surface-parity.flow.ts --local-agent +// Cloud: deploy as a manual/scheduled listener on AgentWorkforce/flows. + +import { flow } from "@relayflows/surface"; + +const shellWord = (value: string): string => `'${value.replaceAll("'", "'\\''")}'`; + +export interface GitlabSurfaceParityInput { + /** + * Skip the registry probe and use this exact `@relayfile/relay-helpers` + * version. The probe still verifies its catalog before anything is written, + * so a wrong pin fails loudly rather than landing a no-op bump. + */ + relayHelpersVersion?: string; + /** Branch to push. Defaults to a fixed name so re-runs update one PR. */ + branch?: string; +} + +// The resources #282 added. The flow asserts the generated helper exposes +// every one of them with read/list/write — the parity claim this PR makes is +// checked against the built surface, not against the changelog. +const REQUIRED = ["issues", "merge-requests", "refs", "merge", "close-merge-request"] as const; +const PROBE = "parity/probe.json"; +const REPORT = "parity/report.md"; +const SURFACE_PKG = "packages/surface/package.json"; +const CLI = "claude"; + +/** A published version string, as npm would print it. Interpolated into a shell command. */ +function validVersion(value: string): boolean { + return /^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/u.test(value); +} + +export default flow( + "gitlab-surface-parity", + { budget: "$2/run" }, + async (f, input) => { + const branch = input.branch ?? "feat/gitlab-surface-parity"; + if (!/^[A-Za-z0-9][A-Za-z0-9._\/-]*$/u.test(branch)) { + throw new Error(`gitlab-surface-parity: refusing an unsafe branch name: ${JSON.stringify(branch)}`); + } + if (input.relayHelpersVersion !== undefined && !validVersion(input.relayHelpersVersion)) { + throw new Error( + `gitlab-surface-parity: relayHelpersVersion is not a semver: ${JSON.stringify(input.relayHelpersVersion)}`, + ); + } + + await f.run("rm -rf parity && mkdir -p parity"); + + // STEP 1 — probe the registry for a relay-helpers whose TRANSITIVE + // adapter-core actually carries the GitLab resources. This installs each + // candidate into a throwaway prefix and READS the catalog; a version range + // in a manifest is not evidence that the resource exists, and this is the + // one fact the whole flow rests on. + const candidate = input.relayHelpersVersion ? shellWord(input.relayHelpersVersion) : ""; + const probe = await f.run( + `cd parity && mkdir -p probe && cd probe && printf '{"name":"probe","private":true}' > package.json && ` + + `versions=$(${candidate ? `printf '%s' ${candidate}` : `npm view @relayfile/relay-helpers versions --json | node -e 'let s="";process.stdin.on("data",d=>s+=d).on("end",()=>{const v=JSON.parse(s);console.log(v.slice(-8).reverse().join(" "))})'`}) && ` + + `for v in $versions; do ` + + `npm i --no-audit --no-fund --silent "@relayfile/relay-helpers@$v" >/dev/null 2>&1 || continue; ` + + `found=$(node --input-type=module -e '` + + `const m = await import("@relayfile/adapter-core/writeback-paths");` + + `const r = Object.keys(m.WRITEBACK_PATH_CATALOG.gitlab ?? {});` + + `process.stdout.write(JSON.stringify(r));' 2>/dev/null) || continue; ` + + `case "$found" in *'"issues"'*) ` + + `core=$(node -p "require('@relayfile/adapter-core/package.json').version" 2>/dev/null); ` + + `printf '{"version":"%s","core":"%s","resources":%s}' "$v" "$core" "$found" > ../../${PROBE}; break;; esac; ` + + `done; cat ../../${PROBE} 2>/dev/null || printf '{}'`, + { timeout: "10m" }, + ); + + // STEP 2 — no usable version yet: the blocker is upstream. Report it + // precisely (which package, which dependency edge) and decline. A flow + // that "fixed" this locally would be pinning a catalog nobody published. + if (!probe.includes('"version"')) { + await f.run( + `printf '%s\\n' '# gitlab-surface-parity: blocked upstream' '' \\ + 'No published @relayfile/relay-helpers resolves an @relayfile/adapter-core whose' \\ + 'WRITEBACK_PATH_CATALOG.gitlab contains "issues" (probed the 8 newest versions).' '' \\ + 'relayfile-adapters#282 added the GitLab writeback resources and shipped them in' \\ + 'adapter-core 0.6.0, but relay-helpers still declares adapter-core ^0.5.x, and npm' \\ + 'will never resolve that range to 0.6.0. The gitlab helper stays post-only until' \\ + 'relay-helpers is republished against ^0.6.0 from the relayfile-adapters repo.' '' \\ + 'Fix upstream first, then re-run this flow (or pass relayHelpersVersion).' > ${REPORT}`, + ); + return f.done("declined"); + } + + // STEP 3 — bump the pin, reinstall, regenerate. The pin is exact in this + // repository (packages/surface/package.json), so it is rewritten from the + // probe's own answer rather than from a range. + await f.run( + `node -e '` + + `const fs=require("fs"); const probe=JSON.parse(fs.readFileSync("${PROBE}","utf8"));` + + `const p="${SURFACE_PKG}"; const m=JSON.parse(fs.readFileSync(p,"utf8"));` + + `const cur=m.dependencies["@relayfile/relay-helpers"];` + + `if(cur===undefined) throw new Error("no @relayfile/relay-helpers dependency in "+p);` + + `m.dependencies["@relayfile/relay-helpers"]=probe.version;` + + `fs.writeFileSync(p, JSON.stringify(m,null,2)+"\\n");` + + `console.log(cur+" -> "+probe.version);'`, + { timeout: "1m" }, + ); + await f.run("npm install --prefix packages/surface --no-audit --no-fund", { timeout: "15m" }); + await f.run("npm run gen --prefix packages/surface", { timeout: "5m" }); + + // STEP 4 — the parity gate. Import the BUILT surface and assert every + // resource #282 added is reachable with the four accessors. This is what + // makes the PR's claim falsifiable: if the generator did not pick the + // resources up, the flow fails here instead of opening a green-looking PR. + await f.run("npm run build --prefix packages/surface", { timeout: "10m" }); + await f.run( + `node --input-type=module -e '` + + `const { createGitlabHelper } = await import("./packages/surface/dist/helpers/gitlab.js");` + + `const calls = [];` + + `const helper = createGitlabHelper((effect) => { calls.push(effect); return Promise.resolve(undefined); });` + + `const required = ${JSON.stringify([...REQUIRED])};` + + `const missing = required.filter((r) => helper[r] === undefined);` + + `if (missing.length > 0) throw new Error("the gitlab helper is missing: " + missing.join(", "));` + + `const partial = required.filter((r) => ["read","list","write","path"].some((m) => typeof helper[r][m] !== "function"));` + + `if (partial.length > 0) throw new Error("gitlab helper resources missing read/list/write/path: " + partial.join(", "));` + + `console.log("gitlab helper parity OK: " + required.join(", "));'`, + { timeout: "5m" }, + ); + + // STEP 5 — the repository's own tests must still pass. A generated file + // has a snapshot test here (helpers.snapshot.test.ts); regenerating + // without updating it is exactly the kind of drift this gate exists for. + await f.run("npm test --prefix packages/surface", { timeout: "20m" }); + + // STEP 6 — docs. The generated helper is the source of truth, so the only + // hand-written thing left is every place that told an author GitLab could + // not do this. An agent (not a sed) does it because the claims are prose + // and live in several files. + await f + .agent("docs", { + cli: CLI, + task: + `@relayfile/relay-helpers was just bumped in ${SURFACE_PKG} and packages/surface/src/helpers/gitlab.ts ` + + `was regenerated, so the gitlab helper now exposes ${REQUIRED.join(", ")} with read/list/write/path (previously ` + + `only comments and discussions). Update the documentation and examples that still say or imply GitLab ` + + `is post-only or second-class — check docs/SURFACE.md, docs/CLOUD.md, README.md, examples/README.md and ` + + `any provider/capability table. Only change claims that are now false; do not restate the changelog, do ` + + `not touch generated files (packages/surface/src/helpers/*.ts), and do not edit code. Then write ${REPORT} ` + + `as the pull request body: what the gap was, that the fix is a catalog bump rather than a hand-written ` + + `GitLab client, the before/after resource lists (read them from ${PROBE}), the parity assertion that now ` + + `guards it, and every doc file you changed. If no doc made a false claim, say so in ${REPORT} explicitly.`, + }) + .gate({ type: "artifact_exists", path: REPORT }); + + // STEP 7 — publish. One branch, force-pushed, so a re-run updates the + // same PR instead of opening a second one. `gh` uses the sandbox's + // GH_TOKEN, the same credential git has there (see pr-review.flow.ts: + // the relayfile GitHub mount is not attached to authored Cloud runs). + const changed = await f.run("git status --porcelain | head -c 4000"); + if (changed.trim().length === 0) { + await f.run(`printf '%s\\n' 'No change: the pin already resolved a catalog with the GitLab resources.' >> ${REPORT}`); + return f.done("declined"); + } + await f.run( + `git checkout -B ${shellWord(branch)} && ` + + `git add -A ':(exclude)parity' && ` + + `git -c user.name='relayflow' -c user.email='flows@agent-relay.com' commit -m ` + + shellWord( + "feat(surface): give the gitlab helper its issue and merge-request surface\n\n" + + "Bumps @relayfile/relay-helpers so the generated helper picks up the\n" + + "GitLab writeback resources added in relayfile-adapters#282. No GitLab\n" + + "method is hand-written: the helper is generated from the adapter-core\n" + + "writeback catalog, and the catalog is what was missing.", + ) + + ` && git push --force-with-lease -u origin ${shellWord(branch)}`, + { timeout: "5m" }, + ); + await f.run( + `gh pr create --repo AgentWorkforce/flows --base main --head ${shellWord(branch)} ` + + `--title 'feat(surface): give the gitlab helper its issue and merge-request surface' --body-file ${REPORT} ` + + `|| gh pr edit --repo AgentWorkforce/flows ${shellWord(branch)} --body-file ${REPORT}`, + { timeout: "5m" }, + ); + f.done("success"); + }, +); From 47f412bec4cb6a93bc8855365a35e9b4bcadf4dc Mon Sep 17 00:00:00 2001 From: Khaliq Date: Mon, 21 Sep 2026 08:07:02 -0700 Subject: [PATCH 2/4] fix(ci): carry the relay-helpers bump through bun.lock, the SDK and the gate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The first commit bumped only packages/surface/package.json + its npm lockfile, so packed-consumer failed: the gate installs the surface with `bun install --frozen-lockfile`, and bun.lock still pinned relay-helpers 0.4.11, whose client surface has no rampClient. The pin lives in more places than that one manifest: packages/surface/package.json peerDependencies (already bumped) packages/surface/package-lock.json (already bumped) packages/surface/bun.lock what CI actually installs from packages/sdk/package.json the SDK's own copy The gate also cannot survive any move of that pin as written. It installs the LAST-PUBLISHED surface into the SDK and then overwrites it with the freshly packed one, and the published peer range is an exact version, so npm refuses both orderings: the old pin conflicts with the new tarball, and the new pin conflicts with the old registry copy. `npm ci --legacy-peer-deps` relaxes that, but it also stops npm resolving peers on the fly — and adapter-core 0.6 added a @relayfile/sdk peer that 0.5 did not have, whose absence broke the SDK suite at import time. Generating the SDK lockfile with `npm install --force` records that peer, so `npm ci` only installs what is already pinned. Verified by running scripts/surface-package-gate.sh locally end to end: exit 0, PACKED_RUNTIME_OK, PACKED_RUNTIME_REFUSAL_OK, PACKED_TYPESCRIPT_OK, SDK 25/25, surface 50/50. Co-Authored-By: Claude Opus 5 (1M context) --- packages/sdk/package-lock.json | 229 ++++++++++++++++++++++++++------ packages/sdk/package.json | 2 +- packages/surface/bun.lock | 104 ++++++++------- scripts/surface-package-gate.sh | 15 ++- 4 files changed, 263 insertions(+), 87 deletions(-) diff --git a/packages/sdk/package-lock.json b/packages/sdk/package-lock.json index 6c74ecd5a..6ab9fa638 100644 --- a/packages/sdk/package-lock.json +++ b/packages/sdk/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "@modelcontextprotocol/sdk": "^1.30.0", "@relayfile/adapter-core": "0.5.26", - "@relayfile/relay-helpers": "0.4.11", + "@relayfile/relay-helpers": "0.4.12", "@relayflows/surface": "2.0.25", "@types/js-yaml": "^4.0.9", "ai-hist": "0.4.1", @@ -554,12 +554,33 @@ } }, "node_modules/@relayfile/adapter-linear": { - "version": "0.4.12", - "resolved": "https://registry.npmjs.org/@relayfile/adapter-linear/-/adapter-linear-0.4.12.tgz", - "integrity": "sha512-obICrTmIkVKXX0vAjGiezOK/cu3iUH6i67fuKLe7Fqcp/Upwrsr70Ap68YxyMvpNOvE4TdbbM1vU+2uGXwM5sg==", + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/@relayfile/adapter-linear/-/adapter-linear-0.4.13.tgz", + "integrity": "sha512-cJtjrmhK2dV5o7QD61N2vuvl4XnMGjrcWX5zrM9otneVVA983GHRKdHv014Hq7QSIpG5FMSuLGPziYn6vFJI+A==", "license": "Apache-2.0", "dependencies": { - "@relayfile/adapter-core": "^0.5.18" + "@relayfile/adapter-core": "^0.6.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@relayfile/sdk": ">=0.6.0 <1" + } + }, + "node_modules/@relayfile/adapter-linear/node_modules/@relayfile/adapter-core": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@relayfile/adapter-core/-/adapter-core-0.6.2.tgz", + "integrity": "sha512-fVBwiK1W0af4wQ4w/Jr7GA1VBH1qz9Qw1lm90MrOJN0zQfVq1YRwRu9fPk4rp50TQDveLBKE0+MoaLMUmqr5Jg==", + "license": "Apache-2.0", + "dependencies": { + "@scalar/postman-to-openapi": "^0.6.0", + "cheerio": "^1.2.0", + "minimatch": "^10.0.3", + "yaml": "^2.8.1" + }, + "bin": { + "adapter-core": "dist/src/cli.js" }, "engines": { "node": ">=18" @@ -569,12 +590,12 @@ } }, "node_modules/@relayfile/adapter-reddit": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/@relayfile/adapter-reddit/-/adapter-reddit-0.2.9.tgz", - "integrity": "sha512-/ZWkr4SguRRCk4fY6DEtP5NVUHSMWP66GtMou4NJOcf5PaxYSa0ceSVxAN/IcTBG6JqdtbqB4IoWn8V9d/JC3g==", + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@relayfile/adapter-reddit/-/adapter-reddit-0.2.10.tgz", + "integrity": "sha512-FBGpWqJgOAC7nSE3SUAPil+pYxpBne1higJmSqGIrycbiIvBPxbluUsTb5Ct7XSyvDB3QmMbOMog5CDaVLhnKQ==", "license": "Apache-2.0", "dependencies": { - "@relayfile/adapter-core": "^0.5.15" + "@relayfile/adapter-core": "^0.6.1" }, "engines": { "node": ">=18" @@ -583,10 +604,115 @@ "@relayfile/sdk": ">=0.6.0 <1" } }, + "node_modules/@relayfile/adapter-reddit/node_modules/@relayfile/adapter-core": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@relayfile/adapter-core/-/adapter-core-0.6.2.tgz", + "integrity": "sha512-fVBwiK1W0af4wQ4w/Jr7GA1VBH1qz9Qw1lm90MrOJN0zQfVq1YRwRu9fPk4rp50TQDveLBKE0+MoaLMUmqr5Jg==", + "license": "Apache-2.0", + "dependencies": { + "@scalar/postman-to-openapi": "^0.6.0", + "cheerio": "^1.2.0", + "minimatch": "^10.0.3", + "yaml": "^2.8.1" + }, + "bin": { + "adapter-core": "dist/src/cli.js" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@relayfile/sdk": ">=0.6.0 <1" + } + }, + "node_modules/@relayfile/cli-darwin-arm64": { + "version": "0.10.69", + "resolved": "https://registry.npmjs.org/@relayfile/cli-darwin-arm64/-/cli-darwin-arm64-0.10.69.tgz", + "integrity": "sha512-zJpbOfz4Iq2273TkQHvzOmQ06tA2jga6Pxa0WSYBHTfxMwWE7tk9gGwPrtU4ppOiyON6jvQuTQ3byBhwOwlLsQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "peer": true + }, + "node_modules/@relayfile/cli-darwin-x64": { + "version": "0.10.69", + "resolved": "https://registry.npmjs.org/@relayfile/cli-darwin-x64/-/cli-darwin-x64-0.10.69.tgz", + "integrity": "sha512-Tda09y7GP3cP8EsKYO0UJLoPOxQVYjrKGPcjF8Z/scWhpyU7cRTnMng9KsqnEDXZIVP/k8yiuku2PaylJjX0GA==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "peer": true + }, + "node_modules/@relayfile/cli-linux-arm64": { + "version": "0.10.69", + "resolved": "https://registry.npmjs.org/@relayfile/cli-linux-arm64/-/cli-linux-arm64-0.10.69.tgz", + "integrity": "sha512-5wZYIm55xkhf4UWBj7I/Evl7QU5/dYHsIEZEc/+QU70PTSGzMUKHjO66FcCyS0K5lSRJ6dngRP666kvl2G7vmQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@relayfile/cli-linux-x64": { + "version": "0.10.69", + "resolved": "https://registry.npmjs.org/@relayfile/cli-linux-x64/-/cli-linux-x64-0.10.69.tgz", + "integrity": "sha512-BgnmP4He93T+Hr2McVQoPxprmdEM4D7kHev5Xziyrjapd1juTZwe0lBkpa8ngn8wyoDk/pVui04s6llGeAU3cw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@relayfile/cli-win32-arm64": { + "version": "0.10.69", + "resolved": "https://registry.npmjs.org/@relayfile/cli-win32-arm64/-/cli-win32-arm64-0.10.69.tgz", + "integrity": "sha512-KITNWpQaHBX7iBA1TgOHdO2xMtSY+LH4UkafzXztfVjTKwOjM4nCgLXfS59Z70l94ae7UowvBjgG9psuiAyJoQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "peer": true + }, + "node_modules/@relayfile/cli-win32-x64": { + "version": "0.10.69", + "resolved": "https://registry.npmjs.org/@relayfile/cli-win32-x64/-/cli-win32-x64-0.10.69.tgz", + "integrity": "sha512-wpogN9nsnw2boMGOhuHyS9SV13Y3QzikE0hTYculUIdxN0tPZDsWgNj2IsN8s/E6edA+TfQ+uUpbExadM/Y/LA==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "peer": true + }, "node_modules/@relayfile/core": { - "version": "0.10.57", - "resolved": "https://registry.npmjs.org/@relayfile/core/-/core-0.10.57.tgz", - "integrity": "sha512-oKwNJKGovzdl/6IF3sSVZFsiG2ITH7jXnmFgxbCIYPZ+J7QsQ2zvBhT35sPGiNcD4FfiMpyX9OB8LJXOefNdcQ==", + "version": "0.10.69", + "resolved": "https://registry.npmjs.org/@relayfile/core/-/core-0.10.69.tgz", + "integrity": "sha512-ZN2UrobsvOOcLkI7mZ3HFW0VK1YWwaxL3q8T1pIPj6hRzufQCnaWwXtk7XVpIFRGerdUSrWbnYJZXfg/jgBtzA==", "license": "Apache-2.0", "peer": true, "engines": { @@ -594,9 +720,9 @@ } }, "node_modules/@relayfile/mount-darwin-arm64": { - "version": "0.10.57", - "resolved": "https://registry.npmjs.org/@relayfile/mount-darwin-arm64/-/mount-darwin-arm64-0.10.57.tgz", - "integrity": "sha512-yCcjQ7HoCJECnjtZeG7eZwLXa4RAT3RAVAAymdIqKZbMe3wbkF1kg3YNQHuRqYsDEIQzGkA4k5AsITmG1j2PfQ==", + "version": "0.10.69", + "resolved": "https://registry.npmjs.org/@relayfile/mount-darwin-arm64/-/mount-darwin-arm64-0.10.69.tgz", + "integrity": "sha512-IyZqcC+bKyP8yIfTbUAOvbtDp7JPcYCypMtv+CS+hew6TX7C6/wr+gUAn4Er3zELIjW3Ktjzi86O8c8TUoX7sQ==", "cpu": [ "arm64" ], @@ -608,9 +734,9 @@ "peer": true }, "node_modules/@relayfile/mount-darwin-x64": { - "version": "0.10.57", - "resolved": "https://registry.npmjs.org/@relayfile/mount-darwin-x64/-/mount-darwin-x64-0.10.57.tgz", - "integrity": "sha512-5Ze1a16Mxc2PTj2Q+AdtRZIMKQ4sxJIIXwPjdWD+9rTMEQeqs7xzSZ1WRIjI89FzyNHBjx/+gzD9FK8Kjuc7Yg==", + "version": "0.10.69", + "resolved": "https://registry.npmjs.org/@relayfile/mount-darwin-x64/-/mount-darwin-x64-0.10.69.tgz", + "integrity": "sha512-S6nFPo7lRRo0HFagqZtqa7QRVSiFxGbGl0fEs+1TVRWlQt5ibvbpPMpcE7zOd7z4I/g4EOw+pmOcHmXXkjPNSA==", "cpu": [ "x64" ], @@ -622,9 +748,9 @@ "peer": true }, "node_modules/@relayfile/mount-linux-arm64": { - "version": "0.10.57", - "resolved": "https://registry.npmjs.org/@relayfile/mount-linux-arm64/-/mount-linux-arm64-0.10.57.tgz", - "integrity": "sha512-+2MhcDwzb7KSC3qjKWOW+9EnZ8mFKJiVns5fiJwO1oThiAd3CnnCfJzYkbEWRKIL0dH5wg4npdayF23DiBtB5w==", + "version": "0.10.69", + "resolved": "https://registry.npmjs.org/@relayfile/mount-linux-arm64/-/mount-linux-arm64-0.10.69.tgz", + "integrity": "sha512-bhbHhwcd+wvpoz5mxqAF6h/74phb1mcxMzIDacAiuSQ9ymXxcc9IGd3nvFSr+h0wsyKfZN8tGppBN/Ez1h/ZLA==", "cpu": [ "arm64" ], @@ -636,9 +762,9 @@ "peer": true }, "node_modules/@relayfile/mount-linux-x64": { - "version": "0.10.57", - "resolved": "https://registry.npmjs.org/@relayfile/mount-linux-x64/-/mount-linux-x64-0.10.57.tgz", - "integrity": "sha512-Y0OGuGEpglQsUrrR0uzjBzqFyrM8wU5jG1tELJ8LBNhedNUEUupGKD7ixs+i4k9kR8Q68voVsQTfzdgqzW3M+Q==", + "version": "0.10.69", + "resolved": "https://registry.npmjs.org/@relayfile/mount-linux-x64/-/mount-linux-x64-0.10.69.tgz", + "integrity": "sha512-aTy6ZiYgF+8SuSF9hGDgJU/z9K6rh+UUAl6Emp/valiw3FmM0fLOt2rAt1/KyXtuhgJE09/XoPRYBLa8UyIeUg==", "cpu": [ "x64" ], @@ -650,24 +776,45 @@ "peer": true }, "node_modules/@relayfile/relay-helpers": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/@relayfile/relay-helpers/-/relay-helpers-0.4.11.tgz", - "integrity": "sha512-J9S2L+dVRQcxv32BxMq+xEqpBJoG1mNzo1E/CCXY4LYUSl0euZD0ZayaFMcpBhGqx+2IDNiSlGjFun/YQk9OqA==", + "version": "0.4.12", + "resolved": "https://registry.npmjs.org/@relayfile/relay-helpers/-/relay-helpers-0.4.12.tgz", + "integrity": "sha512-Izjl33HLCjxDFVZHK/+f+e/73IUiEg534QNBJGkRYZXjH6LvPKfGiPXViiY5zYLxFtgnzNQa+/TI6MB4X3BnEQ==", + "license": "Apache-2.0", + "dependencies": { + "@relayfile/adapter-core": "^0.6.1", + "@relayfile/adapter-linear": "^0.4.13", + "@relayfile/adapter-reddit": "^0.2.10" + } + }, + "node_modules/@relayfile/relay-helpers/node_modules/@relayfile/adapter-core": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@relayfile/adapter-core/-/adapter-core-0.6.2.tgz", + "integrity": "sha512-fVBwiK1W0af4wQ4w/Jr7GA1VBH1qz9Qw1lm90MrOJN0zQfVq1YRwRu9fPk4rp50TQDveLBKE0+MoaLMUmqr5Jg==", "license": "Apache-2.0", "dependencies": { - "@relayfile/adapter-core": "^0.5.15", - "@relayfile/adapter-linear": "^0.4.11", - "@relayfile/adapter-reddit": "^0.2.9" + "@scalar/postman-to-openapi": "^0.6.0", + "cheerio": "^1.2.0", + "minimatch": "^10.0.3", + "yaml": "^2.8.1" + }, + "bin": { + "adapter-core": "dist/src/cli.js" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@relayfile/sdk": ">=0.6.0 <1" } }, "node_modules/@relayfile/sdk": { - "version": "0.10.57", - "resolved": "https://registry.npmjs.org/@relayfile/sdk/-/sdk-0.10.57.tgz", - "integrity": "sha512-9AJIEyyruqVogbdqVfY7q0pjuXJy8IhzxR/1pvwWJiybU1BZO8LFNurlFePTAo/uhLG9cshr0YJRBxv2WbG0Sg==", + "version": "0.10.69", + "resolved": "https://registry.npmjs.org/@relayfile/sdk/-/sdk-0.10.69.tgz", + "integrity": "sha512-yKImAt0XrR7lqJTaWXCv4NlCyZe1YFxh1qEBKoKCPYhEiF31Rrbarq+PZlQybg4r2Kbiff4XtSERMy31iHvoSw==", "license": "Apache-2.0", "peer": true, "dependencies": { - "@relayfile/core": "0.10.57", + "@relayfile/core": "0.10.69", "ignore": "^7.0.5", "tar": "^7.5.10" }, @@ -675,10 +822,16 @@ "node": ">=18" }, "optionalDependencies": { - "@relayfile/mount-darwin-arm64": "0.10.57", - "@relayfile/mount-darwin-x64": "0.10.57", - "@relayfile/mount-linux-arm64": "0.10.57", - "@relayfile/mount-linux-x64": "0.10.57" + "@relayfile/cli-darwin-arm64": "0.10.69", + "@relayfile/cli-darwin-x64": "0.10.69", + "@relayfile/cli-linux-arm64": "0.10.69", + "@relayfile/cli-linux-x64": "0.10.69", + "@relayfile/cli-win32-arm64": "0.10.69", + "@relayfile/cli-win32-x64": "0.10.69", + "@relayfile/mount-darwin-arm64": "0.10.69", + "@relayfile/mount-darwin-x64": "0.10.69", + "@relayfile/mount-linux-arm64": "0.10.69", + "@relayfile/mount-linux-x64": "0.10.69" } }, "node_modules/@relayflows/surface": { diff --git a/packages/sdk/package.json b/packages/sdk/package.json index f9afb1993..571633404 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -48,7 +48,7 @@ "dependencies": { "@modelcontextprotocol/sdk": "^1.30.0", "@relayfile/adapter-core": "0.5.26", - "@relayfile/relay-helpers": "0.4.11", + "@relayfile/relay-helpers": "0.4.12", "@relayflows/surface": "2.0.25", "@types/js-yaml": "^4.0.9", "ai-hist": "0.4.1", diff --git a/packages/surface/bun.lock b/packages/surface/bun.lock index bdb9cf48c..859a362ac 100644 --- a/packages/surface/bun.lock +++ b/packages/surface/bun.lock @@ -1,5 +1,5 @@ { - "lockfileVersion": 2, + "lockfileVersion": 1, "configVersion": 1, "workspaces": { "": { @@ -13,7 +13,7 @@ "vitest": "^2.1.0", }, "peerDependencies": { - "@relayfile/relay-helpers": "0.4.11", + "@relayfile/relay-helpers": "0.4.12", }, }, }, @@ -74,75 +74,87 @@ "@napi-rs/lzma-linux-x64-gnu": ["@napi-rs/lzma-linux-x64-gnu@1.5.1", "", { "os": "linux", "cpu": "x64" }, "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ=="], - "@relayfile/adapter-core": ["@relayfile/adapter-core@0.5.24", "", { "dependencies": { "@scalar/postman-to-openapi": "^0.6.0", "cheerio": "^1.2.0", "minimatch": "^10.0.3", "yaml": "^2.8.1" }, "peerDependencies": { "@relayfile/sdk": ">=0.6.0 <1" }, "bin": { "adapter-core": "dist/src/cli.js" } }, "sha512-bOQRuBoAw2RlYs30RtKsOvXlXzcRx4owhHdj384hPrznBIY3U4ZYcb4pVfzreW9TStHEiX7EguUyqhD9g8DJmA=="], + "@relayfile/adapter-core": ["@relayfile/adapter-core@0.6.2", "", { "dependencies": { "@scalar/postman-to-openapi": "^0.6.0", "cheerio": "^1.2.0", "minimatch": "^10.0.3", "yaml": "^2.8.1" }, "peerDependencies": { "@relayfile/sdk": ">=0.6.0 <1" }, "bin": { "adapter-core": "dist/src/cli.js" } }, "sha512-fVBwiK1W0af4wQ4w/Jr7GA1VBH1qz9Qw1lm90MrOJN0zQfVq1YRwRu9fPk4rp50TQDveLBKE0+MoaLMUmqr5Jg=="], - "@relayfile/adapter-linear": ["@relayfile/adapter-linear@0.4.12", "", { "dependencies": { "@relayfile/adapter-core": "^0.5.18" }, "peerDependencies": { "@relayfile/sdk": ">=0.6.0 <1" } }, "sha512-obICrTmIkVKXX0vAjGiezOK/cu3iUH6i67fuKLe7Fqcp/Upwrsr70Ap68YxyMvpNOvE4TdbbM1vU+2uGXwM5sg=="], + "@relayfile/adapter-linear": ["@relayfile/adapter-linear@0.4.13", "", { "dependencies": { "@relayfile/adapter-core": "^0.6.1" }, "peerDependencies": { "@relayfile/sdk": ">=0.6.0 <1" } }, "sha512-cJtjrmhK2dV5o7QD61N2vuvl4XnMGjrcWX5zrM9otneVVA983GHRKdHv014Hq7QSIpG5FMSuLGPziYn6vFJI+A=="], - "@relayfile/adapter-reddit": ["@relayfile/adapter-reddit@0.2.9", "", { "dependencies": { "@relayfile/adapter-core": "^0.5.15" }, "peerDependencies": { "@relayfile/sdk": ">=0.6.0 <1" } }, "sha512-/ZWkr4SguRRCk4fY6DEtP5NVUHSMWP66GtMou4NJOcf5PaxYSa0ceSVxAN/IcTBG6JqdtbqB4IoWn8V9d/JC3g=="], + "@relayfile/adapter-reddit": ["@relayfile/adapter-reddit@0.2.10", "", { "dependencies": { "@relayfile/adapter-core": "^0.6.1" }, "peerDependencies": { "@relayfile/sdk": ">=0.6.0 <1" } }, "sha512-FBGpWqJgOAC7nSE3SUAPil+pYxpBne1higJmSqGIrycbiIvBPxbluUsTb5Ct7XSyvDB3QmMbOMog5CDaVLhnKQ=="], - "@relayfile/core": ["@relayfile/core@0.10.57", "", {}, "sha512-oKwNJKGovzdl/6IF3sSVZFsiG2ITH7jXnmFgxbCIYPZ+J7QsQ2zvBhT35sPGiNcD4FfiMpyX9OB8LJXOefNdcQ=="], + "@relayfile/cli-darwin-arm64": ["@relayfile/cli-darwin-arm64@0.10.69", "", { "os": "darwin", "cpu": "arm64" }, "sha512-zJpbOfz4Iq2273TkQHvzOmQ06tA2jga6Pxa0WSYBHTfxMwWE7tk9gGwPrtU4ppOiyON6jvQuTQ3byBhwOwlLsQ=="], - "@relayfile/mount-darwin-arm64": ["@relayfile/mount-darwin-arm64@0.10.57", "", { "os": "darwin", "cpu": "arm64" }, "sha512-yCcjQ7HoCJECnjtZeG7eZwLXa4RAT3RAVAAymdIqKZbMe3wbkF1kg3YNQHuRqYsDEIQzGkA4k5AsITmG1j2PfQ=="], + "@relayfile/cli-darwin-x64": ["@relayfile/cli-darwin-x64@0.10.69", "", { "os": "darwin", "cpu": "x64" }, "sha512-Tda09y7GP3cP8EsKYO0UJLoPOxQVYjrKGPcjF8Z/scWhpyU7cRTnMng9KsqnEDXZIVP/k8yiuku2PaylJjX0GA=="], - "@relayfile/mount-darwin-x64": ["@relayfile/mount-darwin-x64@0.10.57", "", { "os": "darwin", "cpu": "x64" }, "sha512-5Ze1a16Mxc2PTj2Q+AdtRZIMKQ4sxJIIXwPjdWD+9rTMEQeqs7xzSZ1WRIjI89FzyNHBjx/+gzD9FK8Kjuc7Yg=="], + "@relayfile/cli-linux-arm64": ["@relayfile/cli-linux-arm64@0.10.69", "", { "os": "linux", "cpu": "arm64" }, "sha512-5wZYIm55xkhf4UWBj7I/Evl7QU5/dYHsIEZEc/+QU70PTSGzMUKHjO66FcCyS0K5lSRJ6dngRP666kvl2G7vmQ=="], - "@relayfile/mount-linux-arm64": ["@relayfile/mount-linux-arm64@0.10.57", "", { "os": "linux", "cpu": "arm64" }, "sha512-+2MhcDwzb7KSC3qjKWOW+9EnZ8mFKJiVns5fiJwO1oThiAd3CnnCfJzYkbEWRKIL0dH5wg4npdayF23DiBtB5w=="], + "@relayfile/cli-linux-x64": ["@relayfile/cli-linux-x64@0.10.69", "", { "os": "linux", "cpu": "x64" }, "sha512-BgnmP4He93T+Hr2McVQoPxprmdEM4D7kHev5Xziyrjapd1juTZwe0lBkpa8ngn8wyoDk/pVui04s6llGeAU3cw=="], - "@relayfile/mount-linux-x64": ["@relayfile/mount-linux-x64@0.10.57", "", { "os": "linux", "cpu": "x64" }, "sha512-Y0OGuGEpglQsUrrR0uzjBzqFyrM8wU5jG1tELJ8LBNhedNUEUupGKD7ixs+i4k9kR8Q68voVsQTfzdgqzW3M+Q=="], + "@relayfile/cli-win32-arm64": ["@relayfile/cli-win32-arm64@0.10.69", "", { "os": "win32", "cpu": "arm64" }, "sha512-KITNWpQaHBX7iBA1TgOHdO2xMtSY+LH4UkafzXztfVjTKwOjM4nCgLXfS59Z70l94ae7UowvBjgG9psuiAyJoQ=="], - "@relayfile/relay-helpers": ["@relayfile/relay-helpers@0.4.11", "", { "dependencies": { "@relayfile/adapter-core": "^0.5.15", "@relayfile/adapter-linear": "^0.4.11", "@relayfile/adapter-reddit": "^0.2.9" } }, "sha512-J9S2L+dVRQcxv32BxMq+xEqpBJoG1mNzo1E/CCXY4LYUSl0euZD0ZayaFMcpBhGqx+2IDNiSlGjFun/YQk9OqA=="], + "@relayfile/cli-win32-x64": ["@relayfile/cli-win32-x64@0.10.69", "", { "os": "win32", "cpu": "x64" }, "sha512-wpogN9nsnw2boMGOhuHyS9SV13Y3QzikE0hTYculUIdxN0tPZDsWgNj2IsN8s/E6edA+TfQ+uUpbExadM/Y/LA=="], - "@relayfile/sdk": ["@relayfile/sdk@0.10.57", "", { "dependencies": { "@relayfile/core": "0.10.57", "ignore": "^7.0.5", "tar": "^7.5.10" }, "optionalDependencies": { "@relayfile/mount-darwin-arm64": "0.10.57", "@relayfile/mount-darwin-x64": "0.10.57", "@relayfile/mount-linux-arm64": "0.10.57", "@relayfile/mount-linux-x64": "0.10.57" } }, "sha512-9AJIEyyruqVogbdqVfY7q0pjuXJy8IhzxR/1pvwWJiybU1BZO8LFNurlFePTAo/uhLG9cshr0YJRBxv2WbG0Sg=="], + "@relayfile/core": ["@relayfile/core@0.10.69", "", {}, "sha512-ZN2UrobsvOOcLkI7mZ3HFW0VK1YWwaxL3q8T1pIPj6hRzufQCnaWwXtk7XVpIFRGerdUSrWbnYJZXfg/jgBtzA=="], - "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.63.1", "", { "os": "android", "cpu": "arm" }, "sha512-UZ8sUxPTiHWYX9QNdJedb1kDZSpS1t/VPWBWGSgqHNi9w3Cu6IXvu2mzbhiTiPvtrqgTQJ+zqiAq2iPIPilpaQ=="], + "@relayfile/mount-darwin-arm64": ["@relayfile/mount-darwin-arm64@0.10.69", "", { "os": "darwin", "cpu": "arm64" }, "sha512-IyZqcC+bKyP8yIfTbUAOvbtDp7JPcYCypMtv+CS+hew6TX7C6/wr+gUAn4Er3zELIjW3Ktjzi86O8c8TUoX7sQ=="], - "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.63.1", "", { "os": "android", "cpu": "arm64" }, "sha512-cQ4nFQABN5cDvDpbvJ7bMStCpnaVxynZrRMfUJYgxcIk9Sh54FIO1vtfkg0B69REjER77ioZ/ov+eAApx/KmLQ=="], + "@relayfile/mount-darwin-x64": ["@relayfile/mount-darwin-x64@0.10.69", "", { "os": "darwin", "cpu": "x64" }, "sha512-S6nFPo7lRRo0HFagqZtqa7QRVSiFxGbGl0fEs+1TVRWlQt5ibvbpPMpcE7zOd7z4I/g4EOw+pmOcHmXXkjPNSA=="], - "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.63.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-FQNqd1lRy/0QhDk3xeRIkSBiCpXCiDnZO3YLVdcDKN1UBiKToNftCzcXYNLshmPDUMlu2TdeS8tGcsU6f3YF1Q=="], + "@relayfile/mount-linux-arm64": ["@relayfile/mount-linux-arm64@0.10.69", "", { "os": "linux", "cpu": "arm64" }, "sha512-bhbHhwcd+wvpoz5mxqAF6h/74phb1mcxMzIDacAiuSQ9ymXxcc9IGd3nvFSr+h0wsyKfZN8tGppBN/Ez1h/ZLA=="], - "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.63.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-pvD16V939D3CloK0+qikpGaxiPrDUXTe7Y5cWOMkMSy7m1cawa8EGy/kXYi/G/cKAC4HDAbSnzCIk1WmsoOKXg=="], + "@relayfile/mount-linux-x64": ["@relayfile/mount-linux-x64@0.10.69", "", { "os": "linux", "cpu": "x64" }, "sha512-aTy6ZiYgF+8SuSF9hGDgJU/z9K6rh+UUAl6Emp/valiw3FmM0fLOt2rAt1/KyXtuhgJE09/XoPRYBLa8UyIeUg=="], - "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.63.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-pcFGeL2345VwdTnJhA6zLbew+YgWB0qBG2+dMtXjCicf6+rm6kO6cOoh5VnTe0ZMrMRgRyuHmCJxZWrIdzYuOw=="], + "@relayfile/relay-helpers": ["@relayfile/relay-helpers@0.4.12", "", { "dependencies": { "@relayfile/adapter-core": "^0.6.1", "@relayfile/adapter-linear": "^0.4.13", "@relayfile/adapter-reddit": "^0.2.10" } }, "sha512-Izjl33HLCjxDFVZHK/+f+e/73IUiEg534QNBJGkRYZXjH6LvPKfGiPXViiY5zYLxFtgnzNQa+/TI6MB4X3BnEQ=="], - "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.63.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-mRJlqSRulVzcKq/LKA6ICSIc3K/l4fzlVn/gePn2nXIHy8seRi5z/eeRE0d/XMBxcMldiXtQTSpRj0tkkC3g8Q=="], + "@relayfile/sdk": ["@relayfile/sdk@0.10.69", "", { "dependencies": { "@relayfile/core": "0.10.69", "ignore": "^7.0.5", "tar": "^7.5.10" }, "optionalDependencies": { "@relayfile/cli-darwin-arm64": "0.10.69", "@relayfile/cli-darwin-x64": "0.10.69", "@relayfile/cli-linux-arm64": "0.10.69", "@relayfile/cli-linux-x64": "0.10.69", "@relayfile/cli-win32-arm64": "0.10.69", "@relayfile/cli-win32-x64": "0.10.69", "@relayfile/mount-darwin-arm64": "0.10.69", "@relayfile/mount-darwin-x64": "0.10.69", "@relayfile/mount-linux-arm64": "0.10.69", "@relayfile/mount-linux-x64": "0.10.69" } }, "sha512-yKImAt0XrR7lqJTaWXCv4NlCyZe1YFxh1qEBKoKCPYhEiF31Rrbarq+PZlQybg4r2Kbiff4XtSERMy31iHvoSw=="], - "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.63.1", "", { "os": "linux", "cpu": "arm" }, "sha512-YDUNvVM85TI3g/1OpnqKP1h4NeW/j64DfWMf+G3M809xNk1bJSnpFp4sh83NpmVE5DXnkh8ULor4LTVZKoYLHw=="], + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.63.4", "", { "os": "android", "cpu": "arm" }, "sha512-I+BSHzTAhKN2n7ZwGZsegGcZjDpLqFOMAtJz/u6uFGe0pUFbq56dEHjqJV/ZUdRJtNXNxA+hREUatZBvMR3Oiw=="], - "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.63.1", "", { "os": "linux", "cpu": "arm" }, "sha512-7Mcn71p9ZuQFAj+h+dhQXy/yeLePRS2yKRnmW1DijA9thKO5qap0GNOIQK4yQ6iP3SU0Mrb/yWo8h8vgRba8lw=="], + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.63.4", "", { "os": "android", "cpu": "arm64" }, "sha512-pu3BdjS2LtEzRu2elmGzS3fIeWSZy4BMDIaLNwjorO76+k2d0LMluijhsDx3KQyQBQ/lLUZCQA9/s6csvUfuhw=="], - "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.63.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-4YiLQTX6U4CSl0L9cluep9A9W6UmTfqBDc2/CH6wlu54pl4E7Jn3cOD8oxzvBDEGk/JMKgJ47C8g+radF7mwvg=="], + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.63.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-xfSrj9MHnWK9GaSqT9U0ImHtH/N8WZlHLx4cZHiuLcqs640hvZ3hLPd5UR2AZS57FaE8HrRUSpltbZdWRxHiDA=="], - "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.63.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-2ra8F7w8OquwZN9z2/fKFnli69wa8PLwaVzRMIPGb13ByMJwC28Fbp8YcVGoUhlYMTt7j5j9bNgpysrN2UM+vw=="], + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.63.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-bqU99PLJb/dqb3S0GIMdeuyAEETSUgZBoqXYd3Sd+WCsV+MmPhnN6JrotWyir31+QgH7EvvE5/mwGJlEoci8Fw=="], - "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.63.1", "", { "os": "linux", "cpu": "none" }, "sha512-Sy20ncyhjmBP0Ml+UvQbimjlk6VFgjW5uNP+qqwHB00mTE8Bl2C1TuHTlRwK2YoXeZbee5lP2XevBWVkAQAtSQ=="], + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.63.4", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-JinsFZ5G40oXQb+sUuiA5x689vhr6dDYK0H0NL+rwKdL6CqnmYN8PE4ZwfRSoIjrCxqTQG/SLfTtSvHeGxoVlw=="], - "@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.63.1", "", { "os": "linux", "cpu": "none" }, "sha512-noITLp8oNjYliPnGWmLyelIHwULGqbHloQHGw1rtxbWhTuWooRpnZarZQJ1y9EUC4szuCusCc+HEpUtxpIwYvA=="], + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.63.4", "", { "os": "freebsd", "cpu": "x64" }, "sha512-GAdA4UxpiNm27cLHr2GqXBpAD0x9FqwYBY7/YSP0Ss0/PNi4k8gbviqpIpYbVSRBaS2ZcegXEzgTQMbRNCwxCw=="], - "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.63.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-hlxxXd+F1mWiAcaFR7Sv9ZQT6m6UfI8+Vy/kFJzztq2pDMU/0wZ9sish0iszNZvsQDo8Gc0i5yuFEOz5dDf6fA=="], + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.63.4", "", { "os": "linux", "cpu": "arm" }, "sha512-qDd6NoA1znaLjp4jR5U/KWCdLAKDJNB8W9ChbbDaKbo0xA+Atln5HK6LFCZ4oJQpemtRZA288DCirFRjrspptw=="], - "@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.63.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-EF7OpqQTQ/BvGqLzUi4rEHuagCV9MugAUXSHemwPW5vxZ75RR+jxO/2j95Ph2dalMpFHSVECjRoioHZgA9zOYA=="], + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.63.4", "", { "os": "linux", "cpu": "arm" }, "sha512-WtB5Tz5KTNINb8ZA+8sQ7bmjuS1JrRT7YverYIhUGdWWDlpzVWmIwuZE+jidkEXUn1l0zrEkaIMa8dHF3NGcsA=="], - "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.63.1", "", { "os": "linux", "cpu": "none" }, "sha512-wQO3JesW9PRkwlabQ27y7sPfVOOTLRG73I4F2UYHG5PXun3J9U3y+b7ezVKSYbsvSKGQ1k1cq8Qlun4C9kLt3w=="], + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.63.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-VcQ3L1tjnkKzWjryAVaFhHEWcqOfICX9uxVVoDzm2t0DpgKRHd2zOpVrJc0xsWeBZcBFyYROCIBdyR/fS174pg=="], - "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.63.1", "", { "os": "linux", "cpu": "none" }, "sha512-ouAGwhO6wHRXdnOVCOsB0tRFkA7nhNB2Nwax6oECXN0YiN8EYUTBAOudADOB1PI+yDL61TeNx/u7MVCzksNbkQ=="], + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.63.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-6+ZQX6P5s0cMDN2Ypb8Lbm2+/sZYmZjdaYny992ujUU9UKi/4CWoJWsl1pNvjWJHNHGK51m+jKGLlh1ylb2ifQ=="], - "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.63.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-q2R38Sn+1J8RxhfJ+T54wSWmyKXWec+9jgDfqO2AtArEqHO5R2aeayp5H5OYLr5UYDVGsVaZPEFUooMhYCdz5A=="], + "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.63.4", "", { "os": "linux", "cpu": "none" }, "sha512-D72ZnvkFkBXOfzMMQLcwfPLyGkKb7HZ9/mf97B7v6/P5Lbv4oFOtSY/uHbS8lH6uKUOxoKiuokdb50XZSzzbJw=="], - "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.63.1", "", { "os": "linux", "cpu": "x64" }, "sha512-gfI5T24WLLuFfSKw7Go/zDXjAAV0fny0swTaDv+WjK7vqcw4cRhFfdsyKL1n+ukI+ooBxn3bVQnyrn06WpI50w=="], + "@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.63.4", "", { "os": "linux", "cpu": "none" }, "sha512-piU6BxeqA3O9KSu3kRCIQQtNqFFaTu21SEV4FwaRZowpnj3bLaWPZHw+xFqCs0XlJ+aOH3PTRWGoglH+mKA/OA=="], - "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.63.1", "", { "os": "linux", "cpu": "x64" }, "sha512-4h6XqthmB4Hspji84wvgk+ElodTsGj+dbZqHJHHtKxj4mYq0ANSEEPX9ys3moJueqsRjwpaJYH7874Itwnj2ow=="], + "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.63.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-/5PGpHwqt2EEEOUs1XwzubE/ucr0dWDQ+to3zqi4Ds7EWpwtQ79wXc4JBoxqj/OwpawTsKWzJxHfSuBOq3DrWA=="], - "@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.63.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-dlfCOa87o1VAYegLQ9EKilx2JCeRofiyPGhTCmqnuXZ6bMPiycO1rq1+sKoulAp7pGLIsTIw+1x5R+zgh5LhhA=="], + "@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.63.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-cX3beZDLWt7G2oJF+nhChiT+qtaihs+S2xi7ziGmVB+2pwPng6D0Ed0HmElQOgv2UsUmSJJLGwpBao/3TDx3VA=="], - "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.63.1", "", { "os": "none", "cpu": "arm64" }, "sha512-cjkLbOlfcm3QGhMM1J5zaZjsw1GggbN6rw9UTSSRrPrR1KkcXnN7Uq9rPw34xImQ9VOY9GN+6u2Zj80B9ptkcw=="], + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.63.4", "", { "os": "linux", "cpu": "none" }, "sha512-1uz2mGWHyptR7DgHHrlbdRAjXK7v7elGZ9lMja910/RP+ZYbX6xAmCiU9UZSX4hqmgtHMv6lr5l3kq1HIOpcag=="], - "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.63.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-Li1KdUnWGE4N3e1F/B4RTB1ms+nG4WBgjByO46pkeBVX/2UBsY53xf5vK9WygVmnH3RwncIST7lkSdLSY6P9lg=="], + "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.63.4", "", { "os": "linux", "cpu": "none" }, "sha512-nLS8topojxyz7SRpKR2IODRpQ0XPZ+xaOXvT3+hqK/Uy8Lo5HFgkkIBiIrCu5tL5YqzTvgovGw55PwpahTAGig=="], - "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.63.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-t4ZYOSoLTgwhuFMrmTMLx/+i1DQVK7HYqMc6kY46EApwi8X0nIVphzdNoThU3xt6n+N5urG1/gxBdCaKDLavfg=="], + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.63.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-gs7DRKotr3l3q+jGPQBjH0ng1FjlEDm5ueQrkw5JtQvtLyEIcLASqAEaor56BhkKRzk+IcQzrcanBdb/bBQn8g=="], - "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.63.1", "", { "os": "win32", "cpu": "x64" }, "sha512-RgroPfMmKlD1RzSDxvwgcPiy2HNQKoYV7OmwIXDsk73uKW5t6B/V8KIy27SMv/FNXFo/oSBtWc9J0X7t91ezZg=="], + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.63.4", "", { "os": "linux", "cpu": "x64" }, "sha512-791ET7W17NnScOZM7h4dX5hYspxE28htPFsb1awY/NRR8+PRNkS53e475rDdxXXDrP+kwnCcNWg9CX5ztn/Aqw=="], - "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.63.1", "", { "os": "win32", "cpu": "x64" }, "sha512-at8QVep6S3h5Y6gSbdGU06bRY5WJkf6WUduM9YtvYMbYhB1MOFfUgc6kehitQXzOtMSaT70q7f9ydPhpqu821w=="], + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.63.4", "", { "os": "linux", "cpu": "x64" }, "sha512-iwZQRcmj7g88g3tzefIrQY7qvmuA/cfYwhrDtTBhsmukO4U2huVO5W+86XacUMRvdSFVAc6kZUZy21JaRwiB9w=="], + + "@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.63.4", "", { "os": "openbsd", "cpu": "x64" }, "sha512-dVHFp9gRWrdTpnqQuGfCwd7hOQDatK1VCP2iWhLY/cGrOQs/ucFzJ6A5SRqbXX12ZDI8EUuejSM5kwg+ja7Png=="], + + "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.63.4", "", { "os": "none", "cpu": "arm64" }, "sha512-t3NlauOW6gxZVVFcBEnO62Cb4wbyDFL416gTg1uFI/2tgqYQlf69FbSE115Ajre9I+c26Lk4mcmdFUsS/DGifQ=="], + + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.63.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-xWuIaSye5FWZF8+UYtVEcHtRJDN5kN9Kfgxx3Kq8XIov9KSKbc1fiqQCm90SKrgQbUXZelbnUhnlUJmfSE7P9A=="], + + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.63.4", "", { "os": "win32", "cpu": "ia32" }, "sha512-9ALJJUOg/ZflMJepVo2PlgsGxSaxN7SQ4Z8GoZfVlarWr6r3rkHUNsd/zAio7p4YMtChSMXPionxej4Hkf6CXQ=="], + + "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.63.4", "", { "os": "win32", "cpu": "x64" }, "sha512-blj9z5qx/Pv4WU0W1NMFDB97e0JH5ed+aZGywW8WCvp/NhWX/4PFAq5uu6Q0AebNn+Vo6KzUYDT++JzTT5ojlQ=="], + + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.63.4", "", { "os": "win32", "cpu": "x64" }, "sha512-Erx822VRBwLa124shbj+wNXe//BOgMEctDV0m1aqTQdNO1S69DgNUCFKC1RCeZfixs1J31l6igk1ziyXErbigQ=="], "@scalar/helpers": ["@scalar/helpers@0.5.1", "", {}, "sha512-9VvPfv8b+YZVIFwR3SWeq4Y8ij/kU3/kf2M6NKcbf2iVyh63d8s0ssap5m/nOhiz/Puidv/29MAJlJCA0LRssA=="], @@ -152,7 +164,7 @@ "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], - "@types/node": ["@types/node@22.20.2", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-xlvWf4Vs9n1PEVYwP1n4vvG07M6y8WgvJ2t0vbrWTmijsIHp1cS+uJ2kMIRdY3nHZK0nCYKrPeD171+SzF4/zw=="], + "@types/node": ["@types/node@22.20.4", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-zJRE40jpHtKqE/C4fgHrAKQLJuSpzEnP9ff9Y7YtoR3Wd2pwqzlekDeEuUQXjRd+QCYnVnNwuJYmhdk9XV8gvA=="], "@vitest/expect": ["@vitest/expect@2.1.9", "", { "dependencies": { "@vitest/spy": "2.1.9", "@vitest/utils": "2.1.9", "chai": "^5.1.2", "tinyrainbow": "^1.2.0" } }, "sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw=="], @@ -184,7 +196,7 @@ "boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="], - "brace-expansion": ["brace-expansion@5.0.9", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg=="], + "brace-expansion": ["brace-expansion@5.0.12", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ=="], "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], @@ -272,7 +284,7 @@ "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], - "fast-uri": ["fast-uri@3.1.7", "", {}, "sha512-dOvZVzjdZdz7phd9v6jCbwxrBW3fK6n8Rc0CtdmM4bumzMnxywBYhuph6J819RRw/ku+rLbelwfMunktuzVVHg=="], + "fast-uri": ["fast-uri@3.1.8", "", {}, "sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg=="], "finalhandler": ["finalhandler@2.1.1", "", { "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "on-finished": "^2.4.1", "parseurl": "^1.3.3", "statuses": "^2.0.1" } }, "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA=="], @@ -294,7 +306,7 @@ "hasown": ["hasown@2.0.4", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A=="], - "hono": ["hono@4.13.7", "", {}, "sha512-c8/gF9ac8Y78/agExVocyLevgR+JlpNB444Py0FSX8pJoPdYUfUzRcXtYEYGwt6l19qIlVZPN5Mfsw9jFShmQQ=="], + "hono": ["hono@4.13.8", "", {}, "sha512-/Gng7NfoykZl2pjukW5Z6+8Yxm3BPRf86GTbQnt0SbySkvax4fyL4H3HhY1cCpBGmiW9XDRFzRV+CXK2W8QudQ=="], "htmlparser2": ["htmlparser2@10.1.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", "domutils": "^3.2.2", "entities": "^7.0.1" } }, "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ=="], @@ -306,7 +318,7 @@ "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], - "ip-address": ["ip-address@10.7.0", "", {}, "sha512-BGFsyJd5mpXp3rK6jIdADLNgpJUK1jnjzvYF8lK+VyDab9JAmqN0YOKDdP17HlgKb2+ehPgDc8EtnRLbGCAMhA=="], + "ip-address": ["ip-address@10.7.2", "", {}, "sha512-7H/2gFSIitxc0hG3nOI1glS8QLo/EHBFFLk8vEUjXY/xu0AdL8jZ9U1IzO2PUm0d2D/ofQcAifb0g6OBkt8U7w=="], "ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="], @@ -378,7 +390,7 @@ "postcss": ["postcss@8.5.28", "", { "dependencies": { "nanoid": "^3.3.18", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A=="], - "proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="], + "proxy-addr": ["proxy-addr@2.0.8", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-5nnx0yGyVUcY6t9RnWcARWtwT9F1D8O9rt08htPvnd49W1IgZtmLkhu9WfMzQj1cFxjHIO6connUNVW5k7AVyQ=="], "qs": ["qs@6.16.0", "", { "dependencies": { "es-define-property": "^1.0.1", "side-channel": "^1.1.1" } }, "sha512-h6fhOIaRrID2CbEY2fqs+7t+UXZo+MLAnU5gRIq85uFtdiUPCdsApMlHhXogKVM4HM2DVbIjGNTTYH2OcmP1vA=="], @@ -388,7 +400,7 @@ "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], - "rollup": ["rollup@4.63.1", "", { "dependencies": { "@types/estree": "1.0.9" }, "optionalDependencies": { "@napi-rs/lzma-linux-x64-gnu": "1.5.1", "@rollup/rollup-android-arm-eabi": "4.63.1", "@rollup/rollup-android-arm64": "4.63.1", "@rollup/rollup-darwin-arm64": "4.63.1", "@rollup/rollup-darwin-x64": "4.63.1", "@rollup/rollup-freebsd-arm64": "4.63.1", "@rollup/rollup-freebsd-x64": "4.63.1", "@rollup/rollup-linux-arm-gnueabihf": "4.63.1", "@rollup/rollup-linux-arm-musleabihf": "4.63.1", "@rollup/rollup-linux-arm64-gnu": "4.63.1", "@rollup/rollup-linux-arm64-musl": "4.63.1", "@rollup/rollup-linux-loong64-gnu": "4.63.1", "@rollup/rollup-linux-loong64-musl": "4.63.1", "@rollup/rollup-linux-ppc64-gnu": "4.63.1", "@rollup/rollup-linux-ppc64-musl": "4.63.1", "@rollup/rollup-linux-riscv64-gnu": "4.63.1", "@rollup/rollup-linux-riscv64-musl": "4.63.1", "@rollup/rollup-linux-s390x-gnu": "4.63.1", "@rollup/rollup-linux-x64-gnu": "4.63.1", "@rollup/rollup-linux-x64-musl": "4.63.1", "@rollup/rollup-openbsd-x64": "4.63.1", "@rollup/rollup-openharmony-arm64": "4.63.1", "@rollup/rollup-win32-arm64-msvc": "4.63.1", "@rollup/rollup-win32-ia32-msvc": "4.63.1", "@rollup/rollup-win32-x64-gnu": "4.63.1", "@rollup/rollup-win32-x64-msvc": "4.63.1", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-3Df9jsstwhccuEfmAMi9l8XUh/GOkVObmFTU7CCVBysEbcOZLl84jCtaAZMcPiMz2EGKsATzQcU+Xr3n/wU6cg=="], + "rollup": ["rollup@4.63.4", "", { "dependencies": { "@types/estree": "1.0.9" }, "optionalDependencies": { "@napi-rs/lzma-linux-x64-gnu": "1.5.1", "@rollup/rollup-android-arm-eabi": "4.63.4", "@rollup/rollup-android-arm64": "4.63.4", "@rollup/rollup-darwin-arm64": "4.63.4", "@rollup/rollup-darwin-x64": "4.63.4", "@rollup/rollup-freebsd-arm64": "4.63.4", "@rollup/rollup-freebsd-x64": "4.63.4", "@rollup/rollup-linux-arm-gnueabihf": "4.63.4", "@rollup/rollup-linux-arm-musleabihf": "4.63.4", "@rollup/rollup-linux-arm64-gnu": "4.63.4", "@rollup/rollup-linux-arm64-musl": "4.63.4", "@rollup/rollup-linux-loong64-gnu": "4.63.4", "@rollup/rollup-linux-loong64-musl": "4.63.4", "@rollup/rollup-linux-ppc64-gnu": "4.63.4", "@rollup/rollup-linux-ppc64-musl": "4.63.4", "@rollup/rollup-linux-riscv64-gnu": "4.63.4", "@rollup/rollup-linux-riscv64-musl": "4.63.4", "@rollup/rollup-linux-s390x-gnu": "4.63.4", "@rollup/rollup-linux-x64-gnu": "4.63.4", "@rollup/rollup-linux-x64-musl": "4.63.4", "@rollup/rollup-openbsd-x64": "4.63.4", "@rollup/rollup-openharmony-arm64": "4.63.4", "@rollup/rollup-win32-arm64-msvc": "4.63.4", "@rollup/rollup-win32-ia32-msvc": "4.63.4", "@rollup/rollup-win32-x64-gnu": "4.63.4", "@rollup/rollup-win32-x64-msvc": "4.63.4", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-4U0liVayNIoLp3GFl1FcI8561WepLnZ1rqfraGh7S9B3Ur5F9S283y8Futii7RUU2C/97tOBmBy7nYvhoiOpbQ=="], "router": ["router@2.2.0", "", { "dependencies": { "debug": "^4.4.0", "depd": "^2.0.0", "is-promise": "^4.0.0", "parseurl": "^1.3.3", "path-to-regexp": "^8.0.0" } }, "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ=="], @@ -468,9 +480,9 @@ "yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="], - "yaml": ["yaml@2.9.0", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA=="], + "yaml": ["yaml@2.9.1", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw=="], - "zod": ["zod@4.6.2", "", {}, "sha512-lh5RCAGFa1Cm2hjtNwLQhSs/AsqdWnTQaBER9fEwN/88pSh7KOtJavtBx/0VlkN/uFd61SwYmljLMDAsHlvzBQ=="], + "zod": ["zod@4.6.5", "", {}, "sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q=="], "zod-to-json-schema": ["zod-to-json-schema@3.25.2", "", { "peerDependencies": { "zod": "^3.25.28 || ^4" } }, "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA=="], diff --git a/scripts/surface-package-gate.sh b/scripts/surface-package-gate.sh index e6cbd0f0a..c6650d36b 100755 --- a/scripts/surface-package-gate.sh +++ b/scripts/surface-package-gate.sh @@ -19,7 +19,18 @@ if [[ -z "$tarball" ]]; then exit 1 fi -npm ci --prefix "$repo_root/packages/sdk" --ignore-scripts +# --force: the SDK's lockfile carries the LAST-PUBLISHED surface, +# whose peer range pins an exact @relayfile/relay-helpers. Whenever that pin +# moves, the published surface and the freshly-packed one below disagree and +# npm refuses both orderings (old pin vs. new tarball, new pin vs. old +# registry copy). The registry copy is a placeholder that the next command +# overwrites, so its peer range is not a constraint worth enforcing here. +# --legacy-peer-deps only relaxes CONFLICTS; it also stops npm resolving peers +# on the fly, so the committed lockfile must already carry them (adapter-core +# 0.6 added a @relayfile/sdk peer that 0.5 did not have). The lockfile is +# generated with `npm install --force`, which records peers and overrides the +# same conflict, so `npm ci` here only has to install what is already pinned. +npm ci --prefix "$repo_root/packages/sdk" --ignore-scripts --legacy-peer-deps # Override the registry-installed @relayflows/surface with the freshly-packed # local tarball. Without this the SDK's typecheck reads the last-published @@ -27,7 +38,7 @@ npm ci --prefix "$repo_root/packages/sdk" --ignore-scripts # published surface that hasn't shipped it yet, keeping the SDK PR draft # forever. `--no-save` keeps package.json / package-lock.json unchanged so # this override does not leak into the committed manifest. -npm install "$tarball" --prefix "$repo_root/packages/sdk" --no-save --ignore-scripts +npm install "$tarball" --prefix "$repo_root/packages/sdk" --no-save --ignore-scripts --force npm run typecheck --prefix "$repo_root/packages/sdk" From ce1d07d811d97358414b7afb6dd9beb95583aada Mon Sep 17 00:00:00 2001 From: Khaliq Date: Mon, 21 Sep 2026 08:14:20 -0700 Subject: [PATCH 3/4] fix(sdk): resolve the surface peer conflict with an override, not CI flags MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reverts the surface-package-gate.sh change from the previous commit and fixes the same deadlock declaratively instead. The conflict: packages/sdk depends on the LAST-PUBLISHED @relayflows/surface, whose peer range pins an exact @relayfile/relay-helpers. Bumping this repo's pin puts the SDK's own dependency (0.4.12) against that published peer (0.4.11), and npm refuses. Patching the gate script was not enough — the same `npm ci --prefix packages/sdk` runs in four more places: .github/workflows/schema-publish.yml (validate) .github/workflows/cloud-runtime-artifact.yml (linux-x64-artifact) .github/workflows/publish.yml x3, so it would have broken the release, not just PR CI Spraying --legacy-peer-deps across five call sites also has a second cost: it stops npm resolving peers on the fly, and adapter-core 0.6 added a @relayfile/sdk peer that 0.5 did not have. An `overrides` entry pointing the published surface's peer at the root project's own version fixes the resolution in one committed place, for every caller, with no workflow or script edits. It becomes a no-op once a surface carrying peer 0.4.12 is published, and can be dropped then. Verified: `npm ci --prefix packages/sdk --ignore-scripts` exits 0 with the @relayfile/sdk peer installed, and scripts/surface-package-gate.sh — byte identical to main — exits 0 with PACKED_RUNTIME_OK, PACKED_TYPESCRIPT_OK, SDK 25/25 and surface 50/50. Co-Authored-By: Claude Opus 5 (1M context) --- packages/sdk/package.json | 5 +++++ scripts/surface-package-gate.sh | 15 ++------------- 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/packages/sdk/package.json b/packages/sdk/package.json index 571633404..9e2fe91da 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -80,5 +80,10 @@ "@agent-relay/sdk": { "optional": true } + }, + "overrides": { + "@relayflows/surface": { + "@relayfile/relay-helpers": "$@relayfile/relay-helpers" + } } } diff --git a/scripts/surface-package-gate.sh b/scripts/surface-package-gate.sh index c6650d36b..e6cbd0f0a 100755 --- a/scripts/surface-package-gate.sh +++ b/scripts/surface-package-gate.sh @@ -19,18 +19,7 @@ if [[ -z "$tarball" ]]; then exit 1 fi -# --force: the SDK's lockfile carries the LAST-PUBLISHED surface, -# whose peer range pins an exact @relayfile/relay-helpers. Whenever that pin -# moves, the published surface and the freshly-packed one below disagree and -# npm refuses both orderings (old pin vs. new tarball, new pin vs. old -# registry copy). The registry copy is a placeholder that the next command -# overwrites, so its peer range is not a constraint worth enforcing here. -# --legacy-peer-deps only relaxes CONFLICTS; it also stops npm resolving peers -# on the fly, so the committed lockfile must already carry them (adapter-core -# 0.6 added a @relayfile/sdk peer that 0.5 did not have). The lockfile is -# generated with `npm install --force`, which records peers and overrides the -# same conflict, so `npm ci` here only has to install what is already pinned. -npm ci --prefix "$repo_root/packages/sdk" --ignore-scripts --legacy-peer-deps +npm ci --prefix "$repo_root/packages/sdk" --ignore-scripts # Override the registry-installed @relayflows/surface with the freshly-packed # local tarball. Without this the SDK's typecheck reads the last-published @@ -38,7 +27,7 @@ npm ci --prefix "$repo_root/packages/sdk" --ignore-scripts --legacy-peer-deps # published surface that hasn't shipped it yet, keeping the SDK PR draft # forever. `--no-save` keeps package.json / package-lock.json unchanged so # this override does not leak into the committed manifest. -npm install "$tarball" --prefix "$repo_root/packages/sdk" --no-save --ignore-scripts --force +npm install "$tarball" --prefix "$repo_root/packages/sdk" --no-save --ignore-scripts npm run typecheck --prefix "$repo_root/packages/sdk" From 0b3a75e924337d8de94cdcffeb1a1da95f53eabe Mon Sep 17 00:00:00 2001 From: Khaliq Date: Mon, 21 Sep 2026 22:04:04 -0700 Subject: [PATCH 4/4] fix(workflows): correct the parity flow's pin field, scratch tree and staging MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Review findings on the added flow, all of which would have made a real run fail rather than being style points. 1. The pin is read and rewritten under `dependencies`, but surface declares the helper library under `peerDependencies`. `cur` was always undefined, so the flow threw before installing, regenerating or publishing — the whole path was dead. (Four reviewers independently caught this one.) 2. The scratch tree was not gitignored. The no-op decline reads `git status --porcelain`, so `parity/` made every run look changed, skipped the decline, and then reached `git commit` with nothing staged. `parity/` now sits beside `review/` in .gitignore, and the flow asserts that with `git check-ignore` rather than trusting it, since the decline branch silently depends on it. 3. `git add -A` would sweep unrelated local edits into the automation branch and force-push them. The flow now refuses a dirty worktree up front, before it mutates anything. With the scratch tree ignored, the `':(exclude)parity'` pathspec is no longer needed and is dropped. Note it was not itself broken: one review said an exclude-only pathspec exits 1, which does not reproduce — `git add -A ':(exclude)parity'` exits 0. flows check: CHECK PASSED. typecheck:examples: 0 errors from this file. Co-Authored-By: Claude Opus 5 (1M context) --- .gitignore | 1 + workflows/gitlab-surface-parity.flow.ts | 35 ++++++++++++++++++++----- 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index 2ad26b6af..80dd4883f 100644 --- a/.gitignore +++ b/.gitignore @@ -24,3 +24,4 @@ dist/ # workflows/pr-review.flow.ts scratch dir (findings, diff, publisher script) review/ +parity/ diff --git a/workflows/gitlab-surface-parity.flow.ts b/workflows/gitlab-surface-parity.flow.ts index 78e71e2a3..2b582a770 100644 --- a/workflows/gitlab-surface-parity.flow.ts +++ b/workflows/gitlab-surface-parity.flow.ts @@ -83,7 +83,26 @@ export default flow( ); } + // The scratch tree is gitignored (`parity/`, beside `review/` for the + // PR-review flow). That is load-bearing, not tidiness: the no-op decline + // below reads `git status --porcelain`, so an unignored scratch directory + // would make every run look changed, skip the decline, and then fail at + // `git commit` with nothing staged. + // Nothing below is safe in a dirty checkout: STEP 7 stages with `git add -A` + // and force-pushes, so unrelated local edits would ride along to the + // automation branch. Refuse before touching anything rather than after. + const dirty = await f.run("git status --porcelain | head -c 4000"); + if (dirty.trim().length > 0) { + throw new Error( + "gitlab-surface-parity: refusing to run in a dirty worktree; commit or stash first:\n" + dirty.trim().slice(0, 1000), + ); + } + await f.run("rm -rf parity && mkdir -p parity"); + const ignored = await f.run("git check-ignore -q parity && echo ignored || echo tracked"); + if (ignored.trim() !== "ignored") { + throw new Error("gitlab-surface-parity: parity/ must be gitignored; see .gitignore"); + } // STEP 1 — probe the registry for a relay-helpers whose TRANSITIVE // adapter-core actually carries the GitLab resources. This installs each @@ -125,15 +144,17 @@ export default flow( } // STEP 3 — bump the pin, reinstall, regenerate. The pin is exact in this - // repository (packages/surface/package.json), so it is rewritten from the - // probe's own answer rather than from a range. + // repository and lives under `peerDependencies` (surface declares the + // helper library as a peer, not a dependency), so it is rewritten there + // from the probe's own answer rather than from a range. await f.run( `node -e '` + `const fs=require("fs"); const probe=JSON.parse(fs.readFileSync("${PROBE}","utf8"));` + `const p="${SURFACE_PKG}"; const m=JSON.parse(fs.readFileSync(p,"utf8"));` - + `const cur=m.dependencies["@relayfile/relay-helpers"];` - + `if(cur===undefined) throw new Error("no @relayfile/relay-helpers dependency in "+p);` - + `m.dependencies["@relayfile/relay-helpers"]=probe.version;` + + `const peers=m.peerDependencies||{};` + + `const cur=peers["@relayfile/relay-helpers"];` + + `if(cur===undefined) throw new Error("no @relayfile/relay-helpers peer dependency in "+p);` + + `peers["@relayfile/relay-helpers"]=probe.version;` + `fs.writeFileSync(p, JSON.stringify(m,null,2)+"\\n");` + `console.log(cur+" -> "+probe.version);'`, { timeout: "1m" }, @@ -189,14 +210,14 @@ export default flow( // same PR instead of opening a second one. `gh` uses the sandbox's // GH_TOKEN, the same credential git has there (see pr-review.flow.ts: // the relayfile GitHub mount is not attached to authored Cloud runs). - const changed = await f.run("git status --porcelain | head -c 4000"); + const changed = await f.run("git status --porcelain | head -c 4000"); // parity/ is ignored, so this is real work only if (changed.trim().length === 0) { await f.run(`printf '%s\\n' 'No change: the pin already resolved a catalog with the GitLab resources.' >> ${REPORT}`); return f.done("declined"); } await f.run( `git checkout -B ${shellWord(branch)} && ` - + `git add -A ':(exclude)parity' && ` + + `git add -A && ` + `git -c user.name='relayflow' -c user.email='flows@agent-relay.com' commit -m ` + shellWord( "feat(surface): give the gitlab helper its issue and merge-request surface\n\n"