@toon-protocol/townhouse 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -22,10 +22,10 @@
22
22
  # Story 45.4 boots only connector + townhouse-api at apex install
23
23
  #
24
24
  # Digest placeholders (substituted at build time from dist/image-manifest.json):
25
- # @sha256:f2cf4725895a3fe49593831481d4641465341533786150edf78d337868352994 → @sha256:<hex>
26
- # @sha256:cada4f94a28e6ddfa4c01b37b5aadc1a8fa374b5fd8e85478d4aa5be33a2d961 → @sha256:<hex>
27
- # @sha256:5269013677914ebc68d52c844add621c9a34e3219393280353227d074fa8787f → @sha256:<hex>
28
- # @sha256:4d8e2cf5412c8bbfd9321c416356ba7b3c52ab8405db0df9f1b8f9d266c17cff → @sha256:<hex>
25
+ # @sha256:706591f02ab9fc5a3f6fdcd9feada9d149c2f76ba9951f00bd5d780cbcd62ec6 → @sha256:<hex>
26
+ # @sha256:e791f677ec2cdb0bb5983f0b66c1de8fe4b7c050bc29e2483b9941949b82350b → @sha256:<hex>
27
+ # @sha256:91f203ddcda5d77f394b19c943db1e121ade0e31855702ea4e5d6cc372e444c1 → @sha256:<hex>
28
+ # @sha256:a8335306f4e787c87a9fd43147f71cce045d424d625491c229f226a38f909365 → @sha256:<hex>
29
29
  # @sha256:3343c19649290043e521c81b467b7c6410b8eaedd76d48804ea9b6fc810cddb0 → @sha256:<hex>
30
30
  #
31
31
  # Scope guard (Story 45.2 does NOT include):
@@ -152,7 +152,7 @@ services:
152
152
  # Port D21-008: Fastify host API on 127.0.0.1:28090.
153
153
  # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
154
154
  townhouse-api:
155
- image: ghcr.io/toon-protocol/townhouse-api@sha256:f2cf4725895a3fe49593831481d4641465341533786150edf78d337868352994
155
+ image: ghcr.io/toon-protocol/townhouse-api@sha256:706591f02ab9fc5a3f6fdcd9feada9d149c2f76ba9951f00bd5d780cbcd62ec6
156
156
  container_name: townhouse-hs-api
157
157
  # Run as the operator's host UID so bind-mounted ~/.townhouse files
158
158
  # (rw------- 600) are readable. TOWNHOUSE_UID is injected by `townhouse hs up`.
@@ -252,7 +252,7 @@ services:
252
252
  # start at first run).
253
253
  # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
254
254
  town:
255
- image: ghcr.io/toon-protocol/town@sha256:cada4f94a28e6ddfa4c01b37b5aadc1a8fa374b5fd8e85478d4aa5be33a2d961
255
+ image: ghcr.io/toon-protocol/town@sha256:e791f677ec2cdb0bb5983f0b66c1de8fe4b7c050bc29e2483b9941949b82350b
256
256
  container_name: townhouse-hs-town
257
257
  profiles: [town]
258
258
  networks:
@@ -303,7 +303,7 @@ services:
303
303
  # Lazy-provisioned via Epic 46: `townhouse node add mill`
304
304
  # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
305
305
  mill:
306
- image: ghcr.io/toon-protocol/mill@sha256:5269013677914ebc68d52c844add621c9a34e3219393280353227d074fa8787f
306
+ image: ghcr.io/toon-protocol/mill@sha256:91f203ddcda5d77f394b19c943db1e121ade0e31855702ea4e5d6cc372e444c1
307
307
  container_name: townhouse-hs-mill
308
308
  profiles: [mill]
309
309
  networks:
@@ -351,7 +351,7 @@ services:
351
351
  # Lazy-provisioned via Epic 46: `townhouse node add dvm`
352
352
  # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
353
353
  dvm:
354
- image: ghcr.io/toon-protocol/dvm@sha256:4d8e2cf5412c8bbfd9321c416356ba7b3c52ab8405db0df9f1b8f9d266c17cff
354
+ image: ghcr.io/toon-protocol/dvm@sha256:a8335306f4e787c87a9fd43147f71cce045d424d625491c229f226a38f909365
355
355
  container_name: townhouse-hs-dvm
356
356
  profiles: [dvm]
357
357
  networks:
@@ -1,27 +1,27 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "townhouseVersion": "0.1.0",
4
- "builtAt": "2026-06-01T20:34:54.854Z",
3
+ "townhouseVersion": "0.1.2",
4
+ "builtAt": "2026-06-02T11:30:55.118Z",
5
5
  "images": {
6
6
  "townhouse-api": {
7
7
  "name": "ghcr.io/toon-protocol/townhouse-api",
8
- "tag": "0.1.0",
9
- "digest": "sha256:f2cf4725895a3fe49593831481d4641465341533786150edf78d337868352994"
8
+ "tag": "0.1.2",
9
+ "digest": "sha256:706591f02ab9fc5a3f6fdcd9feada9d149c2f76ba9951f00bd5d780cbcd62ec6"
10
10
  },
11
11
  "town": {
12
12
  "name": "ghcr.io/toon-protocol/town",
13
- "tag": "0.1.0",
14
- "digest": "sha256:cada4f94a28e6ddfa4c01b37b5aadc1a8fa374b5fd8e85478d4aa5be33a2d961"
13
+ "tag": "0.1.2",
14
+ "digest": "sha256:e791f677ec2cdb0bb5983f0b66c1de8fe4b7c050bc29e2483b9941949b82350b"
15
15
  },
16
16
  "mill": {
17
17
  "name": "ghcr.io/toon-protocol/mill",
18
- "tag": "0.1.0",
19
- "digest": "sha256:5269013677914ebc68d52c844add621c9a34e3219393280353227d074fa8787f"
18
+ "tag": "0.1.2",
19
+ "digest": "sha256:91f203ddcda5d77f394b19c943db1e121ade0e31855702ea4e5d6cc372e444c1"
20
20
  },
21
21
  "dvm": {
22
22
  "name": "ghcr.io/toon-protocol/dvm",
23
- "tag": "0.1.0",
24
- "digest": "sha256:4d8e2cf5412c8bbfd9321c416356ba7b3c52ab8405db0df9f1b8f9d266c17cff"
23
+ "tag": "0.1.2",
24
+ "digest": "sha256:a8335306f4e787c87a9fd43147f71cce045d424d625491c229f226a38f909365"
25
25
  },
26
26
  "connector": {
27
27
  "name": "ghcr.io/toon-protocol/connector",
package/dist/index.d.ts CHANGED
@@ -3,8 +3,6 @@ export { A as ApiConfig, b as ComposeLoaderError, C as ComposeLoaderOptions, c a
3
3
  import { EventEmitter } from 'node:events';
4
4
  import Docker from 'dockerode';
5
5
  import { FastifyBaseLogger, FastifyInstance } from 'fastify';
6
- import { MillHealthResponse } from '@toon-protocol/mill';
7
- export { MillHealthResponse } from '@toon-protocol/mill';
8
6
  import { z } from 'zod';
9
7
 
10
8
  /**
@@ -982,6 +980,41 @@ interface DvmHealthResponse {
982
980
  basePricePerByte: string;
983
981
  jobsRecent: DvmJobsRecent;
984
982
  }
983
+ /** Chains a Mill node can settle on. Inlined from packages/mill/src/wallet.ts. */
984
+ type MillChainKind = 'evm' | 'mina' | 'solana';
985
+ /** A configured swap pair, inlined from packages/core/src/types.ts (SwapPair). */
986
+ interface MillSwapPair {
987
+ from: {
988
+ assetCode: string;
989
+ assetScale: number;
990
+ chain: string;
991
+ };
992
+ to: {
993
+ assetCode: string;
994
+ assetScale: number;
995
+ chain: string;
996
+ };
997
+ rate: string;
998
+ minAmount?: string;
999
+ maxAmount?: string;
1000
+ }
1001
+ /**
1002
+ * Response shape for GET /health on the Mill BLS server. Inlined from
1003
+ * packages/mill/src/mill.ts (MillHealthResponse) — keep in sync.
1004
+ */
1005
+ interface MillHealthResponse {
1006
+ status: 'ok' | 'starting' | 'stopping' | 'stopped';
1007
+ version: string;
1008
+ nodePubkey: string;
1009
+ swapPairsCount: number;
1010
+ chains: readonly MillChainKind[];
1011
+ uptimeSec: number;
1012
+ inventory: Record<string, string>;
1013
+ /** Configured swap pairs — operator-config, no secrets. */
1014
+ swapPairs: MillSwapPair[];
1015
+ /** Per-asset available reserves, parallel to `inventory` (which is total). */
1016
+ inventoryAvailable: Record<string, string>;
1017
+ }
985
1018
  /** Node types supported by Townhouse */
986
1019
  type NodeType = 'town' | 'mill' | 'dvm';
987
1020
  /** Runtime state of a node container */
@@ -1091,7 +1124,6 @@ interface TimeseriesBucket {
1091
1124
  interface PacketTimeseriesPayload {
1092
1125
  buckets: TimeseriesBucket[];
1093
1126
  }
1094
-
1095
1127
  /** Minimal common health shape; superset emitted by Town containers. */
1096
1128
  interface TownHealthPayload {
1097
1129
  status: 'ok' | 'starting' | 'stopping' | 'stopped' | 'error';
@@ -2006,4 +2038,4 @@ declare class BootReconciler {
2006
2038
  private appendLog;
2007
2039
  }
2008
2040
 
2009
- export { type AggregateEarningsInput, type AggregatedEarnings, type AggregatedEarningsStatus, type AggregatorLogger, type ApiDeps, type ApiServer, type BandwidthPayload, BandwidthStats, BootReconciler, ComposeProfile, ConfigValidationError, ConnectorAdminClient, ConnectorConfigGenerator, type ConnectorRuntimeConfig, DEFAULT_ATOR_PROXY, type DeltaComputer, type DepositAddressEntry, type DepositAddressesPayload, type DivergenceAction, type DivergenceLog, DockerOrchestrator, type DvmHealthResponse, EncryptedWallet, HealthCheckOptions, type HealthResponse, type HsHostnameResponse, type ImageManifest, ImageManifestSchema, type JobsByKindEntry, type JobsRecentPayload, type MetricsPayload, type MetricsPeerEntry, type MetricsResponse, type MillSwapsRecentPayload, type NodeDetail, type NodeEarnings, type NodeHealthPayload, type NodeInfo, type NodeState, NodeType$1 as NodeType, type NodesYaml, type NodesYamlEntry, NodesYamlEntrySchema, NodesYamlSchema, type NostrEventPayload, OrchestratorError, type PacketLogEntry, type PacketLogFilter, type PacketTimeseriesPayload, type PeerEntry, type PeerStatus, PeerTypeResolver, type PeersResponse, type PerAsset, type ReconcileSummary, type RevealRequest, type RevealResponse, type SnapshotEntry, SnapshotWriter, type SnapshotWriterOptions, type SwapByPairEntry, type TimeseriesBucket, type TownHealthPayload, TownhouseConfig, type TransactionReceiptPayload, type TransportPatchRequest, type TransportPatchResponse, TransportProbe, type TransportStatusPayload, type WalletBalanceEntry, type WalletBalancesPayload, WalletManager, type WithdrawDryRunResponse, type WithdrawRequest, type WithdrawResponse, type WithdrawSuccessResponse, type WizardInitRequest, type WizardProgressMessage, type WizardStatePayload, type WsBatchMessage, type WsConnectorRestartedMessage, type WsConnectorRestartingMessage, type WsHeartbeatMessage, type WsMessage, type WsMetricsMessage, type WsNodeStateMessage, type WsRelayEventsMessage, createApiServer, createDeltaComputer, createWizardApiServer, decryptWallet, encryptWallet, getDefaultConfig, loadConfig, loadWallet, readImageManifest, readNodesYaml, saveConfig, saveWallet, utcDayBoundary, utcMonthBoundary, utcYearBoundary, validateConfig, writeNodesYaml };
2041
+ export { type AggregateEarningsInput, type AggregatedEarnings, type AggregatedEarningsStatus, type AggregatorLogger, type ApiDeps, type ApiServer, type BandwidthPayload, BandwidthStats, BootReconciler, ComposeProfile, ConfigValidationError, ConnectorAdminClient, ConnectorConfigGenerator, type ConnectorRuntimeConfig, DEFAULT_ATOR_PROXY, type DeltaComputer, type DepositAddressEntry, type DepositAddressesPayload, type DivergenceAction, type DivergenceLog, DockerOrchestrator, type DvmHealthResponse, EncryptedWallet, HealthCheckOptions, type HealthResponse, type HsHostnameResponse, type ImageManifest, ImageManifestSchema, type JobsByKindEntry, type JobsRecentPayload, type MetricsPayload, type MetricsPeerEntry, type MetricsResponse, type MillHealthResponse, type MillSwapsRecentPayload, type NodeDetail, type NodeEarnings, type NodeHealthPayload, type NodeInfo, type NodeState, NodeType$1 as NodeType, type NodesYaml, type NodesYamlEntry, NodesYamlEntrySchema, NodesYamlSchema, type NostrEventPayload, OrchestratorError, type PacketLogEntry, type PacketLogFilter, type PacketTimeseriesPayload, type PeerEntry, type PeerStatus, PeerTypeResolver, type PeersResponse, type PerAsset, type ReconcileSummary, type RevealRequest, type RevealResponse, type SnapshotEntry, SnapshotWriter, type SnapshotWriterOptions, type SwapByPairEntry, type TimeseriesBucket, type TownHealthPayload, TownhouseConfig, type TransactionReceiptPayload, type TransportPatchRequest, type TransportPatchResponse, TransportProbe, type TransportStatusPayload, type WalletBalanceEntry, type WalletBalancesPayload, WalletManager, type WithdrawDryRunResponse, type WithdrawRequest, type WithdrawResponse, type WithdrawSuccessResponse, type WizardInitRequest, type WizardProgressMessage, type WizardStatePayload, type WsBatchMessage, type WsConnectorRestartedMessage, type WsConnectorRestartingMessage, type WsHeartbeatMessage, type WsMessage, type WsMetricsMessage, type WsNodeStateMessage, type WsRelayEventsMessage, createApiServer, createDeltaComputer, createWizardApiServer, decryptWallet, encryptWallet, getDefaultConfig, loadConfig, loadWallet, readImageManifest, readNodesYaml, saveConfig, saveWallet, utcDayBoundary, utcMonthBoundary, utcYearBoundary, validateConfig, writeNodesYaml };
package/dist/index.js CHANGED
@@ -34,7 +34,8 @@ import {
34
34
  utcYearBoundary,
35
35
  validateConfig,
36
36
  writeNodesYaml
37
- } from "./chunk-4WCMVIO4.js";
37
+ } from "./chunk-W33MEOPM.js";
38
+ import "./chunk-5O4SBV5O.js";
38
39
  import "./chunk-GQNBZJ6F.js";
39
40
  import "./chunk-I2R4CRUX.js";
40
41
  export {
@@ -1,11 +1,16 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import {
3
+ hmac,
4
+ sha256
5
+ } from "./chunk-5O4SBV5O.js";
2
6
  import "./chunk-I2R4CRUX.js";
3
7
 
8
+ // ../../node_modules/.pnpm/@noble+hashes@1.8.0/node_modules/@noble/hashes/esm/sha256.js
9
+ var sha2562 = sha256;
10
+
4
11
  // src/wallet/rsa-from-seed.ts
5
- import { hmac } from "@noble/hashes/hmac";
6
- import { sha256 } from "@noble/hashes/sha256";
7
12
  function hmacSha256(key, ...parts) {
8
- const h = hmac.create(sha256, key);
13
+ const h = hmac.create(sha2562, key);
9
14
  for (const p of parts) h.update(p);
10
15
  return h.digest();
11
16
  }
@@ -59,4 +64,4 @@ async function rsaPrivateKeyPemFromSeed(seed) {
59
64
  export {
60
65
  rsaPrivateKeyPemFromSeed
61
66
  };
62
- //# sourceMappingURL=rsa-from-seed-VMNLNDZM.js.map
67
+ //# sourceMappingURL=rsa-from-seed-XIT6EU73.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../node_modules/.pnpm/@noble+hashes@1.8.0/node_modules/@noble/hashes/src/sha256.ts","../src/wallet/rsa-from-seed.ts"],"sourcesContent":["/**\n * SHA2-256 a.k.a. sha256. In JS, it is the fastest hash, even faster than Blake3.\n *\n * To break sha256 using birthday attack, attackers need to try 2^128 hashes.\n * BTC network is doing 2^70 hashes/sec (2^95 hashes/year) as per 2025.\n *\n * Check out [FIPS 180-4](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf).\n * @module\n * @deprecated\n */\nimport {\n SHA224 as SHA224n,\n sha224 as sha224n,\n SHA256 as SHA256n,\n sha256 as sha256n,\n} from './sha2.ts';\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexport const SHA256: typeof SHA256n = SHA256n;\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexport const sha256: typeof sha256n = sha256n;\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexport const SHA224: typeof SHA224n = SHA224n;\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexport const sha224: typeof sha224n = sha224n;\n","/**\n * rsa-from-seed — CVE-free replacement for human-crypto-keys RSA derivation.\n *\n * Produces byte-for-byte identical RSA-4096 keys as\n * `human-crypto-keys.getKeyPairFromSeed(seed, {id:'rsa', modulusLength:4096},\n * {privateKeyFormat:'pkcs1-pem'})`.\n *\n * Algorithm (preserved exactly to maintain golden test vectors):\n * 1. HMAC-DRBG(SHA-256, entropy=seed, nonce=[], pers=[])\n * Re-implemented with @noble/hashes (already a workspace dep).\n * Byte-for-byte identical to hmac-drbg@1.0.1 used by human-crypto-keys.\n * 2. node-forge 1.3.3 (CVE-free) PRIMEINC prime search driven by (1).\n * Identical to node-forge 0.8.5 because jsbn.js and the PRIMEINC loop\n * are unchanged between versions (verified by diff).\n * 3. Export private key as PKCS#1 PEM string.\n *\n * Why not Node.js crypto.generateKeyPair?\n * It uses OpenSSL's system CSPRNG and cannot be seeded deterministically.\n *\n * Performance: same as before (~5–30s for RSA-4096 on a 2024 desktop).\n * The on-disk ar-cache.ts already amortises this cost after first derivation.\n */\n\nimport { hmac } from '@noble/hashes/hmac';\nimport { sha256 } from '@noble/hashes/sha256';\n\n// ── HMAC-DRBG (SP 800-90A, SHA-256 variant) ─────────────────────────────────\n//\n// Replicates hmac-drbg@1.0.1 with one key behavioural detail:\n// generate(n) in hmac-drbg discards leftover bytes and calls _update()\n// AFTER each call (not per 32-byte V-block). Our getBytesSync() mirrors\n// that exact behaviour: generate fresh V-chain on every call, discard\n// surplus, then do a 2-step _update (no seed data ⇒ only K/V steps 1+2).\n\nfunction hmacSha256(key: Uint8Array, ...parts: Uint8Array[]): Uint8Array {\n const h = hmac.create(sha256, key);\n for (const p of parts) h.update(p);\n return h.digest();\n}\n\nconst BYTE_00 = new Uint8Array([0x00]);\nconst BYTE_01 = new Uint8Array([0x01]);\n\n/**\n * Create a HMAC-DRBG PRNG that returns forge-compatible \"binary strings\"\n * (Latin-1 encoded byte strings used internally by node-forge).\n *\n * @param seedBytes 32-byte BIP-32 sub-seed (raw entropy; hex-decoding step\n * from human-crypto-keys is a no-op and not replicated).\n * @param rawEncode `forge.util.binary.raw.encode` — converts Uint8Array to\n * forge's internal binary string format.\n */\nfunction makeHmacDrbgPrng(\n seedBytes: Uint8Array,\n rawEncode: (bytes: Uint8Array) => string\n): { getBytesSync: (n: number) => string } {\n // Initialise K and V per SP 800-90A §10.1.2.3\n let K = new Uint8Array(32).fill(0x00);\n let V = new Uint8Array(32).fill(0x01);\n\n // _update(seed) — seeding phase (seed data present → full 4-step update)\n K = hmacSha256(K, V, BYTE_00, seedBytes);\n V = hmacSha256(K, V);\n K = hmacSha256(K, V, BYTE_01, seedBytes);\n V = hmacSha256(K, V);\n\n return {\n getBytesSync(size: number): string {\n // Generate V-chain until we have enough bytes (same as hmac-drbg's\n // `while (temp.length < len) { V = HMAC(K, V); temp.concat(V); }`).\n // Surplus bytes beyond `size` are discarded on purpose — matches the\n // original `temp.slice(0, len)` behaviour that ensures determinism.\n const chunks: Uint8Array[] = [];\n let total = 0;\n while (total < size) {\n V = hmacSha256(K, V);\n chunks.push(V);\n total += V.length;\n }\n // Flatten and slice\n const flat = new Uint8Array(total);\n let offset = 0;\n for (const c of chunks) {\n flat.set(c, offset);\n offset += c.length;\n }\n const out = flat.slice(0, size);\n\n // _update(undefined) — post-generate state update (2-step only,\n // since there is no additional data; mirrors the `if(!seed) return`\n // branch in hmac-drbg._update).\n K = hmacSha256(K, V, BYTE_00);\n V = hmacSha256(K, V);\n\n return rawEncode(out);\n },\n };\n}\n\n// ── Public API ────────────────────────────────────────────────────────────────\n\n/**\n * Derive a deterministic RSA-4096 PKCS#1 PEM private key from a 32-byte seed.\n *\n * Identical output to:\n * `human-crypto-keys.getKeyPairFromSeed(seed, {id:'rsa', modulusLength:4096},\n * {privateKeyFormat:'pkcs1-pem'}).privateKey`\n *\n * @param seed 32-byte BIP-32 sub-seed. Zeroed by caller after this returns.\n * @returns PKCS#1 PEM-encoded RSA-4096 private key string.\n */\nexport async function rsaPrivateKeyPemFromSeed(\n seed: Uint8Array\n): Promise<string> {\n // Lazy-import node-forge so callers that never touch Arweave don't pay the\n // module-load cost. node-forge is a CJS module; dynamic import wraps it.\n const forge = (await import('node-forge')).default;\n\n const prng = makeHmacDrbgPrng(seed, (bytes) =>\n forge.util.binary.raw.encode(bytes)\n );\n\n // Promisify the callback-based generateKeyPair\n const { privateKey } = await new Promise<{\n privateKey: forge.pki.rsa.PrivateKey;\n publicKey: forge.pki.rsa.PublicKey;\n }>((resolve, reject) => {\n forge.pki.rsa.generateKeyPair(\n 4096,\n 65537,\n { prng, algorithm: 'PRIMEINC' },\n (err, kp) => (err ? reject(err) : resolve(kp))\n );\n });\n\n return forge.pki.privateKeyToPem(privateKey);\n}\n"],"mappings":";;;;;;;;AAmBO,IAAMA,UAAyB;;;ACetC,SAAS,WAAW,QAAoB,OAAiC;AACvE,QAAM,IAAI,KAAK,OAAOC,SAAQ,GAAG;AACjC,aAAW,KAAK,MAAO,GAAE,OAAO,CAAC;AACjC,SAAO,EAAE,OAAO;AAClB;AAEA,IAAM,UAAU,IAAI,WAAW,CAAC,CAAI,CAAC;AACrC,IAAM,UAAU,IAAI,WAAW,CAAC,CAAI,CAAC;AAWrC,SAAS,iBACP,WACA,WACyC;AAEzC,MAAI,IAAI,IAAI,WAAW,EAAE,EAAE,KAAK,CAAI;AACpC,MAAI,IAAI,IAAI,WAAW,EAAE,EAAE,KAAK,CAAI;AAGpC,MAAI,WAAW,GAAG,GAAG,SAAS,SAAS;AACvC,MAAI,WAAW,GAAG,CAAC;AACnB,MAAI,WAAW,GAAG,GAAG,SAAS,SAAS;AACvC,MAAI,WAAW,GAAG,CAAC;AAEnB,SAAO;AAAA,IACL,aAAa,MAAsB;AAKjC,YAAM,SAAuB,CAAC;AAC9B,UAAI,QAAQ;AACZ,aAAO,QAAQ,MAAM;AACnB,YAAI,WAAW,GAAG,CAAC;AACnB,eAAO,KAAK,CAAC;AACb,iBAAS,EAAE;AAAA,MACb;AAEA,YAAM,OAAO,IAAI,WAAW,KAAK;AACjC,UAAI,SAAS;AACb,iBAAW,KAAK,QAAQ;AACtB,aAAK,IAAI,GAAG,MAAM;AAClB,kBAAU,EAAE;AAAA,MACd;AACA,YAAM,MAAM,KAAK,MAAM,GAAG,IAAI;AAK9B,UAAI,WAAW,GAAG,GAAG,OAAO;AAC5B,UAAI,WAAW,GAAG,CAAC;AAEnB,aAAO,UAAU,GAAG;AAAA,IACtB;AAAA,EACF;AACF;AAcA,eAAsB,yBACpB,MACiB;AAGjB,QAAM,SAAS,MAAM,OAAO,YAAY,GAAG;AAE3C,QAAM,OAAO;AAAA,IAAiB;AAAA,IAAM,CAAC,UACnC,MAAM,KAAK,OAAO,IAAI,OAAO,KAAK;AAAA,EACpC;AAGA,QAAM,EAAE,WAAW,IAAI,MAAM,IAAI,QAG9B,CAAC,SAAS,WAAW;AACtB,UAAM,IAAI,IAAI;AAAA,MACZ;AAAA,MACA;AAAA,MACA,EAAE,MAAM,WAAW,WAAW;AAAA,MAC9B,CAAC,KAAK,OAAQ,MAAM,OAAO,GAAG,IAAI,QAAQ,EAAE;AAAA,IAC9C;AAAA,EACF,CAAC;AAED,SAAO,MAAM,IAAI,gBAAgB,UAAU;AAC7C;","names":["sha256","sha256"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@toon-protocol/townhouse",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "TOON Townhouse — host-native orchestrator + dashboard for Docker-containerized TOON nodes",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -58,8 +58,7 @@
58
58
  "react": "^18.3.1",
59
59
  "viem": "^2.0.0",
60
60
  "yaml": "^2.7.0",
61
- "zod": "^3.25.0",
62
- "@toon-protocol/mill": "^0.1.0"
61
+ "zod": "^3.25.0"
63
62
  },
64
63
  "devDependencies": {
65
64
  "@types/dockerode": "^3.3.0",
@@ -72,9 +71,10 @@
72
71
  "tsup": "^8.0.0",
73
72
  "typescript": "^5.3.0",
74
73
  "vitest": "^1.0.0",
75
- "@toon-protocol/client": "^0.9.1",
74
+ "@toon-protocol/mill": "^0.1.0",
76
75
  "@toon-protocol/core": "^1.4.1",
77
76
  "@toon-protocol/relay": "^1.3.1",
77
+ "@toon-protocol/client": "^0.9.1",
78
78
  "@toon-protocol/sdk": "^0.5.0"
79
79
  },
80
80
  "scripts": {