Releases: MystenLabs/ts-sdks-incubation
Releases · MystenLabs/ts-sdks-incubation
@mysten-incubation/devstack@0.1.1
Patch Changes
- 7cfef58: Docs: the README's create command uses the
@latesttag
(pnpm create @mysten-incubation/devstack-app@latest my-app) so new apps scaffold from the newest
tooling. No runtime change.
@mysten-incubation/devstack@0.1.0
Minor Changes
-
dcf5905: Dashboard: explorer routing, plugin real-data, controls UX, and real faucet funding.
- Explorer — addresses, objects, and packages share one address space, so search now resolves
an id first (package → object → address probe) and routes to the concrete kind instead of a
generic entity route; objects can act as addresses (owned-objects/balances + package detection),
and links from the transactions table route to concrete kinds. URL encoding no longer
over-encodes path-safe characters. - Walrus / Seal panels — Walrus shows real epoch, shard assignments, and recent blobs via Sui
GraphQL (register_blob/certify_blobtransaction filter, no indexer); Seal drops the policy
pane and probes the correct/healthendpoint. - Controls — all restarts are behind a confirmation, restart is removed from the header,
advance-clock is hidden unless on a fork, shutdown is no longer styled destructive, and the
checkpoint figure is relabeled "Oldest checkpoint". - Account/address history — Sent/Received transaction history via the typed
SuiGraphQLClient
from@mysten/sui(replacing hand-rolled fetch). - Snapshot/restore progress — honest in-flight indicator (the engine emits no progress
projection field) rather than fake instant success. - Faucet funding — a
fundcontrol-plane mutation funds SUI/WAL/DEEP by reusing devstack's
registered in-process funding strategies (the same ones the boot-time account-funding pass
invokes), with a real processed/failed result; SUI is fixed-amount, WAL/DEEP take an editable
amount and fund a resolved account.
- Explorer — addresses, objects, and packages share one address space, so search now resolves
-
8322e9a: Fork mode: impersonation-based faucet + setup/usability fixes.
- Fork faucet —
sui({ mode: 'fork', faucet: { whale, perRequestCapMist?, enabled? } })funds
test accounts by impersonating a large-reserve "whale" address on the forked upstream and
transferring SUI from it. Wired through the existing faucet-strategy pathway, so
ephemeral-account auto-funding and cross-cutting SUI funding work in fork mode exactly like
localnet. The whale is auto-seeded into fork state and validated at boot to hold a SUI coin
covering a default fund plus gas (an actionable error fires if none qualifies). Coin selection
paginates the whale's coins and uses the first that covers the request + gas budget, so a
sufficient coin sitting behind dust on a later page is still found. - Error surfacing —
formatUnknownErrornow unwraps an error's.message(tagged plain
objects included, not justErrors) and chains its.cause(whether that cause is anError
or a tagged object), and the publish / action / wallet / sui-execute transaction paths route
through it. Fixesaccount.signAndExecute failed … [object Object], which had swallowed the
real cause (e.g. "no SUI gas coins found for 0x…"). - Image build UX — the first-run
sui-forksource build now narrates progress on the
supervisor row instead of appearing hung;image: { pull }orDEVSTACK_SUI_FORK_IMAGEskip
the build with a prebuilt image, falling back to a source build on miss. - Fork-mode real accounts — faucet-funded real (ephemeral) accounts can now publish, run
actions, mint coins, AND move value in fork mode, not just impersonate accounts. Pieces: (1)
funding-settlement balance reads uselistCoinsin fork mode, sincegetBalance/listBalances
panic under the fork guard; (2) the publish, action, and coin-mint transaction paths build
offline with explicit gas in fork mode (real signers too, not only impersonate), because the
sui-forkbinary has nosimulate_transaction; (3) the fork gas budget is lowered to 0.1 SUI
so a faucet-funded account's coin isn't fully reserved by gas — leaving headroom to
split/transfer value. End-to-end verified: a fork stack of ephemeral accounts auto-funds,
publishes a Move package, and runs a value-transfer action with no pre-funded addresses.
(Deepbook pool deploy + its DEEP-funding faucet remain local/known-only in fork — out of scope
here.) - Readiness — the fork ready-probe timeout message now points at the container logs and the
readyTimeoutoption.
Follow-up: publish a prebuilt
sui-forkimage in CI (e.g.ghcr.io/mysten/sui-fork:<rev>) so the
default path pulls in seconds instead of compiling from source. - Fork faucet —
-
b6af6d2: Devstack: thorough-review remediation pass plus follow-up cleanup round.
Highlights:
runStack({ layers })replaced byrunStack({ extendContext }). Custom context extension now
goes through a typed seam.executeSuiTxreturns a discriminated union ($kind: 'ExecutedSuccess' | 'ExecutedFailure').
On-chain failure is a value, not an error. Plugins that previously caught the failure-tag in the
error channel must dispatch on$kindinstead.- New substrate helper
signAndDispatchcompacts the
withTransactionSigner → build → sign → execute → $kind dispatchpattern across five publisher
plugins. - Supervisor module (1.8k LOC) split into 11 per-concern modules under
substrate/runtime/supervisor/. No behavior change. - New
built-in-plugin-layers.tslives inorchestrators/, notruntime/—run.tslifted into
orchestrators/similarly. Layer composition now lives at L3 only. - New L0 helper
routed-url.tsforrenderUrl/routedHostname; L3 router/hostname.ts retained
as an intra-L3 adapter. - Docker image builds now stamp ownership labels (
expectedImageOwnershipLabels); prune can reach
previously-unlabelled images. NewBuildOptions.labelson the container-runtime contract. - Sweep evicts own endpoints and surfaces remaining
ForeignNetworkHolderrather than failing
silently. - Per-app shared-stack pinning:
_per-app_stacks (e.g. shared chain-build cache) are pinned
while any app sibling is live. atomicWriteFilecleanup is now whole-pipeline (open/write/fsync/rename) viaEffect.onError,
not rename-only.cross-process-locktyped errors:StackLockTimeoutError | StackLockIoErrorin the E channel;
no moreEffect.orDie.- Plugin-domain span/log keys namespaced via per-plugin
spans.tsfiles. ChainOperationtyped seam removed (zero plugin adoption signal);ClientWithCoreApiis the
sanctioned SDK cast at plugin boundaries.- ARCHITECTURE.md / STYLE_GUIDE.md rewritten to describe current state (537→308, 894→477 lines).
- New style-enforcement tests:
l4-boundary,no-unknown-as(globs every plugin barrel),
plugin-boundary,span-attr-namespace,substrate/name-blindness.
Dead-code purge and substrate race fixes:
- Orphan modules removed (no consumers):
orchestrators/codegen/extras.ts(inlined into
runtime-composition.ts);plugins/deepbook/routable.ts+ theDEEPBOOK_ENTRYPOINTS
aggregation;plugins/sui/live-faucet-strategy.ts(suiLiveStrategy,LIVE_FAUCET_URLS,
SuiLiveNetwork,SuiLiveStrategyOptions);plugins/sui/seed-objects.ts
(SeedObjectsAccumulator,makeSeedObjectsAccumulator,SEED_OBJECTS_CAPABILITY_KEY). The sui
plugin's emitted-capability count drops from 5 to 4. plugins/walrus/faucet-strategy.ts:makeWalFaucetContributionremoved;
makeWalFaucetStrategyunaffected.orchestrators/router/index.ts: unusedSTATIC_PROVIDER_FILENAMEexport removed.plugins/sui/fork-orchestration.ts:ForkGuardedSdk<Sdk>derived type alias removed;
wrapWithForkGuardnow returnsSdkdirectly (behavior identical).- Capability-sink registration race fixed: install + finalizer wrapped in
Effect.uninterruptible
so an interrupt betweenRef.modifyandaddFinalizercannot leak the sink past scope close. - Cross-process command channel short-read fix:
readSyncmay short-return on NFS / cross-FS;
offset advances bybytesReadrather than the requested length, with a clean bail on
bytesRead <= 0. - Cross-process roster PID-recycle hazard fixed:
heartbeat/release/setIntentnow match
holders via(pid, hostname, startTime)triple via a newisOwnEntryhelper (was matching
(pid, hostname)only). - Background snapshot interrupt now awaits via
Fiber.interrupt(fiber)(was fire-and-forget
fiber.interruptUnsafe()) so a follow-up capture can't start while the previous fiber is still
insidepauseAndCommit/saveImages. - CLI restructure:
cli/main.ts(1338 LOC) split into per-verb wirings under
cli/wirings/{up,apply,snapshot,wipe,prune}.tsplus sharedbuild-verb-layers.ts/
identity.ts/config-loader.tshelpers.main.tsis now argv → identity → deps → dispatch
only (~290 LOC). - Cross-process command-channel
ack/errorrecords gain an optionalpayload: unknownfield
plumbed throughawaitCompletion.snapshot.capturenow carries the captured metadata (or
failure summary / skipped reason) on the reply directly — the CLI no longer tail-fibers
events.ndjsonfor the completion event. - Repo-wide Prettier reformat.
User-visible behavior changes (minor-bump rationale):
- Pyth types removed from the root barrel.
PythFeed,PythHandle,PythOptions,
PythPackageMember, andPythPriceFeedIdno longer re-export from
@mysten-incubation/devstack. They remain reachable via theDeepbookLocalOptions.pythfield
chain. The value helpers (`pythP...
@mysten-incubation/dev-wallet@0.3.0
Minor Changes
-
b6af6d2: Devstack: thorough-review remediation pass plus follow-up cleanup round.
Highlights:
runStack({ layers })replaced byrunStack({ extendContext }). Custom context extension now
goes through a typed seam.executeSuiTxreturns a discriminated union ($kind: 'ExecutedSuccess' | 'ExecutedFailure').
On-chain failure is a value, not an error. Plugins that previously caught the failure-tag in the
error channel must dispatch on$kindinstead.- New substrate helper
signAndDispatchcompacts the
withTransactionSigner → build → sign → execute → $kind dispatchpattern across five publisher
plugins. - Supervisor module (1.8k LOC) split into 11 per-concern modules under
substrate/runtime/supervisor/. No behavior change. - New
built-in-plugin-layers.tslives inorchestrators/, notruntime/—run.tslifted into
orchestrators/similarly. Layer composition now lives at L3 only. - New L0 helper
routed-url.tsforrenderUrl/routedHostname; L3 router/hostname.ts retained
as an intra-L3 adapter. - Docker image builds now stamp ownership labels (
expectedImageOwnershipLabels); prune can reach
previously-unlabelled images. NewBuildOptions.labelson the container-runtime contract. - Sweep evicts own endpoints and surfaces remaining
ForeignNetworkHolderrather than failing
silently. - Per-app shared-stack pinning:
_per-app_stacks (e.g. shared chain-build cache) are pinned
while any app sibling is live. atomicWriteFilecleanup is now whole-pipeline (open/write/fsync/rename) viaEffect.onError,
not rename-only.cross-process-locktyped errors:StackLockTimeoutError | StackLockIoErrorin the E channel;
no moreEffect.orDie.- Plugin-domain span/log keys namespaced via per-plugin
spans.tsfiles. ChainOperationtyped seam removed (zero plugin adoption signal);ClientWithCoreApiis the
sanctioned SDK cast at plugin boundaries.- ARCHITECTURE.md / STYLE_GUIDE.md rewritten to describe current state (537→308, 894→477 lines).
- New style-enforcement tests:
l4-boundary,no-unknown-as(globs every plugin barrel),
plugin-boundary,span-attr-namespace,substrate/name-blindness.
Dead-code purge and substrate race fixes:
- Orphan modules removed (no consumers):
orchestrators/codegen/extras.ts(inlined into
runtime-composition.ts);plugins/deepbook/routable.ts+ theDEEPBOOK_ENTRYPOINTS
aggregation;plugins/sui/live-faucet-strategy.ts(suiLiveStrategy,LIVE_FAUCET_URLS,
SuiLiveNetwork,SuiLiveStrategyOptions);plugins/sui/seed-objects.ts
(SeedObjectsAccumulator,makeSeedObjectsAccumulator,SEED_OBJECTS_CAPABILITY_KEY). The sui
plugin's emitted-capability count drops from 5 to 4. plugins/walrus/faucet-strategy.ts:makeWalFaucetContributionremoved;
makeWalFaucetStrategyunaffected.orchestrators/router/index.ts: unusedSTATIC_PROVIDER_FILENAMEexport removed.plugins/sui/fork-orchestration.ts:ForkGuardedSdk<Sdk>derived type alias removed;
wrapWithForkGuardnow returnsSdkdirectly (behavior identical).- Capability-sink registration race fixed: install + finalizer wrapped in
Effect.uninterruptible
so an interrupt betweenRef.modifyandaddFinalizercannot leak the sink past scope close. - Cross-process command channel short-read fix:
readSyncmay short-return on NFS / cross-FS;
offset advances bybytesReadrather than the requested length, with a clean bail on
bytesRead <= 0. - Cross-process roster PID-recycle hazard fixed:
heartbeat/release/setIntentnow match
holders via(pid, hostname, startTime)triple via a newisOwnEntryhelper (was matching
(pid, hostname)only). - Background snapshot interrupt now awaits via
Fiber.interrupt(fiber)(was fire-and-forget
fiber.interruptUnsafe()) so a follow-up capture can't start while the previous fiber is still
insidepauseAndCommit/saveImages. - CLI restructure:
cli/main.ts(1338 LOC) split into per-verb wirings under
cli/wirings/{up,apply,snapshot,wipe,prune}.tsplus sharedbuild-verb-layers.ts/
identity.ts/config-loader.tshelpers.main.tsis now argv → identity → deps → dispatch
only (~290 LOC). - Cross-process command-channel
ack/errorrecords gain an optionalpayload: unknownfield
plumbed throughawaitCompletion.snapshot.capturenow carries the captured metadata (or
failure summary / skipped reason) on the reply directly — the CLI no longer tail-fibers
events.ndjsonfor the completion event. - Repo-wide Prettier reformat.
User-visible behavior changes (minor-bump rationale):
- Pyth types removed from the root barrel.
PythFeed,PythHandle,PythOptions,
PythPackageMember, andPythPriceFeedIdno longer re-export from
@mysten-incubation/devstack. They remain reachable via theDeepbookLocalOptions.pythfield
chain. The value helpers (pythPriceFeedId,DEEP_PRICE_FEED_ID,SUI_PRICE_FEED_ID,
USDC_PRICE_FEED_ID) are kept becauseexamples/deepbook-trader/devstack.config.tsis the
market-maker case the architecture permits. - Postgres password format changed.
derivePassword(app, stack, stackRoot)now incorporates
the stack's on-disk runtime root and an sha256 short hash. Existing dev databases created
against the previouspg-${app+stack}format will fail to authenticate on firstpg_isready
probe. Either delete the existing container (docker rm -f) and let devstack recreate it, OR
setpasswordexplicitly onPostgresServiceOptionsfor stable credentials across the upgrade.
Multi-checkout shells of the same(app, stack)now derive distinct passwords by design. - CLI argv-parse failures now exit with code 64 (
USAGE), not 1 (GENERIC). Tests / CI
scripts that pattern-match exit codes for "user error vs internal error" should treat 64 the
same way they treat the--helpexit code.--jsonmode now also emits a structured envelope
for these failures instead of plain stderr. DevstackOptions.stateDiris now honored. The field was declared on the type but silently
ignored byrunStack(onlyruntimeRootwas read). Programs that set
defineDevstack({ stateDir })previously had no effect; they now do.- CLI now honors
config.options.stateDir/defineDevstack({ stateDir }). Thedevstack
CLI loads the config best-effort before resolving identity and feeds itsstateDirinto the
runtime-root ladder. Precedence:--state-dirflag >config.options.stateDir>
$DEVSTACK_STATE_DIR><cwd>/.devstack. The--state-dirflag still wins, and no-config
verbs (prune,wipe) keep resolving without a config. setNetworkEnvnow save/restoresprocess.env.DEVSTACK_NETWORK. In-process CLI invocations
(tests, embedded use) no longer leak--networkenv state into subsequent calls. Single-process
CLI semantics are unchanged.stringifyCauserenamed toformatUnknownError. Plugins importing the substrate helper
directly need to update their import (canonical path:
substrate/runtime/format-unknown-error.ts). The function's behavior is unchanged.- Wallet endpoint constant unified.
WALLET_ENDPOINT_ALIASremoved;WALLET_ENDPOINT_KEYis
the single canonical name. All exports surface through the same module paths. EndpointEntry.wireProtocol,Endpoint.wireProtocol,ResolvedEndpoint.wireProtocol
narrowed from'http' | 'h2c' | stringto'http' | 'h2c' | 'tcp'. Persisted manifests and
projections now reject other values at decode time. Plugins emitting custom wire protocols (none
ship today) would need to extend the literal union.
dev-wallet:
DEVSTACK_WALLET_HTTP_PATH.EXECUTEremoved (devstack-side/executeendpoint deleted; the
dapp-kit / dev-wallet path bypasses it and the protocol shape didn't match the Sui Wallet
Standard).
@mysten-incubation/create-devstack-app@0.1.3
Patch Changes
- 7cfef58: Scaffolded apps now pin the matching-latest SDK versions automatically. The scaffolder
injects its own (publish-time-resolved)@mysten-incubation/devstackand
@mysten-incubation/dev-walletversions into the generatedpackage.jsonat scaffold time —
mirroringcreate-dapp— instead of relying on the build-time template snapshot, which could
drift from the published release. The scaffolder lists these asworkspace:^devDependencies, so
pnpm's publish-time workspace-protocol rewrite keeps them in lockstep with the release, and
pnpm create @mysten-incubation/devstack-app@latestalways resolves the newest scaffolder. The
committed template carries the synced versions as a fallback for dev checkouts.
@mysten-incubation/tsconfig@0.0.1
Patch Changes
- 133fb14: Switch to trusted publishing.
@mysten-incubation/create-devstack-app@0.1.2
Patch Changes
- Restore the generated app
.gitignorefrom the packed template so scaffolded projects do not
commitnode_modulesor devstack runtime output.
@mysten-incubation/dev-wallet@0.0.1
Patch Changes
- Test publish via CI