Skip to content

Releases: rickylabs/netscript

v0.0.8

Choose a tag to compare

@rickylabs rickylabs released this 12 Oct 14:43
a833dfa

NetScript 0.0.8 is a hardening release. Services are secure by default. Sagas, workers, queues and KV behave correctly under concurrency and failure. Dependencies are current. Releases are safer to cut. It closes 119 issues across 200 merged pull requests, including every P0 in the milestone. It was qualified through a series of canaries, each published to JSR and proven by a production end-to-end run against the published packages.

Highlights

Secure by default

  • Services and plugin services require an explicit auth policy (#2003, #2220). First-party plugin APIs are guarded through a plugin auth seam (#1383).
  • CORS no longer defaults to origin: '*'. Generated workspaces inject an explicit allowlist covering their own app origins (#2193).
  • Generated apps use a backend-for-frontend browser topology with __Host- session cookies (#2221). Each app can opt out with Auth.BrowserTopology: "authored" (#2332).
  • Auth cookies reach the HTTP response unmodified on both the REST and RPC projections (#2189).
  • Callbacks no longer return a session credential in public JSON (#2222).
  • Signout is owner-scoped (#2177).
  • A missing OAuth transaction cookie returns the stable oauth_cookie_missing code, including in production (#2336, #2350).
  • A documented internal (service-to-service) procedure lane, with per-installation credentials provisioned by the Aspire and packaged carriers (#2279, #2340, #2311).

Durable runtime correctness

  • Typed worker effects commit atomically with saga transitions (#2097), including with the saga query projection (#2363).
  • Retention for the KV runtime stores of sagas, workers and triggers (#2225, #2286, #2309, #2345).
  • Delayed Redis queue messages are promoted exactly once across listeners (#2360).
  • The bounded task runner closes every child resource on all termination paths (#2372).
  • Cron on the Deno provider computes the next run in UTC (#2357) and fires weekday schedules on the days written (#2359).
  • watch(keys, { initial: true }) gives a startup snapshot after the subscription is acknowledged, so no startup write is lost (#2371).

CLI and plugins

  • plugin update discovers every first-party factory, and updates succeed in any order without partial writes (#2327, #2348).
  • KV-only installs for workers, sagas and triggers (#2300).
  • Plugin health comes from declared capability metadata (#2344).
  • netscript init sets up agent tooling (#2282).

Toolchain and dependencies

  • Deno 2.9.7 across CI, the scaffold and the docs (#2368).
  • TanStack DB 0.13 with durable streams (#2253), the TanStack AI family (#2251), and the oRPC, Query, Zod and data/tooling waves (#2252, #2254).
  • The release preflight now runs on every pull request (#2378).

Breaking changes

Each change below has a migration note in its pull request and in the linked documentation.

  • Explicit auth policy: createPluginService (#2003) and defineService (#2220) require an auth policy; a missing policy throws before startup. Choose guards, or an explicit public opt-out.
  • Explicit CORS (#2193): the default is no cross-origin access. Pass origin, or let the generated workspace inject its app origins.
  • Auth cookies and sessions: backend Set-Cookie headers are propagated (#2189). The callback JSON no longer carries the session credential, so read the session from the cookie (#2222). Signout is subject-scoped (#2177). A missing transaction cookie returns oauth_cookie_missing (#2336).
  • Custom KvOAuthStore implementations (#2014) must implement getSessionEntry(id) and honour expectedVersionstamp in rotateSession.
  • WorkOS (#2316, #2335): the official service requires atomic host KV and honours NETSCRIPT_AUTH_COOKIE_NAME. Revocation outbox keys changed format.
  • Browser topology (#2221): auth installs scaffold the BFF route and helpers. Projects that own their topology set Auth.BrowserTopology: "authored" (#2332).
  • Plugin composition (#2125) validates root collisions and dependency closure at composition time.
  • declareHealthChecks removed (#2344): health comes from declared capability metadata.
  • Streams (#2296): the unsupported root producer and consumer helpers are removed. Use defineStreamSchema with createDurableStream or createServiceStreamProducer.
  • Expo live queries (#2244): an injected StreamFetchV1 returns StreamFetchResponseV1 (ok, status, headers, streaming body) instead of a full Response.
  • KV-only saga installs (#2300): new installs emit Sagas.Projection.Backend matching the store backend, defaulting to KV.
  • netscript init (#2282) runs the agent installer by default.
  • RabbitMQ (#2254): amqplib 2.x; an explicit heartbeat=0 now disables heartbeats.
  • Anthropic usage and credentials (#2251), accepted by the owner as shipped upstream:
    • usage.promptTokens is now total input: uncached input, cache reads and cache writes, each counted once. Subtract promptTokensDetails.cachedTokens and cacheWriteTokens to get uncached input; adding them again double-counts.
    • With no explicit credential, the provider checks ANTHROPIC_AUTH_TOKEN, then ANTHROPIC_OAUTH_TOKEN, then ANTHROPIC_API_KEY. An explicit credential always wins.
  • Cron weekdays on the Deno provider (#2359): NetScript weekday numbers (0–6, Sunday = 0) are translated for Deno.cron, so weekday schedules now fire on the days written, one day later than before. CronPresets.EVERY_WEEK registers on Deno.

Upgrade notes

  • Deno 2.9.7 and existing lock files: Deno 2.9.6 changed how npm package IDs with single-resolution peers are written (denoland/deno#36608). A deno.lock written by Deno ≤2.9.5 can pass --frozen but then fail at runtime with ERR_MODULE_NOT_FOUND. After moving to Deno 2.9.6 or newer, refresh it with deno install --lockfile-only. Resolved versions do not change.
  • KV watch: with { initial: true }, dedupe the snapshot and the first change by equal versionstamp only. Redis versionstamps are per-process ULIDs and do not order writes from different processes.

Known open items

  • #2185: the CI tiers are proven stable (3/3 on main and 3/3 on a PR head, with no reruns). One box remains: confirming local scaffold.runtime behaviour is unchanged, which needs a machine with a local Docker engine. On a remote engine, Aspire binds container ports to that engine's loopback (microsoft/aspire#10722). Carried over to 0.0.9.
  • #1386: every acceptance box is proven in CI on the released code. A browser run against a project generated from the published CLI on a public HTTPS origin was not available.
  • Carried over to 0.0.9 (label wave:carryover-0.0.8):
    • partly delivered: #1366 (dashboard rendering and cross-process crash-loop detection remain) and #2108 (a gated KV-only consumer run remains);
    • not started: #2068, #1912, #1667, #1655 and #1364.
  • New follow-ups found during the 0.0.8 cut (0.0.9): #2373, #2375, #2377, #2379, #2382, #2383 and #2384.
  • Dependencies: 13 patch-level updates (@fedify/*, @orpc/*, TanStack Query, Zod) are deferred to 0.0.9, together with the held majors (#2250). Preact 11 and Vite 8 arrive only with Fresh 3.

What's Changed

⚠️ Breaking changes

  • feat(plugin): require an explicit service auth policy by @rickylabs in #2003
  • fix(auth-kv-oauth): verify revocation persistence before acknowledging by @rickylabs in #2014
  • fix(auth): propagate backend cookies on REST and RPC by @rickylabs in #2189
  • fix(service): require explicit CORS and inject workspace app origins by @rickylabs in #2193
  • fix(auth)!: enforce signout session ownership, subject-scoped everywhere and scoped operator revocation by @rickylabs in #2177
  • fix(service): require explicit auth policy in defineService by @rickylabs in #2220
  • feat(plugin): validate root composition collisions and dependency closure by @rickylabs in #2125
  • fix(cli): scaffold BFF browser authentication topology by @rickylabs in #2221
  • fix(auth)!: remove callback session credential from public JSON by @rickylabs in #2222
  • feat(sdk): bind Expo live queries to injected streams by @rickylabs in #2244
  • chore(deps): refresh data and tooling dependency wave by @rickylabs in #2254
  • chore(deps): refresh TanStack AI family for 0.0.8 by @rickylabs in #2251
  • feat(cli): initialize agent tooling during project init by @rickylabs in #2282
  • fix(streams): remove unsupported root producer and consumer helpers by @rickylabs in #2296
  • feat(auth-workos): fence subject sessions and queue upstream revocation by @rickylabs in #2316
  • feat(plugins): support KV-only install metadata and runner bootstrap by @rickylabs in #2300
  • fix(auth-workos): preserve session revocation availability by @rickylabs in #2335
  • fix(auth): expose missing OAuth cookie error code by @rickylabs in #2336
  • refactor(plugins)!: unify health metadata and generated vocabulary by @rickylabs in #2344
  • fix(cron)!: translate weekday numbering for Deno.cron by @rickylabs in #2359

🚀 Features

...

Read more

NetScript 0.0.8-canary.9

Pre-release

Choose a tag to compare

@github-actions github-actions released this 12 Oct 11:28

NetScript 0.0.8-canary.9

What this canary is for. canary.9 is release candidate 9 for NetScript 0.0.8. It bundles 1 pull requests since the previous canary point so downstream apps can try the published packages before 0.0.8 ships. It is a pre-release: normal semver resolution never selects it, and Latest stays v0.0.7. All 35 @netscript/* packages are published at exactly 0.0.8-canary.9. The canary publish and version-pinned production E2E both passed (publish, production E2E).

Highlights

release

  • bump reference locks and verify generated prose by regeneration (#2381)

Breaking changes and migration

No breaking changes declared by included PRs.

Known open follow-ups

  • #2103 0.0.8 milestone run: orchestrated delivery of milestone 25

Trying this canary

Pin exact versions, for example jsr:@netscript/service@0.0.8-canary.9. Deno applies a default 24-hour minimum dependency age. For testing a newer canary, set minimumDependencyAge: 0 in the consumer configuration; this changes admission timing, not versions.

PRs listed below as "closes no linked issues" may deliver partial scope. Their explicitly referenced open issues are listed above; remaining scope stays tracked on those issues.


Canary payload derived from merge-aware history after 370b70d29a1e4b3f28851f4700b0e7d59e4f231f (1 commit(s) inspected; outcome: populated).

Included pull requests

  • #2381 fix(release): bump reference locks and verify generated prose by regeneration — closes no linked issues

NetScript 0.0.8-canary.8

Pre-release

Choose a tag to compare

@github-actions github-actions released this 12 Oct 09:57

NetScript 0.0.8-canary.8

What this canary is for. canary.8 is release candidate 8 for NetScript 0.0.8. It bundles 0 pull requests since the previous canary point so downstream apps can try the published packages before 0.0.8 ships. It is a pre-release: normal semver resolution never selects it, and Latest stays v0.0.7. All 35 @netscript/* packages are published at exactly 0.0.8-canary.8. The canary publish and version-pinned production E2E both passed (publish, production E2E).

Highlights

No included pull requests.

Breaking changes and migration

No breaking changes declared by included PRs.

Known open follow-ups

No referenced issues remain open.

Trying this canary

Pin exact versions, for example jsr:@netscript/service@0.0.8-canary.8. Deno applies a default 24-hour minimum dependency age. For testing a newer canary, set minimumDependencyAge: 0 in the consumer configuration; this changes admission timing, not versions.

PRs listed below as "closes no linked issues" may deliver partial scope. Their explicitly referenced open issues are listed above; remaining scope stays tracked on those issues.


Canary payload derived from merge-aware history after 370b70d29a1e4b3f28851f4700b0e7d59e4f231f (0 commit(s) inspected; outcome: genuine-empty).

Included pull requests

Genuine empty payload: no commits landed since the previous canary point.

Coordinator addendum: what canary.8 contains

canary.8 re-qualifies the exact content of canary.7 (370b70d29, identical tree). canary.7 published completely, but its pinned production E2E hit a transient JSR 502 on one package file, tracked as #2379. Its included pull requests and breaking changes are in the canary.7 notes: Deno 2.9.7 (#2368), watch(keys, { initial: true }) (#2371), Redis delayed promotion exactly-once (#2360), atomic saga capability through the projection (#2363), the cron fixes (#2357, and the breaking weekday translation #2359), the bounded-runner pipe fix (#2372) and the release-preflight CI gate (#2378). canary.8's production E2E passed: scaffold.runtime 119/0/1 and quickstart.walk 9/0.

Upgrade note: Deno 2.9.7 and existing lock files

This canary moves NetScript's toolchain, CI and scaffold to Deno 2.9.7 (#2368). Deno 2.9.6 changed how npm package IDs with single-resolution peers are written (denoland/deno#36608). A deno.lock written by Deno 2.9.5 or older still passes --frozen on 2.9.6+, but can then fail at runtime with ERR_MODULE_NOT_FOUND on a path ending in _1.

If your project's lock was written by Deno ≤2.9.5, refresh it after upgrading: run deno install --lockfile-only with Deno 2.9.7, plus your project's own lock task for any nested workspace lock. The refresh rewrites ID format only; resolved versions stay the same.

Note for third-party KV adapters

@netscript/kv/testing (#2371) runs the new initial-snapshot and ready scenarios only for adapters that declare support for them. Adapters without them still pass the default-path contract. WatchableKvBridge expects the wrapped adapter to honour watch(keys, { initial: true }); every first-party adapter does. The fallback for adapters that don't is tracked in #2377.

NetScript 0.0.8-canary.7

Pre-release

Choose a tag to compare

@github-actions github-actions released this 12 Oct 09:28

NetScript 0.0.8-canary.7

What this canary is for. canary.7 is release candidate 7 for NetScript 0.0.8. It bundles 9 pull requests since the previous canary point so downstream apps can try the published packages before 0.0.8 ships. It is a pre-release: normal semver resolution never selects it, and Latest stays v0.0.7. All 35 @netscript/* packages are published at exactly 0.0.8-canary.7. The canary publish passed (publish); production E2E failed (failure; production E2E).

Highlights

deps

  • align #2249 durable-streams pins and lock specifiers (#2355)

kv

  • opt-in snapshot after subscribe for watch (#2371)

plugins

  • compute Deno next run in UTC for stepped schedules (#2357)
  • translate weekday numbering for Deno.cron (#2359)
  • keep atomic transition capability through query projection (#2363)
  • promote delayed Redis messages atomically (#2360)
  • close the over-budget output pipe in the bounded runner (#2372)

tooling

  • pin Deno 2.9.7 across CI, scaffold and docs (#2368)
  • use relative imports in tests and gate release preflight in CI (#2378)

Breaking changes and migration

  • #2359: translate weekday numbering for Deno.cron
    Weekday schedules now fire on the days written. The Deno provider converts NetScript's 0–6 numbering (Sunday = 0) to native Deno numbering before registration. If you compensated by writing Deno numbering, rewrite it in 0–6: Sunday is 0, and Monday–Friday is 1-5. Deno next-run previews now reflect native OR when both day fields are restricted. The migration note is in packages/cron/README.md, Compatibility / Breaking change and migration.

Known open follow-ups

  • #2103 0.0.8 milestone run: orchestrated delivery of milestone 25

Trying this canary

Pin exact versions, for example jsr:@netscript/service@0.0.8-canary.7. Deno applies a default 24-hour minimum dependency age. For testing a newer canary, set minimumDependencyAge: 0 in the consumer configuration; this changes admission timing, not versions.

PRs listed below as "closes no linked issues" may deliver partial scope. Their explicitly referenced open issues are listed above; remaining scope stays tracked on those issues.


Canary payload derived from merge-aware history after 35a4cad59c85c10e67b1ebe0823b71b785489f8e (9 commit(s) inspected; outcome: populated).

Included pull requests

  • #2355 fix(deps): align #2249 durable-streams pins and lock specifiers — closes no linked issues
  • #2357 fix(cron): compute Deno next run in UTC for stepped schedules — closes #2356
  • #2359 fix(cron)!: translate weekday numbering for Deno.cron — closes #2358
  • #2363 fix(sagas): keep atomic transition capability through query projection — closes #2362
  • #2360 fix(queue): promote delayed Redis messages atomically — closes #2354
  • #2372 fix(workers): close the over-budget output pipe in the bounded runner — closes #2370
  • #2368 chore(toolchain): pin Deno 2.9.7 across CI, scaffold and docs — closes no linked issues
  • #2371 feat(kv): opt-in snapshot after subscribe for watch — closes #2361
  • #2378 fix(release): use relative imports in tests and gate release preflight in CI — closes no linked issues

NetScript 0.0.8-canary.10

Pre-release

Choose a tag to compare

@github-actions github-actions released this 12 Oct 14:38

NetScript 0.0.8-canary.10

What this canary is for. canary.10 is release candidate 10 for NetScript 0.0.8. It bundles 1 pull requests since the previous canary point so downstream apps can try the published packages before 0.0.8 ships. It is a pre-release: normal semver resolution never selects it, and Latest stays v0.0.7. All 35 @netscript/* packages are published at exactly 0.0.8-canary.10. The canary publish and version-pinned production E2E both passed (publish, production E2E).

Highlights

cli

  • resolve unpublished release fixtures from the checkout (#2388)

Breaking changes and migration

No breaking changes declared by included PRs.

Known open follow-ups

  • #2103 0.0.8 milestone run: orchestrated delivery of milestone 25

Trying this canary

Pin exact versions, for example jsr:@netscript/service@0.0.8-canary.10. Deno applies a default 24-hour minimum dependency age. For testing a newer canary, set minimumDependencyAge: 0 in the consumer configuration; this changes admission timing, not versions.

PRs listed below as "closes no linked issues" may deliver partial scope. Their explicitly referenced open issues are listed above; remaining scope stays tracked on those issues.


Canary payload derived from merge-aware history after e856e22ff034b6018008ec234cf9680e72d6ab83 (1 commit(s) inspected; outcome: populated).

Included pull requests

  • #2388 test(cli): resolve unpublished release fixtures from the checkout — closes no linked issues

NetScript 0.0.8-canary.6

Pre-release

Choose a tag to compare

@github-actions github-actions released this 11 Oct 21:12

NetScript 0.0.8-canary.6

What this canary is for. canary.6 is release candidate 6 for NetScript 0.0.8. It bundles 12 pull requests since the previous canary point so downstream apps can try the published packages before 0.0.8 ships. It is a pre-release: normal semver resolution never selects it, and Latest stays v0.0.7. All 35 @netscript/* packages are published at exactly 0.0.8-canary.6. The canary publish and version-pinned production E2E both passed (publish, production E2E).

Highlights

auth

  • expose missing OAuth cookie error code (#2336)
  • isolate production tests and preserve defined auth errors (#2350)

cli

  • provision packaged installation secret on deployment target (#2340)
  • declare first-party discovery factory axes (#2348)

deps

  • upgrade TanStack DB family (#2253)

kv

  • reconstruct historical duplicate DLQ records (#2346)

plugins

  • emit committed compensation outcomes immediately (#2342)
  • resolve canonical runner backend (#2343)
  • bind core scheduler retention to saga instances (#2345)
  • unify health metadata and generated vocabulary (#2344)

sdk

  • reproduce historical Expo fixture export failure (#2341)

service

  • explain guarded typed-client credentials (#2339)

Breaking changes and migration

  • #2336: expose missing OAuth cookie error code
    The missing-transaction callback failure now uses oauth_cookie_missing instead of AUTH_PROVIDER_ERROR. Update clients matching the generic code to handle the specific code (REST code, RPC json.code). HTTP 502 is unchanged. The migration note lives in docs/site/reference/auth/index.md under “0.0.8 error-code migration”.
  • #2344: unify health metadata and generated vocabulary
    declareHealthChecks, HealthCheckSpec, SagasHealthCheckSpec, and TriggersHealthCheckSpec are removed in 0.0.8. Remove custom contribution overrides and type imports. Retain resource/environment declarations, capability metadata and doctor.healthEndpoint. The endpoint is a diagnostic declaration; it is not copied into AppHost by the installer. Background Deno/KV children serve the shared /health payload; AppHost service probe paths use HealthCheckPath appsettings (default /health). Migration docs: docs/site/orchestration-runtime/child-health.md, the authoring recipe, and the Aspire explanation.

Known open follow-ups

  • #1366 fix(plugins): every declareHealthChecks returns only the API resource — a crash-looping background child leaves the declared health surface green
  • #1372 test(e2e): the merge-readiness gate probes API health only — background children and streams go unverified, and a saga stuck compensating is reported COMPENSATED
  • #1385 fix(auth): oRPC signin/callback discard the backend Set-Cookie, so the interactive browser flow can never establish a session
  • #1667 test(queue): eliminate typed-queue DLQ timing flake
  • #2103 0.0.8 milestone run: orchestrated delivery of milestone 25
  • #2108 feat(plugins): a supported KV-only install for workers, sagas and triggers
  • #2249 deps: bring critical dependencies current for canary.5 (TanStack, oRPC, streams, Prisma)
  • #2347 fix(cli): canary.5 plugin update discovery has no declaration for first-party defineTask (and a workers/streams update cycle)

Trying this canary

Pin exact versions, for example jsr:@netscript/service@0.0.8-canary.6. Deno applies a default 24-hour minimum dependency age. For testing a newer canary, set minimumDependencyAge: 0 in the consumer configuration; this changes admission timing, not versions.

PRs listed below as "closes no linked issues" may deliver partial scope. Their explicitly referenced open issues are listed above; remaining scope stays tracked on those issues.


Canary payload derived from merge-aware history after a553920b248af1f4084f750cbd4ae4cff3546f06 (12 commit(s) inspected; outcome: populated).

Included pull requests

  • #2336 fix(auth): expose missing OAuth cookie error code — closes no linked issues
  • #2341 test(sdk): reproduce historical Expo fixture export failure — closes no linked issues
  • #2342 fix(sagas): emit committed compensation outcomes immediately — closes no linked issues
  • #2346 test(queue): reconstruct historical duplicate DLQ records — closes no linked issues
  • #2343 fix(sagas): resolve canonical runner backend — closes no linked issues
  • #2345 fix(sagas): bind core scheduler retention to saga instances — closes no linked issues
  • #2350 fix(auth): isolate production tests and preserve defined auth errors — closes #2349
  • #2344 refactor(plugins)!: unify health metadata and generated vocabulary — closes no linked issues
  • #2340 feat(cli): provision packaged installation secret on deployment target — closes no linked issues
  • #2339 docs(service): explain guarded typed-client credentials — closes #1382
  • #2348 fix(cli): declare first-party discovery factory axes — closes no linked issues
  • #2253 chore(deps): upgrade TanStack DB family — closes no linked issues

NetScript 0.0.8-canary.5

Pre-release

Choose a tag to compare

@github-actions github-actions released this 11 Oct 15:23

NetScript 0.0.8-canary.5

What this canary is for. canary.5 is release candidate 5 for NetScript 0.0.8. It bundles 53 pull requests since the previous canary point so downstream apps can try the published packages before 0.0.8 ships. It is a pre-release: normal semver resolution never selects it, and Latest stays v0.0.7. All 35 @netscript/* packages are published at exactly 0.0.8-canary.5. The canary publish and version-pinned production E2E both passed (publish, production E2E).

Highlights

aspire

  • authenticated Postgres readiness check for generated DB resources (#2179)
  • check generated Aspire surface without mutation (#2217)
  • migrate stale Garnet tool manifest pins (#2304)
  • prove Garnet executable coexistence (#2305)

auth

  • unify generated service auth across CLI lifecycle flows (#2235)
  • prove generated cookie-jar consumer flow (#2280)
  • connect generated apps to guarded services (#2274)
  • provision installation internal credentials (#2279)
  • restore typed WorkOS sealed session user (#2239)
  • fence subject sessions and queue upstream revocation (#2316)
  • preserve session revocation availability (#2335)

cli

  • initialize agent tooling during project init (#2282)
  • enforce auth and generated users runtime contracts (#2273)
  • safely clean owned agent skill mirrors (#2291)
  • make real-browser startup reliable (#2299)
  • freeze scratch probe dependency resolution (#2289)
  • prove background child and streams runtime readiness (#2306)
  • expose route manifest generation (#2294)
  • make init tests hermetic (#2295)
  • safely remove generated pages (#2314)
  • check plugin registry output inventory (#2277)
  • diagnose plugin registries from typed inventory (#2330)
  • inventory Aspire generated surfaces (#2331)
  • support core-only discovery and prevent partial plugin updates (#2327)
  • respect authored app browser auth topology (#2332)

deps

  • refresh TanStack AI family for 0.0.8 (#2251)

docs

  • compile published JSDoc examples and close census (#2320)

fresh

  • preserve native chat parts through durable reader replay (#2303)
  • retain native SSE response during bounded teardown (#2318)
  • retain chat SSE response through cancellation (#2325)

kv

  • prove typed queue DLQ stability (#2302)
  • preserve shared Redis watch subscriptions (#2328)

plugins

  • expose background child liveness contract (#2203)
  • report compensation telemetry only after completion (#2283)
  • bound delayed-message cleanup by retention deadlines (#2286)
  • probe background children by capability (#2281)
  • remove unsupported root producer and consumer helpers (#2296)
  • prove generated outbound webhook runtime (#2297)
  • expose owned route and schema contracts (#2292)
  • backfill legacy terminal retention (#2309)
  • forward concurrency and verify generated runtime value (#2310)
  • reconcile concurrency and caveat regression gates (#2322)
  • name the exact public implementer contract (#2313)
  • aggregate degraded background child health (#2307)
  • support KV-only install metadata and runner bootstrap (#2300)

sdk

  • isolate Expo fixture environment (#2271)

service

  • prove generated browser auth and CORS topology (#2284)
  • document and exercise internal procedure lane (#2311)

tooling

  • repair Expo lock drift and process-runner race (#2263)
  • repair canary label permissions (#2265)
  • calibrate runtime image pull evidence (#2276)
  • fail closed on generated typecheck regressions (#2287)
  • add wave:carryover-0.0.8 for 0.0.8 deferrals (#2312)

Breaking changes and migration

  • #2251: refresh TanStack AI family for 0.0.8
    Anthropic usage.promptTokens now includes uncached input, cache reads, and cache writes exactly once. totalTokens includes that input plus completion. Use promptTokens directly for total input; subtract promptTokensDetails.cachedTokens and cacheWriteTokens to obtain uncached input. Adding those detail fields to promptTokens again double-counts the cache. The migration note is in AI engine: provider adapters.

    When no explicit request/provider credential is supplied, upstream now checks ANTHROPIC_AUTH_TOKEN, then ANTHROPIC_OAUTH_TOKEN, then ANTHROPIC_API_KEY when a stream starts. Bearer credentials use Authorization; OAuth credentials also enable upstream Claude Code identity headers/system content. Pass an explicit request/provider credential for deterministic selection. Config JSDoc, the AI engine guide, and the AI reference document this behavior; the transport test proves explicit credentials retain precedence.

  • #2296: remove unsupported root producer and consumer helpers
    Removed unsupported root producer/consumer helpers, handle types, and error helpers. Replace producer imports with defineStreamSchema and createDurableStream (or createServiceStreamProducer) from @netscript/plugin-streams-core; replace publish(payload) with collection upsert/delete operations. Replace consumer subscribe(handler) with HTTP/SSE reads of the same stream path, resolving URLs through buildStreamUrl/getStreamsUrl from @netscript/plugin-streams-core; browser clients can bind named SSE events through @netscript/fresh/streams. README and docs/site/durable-workflows/streams.md document the collection model and shutdown/teardown.

  • #2316: fence subject sessions and queue upstream revocation
    The official WorkOS auth service requires atomic host KV and honors NETSCRIPT_AUTH_COOKIE_NAME. Direct plugin installs default to __Host-ns_session; the CLI WorkOS preset explicitly writes wos-session to match AuthKit's SDK default. Existing AuthKit issuers using wos-session must select that name, or change their issuer to the chosen cookie name. Standard NetScript KV adapters already support atomic compare-and-swap.

    Standalone callers enabling subject revocation must share one durable store with every sealed-session/bearer authenticator and run cleanup in a service-owned background worker. The package adds the store/page factories and revocation/retention contracts; unconfigured standalone subject revocation remains explicitly unsupported. Generic WorkOS SDK user compatibility remains intact. Custom revocation stores expose clockSkewMs, implement job-scoped confirmSessionRevoked, honor token-expiry retention checks, and replace terminal fail with retryable checkpointing.

    Set WORKOS_ACCESS_TOKEN_MAX_LIFETIME_MS to cover the longest configured WorkOS access-token duration (default one day). WORKOS_CLOCK_SKEW_MS defaults to one minute and controls both retention padding and the provider cutoff margin. Sessions inside that margin are conservatively revoked. All subject credentials are refused while cleanup is pending; successful recovery admits later sessions. Refresh identity changes use `workos_session_ide...

Read more

NetScript 0.0.8-canary.4

Pre-release

Choose a tag to compare

@rickylabs rickylabs released this 10 Oct 22:53

NetScript 0.0.8-canary.4

What this canary is for. canary.4 is release candidate 4 for NetScript 0.0.8. It bundles 38 pull requests since the previous canary point so downstream apps can try the published packages before 0.0.8 ships. It is a pre-release: normal semver resolution never selects it, and Latest stays v0.0.7. All 35 @netscript/* packages are published at exactly 0.0.8-canary.4. The canary publish and version-pinned production E2E both passed (publish, production E2E).

Highlights

agent-tooling

  • agent init resolves host from environment and adds an OpenCode host (#2181)
  • bridge Claude to canonical agent skills (#2247)

ai

  • preserve native chat parts in durable persistence (#2207)

aspire

  • emit only consumed preamble in Aspire register helpers (#2168)
  • align Garnet container and executable versions (#2227)
  • report and prove storage durability (#2215)
  • honor Aspire CLI override and regenerate helper (#2248)

auth

  • scaffold BFF browser authentication topology (#2221)
  • remove callback session credential from public JSON (#2222)

cli

  • add outbound webhook recipe and delivery template (#2214)
  • document route rename and generated surface (#2232)
  • scaffold layered single-entity services (#2223)
  • make generated carriers mergeable (#2234)
  • make init --no-aspire projects operable by the CLI (#2170)

database

  • normalize Postgres connection strings (#2200)

deps

  • prevent production lock drift (#2256)
  • refresh RPC and query stack (#2252)
  • refresh data and tooling dependency wave (#2254)

docs

  • export stable public type references (#2218)
  • type-check published JSDoc examples (#2226)

fresh

  • fence durable chat appends with an idempotent producer (#2138)

mcp

  • preserve get_doc content with extraction and full pagination (#2219)

plugins

  • enforce KV runtime retention (#2225)
  • prove leased restart and ordering safety (#2213)
  • restore StreamDB typed collections example (#2240)

queue

  • retain DLQ rows until requeue succeeds (#2206)

sdk

  • add injected fetch stream source (#2212)
  • type service query options for Preact useQuery (#2242)
  • bind Expo live queries to injected streams (#2244)
  • make Expo fixture deterministic (#2258)

service

  • add client address rate limiting (#2224)

streams

  • add retention policies and administrative port (#2208)

telemetry

  • expose span in traced queue listen callbacks (#2241)

tooling

  • add deterministic canary release introductions (#2238)
  • produce fresh lint and format receipts despite task caching (#2246)
  • add route management guidance (#2243)
  • remove nested lock residue from canary dry-run (#2261)

workers

  • add bounded stdin payload channel (#2201)

Breaking changes and migration

  • #2221: scaffold BFF browser authentication topology

    • Generated services: installing the auth plugin replaces the generated demo public opt-out in service entrypoints with contract-based guarding (a remote authenticator plus createContractAuthorizer(router)). Demo procedures stay public because their contracts declare access: { authentication: 'none' }, and /api/openapi.json and /api/docs remain public discovery endpoints.
    • Making a demo procedure private: mark it authentication: 'required' and supply its authorization policy.
    • Custom code: custom app layouts, authored service policies and older entrypoints the scaffold does not manage are left untouched and must compose the adapter explicitly. A missing or drifted scaffold opt-out fails loudly instead of being rewritten, and custom service entrypoints are overwritten only with the explicit overwrite flag.
    • Removing auth: plugins remove auth does not yet remove auth/bff.ts, auth/service.ts, the Fresh routes/auth/[action].ts route or the service authn/authz wiring. Remove them and restore the service policy explicitly before running the workspace without auth.
  • #2222: remove callback session credential from public JSON

    • What changed: the OAuth callback JSON output no longer includes sessionId. It returns { completed, redirectTo, subject }. The callback input accepts optional txn.
    • Browser migration: use the generated same-origin /auth/signin, /auth/callback, and /auth/session routes. The BFF copies backend Set-Cookie onto the app response; browser callers use that first-party cookie. The BFF resolves the credential per request and forwards a bearer to services through the SDK contribution. Do not read callback.sessionId or send credentialed browser-cookie requests directly to services.
    • Service-level cookie callers: replace reads of callback.sessionId with a cookie jar and an empty-input session request. The generated BFF's browser session endpoint returns identity metadata without exposing a credential.
    • Server-only integrations that compose a backend directly may use InteractiveFlowPort.handleCallback and its session result. Do not expose that credential in browser callback JSON.
    • Main's caller-owned signout and separate privileged revoke-session operation remain intact.
    • The callback migration note ships in identity-access “Add authentication”, section “0.0.8 cookie migration”; main's generated-app signin guidance is retained.
  • #2244: bind Expo live queries to injected streams
    StreamFetchV1 now returns StreamFetchResponseV1, the consumed ok, status, headers, and streaming body capabilities, instead of a full Deno Response. Existing injected fetches returning full responses remain assignable. Callers invoking additional response methods through the StreamFetchV1 return type must retain their concrete host-fetch return type for those calls. For Expo, forward GET, headers, and signal through the documented wrapper rather than the broader RequestInit.body; return the real Expo response without an assertion or buffering. Migration documentation: Fetch type boundary.

  • #2254: refresh data and tooling dependency wave
    The shipped RabbitMQ adapter moves from its direct amqplib 0.10.x import to the qualified 2.2.0 catalog. An explicit heartbeat=0 now disables heartbeats instead of accepting the broker's value. Remove that parameter from AMQP_URL or connection.rabbitmq.url to preserve broker negotiation; keep it only to request no heartbeats. Generated URLs already omit it.

    The migration note lives in choose-a-queue-provider, “RabbitMQ heartbeat migration in 0.0.8”. Default generated connection URLs retain their behavior. Live RabbitMQ handshake qualification remains reserved release work.

Known open follow-ups

  • #1364 docs(orchestration-runtime): outbound webhook delivery has no recipe or template — triggers ship inbound ingress only, so every product hand-rolls signing, retry and dead-lettering
  • #1367 fix(streams): STREAMS_DATA_DIR is set by nothing the framework generates, so "durable streams" is always in-memory
  • #1382 fix(scaffold): the generated service ships /api unprotected and a framework test codifies public API routes as correct
  • #1385 fix(auth): oRPC signin/callback discard the backend Set-Cookie, so the interactive browser flow ...
Read more

NetScript 0.0.8-canary.3

Pre-release

Choose a tag to compare

@github-actions github-actions released this 10 Oct 14:39

NetScript 0.0.8-canary.3

What this canary is for. canary.3 is the third release candidate on the way to NetScript 0.0.8. It bundles the 61 pull requests merged since canary.2 so downstream apps can try them against real published packages before 0.0.8 ships. It is a pre-release: normal semver resolution never selects it, and Latest stays v0.0.7. All 35 @netscript/* packages are published at exactly 0.0.8-canary.3, and the canary's publish run and its version-pinned production E2E both passed (publish, production E2E).

Highlights

  • Durable commands, end to end. A PostgreSQL command store with a true transaction client (#2093), a durable outbox relayed through checked sinks (#2096), bounded command tracing with privacy conformance (#2094), and sagas that commit typed worker effects atomically with their state transitions (#2097). Sagas also persist .compensate() outcomes with a terminal compensated status (#2139).
  • Secure-by-default services and auth. Services must declare their auth policy (#2220) and their CORS origins (#2193). Signout is owner-scoped (#2177), auth cookies are stricter and propagate on REST and RPC (#2189), trusted-proxy policy is unified (#2188), and services gain internal-audience procedures and a file-reference service credential (#2166).
  • Plugins compose safely. Root composition rejects identity collisions, unknown contribution keys and missing dependencies (#2125); plugin host ports survive re-installs (#2175).
  • Fresh, SDK and desktop fixes reported by downstream apps. One TanStack DB Collection runtime across Fresh and the SDK (#2089), pure typed route href helpers that no longer hide hooks (#2090), desktop RPC reconnects after a document reload (#2091), complete native chat messages (#2092), an injectable resolveServiceUrl (#2183), and query factories that keep required context (#2209).
  • AI. Explicitly configured Anthropic model IDs, including Claude Opus 5.5, Sonnet 5.5 and Fable 5.1, with current wire options (#2078), on a peer-compatible TanStack AI family (#2087, #2126).
  • Workers, queue and KV. Job cancellation and deadlines (#2088, documented in #2204), trace context forwarded into queue subprocesses (#2136), named queues isolated within one Deno KV database (#2140), and memory/Redis KV adapters conformant on atomic versionstamps (#2135).
  • CLI and Aspire. Generated resources resolve multi-namespace clients (#2171), remote Docker daemon topology is diagnosed (#2173), the Garnet executable gets an allocated port (#2199), and the MCP server ranks guidance by content (#2124) and warns on unknown plugin registry expectations (#2216).

Breaking changes and migration

  • Explicit CORS (#2193). Services no longer default to wildcard CORS. Set NETSCRIPT_CORS_ORIGINS='https://app.example,https://admin.example' for services and plugins, or pass cors: { origin: [...] } to defineService / createPluginService (.withCors({ origin: [...] }) on builders). Unset origins deny cross-origin browser calls, and wildcard plus credentials fails build(). Generated CLI/Aspire helpers inject your enabled web apps' origins, so scaffolded projects keep working.
  • Explicit service auth policy (#2220). defineService() no longer treats a missing policy as public. Pass auth: { authn: { authenticator }, authz: { authorizer } } (authorization is optional). For a genuinely public service, pass auth: { public: true, reason: '…' } with a non-blank reason. The service README and CHANGELOG show the before and after.
  • Owner-scoped signout (#2177). Anonymous signout returns 401, sessionId must be one of the caller's own sessions, and everywhere revokes all of the caller's sessions. Revoking another user's session needs revokeSession with auth:sessions:revoke. Custom AuthSessionStorePort, KvOAuthStore and BetterAuthInstance implementations each gain one method; see the auth docs callout "Breaking in 0.0.8: migrating signout callers". plugin auth session list now needs a credential.
  • Validated plugin composition (#2125). Unknown contribution keys fail, every declared plugin dependency must be composed, and @netscript/plugin-triggers no longer declares pseudo-dependencies on the *-core libraries. Migration notes are in the plugin README and reference page.
  • Stricter auth cookies (#2189). HttpOnly=false and insecure custom-name cookies are refused outside an explicit development policy, and KvOAuthCookieOptions.httpOnly is typed true.

Known open follow-ups

  • Scaffolded auth wiring. service add does not yet wire the authenticator automatically when the auth plugin is installed (#1382, in review), and the scaffolded browser-to-backend auth topology is queued for canary.4 (#1386).
  • Callback session credential. Its removal from the public callback JSON is queued for canary.4 (#1385).
  • Downstream-reported fixes. Qualification against these published packages is in progress, and the issues close as each one is proven: #2039, #2040, #2041, #2068, #2066, #2036.
  • Saga process-restart and ordering proof. Queued for canary.4 (#1826).

Trying this canary

Pin exact versions, for example jsr:@netscript/service@0.0.8-canary.3. Deno 2.9 applies a default 24-hour minimum dependency age, so a canary less than a day old will not resolve until that window passes. For testing before then, set minimumDependencyAge: 0 in the consumer's configuration; that changes only admission timing, not versions. The generated list below includes partial-scope PRs as "closes no linked issues": they reference their issues without closing them, and the remaining scope stays tracked there.


Canary payload derived from merge-aware history after 6d1eaf5a221ce29fa55c0bfd10e3b5c7d66101e3 (61 commit(s) inspected; outcome: populated).

Included pull requests

  • #2092 fix(fresh): preserve complete native chat messages in send — closes no linked issues
  • #2078 fix(ai): support explicit Anthropic model IDs and current wire options — closes no linked issues
  • #2091 fix(desktop): reconnect native RPC after document reload — closes no linked issues
  • #2088 fix(workers): propagate job cancellation and deadlines — closes no linked issues
  • #2090 fix(fresh): keep typed route URL helpers pure — closes no linked issues
  • #2093 feat(database): PostgreSQL command store and true transaction client — closes #1484
  • #2089 fix(fresh/sdk): qualify one TanStack DB Collection runtime — closes no linked issues
  • #2087 fix(ai): keep published adapters peer-compatible with AI core — closes no linked issues
  • #2096 feat(command): relay durable outbox through checked sinks — closes #1486
  • #2094 feat(telemetry): add bounded command tracing and privacy conformance — closes #1485
  • #2097 feat(sagas): commit typed worker effects atomically with transitions — closes #1932
  • #2126 fix(ai): realign TanStack AI family to a peer-compatible set — closes no linked issues
  • #2122 fix(logger): request-scoped correlation and configurable RPC debug redaction — closes #1786, #2107
  • #2116 feat(service): add a middleware slot and an opt-in request-body limit to defineService — closes #2065
  • #2121 test(cli-e2e): assert exact HTTP status in scaffold runtime gates — closes no linked issues
  • #2119 fix(auth): accept empty OpenAPI GET input for auth me — closes #1999
  • #2131 docs(sdk): align cache-first loaders on action-then-metadata and document warm-stale persistence failure — closes #1670
  • #2123 fix(sdk): let native oRPC safe/isDefinedError narrow on createServiceClient errors — closes #2031
  • #2169 fix(docs): derive the @app/router.ts README fence stub from the scaffold template — closes #1939
  • #2135 fix(kv): conform memory and Redis adapters on atomic versionstamps, combine ops and watch — closes #2099, #2101
  • #2137 fix(service): declared fail-closed raw-route seam for createContractAuthorizer — closes #2105
  • #2136 fix(workers): forw...
Read more

NetScript 0.0.8-canary.2

Pre-release

Choose a tag to compare

@github-actions github-actions released this 08 Oct 10:33

NetScript 0.0.8-canary.2

Canary payload derived from merge-aware history after f3324909e0896cedc9729005bac5f508e122d6c6 (30 commit(s) inspected; outcome: populated).

Included pull requests

  • #2045 fix(fresh): require dehydratedAt when hydrating dehydrated queries — closes #2044
  • #2043 Fix Codex delegation and coordinator routes — closes #2042
  • #2049 Catalog Claude Opus 5.5 for owner overrides — closes #2048
  • #2047 fix(agentic): refresh native model IDs from the harness catalog — closes #2046
  • #2017 fix(service): derive the service info banner from the registered routes — closes #2016
  • #2050 chore(agentic): inspect the pinned Harness matrix — closes no linked issues
  • #2014 fix(auth-kv-oauth): verify revocation persistence before acknowledging — closes #2006
  • #2051 chore(agentic): read runtime routes from pinned Harness matrix — closes no linked issues
  • #2053 chore(agentic): remove duplicate local delegation matrix — closes no linked issues
  • #2054 chore(agentic): consume pinned Harness model catalog — closes no linked issues
  • #2055 chore(release): own the GitHub transport instead of importing agentic-lib — closes no linked issues
  • #2056 chore(ci): run the review-thread gate from validation, not agentic — closes no linked issues
  • #2057 docs(skills): describe Aspire cleanup without NetScript-only tasks — closes no linked issues
  • #2058 chore(agentic): run the matrix viewer from the pinned Harness commit — closes no linked issues
  • #2059 chore(maint): move teardown and leak-check out of the agentic namespace — closes no linked issues
  • #2060 chore(maint): move the Claude surface and skills-bundle tools out of agentic — closes no linked issues
  • #2061 chore(agentic): run pr-checks from the pinned Harness board package — closes no linked issues
  • #2062 chore(maint): move gh-token out of the agentic namespace — closes no linked issues
  • #2070 chore(agentic): adopt Sol 6.1 and Sonnet 5.5 routing — closes no linked issues
  • #2071 chore(ai): adopt Sonnet 5.5 API and scaffold defaults — closes no linked issues
  • #2072 fix(agentic): consume configured evaluator IDs and preflight OpenCode — closes no linked issues
  • #2073 fix(agentic): fail empty OpenCode answers with a named error — closes no linked issues
  • #2081 fix(streams): bound durable log recovery and tail reads — closes #2080, #636
  • #2035 fix(workers): type generated payload schemas — closes #2034, #2069
  • #2075 feat(service): bind the listener to an explicit hostname — closes #2074
  • #2086 fix(release): collect complete notes and observe canary outcomes truthfully — closes #1985, #2004
  • #2082 feat(contracts): command contracts, literal errors and canonical codecs — closes #1482
  • #2084 feat(service): command executor and semantic fault conformance — closes #1483
  • #2083 fix(fresh): recover stream databases with bounded checkpoint resume — closes #2079
  • #2085 fix(auth): keep provider credentials out of tracked configuration — closes #2020, #2022