Skip to content

NetScript 0.0.8-canary.4

Pre-release
Pre-release

Choose a tag to compare

@rickylabs rickylabs released this 10 Oct 22:53
· 95 commits to main since this release

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 can never establish a session
  • #1386 fix(service): the default CORS policy is origin: '*', which makes credentialed browser calls impossible on every generated and plugin service
  • #1655 chore(workers): eliminate 20 private-type-ref diagnostics from the published export surface
  • #1667 test(queue): eliminate typed-queue DLQ timing flake
  • #1766 fix(packages): 20 published JSDoc examples do not type-check against their documented signature
  • #1826 test(sagas): no coverage proves publish survives unavailable API, restart, duplicate publish, or out-of-order delivery
  • #1849 chore(aspire): migrate NetScript to Garnet 2.x — arms are split across 1.1.1 and 1.1.10 while 2.1.5 is current
  • #2007 feat(cli): agent init misses its host, ships no OpenCode MCP config, and is never run by init — agents silently work without MCP
  • #2008 fix(cli): agent init mirrors the whole .agents/skills tree into .claude/skills and ships no CLAUDE.md — the repo's own pattern is a one-file bridge plus @AGENTS.md
  • #2009 docs/cli: renaming or moving a route is undocumented, unsupported by CLI verbs, and misdocumented as type-safe
  • #2068 fresh/ai: createNetScriptChatConnection.send narrows UIMessages to text, blocking adoption of the #1583 single-subscriber fix
  • #2098 feat(streams): stream retention seam (create-time TTL, delete/head admin port) in plugin-streams-core
  • #2100 sdk: supported React Native / Expo runtime: service client, fetch-based durable stream source, live-query binding
  • #2103 0.0.8 milestone run: orchestrated delivery of milestone 25
  • #2109 fix(plugins): retention for the KV runtime stores of sagas, workers and triggers
  • #2230 fix(plugins): preserve typed collections and live-query status in StreamDB factories
  • #2233 refactor(tooling): make generated carriers deterministic and line-mergeable
  • #2237 feat(release): canary rail composes the release intro, breaking changes and follow-ups
  • #2249 deps: bring critical dependencies current for canary.5 (TanStack, oRPC, streams, Prisma)
  • #2255 release: root deno.lock out of date for the production graph (blocks canary.4)
  • #2257 test(sdk): make the Expo stream-react fixture deterministic (act is not a function on PR merge refs)

Trying this canary

Pin exact versions, for example jsr:@netscript/service@0.0.8-canary.4. 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 a9123beeb1e35072a4f9ba5c9a801cfe7b01a659 (38 commit(s) inspected; outcome: populated).

Included pull requests

  • #2168 fix(cli): emit only consumed preamble in Aspire register helpers — closes #2021
  • #2208 feat(streams): add retention policies and administrative port — closes no linked issues
  • #2207 fix(fresh): preserve native chat parts in durable persistence — closes no linked issues
  • #2218 chore(workers): export stable public type references — closes no linked issues
  • #2214 feat(workers): add outbound webhook recipe and delivery template — closes no linked issues
  • #2219 feat(mcp): preserve get_doc content with extraction and full pagination — closes #2010
  • #2206 fix(queue): retain DLQ rows until requeue succeeds — closes no linked issues
  • #2227 chore(aspire): align Garnet container and executable versions — closes no linked issues
  • #2226 fix(docs): type-check published JSDoc examples — closes no linked issues
  • #2238 feat(release): add deterministic canary release introductions — closes no linked issues
  • #2232 docs(cli): document route rename and generated surface — closes no linked issues
  • #2200 feat(database): normalize Postgres connection strings — closes #2104
  • #2225 fix(plugins): enforce KV runtime retention — closes no linked issues
  • #2221 fix(cli): scaffold BFF browser authentication topology — closes no linked issues
  • #2213 test(sagas): prove leased restart and ordering safety — closes no linked issues
  • #2215 fix(streams): report and prove storage durability — closes no linked issues
  • #2222 fix(auth)!: remove callback session credential from public JSON — closes no linked issues
  • #2212 feat(sdk): add injected fetch stream source — closes no linked issues
  • #2241 fix(telemetry): expose span in traced queue listen callbacks — closes #2228
  • #2242 fix(sdk): type service query options for Preact useQuery — closes #2229
  • #2224 feat(service): add client address rate limiting — closes #2106
  • #2240 fix(plugins): restore StreamDB typed collections example — closes no linked issues
  • #2223 fix(cli): scaffold layered single-entity services — closes #1362
  • #2234 refactor(tooling): make generated carriers mergeable — closes no linked issues
  • #2244 feat(sdk): bind Expo live queries to injected streams — closes no linked issues
  • #2181 feat(cli): agent init resolves host from environment and adds an OpenCode host — closes no linked issues
  • #2246 fix(ci): produce fresh lint and format receipts despite task caching — closes no linked issues
  • #2243 feat(mcp): add route management guidance — closes no linked issues
  • #2201 feat(workers): add bounded stdin payload channel — closes #2110
  • #2170 fix(cli): make init --no-aspire projects operable by the CLI — closes #1996
  • #2247 fix(cli): bridge Claude to canonical agent skills — closes no linked issues
  • #2256 fix(deps): prevent production lock drift — closes no linked issues
  • #2258 test(sdk): make Expo fixture deterministic — closes no linked issues
  • #2248 fix(cli): honor Aspire CLI override and regenerate helper — closes #2029
  • #2138 feat(fresh): fence durable chat appends with an idempotent producer — closes #2067
  • #2252 chore(deps): refresh RPC and query stack — closes no linked issues
  • #2261 fix(release): remove nested lock residue from canary dry-run — closes #2260
  • #2254 chore(deps): refresh data and tooling dependency wave — closes no linked issues