Upgrade scriptc to 0.0.28 (#336)
* Upgrade scriptc to 0.0.28 - Pin scriptc and its compiler/runtime lock data to 0.0.28. - Refresh service contracts, compatibility fixtures, calibration, and documentation. - Regenerate the service compile-surface reference; the 0.0.28 surface manifest carries no entry changes from 0.0.27. * docs: state the carrier default correctly on the packages page
This commit is contained in:
+1
-1
@@ -590,7 +590,7 @@ fn tsCoreStage(
|
||||
|
||||
// Ordinary service TypeScript is staged without core-subset rewrites.
|
||||
// The one service-boundary lowering turns NS1067's `{ kind, message }`
|
||||
// throw into the tagged Error shape scriptc 0.0.27 can catch from an
|
||||
// throw into the tagged Error shape scriptc 0.0.28 can catch from an
|
||||
// imported op; no deterministic profile fences participate here.
|
||||
const service_stage_run = b.addSystemCommand(&.{node});
|
||||
service_stage_run.addFileArg(dep.path("packages/core/scripts/stage_external_services.mjs"));
|
||||
|
||||
@@ -47,7 +47,7 @@ The question behind "can I use npm?" is almost always one of these five:
|
||||
|
||||
Put ordinary static-tier TypeScript under `src/services/` when the work needs Node built-ins, regexes, JSON, `Map`/`Set`, `Date`, classes, or ambient process authority. Each directly exported, non-default named synchronous function becomes an operation named `<module-basename>.<export>`. Its request and result may be shared, contract-encodable records; the core calls the generated constructor from `@native-sdk/services`, so success and failure still arrive as Msgs and record/replay remains offline.
|
||||
|
||||
This is compiled native code with no JavaScript engine. `native vendor . package@X.Y.Z` resolves an exact package graph once, with lifecycle scripts disabled, into checked-in `src/services/vendor/` sources and hash facts in app.zon. Builds are offline: every byte is verified and scriptc receives only the explicit `--npm-static` package list—never automatic or dynamic fallback. `native check` preserves scriptc's coverage note and refuses anything below 100% static coverage. A five-package scriptc 0.0.27 calibration passed three small source-shipping utilities and refused two (`nanoid` and `micromark`), so package support is intentionally selective. The host is a lazily spawned sibling executable on desktop today; [TypeScript Services](/docs/typescript/services) covers typed calls, streaming, cancellation, authority, crash recovery, and the current desktop scope.
|
||||
This is compiled native code with no JavaScript engine. `native vendor . package@X.Y.Z` resolves an exact package graph once, with lifecycle scripts disabled, into checked-in `src/services/vendor/` sources and hash facts in app.zon. Builds are offline: every byte is verified and scriptc receives only the explicit `--npm-static` package list—never automatic or dynamic fallback. `native check` preserves scriptc's coverage note and refuses anything below 100% static coverage. A five-package scriptc 0.0.28 calibration passed three small source-shipping utilities and refused two (`nanoid` and `micromark`), so package support is intentionally selective. Services run on a supervised carrier — a separate child process by default, or an explicitly selected in-process worker-thread pool; [TypeScript Services](/docs/typescript/services) covers typed calls, streaming, cancellation, authority, crash recovery, and the current desktop scope.
|
||||
|
||||
## Calling APIs, AI endpoints included
|
||||
|
||||
|
||||
Generated
+9
-9
@@ -8,25 +8,25 @@
|
||||
"name": "@native-sdk/core",
|
||||
"version": "0.8.4",
|
||||
"dependencies": {
|
||||
"scriptc": "0.0.27"
|
||||
"scriptc": "0.0.28"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@typescript/old": "npm:typescript@6.0.3"
|
||||
}
|
||||
},
|
||||
"node_modules/@scriptc/compiler": {
|
||||
"version": "0.0.27",
|
||||
"integrity": "sha512-0CQNSfPnr6UD0ssC3QsaNhli/8yRgAheivlbcr9aqvc4bNDDHX40G33dD12urNXa9bQ36nts7ul1Nl57AGDLMQ==",
|
||||
"version": "0.0.28",
|
||||
"integrity": "sha512-zq41x81F209cPrW4T+qMGlcIu8joveB2S26vYePIktbmpCVe+ZwdLnDvAY6aTuktoqTVjXXcsR3ebxGyuGh7rQ==",
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@scriptc/runtime": "0.0.27",
|
||||
"@scriptc/runtime": "0.0.28",
|
||||
"typescript": "7.0.2",
|
||||
"typescript5": "npm:typescript@5.9.3"
|
||||
}
|
||||
},
|
||||
"node_modules/@scriptc/runtime": {
|
||||
"version": "0.0.27",
|
||||
"integrity": "sha512-zInpRHTC4+Y8jhAmLWDlC1v4pe0UPjkWE3r1cgvloKdlJwIDrVnT24BBuK1ElT+aVJWF6JFm0SxDrnvOMyxizA==",
|
||||
"version": "0.0.28",
|
||||
"integrity": "sha512-x7wO/i75fW4sJ8wY16Tr8ImX1SBROy3BIDZK2H4fafAC0rBI1LsYnxJogHqdeahkxUPDkWwuXZPoPC1vxAljGg==",
|
||||
"license": "Apache-2.0"
|
||||
},
|
||||
"node_modules/@typescript/old": {
|
||||
@@ -344,11 +344,11 @@
|
||||
}
|
||||
},
|
||||
"node_modules/scriptc": {
|
||||
"version": "0.0.27",
|
||||
"integrity": "sha512-tr4pTBP05kuvqF95+IQ9hvh3mpux+8y1OaiPXWAKKi/sayAUWC1JULwaDM11pkapEuunMWRG0ZMyRkij8l6sOA==",
|
||||
"version": "0.0.28",
|
||||
"integrity": "sha512-adYCjzHtD7XJyJg3g+gtkrTvONRqiRHsp8ZjkH2ot4FNCHPeix6ebqi88pyP9ZFHMh2bNZe2z3M3/2yHZFwOTg==",
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@scriptc/compiler": "0.0.27"
|
||||
"@scriptc/compiler": "0.0.28"
|
||||
},
|
||||
"bin": {
|
||||
"scriptc": "dist/main.js"
|
||||
|
||||
@@ -36,6 +36,6 @@
|
||||
"@typescript/old": "npm:typescript@6.0.3"
|
||||
},
|
||||
"dependencies": {
|
||||
"scriptc": "0.0.27"
|
||||
"scriptc": "0.0.28"
|
||||
}
|
||||
}
|
||||
|
||||
Generated
+13
-13
@@ -9,8 +9,8 @@ importers:
|
||||
.:
|
||||
dependencies:
|
||||
scriptc:
|
||||
specifier: 0.0.27
|
||||
version: 0.0.27
|
||||
specifier: 0.0.28
|
||||
version: 0.0.28
|
||||
devDependencies:
|
||||
'@typescript/old':
|
||||
specifier: npm:typescript@6.0.3
|
||||
@@ -18,11 +18,11 @@ importers:
|
||||
|
||||
packages:
|
||||
|
||||
'@scriptc/compiler@0.0.27':
|
||||
resolution: {integrity: sha512-0CQNSfPnr6UD0ssC3QsaNhli/8yRgAheivlbcr9aqvc4bNDDHX40G33dD12urNXa9bQ36nts7ul1Nl57AGDLMQ==}
|
||||
'@scriptc/compiler@0.0.28':
|
||||
resolution: {integrity: sha512-zq41x81F209cPrW4T+qMGlcIu8joveB2S26vYePIktbmpCVe+ZwdLnDvAY6aTuktoqTVjXXcsR3ebxGyuGh7rQ==}
|
||||
|
||||
'@scriptc/runtime@0.0.27':
|
||||
resolution: {integrity: sha512-zInpRHTC4+Y8jhAmLWDlC1v4pe0UPjkWE3r1cgvloKdlJwIDrVnT24BBuK1ElT+aVJWF6JFm0SxDrnvOMyxizA==}
|
||||
'@scriptc/runtime@0.0.28':
|
||||
resolution: {integrity: sha512-x7wO/i75fW4sJ8wY16Tr8ImX1SBROy3BIDZK2H4fafAC0rBI1LsYnxJogHqdeahkxUPDkWwuXZPoPC1vxAljGg==}
|
||||
|
||||
'@typescript/typescript-aix-ppc64@7.0.2':
|
||||
resolution: {integrity: sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==}
|
||||
@@ -144,8 +144,8 @@ packages:
|
||||
cpu: [x64]
|
||||
os: [win32]
|
||||
|
||||
scriptc@0.0.27:
|
||||
resolution: {integrity: sha512-tr4pTBP05kuvqF95+IQ9hvh3mpux+8y1OaiPXWAKKi/sayAUWC1JULwaDM11pkapEuunMWRG0ZMyRkij8l6sOA==}
|
||||
scriptc@0.0.28:
|
||||
resolution: {integrity: sha512-adYCjzHtD7XJyJg3g+gtkrTvONRqiRHsp8ZjkH2ot4FNCHPeix6ebqi88pyP9ZFHMh2bNZe2z3M3/2yHZFwOTg==}
|
||||
engines: {node: '>=20'}
|
||||
hasBin: true
|
||||
|
||||
@@ -166,13 +166,13 @@ packages:
|
||||
|
||||
snapshots:
|
||||
|
||||
'@scriptc/compiler@0.0.27':
|
||||
'@scriptc/compiler@0.0.28':
|
||||
dependencies:
|
||||
'@scriptc/runtime': 0.0.27
|
||||
'@scriptc/runtime': 0.0.28
|
||||
typescript: 7.0.2
|
||||
typescript5: typescript@5.9.3
|
||||
|
||||
'@scriptc/runtime@0.0.27': {}
|
||||
'@scriptc/runtime@0.0.28': {}
|
||||
|
||||
'@typescript/typescript-aix-ppc64@7.0.2':
|
||||
optional: true
|
||||
@@ -234,9 +234,9 @@ snapshots:
|
||||
'@typescript/typescript-win32-x64@7.0.2':
|
||||
optional: true
|
||||
|
||||
scriptc@0.0.27:
|
||||
scriptc@0.0.28:
|
||||
dependencies:
|
||||
'@scriptc/compiler': 0.0.27
|
||||
'@scriptc/compiler': 0.0.28
|
||||
|
||||
typescript@5.9.3: {}
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#!/usr/bin/env node
|
||||
// Stage the typed service executable: ordinary service TypeScript plus
|
||||
// corewire's generated service_host_main.ts. One narrow mechanical lowering
|
||||
// is required by scriptc 0.0.27: an escaping `throw { kind, message }` becomes
|
||||
// is required by scriptc 0.0.28: an escaping `throw { kind, message }` becomes
|
||||
// an Error subclass carrying kind in `.name`, the object form its reachable
|
||||
// static catch tier cannot inspect yet. NS1067 rejects locally caught tagged
|
||||
// records; shared core-class modules receive the same transform in this
|
||||
|
||||
@@ -53,7 +53,7 @@ test("an npm package outside the static tier fails check with the compiler note
|
||||
name: "dynamic-only", version: "1.0.0", type: "module", types: "index.d.ts", exports: "./index.js",
|
||||
}));
|
||||
fs.writeFileSync(path.join(vendor, "index.d.ts"), "export default function probe(value: string): string;\n");
|
||||
// randomFillSync is typed but has no static lowering in scriptc 0.0.27.
|
||||
// randomFillSync is typed but has no static lowering in scriptc 0.0.28.
|
||||
// The package itself remains marked "static" in coverage, so this pins
|
||||
// Native SDK's stricter requirement that the total be 100%.
|
||||
fs.writeFileSync(path.join(vendor, "index.js"), [
|
||||
|
||||
@@ -44,7 +44,7 @@ export function parse(payload: Uint8Array): Uint8Array {
|
||||
const contract = JSON.parse(result.servicesContract!);
|
||||
assert.equal(contract.format, 3);
|
||||
assert.equal(contract.protocol_version, 3);
|
||||
assert.equal(contract.compiler_version, "0.0.27");
|
||||
assert.equal(contract.compiler_version, "0.0.28");
|
||||
assert.equal(contract.deterministic, false);
|
||||
assert.deepEqual(contract.packages, []);
|
||||
assert.deepEqual(contract.types, { records: [], enums: [], unions: [] });
|
||||
@@ -596,7 +596,7 @@ test("the service compile lane refuses a contract whose compiler echo skews from
|
||||
try {
|
||||
const stage = path.join(root, "stage");
|
||||
fs.mkdirSync(stage);
|
||||
fs.writeFileSync(path.join(root, "package.json"), JSON.stringify({ dependencies: { scriptc: "0.0.27" } }));
|
||||
fs.writeFileSync(path.join(root, "package.json"), JSON.stringify({ dependencies: { scriptc: "0.0.28" } }));
|
||||
fs.writeFileSync(path.join(root, "services.contract.json"), JSON.stringify({ compiler_version: "0.0.21" }));
|
||||
const script = path.join(path.dirname(fileURLToPath(import.meta.url)), "..", "scripts", "run_external_service_compiler.mjs");
|
||||
const result = spawnSync(process.execPath, [
|
||||
@@ -610,7 +610,7 @@ test("the service compile lane refuses a contract whose compiler echo skews from
|
||||
"--compiler", process.execPath,
|
||||
], { encoding: "utf8" });
|
||||
assert.notEqual(result.status, 0);
|
||||
assert.match(result.stderr, /contract echoes scriptc 0\.0\.21, but packages\/core pins 0\.0\.27/);
|
||||
assert.match(result.stderr, /contract echoes scriptc 0\.0\.21, but packages\/core pins 0\.0\.28/);
|
||||
} finally {
|
||||
fs.rmSync(root, { recursive: true, force: true });
|
||||
}
|
||||
@@ -621,8 +621,8 @@ test("the service compile lane refuses a target that differs from the build host
|
||||
try {
|
||||
const stage = path.join(root, "stage");
|
||||
fs.mkdirSync(stage);
|
||||
fs.writeFileSync(path.join(root, "package.json"), JSON.stringify({ dependencies: { scriptc: "0.0.27" } }));
|
||||
fs.writeFileSync(path.join(root, "services.contract.json"), JSON.stringify({ compiler_version: "0.0.27" }));
|
||||
fs.writeFileSync(path.join(root, "package.json"), JSON.stringify({ dependencies: { scriptc: "0.0.28" } }));
|
||||
fs.writeFileSync(path.join(root, "services.contract.json"), JSON.stringify({ compiler_version: "0.0.28" }));
|
||||
const script = path.join(path.dirname(fileURLToPath(import.meta.url)), "..", "scripts", "run_external_service_compiler.mjs");
|
||||
const result = spawnSync(process.execPath, [
|
||||
script,
|
||||
@@ -647,14 +647,14 @@ test("the service compile lane passes an explicit npm-static allowlist and prese
|
||||
try {
|
||||
const stage = path.join(root, "stage");
|
||||
fs.mkdirSync(stage);
|
||||
fs.writeFileSync(path.join(root, "package.json"), JSON.stringify({ dependencies: { scriptc: "0.0.27" } }));
|
||||
fs.writeFileSync(path.join(root, "package.json"), JSON.stringify({ dependencies: { scriptc: "0.0.28" } }));
|
||||
fs.writeFileSync(path.join(root, "services.contract.json"), JSON.stringify({
|
||||
compiler_version: "0.0.27",
|
||||
compiler_version: "0.0.28",
|
||||
packages: [{ name: "dynamic-only", version: "1.0.0", content_hash: "a".repeat(64) }],
|
||||
}));
|
||||
const compiler = path.join(root, "compiler.mjs");
|
||||
fs.writeFileSync(compiler, `
|
||||
if (process.argv.includes("-v")) { console.log("0.0.27"); process.exit(0); }
|
||||
if (process.argv.includes("-v")) { console.log("0.0.28"); process.exit(0); }
|
||||
const at = process.argv.indexOf("--npm-static");
|
||||
if (at < 0 || process.argv[at + 1] !== "dynamic-only" || process.argv.includes("auto") || process.argv.includes("--dynamic")) {
|
||||
console.error("wrong npm policy: " + process.argv.slice(2).join(" ")); process.exit(9);
|
||||
@@ -687,15 +687,15 @@ test("the service compile lane refuses a package whose successful coverage verdi
|
||||
try {
|
||||
const stage = path.join(root, "stage");
|
||||
fs.mkdirSync(stage);
|
||||
fs.writeFileSync(path.join(root, "package.json"), JSON.stringify({ dependencies: { scriptc: "0.0.27" } }));
|
||||
fs.writeFileSync(path.join(root, "package.json"), JSON.stringify({ dependencies: { scriptc: "0.0.28" } }));
|
||||
fs.writeFileSync(path.join(root, "services.contract.json"), JSON.stringify({
|
||||
compiler_version: "0.0.27",
|
||||
compiler_version: "0.0.28",
|
||||
packages: [{ name: "partial-static", version: "1.0.0", content_hash: "b".repeat(64) }],
|
||||
}));
|
||||
const compiler = path.join(root, "compiler.mjs");
|
||||
fs.writeFileSync(compiler, `
|
||||
import fs from "node:fs";
|
||||
if (process.argv.includes("-v")) { console.log("0.0.27"); process.exit(0); }
|
||||
if (process.argv.includes("-v")) { console.log("0.0.28"); process.exit(0); }
|
||||
if (process.argv[2] === "coverage") {
|
||||
console.log("scriptc coverage service_host_main.ts\\n\\n statements analyzed 10\\n compile statically 8 (80%)\\n\\n deferred to runtime 2 sites\\n ×2 unsupported package calls SC2020");
|
||||
process.exit(0);
|
||||
|
||||
@@ -41,10 +41,10 @@ function generatorFixture(entries: unknown[]) {
|
||||
fs.mkdirSync(scriptDir, { recursive: true });
|
||||
fs.mkdirSync(manifestDir, { recursive: true });
|
||||
fs.copyFileSync(genScript, path.join(scriptDir, "gen_service_surface.mjs"));
|
||||
fs.writeFileSync(path.join(core, "package.json"), JSON.stringify({ dependencies: { scriptc: "0.0.27" } }));
|
||||
fs.writeFileSync(path.join(core, "package.json"), JSON.stringify({ dependencies: { scriptc: "0.0.28" } }));
|
||||
fs.writeFileSync(path.join(manifestDir, "surface-manifest.json"), JSON.stringify({
|
||||
schemaVersion: 1,
|
||||
compilerVersion: "0.0.27",
|
||||
compilerVersion: "0.0.28",
|
||||
coverage: [],
|
||||
entries,
|
||||
}));
|
||||
@@ -140,11 +140,11 @@ test("surface_manifest_diff refuses unknown schema versions", () => {
|
||||
});
|
||||
|
||||
test("surface_manifest_diff refuses a stale install for the pinned spec", () => {
|
||||
const script = diffToolFixture("0.0.27", "0.0.25");
|
||||
const script = diffToolFixture("0.0.28", "0.0.25");
|
||||
const run = spawnSync(process.execPath, [script, "pinned", "pinned"], { encoding: "utf8" });
|
||||
assert.equal(run.status, 2);
|
||||
assert.match(run.stderr, /installed compiler manifest is 0\.0\.25/);
|
||||
assert.match(run.stderr, /package\.json pins scriptc 0\.0\.27/);
|
||||
assert.match(run.stderr, /package\.json pins scriptc 0\.0\.28/);
|
||||
});
|
||||
|
||||
test("identical manifests diff to no differences", () => {
|
||||
@@ -267,7 +267,7 @@ test("the claim scan covers Markdown formatting and docs while ignoring unrelate
|
||||
const unrelated = spawnSync(process.execPath, [fixture.script, "--check"], { encoding: "utf8" });
|
||||
assert.equal(unrelated.status, 0, unrelated.stderr);
|
||||
|
||||
fs.writeFileSync(skill, "The pinned scriptc compiler\nversion `0.0.27` was used for this calibration.\n");
|
||||
fs.writeFileSync(skill, "The pinned scriptc compiler\nversion `0.0.28` was used for this calibration.\n");
|
||||
const current = spawnSync(process.execPath, [fixture.script, "--check"], { encoding: "utf8" });
|
||||
assert.equal(current.status, 0, current.stderr);
|
||||
|
||||
@@ -275,19 +275,19 @@ test("the claim scan covers Markdown formatting and docs while ignoring unrelate
|
||||
const stale = spawnSync(process.execPath, [fixture.script, "--check"], { encoding: "utf8" });
|
||||
assert.equal(stale.status, 1);
|
||||
assert.match(stale.stderr, /skills\/example\/SKILL\.md:2:/);
|
||||
assert.match(stale.stderr, /compiler version 0\.0\.25 but the pin is 0\.0\.27/);
|
||||
assert.match(stale.stderr, /compiler version 0\.0\.25 but the pin is 0\.0\.28/);
|
||||
|
||||
fs.writeFileSync(skill, "Compiler support was measured with scriptc version: `0.0.24`.\n");
|
||||
const punctuated = spawnSync(process.execPath, [fixture.script, "--check"], { encoding: "utf8" });
|
||||
assert.equal(punctuated.status, 1);
|
||||
assert.match(punctuated.stderr, /skills\/example\/SKILL\.md:1:/);
|
||||
assert.match(punctuated.stderr, /compiler version 0\.0\.24 but the pin is 0\.0\.27/);
|
||||
assert.match(punctuated.stderr, /compiler version 0\.0\.24 but the pin is 0\.0\.28/);
|
||||
|
||||
fs.writeFileSync(skill, "The scriptc compiler pin is 0.0.23.\n");
|
||||
const pinClaim = spawnSync(process.execPath, [fixture.script, "--check"], { encoding: "utf8" });
|
||||
assert.equal(pinClaim.status, 1);
|
||||
assert.match(pinClaim.stderr, /skills\/example\/SKILL\.md:1:/);
|
||||
assert.match(pinClaim.stderr, /compiler version 0\.0\.23 but the pin is 0\.0\.27/);
|
||||
assert.match(pinClaim.stderr, /compiler version 0\.0\.23 but the pin is 0\.0\.28/);
|
||||
|
||||
fs.writeFileSync(skill, "The Zig compiler version is 0.16.0.\n");
|
||||
const otherCompiler = spawnSync(process.execPath, [fixture.script, "--check"], { encoding: "utf8" });
|
||||
@@ -300,7 +300,7 @@ test("the claim scan covers Markdown formatting and docs while ignoring unrelate
|
||||
fs.writeFileSync(skill, "The scriptc 0.0.22 calibration established this service surface.\n");
|
||||
const scriptcCalibration = spawnSync(process.execPath, [fixture.script, "--check"], { encoding: "utf8" });
|
||||
assert.equal(scriptcCalibration.status, 1);
|
||||
assert.match(scriptcCalibration.stderr, /compiler version 0\.0\.22 but the pin is 0\.0\.27/);
|
||||
assert.match(scriptcCalibration.stderr, /compiler version 0\.0\.22 but the pin is 0\.0\.28/);
|
||||
|
||||
for (const formattedVersion of ["**0.0.22**", "_0.0.21_", "```0.0.20```"]) {
|
||||
fs.writeFileSync(skill, `The scriptc version is ${formattedVersion}.\n`);
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
],
|
||||
"dependencies": {
|
||||
"@typescript/old": "npm:typescript@6.0.3",
|
||||
"scriptc": "0.0.27"
|
||||
"scriptc": "0.0.28"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@native-sdk/cli-darwin-arm64": "0.8.4",
|
||||
|
||||
@@ -79,7 +79,7 @@ native vendor . escape-string-regexp@5.0.0
|
||||
|
||||
The command installs with lifecycle scripts disabled in a temporary directory, copies the flattened package graph into `src/services/vendor/`, retains package/license files, computes canonical tree hashes, and rewrites app.zon's `service_packages` with exact names, `X.Y.Z` versions, and hashes. Check those bytes and manifest facts into source control.
|
||||
|
||||
Builds never run npm or use the network. They verify package identity and every vendored byte, stage only declared packages, and invoke scriptc with `--npm-static <explicit-list>`. `auto`, dynamic-island fallback, and `--dynamic` are refused. Anything below 100% static coverage fails: `native check` preserves the coverage note verbatim and names the three options—choose another exact package, port/vendor a suitable implementation, or wait for compiler support. The checked-in scriptc 0.0.27 spike (`tests/ts-services/npm-static-spike.json`) passed three of five deliberately small candidates and refused `nanoid` and `micromark`; npm support is selective.
|
||||
Builds never run npm or use the network. They verify package identity and every vendored byte, stage only declared packages, and invoke scriptc with `--npm-static <explicit-list>`. `auto`, dynamic-island fallback, and `--dynamic` are refused. Anything below 100% static coverage fails: `native check` preserves the coverage note verbatim and names the three options—choose another exact package, port/vendor a suitable implementation, or wait for compiler support. The checked-in scriptc 0.0.28 spike (`tests/ts-services/npm-static-spike.json`) passed three of five deliberately small candidates and refused `nanoid` and `micromark`; npm support is selective.
|
||||
|
||||
## Streaming, cancellation, and deadlines
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
Verify without writing:
|
||||
node packages/core/scripts/gen_service_surface.mjs --check -->
|
||||
|
||||
# Service compile surface — scriptc 0.0.27
|
||||
# Service compile surface — scriptc 0.0.28
|
||||
|
||||
What TypeScript under `src/services/` can use, as stated by the pinned
|
||||
compiler itself (surface manifest schema 1, 527 entries:
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"date": "2026-08-12",
|
||||
"compiler": "scriptc 0.0.27",
|
||||
"compiler": "scriptc 0.0.28",
|
||||
"policy": "explicit --npm-static; no auto or dynamic fallback",
|
||||
"method": "packages/core/scripts/npm_static_spike.mjs against exact package bytes in the locked docs workspace",
|
||||
"summary": "3 of 5 deliberately small candidates cleared 100% static coverage; nanoid and micromark were refused, so package support is selective",
|
||||
|
||||
@@ -860,7 +860,7 @@ test "service projection derives host dispatch and registry from one contract" {
|
||||
const contract: service.Contract = .{
|
||||
.format = 3,
|
||||
.protocol_version = 3,
|
||||
.compiler_version = "0.0.27",
|
||||
.compiler_version = "0.0.28",
|
||||
.deterministic = false,
|
||||
.packages = &.{},
|
||||
.types = .{ .records = &.{}, .enums = &.{}, .unions = &.{} },
|
||||
@@ -901,7 +901,7 @@ test "service projection derives host dispatch and registry from one contract" {
|
||||
try std.testing.expect(std.mem.indexOf(u8, registry, ".name = \"feeds.parse\", .index = 0") != null);
|
||||
try std.testing.expect(std.mem.indexOf(u8, registry, "0 => true") != null);
|
||||
try std.testing.expect(std.mem.indexOf(u8, registry, "copyServiceBytes(bytes)") != null);
|
||||
try std.testing.expect(std.mem.indexOf(u8, registry, "pub const compiler_version = \"0.0.27\"") != null);
|
||||
try std.testing.expect(std.mem.indexOf(u8, registry, "pub const compiler_version = \"0.0.28\"") != null);
|
||||
try std.testing.expect(std.mem.indexOf(u8, registry, "pub const contract_fingerprint = [_]u8{") != null);
|
||||
|
||||
const client = try emitClient(std.testing.allocator, contract);
|
||||
|
||||
@@ -216,7 +216,7 @@ test "service contract validates typed operations and authority attestation" {
|
||||
defer arena_state.deinit();
|
||||
const arena = arena_state.allocator();
|
||||
const good =
|
||||
\\{"format":3,"protocol_version":3,"compiler_version":"0.0.27","deterministic":false,"packages":[],"types":{"records":[],"enums":[],"unions":[]},"operations":[{"name":"feeds.parse","client":"feedsParse","module":"src/services/feeds.ts","export":"parse","request":{"kind":"bytes"},"result":{"kind":"bytes"},"deadline_ms":null,"cancellable":false,"stream":null,"source_hash":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}]}
|
||||
\\{"format":3,"protocol_version":3,"compiler_version":"0.0.28","deterministic":false,"packages":[],"types":{"records":[],"enums":[],"unions":[]},"operations":[{"name":"feeds.parse","client":"feedsParse","module":"src/services/feeds.ts","export":"parse","request":{"kind":"bytes"},"result":{"kind":"bytes"},"deadline_ms":null,"cancellable":false,"stream":null,"source_hash":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}]}
|
||||
;
|
||||
var diagnostics: [512]u8 = undefined;
|
||||
var writer = std.Io.Writer.fixed(&diagnostics);
|
||||
@@ -225,7 +225,7 @@ test "service contract validates typed operations and authority attestation" {
|
||||
try std.testing.expectEqualStrings("feeds.parse", contract.operations[0].name);
|
||||
|
||||
const dollar =
|
||||
\\{"format":3,"protocol_version":3,"compiler_version":"0.0.27","deterministic":false,"packages":[],"types":{"records":[],"enums":[],"unions":[]},"operations":[{"name":"feeds.$parse","client":"feeds$parse","module":"src/services/feeds.ts","export":"$parse","request":{"kind":"bytes"},"result":{"kind":"bytes"},"deadline_ms":null,"cancellable":true,"stream":null,"source_hash":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}]}
|
||||
\\{"format":3,"protocol_version":3,"compiler_version":"0.0.28","deterministic":false,"packages":[],"types":{"records":[],"enums":[],"unions":[]},"operations":[{"name":"feeds.$parse","client":"feeds$parse","module":"src/services/feeds.ts","export":"$parse","request":{"kind":"bytes"},"result":{"kind":"bytes"},"deadline_ms":null,"cancellable":true,"stream":null,"source_hash":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}]}
|
||||
;
|
||||
var dollar_diagnostics: [512]u8 = undefined;
|
||||
var dollar_writer = std.Io.Writer.fixed(&dollar_diagnostics);
|
||||
@@ -233,7 +233,7 @@ test "service contract validates typed operations and authority attestation" {
|
||||
try std.testing.expectEqualStrings("$parse", dollar_contract.operations[0].@"export");
|
||||
|
||||
const bad =
|
||||
\\{"format":3,"protocol_version":3,"compiler_version":"0.0.27","deterministic":true,"packages":[],"types":{"records":[],"enums":[],"unions":[]},"operations":[{"name":"feeds.parse","client":"feedsParse","module":"src/services/feeds.ts","export":"parse","request":{"kind":"bytes"},"result":{"kind":"bytes"},"deadline_ms":null,"cancellable":false,"stream":null,"source_hash":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}]}
|
||||
\\{"format":3,"protocol_version":3,"compiler_version":"0.0.28","deterministic":true,"packages":[],"types":{"records":[],"enums":[],"unions":[]},"operations":[{"name":"feeds.parse","client":"feedsParse","module":"src/services/feeds.ts","export":"parse","request":{"kind":"bytes"},"result":{"kind":"bytes"},"deadline_ms":null,"cancellable":false,"stream":null,"source_hash":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}]}
|
||||
;
|
||||
var bad_diagnostics: [512]u8 = undefined;
|
||||
var bad_writer = std.Io.Writer.fixed(&bad_diagnostics);
|
||||
@@ -241,7 +241,7 @@ test "service contract validates typed operations and authority attestation" {
|
||||
try std.testing.expect(std.mem.indexOf(u8, bad_writer.buffered(), "deterministic=true") != null);
|
||||
|
||||
const skewed =
|
||||
\\{"format":3,"protocol_version":3,"compiler_version":"0.0.27","deterministic":false,"packages":[],"types":{"records":[],"enums":[],"unions":[]},"operations":[{"name":"other.parse","client":"otherParse","module":"src/services/feeds.ts","export":"parse","request":{"kind":"bytes"},"result":{"kind":"bytes"},"deadline_ms":null,"cancellable":false,"stream":null,"source_hash":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}]}
|
||||
\\{"format":3,"protocol_version":3,"compiler_version":"0.0.28","deterministic":false,"packages":[],"types":{"records":[],"enums":[],"unions":[]},"operations":[{"name":"other.parse","client":"otherParse","module":"src/services/feeds.ts","export":"parse","request":{"kind":"bytes"},"result":{"kind":"bytes"},"deadline_ms":null,"cancellable":false,"stream":null,"source_hash":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}]}
|
||||
;
|
||||
var skewed_diagnostics: [512]u8 = undefined;
|
||||
var skewed_writer = std.Io.Writer.fixed(&skewed_diagnostics);
|
||||
|
||||
Reference in New Issue
Block a user