Repository navigation
NetScript 0.0.8-canary.4
Pre-releaseNetScript 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
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 declareaccess: { authentication: 'none' }, and/api/openapi.jsonand/api/docsremain 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 authdoes not yet removeauth/bff.ts,auth/service.ts, the Freshroutes/auth/[action].tsroute or the serviceauthn/authzwiring. Remove them and restore the service policy explicitly before running the workspace without auth.
- Generated services: installing the auth plugin replaces the generated demo public opt-out in service entrypoints with contract-based guarding (a remote authenticator plus
-
#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 optionaltxn. - Browser migration: use the generated same-origin
/auth/signin,/auth/callback, and/auth/sessionroutes. 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.handleCallbackand 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.
- What changed: the OAuth callback JSON output no longer includes
-
#2244: bind Expo live queries to injected streams
StreamFetchV1now returnsStreamFetchResponseV1, the consumedok,status,headers, and streamingbodycapabilities, instead of a full DenoResponse. Existing injected fetches returning full responses remain assignable. Callers invoking additional response methods through theStreamFetchV1return 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 broaderRequestInit.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 explicitheartbeat=0now disables heartbeats instead of accepting the broker's value. Remove that parameter fromAMQP_URLorconnection.rabbitmq.urlto 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
/apiunprotected and a framework test codifies public API routes as correct - #1385 fix(auth): oRPC
signin/callbackdiscard the backendSet-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