@toolbench/sdk 0.1.0 → 0.1.1

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.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EACN,YAAY,EACZ,WAAW,EACX,YAAY,GAmBZ,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACpF,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAkB,MAAM,cAAc,CAAC;AACjH,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAyC,MAAM,cAAc,CAAC;AAC9G,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EACN,YAAY,EACZ,WAAW,EACX,YAAY,GAmBZ,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACpF,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAkB,MAAM,cAAc,CAAC;AACjH,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAyC,MAAM,cAAc,CAAC;AAC9G,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC","sourcesContent":["/**\n * @toolbench/sdk — the contract a tool implements.\n *\n * A tool is one function plus one manifest. Nothing here touches the DOM, a framework, or a host\n * site, which is what lets a tool be tested in plain Node and reused by any runtime.\n *\n * import type { Tool } from \"@toolbench/sdk\";\n *\n * export default {\n * run({ value }, ctx) {\n * return { kind: \"fields\", fields: [{ label: \"doubled\", value: String(Number(value) * 2) }] };\n * },\n * } satisfies Tool<{ value: string }>;\n */\nexport {\n\tCAPABILITIES,\n\tINPUT_TYPES,\n\tOUTPUT_KINDS,\n\ttype Capability,\n\ttype Case,\n\ttype Cell,\n\ttype Chart,\n\ttype Column,\n\ttype Ctx,\n\ttype Field,\n\ttype InputSpec,\n\ttype InputType,\n\ttype InputValues,\n\ttype LoadedTool,\n\ttype Manifest,\n\ttype Output,\n\ttype OutputKind,\n\ttype Series,\n\ttype Tone,\n\ttype Tool,\n\ttype ToolModule,\n} from \"./types.ts\";\n\nexport { ManifestError, describeSdkVersion, validateManifest } from \"./validate.ts\";\nexport { MIGRATIONS, VersionError, canLoad, upgradeManifest, upgradeOutput, type Migration } from \"./migrate.ts\";\nexport { assertCases, compare, runCases, testCtx, type CaseResult, type RunCasesOptions } from \"./testing.ts\";\nexport { SDK_CHANGELOG, SDK_VERSION, SUPPORTED_SDK_VERSIONS } from \"./version.ts\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../src/migrate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../src/migrate.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Backward compatibility, as a mechanism rather than a promise.\n *\n * A tool is pinned to the contract version it was written against. The runtime keeps moving. So\n * every version boundary gets a **migration**: a pair of pure functions that carry an old manifest\n * and an old output forward one step. Loading a tool runs the chain from its declared version up to\n * the current one, and after that the rest of the system only ever sees current shapes.\n *\n * ```\n * tool declares sdk: 1 runtime speaks 3\n * │\n * └──▶ migrate 1→2 ──▶ migrate 2→3 ──▶ current\n * ```\n *\n * Why a chain and not one big adapter: each step is small enough to read, and each step is testable\n * on its own. Adding version 4 means writing one 3→4 step, not revisiting the previous three.\n *\n * The rules that keep this honest, and that `docs/versioning.md` states as policy:\n *\n * - **Additive only.** A new version may add output kinds, input types and optional fields. It may\n * not remove or repurpose anything, because a migration cannot invent information an old tool\n * never had.\n * - **A migration never fails.** If a step would need to guess, the change was not additive and\n * does not belong in a version bump.\n * - **Old fixtures run forever.** Every tool's cases are checked against the current runtime in CI,\n * which is what turns this file from a good intention into a tested claim.\n */\nimport type { Manifest, Output } from \"./types.ts\";\nimport { SDK_VERSION } from \"./version.ts\";\n\nexport interface Migration {\n\t/** Migrates a manifest from `from` to `from + 1`. */\n\treadonly from: number;\n\tmanifest(raw: Record<string, unknown>): Record<string, unknown>;\n\t/** Migrates an output produced by a tool written against `from`. */\n\toutput(out: Output): Output;\n}\n\n/**\n * The chain, ordered by `from`.\n *\n * Empty at contract version 1 — there is nothing before it. The machinery exists now, with tests,\n * because a compatibility mechanism written at the moment it is first needed is a compatibility\n * mechanism written under pressure.\n *\n * A future entry looks like this (from the real plan for version 2, which adds a `bytes` output for\n * hex dumps):\n *\n * ```ts\n * {\n * from: 1,\n * // A v1 manifest cannot mention `bytes`, so nothing to change.\n * manifest: (m) => m,\n * // A v1 tool cannot return `bytes` either. Identity — and that is the shape of a healthy\n * // additive change: the migration is trivial precisely because nothing was taken away.\n * output: (o) => o,\n * }\n * ```\n */\nexport const MIGRATIONS: readonly Migration[] = [];\n\nexport class VersionError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"VersionError\";\n\t}\n}\n\n/**\n * The steps needed to carry `version` up to `currentVersion`, in order.\n *\n * ⚠️ `currentVersion` is a parameter, not the module constant. It was the constant in the first\n * draft, which meant the injected version was ignored and the chain silently did nothing — the\n * migration tests caught it, which is the argument for testing a compatibility mechanism before the\n * day you need it.\n */\nfunction chainFrom(version: number, migrations: readonly Migration[], currentVersion: number): Migration[] {\n\tconst steps: Migration[] = [];\n\tfor (let v = version; v < currentVersion; v++) {\n\t\tconst step = migrations.find((m) => m.from === v);\n\t\tif (!step) {\n\t\t\tthrow new VersionError(\n\t\t\t\t`No migration from contract version ${v} to ${v + 1}. This is a bug in @toolbench/sdk: ` +\n\t\t\t\t\t`the current version is ${currentVersion}, so every version below it needs a migration step.`,\n\t\t\t);\n\t\t}\n\t\tsteps.push(step);\n\t}\n\treturn steps;\n}\n\n/**\n * Read a raw manifest of any supported version and return one shaped for the current contract.\n *\n * `migrations` is injectable so the chain itself can be tested without shipping a fake version.\n */\nexport function upgradeManifest(\n\traw: unknown,\n\tmigrations: readonly Migration[] = MIGRATIONS,\n\tcurrentVersion: number = SDK_VERSION,\n): Record<string, unknown> {\n\tif (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) {\n\t\tthrow new VersionError(\"A manifest must be an object.\");\n\t}\n\tconst manifest = raw as Record<string, unknown>;\n\tconst declared = manifest.sdk;\n\tif (typeof declared !== \"number\" || !Number.isInteger(declared) || declared < 1) {\n\t\tthrow new VersionError(\n\t\t\t`A manifest must declare an integer contract version, e.g. { \"sdk\": ${currentVersion} }. Got ${JSON.stringify(declared)}.`,\n\t\t);\n\t}\n\tif (declared > currentVersion) {\n\t\tthrow new VersionError(\n\t\t\t`This tool needs contract version ${declared}; this runtime speaks ${currentVersion}. ` +\n\t\t\t\t\"Upgrade @toolbench/runtime, or lower the tool's sdk if it does not use the newer features.\",\n\t\t);\n\t}\n\n\tlet out = manifest;\n\tfor (const step of chainFrom(declared, migrations, currentVersion)) {\n\t\tout = step.manifest(out);\n\t\tout = { ...out, sdk: step.from + 1 };\n\t}\n\treturn { ...out, sdk: currentVersion };\n}\n\n/** Carry an output produced by a tool written against `declaredVersion` up to the current shape. */\nexport function upgradeOutput(\n\tout: Output,\n\tdeclaredVersion: number,\n\tmigrations: readonly Migration[] = MIGRATIONS,\n\tcurrentVersion: number = SDK_VERSION,\n): Output {\n\tif (declaredVersion > currentVersion) {\n\t\tthrow new VersionError(`Cannot downgrade an output from version ${declaredVersion} to ${currentVersion}.`);\n\t}\n\tlet value = out;\n\tfor (const step of chainFrom(declaredVersion, migrations, currentVersion)) value = step.output(value);\n\treturn value;\n}\n\n/** True when this runtime can load a tool declaring `version`. */\nexport function canLoad(version: number, currentVersion: number = SDK_VERSION): boolean {\n\treturn Number.isInteger(version) && version >= 1 && version <= currentVersion;\n}\n\nexport type { Manifest };\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AA+BA,qGAAqG;AACrG,MAAM,UAAU,OAAO,CAAC,MAAoB;IAC3C,OAAO;QACN,MAAM,EAAE,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC,MAAM;QAC9C,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC;KAClB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC7B,IAAU,EACV,KAAsB,EACtB,UAA2B,EAAE;IAE7B,MAAM,OAAO,GAAiB,EAAE,CAAC;IACjC,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;QAC9B,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS;YAChC,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,iBAAiB,OAAO,CAAC,SAAS,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC;YAC1G,CAAC,CAAC,SAAS,CAAC;QACb,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAClC,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;YAC1E,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;YACvC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YACzC,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC;YAClE,OAAO,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,EAAE,EAAE,MAAM,KAAK,SAAS,IAAI,CAAC,OAAO;gBACpC,EAAE;gBACF,GAAG,CAAC,MAAM,KAAK,SAAS;oBACvB,CAAC,CAAC,EAAE,MAAM,EAAE;oBACZ,CAAC,CAAC,OAAO;wBACR,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,OAAO,CAAC,KAAK,wBAAwB,EAAE;wBACxF,CAAC,CAAC,EAAE,CAAC;aACP,CAAC,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,EAAE,EAAE,KAAK;gBACT,EAAE,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,OAAO;gBAC/B,MAAM,EAAE,SAAU,KAAe,EAAE,IAAI,IAAI,OAAO,KAAM,KAAe,EAAE,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI;oBACpG,4FAA4F;oBAC5F,mDAAmD;aACpD,CAAC,CAAC;QACJ,CAAC;gBAAS,CAAC;YACV,IAAI,OAAO;gBAAE,YAAY,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC;IACF,CAAC;IACD,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,0EAA0E;AAC1E,MAAM,CAAC,KAAK,UAAU,WAAW,CAChC,IAAU,EACV,KAAsB,EACtB,UAA2B,EAAE;IAE7B,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC5C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CACd,GAAG,MAAM,CAAC,MAAM,OAAO,OAAO,CAAC,MAAM,oBAAoB;YACxD,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAC7F,CAAC;IACH,CAAC;AACF,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E,2FAA2F;AAC3F,MAAM,UAAU,OAAO,CAAC,MAAc,EAAE,QAAc;IACrD,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,IAAI,OAAO,CAAC;IACvC,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACvB,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;YACnB,OAAO,wFAAwF,CAAC;QACjG,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,QAAQ,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YAC5E,OAAO,0FAA0F,CAAC;QACnG,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,KAAK,CAAC,MAAe,EAAE,QAAiB,EAAE,IAAY;IAC9D,IAAI,QAAQ,KAAK,MAAM;QAAE,OAAO,SAAS,CAAC;IAE1C,IAAI,OAAO,QAAQ,KAAK,OAAO,MAAM,EAAE,CAAC;QACvC,OAAO,GAAG,IAAI,cAAc,OAAO,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,OAAO,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;IACvG,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACtD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACxD,OAAO,GAAG,IAAI,cAAc,IAAI,CAAC,QAAQ,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACnE,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC;YACvC,OAAO,GAAG,IAAI,cAAc,QAAQ,CAAC,MAAM,iBAAiB,MAAM,CAAC,MAAM,iBAAiB,IAAI,CAAC,QAAQ,CAAC,iBAAiB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACzI,CAAC;QACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;YAC5D,IAAI,IAAI;gBAAE,OAAO,IAAI,CAAC;QACvB,CAAC;QACD,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,IAAI,QAAQ,KAAK,IAAI,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1E,MAAM,CAAC,GAAG,QAAmC,CAAC;QAC9C,MAAM,CAAC,GAAG,MAAiC,CAAC;QAC5C,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACzE,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACxB,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;gBAAE,OAAO,GAAG,IAAI,IAAI,GAAG,sBAAsB,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAC3E,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;gBAAE,OAAO,GAAG,IAAI,IAAI,GAAG,uBAAuB,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAC5E,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC;YACrD,IAAI,IAAI;gBAAE,OAAO,IAAI,CAAC;QACvB,CAAC;QACD,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,OAAO,GAAG,IAAI,cAAc,IAAI,CAAC,QAAQ,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;AACnE,CAAC;AAED,SAAS,MAAM,CAAC,MAAc,EAAE,QAAc;IAC7C,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC;IAEjC;;;;;;;;;;OAUG;IACH,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,IAAI,QAAQ,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC1D,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,CAAC,CAAC;QACjF,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,eAAe,QAAQ,CAAC,IAAI,mCAAmC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;QACxH,CAAC;QACD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;QACrH,IAAI,KAAK,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM;YAAE,OAAO,SAAS,CAAC,CAAC,4BAA4B;QACpF,OAAO,UAAU,CAAC,MAAM,KAAK,CAAC;YAC7B,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;YACV,CAAC,CAAC,uBAAuB,UAAU,CAAC,MAAM,KAAK,QAAQ,CAAC,IAAI,6BAA6B,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IACtG,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,OAAO,0BAA0B,QAAQ,CAAC,IAAI,WAAW,MAAM,CAAC,IAAI,GAAG,CAAC;IACzE,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC5D,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC;YAClD,OAAO,mCAAmC,QAAQ,CAAC,UAAU,oCAAoC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACzH,CAAC;QACD;;;;;;WAMG;QACH,MAAM,GAAG,GAAG,CAAC,CAAoC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE,SAAS,CAAC,CAAC,KAAK,EAAE,CAAC;QACzF,MAAM,KAAK,GAAG,IAAI,GAAG,EAAmB,CAAC;QACzC,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM;YAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACpF,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YACpC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,eAAe,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC;YAC1F,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YACjC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACV,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAClG,OAAO,2BAA2B,KAAK,cAAc,MAAM,EAAE,CAAC;YAC/D,CAAC;YACD,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,kBAAkB,KAAK,YAAY,GAAG,CAAC,MAAM,QAAQ,CAAC;YACjF,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,EAAE,iBAAiB,KAAK,GAAG,CAAC,CAAC;YAC9E,IAAI,IAAI;gBAAE,OAAO,IAAI,CAAC;QACvB,CAAC;QACD,OAAO,SAAS,CAAC;IAClB,CAAC;IACD;;;;;;OAMG;IACH,IAAI,QAAQ,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC5D,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,WAAW,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC;QAC7D,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,aAAa,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC;QACjE,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,EAAE,EAAE,GAAG,WAAW,EAAE,GAAG,aAAa,EAAE,EAAE,cAAc,CAAC,CAAC;QACtF,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC;QACtB,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,qDAAqD,CAAC;QACnG,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,2CAA2C,CAAC;QACpF,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,KAAK,OAAO,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC1D,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAChD,OAAO,wCAAwC,QAAQ,CAAC,OAAO,WAAW,MAAM,CAAC,OAAO,GAAG,CAAC;QAC7F,CAAC;QACD,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,KAAK,EAAE,CAAC;YACrE,OAAO,2BAA2B,QAAQ,CAAC,KAAK,UAAU,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAChF,CAAC;QACD,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,gGAAgG;IAChG,OAAO,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAC1C,CAAC;AAED,wFAAwF;AACxF,SAAS,OAAO,CAAC,MAAc;IAC9B,OAAO,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,IAAI,CAAC,KAAc;IAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACnC,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7C,OAAO,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5D,CAAC","sourcesContent":["/**\n * The fixture runner: a tool's `cases.json` is its test suite, and this runs it.\n *\n * It lives in the SDK rather than in the runtime for one reason — **a tool's correctness has nothing\n * to do with a browser.** Cases run in plain Node, which means a tool author gets a red test in\n * milliseconds, CI needs no browser, and the same fixtures can be re-run by a host site's build to\n * prove that the tool it pinned still does what it claimed.\n *\n * Matching is exact by default. That is deliberate: subset matching quietly passes a field emitted\n * twice, fields reordered, a field dropped, or garbage returned beside a correct error message. A\n * case may opt out with `match: \"subset\"`, and then it owes two things — a `why`, and a `fieldCount`\n * so a disappearing field is still a failure.\n */\nimport type { Case, Ctx, Field, Output, Tool } from \"./types.ts\";\n\nexport interface CaseResult {\n\tname: string;\n\tok: boolean;\n\t/** Present when `ok` is false: a human-readable account of the difference. */\n\tdetail?: string;\n\t/** Wall-clock duration, so a \"main thread\" tool can be held to a bound. */\n\tms: number;\n}\n\nexport interface RunCasesOptions {\n\t/** Fails any case that takes longer than this. Use it to hold main-thread tools to a bound. */\n\tmaxMs?: number;\n\t/** Aborts a case that hangs, so a bad loop fails the suite instead of wedging it. */\n\ttimeoutMs?: number;\n}\n\n/** A `Ctx` for a headless run: nothing to draw progress on, and an abort that a timeout can pull. */\nexport function testCtx(signal?: AbortSignal): Ctx {\n\treturn {\n\t\tsignal: signal ?? new AbortController().signal,\n\t\tprogress: () => {},\n\t};\n}\n\nexport async function runCases(\n\ttool: Tool,\n\tcases: readonly Case[],\n\toptions: RunCasesOptions = {},\n): Promise<CaseResult[]> {\n\tconst results: CaseResult[] = [];\n\tfor (const testCase of cases) {\n\t\tconst controller = new AbortController();\n\t\tconst timeout = options.timeoutMs\n\t\t\t? setTimeout(() => controller.abort(new Error(`case exceeded ${options.timeoutMs}ms`)), options.timeoutMs)\n\t\t\t: undefined;\n\t\tconst started = performance.now();\n\t\ttry {\n\t\t\tconst actual = await tool.run(testCase.input, testCtx(controller.signal));\n\t\t\tconst ms = performance.now() - started;\n\t\t\tconst detail = compare(actual, testCase);\n\t\t\tconst tooSlow = options.maxMs !== undefined && ms > options.maxMs;\n\t\t\tresults.push({\n\t\t\t\tname: testCase.name,\n\t\t\t\tok: detail === undefined && !tooSlow,\n\t\t\t\tms,\n\t\t\t\t...(detail !== undefined\n\t\t\t\t\t? { detail }\n\t\t\t\t\t: tooSlow\n\t\t\t\t\t\t? { detail: `took ${ms.toFixed(1)}ms, over the ${options.maxMs}ms bound for this tool` }\n\t\t\t\t\t\t: {}),\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tresults.push({\n\t\t\t\tname: testCase.name,\n\t\t\t\tok: false,\n\t\t\t\tms: performance.now() - started,\n\t\t\t\tdetail: `threw ${(error as Error)?.name ?? \"Error\"}: ${(error as Error)?.message ?? String(error)}\\n` +\n\t\t\t\t\t\"A tool should THROW only when the tool itself is broken. If this input is simply invalid, \" +\n\t\t\t\t\t'return { kind: \"error\", message, input } instead.',\n\t\t\t});\n\t\t} finally {\n\t\t\tif (timeout) clearTimeout(timeout);\n\t\t}\n\t}\n\treturn results;\n}\n\n/** Throws with every failure listed. The shape most test runners want. */\nexport async function assertCases(\n\ttool: Tool,\n\tcases: readonly Case[],\n\toptions: RunCasesOptions = {},\n): Promise<void> {\n\tconst results = await runCases(tool, cases, options);\n\tconst failed = results.filter((r) => !r.ok);\n\tif (failed.length > 0) {\n\t\tthrow new Error(\n\t\t\t`${failed.length} of ${results.length} cases failed:\\n\\n` +\n\t\t\t\tfailed.map((f) => ` ✗ ${f.name}\\n ${f.detail?.split(\"\\n\").join(\"\\n \")}`).join(\"\\n\\n\"),\n\t\t);\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// comparison\n// ---------------------------------------------------------------------------\n\n/** Returns undefined when the output matches, or a description of the first difference. */\nexport function compare(actual: Output, testCase: Case): string | undefined {\n\tconst mode = testCase.match ?? \"exact\";\n\tif (mode === \"subset\") {\n\t\tif (!testCase.why) {\n\t\t\treturn 'match: \"subset\" requires a `why` — an opt-out of exact matching needs a stated reason.';\n\t\t}\n\t\tif (testCase.expect.kind === \"fields\" && testCase.fieldCount === undefined) {\n\t\t\treturn 'match: \"subset\" on a fields output requires `fieldCount`, or a dropped field would pass.';\n\t\t}\n\t\treturn subset(actual, testCase);\n\t}\n\treturn exact(actual, testCase.expect, \"output\");\n}\n\nfunction exact(actual: unknown, expected: unknown, path: string): string | undefined {\n\tif (expected === actual) return undefined;\n\n\tif (typeof expected !== typeof actual) {\n\t\treturn `${path}: expected ${typeof expected} ${show(expected)}, got ${typeof actual} ${show(actual)}`;\n\t}\n\tif (Array.isArray(expected) || Array.isArray(actual)) {\n\t\tif (!Array.isArray(expected) || !Array.isArray(actual)) {\n\t\t\treturn `${path}: expected ${show(expected)}, got ${show(actual)}`;\n\t\t}\n\t\tif (expected.length !== actual.length) {\n\t\t\treturn `${path}: expected ${expected.length} item(s), got ${actual.length}\\n expected: ${show(expected)}\\n actual: ${show(actual)}`;\n\t\t}\n\t\tfor (let i = 0; i < expected.length; i++) {\n\t\t\tconst diff = exact(actual[i], expected[i], `${path}[${i}]`);\n\t\t\tif (diff) return diff;\n\t\t}\n\t\treturn undefined;\n\t}\n\tif (expected !== null && actual !== null && typeof expected === \"object\") {\n\t\tconst e = expected as Record<string, unknown>;\n\t\tconst a = actual as Record<string, unknown>;\n\t\tconst keys = [...new Set([...Object.keys(e), ...Object.keys(a)])].sort();\n\t\tfor (const key of keys) {\n\t\t\tif (!(key in e)) return `${path}.${key}: unexpected field ${show(a[key])}`;\n\t\t\tif (!(key in a)) return `${path}.${key}: missing, expected ${show(e[key])}`;\n\t\t\tconst diff = exact(a[key], e[key], `${path}.${key}`);\n\t\t\tif (diff) return diff;\n\t\t}\n\t\treturn undefined;\n\t}\n\treturn `${path}: expected ${show(expected)}, got ${show(actual)}`;\n}\n\nfunction subset(actual: Output, testCase: Case): string | undefined {\n\tconst expected = testCase.expect;\n\n\t/*\n\t * ⚠️ A subset case looks INSIDE a group.\n\t *\n\t * Composite output is the normal case, not the exception — a decode that returns both a field list\n\t * and a table is a `group` — so a case asserting \"somewhere in there, these fields have these\n\t * values\" has to be able to reach the part it means. Without this, subset matching is unusable for\n\t * exactly the tools most likely to need it.\n\t *\n\t * The rule is \"some part matches\", chosen because it is predictable: with two `fields` parts, a\n\t * case that matches either one passes, and a case that matches neither reports what it tried.\n\t */\n\tif (actual.kind === \"group\" && expected.kind !== \"group\") {\n\t\tconst candidates = flatten(actual).filter((part) => part.kind === expected.kind);\n\t\tif (candidates.length === 0) {\n\t\t\treturn `output: no \"${expected.kind}\" part inside the group (it has ${flatten(actual).map((p) => p.kind).join(\", \")})`;\n\t\t}\n\t\tconst diffs = candidates.map((candidate) => subset(candidate, testCase)).filter((d): d is string => d !== undefined);\n\t\tif (diffs.length < candidates.length) return undefined; // at least one part matched\n\t\treturn candidates.length === 1\n\t\t\t? diffs[0]\n\t\t\t: `output: none of the ${candidates.length} \"${expected.kind}\" parts matched. Closest: ${diffs[0]}`;\n\t}\n\n\tif (actual.kind !== expected.kind) {\n\t\treturn `output.kind: expected \"${expected.kind}\", got \"${actual.kind}\"`;\n\t}\n\tif (expected.kind === \"fields\" && actual.kind === \"fields\") {\n\t\tif (actual.fields.length !== testCase.fieldCount) {\n\t\t\treturn `output.fields: expected exactly ${testCase.fieldCount} field(s) (from fieldCount), got ${actual.fields.length}`;\n\t\t}\n\t\t/*\n\t\t * ⚠️ Fields are identified by GROUP + LABEL, not by label alone.\n\t\t *\n\t\t * A tool that reports the same quantity two ways — \"time in system\" under \"Formula\" and again\n\t\t * under \"Simulation\" — is the normal case, and that is exactly what `group` is for. Keying on\n\t\t * the label alone made those two collide and reported a duplicate that was not one.\n\t\t */\n\t\tconst key = (f: { label: string; group?: string }) => `${f.group ?? \"\"}\\u0000${f.label}`;\n\t\tconst byKey = new Map<string, Field[]>();\n\t\tfor (const f of actual.fields) byKey.set(key(f), [...(byKey.get(key(f)) ?? []), f]);\n\t\tfor (const want of expected.fields) {\n\t\t\tconst where = want.group ? `\"${want.label}\" in group \"${want.group}\"` : `\"${want.label}\"`;\n\t\t\tconst got = byKey.get(key(want));\n\t\t\tif (!got) {\n\t\t\t\tconst labels = actual.fields.map((f) => (f.group ? `${f.group}/${f.label}` : f.label)).join(\", \");\n\t\t\t\treturn `output.fields: no field ${where}. Present: ${labels}`;\n\t\t\t}\n\t\t\tif (got.length > 1) return `output.fields: ${where} appears ${got.length} times`;\n\t\t\tconst diff = exact(got[0], { ...got[0], ...want }, `output.fields[${where}]`);\n\t\t\tif (diff) return diff;\n\t\t}\n\t\treturn undefined;\n\t}\n\t/*\n\t * A chart in subset mode asserts its FRAME, not its data: axis labels, units and annotations.\n\t *\n\t * Pinning hundreds of computed points in a fixture is both unreadable and the wrong test — the\n\t * numbers belong in a unit test that says why they are right. What a fixture usefully checks is\n\t * that the chart the tool describes is the chart the renderer will get.\n\t */\n\tif (expected.kind === \"series\" && actual.kind === \"series\") {\n\t\tconst { x: _ax, series: _as, ...actualFrame } = actual.chart;\n\t\tconst { x: _ex, series: _es, ...expectedFrame } = expected.chart;\n\t\tconst diff = exact(actualFrame, { ...actualFrame, ...expectedFrame }, \"output.chart\");\n\t\tif (diff) return diff;\n\t\tif (actual.chart.series.length === 0) return \"output.chart.series: the chart has no series at all\";\n\t\tif (actual.chart.x.length === 0) return \"output.chart.x: the chart has no x values\";\n\t\treturn undefined;\n\t}\n\tif (expected.kind === \"error\" && actual.kind === \"error\") {\n\t\tif (!actual.message.includes(expected.message)) {\n\t\t\treturn `output.message: expected to contain \"${expected.message}\", got \"${actual.message}\"`;\n\t\t}\n\t\tif (expected.input !== undefined && actual.input !== expected.input) {\n\t\t\treturn `output.input: expected \"${expected.input}\", got ${show(actual.input)}`;\n\t\t}\n\t\treturn undefined;\n\t}\n\t// For every other kind, subset has no defined meaning — fall back to exact rather than pretend.\n\treturn exact(actual, expected, \"output\");\n}\n\n/** Every part of a possibly-nested group, in order, excluding the groups themselves. */\nfunction flatten(output: Output): Output[] {\n\treturn output.kind === \"group\" ? output.parts.flatMap(flatten) : [output];\n}\n\nfunction show(value: unknown): string {\n\tconst json = JSON.stringify(value);\n\tif (json === undefined) return String(value);\n\treturn json.length > 160 ? `${json.slice(0, 157)}…` : json;\n}\n"]}
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AA6EH,mGAAmG;AACnG,MAAM,CAAC,MAAM,YAAY,GAA0B;IAClD,QAAQ;IACR,MAAM;IACN,MAAM;IACN,OAAO;IACP,QAAQ;IACR,OAAO;IACP,OAAO;CACP,CAAC;AA+BF,MAAM,CAAC,MAAM,WAAW,GAAyB,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAmBpG,MAAM,CAAC,MAAM,YAAY,GAA0B,CAAC,MAAM,CAAC,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AA6EH,mGAAmG;AACnG,MAAM,CAAC,MAAM,YAAY,GAA0B;IAClD,QAAQ;IACR,MAAM;IACN,MAAM;IACN,OAAO;IACP,QAAQ;IACR,OAAO;IACP,OAAO;CACP,CAAC;AA+BF,MAAM,CAAC,MAAM,WAAW,GAAyB,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAmBpG,MAAM,CAAC,MAAM,YAAY,GAA0B,CAAC,MAAM,CAAC,CAAC","sourcesContent":["/**\n * The contract. A tool is a function; everything else here describes what goes in and what comes\n * out, so a runtime can build an interface for a tool it has never seen.\n *\n * Two rules govern every change to this file:\n *\n * 1. **Additive only.** New output kinds and input types get added. Existing ones never change\n * meaning, never lose a field, and never gain a required one.\n * 2. **No DOM, no framework, no host.** A tool must be runnable in plain Node, because that is how\n * its fixtures are checked. Anything that needs a browser belongs in the runtime, not here.\n */\n\n// ---------------------------------------------------------------------------\n// Output — what a tool returns\n// ---------------------------------------------------------------------------\n\n/** A label and a value. The plainest thing a tool can say. */\nexport interface Field {\n\tlabel: string;\n\tvalue: string;\n\t/** A qualifier shown beside the value: a unit, a caveat, \"(dynamic)\". */\n\tnote?: string;\n\t/** Fields sharing a group are rendered together under its name. */\n\tgroup?: string;\n\t/** Draws attention without inventing a severity scale. */\n\ttone?: Tone;\n}\n\nexport type Tone = \"normal\" | \"warn\" | \"bad\" | \"good\";\n\nexport interface Column {\n\tlabel: string;\n\talign?: \"start\" | \"end\";\n\t/** Monospace, for anything the reader will compare digit by digit. */\n\tmono?: boolean;\n}\n\nexport type Cell = string | number | { text: string; mono?: boolean; tone?: Tone };\n\n/** One line, bar or area on a chart. */\nexport interface Series {\n\tlabel: string;\n\t/** One value per x. A `null` is a gap, not a zero — the distinction matters on a chart. */\n\tpoints: (number | null)[];\n\tunit?: string;\n\tshape?: \"line\" | \"area\" | \"bar\";\n\taxis?: \"left\" | \"right\";\n}\n\nexport interface Chart {\n\txLabel: string;\n\tyLabel: string;\n\tx: number[];\n\tseries: Series[];\n\txUnit?: string;\n\tyUnit?: string;\n\t/** A vertical marker with a name: \"the knee\", \"capacity\", \"p99\". */\n\tannotations?: { x: number; label: string }[];\n\t/** Second axis label, required if any series sets `axis: \"right\"`. */\n\tyLabelRight?: string;\n}\n\n/**\n * What a tool returns. A closed union: a runtime can render every member, and a tool cannot invent\n * a shape nobody can draw.\n *\n * ⚠️ `group` is what lets one tool answer in more than one shape — a decode that produces both a\n * field list and a table is the common case, not the exception.\n */\nexport type Output =\n\t| { kind: \"fields\"; fields: Field[] }\n\t| { kind: \"text\"; text: string; mono?: boolean }\n\t| { kind: \"code\"; lang: string; source: string }\n\t| { kind: \"table\"; columns: Column[]; rows: Cell[][]; caption?: string }\n\t| { kind: \"series\"; chart: Chart }\n\t| { kind: \"group\"; parts: Output[] }\n\t/**\n\t * The INPUT was wrong, and the tool worked correctly by saying so. `input` names the control at\n\t * fault so a generated form can mark it invalid and point a screen reader at the message —\n\t * without it, an error can only ever float unattached.\n\t *\n\t * A tool that is itself broken should THROW instead. The two render differently on purpose.\n\t */\n\t| { kind: \"error\"; message: string; input?: string; at?: number; len?: number };\n\nexport type OutputKind = Output[\"kind\"];\n\n/** Every kind this contract version can express. The runtime checks its renderers against this. */\nexport const OUTPUT_KINDS: readonly OutputKind[] = [\n\t\"fields\",\n\t\"text\",\n\t\"code\",\n\t\"table\",\n\t\"series\",\n\t\"group\",\n\t\"error\",\n];\n\n// ---------------------------------------------------------------------------\n// Input — what a tool asks for\n// ---------------------------------------------------------------------------\n\ninterface InputBase {\n\tid: string;\n\tlabel: string;\n\t/** The hint a form shows and a screen reader reads. Not a placeholder — those vanish on focus. */\n\tdescription?: string;\n\t/** Shown after the control: \"ms\", \"req/s\", \"bytes\". A number without one is a riddle. */\n\tunit?: string;\n\t/** The one input a compact card shows. At most one per tool. */\n\tprimary?: boolean;\n\t/**\n\t * Force text direction. Bytes, code and identifiers are left-to-right even inside right-to-left\n\t * prose, and a runtime cannot know which is which — the tool says.\n\t */\n\tdir?: \"ltr\" | \"auto\";\n}\n\nexport type InputSpec =\n\t| (InputBase & { type: \"text\"; default: string; maxLength?: number })\n\t| (InputBase & { type: \"textarea\"; default: string; rows?: number; maxLength?: number })\n\t| (InputBase & { type: \"number\"; default: number; min: number; max: number; step?: number })\n\t| (InputBase & { type: \"select\"; default: string; options: { value: string; label: string }[] })\n\t| (InputBase & { type: \"toggle\"; default: boolean });\n\nexport type InputType = InputSpec[\"type\"];\n\nexport const INPUT_TYPES: readonly InputType[] = [\"text\", \"textarea\", \"number\", \"select\", \"toggle\"];\n\n/** The shape a tool's `run` receives: one entry per declared input, keyed by id. */\nexport type InputValues = Record<string, string | number | boolean>;\n\n// ---------------------------------------------------------------------------\n// Capabilities — what a tool is allowed to do\n// ---------------------------------------------------------------------------\n\n/**\n * `pure` is the only capability in contract version 1: a function of its inputs, no I/O, no clock,\n * no randomness that is not seeded. That is not a limitation to apologise for — it is what makes a\n * tool testable by fixture, runnable at build time, and safe to put on a landing page.\n *\n * Reading files and calling networks arrive in later versions, each with its own capability, so a\n * runtime can always tell from the manifest what a tool will try to do before it runs.\n */\nexport type Capability = \"pure\";\n\nexport const CAPABILITIES: readonly Capability[] = [\"pure\"];\n\n// ---------------------------------------------------------------------------\n// The tool itself\n// ---------------------------------------------------------------------------\n\nexport interface Manifest {\n\t/** The contract version this tool was written against. */\n\tsdk: number;\n\t/** Stable, lowercase, hyphenated. Also the directory name and the URL segment. */\n\tid: string;\n\tname: string;\n\t/** One sentence. Shown on cards and used as a page description. */\n\tblurb: string;\n\t/** The tool's own version, independent of `sdk`. */\n\tversion: string;\n\tcapabilities: Capability[];\n\tinputs: InputSpec[];\n\t/** Every kind `run` can return, so a host can refuse a tool it cannot draw. */\n\tkinds: OutputKind[];\n\truntime: {\n\t\t/** Entry file, relative to the tool's directory. */\n\t\tentry: string;\n\t\t/**\n\t\t * `main` is the default and costs nothing. `worker` is for a tool whose running time depends\n\t\t * on its input — it is the only mode where a timeout can actually stop anything.\n\t\t */\n\t\tthread?: \"main\" | \"worker\";\n\t};\n\tstatus?: \"live\" | \"deprecated\" | \"retired\";\n\t/** How the tool appears in a compact slot: runnable, a summary that links out, or not at all. */\n\tcard?: \"live\" | \"info\" | \"none\";\n\t/** How many fields a card shows before it stops. Errors are never truncated. */\n\tcardFields?: number;\n\t/**\n\t * Re-run as the reader types, instead of waiting for the Run button.\n\t *\n\t * Off by default, and that default is deliberate. A tool that runs on every keystroke does work\n\t * nobody asked for, makes the Run button look broken (the answer is already there), and takes the\n\t * decision away from the reader. Opt in only for a tool that is genuinely instant and reads better\n\t * live — a unit converter, say. Anything with a worker or a heavy loop should leave it alone.\n\t */\n\tautoRun?: boolean;\n\t/** Worker mode only. A tool that declares this on the main thread is rejected: nothing there can be stopped. */\n\ttimeoutMs?: number;\n\t/** Markdown file, relative to the tool's directory, rendered as the tool's help. */\n\thelp?: string;\n\ttags?: string[];\n\t/**\n\t * Anything the tool wants to point at: a spec it implements, a post explaining it, a reference\n\t * decoder. Deliberately generic — a host site's own content relations are the host's business.\n\t */\n\tlinks?: { label: string; href: string }[];\n}\n\n/** Passed to `run`. Built by whatever is executing the tool, never sent across a boundary. */\nexport interface Ctx {\n\t/**\n\t * Aborted when the reader cancels, when the input changes mid-run, or when a worker-mode timeout\n\t * fires. A loop whose length depends on input MUST check it — on the main thread it is the only\n\t * way to stop.\n\t */\n\tsignal: AbortSignal;\n\t/**\n\t * Progress, and optionally a partial result. A runtime renders `partial` at most once per frame,\n\t * which is what lets a simulation show itself converging instead of hiding behind a bar.\n\t */\n\tprogress(fraction: number, partial?: Output): void;\n}\n\n/**\n * What a tool is.\n *\n * ⚠️ **Declare your input type as a `type`, not an `interface`.** TypeScript gives an implicit index\n * signature to a type alias of an object literal and not to an interface, so an interface will not\n * satisfy `InputValues` and the error message (\"index signature is missing\") does not hint at the\n * fix. This is the first thing a new tool author trips over.\n *\n * ```ts\n * type Input = { values: string; method: string }; // ✓\n * interface Input { values: string } // ✗ won't satisfy InputValues\n *\n * export default { run(input: Input, ctx) { … } } satisfies Tool<Input>;\n * ```\n */\nexport interface Tool<I extends InputValues = InputValues> {\n\trun(input: I, ctx: Ctx): Output | Promise<Output>;\n}\n\n/** What a tool module default-exports. */\nexport type ToolModule<I extends InputValues = InputValues> = { default: Tool<I> };\n\n/** A manifest plus the module that implements it, which is what a runtime actually consumes. */\nexport interface LoadedTool<I extends InputValues = InputValues> {\n\tmanifest: Manifest;\n\ttool: Tool<I>;\n}\n\n// ---------------------------------------------------------------------------\n// Fixtures\n// ---------------------------------------------------------------------------\n\nexport interface Case {\n\tname: string;\n\tinput: InputValues;\n\texpect: Output;\n\t/**\n\t * Exact deep equality by default, because that is what catches a duplicated field, a reordered\n\t * one, or garbage emitted beside a correct error.\n\t *\n\t * `subset` is an opt-in escape for a tool whose output is genuinely open-ended, and it demands\n\t * two things in return: a `why`, and a `fieldCount`, so a dropped field is still a failure.\n\t */\n\tmatch?: \"exact\" | \"subset\";\n\twhy?: string;\n\tfieldCount?: number;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"validate.js","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Manifest validation, hand-written on purpose.\n *\n * A schema library would be shorter, but it would also be a runtime dependency of the one package\n * every tool author installs — and the error messages would be about JSON paths rather than about\n * tools. These messages name the field, say what was wrong, and say what to do instead, because the\n * person reading them is usually writing their first tool.\n *\n * ⚠️ The invariants at the bottom are the interesting part. They encode rules the rest of the system\n * relies on, so a bad combination fails here rather than three layers later:\n *\n * - a compact card may only run a `pure` tool;\n * - `timeoutMs` is meaningless on the main thread, so declaring it there is an error rather than a\n * silently ignored field;\n * - a tool may not declare an output kind this contract version cannot express.\n */\nimport {\n\tCAPABILITIES,\n\ttype Capability,\n\tINPUT_TYPES,\n\ttype InputSpec,\n\ttype Manifest,\n\tOUTPUT_KINDS,\n\ttype OutputKind,\n} from \"./types.ts\";\nimport { SDK_CHANGELOG, SDK_VERSION, SUPPORTED_SDK_VERSIONS } from \"./version.ts\";\n\nexport class ManifestError extends Error {\n\treadonly field: string;\n\tconstructor(field: string, message: string) {\n\t\tsuper(`${field}: ${message}`);\n\t\tthis.name = \"ManifestError\";\n\t\tthis.field = field;\n\t}\n}\n\nconst ID = /^[a-z0-9][a-z0-9-]*$/;\n\nfunction fail(field: string, message: string): never {\n\tthrow new ManifestError(field, message);\n}\n\nfunction str(o: Record<string, unknown>, field: string, path: string): string {\n\tconst v = o[field];\n\tif (typeof v !== \"string\" || v.length === 0) fail(`${path}${field}`, \"must be a non-empty string\");\n\treturn v;\n}\n\nfunction optStr(o: Record<string, unknown>, field: string, path: string): string | undefined {\n\tif (o[field] === undefined) return undefined;\n\treturn str(o, field, path);\n}\n\nfunction obj(v: unknown, path: string): Record<string, unknown> {\n\tif (typeof v !== \"object\" || v === null || Array.isArray(v)) fail(path, \"must be an object\");\n\treturn v as Record<string, unknown>;\n}\n\nfunction arr(v: unknown, path: string): unknown[] {\n\tif (!Array.isArray(v)) fail(path, \"must be an array\");\n\treturn v;\n}\n\nfunction oneOf<T extends string>(value: unknown, allowed: readonly T[], path: string): T {\n\tif (typeof value !== \"string\" || !allowed.includes(value as T)) {\n\t\tfail(path, `must be one of ${allowed.map((a) => `\"${a}\"`).join(\", \")}, got ${JSON.stringify(value)}`);\n\t}\n\treturn value as T;\n}\n\nfunction validateInput(raw: unknown, path: string): InputSpec {\n\tconst o = obj(raw, path);\n\tconst id = str(o, \"id\", `${path}.`);\n\tif (!ID.test(id)) fail(`${path}.id`, `\"${id}\" must be lowercase letters, digits and hyphens`);\n\tstr(o, \"label\", `${path}.`);\n\toptStr(o, \"description\", `${path}.`);\n\toptStr(o, \"unit\", `${path}.`);\n\tif (o.primary !== undefined && typeof o.primary !== \"boolean\") fail(`${path}.primary`, \"must be a boolean\");\n\tif (o.dir !== undefined) oneOf(o.dir, [\"ltr\", \"auto\"] as const, `${path}.dir`);\n\tconst type = oneOf(o.type, INPUT_TYPES, `${path}.type`);\n\n\tswitch (type) {\n\t\tcase \"text\":\n\t\tcase \"textarea\": {\n\t\t\tif (typeof o.default !== \"string\") fail(`${path}.default`, `a ${type} input needs a string default`);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"number\": {\n\t\t\tif (typeof o.default !== \"number\" || !Number.isFinite(o.default)) {\n\t\t\t\tfail(`${path}.default`, \"a number input needs a finite number default\");\n\t\t\t}\n\t\t\tif (typeof o.min !== \"number\" || typeof o.max !== \"number\") {\n\t\t\t\tfail(`${path}.min/max`, \"a number input must declare min and max — they are the only guard against a runaway input\");\n\t\t\t}\n\t\t\tif (o.min >= o.max) fail(`${path}.min`, `min (${o.min}) must be below max (${o.max})`);\n\t\t\tif (o.default < o.min || o.default > o.max) {\n\t\t\t\tfail(`${path}.default`, `default ${o.default} is outside min..max (${o.min}..${o.max})`);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase \"select\": {\n\t\t\tconst options = arr(o.options, `${path}.options`);\n\t\t\tif (options.length < 2) fail(`${path}.options`, \"a select needs at least two options; with one, use a fixed value\");\n\t\t\tconst values = options.map((opt, i) => {\n\t\t\t\tconst oo = obj(opt, `${path}.options[${i}]`);\n\t\t\t\tstr(oo, \"label\", `${path}.options[${i}].`);\n\t\t\t\treturn str(oo, \"value\", `${path}.options[${i}].`);\n\t\t\t});\n\t\t\tif (new Set(values).size !== values.length) fail(`${path}.options`, \"option values must be unique\");\n\t\t\tif (typeof o.default !== \"string\" || !values.includes(o.default)) {\n\t\t\t\tfail(`${path}.default`, `must be one of the option values: ${values.join(\", \")}`);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase \"toggle\": {\n\t\t\tif (typeof o.default !== \"boolean\") fail(`${path}.default`, \"a toggle input needs a boolean default\");\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn raw as InputSpec;\n}\n\n/**\n * Validate a manifest that has already been brought up to the current contract version.\n *\n * Call `upgradeManifest` first unless you know the manifest is current — this function deliberately\n * rejects an `sdk` it does not recognise rather than guessing.\n */\nexport function validateManifest(raw: unknown): Manifest {\n\tconst o = obj(raw, \"manifest\");\n\n\t// --- the contract version, first, because it decides how to read everything else -------------\n\tif (typeof o.sdk !== \"number\" || !Number.isInteger(o.sdk)) {\n\t\tfail(\"sdk\", `must be an integer contract version; this SDK speaks ${SUPPORTED_SDK_VERSIONS.join(\", \")}`);\n\t}\n\tif (o.sdk > SDK_VERSION) {\n\t\tfail(\n\t\t\t\"sdk\",\n\t\t\t`this tool needs contract version ${o.sdk}, but this runtime only speaks up to ${SDK_VERSION}. ` +\n\t\t\t\t\"Upgrade @toolbench/runtime, or lower the tool's sdk if it does not use the newer features.\",\n\t\t);\n\t}\n\tif (!SUPPORTED_SDK_VERSIONS.includes(o.sdk)) {\n\t\tfail(\"sdk\", `contract version ${o.sdk} is not one this SDK can read (${SUPPORTED_SDK_VERSIONS.join(\", \")})`);\n\t}\n\n\t// --- identity ---------------------------------------------------------------------------------\n\tconst id = str(o, \"id\", \"\");\n\tif (!ID.test(id)) fail(\"id\", `\"${id}\" must be lowercase letters, digits and hyphens — it is also a directory name and a URL segment`);\n\tstr(o, \"name\", \"\");\n\tconst blurb = str(o, \"blurb\", \"\");\n\tif (blurb.length > 200) fail(\"blurb\", `is ${blurb.length} characters; keep it under 200 so it works as a card line and a page description`);\n\tstr(o, \"version\", \"\");\n\tif (o.status !== undefined) oneOf(o.status, [\"live\", \"deprecated\", \"retired\"] as const, \"status\");\n\tif (o.help !== undefined) optStr(o, \"help\", \"\");\n\tif (o.tags !== undefined) arr(o.tags, \"tags\").forEach((t, i) => { if (typeof t !== \"string\") fail(`tags[${i}]`, \"must be a string\"); });\n\tif (o.links !== undefined) {\n\t\tarr(o.links, \"links\").forEach((l, i) => {\n\t\t\tconst lo = obj(l, `links[${i}]`);\n\t\t\tstr(lo, \"label\", `links[${i}].`);\n\t\t\tstr(lo, \"href\", `links[${i}].`);\n\t\t});\n\t}\n\n\t// --- capabilities -----------------------------------------------------------------------------\n\tconst caps = arr(o.capabilities, \"capabilities\");\n\tif (caps.length === 0) fail(\"capabilities\", `must declare at least one of ${CAPABILITIES.join(\", \")}`);\n\tconst capabilities = caps.map((c, i) => oneOf(c, CAPABILITIES, `capabilities[${i}]`)) as Capability[];\n\n\t// --- runtime ----------------------------------------------------------------------------------\n\tconst runtime = obj(o.runtime, \"runtime\");\n\tstr(runtime, \"entry\", \"runtime.\");\n\tconst thread = runtime.thread === undefined ? \"main\" : oneOf(runtime.thread, [\"main\", \"worker\"] as const, \"runtime.thread\");\n\n\t// --- inputs -----------------------------------------------------------------------------------\n\tconst inputs = arr(o.inputs, \"inputs\");\n\tif (inputs.length === 0) fail(\"inputs\", \"a tool needs at least one input; a tool with none is a constant\");\n\tconst specs = inputs.map((input, i) => validateInput(input, `inputs[${i}]`));\n\tconst ids = specs.map((s) => s.id);\n\tif (new Set(ids).size !== ids.length) fail(\"inputs\", `input ids must be unique, got ${ids.join(\", \")}`);\n\tconst primaries = specs.filter((s) => s.primary === true);\n\tif (primaries.length > 1) {\n\t\tfail(\"inputs\", `only one input may be primary (a compact card shows exactly one), got ${primaries.map((p) => p.id).join(\", \")}`);\n\t}\n\n\t// --- output kinds -----------------------------------------------------------------------------\n\tconst kinds = arr(o.kinds, \"kinds\");\n\tif (kinds.length === 0) fail(\"kinds\", \"declare every output kind `run` can return, so a host can refuse a tool it cannot draw\");\n\tconst outputKinds = kinds.map((k, i) => oneOf(k, OUTPUT_KINDS, `kinds[${i}]`)) as OutputKind[];\n\tif (!outputKinds.includes(\"error\")) {\n\t\tfail(\"kinds\", 'must include \"error\" — every tool can be given bad input, and saying so is part of working correctly');\n\t}\n\n\t// --- card -------------------------------------------------------------------------------------\n\tconst card = o.card === undefined ? \"info\" : oneOf(o.card, [\"live\", \"info\", \"none\"] as const, \"card\");\n\tif (o.cardFields !== undefined && (typeof o.cardFields !== \"number\" || o.cardFields < 1)) {\n\t\tfail(\"cardFields\", \"must be a positive number of fields\");\n\t}\n\tif (o.autoRun !== undefined && typeof o.autoRun !== \"boolean\") fail(\"autoRun\", \"must be a boolean\");\n\n\t// --- timeout ----------------------------------------------------------------------------------\n\tif (o.timeoutMs !== undefined) {\n\t\tif (typeof o.timeoutMs !== \"number\" || o.timeoutMs < 100 || o.timeoutMs > 30_000) {\n\t\t\tfail(\"timeoutMs\", \"must be between 100 and 30000 ms\");\n\t\t}\n\t}\n\n\t/*\n\t * --- the invariants ---------------------------------------------------------------------------\n\t * These are the rules the rest of the system leans on. Failing here is the whole point: a bad\n\t * combination becomes a manifest error the author sees immediately, rather than a subtle problem\n\t * a reader finds later.\n\t */\n\tif (card === \"live\" && !(capabilities.length === 1 && capabilities[0] === \"pure\")) {\n\t\tfail(\"card\", 'only a \"pure\" tool may be a live card — a compact slot must not read files or call networks');\n\t}\n\tif (o.autoRun === true && thread === \"worker\") {\n\t\tfail(\n\t\t\t\"autoRun\",\n\t\t\t'is for tools that are instant, and a worker-mode tool is by definition not — it declared thread: \"worker\" ' +\n\t\t\t\t\"because its running time depends on its input. Leave autoRun off and let the reader press Run.\",\n\t\t);\n\t}\n\tif (thread === \"main\" && o.timeoutMs !== undefined) {\n\t\tfail(\n\t\t\t\"timeoutMs\",\n\t\t\t\"is only meaningful with runtime.thread = \\\"worker\\\". On the main thread there is nothing to terminate, \" +\n\t\t\t\t\"so a timeout here would be a field that lies. Either move the tool to a worker or bound its input.\",\n\t\t);\n\t}\n\n\treturn {\n\t\t...(raw as Manifest),\n\t\tcapabilities,\n\t\tinputs: specs,\n\t\tkinds: outputKinds,\n\t\truntime: { ...runtime, entry: runtime.entry as string, thread },\n\t\tcard,\n\t\tstatus: (o.status as Manifest[\"status\"]) ?? \"live\",\n\t};\n}\n\n/** Human-readable summary of what a contract version offers. Used in error messages and docs. */\nexport function describeSdkVersion(version: number): string {\n\treturn SDK_CHANGELOG[version] ?? `unknown contract version ${version}`;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC;AAE7B,+DAA+D;AAC/D,MAAM,CAAC,MAAM,sBAAsB,GAAsB,CAAC,CAAC,CAAC,CAAC;AAE7D;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAA2B;IACpD,CAAC,EAAE,kLAAkL;CACrL,CAAC"}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC;AAE7B,+DAA+D;AAC/D,MAAM,CAAC,MAAM,sBAAsB,GAAsB,CAAC,CAAC,CAAC,CAAC;AAE7D;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAA2B;IACpD,CAAC,EAAE,kLAAkL;CACrL,CAAC","sourcesContent":["/**\n * The version of the CONTRACT, not of any package.\n *\n * Every tool declares `sdk: <n>` in its manifest, and the runtime supports every version it has\n * ever shipped. Raising this number is a deliberate act with a checklist — see docs/versioning.md.\n */\nexport const SDK_VERSION = 1;\n\n/** Every contract version this SDK can read. Never shrinks. */\nexport const SUPPORTED_SDK_VERSIONS: readonly number[] = [1];\n\n/**\n * What each contract version added. Kept as data so the runtime can explain itself: when a tool\n * asks for a version we do not have, the error can say what it would need rather than just failing.\n */\nexport const SDK_CHANGELOG: Record<number, string> = {\n\t1: \"computation and visualisation: fields, text, code, table, series, group, error outputs; text, textarea, number, select, toggle inputs; pure capability; main and worker threads.\",\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@toolbench/sdk",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "The contract a Toolbench tool implements: types, manifest validation, version migration, and a fixture runner. No runtime dependencies, no DOM.",
5
5
  "license": "MIT",
6
6
  "author": "Ahmed Elmalt",
@@ -39,7 +39,8 @@
39
39
  "dist"
40
40
  ],
41
41
  "publishConfig": {
42
- "access": "public"
42
+ "access": "public",
43
+ "provenance": true
43
44
  },
44
45
  "scripts": {
45
46
  "build": "tsc -b"