Skip to content

Releases: MystenLabs/ts-sdks-incubation

@mysten-incubation/devstack@0.1.1

01 Jun 20:18
fc46a26

Choose a tag to compare

Patch Changes

  • 7cfef58: Docs: the README's create command uses the @latest tag
    (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

01 Jun 17:45
a8633a9

Choose a tag to compare

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_blob transaction filter, no indexer); Seal drops the policy
      pane and probes the correct /health endpoint.
    • 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 fund control-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.
  • 8322e9a: Fork mode: impersonation-based faucet + setup/usability fixes.

    • Fork faucetsui({ 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 surfacingformatUnknownError now unwraps an error's .message (tagged plain
      objects included, not just Errors) and chains its .cause (whether that cause is an Error
      or a tagged object), and the publish / action / wallet / sui-execute transaction paths route
      through it. Fixes account.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-fork source build now narrates progress on the
      supervisor row instead of appearing hung; image: { pull } or DEVSTACK_SUI_FORK_IMAGE skip
      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 use listCoins in fork mode, since getBalance/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-fork binary has no simulate_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
      readyTimeout option.

    Follow-up: publish a prebuilt sui-fork image in CI (e.g. ghcr.io/mysten/sui-fork:<rev>) so the
    default path pulls in seconds instead of compiling from source.

  • b6af6d2: Devstack: thorough-review remediation pass plus follow-up cleanup round.

    Highlights:

    • runStack({ layers }) replaced by runStack({ extendContext }). Custom context extension now
      goes through a typed seam.
    • executeSuiTx returns 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 $kind instead.
    • New substrate helper signAndDispatch compacts the
      withTransactionSigner → build → sign → execute → $kind dispatch pattern 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.ts lives in orchestrators/, not runtime/run.ts lifted into
      orchestrators/ similarly. Layer composition now lives at L3 only.
    • New L0 helper routed-url.ts for renderUrl/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. New BuildOptions.labels on the container-runtime contract.
    • Sweep evicts own endpoints and surfaces remaining ForeignNetworkHolder rather 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.
    • atomicWriteFile cleanup is now whole-pipeline (open/write/fsync/rename) via Effect.onError,
      not rename-only.
    • cross-process-lock typed errors: StackLockTimeoutError | StackLockIoError in the E channel;
      no more Effect.orDie.
    • Plugin-domain span/log keys namespaced via per-plugin spans.ts files.
    • ChainOperation typed seam removed (zero plugin adoption signal); ClientWithCoreApi is 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 + the DEEPBOOK_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: makeWalFaucetContribution removed;
      makeWalFaucetStrategy unaffected.
    • orchestrators/router/index.ts: unused STATIC_PROVIDER_FILENAME export removed.
    • plugins/sui/fork-orchestration.ts: ForkGuardedSdk<Sdk> derived type alias removed;
      wrapWithForkGuard now returns Sdk directly (behavior identical).
    • Capability-sink registration race fixed: install + finalizer wrapped in Effect.uninterruptible
      so an interrupt between Ref.modify and addFinalizer cannot leak the sink past scope close.
    • Cross-process command channel short-read fix: readSync may short-return on NFS / cross-FS;
      offset advances by bytesRead rather than the requested length, with a clean bail on
      bytesRead <= 0.
    • Cross-process roster PID-recycle hazard fixed: heartbeat / release / setIntent now match
      holders via (pid, hostname, startTime) triple via a new isOwnEntry helper (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
      inside pauseAndCommit / saveImages.
    • CLI restructure: cli/main.ts (1338 LOC) split into per-verb wirings under
      cli/wirings/{up,apply,snapshot,wipe,prune}.ts plus shared build-verb-layers.ts /
      identity.ts / config-loader.ts helpers. main.ts is now argv → identity → deps → dispatch
      only (~290 LOC).
    • Cross-process command-channel ack / error records gain an optional payload: unknown field
      plumbed through awaitCompletion. snapshot.capture now carries the captured metadata (or
      failure summary / skipped reason) on the reply directly — the CLI no longer tail-fibers
      events.ndjson for 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, and PythPriceFeedId no longer re-export from
      @mysten-incubation/devstack. They remain reachable via the DeepbookLocalOptions.pyth field
      chain. The value helpers (`pythP...
Read more

@mysten-incubation/dev-wallet@0.3.0

01 Jun 17:45
a8633a9

Choose a tag to compare

Minor Changes

  • b6af6d2: Devstack: thorough-review remediation pass plus follow-up cleanup round.

    Highlights:

    • runStack({ layers }) replaced by runStack({ extendContext }). Custom context extension now
      goes through a typed seam.
    • executeSuiTx returns 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 $kind instead.
    • New substrate helper signAndDispatch compacts the
      withTransactionSigner → build → sign → execute → $kind dispatch pattern 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.ts lives in orchestrators/, not runtime/run.ts lifted into
      orchestrators/ similarly. Layer composition now lives at L3 only.
    • New L0 helper routed-url.ts for renderUrl/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. New BuildOptions.labels on the container-runtime contract.
    • Sweep evicts own endpoints and surfaces remaining ForeignNetworkHolder rather 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.
    • atomicWriteFile cleanup is now whole-pipeline (open/write/fsync/rename) via Effect.onError,
      not rename-only.
    • cross-process-lock typed errors: StackLockTimeoutError | StackLockIoError in the E channel;
      no more Effect.orDie.
    • Plugin-domain span/log keys namespaced via per-plugin spans.ts files.
    • ChainOperation typed seam removed (zero plugin adoption signal); ClientWithCoreApi is 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 + the DEEPBOOK_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: makeWalFaucetContribution removed;
      makeWalFaucetStrategy unaffected.
    • orchestrators/router/index.ts: unused STATIC_PROVIDER_FILENAME export removed.
    • plugins/sui/fork-orchestration.ts: ForkGuardedSdk<Sdk> derived type alias removed;
      wrapWithForkGuard now returns Sdk directly (behavior identical).
    • Capability-sink registration race fixed: install + finalizer wrapped in Effect.uninterruptible
      so an interrupt between Ref.modify and addFinalizer cannot leak the sink past scope close.
    • Cross-process command channel short-read fix: readSync may short-return on NFS / cross-FS;
      offset advances by bytesRead rather than the requested length, with a clean bail on
      bytesRead <= 0.
    • Cross-process roster PID-recycle hazard fixed: heartbeat / release / setIntent now match
      holders via (pid, hostname, startTime) triple via a new isOwnEntry helper (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
      inside pauseAndCommit / saveImages.
    • CLI restructure: cli/main.ts (1338 LOC) split into per-verb wirings under
      cli/wirings/{up,apply,snapshot,wipe,prune}.ts plus shared build-verb-layers.ts /
      identity.ts / config-loader.ts helpers. main.ts is now argv → identity → deps → dispatch
      only (~290 LOC).
    • Cross-process command-channel ack / error records gain an optional payload: unknown field
      plumbed through awaitCompletion. snapshot.capture now carries the captured metadata (or
      failure summary / skipped reason) on the reply directly — the CLI no longer tail-fibers
      events.ndjson for 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, and PythPriceFeedId no longer re-export from
      @mysten-incubation/devstack. They remain reachable via the DeepbookLocalOptions.pyth field
      chain. The value helpers (pythPriceFeedId, DEEP_PRICE_FEED_ID, SUI_PRICE_FEED_ID,
      USDC_PRICE_FEED_ID) are kept because examples/deepbook-trader/devstack.config.ts is 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 previous pg-${app+stack} format will fail to authenticate on first pg_isready
      probe. Either delete the existing container (docker rm -f) and let devstack recreate it, OR
      set password explicitly on PostgresServiceOptions for 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 --help exit code. --json mode now also emits a structured envelope
      for these failures instead of plain stderr.
    • DevstackOptions.stateDir is now honored. The field was declared on the type but silently
      ignored by runStack (only runtimeRoot was read). Programs that set
      defineDevstack({ stateDir }) previously had no effect; they now do.
    • CLI now honors config.options.stateDir / defineDevstack({ stateDir }). The devstack
      CLI loads the config best-effort before resolving identity and feeds its stateDir into the
      runtime-root ladder. Precedence: --state-dir flag > config.options.stateDir >
      $DEVSTACK_STATE_DIR > <cwd>/.devstack. The --state-dir flag still wins, and no-config
      verbs (prune, wipe) keep resolving without a config.
    • setNetworkEnv now save/restores process.env.DEVSTACK_NETWORK. In-process CLI invocations
      (tests, embedded use) no longer leak --network env state into subsequent calls. Single-process
      CLI semantics are unchanged.
    • stringifyCause renamed to formatUnknownError. 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_ALIAS removed; WALLET_ENDPOINT_KEY is
      the single canonical name. All exports surface through the same module paths.
    • EndpointEntry.wireProtocol, Endpoint.wireProtocol, ResolvedEndpoint.wireProtocol
      narrowed from 'http' | 'h2c' | string to '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.EXECUTE removed (devstack-side /execute endpoint 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

01 Jun 20:18
fc46a26

Choose a tag to compare

Patch Changes

  • 7cfef58: Scaffolded apps now pin the matching-latest SDK versions automatically. The scaffolder
    injects its own (publish-time-resolved) @mysten-incubation/devstack and
    @mysten-incubation/dev-wallet versions into the generated package.json at scaffold time —
    mirroring create-dapp — instead of relying on the build-time template snapshot, which could
    drift from the published release. The scaffolder lists these as workspace:^ devDependencies, so
    pnpm's publish-time workspace-protocol rewrite keeps them in lockstep with the release, and
    pnpm create @mysten-incubation/devstack-app@latest always resolves the newest scaffolder. The
    committed template carries the synced versions as a fallback for dev checkouts.

@mysten-incubation/tsconfig@0.0.1

23 May 04:07
bd11ecf

Choose a tag to compare

Patch Changes

  • 133fb14: Switch to trusted publishing.

@mysten-incubation/create-devstack-app@0.1.2

23 May 04:22
a929635

Choose a tag to compare

Patch Changes

  • Restore the generated app .gitignore from the packed template so scaffolded projects do not
    commit node_modules or devstack runtime output.

@mysten-incubation/dev-wallet@0.0.1

20 Mar 18:52

Choose a tag to compare

Patch Changes

  • Test publish via CI