@vostride/agent-qa-plugin-kit 0.3.0 → 0.3.2

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/dist/index.cjs CHANGED
@@ -796,14 +796,111 @@ function emitPluginFiles(input) {
796
796
  packageJsonChanged
797
797
  };
798
798
  }
799
+ // src/vendor-api.ts
800
+ function vendorFailureKind(status, kinds) {
801
+ if (status === void 0) return "unreachable";
802
+ const own = kinds?.[status];
803
+ if (own !== void 0) return own;
804
+ if (status === 401) return "auth";
805
+ if (status === 429) return "capacity";
806
+ return "refused";
807
+ }
808
+ const MAX_REASON_LENGTH = 200;
809
+ function oneLine(text) {
810
+ const line = text.replace(/\s+/g, " ").trim();
811
+ return line.length > MAX_REASON_LENGTH ? `${line.slice(0, MAX_REASON_LENGTH)}…` : line;
812
+ }
813
+ function parseJson(text) {
814
+ try {
815
+ return JSON.parse(text);
816
+ } catch {
817
+ return;
818
+ }
819
+ }
820
+ function vendorReason(body) {
821
+ if (typeof body !== "object" || body === null) return void 0;
822
+ for (const field of ["message", "error"]) {
823
+ const value = body[field];
824
+ if (typeof value === "string" && value.trim() !== "") return oneLine(value);
825
+ }
826
+ }
827
+ function retryWait(retryAfter) {
828
+ const value = retryAfter?.trim() ?? "";
829
+ if (value === "") return "";
830
+ return /^\d+$/.test(value) ? `, retry after ${value} s` : `, retry after ${oneLine(value)}`;
831
+ }
832
+ function causeText(error) {
833
+ if (!(error instanceof Error)) return oneLine(String(error));
834
+ const cause = error.cause;
835
+ if (cause instanceof Error) return oneLine("code" in cause && typeof cause.code === "string" ? cause.code : cause.message);
836
+ return oneLine(error.message);
837
+ }
838
+ function createVendorApi(input) {
839
+ const base = input.baseUrl.endsWith("/") ? input.baseUrl : `${input.baseUrl}/`;
840
+ return {
841
+ async send(method, path, init = {}) {
842
+ const url = new URL(path, base);
843
+ const headers = new Headers(init.headers);
844
+ for (const [name, value] of Object.entries(input.headers ?? {})) try {
845
+ headers.set(name, value);
846
+ } catch {
847
+ throw new PluginError(`${input.vendor} credentials hold a character a header cannot carry.`, { kind: "auth" });
848
+ }
849
+ try {
850
+ return await fetch(url, {
851
+ method,
852
+ headers,
853
+ ...init.body === void 0 ? {} : { body: init.body },
854
+ ...init.signal === void 0 ? {} : { signal: init.signal }
855
+ });
856
+ } catch (error) {
857
+ if (init.signal?.aborted === true) throw error;
858
+ throw new PluginError(`${input.vendor} could not be reached at ${url.origin}: ${causeText(error)}`, { kind: "unreachable" });
859
+ }
860
+ },
861
+ async failure(response, request, extra = {}) {
862
+ const message = vendorReason(parseJson(await response.text().catch(() => "")));
863
+ const reason = message === void 0 ? "" : `: ${message}`;
864
+ const wait = response.status === 429 ? retryWait(response.headers.get("retry-after")) : "";
865
+ return new PluginError(`${input.vendor} answered ${response.status} to ${request}${reason}${wait}`, {
866
+ kind: vendorFailureKind(response.status, input.kinds),
867
+ ...extra.handle === void 0 ? {} : { handle: extra.handle }
868
+ });
869
+ },
870
+ async json(response) {
871
+ return parseJson(await response.text());
872
+ }
873
+ };
874
+ }
875
+ const PLAIN_TWIN = {
876
+ https: "http:",
877
+ wss: "ws:"
878
+ };
879
+ function isLoopback(hostname) {
880
+ return hostname === "localhost" || hostname === "[::1]" || /^127(?:\.\d{1,3}){3}$/.test(hostname);
881
+ }
882
+ function checkEndpoints(options, endpoints) {
883
+ for (const { path, scheme } of endpoints) {
884
+ const value = options[path];
885
+ if (value === void 0) continue;
886
+ const url = URL.parse(String(value));
887
+ if (!(url !== null && url.username === "" && url.password === "" && (url.protocol === `${scheme}:` || url.protocol === PLAIN_TWIN[scheme] && isLoopback(url.hostname)))) throw new PluginError(`${path} must use ${scheme}:// with no user or password, unless it points at this machine.`, {
888
+ kind: "refused",
889
+ path
890
+ });
891
+ }
892
+ }
799
893
  exports.CANCEL_ANSWER_GRACE_MS = CANCEL_ANSWER_GRACE_MS;
800
894
  exports.HOST_PID_POLL_MS = HOST_PID_POLL_MS;
801
895
  exports.PluginError = PluginError;
896
+ exports.checkEndpoints = checkEndpoints;
897
+ exports.createVendorApi = createVendorApi;
802
898
  exports.credential = credential;
803
899
  exports.definePlugin = definePlugin;
804
900
  exports.emitPluginFiles = emitPluginFiles;
805
901
  exports.pluginManifest = pluginManifest;
806
902
  exports.runPlugin = runPlugin;
903
+ exports.vendorFailureKind = vendorFailureKind;
807
904
  Object.defineProperty(exports, "z", {
808
905
  enumerable: true,
809
906
  get: function() {
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["z","z","existsSync","join","dirname","readFileSync","format","isRecord","dirname","realpathSync","inspect","z","z","join","readFileSync","isDeepStrictEqual"],"sources":["../src/credential.ts","../src/protocol/messages.ts","../src/define-plugin.ts","../src/package-root.ts","../src/protocol/framing.ts","../src/run-plugin.ts","../src/protocol/manifest.ts","../src/emit.ts"],"sourcesContent":["import { z } from 'zod'\n\n// No pattern or format: a config holds a secret reference here, not the secret itself.\nexport function credential(description?: string) {\n return z.string().meta({ credential: true, ...(description ? { description } : {}) })\n}\n","import { z } from 'zod'\n\nexport const PLUGIN_PROTOCOL_VERSION = 1\n\nexport const PLUGIN_METHODS = [\n 'initialize',\n 'check',\n 'acquire',\n 'uploadApp',\n 'started',\n 'end',\n 'release',\n 'shutdown',\n] as const\nexport type PluginMethod = (typeof PLUGIN_METHODS)[number]\n\nexport const OPTIONAL_PLUGIN_METHODS = ['check', 'uploadApp', 'started', 'end'] as const\nexport type OptionalPluginMethod = (typeof OPTIONAL_PLUGIN_METHODS)[number]\n\nexport const PLUGIN_SERVES = ['playwright', 'cdp', 'appium'] as const\nexport type PluginServe = (typeof PLUGIN_SERVES)[number]\n\nexport const PLUGIN_RUN_FACTS = ['testName', 'runId', 'failure'] as const\nexport type PluginRunFact = (typeof PLUGIN_RUN_FACTS)[number]\n\nexport const PLUGIN_FAILURE_KINDS = [\n 'unreachable',\n 'auth',\n 'capacity',\n 'timeout',\n 'version',\n 'refused',\n 'ended',\n 'lost',\n] as const\nexport type PluginFailureKind = (typeof PLUGIN_FAILURE_KINDS)[number]\n\nexport const PLUGIN_ERROR_CODES = {\n parse: -32700,\n invalidRequest: -32600,\n methodNotFound: -32601,\n invalidParams: -32602,\n plugin: -32000,\n cancelled: -32800,\n} as const\n\nexport const CANCEL_METHOD = '$/cancel'\nexport const PROGRESS_METHOD = '$/progress'\n\nexport const MAX_MESSAGE_BYTES = 1024 * 1024\n\nconst JsonObjectSchema = z.record(z.string(), z.unknown())\nconst HandleSchema = z.json()\nconst RequestIdSchema = z.union([z.string(), z.number()])\n\nexport const InitializeParamsSchema = z.object({\n protocolVersions: z.array(z.number().int()),\n host: z.object({\n pid: z.number().int(),\n agentQaVersion: z.string(),\n playwrightVersion: z.string(),\n webdriverioVersion: z.string(),\n }),\n entry: z.string(),\n options: JsonObjectSchema,\n runFacts: z.object({ runId: z.string().optional() }).optional(),\n})\nexport type InitializeParams = z.infer<typeof InitializeParamsSchema>\n\nexport const InitializeResultSchema = z.object({\n protocolVersion: z.number().int(),\n plugin: z.object({ name: z.string(), version: z.string() }),\n serves: z.array(z.enum(PLUGIN_SERVES)),\n methods: z.array(z.enum(OPTIONAL_PLUGIN_METHODS)),\n})\nexport type InitializeResult = z.infer<typeof InitializeResultSchema>\n\nexport const CheckParamsSchema = z.object({\n remotes: z.array(z.object({ name: z.string(), settings: JsonObjectSchema })),\n})\nexport type CheckParams = z.infer<typeof CheckParamsSchema>\n\nexport const CheckResultSchema = z.object({\n state: z.enum(['ok', 'warn']),\n lines: z.array(z.string()),\n})\nexport type CheckResult = z.infer<typeof CheckResultSchema>\n\nconst WebSessionSchema = z.object({\n platform: z.literal('web'),\n engine: z.enum(['chromium', 'firefox', 'webkit']),\n context: z.enum(['new', 'reuse']),\n})\n\nconst DeviceSessionSchema = z.object({\n platform: z.enum(['android', 'ios']),\n capabilities: JsonObjectSchema,\n})\n\nexport const AcquireParamsSchema = z.object({\n remote: z.string(),\n settings: JsonObjectSchema,\n session: z.discriminatedUnion('platform', [WebSessionSchema, DeviceSessionSchema]),\n run: z.object({ testName: z.string().optional() }).optional(),\n})\nexport type AcquireParams = z.infer<typeof AcquireParamsSchema>\n\nexport const AcquireResultSchema = z.object({\n handle: HandleSchema,\n protocol: z.enum(PLUGIN_SERVES),\n url: z.string(),\n headers: z.record(z.string(), z.string()).optional(),\n capabilities: JsonObjectSchema.optional(),\n mask: z.array(z.string()).optional(),\n link: z.string().optional(),\n})\nexport type AcquireResult = z.infer<typeof AcquireResultSchema>\n\nexport const UploadAppParamsSchema = z.object({\n remote: z.string(),\n settings: JsonObjectSchema,\n platform: z.enum(['android', 'ios']),\n path: z.string(),\n sha256: z.string(),\n size: z.number().int().nonnegative(),\n})\nexport type UploadAppParams = z.infer<typeof UploadAppParamsSchema>\n\nexport const UploadAppResultSchema = z.object({ ref: z.string() })\nexport type UploadAppResult = z.infer<typeof UploadAppResultSchema>\n\nexport const StartedParamsSchema = z.object({\n handle: HandleSchema,\n sessionId: z.string().optional(),\n})\nexport type StartedParams = z.infer<typeof StartedParamsSchema>\n\nexport const StartedResultSchema = z.object({\n link: z.string().optional(),\n appiumVersion: z.string().optional(),\n})\nexport type StartedResult = z.infer<typeof StartedResultSchema>\n\nexport const EndParamsSchema = z.object({\n handle: HandleSchema,\n outcome: z.enum(['passed', 'failed', 'error', 'cancelled']),\n reason: z.string().optional(),\n})\nexport type EndParams = z.infer<typeof EndParamsSchema>\n\nexport const ReleaseParamsSchema = z.object({ handle: HandleSchema })\nexport type ReleaseParams = z.infer<typeof ReleaseParamsSchema>\n\nexport const CancelParamsSchema = z.object({ id: RequestIdSchema })\nexport type CancelParams = z.infer<typeof CancelParamsSchema>\n\nexport const ProgressParamsSchema = z.object({\n id: RequestIdSchema,\n message: z.string(),\n queued: z.number().int().nonnegative().optional(),\n percent: z.number().min(0).max(100).optional(),\n})\nexport type ProgressParams = z.infer<typeof ProgressParamsSchema>\n\nexport const PluginErrorDataSchema = z.object({\n kind: z.enum(PLUGIN_FAILURE_KINDS),\n path: z.string().optional(),\n handle: HandleSchema.optional(),\n supported: z.array(z.number().int()).optional(),\n requested: z.array(z.number().int()).optional(),\n})\nexport type PluginErrorData = z.infer<typeof PluginErrorDataSchema>\n","import type { z } from 'zod'\nimport {\n OPTIONAL_PLUGIN_METHODS,\n type AcquireParams,\n type AcquireResult,\n type CheckResult,\n type EndParams,\n type InitializeParams,\n type OptionalPluginMethod,\n type PluginFailureKind,\n type PluginRunFact,\n type PluginServe,\n type StartedParams,\n type StartedResult,\n type UploadAppParams,\n type UploadAppResult,\n} from './protocol/messages.js'\n\ntype Json = z.core.util.JSONType\ntype Awaitable<T> = T | Promise<T>\n\nexport interface PluginErrorOptions {\n kind: PluginFailureKind\n path?: string\n handle?: Json\n}\n\nexport class PluginError extends Error {\n readonly kind: PluginFailureKind\n readonly path: string | undefined\n readonly handle: Json | undefined\n\n constructor(message: string, options: PluginErrorOptions) {\n super(message)\n this.name = 'PluginError'\n this.kind = options.kind\n this.path = options.path\n this.handle = options.handle\n }\n}\n\nexport interface InitializeInput<Options> {\n options: Options\n host: InitializeParams['host']\n entry: string\n runFacts: InitializeParams['runFacts']\n}\n\nexport interface CheckInput<Options, Settings> {\n options: Options\n remotes: { name: string; settings: Settings }[]\n}\n\nexport interface AcquireInput<Options, Settings> extends Omit<AcquireParams, 'settings'> {\n options: Options\n settings: Settings\n}\n\nexport interface UploadAppInput<Options, Settings> extends Omit<UploadAppParams, 'settings'> {\n options: Options\n settings: Settings\n}\n\nexport interface StartedInput<Options> extends StartedParams {\n options: Options\n}\n\nexport interface EndInput<Options> extends EndParams {\n options: Options\n}\n\nexport interface ReleaseInput<Options> {\n options: Options\n handle: Json\n}\n\nexport interface ShutdownInput<Options> {\n options: Options\n}\n\nexport interface PluginProgress {\n message: string\n queued?: number\n percent?: number\n}\n\nexport interface PluginCallContext {\n signal: AbortSignal\n progress(update: PluginProgress): void\n runFacts: InitializeParams['runFacts']\n}\n\nexport interface PluginSpec<OptionsSchema extends z.ZodType, SettingsSchema extends z.ZodType> {\n options: OptionsSchema\n settings: SettingsSchema\n serves: readonly PluginServe[]\n runFacts?: readonly PluginRunFact[]\n skill?: string\n initialize?(\n input: InitializeInput<z.output<OptionsSchema>>,\n ctx: PluginCallContext,\n ): Awaitable<void>\n check?(\n input: CheckInput<z.output<OptionsSchema>, z.output<SettingsSchema>>,\n ctx: PluginCallContext,\n ): Awaitable<CheckResult>\n acquire(\n input: AcquireInput<z.output<OptionsSchema>, z.output<SettingsSchema>>,\n ctx: PluginCallContext,\n ): Awaitable<AcquireResult>\n uploadApp?(\n input: UploadAppInput<z.output<OptionsSchema>, z.output<SettingsSchema>>,\n ctx: PluginCallContext,\n ): Awaitable<UploadAppResult>\n started?(\n input: StartedInput<z.output<OptionsSchema>>,\n ctx: PluginCallContext,\n ): Awaitable<StartedResult>\n end?(input: EndInput<z.output<OptionsSchema>>, ctx: PluginCallContext): Awaitable<void>\n release(input: ReleaseInput<z.output<OptionsSchema>>, ctx: PluginCallContext): Awaitable<void>\n shutdown?(input: ShutdownInput<z.output<OptionsSchema>>, ctx: PluginCallContext): Awaitable<void>\n}\n\nexport interface PluginDefinition<\n OptionsSchema extends z.ZodType = z.ZodType,\n SettingsSchema extends z.ZodType = z.ZodType,\n> extends PluginSpec<OptionsSchema, SettingsSchema> {\n methods: readonly OptionalPluginMethod[]\n}\n\nexport function definePlugin<OptionsSchema extends z.ZodType, SettingsSchema extends z.ZodType>(\n spec: PluginSpec<OptionsSchema, SettingsSchema>,\n): PluginDefinition<OptionsSchema, SettingsSchema> {\n const methods = OPTIONAL_PLUGIN_METHODS.filter((method) => typeof spec[method] === 'function')\n return { ...spec, methods }\n}\n","import { existsSync, readFileSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\n\nexport function findPackageRoot(fromDir: string): string | undefined {\n let dir = fromDir\n for (;;) {\n if (existsSync(join(dir, 'package.json'))) return dir\n const parent = dirname(dir)\n if (parent === dir) return undefined\n dir = parent\n }\n}\n\nexport function readPackageJson(packageRoot: string): Record<string, unknown> {\n const parsed: unknown = JSON.parse(readFileSync(join(packageRoot, 'package.json'), 'utf8'))\n return typeof parsed === 'object' && parsed !== null ? (parsed as Record<string, unknown>) : {}\n}\n","export function encodeMessage(message: unknown): string {\n return `${JSON.stringify(message)}\\n`\n}\n\nexport interface LineDecoderOptions {\n maxLineBytes: number\n onLine: (line: string) => void\n onOverflow: () => void\n}\n\nexport interface LineDecoder {\n push(chunk: Uint8Array | string): void\n end(): void\n}\n\nconst NEWLINE = 0x0a\n\nexport function createLineDecoder({\n maxLineBytes,\n onLine,\n onOverflow,\n}: LineDecoderOptions): LineDecoder {\n const encoder = new TextEncoder()\n const decoder = new TextDecoder()\n let parts: Uint8Array[] = []\n let size = 0\n let discarding = false\n\n const append = (segment: Uint8Array) => {\n if (discarding || segment.length === 0) return\n if (size + segment.length > maxLineBytes) {\n discarding = true\n parts = []\n size = 0\n onOverflow()\n return\n }\n parts.push(new Uint8Array(segment))\n size += segment.length\n }\n\n const finishLine = () => {\n const wasDiscarding = discarding\n const lineParts = parts\n const lineSize = size\n parts = []\n size = 0\n discarding = false\n if (wasDiscarding || lineSize === 0) return\n const bytes = new Uint8Array(lineSize)\n let offset = 0\n for (const part of lineParts) {\n bytes.set(part, offset)\n offset += part.length\n }\n const line = decoder.decode(bytes).replace(/\\r$/, '')\n if (line.trim() !== '') onLine(line)\n }\n\n return {\n push(chunk) {\n const bytes = typeof chunk === 'string' ? encoder.encode(chunk) : chunk\n let start = 0\n while (start <= bytes.length) {\n const newline = bytes.indexOf(NEWLINE, start)\n if (newline === -1) {\n append(bytes.subarray(start))\n return\n }\n append(bytes.subarray(start, newline))\n finishLine()\n start = newline + 1\n }\n },\n end() {\n finishLine()\n },\n }\n}\n","import { realpathSync, writeSync } from 'node:fs'\nimport { dirname } from 'node:path'\nimport { format, inspect } from 'node:util'\nimport type { z } from 'zod'\nimport { PluginError, type PluginCallContext, type PluginDefinition } from './define-plugin.js'\nimport { findPackageRoot, readPackageJson } from './package-root.js'\nimport { createLineDecoder, encodeMessage } from './protocol/framing.js'\nimport {\n AcquireParamsSchema,\n AcquireResultSchema,\n CANCEL_METHOD,\n CancelParamsSchema,\n CheckParamsSchema,\n CheckResultSchema,\n EndParamsSchema,\n InitializeParamsSchema,\n MAX_MESSAGE_BYTES,\n OPTIONAL_PLUGIN_METHODS,\n PLUGIN_ERROR_CODES,\n PLUGIN_METHODS,\n PLUGIN_PROTOCOL_VERSION,\n PROGRESS_METHOD,\n ReleaseParamsSchema,\n StartedParamsSchema,\n StartedResultSchema,\n UploadAppParamsSchema,\n UploadAppResultSchema,\n type InitializeParams,\n type InitializeResult,\n type OptionalPluginMethod,\n type PluginMethod,\n} from './protocol/messages.js'\n\nexport interface PluginIo {\n stdin: {\n on(event: 'data', listener: (chunk: Uint8Array | string) => void): unknown\n on(event: 'end' | 'error', listener: () => void): unknown\n }\n stdout: { write(chunk: string, callback?: (error?: Error | null) => void): unknown }\n exit(code: number): void\n entryPath?: string\n cancelAnswerGraceMs: number\n hostPidPollMs: number\n}\n\ntype RequestId = string | number\ntype Json = z.core.util.JSONType\n\nexport const CANCEL_ANSWER_GRACE_MS = 4_000\nexport const HOST_PID_POLL_MS = 1_000\nconst RELEASE_ON_CLOSE_BOUND_MS = 30_000\nconst RELEASE_ON_SIGTERM_BOUND_MS = 4_000\n\nconst SUPPORTED_PROTOCOL_VERSIONS = [PLUGIN_PROTOCOL_VERSION]\n\nclass ProtocolFailure extends Error {\n constructor(\n readonly code: number,\n message: string,\n readonly data?: Record<string, unknown>,\n ) {\n super(message)\n }\n}\n\nfunction resolveIo(io: Partial<PluginIo>): PluginIo {\n return {\n stdin: io.stdin ?? process.stdin,\n stdout: io.stdout ?? process.stdout,\n exit: io.exit ?? ((code) => process.exit(code)),\n entryPath: io.entryPath ?? process.argv[1],\n cancelAnswerGraceMs: io.cancelAnswerGraceMs ?? CANCEL_ANSWER_GRACE_MS,\n hostPidPollMs: io.hostPidPollMs ?? HOST_PID_POLL_MS,\n }\n}\n\nfunction routeStrayOutputToStderr() {\n const toLog = (...args: unknown[]) => {\n process.stderr.write(`${format(...args)}\\n`)\n }\n console.log = toLog\n console.info = toLog\n console.debug = toLog\n console.warn = toLog\n process.stdout.write = process.stderr.write.bind(process.stderr) as typeof process.stdout.write\n}\n\nfunction hostGone(hostPid: number, startPpid: number): boolean {\n if (process.ppid !== startPpid) return true\n try {\n process.kill(hostPid, 0)\n return false\n } catch (error) {\n return (error as NodeJS.ErrnoException).code === 'ESRCH'\n }\n}\n\n// Handles are JSON; two handles are the same session when their JSON is equal.\nfunction handleKey(handle: Json): string {\n const canonical = (value: Json): Json => {\n if (Array.isArray(value)) return value.map(canonical)\n if (value === null || typeof value !== 'object') return value\n return Object.fromEntries(\n Object.keys(value)\n .sort()\n .map((key) => [key, canonical(value[key] as Json)]),\n )\n }\n return JSON.stringify(canonical(handle))\n}\n\nfunction within<T>(work: Promise<T>, boundMs: number): Promise<T | undefined> {\n let timer: NodeJS.Timeout | undefined\n const bound = new Promise<undefined>((resolve) => {\n timer = setTimeout(() => resolve(undefined), boundMs)\n })\n return Promise.race([work, bound]).finally(() => clearTimeout(timer))\n}\n\ntype Outcome = { ok: true; value: unknown } | { ok: false; error: unknown }\n\ninterface PendingCall {\n method: string\n controller: AbortController\n answered: boolean\n graceTimer?: NodeJS.Timeout\n}\n\nfunction firstLine(message: string): string {\n return message.split(/\\r?\\n/, 1)[0] ?? ''\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction isRequestId(value: unknown): value is RequestId {\n return typeof value === 'string' || typeof value === 'number'\n}\n\nfunction isPluginMethod(method: string): method is PluginMethod {\n return (PLUGIN_METHODS as readonly string[]).includes(method)\n}\n\nfunction isOptionalMethod(method: PluginMethod): method is OptionalPluginMethod {\n return (OPTIONAL_PLUGIN_METHODS as readonly string[]).includes(method)\n}\n\nfunction issuePath(issue: z.core.$ZodIssue): string {\n return issue.path.map(String).join('.')\n}\n\nfunction parseParams<Schema extends z.ZodType>(\n schema: Schema,\n params: unknown,\n method: string,\n): z.output<Schema> {\n const parsed = schema.safeParse(params ?? {})\n if (parsed.success) return parsed.data\n const issue = parsed.error.issues[0]\n const where = issue === undefined ? '' : issuePath(issue)\n throw new ProtocolFailure(\n PLUGIN_ERROR_CODES.invalidParams,\n `${method} params${where === '' ? '' : ` at ${where}`}: ${issue?.message ?? 'invalid'}`,\n )\n}\n\n// A refusal's path starts with options. or settings., naming the block that holds the field.\nfunction refuse(schema: z.ZodType, value: unknown, prefix: 'options' | 'settings'): unknown {\n const parsed = schema.safeParse(value)\n if (parsed.success) return parsed.data\n const issue = parsed.error.issues[0]\n const inner = issue === undefined ? '' : issuePath(issue)\n const path = inner === '' ? undefined : `${prefix}.${inner}`\n throw new PluginError(`${path ?? prefix}: ${issue?.message ?? 'invalid'}`, {\n kind: 'refused',\n ...(path === undefined ? {} : { path }),\n })\n}\n\nfunction checkedResult(schema: z.ZodType, value: unknown, method: string): unknown {\n const parsed = schema.safeParse(value)\n if (parsed.success) return value\n const issue = parsed.error.issues[0]\n const where = issue === undefined ? '' : issuePath(issue)\n const handle =\n method === 'acquire' && isRecord(value) && value.handle !== undefined\n ? (value.handle as Json)\n : undefined\n throw new PluginError(\n `${method} answered a malformed result${where === '' ? '' : ` at ${where}`}: ${issue?.message ?? 'invalid'}`,\n { kind: 'refused', ...(handle === undefined ? {} : { handle }) },\n )\n}\n\nfunction pluginIdentity(entryPath: string | undefined): InitializeResult['plugin'] {\n const unknown = { name: 'unknown', version: 'unknown' }\n if (entryPath === undefined) return unknown\n try {\n const root = findPackageRoot(dirname(realpathSync(entryPath)))\n if (root === undefined) return unknown\n const pkg = readPackageJson(root)\n return {\n name: typeof pkg.name === 'string' ? pkg.name : unknown.name,\n version: typeof pkg.version === 'string' ? pkg.version : unknown.version,\n }\n } catch {\n return unknown\n }\n}\n\nexport function runPlugin<OptionsSchema extends z.ZodType, SettingsSchema extends z.ZodType>(\n definition: PluginDefinition<OptionsSchema, SettingsSchema>,\n ioInput: Partial<PluginIo> = {},\n): void {\n const io = resolveIo(ioInput)\n const write = io.stdout.write.bind(io.stdout)\n // A caller that brings its own stdout keeps the process's console, streams and signals.\n const ownsProcess = ioInput.stdout === undefined\n if (ownsProcess) {\n routeStrayOutputToStderr()\n // Once the host is gone its pipes have no reader; EPIPE must not stop the releases.\n process.stdout.on('error', () => {})\n process.stderr.on('error', () => {})\n process.on('SIGINT', () => {})\n // Node's own report starts with the throwing source line, and the host takes stderr's first\n // line as the crash's reason.\n process.on('uncaughtException', (error) => {\n try {\n writeSync(2, `${inspect(error)}\\n`)\n } catch {}\n process.exit(1)\n })\n }\n\n const send = (message: Record<string, unknown>) => {\n if (leaving) return\n write(encodeMessage(message))\n }\n const answer = (id: RequestId, result: unknown) => send({ jsonrpc: '2.0', id, result })\n const fail = (\n id: RequestId | null,\n code: number,\n message: string,\n data?: Record<string, unknown>,\n ) =>\n send({\n jsonrpc: '2.0',\n id,\n error: { code, message: firstLine(message), ...(data === undefined ? {} : { data }) },\n })\n\n let options: z.output<OptionsSchema> | undefined\n let runFacts: InitializeParams['runFacts']\n let initialized = false\n let initializing = false\n let shutdownRan = false\n let leaving = false\n let hostPoll: NodeJS.Timeout | undefined\n const startPpid = process.ppid\n const pending = new Map<RequestId, PendingCall>()\n const inFlight = new Set<Promise<void>>()\n const held = new Map<string, Json>()\n const releasing = new Map<string, Promise<void>>()\n\n const detachedContext = (): PluginCallContext => ({\n signal: new AbortController().signal,\n progress: () => {},\n runFacts,\n })\n\n const hold = (handle: Json) => held.set(handleKey(handle), handle)\n\n // One release per handle at a time, whether the host or the kit asked for it.\n const releaseOnce = (handle: Json, ctx: PluginCallContext): Promise<void> => {\n const key = handleKey(handle)\n const running = releasing.get(key)\n if (running !== undefined) return running\n const work = (async () => {\n try {\n await definition.release({ handle, options: options as z.output<OptionsSchema> }, ctx)\n held.delete(key)\n } finally {\n releasing.delete(key)\n }\n })()\n releasing.set(key, work)\n return work\n }\n\n const releaseHeld = (attempted: Set<string>) =>\n Promise.allSettled(\n [...held]\n .filter(([key]) => !attempted.has(key))\n .map(([key, handle]) => {\n attempted.add(key)\n return releaseOnce(handle, detachedContext())\n }),\n )\n\n const settings = (value: unknown) =>\n refuse(definition.settings, value, 'settings') as z.output<SettingsSchema>\n\n const leave = async (boundMs: number) => {\n if (leaving) return\n leaving = true\n clearInterval(hostPoll)\n const sequence = async () => {\n if (!initialized) return\n for (const entry of pending.values()) {\n if (entry.method !== 'release' && entry.method !== 'shutdown') entry.controller.abort()\n }\n // A call still running may yet create a session; it lands in held and is released here.\n const attempted = new Set<string>()\n await Promise.allSettled([releaseHeld(attempted), ...inFlight])\n await releaseHeld(attempted)\n if (shutdownRan) return\n shutdownRan = true\n await definition.shutdown?.(\n { options: options as z.output<OptionsSchema> },\n detachedContext(),\n )\n }\n await within(\n sequence().catch(() => {}),\n boundMs,\n )\n write('', () => io.exit(0))\n }\n\n const watchHost = (hostPid: number) => {\n hostPoll = setInterval(() => {\n if (hostGone(hostPid, startPpid)) void leave(RELEASE_ON_CLOSE_BOUND_MS)\n }, io.hostPidPollMs)\n hostPoll.unref()\n }\n\n const initialize = async (params: unknown, ctx: PluginCallContext): Promise<InitializeResult> => {\n if (initialized || initializing) {\n throw new ProtocolFailure(PLUGIN_ERROR_CODES.invalidRequest, 'initialize was already called')\n }\n const input = parseParams(InitializeParamsSchema, params, 'initialize')\n const offered = input.protocolVersions.filter((version) =>\n SUPPORTED_PROTOCOL_VERSIONS.includes(version),\n )\n if (offered.length === 0) {\n throw new ProtocolFailure(\n PLUGIN_ERROR_CODES.plugin,\n `this plugin speaks protocol ${SUPPORTED_PROTOCOL_VERSIONS.join(', ')}, and the host offered ${input.protocolVersions.join(', ') || 'none'}`,\n {\n kind: 'version',\n supported: SUPPORTED_PROTOCOL_VERSIONS,\n requested: input.protocolVersions,\n },\n )\n }\n const parsedOptions = refuse(definition.options, input.options, 'options') as z.output<OptionsSchema>\n initializing = true\n try {\n await definition.initialize?.(\n {\n options: parsedOptions,\n host: input.host,\n entry: input.entry,\n runFacts: input.runFacts,\n },\n { ...ctx, runFacts: input.runFacts },\n )\n } finally {\n initializing = false\n }\n options = parsedOptions\n runFacts = input.runFacts\n initialized = true\n watchHost(input.host.pid)\n return {\n protocolVersion: Math.max(...offered),\n plugin: pluginIdentity(io.entryPath),\n serves: [...definition.serves],\n methods: [...definition.methods],\n }\n }\n\n const call = async (\n method: string,\n params: unknown,\n ctx: PluginCallContext,\n ): Promise<unknown> => {\n if (method === 'initialize') return initialize(params, ctx)\n if (\n !isPluginMethod(method) ||\n (isOptionalMethod(method) &&\n (!definition.methods.includes(method) || typeof definition[method] !== 'function'))\n ) {\n throw new ProtocolFailure(\n PLUGIN_ERROR_CODES.methodNotFound,\n `${method} is not a method of this plugin`,\n )\n }\n if (!initialized) {\n throw new ProtocolFailure(\n PLUGIN_ERROR_CODES.invalidRequest,\n `${method} came before initialize`,\n )\n }\n const current = options as z.output<OptionsSchema>\n switch (method) {\n case 'acquire': {\n const input = parseParams(AcquireParamsSchema, params, method)\n const result = await definition.acquire(\n { ...input, settings: settings(input.settings), options: current },\n ctx,\n )\n return checkedResult(AcquireResultSchema, result, method)\n }\n case 'release': {\n const input = parseParams(ReleaseParamsSchema, params, method)\n await releaseOnce(input.handle, ctx)\n return {}\n }\n case 'shutdown': {\n shutdownRan = true\n // A handle whose release failed is still held; shutdown may dispose what releasing needs.\n await releaseHeld(new Set())\n await definition.shutdown?.({ options: current }, ctx)\n return {}\n }\n case 'check': {\n const input = parseParams(CheckParamsSchema, params, method)\n const remotes = input.remotes.map((remote) => ({\n name: remote.name,\n settings: settings(remote.settings),\n }))\n const result = await definition.check?.({ remotes, options: current }, ctx)\n return checkedResult(CheckResultSchema, result, method)\n }\n case 'uploadApp': {\n const input = parseParams(UploadAppParamsSchema, params, method)\n const result = await definition.uploadApp?.(\n { ...input, settings: settings(input.settings), options: current },\n ctx,\n )\n return checkedResult(UploadAppResultSchema, result, method)\n }\n case 'started': {\n const input = parseParams(StartedParamsSchema, params, method)\n const result = await definition.started?.({ ...input, options: current }, ctx)\n return checkedResult(StartedResultSchema, result, method)\n }\n case 'end': {\n const input = parseParams(EndParamsSchema, params, method)\n await definition.end?.({ ...input, options: current }, ctx)\n return {}\n }\n default:\n throw new ProtocolFailure(\n PLUGIN_ERROR_CODES.methodNotFound,\n `${method} is not a method of this plugin`,\n )\n }\n }\n\n const createdHandle = (method: string, outcome: Outcome): Json | undefined => {\n if (outcome.ok) {\n if (method !== 'acquire' || !isRecord(outcome.value)) return undefined\n return outcome.value.handle as Json | undefined\n }\n return outcome.error instanceof PluginError ? outcome.error.handle : undefined\n }\n\n const answerFailure = (id: RequestId, error: unknown) => {\n if (error instanceof ProtocolFailure) {\n fail(id, error.code, error.message, error.data)\n } else if (error instanceof PluginError) {\n fail(id, PLUGIN_ERROR_CODES.plugin, error.message, {\n kind: error.kind,\n ...(error.path === undefined ? {} : { path: error.path }),\n ...(error.handle === undefined ? {} : { handle: error.handle }),\n })\n } else {\n const message = error instanceof Error ? error.message : String(error)\n fail(id, PLUGIN_ERROR_CODES.plugin, message, { kind: 'unreachable' })\n }\n }\n\n const dispatch = async (id: RequestId, method: string, params: unknown) => {\n const entry: PendingCall = { method, controller: new AbortController(), answered: false }\n pending.set(id, entry)\n const ctx: PluginCallContext = {\n signal: entry.controller.signal,\n progress: (update) => {\n if (entry.answered) return\n send({ jsonrpc: '2.0', method: PROGRESS_METHOD, params: { id, ...update } })\n },\n runFacts,\n }\n let outcome: Outcome\n try {\n outcome = { ok: true, value: await call(method, params, ctx) }\n } catch (error) {\n outcome = { ok: false, error }\n }\n clearTimeout(entry.graceTimer)\n if (pending.get(id) === entry) pending.delete(id)\n const handle = createdHandle(method, outcome)\n const tracked = initialized ? handle : undefined\n if (tracked !== undefined) hold(tracked)\n if (entry.answered) {\n // The cancel was already answered without this handle, so nobody else will release it.\n if (tracked !== undefined) await releaseOnce(tracked, detachedContext()).catch(() => {})\n return\n }\n if (leaving) return\n entry.answered = true\n if (outcome.ok) {\n answer(id, outcome.value)\n } else if (entry.controller.signal.aborted) {\n const message = outcome.error instanceof Error ? outcome.error.message : String(outcome.error)\n fail(id, PLUGIN_ERROR_CODES.cancelled, message, {\n kind: 'timeout',\n ...(handle === undefined ? {} : { handle }),\n })\n } else {\n answerFailure(id, outcome.error)\n }\n }\n\n const cancel = (params: unknown) => {\n const parsed = CancelParamsSchema.safeParse(params)\n if (!parsed.success) return\n const { id } = parsed.data\n const entry = pending.get(id)\n if (entry === undefined || entry.controller.signal.aborted) return\n entry.controller.abort()\n entry.graceTimer = setTimeout(() => {\n if (entry.answered) return\n entry.answered = true\n fail(\n id,\n PLUGIN_ERROR_CODES.cancelled,\n `${entry.method} did not stop within ${io.cancelAnswerGraceMs} ms of its cancel`,\n { kind: 'timeout' },\n )\n }, io.cancelAnswerGraceMs)\n }\n\n const handleLine = (line: string) => {\n let message: unknown\n try {\n message = JSON.parse(line)\n } catch {\n fail(null, PLUGIN_ERROR_CODES.parse, 'the line is not JSON')\n return\n }\n if (!isRecord(message)) {\n fail(null, PLUGIN_ERROR_CODES.invalidRequest, 'a message must be a JSON-RPC 2.0 object')\n return\n }\n const id = isRequestId(message.id) ? message.id : null\n if (message.method === undefined && ('result' in message || 'error' in message)) return\n if (message.jsonrpc !== '2.0' || typeof message.method !== 'string') {\n fail(id, PLUGIN_ERROR_CODES.invalidRequest, 'a request needs jsonrpc \"2.0\" and a method')\n return\n }\n if (!('id' in message)) {\n if (message.method === CANCEL_METHOD) cancel(message.params)\n return\n }\n if (id === null) {\n fail(null, PLUGIN_ERROR_CODES.invalidRequest, 'a request id is a string or a number')\n return\n }\n if (leaving) return\n const run = dispatch(id, message.method, message.params)\n inFlight.add(run)\n void run.catch(() => {}).finally(() => inFlight.delete(run))\n }\n\n const decoder = createLineDecoder({\n maxLineBytes: MAX_MESSAGE_BYTES,\n onLine: handleLine,\n onOverflow: () =>\n fail(\n null,\n PLUGIN_ERROR_CODES.invalidRequest,\n `a message is longer than ${MAX_MESSAGE_BYTES} bytes`,\n ),\n })\n\n const stdinClosed = () => {\n if (leaving) return\n decoder.end()\n void leave(RELEASE_ON_CLOSE_BOUND_MS)\n }\n\n if (ownsProcess) process.on('SIGTERM', () => void leave(RELEASE_ON_SIGTERM_BOUND_MS))\n io.stdin.on('data', (chunk) => decoder.push(chunk))\n io.stdin.on('end', stdinClosed)\n io.stdin.on('error', stdinClosed)\n}\n","import { z } from 'zod'\nimport { OPTIONAL_PLUGIN_METHODS, PLUGIN_RUN_FACTS, PLUGIN_SERVES } from './messages.js'\n\n// The manifest sits at package.json[\"agent-qa\"].plugin.\nexport const PLUGIN_MANIFEST_FIELD = 'agent-qa'\n\nconst PackagePathSchema = z.string().min(1)\n\nconst RemotePluginManifestSchema = z.strictObject({\n kind: z.literal('remote'),\n runs: z.literal('process'),\n protocol: z.number().int().positive(),\n entry: PackagePathSchema,\n serves: z.array(z.enum(PLUGIN_SERVES)).nonempty(),\n methods: z.array(z.enum(OPTIONAL_PLUGIN_METHODS)),\n options: PackagePathSchema,\n settings: PackagePathSchema,\n runFacts: z.array(z.enum(PLUGIN_RUN_FACTS)).optional(),\n skill: PackagePathSchema.optional(),\n})\n\nconst ModelAuthManifestSchema = z.strictObject({\n kind: z.literal('model-auth'),\n runs: z.literal('in-process'),\n entry: PackagePathSchema,\n options: PackagePathSchema.optional(),\n})\n\nconst ModelProviderManifestSchema = z.strictObject({\n kind: z.literal('model-provider'),\n runs: z.literal('in-process'),\n entry: PackagePathSchema,\n options: PackagePathSchema.optional(),\n})\n\nexport const PluginManifestSchema = z.discriminatedUnion('kind', [\n RemotePluginManifestSchema,\n ModelAuthManifestSchema,\n ModelProviderManifestSchema,\n])\nexport type PluginManifest = z.infer<typeof PluginManifestSchema>\nexport type RemotePluginManifest = z.infer<typeof RemotePluginManifestSchema>\n","import { mkdirSync, readFileSync, writeFileSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { isDeepStrictEqual } from 'node:util'\nimport { z } from 'zod'\nimport type { PluginDefinition } from './define-plugin.js'\nimport {\n PLUGIN_MANIFEST_FIELD,\n PluginManifestSchema,\n type RemotePluginManifest,\n} from './protocol/manifest.js'\nimport { PLUGIN_PROTOCOL_VERSION } from './protocol/messages.js'\n\nexport interface EmitPluginFilesInput<\n OptionsSchema extends z.ZodType,\n SettingsSchema extends z.ZodType,\n> {\n definition: PluginDefinition<OptionsSchema, SettingsSchema>\n packageDir: string\n}\n\nexport interface EmittedPluginFiles {\n manifest: RemotePluginManifest\n optionsSchemaFile: string\n settingsSchemaFile: string\n packageJsonChanged: boolean\n}\n\nconst OPTIONS_SCHEMA_PATH = './dist/options.schema.json'\nconst SETTINGS_SCHEMA_PATH = './dist/settings.schema.json'\n\nexport function pluginManifest<OptionsSchema extends z.ZodType, SettingsSchema extends z.ZodType>(\n definition: PluginDefinition<OptionsSchema, SettingsSchema>,\n): RemotePluginManifest {\n const manifest = PluginManifestSchema.parse({\n protocol: PLUGIN_PROTOCOL_VERSION,\n kind: 'remote',\n runs: 'process',\n entry: './dist/main.js',\n serves: [...definition.serves],\n methods: [...definition.methods],\n options: OPTIONS_SCHEMA_PATH,\n settings: SETTINGS_SCHEMA_PATH,\n ...(definition.runFacts === undefined ? {} : { runFacts: [...definition.runFacts] }),\n ...(definition.skill === undefined ? {} : { skill: definition.skill }),\n })\n if (manifest.kind !== 'remote') throw new Error('a plugin built with the kit is remote')\n return manifest\n}\n\nfunction schemaText(schema: z.ZodType): string {\n return `${JSON.stringify(z.toJSONSchema(schema, { io: 'input', target: 'draft-2020-12' }), null, 2)}\\n`\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nexport function emitPluginFiles<OptionsSchema extends z.ZodType, SettingsSchema extends z.ZodType>(\n input: EmitPluginFilesInput<OptionsSchema, SettingsSchema>,\n): EmittedPluginFiles {\n const { definition, packageDir } = input\n const manifest = pluginManifest(definition)\n const optionsSchemaFile = join(packageDir, OPTIONS_SCHEMA_PATH)\n const settingsSchemaFile = join(packageDir, SETTINGS_SCHEMA_PATH)\n mkdirSync(join(packageDir, 'dist'), { recursive: true })\n writeFileSync(optionsSchemaFile, schemaText(definition.options))\n writeFileSync(settingsSchemaFile, schemaText(definition.settings))\n\n const packageJsonFile = join(packageDir, 'package.json')\n const parsed: unknown = JSON.parse(readFileSync(packageJsonFile, 'utf8'))\n if (!isRecord(parsed)) throw new Error(`${packageJsonFile} is not a JSON object`)\n const field = isRecord(parsed[PLUGIN_MANIFEST_FIELD]) ? parsed[PLUGIN_MANIFEST_FIELD] : {}\n const packageJsonChanged = !isDeepStrictEqual(field.plugin, manifest)\n if (packageJsonChanged) {\n const next = { ...parsed, [PLUGIN_MANIFEST_FIELD]: { ...field, plugin: manifest } }\n writeFileSync(packageJsonFile, `${JSON.stringify(next, null, 2)}\\n`)\n }\n return { manifest, optionsSchemaFile, settingsSchemaFile, packageJsonChanged }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["z","z","existsSync","join","dirname","readFileSync","format","isRecord","dirname","realpathSync","inspect","z","z","join","readFileSync","isDeepStrictEqual"],"sources":["../src/credential.ts","../src/protocol/messages.ts","../src/define-plugin.ts","../src/package-root.ts","../src/protocol/framing.ts","../src/run-plugin.ts","../src/protocol/manifest.ts","../src/emit.ts","../src/vendor-api.ts"],"sourcesContent":["import { z } from 'zod'\n\n// No pattern or format: a config holds a secret reference here, not the secret itself.\nexport function credential(description?: string) {\n return z.string().meta({ credential: true, ...(description ? { description } : {}) })\n}\n","import { z } from 'zod'\n\nexport const PLUGIN_PROTOCOL_VERSION = 1\n\nexport const PLUGIN_METHODS = [\n 'initialize',\n 'check',\n 'acquire',\n 'uploadApp',\n 'started',\n 'end',\n 'release',\n 'shutdown',\n] as const\nexport type PluginMethod = (typeof PLUGIN_METHODS)[number]\n\nexport const OPTIONAL_PLUGIN_METHODS = ['check', 'uploadApp', 'started', 'end'] as const\nexport type OptionalPluginMethod = (typeof OPTIONAL_PLUGIN_METHODS)[number]\n\nexport const PLUGIN_SERVES = ['playwright', 'cdp', 'appium'] as const\nexport type PluginServe = (typeof PLUGIN_SERVES)[number]\n\nexport const PLUGIN_RUN_FACTS = ['testName', 'runId', 'failure'] as const\nexport type PluginRunFact = (typeof PLUGIN_RUN_FACTS)[number]\n\nexport const PLUGIN_FAILURE_KINDS = [\n 'unreachable',\n 'auth',\n 'capacity',\n 'timeout',\n 'version',\n 'refused',\n 'ended',\n 'lost',\n] as const\nexport type PluginFailureKind = (typeof PLUGIN_FAILURE_KINDS)[number]\n\nexport const PLUGIN_ERROR_CODES = {\n parse: -32700,\n invalidRequest: -32600,\n methodNotFound: -32601,\n invalidParams: -32602,\n plugin: -32000,\n cancelled: -32800,\n} as const\n\nexport const CANCEL_METHOD = '$/cancel'\nexport const PROGRESS_METHOD = '$/progress'\n\nexport const MAX_MESSAGE_BYTES = 1024 * 1024\n\nconst JsonObjectSchema = z.record(z.string(), z.unknown())\nconst HandleSchema = z.json()\nconst RequestIdSchema = z.union([z.string(), z.number()])\n\nexport const InitializeParamsSchema = z.object({\n protocolVersions: z.array(z.number().int()),\n host: z.object({\n pid: z.number().int(),\n agentQaVersion: z.string(),\n playwrightVersion: z.string(),\n webdriverioVersion: z.string(),\n }),\n entry: z.string(),\n options: JsonObjectSchema,\n runFacts: z.object({ runId: z.string().optional() }).optional(),\n})\nexport type InitializeParams = z.infer<typeof InitializeParamsSchema>\n\nexport const InitializeResultSchema = z.object({\n protocolVersion: z.number().int(),\n plugin: z.object({ name: z.string(), version: z.string() }),\n serves: z.array(z.enum(PLUGIN_SERVES)),\n methods: z.array(z.enum(OPTIONAL_PLUGIN_METHODS)),\n})\nexport type InitializeResult = z.infer<typeof InitializeResultSchema>\n\nexport const CheckParamsSchema = z.object({\n remotes: z.array(z.object({ name: z.string(), settings: JsonObjectSchema })),\n})\nexport type CheckParams = z.infer<typeof CheckParamsSchema>\n\nexport const CheckResultSchema = z.object({\n state: z.enum(['ok', 'warn']),\n lines: z.array(z.string()),\n})\nexport type CheckResult = z.infer<typeof CheckResultSchema>\n\nconst WebSessionSchema = z.object({\n platform: z.literal('web'),\n engine: z.enum(['chromium', 'firefox', 'webkit']),\n context: z.enum(['new', 'reuse']),\n})\n\nconst DeviceSessionSchema = z.object({\n platform: z.enum(['android', 'ios']),\n capabilities: JsonObjectSchema,\n})\n\nexport const AcquireParamsSchema = z.object({\n remote: z.string(),\n settings: JsonObjectSchema,\n session: z.discriminatedUnion('platform', [WebSessionSchema, DeviceSessionSchema]),\n run: z.object({ testName: z.string().optional() }).optional(),\n})\nexport type AcquireParams = z.infer<typeof AcquireParamsSchema>\n\nexport const AcquireResultSchema = z.object({\n handle: HandleSchema,\n protocol: z.enum(PLUGIN_SERVES),\n url: z.string(),\n headers: z.record(z.string(), z.string()).optional(),\n capabilities: JsonObjectSchema.optional(),\n mask: z.array(z.string()).optional(),\n link: z.string().optional(),\n})\nexport type AcquireResult = z.infer<typeof AcquireResultSchema>\n\nexport const UploadAppParamsSchema = z.object({\n remote: z.string(),\n settings: JsonObjectSchema,\n platform: z.enum(['android', 'ios']),\n path: z.string(),\n sha256: z.string(),\n size: z.number().int().nonnegative(),\n})\nexport type UploadAppParams = z.infer<typeof UploadAppParamsSchema>\n\nexport const UploadAppResultSchema = z.object({ ref: z.string() })\nexport type UploadAppResult = z.infer<typeof UploadAppResultSchema>\n\nexport const StartedParamsSchema = z.object({\n handle: HandleSchema,\n sessionId: z.string().optional(),\n})\nexport type StartedParams = z.infer<typeof StartedParamsSchema>\n\nexport const StartedResultSchema = z.object({\n link: z.string().optional(),\n appiumVersion: z.string().optional(),\n})\nexport type StartedResult = z.infer<typeof StartedResultSchema>\n\nexport const EndParamsSchema = z.object({\n handle: HandleSchema,\n outcome: z.enum(['passed', 'failed', 'error', 'cancelled']),\n reason: z.string().optional(),\n})\nexport type EndParams = z.infer<typeof EndParamsSchema>\n\nexport const ReleaseParamsSchema = z.object({ handle: HandleSchema })\nexport type ReleaseParams = z.infer<typeof ReleaseParamsSchema>\n\nexport const CancelParamsSchema = z.object({ id: RequestIdSchema })\nexport type CancelParams = z.infer<typeof CancelParamsSchema>\n\nexport const ProgressParamsSchema = z.object({\n id: RequestIdSchema,\n message: z.string(),\n queued: z.number().int().nonnegative().optional(),\n percent: z.number().min(0).max(100).optional(),\n})\nexport type ProgressParams = z.infer<typeof ProgressParamsSchema>\n\nexport const PluginErrorDataSchema = z.object({\n kind: z.enum(PLUGIN_FAILURE_KINDS),\n path: z.string().optional(),\n handle: HandleSchema.optional(),\n supported: z.array(z.number().int()).optional(),\n requested: z.array(z.number().int()).optional(),\n})\nexport type PluginErrorData = z.infer<typeof PluginErrorDataSchema>\n","import type { z } from 'zod'\nimport {\n OPTIONAL_PLUGIN_METHODS,\n type AcquireParams,\n type AcquireResult,\n type CheckResult,\n type EndParams,\n type InitializeParams,\n type OptionalPluginMethod,\n type PluginFailureKind,\n type PluginRunFact,\n type PluginServe,\n type StartedParams,\n type StartedResult,\n type UploadAppParams,\n type UploadAppResult,\n} from './protocol/messages.js'\n\ntype Json = z.core.util.JSONType\ntype Awaitable<T> = T | Promise<T>\n\nexport interface PluginErrorOptions {\n kind: PluginFailureKind\n path?: string\n handle?: Json\n}\n\nexport class PluginError extends Error {\n readonly kind: PluginFailureKind\n readonly path: string | undefined\n readonly handle: Json | undefined\n\n constructor(message: string, options: PluginErrorOptions) {\n super(message)\n this.name = 'PluginError'\n this.kind = options.kind\n this.path = options.path\n this.handle = options.handle\n }\n}\n\nexport interface InitializeInput<Options> {\n options: Options\n host: InitializeParams['host']\n entry: string\n runFacts: InitializeParams['runFacts']\n}\n\nexport interface CheckInput<Options, Settings> {\n options: Options\n remotes: { name: string; settings: Settings }[]\n}\n\nexport interface AcquireInput<Options, Settings> extends Omit<AcquireParams, 'settings'> {\n options: Options\n settings: Settings\n}\n\nexport interface UploadAppInput<Options, Settings> extends Omit<UploadAppParams, 'settings'> {\n options: Options\n settings: Settings\n}\n\nexport interface StartedInput<Options> extends StartedParams {\n options: Options\n}\n\nexport interface EndInput<Options> extends EndParams {\n options: Options\n}\n\nexport interface ReleaseInput<Options> {\n options: Options\n handle: Json\n}\n\nexport interface ShutdownInput<Options> {\n options: Options\n}\n\nexport interface PluginProgress {\n message: string\n queued?: number\n percent?: number\n}\n\nexport interface PluginCallContext {\n signal: AbortSignal\n progress(update: PluginProgress): void\n runFacts: InitializeParams['runFacts']\n}\n\nexport interface PluginSpec<OptionsSchema extends z.ZodType, SettingsSchema extends z.ZodType> {\n options: OptionsSchema\n settings: SettingsSchema\n serves: readonly PluginServe[]\n runFacts?: readonly PluginRunFact[]\n skill?: string\n initialize?(\n input: InitializeInput<z.output<OptionsSchema>>,\n ctx: PluginCallContext,\n ): Awaitable<void>\n check?(\n input: CheckInput<z.output<OptionsSchema>, z.output<SettingsSchema>>,\n ctx: PluginCallContext,\n ): Awaitable<CheckResult>\n acquire(\n input: AcquireInput<z.output<OptionsSchema>, z.output<SettingsSchema>>,\n ctx: PluginCallContext,\n ): Awaitable<AcquireResult>\n uploadApp?(\n input: UploadAppInput<z.output<OptionsSchema>, z.output<SettingsSchema>>,\n ctx: PluginCallContext,\n ): Awaitable<UploadAppResult>\n started?(\n input: StartedInput<z.output<OptionsSchema>>,\n ctx: PluginCallContext,\n ): Awaitable<StartedResult>\n end?(input: EndInput<z.output<OptionsSchema>>, ctx: PluginCallContext): Awaitable<void>\n release(input: ReleaseInput<z.output<OptionsSchema>>, ctx: PluginCallContext): Awaitable<void>\n shutdown?(input: ShutdownInput<z.output<OptionsSchema>>, ctx: PluginCallContext): Awaitable<void>\n}\n\nexport interface PluginDefinition<\n OptionsSchema extends z.ZodType = z.ZodType,\n SettingsSchema extends z.ZodType = z.ZodType,\n> extends PluginSpec<OptionsSchema, SettingsSchema> {\n methods: readonly OptionalPluginMethod[]\n}\n\nexport function definePlugin<OptionsSchema extends z.ZodType, SettingsSchema extends z.ZodType>(\n spec: PluginSpec<OptionsSchema, SettingsSchema>,\n): PluginDefinition<OptionsSchema, SettingsSchema> {\n const methods = OPTIONAL_PLUGIN_METHODS.filter((method) => typeof spec[method] === 'function')\n return { ...spec, methods }\n}\n","import { existsSync, readFileSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\n\nexport function findPackageRoot(fromDir: string): string | undefined {\n let dir = fromDir\n for (;;) {\n if (existsSync(join(dir, 'package.json'))) return dir\n const parent = dirname(dir)\n if (parent === dir) return undefined\n dir = parent\n }\n}\n\nexport function readPackageJson(packageRoot: string): Record<string, unknown> {\n const parsed: unknown = JSON.parse(readFileSync(join(packageRoot, 'package.json'), 'utf8'))\n return typeof parsed === 'object' && parsed !== null ? (parsed as Record<string, unknown>) : {}\n}\n","export function encodeMessage(message: unknown): string {\n return `${JSON.stringify(message)}\\n`\n}\n\nexport interface LineDecoderOptions {\n maxLineBytes: number\n onLine: (line: string) => void\n onOverflow: () => void\n}\n\nexport interface LineDecoder {\n push(chunk: Uint8Array | string): void\n end(): void\n}\n\nconst NEWLINE = 0x0a\n\nexport function createLineDecoder({\n maxLineBytes,\n onLine,\n onOverflow,\n}: LineDecoderOptions): LineDecoder {\n const encoder = new TextEncoder()\n const decoder = new TextDecoder()\n let parts: Uint8Array[] = []\n let size = 0\n let discarding = false\n\n const append = (segment: Uint8Array) => {\n if (discarding || segment.length === 0) return\n if (size + segment.length > maxLineBytes) {\n discarding = true\n parts = []\n size = 0\n onOverflow()\n return\n }\n parts.push(new Uint8Array(segment))\n size += segment.length\n }\n\n const finishLine = () => {\n const wasDiscarding = discarding\n const lineParts = parts\n const lineSize = size\n parts = []\n size = 0\n discarding = false\n if (wasDiscarding || lineSize === 0) return\n const bytes = new Uint8Array(lineSize)\n let offset = 0\n for (const part of lineParts) {\n bytes.set(part, offset)\n offset += part.length\n }\n const line = decoder.decode(bytes).replace(/\\r$/, '')\n if (line.trim() !== '') onLine(line)\n }\n\n return {\n push(chunk) {\n const bytes = typeof chunk === 'string' ? encoder.encode(chunk) : chunk\n let start = 0\n while (start <= bytes.length) {\n const newline = bytes.indexOf(NEWLINE, start)\n if (newline === -1) {\n append(bytes.subarray(start))\n return\n }\n append(bytes.subarray(start, newline))\n finishLine()\n start = newline + 1\n }\n },\n end() {\n finishLine()\n },\n }\n}\n","import { realpathSync, writeSync } from 'node:fs'\nimport { dirname } from 'node:path'\nimport { format, inspect } from 'node:util'\nimport type { z } from 'zod'\nimport { PluginError, type PluginCallContext, type PluginDefinition } from './define-plugin.js'\nimport { findPackageRoot, readPackageJson } from './package-root.js'\nimport { createLineDecoder, encodeMessage } from './protocol/framing.js'\nimport {\n AcquireParamsSchema,\n AcquireResultSchema,\n CANCEL_METHOD,\n CancelParamsSchema,\n CheckParamsSchema,\n CheckResultSchema,\n EndParamsSchema,\n InitializeParamsSchema,\n MAX_MESSAGE_BYTES,\n OPTIONAL_PLUGIN_METHODS,\n PLUGIN_ERROR_CODES,\n PLUGIN_METHODS,\n PLUGIN_PROTOCOL_VERSION,\n PROGRESS_METHOD,\n ReleaseParamsSchema,\n StartedParamsSchema,\n StartedResultSchema,\n UploadAppParamsSchema,\n UploadAppResultSchema,\n type InitializeParams,\n type InitializeResult,\n type OptionalPluginMethod,\n type PluginMethod,\n} from './protocol/messages.js'\n\nexport interface PluginIo {\n stdin: {\n on(event: 'data', listener: (chunk: Uint8Array | string) => void): unknown\n on(event: 'end' | 'error', listener: () => void): unknown\n }\n stdout: { write(chunk: string, callback?: (error?: Error | null) => void): unknown }\n exit(code: number): void\n entryPath?: string\n cancelAnswerGraceMs: number\n hostPidPollMs: number\n}\n\ntype RequestId = string | number\ntype Json = z.core.util.JSONType\n\nexport const CANCEL_ANSWER_GRACE_MS = 4_000\nexport const HOST_PID_POLL_MS = 1_000\nconst RELEASE_ON_CLOSE_BOUND_MS = 30_000\nconst RELEASE_ON_SIGTERM_BOUND_MS = 4_000\n\nconst SUPPORTED_PROTOCOL_VERSIONS = [PLUGIN_PROTOCOL_VERSION]\n\nclass ProtocolFailure extends Error {\n constructor(\n readonly code: number,\n message: string,\n readonly data?: Record<string, unknown>,\n ) {\n super(message)\n }\n}\n\nfunction resolveIo(io: Partial<PluginIo>): PluginIo {\n return {\n stdin: io.stdin ?? process.stdin,\n stdout: io.stdout ?? process.stdout,\n exit: io.exit ?? ((code) => process.exit(code)),\n entryPath: io.entryPath ?? process.argv[1],\n cancelAnswerGraceMs: io.cancelAnswerGraceMs ?? CANCEL_ANSWER_GRACE_MS,\n hostPidPollMs: io.hostPidPollMs ?? HOST_PID_POLL_MS,\n }\n}\n\nfunction routeStrayOutputToStderr() {\n const toLog = (...args: unknown[]) => {\n process.stderr.write(`${format(...args)}\\n`)\n }\n console.log = toLog\n console.info = toLog\n console.debug = toLog\n console.warn = toLog\n process.stdout.write = process.stderr.write.bind(process.stderr) as typeof process.stdout.write\n}\n\nfunction hostGone(hostPid: number, startPpid: number): boolean {\n if (process.ppid !== startPpid) return true\n try {\n process.kill(hostPid, 0)\n return false\n } catch (error) {\n return (error as NodeJS.ErrnoException).code === 'ESRCH'\n }\n}\n\n// Handles are JSON; two handles are the same session when their JSON is equal.\nfunction handleKey(handle: Json): string {\n const canonical = (value: Json): Json => {\n if (Array.isArray(value)) return value.map(canonical)\n if (value === null || typeof value !== 'object') return value\n return Object.fromEntries(\n Object.keys(value)\n .sort()\n .map((key) => [key, canonical(value[key] as Json)]),\n )\n }\n return JSON.stringify(canonical(handle))\n}\n\nfunction within<T>(work: Promise<T>, boundMs: number): Promise<T | undefined> {\n let timer: NodeJS.Timeout | undefined\n const bound = new Promise<undefined>((resolve) => {\n timer = setTimeout(() => resolve(undefined), boundMs)\n })\n return Promise.race([work, bound]).finally(() => clearTimeout(timer))\n}\n\ntype Outcome = { ok: true; value: unknown } | { ok: false; error: unknown }\n\ninterface PendingCall {\n method: string\n controller: AbortController\n answered: boolean\n graceTimer?: NodeJS.Timeout\n}\n\nfunction firstLine(message: string): string {\n return message.split(/\\r?\\n/, 1)[0] ?? ''\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction isRequestId(value: unknown): value is RequestId {\n return typeof value === 'string' || typeof value === 'number'\n}\n\nfunction isPluginMethod(method: string): method is PluginMethod {\n return (PLUGIN_METHODS as readonly string[]).includes(method)\n}\n\nfunction isOptionalMethod(method: PluginMethod): method is OptionalPluginMethod {\n return (OPTIONAL_PLUGIN_METHODS as readonly string[]).includes(method)\n}\n\nfunction issuePath(issue: z.core.$ZodIssue): string {\n return issue.path.map(String).join('.')\n}\n\nfunction parseParams<Schema extends z.ZodType>(\n schema: Schema,\n params: unknown,\n method: string,\n): z.output<Schema> {\n const parsed = schema.safeParse(params ?? {})\n if (parsed.success) return parsed.data\n const issue = parsed.error.issues[0]\n const where = issue === undefined ? '' : issuePath(issue)\n throw new ProtocolFailure(\n PLUGIN_ERROR_CODES.invalidParams,\n `${method} params${where === '' ? '' : ` at ${where}`}: ${issue?.message ?? 'invalid'}`,\n )\n}\n\n// A refusal's path starts with options. or settings., naming the block that holds the field.\nfunction refuse(schema: z.ZodType, value: unknown, prefix: 'options' | 'settings'): unknown {\n const parsed = schema.safeParse(value)\n if (parsed.success) return parsed.data\n const issue = parsed.error.issues[0]\n const inner = issue === undefined ? '' : issuePath(issue)\n const path = inner === '' ? undefined : `${prefix}.${inner}`\n throw new PluginError(`${path ?? prefix}: ${issue?.message ?? 'invalid'}`, {\n kind: 'refused',\n ...(path === undefined ? {} : { path }),\n })\n}\n\nfunction checkedResult(schema: z.ZodType, value: unknown, method: string): unknown {\n const parsed = schema.safeParse(value)\n if (parsed.success) return value\n const issue = parsed.error.issues[0]\n const where = issue === undefined ? '' : issuePath(issue)\n const handle =\n method === 'acquire' && isRecord(value) && value.handle !== undefined\n ? (value.handle as Json)\n : undefined\n throw new PluginError(\n `${method} answered a malformed result${where === '' ? '' : ` at ${where}`}: ${issue?.message ?? 'invalid'}`,\n { kind: 'refused', ...(handle === undefined ? {} : { handle }) },\n )\n}\n\nfunction pluginIdentity(entryPath: string | undefined): InitializeResult['plugin'] {\n const unknown = { name: 'unknown', version: 'unknown' }\n if (entryPath === undefined) return unknown\n try {\n const root = findPackageRoot(dirname(realpathSync(entryPath)))\n if (root === undefined) return unknown\n const pkg = readPackageJson(root)\n return {\n name: typeof pkg.name === 'string' ? pkg.name : unknown.name,\n version: typeof pkg.version === 'string' ? pkg.version : unknown.version,\n }\n } catch {\n return unknown\n }\n}\n\nexport function runPlugin<OptionsSchema extends z.ZodType, SettingsSchema extends z.ZodType>(\n definition: PluginDefinition<OptionsSchema, SettingsSchema>,\n ioInput: Partial<PluginIo> = {},\n): void {\n const io = resolveIo(ioInput)\n const write = io.stdout.write.bind(io.stdout)\n // A caller that brings its own stdout keeps the process's console, streams and signals.\n const ownsProcess = ioInput.stdout === undefined\n if (ownsProcess) {\n routeStrayOutputToStderr()\n // Once the host is gone its pipes have no reader; EPIPE must not stop the releases.\n process.stdout.on('error', () => {})\n process.stderr.on('error', () => {})\n process.on('SIGINT', () => {})\n // Node's own report starts with the throwing source line, and the host takes stderr's first\n // line as the crash's reason.\n process.on('uncaughtException', (error) => {\n try {\n writeSync(2, `${inspect(error)}\\n`)\n } catch {}\n process.exit(1)\n })\n }\n\n const send = (message: Record<string, unknown>) => {\n if (leaving) return\n write(encodeMessage(message))\n }\n const answer = (id: RequestId, result: unknown) => send({ jsonrpc: '2.0', id, result })\n const fail = (\n id: RequestId | null,\n code: number,\n message: string,\n data?: Record<string, unknown>,\n ) =>\n send({\n jsonrpc: '2.0',\n id,\n error: { code, message: firstLine(message), ...(data === undefined ? {} : { data }) },\n })\n\n let options: z.output<OptionsSchema> | undefined\n let runFacts: InitializeParams['runFacts']\n let initialized = false\n let initializing = false\n let shutdownRan = false\n let leaving = false\n let hostPoll: NodeJS.Timeout | undefined\n const startPpid = process.ppid\n const pending = new Map<RequestId, PendingCall>()\n const inFlight = new Set<Promise<void>>()\n const held = new Map<string, Json>()\n const releasing = new Map<string, Promise<void>>()\n\n const detachedContext = (): PluginCallContext => ({\n signal: new AbortController().signal,\n progress: () => {},\n runFacts,\n })\n\n const hold = (handle: Json) => held.set(handleKey(handle), handle)\n\n // One release per handle at a time, whether the host or the kit asked for it.\n const releaseOnce = (handle: Json, ctx: PluginCallContext): Promise<void> => {\n const key = handleKey(handle)\n const running = releasing.get(key)\n if (running !== undefined) return running\n const work = (async () => {\n try {\n await definition.release({ handle, options: options as z.output<OptionsSchema> }, ctx)\n held.delete(key)\n } finally {\n releasing.delete(key)\n }\n })()\n releasing.set(key, work)\n return work\n }\n\n const releaseHeld = (attempted: Set<string>) =>\n Promise.allSettled(\n [...held]\n .filter(([key]) => !attempted.has(key))\n .map(([key, handle]) => {\n attempted.add(key)\n return releaseOnce(handle, detachedContext())\n }),\n )\n\n const settings = (value: unknown) =>\n refuse(definition.settings, value, 'settings') as z.output<SettingsSchema>\n\n const leave = async (boundMs: number) => {\n if (leaving) return\n leaving = true\n clearInterval(hostPoll)\n const sequence = async () => {\n if (!initialized) return\n for (const entry of pending.values()) {\n if (entry.method !== 'release' && entry.method !== 'shutdown') entry.controller.abort()\n }\n // A call still running may yet create a session; it lands in held and is released here.\n const attempted = new Set<string>()\n await Promise.allSettled([releaseHeld(attempted), ...inFlight])\n await releaseHeld(attempted)\n if (shutdownRan) return\n shutdownRan = true\n await definition.shutdown?.(\n { options: options as z.output<OptionsSchema> },\n detachedContext(),\n )\n }\n await within(\n sequence().catch(() => {}),\n boundMs,\n )\n write('', () => io.exit(0))\n }\n\n const watchHost = (hostPid: number) => {\n hostPoll = setInterval(() => {\n if (hostGone(hostPid, startPpid)) void leave(RELEASE_ON_CLOSE_BOUND_MS)\n }, io.hostPidPollMs)\n hostPoll.unref()\n }\n\n const initialize = async (params: unknown, ctx: PluginCallContext): Promise<InitializeResult> => {\n if (initialized || initializing) {\n throw new ProtocolFailure(PLUGIN_ERROR_CODES.invalidRequest, 'initialize was already called')\n }\n const input = parseParams(InitializeParamsSchema, params, 'initialize')\n const offered = input.protocolVersions.filter((version) =>\n SUPPORTED_PROTOCOL_VERSIONS.includes(version),\n )\n if (offered.length === 0) {\n throw new ProtocolFailure(\n PLUGIN_ERROR_CODES.plugin,\n `this plugin speaks protocol ${SUPPORTED_PROTOCOL_VERSIONS.join(', ')}, and the host offered ${input.protocolVersions.join(', ') || 'none'}`,\n {\n kind: 'version',\n supported: SUPPORTED_PROTOCOL_VERSIONS,\n requested: input.protocolVersions,\n },\n )\n }\n const parsedOptions = refuse(definition.options, input.options, 'options') as z.output<OptionsSchema>\n initializing = true\n try {\n await definition.initialize?.(\n {\n options: parsedOptions,\n host: input.host,\n entry: input.entry,\n runFacts: input.runFacts,\n },\n { ...ctx, runFacts: input.runFacts },\n )\n } finally {\n initializing = false\n }\n options = parsedOptions\n runFacts = input.runFacts\n initialized = true\n watchHost(input.host.pid)\n return {\n protocolVersion: Math.max(...offered),\n plugin: pluginIdentity(io.entryPath),\n serves: [...definition.serves],\n methods: [...definition.methods],\n }\n }\n\n const call = async (\n method: string,\n params: unknown,\n ctx: PluginCallContext,\n ): Promise<unknown> => {\n if (method === 'initialize') return initialize(params, ctx)\n if (\n !isPluginMethod(method) ||\n (isOptionalMethod(method) &&\n (!definition.methods.includes(method) || typeof definition[method] !== 'function'))\n ) {\n throw new ProtocolFailure(\n PLUGIN_ERROR_CODES.methodNotFound,\n `${method} is not a method of this plugin`,\n )\n }\n if (!initialized) {\n throw new ProtocolFailure(\n PLUGIN_ERROR_CODES.invalidRequest,\n `${method} came before initialize`,\n )\n }\n const current = options as z.output<OptionsSchema>\n switch (method) {\n case 'acquire': {\n const input = parseParams(AcquireParamsSchema, params, method)\n const result = await definition.acquire(\n { ...input, settings: settings(input.settings), options: current },\n ctx,\n )\n return checkedResult(AcquireResultSchema, result, method)\n }\n case 'release': {\n const input = parseParams(ReleaseParamsSchema, params, method)\n await releaseOnce(input.handle, ctx)\n return {}\n }\n case 'shutdown': {\n shutdownRan = true\n // A handle whose release failed is still held; shutdown may dispose what releasing needs.\n await releaseHeld(new Set())\n await definition.shutdown?.({ options: current }, ctx)\n return {}\n }\n case 'check': {\n const input = parseParams(CheckParamsSchema, params, method)\n const remotes = input.remotes.map((remote) => ({\n name: remote.name,\n settings: settings(remote.settings),\n }))\n const result = await definition.check?.({ remotes, options: current }, ctx)\n return checkedResult(CheckResultSchema, result, method)\n }\n case 'uploadApp': {\n const input = parseParams(UploadAppParamsSchema, params, method)\n const result = await definition.uploadApp?.(\n { ...input, settings: settings(input.settings), options: current },\n ctx,\n )\n return checkedResult(UploadAppResultSchema, result, method)\n }\n case 'started': {\n const input = parseParams(StartedParamsSchema, params, method)\n const result = await definition.started?.({ ...input, options: current }, ctx)\n return checkedResult(StartedResultSchema, result, method)\n }\n case 'end': {\n const input = parseParams(EndParamsSchema, params, method)\n await definition.end?.({ ...input, options: current }, ctx)\n return {}\n }\n default:\n throw new ProtocolFailure(\n PLUGIN_ERROR_CODES.methodNotFound,\n `${method} is not a method of this plugin`,\n )\n }\n }\n\n const createdHandle = (method: string, outcome: Outcome): Json | undefined => {\n if (outcome.ok) {\n if (method !== 'acquire' || !isRecord(outcome.value)) return undefined\n return outcome.value.handle as Json | undefined\n }\n return outcome.error instanceof PluginError ? outcome.error.handle : undefined\n }\n\n const answerFailure = (id: RequestId, error: unknown) => {\n if (error instanceof ProtocolFailure) {\n fail(id, error.code, error.message, error.data)\n } else if (error instanceof PluginError) {\n fail(id, PLUGIN_ERROR_CODES.plugin, error.message, {\n kind: error.kind,\n ...(error.path === undefined ? {} : { path: error.path }),\n ...(error.handle === undefined ? {} : { handle: error.handle }),\n })\n } else {\n const message = error instanceof Error ? error.message : String(error)\n fail(id, PLUGIN_ERROR_CODES.plugin, message, { kind: 'unreachable' })\n }\n }\n\n const dispatch = async (id: RequestId, method: string, params: unknown) => {\n const entry: PendingCall = { method, controller: new AbortController(), answered: false }\n pending.set(id, entry)\n const ctx: PluginCallContext = {\n signal: entry.controller.signal,\n progress: (update) => {\n if (entry.answered) return\n send({ jsonrpc: '2.0', method: PROGRESS_METHOD, params: { id, ...update } })\n },\n runFacts,\n }\n let outcome: Outcome\n try {\n outcome = { ok: true, value: await call(method, params, ctx) }\n } catch (error) {\n outcome = { ok: false, error }\n }\n clearTimeout(entry.graceTimer)\n if (pending.get(id) === entry) pending.delete(id)\n const handle = createdHandle(method, outcome)\n const tracked = initialized ? handle : undefined\n if (tracked !== undefined) hold(tracked)\n if (entry.answered) {\n // The cancel was already answered without this handle, so nobody else will release it.\n if (tracked !== undefined) await releaseOnce(tracked, detachedContext()).catch(() => {})\n return\n }\n if (leaving) return\n entry.answered = true\n if (outcome.ok) {\n answer(id, outcome.value)\n } else if (entry.controller.signal.aborted) {\n const message = outcome.error instanceof Error ? outcome.error.message : String(outcome.error)\n fail(id, PLUGIN_ERROR_CODES.cancelled, message, {\n kind: 'timeout',\n ...(handle === undefined ? {} : { handle }),\n })\n } else {\n answerFailure(id, outcome.error)\n }\n }\n\n const cancel = (params: unknown) => {\n const parsed = CancelParamsSchema.safeParse(params)\n if (!parsed.success) return\n const { id } = parsed.data\n const entry = pending.get(id)\n if (entry === undefined || entry.controller.signal.aborted) return\n entry.controller.abort()\n entry.graceTimer = setTimeout(() => {\n if (entry.answered) return\n entry.answered = true\n fail(\n id,\n PLUGIN_ERROR_CODES.cancelled,\n `${entry.method} did not stop within ${io.cancelAnswerGraceMs} ms of its cancel`,\n { kind: 'timeout' },\n )\n }, io.cancelAnswerGraceMs)\n }\n\n const handleLine = (line: string) => {\n let message: unknown\n try {\n message = JSON.parse(line)\n } catch {\n fail(null, PLUGIN_ERROR_CODES.parse, 'the line is not JSON')\n return\n }\n if (!isRecord(message)) {\n fail(null, PLUGIN_ERROR_CODES.invalidRequest, 'a message must be a JSON-RPC 2.0 object')\n return\n }\n const id = isRequestId(message.id) ? message.id : null\n if (message.method === undefined && ('result' in message || 'error' in message)) return\n if (message.jsonrpc !== '2.0' || typeof message.method !== 'string') {\n fail(id, PLUGIN_ERROR_CODES.invalidRequest, 'a request needs jsonrpc \"2.0\" and a method')\n return\n }\n if (!('id' in message)) {\n if (message.method === CANCEL_METHOD) cancel(message.params)\n return\n }\n if (id === null) {\n fail(null, PLUGIN_ERROR_CODES.invalidRequest, 'a request id is a string or a number')\n return\n }\n if (leaving) return\n const run = dispatch(id, message.method, message.params)\n inFlight.add(run)\n void run.catch(() => {}).finally(() => inFlight.delete(run))\n }\n\n const decoder = createLineDecoder({\n maxLineBytes: MAX_MESSAGE_BYTES,\n onLine: handleLine,\n onOverflow: () =>\n fail(\n null,\n PLUGIN_ERROR_CODES.invalidRequest,\n `a message is longer than ${MAX_MESSAGE_BYTES} bytes`,\n ),\n })\n\n const stdinClosed = () => {\n if (leaving) return\n decoder.end()\n void leave(RELEASE_ON_CLOSE_BOUND_MS)\n }\n\n if (ownsProcess) process.on('SIGTERM', () => void leave(RELEASE_ON_SIGTERM_BOUND_MS))\n io.stdin.on('data', (chunk) => decoder.push(chunk))\n io.stdin.on('end', stdinClosed)\n io.stdin.on('error', stdinClosed)\n}\n","import { z } from 'zod'\nimport { OPTIONAL_PLUGIN_METHODS, PLUGIN_RUN_FACTS, PLUGIN_SERVES } from './messages.js'\n\n// The manifest sits at package.json[\"agent-qa\"].plugin.\nexport const PLUGIN_MANIFEST_FIELD = 'agent-qa'\n\nconst PackagePathSchema = z.string().min(1)\n\nconst RemotePluginManifestSchema = z.strictObject({\n kind: z.literal('remote'),\n runs: z.literal('process'),\n protocol: z.number().int().positive(),\n entry: PackagePathSchema,\n serves: z.array(z.enum(PLUGIN_SERVES)).nonempty(),\n methods: z.array(z.enum(OPTIONAL_PLUGIN_METHODS)),\n options: PackagePathSchema,\n settings: PackagePathSchema,\n runFacts: z.array(z.enum(PLUGIN_RUN_FACTS)).optional(),\n skill: PackagePathSchema.optional(),\n})\n\nconst ModelAuthManifestSchema = z.strictObject({\n kind: z.literal('model-auth'),\n runs: z.literal('in-process'),\n entry: PackagePathSchema,\n options: PackagePathSchema.optional(),\n})\n\nconst ModelProviderManifestSchema = z.strictObject({\n kind: z.literal('model-provider'),\n runs: z.literal('in-process'),\n entry: PackagePathSchema,\n options: PackagePathSchema.optional(),\n})\n\nexport const PluginManifestSchema = z.discriminatedUnion('kind', [\n RemotePluginManifestSchema,\n ModelAuthManifestSchema,\n ModelProviderManifestSchema,\n])\nexport type PluginManifest = z.infer<typeof PluginManifestSchema>\nexport type RemotePluginManifest = z.infer<typeof RemotePluginManifestSchema>\n","import { mkdirSync, readFileSync, writeFileSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { isDeepStrictEqual } from 'node:util'\nimport { z } from 'zod'\nimport type { PluginDefinition } from './define-plugin.js'\nimport {\n PLUGIN_MANIFEST_FIELD,\n PluginManifestSchema,\n type RemotePluginManifest,\n} from './protocol/manifest.js'\nimport { PLUGIN_PROTOCOL_VERSION } from './protocol/messages.js'\n\nexport interface EmitPluginFilesInput<\n OptionsSchema extends z.ZodType,\n SettingsSchema extends z.ZodType,\n> {\n definition: PluginDefinition<OptionsSchema, SettingsSchema>\n packageDir: string\n}\n\nexport interface EmittedPluginFiles {\n manifest: RemotePluginManifest\n optionsSchemaFile: string\n settingsSchemaFile: string\n packageJsonChanged: boolean\n}\n\nconst OPTIONS_SCHEMA_PATH = './dist/options.schema.json'\nconst SETTINGS_SCHEMA_PATH = './dist/settings.schema.json'\n\nexport function pluginManifest<OptionsSchema extends z.ZodType, SettingsSchema extends z.ZodType>(\n definition: PluginDefinition<OptionsSchema, SettingsSchema>,\n): RemotePluginManifest {\n const manifest = PluginManifestSchema.parse({\n protocol: PLUGIN_PROTOCOL_VERSION,\n kind: 'remote',\n runs: 'process',\n entry: './dist/main.js',\n serves: [...definition.serves],\n methods: [...definition.methods],\n options: OPTIONS_SCHEMA_PATH,\n settings: SETTINGS_SCHEMA_PATH,\n ...(definition.runFacts === undefined ? {} : { runFacts: [...definition.runFacts] }),\n ...(definition.skill === undefined ? {} : { skill: definition.skill }),\n })\n if (manifest.kind !== 'remote') throw new Error('a plugin built with the kit is remote')\n return manifest\n}\n\nfunction schemaText(schema: z.ZodType): string {\n return `${JSON.stringify(z.toJSONSchema(schema, { io: 'input', target: 'draft-2020-12' }), null, 2)}\\n`\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nexport function emitPluginFiles<OptionsSchema extends z.ZodType, SettingsSchema extends z.ZodType>(\n input: EmitPluginFilesInput<OptionsSchema, SettingsSchema>,\n): EmittedPluginFiles {\n const { definition, packageDir } = input\n const manifest = pluginManifest(definition)\n const optionsSchemaFile = join(packageDir, OPTIONS_SCHEMA_PATH)\n const settingsSchemaFile = join(packageDir, SETTINGS_SCHEMA_PATH)\n mkdirSync(join(packageDir, 'dist'), { recursive: true })\n writeFileSync(optionsSchemaFile, schemaText(definition.options))\n writeFileSync(settingsSchemaFile, schemaText(definition.settings))\n\n const packageJsonFile = join(packageDir, 'package.json')\n const parsed: unknown = JSON.parse(readFileSync(packageJsonFile, 'utf8'))\n if (!isRecord(parsed)) throw new Error(`${packageJsonFile} is not a JSON object`)\n const field = isRecord(parsed[PLUGIN_MANIFEST_FIELD]) ? parsed[PLUGIN_MANIFEST_FIELD] : {}\n const packageJsonChanged = !isDeepStrictEqual(field.plugin, manifest)\n if (packageJsonChanged) {\n const next = { ...parsed, [PLUGIN_MANIFEST_FIELD]: { ...field, plugin: manifest } }\n writeFileSync(packageJsonFile, `${JSON.stringify(next, null, 2)}\\n`)\n }\n return { manifest, optionsSchemaFile, settingsSchemaFile, packageJsonChanged }\n}\n","import { PluginError, type PluginErrorOptions } from './define-plugin.js'\n\ntype FailureKind = PluginErrorOptions['kind']\n\nexport type VendorStatusKinds = Readonly<Partial<Record<number, FailureKind>>>\n\nexport function vendorFailureKind(\n status: number | undefined,\n kinds?: VendorStatusKinds,\n): FailureKind {\n if (status === undefined) return 'unreachable'\n const own = kinds?.[status]\n if (own !== undefined) return own\n if (status === 401) return 'auth'\n if (status === 429) return 'capacity'\n return 'refused'\n}\n\nexport interface VendorApiInput {\n vendor: string\n baseUrl: string\n headers?: Record<string, string>\n kinds?: VendorStatusKinds\n}\n\nexport interface VendorRequestInit {\n headers?: Record<string, string>\n body?: string | FormData\n signal?: AbortSignal | undefined\n}\n\nexport interface VendorApi {\n send(method: string, path: string, init?: VendorRequestInit): Promise<Response>\n failure(\n response: Response,\n request: string,\n extra?: { handle?: PluginErrorOptions['handle'] },\n ): Promise<PluginError>\n json(response: Response): Promise<unknown>\n}\n\nconst MAX_REASON_LENGTH = 200\n\nfunction oneLine(text: string): string {\n const line = text.replace(/\\s+/g, ' ').trim()\n return line.length > MAX_REASON_LENGTH ? `${line.slice(0, MAX_REASON_LENGTH)}…` : line\n}\n\nfunction parseJson(text: string): unknown {\n try {\n return JSON.parse(text) as unknown\n } catch {\n return undefined\n }\n}\n\nfunction vendorReason(body: unknown): string | undefined {\n if (typeof body !== 'object' || body === null) return undefined\n for (const field of ['message', 'error'] as const) {\n const value = (body as Record<string, unknown>)[field]\n if (typeof value === 'string' && value.trim() !== '') return oneLine(value)\n }\n return undefined\n}\n\n// Retry-After is a number of seconds or an HTTP date.\nfunction retryWait(retryAfter: string | null): string {\n const value = retryAfter?.trim() ?? ''\n if (value === '') return ''\n return /^\\d+$/.test(value) ? `, retry after ${value} s` : `, retry after ${oneLine(value)}`\n}\n\nfunction causeText(error: unknown): string {\n if (!(error instanceof Error)) return oneLine(String(error))\n const cause = error.cause\n if (cause instanceof Error) {\n const code = 'code' in cause && typeof cause.code === 'string' ? cause.code : cause.message\n return oneLine(code)\n }\n return oneLine(error.message)\n}\n\nexport function createVendorApi(input: VendorApiInput): VendorApi {\n const base = input.baseUrl.endsWith('/') ? input.baseUrl : `${input.baseUrl}/`\n\n return {\n async send(method, path, init = {}) {\n const url = new URL(path, base)\n // Headers match names case-insensitively, so a fixed credential always wins.\n const headers = new Headers(init.headers)\n for (const [name, value] of Object.entries(input.headers ?? {})) {\n try {\n headers.set(name, value)\n } catch {\n // The runtime's error echoes the refused value, which is a credential.\n throw new PluginError(\n `${input.vendor} credentials hold a character a header cannot carry.`,\n { kind: 'auth' },\n )\n }\n }\n try {\n return await fetch(url, {\n method,\n headers,\n ...(init.body === undefined ? {} : { body: init.body }),\n ...(init.signal === undefined ? {} : { signal: init.signal }),\n })\n } catch (error) {\n if (init.signal?.aborted === true) throw error\n throw new PluginError(\n `${input.vendor} could not be reached at ${url.origin}: ${causeText(error)}`,\n { kind: 'unreachable' },\n )\n }\n },\n\n async failure(response, request, extra = {}) {\n const text = await response.text().catch(() => '')\n const message = vendorReason(parseJson(text))\n const reason = message === undefined ? '' : `: ${message}`\n const wait = response.status === 429 ? retryWait(response.headers.get('retry-after')) : ''\n return new PluginError(\n `${input.vendor} answered ${response.status} to ${request}${reason}${wait}`,\n {\n kind: vendorFailureKind(response.status, input.kinds),\n ...(extra.handle === undefined ? {} : { handle: extra.handle }),\n },\n )\n },\n\n async json(response) {\n return parseJson(await response.text())\n },\n }\n}\n\nexport interface EndpointOption<Path extends string = string> {\n path: Path\n scheme: 'https' | 'wss'\n}\n\nconst PLAIN_TWIN = { https: 'http:', wss: 'ws:' } as const\n\nfunction isLoopback(hostname: string): boolean {\n return hostname === 'localhost' || hostname === '[::1]' || /^127(?:\\.\\d{1,3}){3}$/.test(hostname)\n}\n\nexport function checkEndpoints<Options extends Record<string, unknown>>(\n options: Options,\n endpoints: readonly EndpointOption<keyof Options & string>[],\n): void {\n for (const { path, scheme } of endpoints) {\n const value = options[path]\n if (value === undefined) continue\n const url = URL.parse(String(value))\n const allowed =\n url !== null &&\n url.username === '' &&\n url.password === '' &&\n (url.protocol === `${scheme}:` ||\n (url.protocol === PLAIN_TWIN[scheme] && isLoopback(url.hostname)))\n if (!allowed) {\n throw new PluginError(\n `${path} must use ${scheme}:// with no user or password, unless it points at this machine.`,\n { kind: 'refused', path },\n )\n }\n }\n}\n"],"mappings":"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"}
package/dist/index.d.cts CHANGED
@@ -238,4 +238,31 @@ interface EmittedPluginFiles {
238
238
  }
239
239
  export declare function pluginManifest<OptionsSchema extends z$1.ZodType, SettingsSchema extends z$1.ZodType>(definition: PluginDefinition<OptionsSchema, SettingsSchema>): RemotePluginManifest;
240
240
  export declare function emitPluginFiles<OptionsSchema extends z$1.ZodType, SettingsSchema extends z$1.ZodType>(input: EmitPluginFilesInput<OptionsSchema, SettingsSchema>): EmittedPluginFiles;
241
- export { type AcquireInput, type CheckInput, type EmitPluginFilesInput, type EmittedPluginFiles, type EndInput, type InitializeInput, type PluginCallContext, type PluginDefinition, type PluginErrorOptions, type PluginIo, type PluginProgress, type PluginSpec, type ReleaseInput, type ShutdownInput, type StartedInput, type UploadAppInput, z };
241
+ type FailureKind = PluginErrorOptions['kind'];
242
+ type VendorStatusKinds = Readonly<Partial<Record<number, FailureKind>>>;
243
+ export declare function vendorFailureKind(status: number | undefined, kinds?: VendorStatusKinds): FailureKind;
244
+ interface VendorApiInput {
245
+ vendor: string;
246
+ baseUrl: string;
247
+ headers?: Record<string, string>;
248
+ kinds?: VendorStatusKinds;
249
+ }
250
+ interface VendorRequestInit {
251
+ headers?: Record<string, string>;
252
+ body?: string | FormData;
253
+ signal?: AbortSignal | undefined;
254
+ }
255
+ interface VendorApi {
256
+ send(method: string, path: string, init?: VendorRequestInit): Promise<Response>;
257
+ failure(response: Response, request: string, extra?: {
258
+ handle?: PluginErrorOptions['handle'];
259
+ }): Promise<PluginError>;
260
+ json(response: Response): Promise<unknown>;
261
+ }
262
+ export declare function createVendorApi(input: VendorApiInput): VendorApi;
263
+ interface EndpointOption<Path extends string = string> {
264
+ path: Path;
265
+ scheme: 'https' | 'wss';
266
+ }
267
+ export declare function checkEndpoints<Options extends Record<string, unknown>>(options: Options, endpoints: readonly EndpointOption<keyof Options & string>[]): void;
268
+ export { type AcquireInput, type CheckInput, type EmitPluginFilesInput, type EmittedPluginFiles, type EndInput, type EndpointOption, type InitializeInput, type PluginCallContext, type PluginDefinition, type PluginErrorOptions, type PluginIo, type PluginProgress, type PluginSpec, type ReleaseInput, type ShutdownInput, type StartedInput, type UploadAppInput, type VendorApi, type VendorApiInput, type VendorRequestInit, type VendorStatusKinds, z };
package/dist/index.d.ts CHANGED
@@ -238,4 +238,31 @@ interface EmittedPluginFiles {
238
238
  }
239
239
  export declare function pluginManifest<OptionsSchema extends z$1.ZodType, SettingsSchema extends z$1.ZodType>(definition: PluginDefinition<OptionsSchema, SettingsSchema>): RemotePluginManifest;
240
240
  export declare function emitPluginFiles<OptionsSchema extends z$1.ZodType, SettingsSchema extends z$1.ZodType>(input: EmitPluginFilesInput<OptionsSchema, SettingsSchema>): EmittedPluginFiles;
241
- export { type AcquireInput, type CheckInput, type EmitPluginFilesInput, type EmittedPluginFiles, type EndInput, type InitializeInput, type PluginCallContext, type PluginDefinition, type PluginErrorOptions, type PluginIo, type PluginProgress, type PluginSpec, type ReleaseInput, type ShutdownInput, type StartedInput, type UploadAppInput, z };
241
+ type FailureKind = PluginErrorOptions['kind'];
242
+ type VendorStatusKinds = Readonly<Partial<Record<number, FailureKind>>>;
243
+ export declare function vendorFailureKind(status: number | undefined, kinds?: VendorStatusKinds): FailureKind;
244
+ interface VendorApiInput {
245
+ vendor: string;
246
+ baseUrl: string;
247
+ headers?: Record<string, string>;
248
+ kinds?: VendorStatusKinds;
249
+ }
250
+ interface VendorRequestInit {
251
+ headers?: Record<string, string>;
252
+ body?: string | FormData;
253
+ signal?: AbortSignal | undefined;
254
+ }
255
+ interface VendorApi {
256
+ send(method: string, path: string, init?: VendorRequestInit): Promise<Response>;
257
+ failure(response: Response, request: string, extra?: {
258
+ handle?: PluginErrorOptions['handle'];
259
+ }): Promise<PluginError>;
260
+ json(response: Response): Promise<unknown>;
261
+ }
262
+ export declare function createVendorApi(input: VendorApiInput): VendorApi;
263
+ interface EndpointOption<Path extends string = string> {
264
+ path: Path;
265
+ scheme: 'https' | 'wss';
266
+ }
267
+ export declare function checkEndpoints<Options extends Record<string, unknown>>(options: Options, endpoints: readonly EndpointOption<keyof Options & string>[]): void;
268
+ export { type AcquireInput, type CheckInput, type EmitPluginFilesInput, type EmittedPluginFiles, type EndInput, type EndpointOption, type InitializeInput, type PluginCallContext, type PluginDefinition, type PluginErrorOptions, type PluginIo, type PluginProgress, type PluginSpec, type ReleaseInput, type ShutdownInput, type StartedInput, type UploadAppInput, type VendorApi, type VendorApiInput, type VendorRequestInit, type VendorStatusKinds, z };
package/dist/index.js CHANGED
@@ -795,6 +795,100 @@ function emitPluginFiles(input) {
795
795
  packageJsonChanged
796
796
  };
797
797
  }
798
- export { CANCEL_ANSWER_GRACE_MS, HOST_PID_POLL_MS, PluginError, credential, definePlugin, emitPluginFiles, pluginManifest, runPlugin, z };
798
+ // src/vendor-api.ts
799
+ function vendorFailureKind(status, kinds) {
800
+ if (status === void 0) return "unreachable";
801
+ const own = kinds?.[status];
802
+ if (own !== void 0) return own;
803
+ if (status === 401) return "auth";
804
+ if (status === 429) return "capacity";
805
+ return "refused";
806
+ }
807
+ const MAX_REASON_LENGTH = 200;
808
+ function oneLine(text) {
809
+ const line = text.replace(/\s+/g, " ").trim();
810
+ return line.length > MAX_REASON_LENGTH ? `${line.slice(0, MAX_REASON_LENGTH)}…` : line;
811
+ }
812
+ function parseJson(text) {
813
+ try {
814
+ return JSON.parse(text);
815
+ } catch {
816
+ return;
817
+ }
818
+ }
819
+ function vendorReason(body) {
820
+ if (typeof body !== "object" || body === null) return void 0;
821
+ for (const field of ["message", "error"]) {
822
+ const value = body[field];
823
+ if (typeof value === "string" && value.trim() !== "") return oneLine(value);
824
+ }
825
+ }
826
+ function retryWait(retryAfter) {
827
+ const value = retryAfter?.trim() ?? "";
828
+ if (value === "") return "";
829
+ return /^\d+$/.test(value) ? `, retry after ${value} s` : `, retry after ${oneLine(value)}`;
830
+ }
831
+ function causeText(error) {
832
+ if (!(error instanceof Error)) return oneLine(String(error));
833
+ const cause = error.cause;
834
+ if (cause instanceof Error) return oneLine("code" in cause && typeof cause.code === "string" ? cause.code : cause.message);
835
+ return oneLine(error.message);
836
+ }
837
+ function createVendorApi(input) {
838
+ const base = input.baseUrl.endsWith("/") ? input.baseUrl : `${input.baseUrl}/`;
839
+ return {
840
+ async send(method, path, init = {}) {
841
+ const url = new URL(path, base);
842
+ const headers = new Headers(init.headers);
843
+ for (const [name, value] of Object.entries(input.headers ?? {})) try {
844
+ headers.set(name, value);
845
+ } catch {
846
+ throw new PluginError(`${input.vendor} credentials hold a character a header cannot carry.`, { kind: "auth" });
847
+ }
848
+ try {
849
+ return await fetch(url, {
850
+ method,
851
+ headers,
852
+ ...init.body === void 0 ? {} : { body: init.body },
853
+ ...init.signal === void 0 ? {} : { signal: init.signal }
854
+ });
855
+ } catch (error) {
856
+ if (init.signal?.aborted === true) throw error;
857
+ throw new PluginError(`${input.vendor} could not be reached at ${url.origin}: ${causeText(error)}`, { kind: "unreachable" });
858
+ }
859
+ },
860
+ async failure(response, request, extra = {}) {
861
+ const message = vendorReason(parseJson(await response.text().catch(() => "")));
862
+ const reason = message === void 0 ? "" : `: ${message}`;
863
+ const wait = response.status === 429 ? retryWait(response.headers.get("retry-after")) : "";
864
+ return new PluginError(`${input.vendor} answered ${response.status} to ${request}${reason}${wait}`, {
865
+ kind: vendorFailureKind(response.status, input.kinds),
866
+ ...extra.handle === void 0 ? {} : { handle: extra.handle }
867
+ });
868
+ },
869
+ async json(response) {
870
+ return parseJson(await response.text());
871
+ }
872
+ };
873
+ }
874
+ const PLAIN_TWIN = {
875
+ https: "http:",
876
+ wss: "ws:"
877
+ };
878
+ function isLoopback(hostname) {
879
+ return hostname === "localhost" || hostname === "[::1]" || /^127(?:\.\d{1,3}){3}$/.test(hostname);
880
+ }
881
+ function checkEndpoints(options, endpoints) {
882
+ for (const { path, scheme } of endpoints) {
883
+ const value = options[path];
884
+ if (value === void 0) continue;
885
+ const url = URL.parse(String(value));
886
+ if (!(url !== null && url.username === "" && url.password === "" && (url.protocol === `${scheme}:` || url.protocol === PLAIN_TWIN[scheme] && isLoopback(url.hostname)))) throw new PluginError(`${path} must use ${scheme}:// with no user or password, unless it points at this machine.`, {
887
+ kind: "refused",
888
+ path
889
+ });
890
+ }
891
+ }
892
+ export { CANCEL_ANSWER_GRACE_MS, HOST_PID_POLL_MS, PluginError, checkEndpoints, createVendorApi, credential, definePlugin, emitPluginFiles, pluginManifest, runPlugin, vendorFailureKind, z };
799
893
 
800
894
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["z","z","isRecord","z","z"],"sources":["../src/credential.ts","../src/protocol/messages.ts","../src/define-plugin.ts","../src/package-root.ts","../src/protocol/framing.ts","../src/run-plugin.ts","../src/protocol/manifest.ts","../src/emit.ts"],"sourcesContent":["import { z } from 'zod'\n\n// No pattern or format: a config holds a secret reference here, not the secret itself.\nexport function credential(description?: string) {\n return z.string().meta({ credential: true, ...(description ? { description } : {}) })\n}\n","import { z } from 'zod'\n\nexport const PLUGIN_PROTOCOL_VERSION = 1\n\nexport const PLUGIN_METHODS = [\n 'initialize',\n 'check',\n 'acquire',\n 'uploadApp',\n 'started',\n 'end',\n 'release',\n 'shutdown',\n] as const\nexport type PluginMethod = (typeof PLUGIN_METHODS)[number]\n\nexport const OPTIONAL_PLUGIN_METHODS = ['check', 'uploadApp', 'started', 'end'] as const\nexport type OptionalPluginMethod = (typeof OPTIONAL_PLUGIN_METHODS)[number]\n\nexport const PLUGIN_SERVES = ['playwright', 'cdp', 'appium'] as const\nexport type PluginServe = (typeof PLUGIN_SERVES)[number]\n\nexport const PLUGIN_RUN_FACTS = ['testName', 'runId', 'failure'] as const\nexport type PluginRunFact = (typeof PLUGIN_RUN_FACTS)[number]\n\nexport const PLUGIN_FAILURE_KINDS = [\n 'unreachable',\n 'auth',\n 'capacity',\n 'timeout',\n 'version',\n 'refused',\n 'ended',\n 'lost',\n] as const\nexport type PluginFailureKind = (typeof PLUGIN_FAILURE_KINDS)[number]\n\nexport const PLUGIN_ERROR_CODES = {\n parse: -32700,\n invalidRequest: -32600,\n methodNotFound: -32601,\n invalidParams: -32602,\n plugin: -32000,\n cancelled: -32800,\n} as const\n\nexport const CANCEL_METHOD = '$/cancel'\nexport const PROGRESS_METHOD = '$/progress'\n\nexport const MAX_MESSAGE_BYTES = 1024 * 1024\n\nconst JsonObjectSchema = z.record(z.string(), z.unknown())\nconst HandleSchema = z.json()\nconst RequestIdSchema = z.union([z.string(), z.number()])\n\nexport const InitializeParamsSchema = z.object({\n protocolVersions: z.array(z.number().int()),\n host: z.object({\n pid: z.number().int(),\n agentQaVersion: z.string(),\n playwrightVersion: z.string(),\n webdriverioVersion: z.string(),\n }),\n entry: z.string(),\n options: JsonObjectSchema,\n runFacts: z.object({ runId: z.string().optional() }).optional(),\n})\nexport type InitializeParams = z.infer<typeof InitializeParamsSchema>\n\nexport const InitializeResultSchema = z.object({\n protocolVersion: z.number().int(),\n plugin: z.object({ name: z.string(), version: z.string() }),\n serves: z.array(z.enum(PLUGIN_SERVES)),\n methods: z.array(z.enum(OPTIONAL_PLUGIN_METHODS)),\n})\nexport type InitializeResult = z.infer<typeof InitializeResultSchema>\n\nexport const CheckParamsSchema = z.object({\n remotes: z.array(z.object({ name: z.string(), settings: JsonObjectSchema })),\n})\nexport type CheckParams = z.infer<typeof CheckParamsSchema>\n\nexport const CheckResultSchema = z.object({\n state: z.enum(['ok', 'warn']),\n lines: z.array(z.string()),\n})\nexport type CheckResult = z.infer<typeof CheckResultSchema>\n\nconst WebSessionSchema = z.object({\n platform: z.literal('web'),\n engine: z.enum(['chromium', 'firefox', 'webkit']),\n context: z.enum(['new', 'reuse']),\n})\n\nconst DeviceSessionSchema = z.object({\n platform: z.enum(['android', 'ios']),\n capabilities: JsonObjectSchema,\n})\n\nexport const AcquireParamsSchema = z.object({\n remote: z.string(),\n settings: JsonObjectSchema,\n session: z.discriminatedUnion('platform', [WebSessionSchema, DeviceSessionSchema]),\n run: z.object({ testName: z.string().optional() }).optional(),\n})\nexport type AcquireParams = z.infer<typeof AcquireParamsSchema>\n\nexport const AcquireResultSchema = z.object({\n handle: HandleSchema,\n protocol: z.enum(PLUGIN_SERVES),\n url: z.string(),\n headers: z.record(z.string(), z.string()).optional(),\n capabilities: JsonObjectSchema.optional(),\n mask: z.array(z.string()).optional(),\n link: z.string().optional(),\n})\nexport type AcquireResult = z.infer<typeof AcquireResultSchema>\n\nexport const UploadAppParamsSchema = z.object({\n remote: z.string(),\n settings: JsonObjectSchema,\n platform: z.enum(['android', 'ios']),\n path: z.string(),\n sha256: z.string(),\n size: z.number().int().nonnegative(),\n})\nexport type UploadAppParams = z.infer<typeof UploadAppParamsSchema>\n\nexport const UploadAppResultSchema = z.object({ ref: z.string() })\nexport type UploadAppResult = z.infer<typeof UploadAppResultSchema>\n\nexport const StartedParamsSchema = z.object({\n handle: HandleSchema,\n sessionId: z.string().optional(),\n})\nexport type StartedParams = z.infer<typeof StartedParamsSchema>\n\nexport const StartedResultSchema = z.object({\n link: z.string().optional(),\n appiumVersion: z.string().optional(),\n})\nexport type StartedResult = z.infer<typeof StartedResultSchema>\n\nexport const EndParamsSchema = z.object({\n handle: HandleSchema,\n outcome: z.enum(['passed', 'failed', 'error', 'cancelled']),\n reason: z.string().optional(),\n})\nexport type EndParams = z.infer<typeof EndParamsSchema>\n\nexport const ReleaseParamsSchema = z.object({ handle: HandleSchema })\nexport type ReleaseParams = z.infer<typeof ReleaseParamsSchema>\n\nexport const CancelParamsSchema = z.object({ id: RequestIdSchema })\nexport type CancelParams = z.infer<typeof CancelParamsSchema>\n\nexport const ProgressParamsSchema = z.object({\n id: RequestIdSchema,\n message: z.string(),\n queued: z.number().int().nonnegative().optional(),\n percent: z.number().min(0).max(100).optional(),\n})\nexport type ProgressParams = z.infer<typeof ProgressParamsSchema>\n\nexport const PluginErrorDataSchema = z.object({\n kind: z.enum(PLUGIN_FAILURE_KINDS),\n path: z.string().optional(),\n handle: HandleSchema.optional(),\n supported: z.array(z.number().int()).optional(),\n requested: z.array(z.number().int()).optional(),\n})\nexport type PluginErrorData = z.infer<typeof PluginErrorDataSchema>\n","import type { z } from 'zod'\nimport {\n OPTIONAL_PLUGIN_METHODS,\n type AcquireParams,\n type AcquireResult,\n type CheckResult,\n type EndParams,\n type InitializeParams,\n type OptionalPluginMethod,\n type PluginFailureKind,\n type PluginRunFact,\n type PluginServe,\n type StartedParams,\n type StartedResult,\n type UploadAppParams,\n type UploadAppResult,\n} from './protocol/messages.js'\n\ntype Json = z.core.util.JSONType\ntype Awaitable<T> = T | Promise<T>\n\nexport interface PluginErrorOptions {\n kind: PluginFailureKind\n path?: string\n handle?: Json\n}\n\nexport class PluginError extends Error {\n readonly kind: PluginFailureKind\n readonly path: string | undefined\n readonly handle: Json | undefined\n\n constructor(message: string, options: PluginErrorOptions) {\n super(message)\n this.name = 'PluginError'\n this.kind = options.kind\n this.path = options.path\n this.handle = options.handle\n }\n}\n\nexport interface InitializeInput<Options> {\n options: Options\n host: InitializeParams['host']\n entry: string\n runFacts: InitializeParams['runFacts']\n}\n\nexport interface CheckInput<Options, Settings> {\n options: Options\n remotes: { name: string; settings: Settings }[]\n}\n\nexport interface AcquireInput<Options, Settings> extends Omit<AcquireParams, 'settings'> {\n options: Options\n settings: Settings\n}\n\nexport interface UploadAppInput<Options, Settings> extends Omit<UploadAppParams, 'settings'> {\n options: Options\n settings: Settings\n}\n\nexport interface StartedInput<Options> extends StartedParams {\n options: Options\n}\n\nexport interface EndInput<Options> extends EndParams {\n options: Options\n}\n\nexport interface ReleaseInput<Options> {\n options: Options\n handle: Json\n}\n\nexport interface ShutdownInput<Options> {\n options: Options\n}\n\nexport interface PluginProgress {\n message: string\n queued?: number\n percent?: number\n}\n\nexport interface PluginCallContext {\n signal: AbortSignal\n progress(update: PluginProgress): void\n runFacts: InitializeParams['runFacts']\n}\n\nexport interface PluginSpec<OptionsSchema extends z.ZodType, SettingsSchema extends z.ZodType> {\n options: OptionsSchema\n settings: SettingsSchema\n serves: readonly PluginServe[]\n runFacts?: readonly PluginRunFact[]\n skill?: string\n initialize?(\n input: InitializeInput<z.output<OptionsSchema>>,\n ctx: PluginCallContext,\n ): Awaitable<void>\n check?(\n input: CheckInput<z.output<OptionsSchema>, z.output<SettingsSchema>>,\n ctx: PluginCallContext,\n ): Awaitable<CheckResult>\n acquire(\n input: AcquireInput<z.output<OptionsSchema>, z.output<SettingsSchema>>,\n ctx: PluginCallContext,\n ): Awaitable<AcquireResult>\n uploadApp?(\n input: UploadAppInput<z.output<OptionsSchema>, z.output<SettingsSchema>>,\n ctx: PluginCallContext,\n ): Awaitable<UploadAppResult>\n started?(\n input: StartedInput<z.output<OptionsSchema>>,\n ctx: PluginCallContext,\n ): Awaitable<StartedResult>\n end?(input: EndInput<z.output<OptionsSchema>>, ctx: PluginCallContext): Awaitable<void>\n release(input: ReleaseInput<z.output<OptionsSchema>>, ctx: PluginCallContext): Awaitable<void>\n shutdown?(input: ShutdownInput<z.output<OptionsSchema>>, ctx: PluginCallContext): Awaitable<void>\n}\n\nexport interface PluginDefinition<\n OptionsSchema extends z.ZodType = z.ZodType,\n SettingsSchema extends z.ZodType = z.ZodType,\n> extends PluginSpec<OptionsSchema, SettingsSchema> {\n methods: readonly OptionalPluginMethod[]\n}\n\nexport function definePlugin<OptionsSchema extends z.ZodType, SettingsSchema extends z.ZodType>(\n spec: PluginSpec<OptionsSchema, SettingsSchema>,\n): PluginDefinition<OptionsSchema, SettingsSchema> {\n const methods = OPTIONAL_PLUGIN_METHODS.filter((method) => typeof spec[method] === 'function')\n return { ...spec, methods }\n}\n","import { existsSync, readFileSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\n\nexport function findPackageRoot(fromDir: string): string | undefined {\n let dir = fromDir\n for (;;) {\n if (existsSync(join(dir, 'package.json'))) return dir\n const parent = dirname(dir)\n if (parent === dir) return undefined\n dir = parent\n }\n}\n\nexport function readPackageJson(packageRoot: string): Record<string, unknown> {\n const parsed: unknown = JSON.parse(readFileSync(join(packageRoot, 'package.json'), 'utf8'))\n return typeof parsed === 'object' && parsed !== null ? (parsed as Record<string, unknown>) : {}\n}\n","export function encodeMessage(message: unknown): string {\n return `${JSON.stringify(message)}\\n`\n}\n\nexport interface LineDecoderOptions {\n maxLineBytes: number\n onLine: (line: string) => void\n onOverflow: () => void\n}\n\nexport interface LineDecoder {\n push(chunk: Uint8Array | string): void\n end(): void\n}\n\nconst NEWLINE = 0x0a\n\nexport function createLineDecoder({\n maxLineBytes,\n onLine,\n onOverflow,\n}: LineDecoderOptions): LineDecoder {\n const encoder = new TextEncoder()\n const decoder = new TextDecoder()\n let parts: Uint8Array[] = []\n let size = 0\n let discarding = false\n\n const append = (segment: Uint8Array) => {\n if (discarding || segment.length === 0) return\n if (size + segment.length > maxLineBytes) {\n discarding = true\n parts = []\n size = 0\n onOverflow()\n return\n }\n parts.push(new Uint8Array(segment))\n size += segment.length\n }\n\n const finishLine = () => {\n const wasDiscarding = discarding\n const lineParts = parts\n const lineSize = size\n parts = []\n size = 0\n discarding = false\n if (wasDiscarding || lineSize === 0) return\n const bytes = new Uint8Array(lineSize)\n let offset = 0\n for (const part of lineParts) {\n bytes.set(part, offset)\n offset += part.length\n }\n const line = decoder.decode(bytes).replace(/\\r$/, '')\n if (line.trim() !== '') onLine(line)\n }\n\n return {\n push(chunk) {\n const bytes = typeof chunk === 'string' ? encoder.encode(chunk) : chunk\n let start = 0\n while (start <= bytes.length) {\n const newline = bytes.indexOf(NEWLINE, start)\n if (newline === -1) {\n append(bytes.subarray(start))\n return\n }\n append(bytes.subarray(start, newline))\n finishLine()\n start = newline + 1\n }\n },\n end() {\n finishLine()\n },\n }\n}\n","import { realpathSync, writeSync } from 'node:fs'\nimport { dirname } from 'node:path'\nimport { format, inspect } from 'node:util'\nimport type { z } from 'zod'\nimport { PluginError, type PluginCallContext, type PluginDefinition } from './define-plugin.js'\nimport { findPackageRoot, readPackageJson } from './package-root.js'\nimport { createLineDecoder, encodeMessage } from './protocol/framing.js'\nimport {\n AcquireParamsSchema,\n AcquireResultSchema,\n CANCEL_METHOD,\n CancelParamsSchema,\n CheckParamsSchema,\n CheckResultSchema,\n EndParamsSchema,\n InitializeParamsSchema,\n MAX_MESSAGE_BYTES,\n OPTIONAL_PLUGIN_METHODS,\n PLUGIN_ERROR_CODES,\n PLUGIN_METHODS,\n PLUGIN_PROTOCOL_VERSION,\n PROGRESS_METHOD,\n ReleaseParamsSchema,\n StartedParamsSchema,\n StartedResultSchema,\n UploadAppParamsSchema,\n UploadAppResultSchema,\n type InitializeParams,\n type InitializeResult,\n type OptionalPluginMethod,\n type PluginMethod,\n} from './protocol/messages.js'\n\nexport interface PluginIo {\n stdin: {\n on(event: 'data', listener: (chunk: Uint8Array | string) => void): unknown\n on(event: 'end' | 'error', listener: () => void): unknown\n }\n stdout: { write(chunk: string, callback?: (error?: Error | null) => void): unknown }\n exit(code: number): void\n entryPath?: string\n cancelAnswerGraceMs: number\n hostPidPollMs: number\n}\n\ntype RequestId = string | number\ntype Json = z.core.util.JSONType\n\nexport const CANCEL_ANSWER_GRACE_MS = 4_000\nexport const HOST_PID_POLL_MS = 1_000\nconst RELEASE_ON_CLOSE_BOUND_MS = 30_000\nconst RELEASE_ON_SIGTERM_BOUND_MS = 4_000\n\nconst SUPPORTED_PROTOCOL_VERSIONS = [PLUGIN_PROTOCOL_VERSION]\n\nclass ProtocolFailure extends Error {\n constructor(\n readonly code: number,\n message: string,\n readonly data?: Record<string, unknown>,\n ) {\n super(message)\n }\n}\n\nfunction resolveIo(io: Partial<PluginIo>): PluginIo {\n return {\n stdin: io.stdin ?? process.stdin,\n stdout: io.stdout ?? process.stdout,\n exit: io.exit ?? ((code) => process.exit(code)),\n entryPath: io.entryPath ?? process.argv[1],\n cancelAnswerGraceMs: io.cancelAnswerGraceMs ?? CANCEL_ANSWER_GRACE_MS,\n hostPidPollMs: io.hostPidPollMs ?? HOST_PID_POLL_MS,\n }\n}\n\nfunction routeStrayOutputToStderr() {\n const toLog = (...args: unknown[]) => {\n process.stderr.write(`${format(...args)}\\n`)\n }\n console.log = toLog\n console.info = toLog\n console.debug = toLog\n console.warn = toLog\n process.stdout.write = process.stderr.write.bind(process.stderr) as typeof process.stdout.write\n}\n\nfunction hostGone(hostPid: number, startPpid: number): boolean {\n if (process.ppid !== startPpid) return true\n try {\n process.kill(hostPid, 0)\n return false\n } catch (error) {\n return (error as NodeJS.ErrnoException).code === 'ESRCH'\n }\n}\n\n// Handles are JSON; two handles are the same session when their JSON is equal.\nfunction handleKey(handle: Json): string {\n const canonical = (value: Json): Json => {\n if (Array.isArray(value)) return value.map(canonical)\n if (value === null || typeof value !== 'object') return value\n return Object.fromEntries(\n Object.keys(value)\n .sort()\n .map((key) => [key, canonical(value[key] as Json)]),\n )\n }\n return JSON.stringify(canonical(handle))\n}\n\nfunction within<T>(work: Promise<T>, boundMs: number): Promise<T | undefined> {\n let timer: NodeJS.Timeout | undefined\n const bound = new Promise<undefined>((resolve) => {\n timer = setTimeout(() => resolve(undefined), boundMs)\n })\n return Promise.race([work, bound]).finally(() => clearTimeout(timer))\n}\n\ntype Outcome = { ok: true; value: unknown } | { ok: false; error: unknown }\n\ninterface PendingCall {\n method: string\n controller: AbortController\n answered: boolean\n graceTimer?: NodeJS.Timeout\n}\n\nfunction firstLine(message: string): string {\n return message.split(/\\r?\\n/, 1)[0] ?? ''\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction isRequestId(value: unknown): value is RequestId {\n return typeof value === 'string' || typeof value === 'number'\n}\n\nfunction isPluginMethod(method: string): method is PluginMethod {\n return (PLUGIN_METHODS as readonly string[]).includes(method)\n}\n\nfunction isOptionalMethod(method: PluginMethod): method is OptionalPluginMethod {\n return (OPTIONAL_PLUGIN_METHODS as readonly string[]).includes(method)\n}\n\nfunction issuePath(issue: z.core.$ZodIssue): string {\n return issue.path.map(String).join('.')\n}\n\nfunction parseParams<Schema extends z.ZodType>(\n schema: Schema,\n params: unknown,\n method: string,\n): z.output<Schema> {\n const parsed = schema.safeParse(params ?? {})\n if (parsed.success) return parsed.data\n const issue = parsed.error.issues[0]\n const where = issue === undefined ? '' : issuePath(issue)\n throw new ProtocolFailure(\n PLUGIN_ERROR_CODES.invalidParams,\n `${method} params${where === '' ? '' : ` at ${where}`}: ${issue?.message ?? 'invalid'}`,\n )\n}\n\n// A refusal's path starts with options. or settings., naming the block that holds the field.\nfunction refuse(schema: z.ZodType, value: unknown, prefix: 'options' | 'settings'): unknown {\n const parsed = schema.safeParse(value)\n if (parsed.success) return parsed.data\n const issue = parsed.error.issues[0]\n const inner = issue === undefined ? '' : issuePath(issue)\n const path = inner === '' ? undefined : `${prefix}.${inner}`\n throw new PluginError(`${path ?? prefix}: ${issue?.message ?? 'invalid'}`, {\n kind: 'refused',\n ...(path === undefined ? {} : { path }),\n })\n}\n\nfunction checkedResult(schema: z.ZodType, value: unknown, method: string): unknown {\n const parsed = schema.safeParse(value)\n if (parsed.success) return value\n const issue = parsed.error.issues[0]\n const where = issue === undefined ? '' : issuePath(issue)\n const handle =\n method === 'acquire' && isRecord(value) && value.handle !== undefined\n ? (value.handle as Json)\n : undefined\n throw new PluginError(\n `${method} answered a malformed result${where === '' ? '' : ` at ${where}`}: ${issue?.message ?? 'invalid'}`,\n { kind: 'refused', ...(handle === undefined ? {} : { handle }) },\n )\n}\n\nfunction pluginIdentity(entryPath: string | undefined): InitializeResult['plugin'] {\n const unknown = { name: 'unknown', version: 'unknown' }\n if (entryPath === undefined) return unknown\n try {\n const root = findPackageRoot(dirname(realpathSync(entryPath)))\n if (root === undefined) return unknown\n const pkg = readPackageJson(root)\n return {\n name: typeof pkg.name === 'string' ? pkg.name : unknown.name,\n version: typeof pkg.version === 'string' ? pkg.version : unknown.version,\n }\n } catch {\n return unknown\n }\n}\n\nexport function runPlugin<OptionsSchema extends z.ZodType, SettingsSchema extends z.ZodType>(\n definition: PluginDefinition<OptionsSchema, SettingsSchema>,\n ioInput: Partial<PluginIo> = {},\n): void {\n const io = resolveIo(ioInput)\n const write = io.stdout.write.bind(io.stdout)\n // A caller that brings its own stdout keeps the process's console, streams and signals.\n const ownsProcess = ioInput.stdout === undefined\n if (ownsProcess) {\n routeStrayOutputToStderr()\n // Once the host is gone its pipes have no reader; EPIPE must not stop the releases.\n process.stdout.on('error', () => {})\n process.stderr.on('error', () => {})\n process.on('SIGINT', () => {})\n // Node's own report starts with the throwing source line, and the host takes stderr's first\n // line as the crash's reason.\n process.on('uncaughtException', (error) => {\n try {\n writeSync(2, `${inspect(error)}\\n`)\n } catch {}\n process.exit(1)\n })\n }\n\n const send = (message: Record<string, unknown>) => {\n if (leaving) return\n write(encodeMessage(message))\n }\n const answer = (id: RequestId, result: unknown) => send({ jsonrpc: '2.0', id, result })\n const fail = (\n id: RequestId | null,\n code: number,\n message: string,\n data?: Record<string, unknown>,\n ) =>\n send({\n jsonrpc: '2.0',\n id,\n error: { code, message: firstLine(message), ...(data === undefined ? {} : { data }) },\n })\n\n let options: z.output<OptionsSchema> | undefined\n let runFacts: InitializeParams['runFacts']\n let initialized = false\n let initializing = false\n let shutdownRan = false\n let leaving = false\n let hostPoll: NodeJS.Timeout | undefined\n const startPpid = process.ppid\n const pending = new Map<RequestId, PendingCall>()\n const inFlight = new Set<Promise<void>>()\n const held = new Map<string, Json>()\n const releasing = new Map<string, Promise<void>>()\n\n const detachedContext = (): PluginCallContext => ({\n signal: new AbortController().signal,\n progress: () => {},\n runFacts,\n })\n\n const hold = (handle: Json) => held.set(handleKey(handle), handle)\n\n // One release per handle at a time, whether the host or the kit asked for it.\n const releaseOnce = (handle: Json, ctx: PluginCallContext): Promise<void> => {\n const key = handleKey(handle)\n const running = releasing.get(key)\n if (running !== undefined) return running\n const work = (async () => {\n try {\n await definition.release({ handle, options: options as z.output<OptionsSchema> }, ctx)\n held.delete(key)\n } finally {\n releasing.delete(key)\n }\n })()\n releasing.set(key, work)\n return work\n }\n\n const releaseHeld = (attempted: Set<string>) =>\n Promise.allSettled(\n [...held]\n .filter(([key]) => !attempted.has(key))\n .map(([key, handle]) => {\n attempted.add(key)\n return releaseOnce(handle, detachedContext())\n }),\n )\n\n const settings = (value: unknown) =>\n refuse(definition.settings, value, 'settings') as z.output<SettingsSchema>\n\n const leave = async (boundMs: number) => {\n if (leaving) return\n leaving = true\n clearInterval(hostPoll)\n const sequence = async () => {\n if (!initialized) return\n for (const entry of pending.values()) {\n if (entry.method !== 'release' && entry.method !== 'shutdown') entry.controller.abort()\n }\n // A call still running may yet create a session; it lands in held and is released here.\n const attempted = new Set<string>()\n await Promise.allSettled([releaseHeld(attempted), ...inFlight])\n await releaseHeld(attempted)\n if (shutdownRan) return\n shutdownRan = true\n await definition.shutdown?.(\n { options: options as z.output<OptionsSchema> },\n detachedContext(),\n )\n }\n await within(\n sequence().catch(() => {}),\n boundMs,\n )\n write('', () => io.exit(0))\n }\n\n const watchHost = (hostPid: number) => {\n hostPoll = setInterval(() => {\n if (hostGone(hostPid, startPpid)) void leave(RELEASE_ON_CLOSE_BOUND_MS)\n }, io.hostPidPollMs)\n hostPoll.unref()\n }\n\n const initialize = async (params: unknown, ctx: PluginCallContext): Promise<InitializeResult> => {\n if (initialized || initializing) {\n throw new ProtocolFailure(PLUGIN_ERROR_CODES.invalidRequest, 'initialize was already called')\n }\n const input = parseParams(InitializeParamsSchema, params, 'initialize')\n const offered = input.protocolVersions.filter((version) =>\n SUPPORTED_PROTOCOL_VERSIONS.includes(version),\n )\n if (offered.length === 0) {\n throw new ProtocolFailure(\n PLUGIN_ERROR_CODES.plugin,\n `this plugin speaks protocol ${SUPPORTED_PROTOCOL_VERSIONS.join(', ')}, and the host offered ${input.protocolVersions.join(', ') || 'none'}`,\n {\n kind: 'version',\n supported: SUPPORTED_PROTOCOL_VERSIONS,\n requested: input.protocolVersions,\n },\n )\n }\n const parsedOptions = refuse(definition.options, input.options, 'options') as z.output<OptionsSchema>\n initializing = true\n try {\n await definition.initialize?.(\n {\n options: parsedOptions,\n host: input.host,\n entry: input.entry,\n runFacts: input.runFacts,\n },\n { ...ctx, runFacts: input.runFacts },\n )\n } finally {\n initializing = false\n }\n options = parsedOptions\n runFacts = input.runFacts\n initialized = true\n watchHost(input.host.pid)\n return {\n protocolVersion: Math.max(...offered),\n plugin: pluginIdentity(io.entryPath),\n serves: [...definition.serves],\n methods: [...definition.methods],\n }\n }\n\n const call = async (\n method: string,\n params: unknown,\n ctx: PluginCallContext,\n ): Promise<unknown> => {\n if (method === 'initialize') return initialize(params, ctx)\n if (\n !isPluginMethod(method) ||\n (isOptionalMethod(method) &&\n (!definition.methods.includes(method) || typeof definition[method] !== 'function'))\n ) {\n throw new ProtocolFailure(\n PLUGIN_ERROR_CODES.methodNotFound,\n `${method} is not a method of this plugin`,\n )\n }\n if (!initialized) {\n throw new ProtocolFailure(\n PLUGIN_ERROR_CODES.invalidRequest,\n `${method} came before initialize`,\n )\n }\n const current = options as z.output<OptionsSchema>\n switch (method) {\n case 'acquire': {\n const input = parseParams(AcquireParamsSchema, params, method)\n const result = await definition.acquire(\n { ...input, settings: settings(input.settings), options: current },\n ctx,\n )\n return checkedResult(AcquireResultSchema, result, method)\n }\n case 'release': {\n const input = parseParams(ReleaseParamsSchema, params, method)\n await releaseOnce(input.handle, ctx)\n return {}\n }\n case 'shutdown': {\n shutdownRan = true\n // A handle whose release failed is still held; shutdown may dispose what releasing needs.\n await releaseHeld(new Set())\n await definition.shutdown?.({ options: current }, ctx)\n return {}\n }\n case 'check': {\n const input = parseParams(CheckParamsSchema, params, method)\n const remotes = input.remotes.map((remote) => ({\n name: remote.name,\n settings: settings(remote.settings),\n }))\n const result = await definition.check?.({ remotes, options: current }, ctx)\n return checkedResult(CheckResultSchema, result, method)\n }\n case 'uploadApp': {\n const input = parseParams(UploadAppParamsSchema, params, method)\n const result = await definition.uploadApp?.(\n { ...input, settings: settings(input.settings), options: current },\n ctx,\n )\n return checkedResult(UploadAppResultSchema, result, method)\n }\n case 'started': {\n const input = parseParams(StartedParamsSchema, params, method)\n const result = await definition.started?.({ ...input, options: current }, ctx)\n return checkedResult(StartedResultSchema, result, method)\n }\n case 'end': {\n const input = parseParams(EndParamsSchema, params, method)\n await definition.end?.({ ...input, options: current }, ctx)\n return {}\n }\n default:\n throw new ProtocolFailure(\n PLUGIN_ERROR_CODES.methodNotFound,\n `${method} is not a method of this plugin`,\n )\n }\n }\n\n const createdHandle = (method: string, outcome: Outcome): Json | undefined => {\n if (outcome.ok) {\n if (method !== 'acquire' || !isRecord(outcome.value)) return undefined\n return outcome.value.handle as Json | undefined\n }\n return outcome.error instanceof PluginError ? outcome.error.handle : undefined\n }\n\n const answerFailure = (id: RequestId, error: unknown) => {\n if (error instanceof ProtocolFailure) {\n fail(id, error.code, error.message, error.data)\n } else if (error instanceof PluginError) {\n fail(id, PLUGIN_ERROR_CODES.plugin, error.message, {\n kind: error.kind,\n ...(error.path === undefined ? {} : { path: error.path }),\n ...(error.handle === undefined ? {} : { handle: error.handle }),\n })\n } else {\n const message = error instanceof Error ? error.message : String(error)\n fail(id, PLUGIN_ERROR_CODES.plugin, message, { kind: 'unreachable' })\n }\n }\n\n const dispatch = async (id: RequestId, method: string, params: unknown) => {\n const entry: PendingCall = { method, controller: new AbortController(), answered: false }\n pending.set(id, entry)\n const ctx: PluginCallContext = {\n signal: entry.controller.signal,\n progress: (update) => {\n if (entry.answered) return\n send({ jsonrpc: '2.0', method: PROGRESS_METHOD, params: { id, ...update } })\n },\n runFacts,\n }\n let outcome: Outcome\n try {\n outcome = { ok: true, value: await call(method, params, ctx) }\n } catch (error) {\n outcome = { ok: false, error }\n }\n clearTimeout(entry.graceTimer)\n if (pending.get(id) === entry) pending.delete(id)\n const handle = createdHandle(method, outcome)\n const tracked = initialized ? handle : undefined\n if (tracked !== undefined) hold(tracked)\n if (entry.answered) {\n // The cancel was already answered without this handle, so nobody else will release it.\n if (tracked !== undefined) await releaseOnce(tracked, detachedContext()).catch(() => {})\n return\n }\n if (leaving) return\n entry.answered = true\n if (outcome.ok) {\n answer(id, outcome.value)\n } else if (entry.controller.signal.aborted) {\n const message = outcome.error instanceof Error ? outcome.error.message : String(outcome.error)\n fail(id, PLUGIN_ERROR_CODES.cancelled, message, {\n kind: 'timeout',\n ...(handle === undefined ? {} : { handle }),\n })\n } else {\n answerFailure(id, outcome.error)\n }\n }\n\n const cancel = (params: unknown) => {\n const parsed = CancelParamsSchema.safeParse(params)\n if (!parsed.success) return\n const { id } = parsed.data\n const entry = pending.get(id)\n if (entry === undefined || entry.controller.signal.aborted) return\n entry.controller.abort()\n entry.graceTimer = setTimeout(() => {\n if (entry.answered) return\n entry.answered = true\n fail(\n id,\n PLUGIN_ERROR_CODES.cancelled,\n `${entry.method} did not stop within ${io.cancelAnswerGraceMs} ms of its cancel`,\n { kind: 'timeout' },\n )\n }, io.cancelAnswerGraceMs)\n }\n\n const handleLine = (line: string) => {\n let message: unknown\n try {\n message = JSON.parse(line)\n } catch {\n fail(null, PLUGIN_ERROR_CODES.parse, 'the line is not JSON')\n return\n }\n if (!isRecord(message)) {\n fail(null, PLUGIN_ERROR_CODES.invalidRequest, 'a message must be a JSON-RPC 2.0 object')\n return\n }\n const id = isRequestId(message.id) ? message.id : null\n if (message.method === undefined && ('result' in message || 'error' in message)) return\n if (message.jsonrpc !== '2.0' || typeof message.method !== 'string') {\n fail(id, PLUGIN_ERROR_CODES.invalidRequest, 'a request needs jsonrpc \"2.0\" and a method')\n return\n }\n if (!('id' in message)) {\n if (message.method === CANCEL_METHOD) cancel(message.params)\n return\n }\n if (id === null) {\n fail(null, PLUGIN_ERROR_CODES.invalidRequest, 'a request id is a string or a number')\n return\n }\n if (leaving) return\n const run = dispatch(id, message.method, message.params)\n inFlight.add(run)\n void run.catch(() => {}).finally(() => inFlight.delete(run))\n }\n\n const decoder = createLineDecoder({\n maxLineBytes: MAX_MESSAGE_BYTES,\n onLine: handleLine,\n onOverflow: () =>\n fail(\n null,\n PLUGIN_ERROR_CODES.invalidRequest,\n `a message is longer than ${MAX_MESSAGE_BYTES} bytes`,\n ),\n })\n\n const stdinClosed = () => {\n if (leaving) return\n decoder.end()\n void leave(RELEASE_ON_CLOSE_BOUND_MS)\n }\n\n if (ownsProcess) process.on('SIGTERM', () => void leave(RELEASE_ON_SIGTERM_BOUND_MS))\n io.stdin.on('data', (chunk) => decoder.push(chunk))\n io.stdin.on('end', stdinClosed)\n io.stdin.on('error', stdinClosed)\n}\n","import { z } from 'zod'\nimport { OPTIONAL_PLUGIN_METHODS, PLUGIN_RUN_FACTS, PLUGIN_SERVES } from './messages.js'\n\n// The manifest sits at package.json[\"agent-qa\"].plugin.\nexport const PLUGIN_MANIFEST_FIELD = 'agent-qa'\n\nconst PackagePathSchema = z.string().min(1)\n\nconst RemotePluginManifestSchema = z.strictObject({\n kind: z.literal('remote'),\n runs: z.literal('process'),\n protocol: z.number().int().positive(),\n entry: PackagePathSchema,\n serves: z.array(z.enum(PLUGIN_SERVES)).nonempty(),\n methods: z.array(z.enum(OPTIONAL_PLUGIN_METHODS)),\n options: PackagePathSchema,\n settings: PackagePathSchema,\n runFacts: z.array(z.enum(PLUGIN_RUN_FACTS)).optional(),\n skill: PackagePathSchema.optional(),\n})\n\nconst ModelAuthManifestSchema = z.strictObject({\n kind: z.literal('model-auth'),\n runs: z.literal('in-process'),\n entry: PackagePathSchema,\n options: PackagePathSchema.optional(),\n})\n\nconst ModelProviderManifestSchema = z.strictObject({\n kind: z.literal('model-provider'),\n runs: z.literal('in-process'),\n entry: PackagePathSchema,\n options: PackagePathSchema.optional(),\n})\n\nexport const PluginManifestSchema = z.discriminatedUnion('kind', [\n RemotePluginManifestSchema,\n ModelAuthManifestSchema,\n ModelProviderManifestSchema,\n])\nexport type PluginManifest = z.infer<typeof PluginManifestSchema>\nexport type RemotePluginManifest = z.infer<typeof RemotePluginManifestSchema>\n","import { mkdirSync, readFileSync, writeFileSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { isDeepStrictEqual } from 'node:util'\nimport { z } from 'zod'\nimport type { PluginDefinition } from './define-plugin.js'\nimport {\n PLUGIN_MANIFEST_FIELD,\n PluginManifestSchema,\n type RemotePluginManifest,\n} from './protocol/manifest.js'\nimport { PLUGIN_PROTOCOL_VERSION } from './protocol/messages.js'\n\nexport interface EmitPluginFilesInput<\n OptionsSchema extends z.ZodType,\n SettingsSchema extends z.ZodType,\n> {\n definition: PluginDefinition<OptionsSchema, SettingsSchema>\n packageDir: string\n}\n\nexport interface EmittedPluginFiles {\n manifest: RemotePluginManifest\n optionsSchemaFile: string\n settingsSchemaFile: string\n packageJsonChanged: boolean\n}\n\nconst OPTIONS_SCHEMA_PATH = './dist/options.schema.json'\nconst SETTINGS_SCHEMA_PATH = './dist/settings.schema.json'\n\nexport function pluginManifest<OptionsSchema extends z.ZodType, SettingsSchema extends z.ZodType>(\n definition: PluginDefinition<OptionsSchema, SettingsSchema>,\n): RemotePluginManifest {\n const manifest = PluginManifestSchema.parse({\n protocol: PLUGIN_PROTOCOL_VERSION,\n kind: 'remote',\n runs: 'process',\n entry: './dist/main.js',\n serves: [...definition.serves],\n methods: [...definition.methods],\n options: OPTIONS_SCHEMA_PATH,\n settings: SETTINGS_SCHEMA_PATH,\n ...(definition.runFacts === undefined ? {} : { runFacts: [...definition.runFacts] }),\n ...(definition.skill === undefined ? {} : { skill: definition.skill }),\n })\n if (manifest.kind !== 'remote') throw new Error('a plugin built with the kit is remote')\n return manifest\n}\n\nfunction schemaText(schema: z.ZodType): string {\n return `${JSON.stringify(z.toJSONSchema(schema, { io: 'input', target: 'draft-2020-12' }), null, 2)}\\n`\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nexport function emitPluginFiles<OptionsSchema extends z.ZodType, SettingsSchema extends z.ZodType>(\n input: EmitPluginFilesInput<OptionsSchema, SettingsSchema>,\n): EmittedPluginFiles {\n const { definition, packageDir } = input\n const manifest = pluginManifest(definition)\n const optionsSchemaFile = join(packageDir, OPTIONS_SCHEMA_PATH)\n const settingsSchemaFile = join(packageDir, SETTINGS_SCHEMA_PATH)\n mkdirSync(join(packageDir, 'dist'), { recursive: true })\n writeFileSync(optionsSchemaFile, schemaText(definition.options))\n writeFileSync(settingsSchemaFile, schemaText(definition.settings))\n\n const packageJsonFile = join(packageDir, 'package.json')\n const parsed: unknown = JSON.parse(readFileSync(packageJsonFile, 'utf8'))\n if (!isRecord(parsed)) throw new Error(`${packageJsonFile} is not a JSON object`)\n const field = isRecord(parsed[PLUGIN_MANIFEST_FIELD]) ? parsed[PLUGIN_MANIFEST_FIELD] : {}\n const packageJsonChanged = !isDeepStrictEqual(field.plugin, manifest)\n if (packageJsonChanged) {\n const next = { ...parsed, [PLUGIN_MANIFEST_FIELD]: { ...field, plugin: manifest } }\n writeFileSync(packageJsonFile, `${JSON.stringify(next, null, 2)}\\n`)\n }\n return { manifest, optionsSchemaFile, settingsSchemaFile, packageJsonChanged }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["z","z","isRecord","z","z"],"sources":["../src/credential.ts","../src/protocol/messages.ts","../src/define-plugin.ts","../src/package-root.ts","../src/protocol/framing.ts","../src/run-plugin.ts","../src/protocol/manifest.ts","../src/emit.ts","../src/vendor-api.ts"],"sourcesContent":["import { z } from 'zod'\n\n// No pattern or format: a config holds a secret reference here, not the secret itself.\nexport function credential(description?: string) {\n return z.string().meta({ credential: true, ...(description ? { description } : {}) })\n}\n","import { z } from 'zod'\n\nexport const PLUGIN_PROTOCOL_VERSION = 1\n\nexport const PLUGIN_METHODS = [\n 'initialize',\n 'check',\n 'acquire',\n 'uploadApp',\n 'started',\n 'end',\n 'release',\n 'shutdown',\n] as const\nexport type PluginMethod = (typeof PLUGIN_METHODS)[number]\n\nexport const OPTIONAL_PLUGIN_METHODS = ['check', 'uploadApp', 'started', 'end'] as const\nexport type OptionalPluginMethod = (typeof OPTIONAL_PLUGIN_METHODS)[number]\n\nexport const PLUGIN_SERVES = ['playwright', 'cdp', 'appium'] as const\nexport type PluginServe = (typeof PLUGIN_SERVES)[number]\n\nexport const PLUGIN_RUN_FACTS = ['testName', 'runId', 'failure'] as const\nexport type PluginRunFact = (typeof PLUGIN_RUN_FACTS)[number]\n\nexport const PLUGIN_FAILURE_KINDS = [\n 'unreachable',\n 'auth',\n 'capacity',\n 'timeout',\n 'version',\n 'refused',\n 'ended',\n 'lost',\n] as const\nexport type PluginFailureKind = (typeof PLUGIN_FAILURE_KINDS)[number]\n\nexport const PLUGIN_ERROR_CODES = {\n parse: -32700,\n invalidRequest: -32600,\n methodNotFound: -32601,\n invalidParams: -32602,\n plugin: -32000,\n cancelled: -32800,\n} as const\n\nexport const CANCEL_METHOD = '$/cancel'\nexport const PROGRESS_METHOD = '$/progress'\n\nexport const MAX_MESSAGE_BYTES = 1024 * 1024\n\nconst JsonObjectSchema = z.record(z.string(), z.unknown())\nconst HandleSchema = z.json()\nconst RequestIdSchema = z.union([z.string(), z.number()])\n\nexport const InitializeParamsSchema = z.object({\n protocolVersions: z.array(z.number().int()),\n host: z.object({\n pid: z.number().int(),\n agentQaVersion: z.string(),\n playwrightVersion: z.string(),\n webdriverioVersion: z.string(),\n }),\n entry: z.string(),\n options: JsonObjectSchema,\n runFacts: z.object({ runId: z.string().optional() }).optional(),\n})\nexport type InitializeParams = z.infer<typeof InitializeParamsSchema>\n\nexport const InitializeResultSchema = z.object({\n protocolVersion: z.number().int(),\n plugin: z.object({ name: z.string(), version: z.string() }),\n serves: z.array(z.enum(PLUGIN_SERVES)),\n methods: z.array(z.enum(OPTIONAL_PLUGIN_METHODS)),\n})\nexport type InitializeResult = z.infer<typeof InitializeResultSchema>\n\nexport const CheckParamsSchema = z.object({\n remotes: z.array(z.object({ name: z.string(), settings: JsonObjectSchema })),\n})\nexport type CheckParams = z.infer<typeof CheckParamsSchema>\n\nexport const CheckResultSchema = z.object({\n state: z.enum(['ok', 'warn']),\n lines: z.array(z.string()),\n})\nexport type CheckResult = z.infer<typeof CheckResultSchema>\n\nconst WebSessionSchema = z.object({\n platform: z.literal('web'),\n engine: z.enum(['chromium', 'firefox', 'webkit']),\n context: z.enum(['new', 'reuse']),\n})\n\nconst DeviceSessionSchema = z.object({\n platform: z.enum(['android', 'ios']),\n capabilities: JsonObjectSchema,\n})\n\nexport const AcquireParamsSchema = z.object({\n remote: z.string(),\n settings: JsonObjectSchema,\n session: z.discriminatedUnion('platform', [WebSessionSchema, DeviceSessionSchema]),\n run: z.object({ testName: z.string().optional() }).optional(),\n})\nexport type AcquireParams = z.infer<typeof AcquireParamsSchema>\n\nexport const AcquireResultSchema = z.object({\n handle: HandleSchema,\n protocol: z.enum(PLUGIN_SERVES),\n url: z.string(),\n headers: z.record(z.string(), z.string()).optional(),\n capabilities: JsonObjectSchema.optional(),\n mask: z.array(z.string()).optional(),\n link: z.string().optional(),\n})\nexport type AcquireResult = z.infer<typeof AcquireResultSchema>\n\nexport const UploadAppParamsSchema = z.object({\n remote: z.string(),\n settings: JsonObjectSchema,\n platform: z.enum(['android', 'ios']),\n path: z.string(),\n sha256: z.string(),\n size: z.number().int().nonnegative(),\n})\nexport type UploadAppParams = z.infer<typeof UploadAppParamsSchema>\n\nexport const UploadAppResultSchema = z.object({ ref: z.string() })\nexport type UploadAppResult = z.infer<typeof UploadAppResultSchema>\n\nexport const StartedParamsSchema = z.object({\n handle: HandleSchema,\n sessionId: z.string().optional(),\n})\nexport type StartedParams = z.infer<typeof StartedParamsSchema>\n\nexport const StartedResultSchema = z.object({\n link: z.string().optional(),\n appiumVersion: z.string().optional(),\n})\nexport type StartedResult = z.infer<typeof StartedResultSchema>\n\nexport const EndParamsSchema = z.object({\n handle: HandleSchema,\n outcome: z.enum(['passed', 'failed', 'error', 'cancelled']),\n reason: z.string().optional(),\n})\nexport type EndParams = z.infer<typeof EndParamsSchema>\n\nexport const ReleaseParamsSchema = z.object({ handle: HandleSchema })\nexport type ReleaseParams = z.infer<typeof ReleaseParamsSchema>\n\nexport const CancelParamsSchema = z.object({ id: RequestIdSchema })\nexport type CancelParams = z.infer<typeof CancelParamsSchema>\n\nexport const ProgressParamsSchema = z.object({\n id: RequestIdSchema,\n message: z.string(),\n queued: z.number().int().nonnegative().optional(),\n percent: z.number().min(0).max(100).optional(),\n})\nexport type ProgressParams = z.infer<typeof ProgressParamsSchema>\n\nexport const PluginErrorDataSchema = z.object({\n kind: z.enum(PLUGIN_FAILURE_KINDS),\n path: z.string().optional(),\n handle: HandleSchema.optional(),\n supported: z.array(z.number().int()).optional(),\n requested: z.array(z.number().int()).optional(),\n})\nexport type PluginErrorData = z.infer<typeof PluginErrorDataSchema>\n","import type { z } from 'zod'\nimport {\n OPTIONAL_PLUGIN_METHODS,\n type AcquireParams,\n type AcquireResult,\n type CheckResult,\n type EndParams,\n type InitializeParams,\n type OptionalPluginMethod,\n type PluginFailureKind,\n type PluginRunFact,\n type PluginServe,\n type StartedParams,\n type StartedResult,\n type UploadAppParams,\n type UploadAppResult,\n} from './protocol/messages.js'\n\ntype Json = z.core.util.JSONType\ntype Awaitable<T> = T | Promise<T>\n\nexport interface PluginErrorOptions {\n kind: PluginFailureKind\n path?: string\n handle?: Json\n}\n\nexport class PluginError extends Error {\n readonly kind: PluginFailureKind\n readonly path: string | undefined\n readonly handle: Json | undefined\n\n constructor(message: string, options: PluginErrorOptions) {\n super(message)\n this.name = 'PluginError'\n this.kind = options.kind\n this.path = options.path\n this.handle = options.handle\n }\n}\n\nexport interface InitializeInput<Options> {\n options: Options\n host: InitializeParams['host']\n entry: string\n runFacts: InitializeParams['runFacts']\n}\n\nexport interface CheckInput<Options, Settings> {\n options: Options\n remotes: { name: string; settings: Settings }[]\n}\n\nexport interface AcquireInput<Options, Settings> extends Omit<AcquireParams, 'settings'> {\n options: Options\n settings: Settings\n}\n\nexport interface UploadAppInput<Options, Settings> extends Omit<UploadAppParams, 'settings'> {\n options: Options\n settings: Settings\n}\n\nexport interface StartedInput<Options> extends StartedParams {\n options: Options\n}\n\nexport interface EndInput<Options> extends EndParams {\n options: Options\n}\n\nexport interface ReleaseInput<Options> {\n options: Options\n handle: Json\n}\n\nexport interface ShutdownInput<Options> {\n options: Options\n}\n\nexport interface PluginProgress {\n message: string\n queued?: number\n percent?: number\n}\n\nexport interface PluginCallContext {\n signal: AbortSignal\n progress(update: PluginProgress): void\n runFacts: InitializeParams['runFacts']\n}\n\nexport interface PluginSpec<OptionsSchema extends z.ZodType, SettingsSchema extends z.ZodType> {\n options: OptionsSchema\n settings: SettingsSchema\n serves: readonly PluginServe[]\n runFacts?: readonly PluginRunFact[]\n skill?: string\n initialize?(\n input: InitializeInput<z.output<OptionsSchema>>,\n ctx: PluginCallContext,\n ): Awaitable<void>\n check?(\n input: CheckInput<z.output<OptionsSchema>, z.output<SettingsSchema>>,\n ctx: PluginCallContext,\n ): Awaitable<CheckResult>\n acquire(\n input: AcquireInput<z.output<OptionsSchema>, z.output<SettingsSchema>>,\n ctx: PluginCallContext,\n ): Awaitable<AcquireResult>\n uploadApp?(\n input: UploadAppInput<z.output<OptionsSchema>, z.output<SettingsSchema>>,\n ctx: PluginCallContext,\n ): Awaitable<UploadAppResult>\n started?(\n input: StartedInput<z.output<OptionsSchema>>,\n ctx: PluginCallContext,\n ): Awaitable<StartedResult>\n end?(input: EndInput<z.output<OptionsSchema>>, ctx: PluginCallContext): Awaitable<void>\n release(input: ReleaseInput<z.output<OptionsSchema>>, ctx: PluginCallContext): Awaitable<void>\n shutdown?(input: ShutdownInput<z.output<OptionsSchema>>, ctx: PluginCallContext): Awaitable<void>\n}\n\nexport interface PluginDefinition<\n OptionsSchema extends z.ZodType = z.ZodType,\n SettingsSchema extends z.ZodType = z.ZodType,\n> extends PluginSpec<OptionsSchema, SettingsSchema> {\n methods: readonly OptionalPluginMethod[]\n}\n\nexport function definePlugin<OptionsSchema extends z.ZodType, SettingsSchema extends z.ZodType>(\n spec: PluginSpec<OptionsSchema, SettingsSchema>,\n): PluginDefinition<OptionsSchema, SettingsSchema> {\n const methods = OPTIONAL_PLUGIN_METHODS.filter((method) => typeof spec[method] === 'function')\n return { ...spec, methods }\n}\n","import { existsSync, readFileSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\n\nexport function findPackageRoot(fromDir: string): string | undefined {\n let dir = fromDir\n for (;;) {\n if (existsSync(join(dir, 'package.json'))) return dir\n const parent = dirname(dir)\n if (parent === dir) return undefined\n dir = parent\n }\n}\n\nexport function readPackageJson(packageRoot: string): Record<string, unknown> {\n const parsed: unknown = JSON.parse(readFileSync(join(packageRoot, 'package.json'), 'utf8'))\n return typeof parsed === 'object' && parsed !== null ? (parsed as Record<string, unknown>) : {}\n}\n","export function encodeMessage(message: unknown): string {\n return `${JSON.stringify(message)}\\n`\n}\n\nexport interface LineDecoderOptions {\n maxLineBytes: number\n onLine: (line: string) => void\n onOverflow: () => void\n}\n\nexport interface LineDecoder {\n push(chunk: Uint8Array | string): void\n end(): void\n}\n\nconst NEWLINE = 0x0a\n\nexport function createLineDecoder({\n maxLineBytes,\n onLine,\n onOverflow,\n}: LineDecoderOptions): LineDecoder {\n const encoder = new TextEncoder()\n const decoder = new TextDecoder()\n let parts: Uint8Array[] = []\n let size = 0\n let discarding = false\n\n const append = (segment: Uint8Array) => {\n if (discarding || segment.length === 0) return\n if (size + segment.length > maxLineBytes) {\n discarding = true\n parts = []\n size = 0\n onOverflow()\n return\n }\n parts.push(new Uint8Array(segment))\n size += segment.length\n }\n\n const finishLine = () => {\n const wasDiscarding = discarding\n const lineParts = parts\n const lineSize = size\n parts = []\n size = 0\n discarding = false\n if (wasDiscarding || lineSize === 0) return\n const bytes = new Uint8Array(lineSize)\n let offset = 0\n for (const part of lineParts) {\n bytes.set(part, offset)\n offset += part.length\n }\n const line = decoder.decode(bytes).replace(/\\r$/, '')\n if (line.trim() !== '') onLine(line)\n }\n\n return {\n push(chunk) {\n const bytes = typeof chunk === 'string' ? encoder.encode(chunk) : chunk\n let start = 0\n while (start <= bytes.length) {\n const newline = bytes.indexOf(NEWLINE, start)\n if (newline === -1) {\n append(bytes.subarray(start))\n return\n }\n append(bytes.subarray(start, newline))\n finishLine()\n start = newline + 1\n }\n },\n end() {\n finishLine()\n },\n }\n}\n","import { realpathSync, writeSync } from 'node:fs'\nimport { dirname } from 'node:path'\nimport { format, inspect } from 'node:util'\nimport type { z } from 'zod'\nimport { PluginError, type PluginCallContext, type PluginDefinition } from './define-plugin.js'\nimport { findPackageRoot, readPackageJson } from './package-root.js'\nimport { createLineDecoder, encodeMessage } from './protocol/framing.js'\nimport {\n AcquireParamsSchema,\n AcquireResultSchema,\n CANCEL_METHOD,\n CancelParamsSchema,\n CheckParamsSchema,\n CheckResultSchema,\n EndParamsSchema,\n InitializeParamsSchema,\n MAX_MESSAGE_BYTES,\n OPTIONAL_PLUGIN_METHODS,\n PLUGIN_ERROR_CODES,\n PLUGIN_METHODS,\n PLUGIN_PROTOCOL_VERSION,\n PROGRESS_METHOD,\n ReleaseParamsSchema,\n StartedParamsSchema,\n StartedResultSchema,\n UploadAppParamsSchema,\n UploadAppResultSchema,\n type InitializeParams,\n type InitializeResult,\n type OptionalPluginMethod,\n type PluginMethod,\n} from './protocol/messages.js'\n\nexport interface PluginIo {\n stdin: {\n on(event: 'data', listener: (chunk: Uint8Array | string) => void): unknown\n on(event: 'end' | 'error', listener: () => void): unknown\n }\n stdout: { write(chunk: string, callback?: (error?: Error | null) => void): unknown }\n exit(code: number): void\n entryPath?: string\n cancelAnswerGraceMs: number\n hostPidPollMs: number\n}\n\ntype RequestId = string | number\ntype Json = z.core.util.JSONType\n\nexport const CANCEL_ANSWER_GRACE_MS = 4_000\nexport const HOST_PID_POLL_MS = 1_000\nconst RELEASE_ON_CLOSE_BOUND_MS = 30_000\nconst RELEASE_ON_SIGTERM_BOUND_MS = 4_000\n\nconst SUPPORTED_PROTOCOL_VERSIONS = [PLUGIN_PROTOCOL_VERSION]\n\nclass ProtocolFailure extends Error {\n constructor(\n readonly code: number,\n message: string,\n readonly data?: Record<string, unknown>,\n ) {\n super(message)\n }\n}\n\nfunction resolveIo(io: Partial<PluginIo>): PluginIo {\n return {\n stdin: io.stdin ?? process.stdin,\n stdout: io.stdout ?? process.stdout,\n exit: io.exit ?? ((code) => process.exit(code)),\n entryPath: io.entryPath ?? process.argv[1],\n cancelAnswerGraceMs: io.cancelAnswerGraceMs ?? CANCEL_ANSWER_GRACE_MS,\n hostPidPollMs: io.hostPidPollMs ?? HOST_PID_POLL_MS,\n }\n}\n\nfunction routeStrayOutputToStderr() {\n const toLog = (...args: unknown[]) => {\n process.stderr.write(`${format(...args)}\\n`)\n }\n console.log = toLog\n console.info = toLog\n console.debug = toLog\n console.warn = toLog\n process.stdout.write = process.stderr.write.bind(process.stderr) as typeof process.stdout.write\n}\n\nfunction hostGone(hostPid: number, startPpid: number): boolean {\n if (process.ppid !== startPpid) return true\n try {\n process.kill(hostPid, 0)\n return false\n } catch (error) {\n return (error as NodeJS.ErrnoException).code === 'ESRCH'\n }\n}\n\n// Handles are JSON; two handles are the same session when their JSON is equal.\nfunction handleKey(handle: Json): string {\n const canonical = (value: Json): Json => {\n if (Array.isArray(value)) return value.map(canonical)\n if (value === null || typeof value !== 'object') return value\n return Object.fromEntries(\n Object.keys(value)\n .sort()\n .map((key) => [key, canonical(value[key] as Json)]),\n )\n }\n return JSON.stringify(canonical(handle))\n}\n\nfunction within<T>(work: Promise<T>, boundMs: number): Promise<T | undefined> {\n let timer: NodeJS.Timeout | undefined\n const bound = new Promise<undefined>((resolve) => {\n timer = setTimeout(() => resolve(undefined), boundMs)\n })\n return Promise.race([work, bound]).finally(() => clearTimeout(timer))\n}\n\ntype Outcome = { ok: true; value: unknown } | { ok: false; error: unknown }\n\ninterface PendingCall {\n method: string\n controller: AbortController\n answered: boolean\n graceTimer?: NodeJS.Timeout\n}\n\nfunction firstLine(message: string): string {\n return message.split(/\\r?\\n/, 1)[0] ?? ''\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction isRequestId(value: unknown): value is RequestId {\n return typeof value === 'string' || typeof value === 'number'\n}\n\nfunction isPluginMethod(method: string): method is PluginMethod {\n return (PLUGIN_METHODS as readonly string[]).includes(method)\n}\n\nfunction isOptionalMethod(method: PluginMethod): method is OptionalPluginMethod {\n return (OPTIONAL_PLUGIN_METHODS as readonly string[]).includes(method)\n}\n\nfunction issuePath(issue: z.core.$ZodIssue): string {\n return issue.path.map(String).join('.')\n}\n\nfunction parseParams<Schema extends z.ZodType>(\n schema: Schema,\n params: unknown,\n method: string,\n): z.output<Schema> {\n const parsed = schema.safeParse(params ?? {})\n if (parsed.success) return parsed.data\n const issue = parsed.error.issues[0]\n const where = issue === undefined ? '' : issuePath(issue)\n throw new ProtocolFailure(\n PLUGIN_ERROR_CODES.invalidParams,\n `${method} params${where === '' ? '' : ` at ${where}`}: ${issue?.message ?? 'invalid'}`,\n )\n}\n\n// A refusal's path starts with options. or settings., naming the block that holds the field.\nfunction refuse(schema: z.ZodType, value: unknown, prefix: 'options' | 'settings'): unknown {\n const parsed = schema.safeParse(value)\n if (parsed.success) return parsed.data\n const issue = parsed.error.issues[0]\n const inner = issue === undefined ? '' : issuePath(issue)\n const path = inner === '' ? undefined : `${prefix}.${inner}`\n throw new PluginError(`${path ?? prefix}: ${issue?.message ?? 'invalid'}`, {\n kind: 'refused',\n ...(path === undefined ? {} : { path }),\n })\n}\n\nfunction checkedResult(schema: z.ZodType, value: unknown, method: string): unknown {\n const parsed = schema.safeParse(value)\n if (parsed.success) return value\n const issue = parsed.error.issues[0]\n const where = issue === undefined ? '' : issuePath(issue)\n const handle =\n method === 'acquire' && isRecord(value) && value.handle !== undefined\n ? (value.handle as Json)\n : undefined\n throw new PluginError(\n `${method} answered a malformed result${where === '' ? '' : ` at ${where}`}: ${issue?.message ?? 'invalid'}`,\n { kind: 'refused', ...(handle === undefined ? {} : { handle }) },\n )\n}\n\nfunction pluginIdentity(entryPath: string | undefined): InitializeResult['plugin'] {\n const unknown = { name: 'unknown', version: 'unknown' }\n if (entryPath === undefined) return unknown\n try {\n const root = findPackageRoot(dirname(realpathSync(entryPath)))\n if (root === undefined) return unknown\n const pkg = readPackageJson(root)\n return {\n name: typeof pkg.name === 'string' ? pkg.name : unknown.name,\n version: typeof pkg.version === 'string' ? pkg.version : unknown.version,\n }\n } catch {\n return unknown\n }\n}\n\nexport function runPlugin<OptionsSchema extends z.ZodType, SettingsSchema extends z.ZodType>(\n definition: PluginDefinition<OptionsSchema, SettingsSchema>,\n ioInput: Partial<PluginIo> = {},\n): void {\n const io = resolveIo(ioInput)\n const write = io.stdout.write.bind(io.stdout)\n // A caller that brings its own stdout keeps the process's console, streams and signals.\n const ownsProcess = ioInput.stdout === undefined\n if (ownsProcess) {\n routeStrayOutputToStderr()\n // Once the host is gone its pipes have no reader; EPIPE must not stop the releases.\n process.stdout.on('error', () => {})\n process.stderr.on('error', () => {})\n process.on('SIGINT', () => {})\n // Node's own report starts with the throwing source line, and the host takes stderr's first\n // line as the crash's reason.\n process.on('uncaughtException', (error) => {\n try {\n writeSync(2, `${inspect(error)}\\n`)\n } catch {}\n process.exit(1)\n })\n }\n\n const send = (message: Record<string, unknown>) => {\n if (leaving) return\n write(encodeMessage(message))\n }\n const answer = (id: RequestId, result: unknown) => send({ jsonrpc: '2.0', id, result })\n const fail = (\n id: RequestId | null,\n code: number,\n message: string,\n data?: Record<string, unknown>,\n ) =>\n send({\n jsonrpc: '2.0',\n id,\n error: { code, message: firstLine(message), ...(data === undefined ? {} : { data }) },\n })\n\n let options: z.output<OptionsSchema> | undefined\n let runFacts: InitializeParams['runFacts']\n let initialized = false\n let initializing = false\n let shutdownRan = false\n let leaving = false\n let hostPoll: NodeJS.Timeout | undefined\n const startPpid = process.ppid\n const pending = new Map<RequestId, PendingCall>()\n const inFlight = new Set<Promise<void>>()\n const held = new Map<string, Json>()\n const releasing = new Map<string, Promise<void>>()\n\n const detachedContext = (): PluginCallContext => ({\n signal: new AbortController().signal,\n progress: () => {},\n runFacts,\n })\n\n const hold = (handle: Json) => held.set(handleKey(handle), handle)\n\n // One release per handle at a time, whether the host or the kit asked for it.\n const releaseOnce = (handle: Json, ctx: PluginCallContext): Promise<void> => {\n const key = handleKey(handle)\n const running = releasing.get(key)\n if (running !== undefined) return running\n const work = (async () => {\n try {\n await definition.release({ handle, options: options as z.output<OptionsSchema> }, ctx)\n held.delete(key)\n } finally {\n releasing.delete(key)\n }\n })()\n releasing.set(key, work)\n return work\n }\n\n const releaseHeld = (attempted: Set<string>) =>\n Promise.allSettled(\n [...held]\n .filter(([key]) => !attempted.has(key))\n .map(([key, handle]) => {\n attempted.add(key)\n return releaseOnce(handle, detachedContext())\n }),\n )\n\n const settings = (value: unknown) =>\n refuse(definition.settings, value, 'settings') as z.output<SettingsSchema>\n\n const leave = async (boundMs: number) => {\n if (leaving) return\n leaving = true\n clearInterval(hostPoll)\n const sequence = async () => {\n if (!initialized) return\n for (const entry of pending.values()) {\n if (entry.method !== 'release' && entry.method !== 'shutdown') entry.controller.abort()\n }\n // A call still running may yet create a session; it lands in held and is released here.\n const attempted = new Set<string>()\n await Promise.allSettled([releaseHeld(attempted), ...inFlight])\n await releaseHeld(attempted)\n if (shutdownRan) return\n shutdownRan = true\n await definition.shutdown?.(\n { options: options as z.output<OptionsSchema> },\n detachedContext(),\n )\n }\n await within(\n sequence().catch(() => {}),\n boundMs,\n )\n write('', () => io.exit(0))\n }\n\n const watchHost = (hostPid: number) => {\n hostPoll = setInterval(() => {\n if (hostGone(hostPid, startPpid)) void leave(RELEASE_ON_CLOSE_BOUND_MS)\n }, io.hostPidPollMs)\n hostPoll.unref()\n }\n\n const initialize = async (params: unknown, ctx: PluginCallContext): Promise<InitializeResult> => {\n if (initialized || initializing) {\n throw new ProtocolFailure(PLUGIN_ERROR_CODES.invalidRequest, 'initialize was already called')\n }\n const input = parseParams(InitializeParamsSchema, params, 'initialize')\n const offered = input.protocolVersions.filter((version) =>\n SUPPORTED_PROTOCOL_VERSIONS.includes(version),\n )\n if (offered.length === 0) {\n throw new ProtocolFailure(\n PLUGIN_ERROR_CODES.plugin,\n `this plugin speaks protocol ${SUPPORTED_PROTOCOL_VERSIONS.join(', ')}, and the host offered ${input.protocolVersions.join(', ') || 'none'}`,\n {\n kind: 'version',\n supported: SUPPORTED_PROTOCOL_VERSIONS,\n requested: input.protocolVersions,\n },\n )\n }\n const parsedOptions = refuse(definition.options, input.options, 'options') as z.output<OptionsSchema>\n initializing = true\n try {\n await definition.initialize?.(\n {\n options: parsedOptions,\n host: input.host,\n entry: input.entry,\n runFacts: input.runFacts,\n },\n { ...ctx, runFacts: input.runFacts },\n )\n } finally {\n initializing = false\n }\n options = parsedOptions\n runFacts = input.runFacts\n initialized = true\n watchHost(input.host.pid)\n return {\n protocolVersion: Math.max(...offered),\n plugin: pluginIdentity(io.entryPath),\n serves: [...definition.serves],\n methods: [...definition.methods],\n }\n }\n\n const call = async (\n method: string,\n params: unknown,\n ctx: PluginCallContext,\n ): Promise<unknown> => {\n if (method === 'initialize') return initialize(params, ctx)\n if (\n !isPluginMethod(method) ||\n (isOptionalMethod(method) &&\n (!definition.methods.includes(method) || typeof definition[method] !== 'function'))\n ) {\n throw new ProtocolFailure(\n PLUGIN_ERROR_CODES.methodNotFound,\n `${method} is not a method of this plugin`,\n )\n }\n if (!initialized) {\n throw new ProtocolFailure(\n PLUGIN_ERROR_CODES.invalidRequest,\n `${method} came before initialize`,\n )\n }\n const current = options as z.output<OptionsSchema>\n switch (method) {\n case 'acquire': {\n const input = parseParams(AcquireParamsSchema, params, method)\n const result = await definition.acquire(\n { ...input, settings: settings(input.settings), options: current },\n ctx,\n )\n return checkedResult(AcquireResultSchema, result, method)\n }\n case 'release': {\n const input = parseParams(ReleaseParamsSchema, params, method)\n await releaseOnce(input.handle, ctx)\n return {}\n }\n case 'shutdown': {\n shutdownRan = true\n // A handle whose release failed is still held; shutdown may dispose what releasing needs.\n await releaseHeld(new Set())\n await definition.shutdown?.({ options: current }, ctx)\n return {}\n }\n case 'check': {\n const input = parseParams(CheckParamsSchema, params, method)\n const remotes = input.remotes.map((remote) => ({\n name: remote.name,\n settings: settings(remote.settings),\n }))\n const result = await definition.check?.({ remotes, options: current }, ctx)\n return checkedResult(CheckResultSchema, result, method)\n }\n case 'uploadApp': {\n const input = parseParams(UploadAppParamsSchema, params, method)\n const result = await definition.uploadApp?.(\n { ...input, settings: settings(input.settings), options: current },\n ctx,\n )\n return checkedResult(UploadAppResultSchema, result, method)\n }\n case 'started': {\n const input = parseParams(StartedParamsSchema, params, method)\n const result = await definition.started?.({ ...input, options: current }, ctx)\n return checkedResult(StartedResultSchema, result, method)\n }\n case 'end': {\n const input = parseParams(EndParamsSchema, params, method)\n await definition.end?.({ ...input, options: current }, ctx)\n return {}\n }\n default:\n throw new ProtocolFailure(\n PLUGIN_ERROR_CODES.methodNotFound,\n `${method} is not a method of this plugin`,\n )\n }\n }\n\n const createdHandle = (method: string, outcome: Outcome): Json | undefined => {\n if (outcome.ok) {\n if (method !== 'acquire' || !isRecord(outcome.value)) return undefined\n return outcome.value.handle as Json | undefined\n }\n return outcome.error instanceof PluginError ? outcome.error.handle : undefined\n }\n\n const answerFailure = (id: RequestId, error: unknown) => {\n if (error instanceof ProtocolFailure) {\n fail(id, error.code, error.message, error.data)\n } else if (error instanceof PluginError) {\n fail(id, PLUGIN_ERROR_CODES.plugin, error.message, {\n kind: error.kind,\n ...(error.path === undefined ? {} : { path: error.path }),\n ...(error.handle === undefined ? {} : { handle: error.handle }),\n })\n } else {\n const message = error instanceof Error ? error.message : String(error)\n fail(id, PLUGIN_ERROR_CODES.plugin, message, { kind: 'unreachable' })\n }\n }\n\n const dispatch = async (id: RequestId, method: string, params: unknown) => {\n const entry: PendingCall = { method, controller: new AbortController(), answered: false }\n pending.set(id, entry)\n const ctx: PluginCallContext = {\n signal: entry.controller.signal,\n progress: (update) => {\n if (entry.answered) return\n send({ jsonrpc: '2.0', method: PROGRESS_METHOD, params: { id, ...update } })\n },\n runFacts,\n }\n let outcome: Outcome\n try {\n outcome = { ok: true, value: await call(method, params, ctx) }\n } catch (error) {\n outcome = { ok: false, error }\n }\n clearTimeout(entry.graceTimer)\n if (pending.get(id) === entry) pending.delete(id)\n const handle = createdHandle(method, outcome)\n const tracked = initialized ? handle : undefined\n if (tracked !== undefined) hold(tracked)\n if (entry.answered) {\n // The cancel was already answered without this handle, so nobody else will release it.\n if (tracked !== undefined) await releaseOnce(tracked, detachedContext()).catch(() => {})\n return\n }\n if (leaving) return\n entry.answered = true\n if (outcome.ok) {\n answer(id, outcome.value)\n } else if (entry.controller.signal.aborted) {\n const message = outcome.error instanceof Error ? outcome.error.message : String(outcome.error)\n fail(id, PLUGIN_ERROR_CODES.cancelled, message, {\n kind: 'timeout',\n ...(handle === undefined ? {} : { handle }),\n })\n } else {\n answerFailure(id, outcome.error)\n }\n }\n\n const cancel = (params: unknown) => {\n const parsed = CancelParamsSchema.safeParse(params)\n if (!parsed.success) return\n const { id } = parsed.data\n const entry = pending.get(id)\n if (entry === undefined || entry.controller.signal.aborted) return\n entry.controller.abort()\n entry.graceTimer = setTimeout(() => {\n if (entry.answered) return\n entry.answered = true\n fail(\n id,\n PLUGIN_ERROR_CODES.cancelled,\n `${entry.method} did not stop within ${io.cancelAnswerGraceMs} ms of its cancel`,\n { kind: 'timeout' },\n )\n }, io.cancelAnswerGraceMs)\n }\n\n const handleLine = (line: string) => {\n let message: unknown\n try {\n message = JSON.parse(line)\n } catch {\n fail(null, PLUGIN_ERROR_CODES.parse, 'the line is not JSON')\n return\n }\n if (!isRecord(message)) {\n fail(null, PLUGIN_ERROR_CODES.invalidRequest, 'a message must be a JSON-RPC 2.0 object')\n return\n }\n const id = isRequestId(message.id) ? message.id : null\n if (message.method === undefined && ('result' in message || 'error' in message)) return\n if (message.jsonrpc !== '2.0' || typeof message.method !== 'string') {\n fail(id, PLUGIN_ERROR_CODES.invalidRequest, 'a request needs jsonrpc \"2.0\" and a method')\n return\n }\n if (!('id' in message)) {\n if (message.method === CANCEL_METHOD) cancel(message.params)\n return\n }\n if (id === null) {\n fail(null, PLUGIN_ERROR_CODES.invalidRequest, 'a request id is a string or a number')\n return\n }\n if (leaving) return\n const run = dispatch(id, message.method, message.params)\n inFlight.add(run)\n void run.catch(() => {}).finally(() => inFlight.delete(run))\n }\n\n const decoder = createLineDecoder({\n maxLineBytes: MAX_MESSAGE_BYTES,\n onLine: handleLine,\n onOverflow: () =>\n fail(\n null,\n PLUGIN_ERROR_CODES.invalidRequest,\n `a message is longer than ${MAX_MESSAGE_BYTES} bytes`,\n ),\n })\n\n const stdinClosed = () => {\n if (leaving) return\n decoder.end()\n void leave(RELEASE_ON_CLOSE_BOUND_MS)\n }\n\n if (ownsProcess) process.on('SIGTERM', () => void leave(RELEASE_ON_SIGTERM_BOUND_MS))\n io.stdin.on('data', (chunk) => decoder.push(chunk))\n io.stdin.on('end', stdinClosed)\n io.stdin.on('error', stdinClosed)\n}\n","import { z } from 'zod'\nimport { OPTIONAL_PLUGIN_METHODS, PLUGIN_RUN_FACTS, PLUGIN_SERVES } from './messages.js'\n\n// The manifest sits at package.json[\"agent-qa\"].plugin.\nexport const PLUGIN_MANIFEST_FIELD = 'agent-qa'\n\nconst PackagePathSchema = z.string().min(1)\n\nconst RemotePluginManifestSchema = z.strictObject({\n kind: z.literal('remote'),\n runs: z.literal('process'),\n protocol: z.number().int().positive(),\n entry: PackagePathSchema,\n serves: z.array(z.enum(PLUGIN_SERVES)).nonempty(),\n methods: z.array(z.enum(OPTIONAL_PLUGIN_METHODS)),\n options: PackagePathSchema,\n settings: PackagePathSchema,\n runFacts: z.array(z.enum(PLUGIN_RUN_FACTS)).optional(),\n skill: PackagePathSchema.optional(),\n})\n\nconst ModelAuthManifestSchema = z.strictObject({\n kind: z.literal('model-auth'),\n runs: z.literal('in-process'),\n entry: PackagePathSchema,\n options: PackagePathSchema.optional(),\n})\n\nconst ModelProviderManifestSchema = z.strictObject({\n kind: z.literal('model-provider'),\n runs: z.literal('in-process'),\n entry: PackagePathSchema,\n options: PackagePathSchema.optional(),\n})\n\nexport const PluginManifestSchema = z.discriminatedUnion('kind', [\n RemotePluginManifestSchema,\n ModelAuthManifestSchema,\n ModelProviderManifestSchema,\n])\nexport type PluginManifest = z.infer<typeof PluginManifestSchema>\nexport type RemotePluginManifest = z.infer<typeof RemotePluginManifestSchema>\n","import { mkdirSync, readFileSync, writeFileSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { isDeepStrictEqual } from 'node:util'\nimport { z } from 'zod'\nimport type { PluginDefinition } from './define-plugin.js'\nimport {\n PLUGIN_MANIFEST_FIELD,\n PluginManifestSchema,\n type RemotePluginManifest,\n} from './protocol/manifest.js'\nimport { PLUGIN_PROTOCOL_VERSION } from './protocol/messages.js'\n\nexport interface EmitPluginFilesInput<\n OptionsSchema extends z.ZodType,\n SettingsSchema extends z.ZodType,\n> {\n definition: PluginDefinition<OptionsSchema, SettingsSchema>\n packageDir: string\n}\n\nexport interface EmittedPluginFiles {\n manifest: RemotePluginManifest\n optionsSchemaFile: string\n settingsSchemaFile: string\n packageJsonChanged: boolean\n}\n\nconst OPTIONS_SCHEMA_PATH = './dist/options.schema.json'\nconst SETTINGS_SCHEMA_PATH = './dist/settings.schema.json'\n\nexport function pluginManifest<OptionsSchema extends z.ZodType, SettingsSchema extends z.ZodType>(\n definition: PluginDefinition<OptionsSchema, SettingsSchema>,\n): RemotePluginManifest {\n const manifest = PluginManifestSchema.parse({\n protocol: PLUGIN_PROTOCOL_VERSION,\n kind: 'remote',\n runs: 'process',\n entry: './dist/main.js',\n serves: [...definition.serves],\n methods: [...definition.methods],\n options: OPTIONS_SCHEMA_PATH,\n settings: SETTINGS_SCHEMA_PATH,\n ...(definition.runFacts === undefined ? {} : { runFacts: [...definition.runFacts] }),\n ...(definition.skill === undefined ? {} : { skill: definition.skill }),\n })\n if (manifest.kind !== 'remote') throw new Error('a plugin built with the kit is remote')\n return manifest\n}\n\nfunction schemaText(schema: z.ZodType): string {\n return `${JSON.stringify(z.toJSONSchema(schema, { io: 'input', target: 'draft-2020-12' }), null, 2)}\\n`\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nexport function emitPluginFiles<OptionsSchema extends z.ZodType, SettingsSchema extends z.ZodType>(\n input: EmitPluginFilesInput<OptionsSchema, SettingsSchema>,\n): EmittedPluginFiles {\n const { definition, packageDir } = input\n const manifest = pluginManifest(definition)\n const optionsSchemaFile = join(packageDir, OPTIONS_SCHEMA_PATH)\n const settingsSchemaFile = join(packageDir, SETTINGS_SCHEMA_PATH)\n mkdirSync(join(packageDir, 'dist'), { recursive: true })\n writeFileSync(optionsSchemaFile, schemaText(definition.options))\n writeFileSync(settingsSchemaFile, schemaText(definition.settings))\n\n const packageJsonFile = join(packageDir, 'package.json')\n const parsed: unknown = JSON.parse(readFileSync(packageJsonFile, 'utf8'))\n if (!isRecord(parsed)) throw new Error(`${packageJsonFile} is not a JSON object`)\n const field = isRecord(parsed[PLUGIN_MANIFEST_FIELD]) ? parsed[PLUGIN_MANIFEST_FIELD] : {}\n const packageJsonChanged = !isDeepStrictEqual(field.plugin, manifest)\n if (packageJsonChanged) {\n const next = { ...parsed, [PLUGIN_MANIFEST_FIELD]: { ...field, plugin: manifest } }\n writeFileSync(packageJsonFile, `${JSON.stringify(next, null, 2)}\\n`)\n }\n return { manifest, optionsSchemaFile, settingsSchemaFile, packageJsonChanged }\n}\n","import { PluginError, type PluginErrorOptions } from './define-plugin.js'\n\ntype FailureKind = PluginErrorOptions['kind']\n\nexport type VendorStatusKinds = Readonly<Partial<Record<number, FailureKind>>>\n\nexport function vendorFailureKind(\n status: number | undefined,\n kinds?: VendorStatusKinds,\n): FailureKind {\n if (status === undefined) return 'unreachable'\n const own = kinds?.[status]\n if (own !== undefined) return own\n if (status === 401) return 'auth'\n if (status === 429) return 'capacity'\n return 'refused'\n}\n\nexport interface VendorApiInput {\n vendor: string\n baseUrl: string\n headers?: Record<string, string>\n kinds?: VendorStatusKinds\n}\n\nexport interface VendorRequestInit {\n headers?: Record<string, string>\n body?: string | FormData\n signal?: AbortSignal | undefined\n}\n\nexport interface VendorApi {\n send(method: string, path: string, init?: VendorRequestInit): Promise<Response>\n failure(\n response: Response,\n request: string,\n extra?: { handle?: PluginErrorOptions['handle'] },\n ): Promise<PluginError>\n json(response: Response): Promise<unknown>\n}\n\nconst MAX_REASON_LENGTH = 200\n\nfunction oneLine(text: string): string {\n const line = text.replace(/\\s+/g, ' ').trim()\n return line.length > MAX_REASON_LENGTH ? `${line.slice(0, MAX_REASON_LENGTH)}…` : line\n}\n\nfunction parseJson(text: string): unknown {\n try {\n return JSON.parse(text) as unknown\n } catch {\n return undefined\n }\n}\n\nfunction vendorReason(body: unknown): string | undefined {\n if (typeof body !== 'object' || body === null) return undefined\n for (const field of ['message', 'error'] as const) {\n const value = (body as Record<string, unknown>)[field]\n if (typeof value === 'string' && value.trim() !== '') return oneLine(value)\n }\n return undefined\n}\n\n// Retry-After is a number of seconds or an HTTP date.\nfunction retryWait(retryAfter: string | null): string {\n const value = retryAfter?.trim() ?? ''\n if (value === '') return ''\n return /^\\d+$/.test(value) ? `, retry after ${value} s` : `, retry after ${oneLine(value)}`\n}\n\nfunction causeText(error: unknown): string {\n if (!(error instanceof Error)) return oneLine(String(error))\n const cause = error.cause\n if (cause instanceof Error) {\n const code = 'code' in cause && typeof cause.code === 'string' ? cause.code : cause.message\n return oneLine(code)\n }\n return oneLine(error.message)\n}\n\nexport function createVendorApi(input: VendorApiInput): VendorApi {\n const base = input.baseUrl.endsWith('/') ? input.baseUrl : `${input.baseUrl}/`\n\n return {\n async send(method, path, init = {}) {\n const url = new URL(path, base)\n // Headers match names case-insensitively, so a fixed credential always wins.\n const headers = new Headers(init.headers)\n for (const [name, value] of Object.entries(input.headers ?? {})) {\n try {\n headers.set(name, value)\n } catch {\n // The runtime's error echoes the refused value, which is a credential.\n throw new PluginError(\n `${input.vendor} credentials hold a character a header cannot carry.`,\n { kind: 'auth' },\n )\n }\n }\n try {\n return await fetch(url, {\n method,\n headers,\n ...(init.body === undefined ? {} : { body: init.body }),\n ...(init.signal === undefined ? {} : { signal: init.signal }),\n })\n } catch (error) {\n if (init.signal?.aborted === true) throw error\n throw new PluginError(\n `${input.vendor} could not be reached at ${url.origin}: ${causeText(error)}`,\n { kind: 'unreachable' },\n )\n }\n },\n\n async failure(response, request, extra = {}) {\n const text = await response.text().catch(() => '')\n const message = vendorReason(parseJson(text))\n const reason = message === undefined ? '' : `: ${message}`\n const wait = response.status === 429 ? retryWait(response.headers.get('retry-after')) : ''\n return new PluginError(\n `${input.vendor} answered ${response.status} to ${request}${reason}${wait}`,\n {\n kind: vendorFailureKind(response.status, input.kinds),\n ...(extra.handle === undefined ? {} : { handle: extra.handle }),\n },\n )\n },\n\n async json(response) {\n return parseJson(await response.text())\n },\n }\n}\n\nexport interface EndpointOption<Path extends string = string> {\n path: Path\n scheme: 'https' | 'wss'\n}\n\nconst PLAIN_TWIN = { https: 'http:', wss: 'ws:' } as const\n\nfunction isLoopback(hostname: string): boolean {\n return hostname === 'localhost' || hostname === '[::1]' || /^127(?:\\.\\d{1,3}){3}$/.test(hostname)\n}\n\nexport function checkEndpoints<Options extends Record<string, unknown>>(\n options: Options,\n endpoints: readonly EndpointOption<keyof Options & string>[],\n): void {\n for (const { path, scheme } of endpoints) {\n const value = options[path]\n if (value === undefined) continue\n const url = URL.parse(String(value))\n const allowed =\n url !== null &&\n url.username === '' &&\n url.password === '' &&\n (url.protocol === `${scheme}:` ||\n (url.protocol === PLAIN_TWIN[scheme] && isLoopback(url.hostname)))\n if (!allowed) {\n throw new PluginError(\n `${path} must use ${scheme}:// with no user or password, unless it points at this machine.`,\n { kind: 'refused', path },\n )\n }\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vostride/agent-qa-plugin-kit",
3
- "version": "0.3.0",
3
+ "version": "0.3.2",
4
4
  "private": false,
5
5
  "description": "Build agent-qa plugins: the protocol, definePlugin, the stdio loop and a conformance suite.",
6
6
  "keywords": [
@@ -75,7 +75,7 @@
75
75
  },
76
76
  "devDependencies": {
77
77
  "@types/node": "~24.19.2",
78
- "@vostride/agent-qa-arch": "0.3.0",
78
+ "@vostride/agent-qa-arch": "0.3.2",
79
79
  "tsdown": "~0.23.4",
80
80
  "typescript": "~7.0.2",
81
81
  "vitest": "~5.0.5"