@holochain/hc-spin 0.600.0 → 0.600.2-rc.0

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.
package/CHANGELOG.md CHANGED
@@ -9,6 +9,12 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
9
9
  ### Changed
10
10
  ### Removed
11
11
 
12
+ ## 2026-01-22: v0.600.1-rc.0
13
+
14
+ ### Changed
15
+
16
+ - Bumped to holochain 0.6.1-rc.0
17
+
12
18
  ## 2025-11-06: v0.600.0-rc.0
13
19
 
14
20
  ### Added
@@ -12442,7 +12442,8 @@ function validateCliArgs(cliArgs, cliOpts, appDataRootDir) {
12442
12442
  singalingUrl: cliOpts.signalingUrl,
12443
12443
  bootstrapUrl: cliOpts.bootstrapUrl,
12444
12444
  happOrWebhappPath: isHapp ? { type: "happ", path: happOrWebhappPath } : { type: "webhapp", path: happOrWebhappPath },
12445
- openDevtools: cliOpts.openDevtools ? true : false
12445
+ openDevtools: cliOpts.openDevtools ? true : false,
12446
+ transport: cliOpts.transport || "quic"
12446
12447
  };
12447
12448
  }
12448
12449
  async function createHappWindow(uiSource, appId, agentNum, appPort, appAuthToken, appDataRootDir) {
@@ -12563,7 +12564,7 @@ function setLinkOpenHandlers(browserWindow) {
12563
12564
  }
12564
12565
  const rustUtils = require("@holochain/hc-spin-rust-utils");
12565
12566
  const cli = new commander.Command();
12566
- cli.name("hc-spin").description("CLI to run Holochain apps during development.").version(`${"0.600.0"} (built for holochain ${"0.6.0"})`).argument(
12567
+ cli.name("hc-spin").description("CLI to run Holochain apps during development.").version(`${"0.600.2-rc.0"} (built for holochain ${"0.6.1-rc.0"})`).argument(
12567
12568
  "<path>",
12568
12569
  "Path to .webhapp or .happ file to launch. If a .happ file is passed, either a UI path must be specified via --ui-path or a port pointing to a localhost server via --ui-port"
12569
12570
  ).option(
@@ -12587,7 +12588,10 @@ cli.name("hc-spin").description("CLI to run Holochain apps during development.")
12587
12588
  ).option(
12588
12589
  "--signaling-url <url>",
12589
12590
  "Url of the signaling server to use. By default, hc spin spins up a local development signaling server for you but this argument allows you to specify a custom one."
12590
- ).option("--open-devtools", "Automatically open the devtools on startup.");
12591
+ ).option("--open-devtools", "Automatically open the devtools on startup.").option(
12592
+ "--transport <quic|webrtc>",
12593
+ "Configure network transport. Defaults to quic, compatible with the iroh transport used in in Holochain by default. Set to `webrtc` for tx5 transport."
12594
+ );
12591
12595
  cli.parse();
12592
12596
  const rl = require("readline").createInterface({
12593
12597
  input: process.stdin,
@@ -12660,7 +12664,7 @@ const handleSignZomeCall = async (e, request) => {
12660
12664
  };
12661
12665
  return signedZomeCall;
12662
12666
  };
12663
- async function startLocalServices() {
12667
+ async function startLocalServices(transport) {
12664
12668
  const localServicesHandle = childProcess__namespace.spawn("kitsune2-bootstrap-srv");
12665
12669
  return new Promise((resolve) => {
12666
12670
  let bootStrapUrl;
@@ -12672,7 +12676,7 @@ async function startLocalServices() {
12672
12676
  if (line.includes("#kitsune2_bootstrap_srv#listening#")) {
12673
12677
  const hostAndPort = line.split("#kitsune2_bootstrap_srv#listening#")[1].split("#")[0];
12674
12678
  bootStrapUrl = `http://${hostAndPort}`;
12675
- signalUrl = `ws://${hostAndPort}`;
12679
+ signalUrl = transport === "quic" ? `http://${hostAndPort}` : `ws://${hostAndPort}`;
12676
12680
  }
12677
12681
  if (line.includes("#kitsune2_bootstrap_srv#running#")) {
12678
12682
  bootstrapRunning = true;
@@ -12686,7 +12690,7 @@ async function startLocalServices() {
12686
12690
  });
12687
12691
  });
12688
12692
  }
12689
- async function spawnSandboxes(nAgents, happPath, bootStrapUrl, signalUrl, appId, networkSeed, targetArcFactor) {
12693
+ async function spawnSandboxes(nAgents, happPath, bootStrapUrl, signalUrl, appId, transport, networkSeed, targetArcFactor) {
12690
12694
  const generateArgs = [
12691
12695
  "sandbox",
12692
12696
  "--piped",
@@ -12711,7 +12715,7 @@ async function spawnSandboxes(nAgents, happPath, bootStrapUrl, signalUrl, appId,
12711
12715
  if (targetArcFactor !== void 0) {
12712
12716
  generateArgs.push("--target-arc-factor", targetArcFactor.toString());
12713
12717
  }
12714
- generateArgs.push("--bootstrap", bootStrapUrl, "webrtc", signalUrl);
12718
+ generateArgs.push("--bootstrap", bootStrapUrl, transport, signalUrl);
12715
12719
  let readyConductors = 0;
12716
12720
  const portsInfo = {};
12717
12721
  const sandboxPaths = [];
@@ -12755,13 +12759,14 @@ electron.app.whenReady().then(async () => {
12755
12759
  happTargetDir
12756
12760
  );
12757
12761
  }
12758
- const [bootstrapUrl, signalingUrl] = await startLocalServices();
12762
+ const [bootstrapUrl, signalingUrl] = await startLocalServices(CLI_OPTS.transport);
12759
12763
  const [sandboxHandle, sandboxPaths, portsInfo] = await spawnSandboxes(
12760
12764
  CLI_OPTS.numAgents,
12761
12765
  happTargetDir ? happTargetDir : CLI_OPTS.happOrWebhappPath.path,
12762
12766
  CLI_OPTS.bootstrapUrl ? CLI_OPTS.bootstrapUrl : bootstrapUrl,
12763
12767
  CLI_OPTS.singalingUrl ? CLI_OPTS.singalingUrl : signalingUrl,
12764
12768
  CLI_OPTS.appId,
12769
+ CLI_OPTS.transport,
12765
12770
  CLI_OPTS.networkSeed,
12766
12771
  CLI_OPTS.targetArcFactor
12767
12772
  );
package/flake.lock CHANGED
@@ -2,11 +2,11 @@
2
2
  "nodes": {
3
3
  "crane": {
4
4
  "locked": {
5
- "lastModified": 1762189950,
6
- "narHash": "sha256-aotggLUXjlDGqKWibGPQcMZJGgdr79S21ISrv1Wz6RI=",
5
+ "lastModified": 1768873933,
6
+ "narHash": "sha256-CfyzdaeLNGkyAHp3kT5vjvXhA1pVVK7nyDziYxCPsNk=",
7
7
  "owner": "ipetkov",
8
8
  "repo": "crane",
9
- "rev": "50700219af884287ad7c85507e2f163b23a027a9",
9
+ "rev": "0bda7e7d005ccb5522a76d11ccfbf562b71953ca",
10
10
  "type": "github"
11
11
  },
12
12
  "original": {
@@ -20,11 +20,11 @@
20
20
  "nixpkgs-lib": "nixpkgs-lib"
21
21
  },
22
22
  "locked": {
23
- "lastModified": 1762040540,
24
- "narHash": "sha256-z5PlZ47j50VNF3R+IMS9LmzI5fYRGY/Z5O5tol1c9I4=",
23
+ "lastModified": 1768135262,
24
+ "narHash": "sha256-PVvu7OqHBGWN16zSi6tEmPwwHQ4rLPU9Plvs8/1TUBY=",
25
25
  "owner": "hercules-ci",
26
26
  "repo": "flake-parts",
27
- "rev": "0010412d62a25d959151790968765a70c436598b",
27
+ "rev": "80daad04eddbbf5a4d883996a73f3f542fa437ac",
28
28
  "type": "github"
29
29
  },
30
30
  "original": {
@@ -33,36 +33,19 @@
33
33
  "type": "github"
34
34
  }
35
35
  },
36
- "hc-launch": {
37
- "flake": false,
38
- "locked": {
39
- "lastModified": 1752056054,
40
- "narHash": "sha256-iLHhGQXrSfgAibzLSx+mdOQnnTzq4mrRXto7+a+MDLM=",
41
- "owner": "holochain",
42
- "repo": "hc-launch",
43
- "rev": "612aa244ceb4d2136e5adbf181ff0cc123daff65",
44
- "type": "github"
45
- },
46
- "original": {
47
- "owner": "holochain",
48
- "ref": "holochain-weekly",
49
- "repo": "hc-launch",
50
- "type": "github"
51
- }
52
- },
53
36
  "hc-scaffold": {
54
37
  "flake": false,
55
38
  "locked": {
56
- "lastModified": 1760566803,
57
- "narHash": "sha256-fWflEEb2JQyVHfGglbx6dCR6X+4ECGM9pbxQYrKSZtQ=",
39
+ "lastModified": 1769104114,
40
+ "narHash": "sha256-Ebh8YW7J4VRAwhK9XQDf98nWAIvciddzdx7LbhZiwdI=",
58
41
  "owner": "holochain",
59
42
  "repo": "scaffolding",
60
- "rev": "751a16e98ddb35db5763cbf4b882a849b642e7e7",
43
+ "rev": "6749c80d54306e4c1ad5831ce2dbdbb9a283ee0c",
61
44
  "type": "github"
62
45
  },
63
46
  "original": {
64
47
  "owner": "holochain",
65
- "ref": "0.600.0-dev.0",
48
+ "ref": "v0.600.1-rc.0",
66
49
  "repo": "scaffolding",
67
50
  "type": "github"
68
51
  }
@@ -70,16 +53,16 @@
70
53
  "holochain": {
71
54
  "flake": false,
72
55
  "locked": {
73
- "lastModified": 1762372467,
74
- "narHash": "sha256-8LoKyzjkAoHOlJ0+8hUrwc0LTX7/2TdVODoLwMZMNVA=",
56
+ "lastModified": 1769035817,
57
+ "narHash": "sha256-PVUIsifOy6fRcceBZraLKrPwq83MzRYyfuxDCohv514=",
75
58
  "owner": "holochain",
76
59
  "repo": "holochain",
77
- "rev": "90f56b5bf15b572cd9fdbd63d5a40a288143ff5f",
60
+ "rev": "b499bd881580f9e0dd8f4494aafd4b2093a06168",
78
61
  "type": "github"
79
62
  },
80
63
  "original": {
81
64
  "owner": "holochain",
82
- "ref": "holochain-0.6.0-rc.0",
65
+ "ref": "holochain-0.6.1-rc.0",
83
66
  "repo": "holochain",
84
67
  "type": "github"
85
68
  }
@@ -88,26 +71,24 @@
88
71
  "inputs": {
89
72
  "crane": "crane",
90
73
  "flake-parts": "flake-parts",
91
- "hc-launch": "hc-launch",
92
74
  "hc-scaffold": "hc-scaffold",
93
75
  "holochain": "holochain",
94
76
  "kitsune2": "kitsune2",
95
77
  "lair-keystore": "lair-keystore",
96
78
  "nixpkgs": "nixpkgs",
97
- "playground": "playground",
98
79
  "rust-overlay": "rust-overlay"
99
80
  },
100
81
  "locked": {
101
- "lastModified": 1762431364,
102
- "narHash": "sha256-769gbrsWU5SejCYcvoTPkVakU8nj5qYUw6cDlMRIgDs=",
82
+ "lastModified": 1769121828,
83
+ "narHash": "sha256-o1GUUg9FUADcTOU4gzDDtiuJo61PyrQHCn0e64HRJYU=",
103
84
  "owner": "holochain",
104
85
  "repo": "holonix",
105
- "rev": "2682fec89ecb743c13453a65ee775147076f1919",
86
+ "rev": "3e2a4b96b177aaaa233fd744ba82bfe308e85635",
106
87
  "type": "github"
107
88
  },
108
89
  "original": {
109
90
  "owner": "holochain",
110
- "ref": "main",
91
+ "ref": "main-0.6",
111
92
  "repo": "holonix",
112
93
  "type": "github"
113
94
  }
@@ -115,16 +96,16 @@
115
96
  "kitsune2": {
116
97
  "flake": false,
117
98
  "locked": {
118
- "lastModified": 1762303720,
119
- "narHash": "sha256-tC2k+1kPxpVYRYJLWYXQPvFlUwgfF4cKoFKbkak0vxU=",
99
+ "lastModified": 1768402558,
100
+ "narHash": "sha256-v7uEmcVGC6tDjrkEZHMJa9DdXnqXwwVxJx9GkZq9P/U=",
120
101
  "owner": "holochain",
121
102
  "repo": "kitsune2",
122
- "rev": "112099b30381ea0d23b8b3af21f5b5bb81ced6c5",
103
+ "rev": "2b809bcf0bff3d493cd5ba230677240432fff58a",
123
104
  "type": "github"
124
105
  },
125
106
  "original": {
126
107
  "owner": "holochain",
127
- "ref": "v0.3.0",
108
+ "ref": "2b809bcf0bff3d493cd5ba230677240432fff58a",
128
109
  "repo": "kitsune2",
129
110
  "type": "github"
130
111
  }
@@ -148,27 +129,27 @@
148
129
  },
149
130
  "nixpkgs": {
150
131
  "locked": {
151
- "lastModified": 1762233356,
152
- "narHash": "sha256-cGS3lLTYusbEP/IJIWGgnkzIl+FA5xDvtiHyjalGr4k=",
132
+ "lastModified": 1768940263,
133
+ "narHash": "sha256-sJERJIYTKPFXkoz/gBaBtRKke82h4DkX3BBSsKbfbvI=",
153
134
  "owner": "nixos",
154
135
  "repo": "nixpkgs",
155
- "rev": "ca534a76c4afb2bdc07b681dbc11b453bab21af8",
136
+ "rev": "3ceaaa8bc963ced4d830e06ea2d0863b6490ff03",
156
137
  "type": "github"
157
138
  },
158
139
  "original": {
159
140
  "owner": "nixos",
160
- "ref": "nixos-25.05",
141
+ "ref": "nixos-25.11",
161
142
  "repo": "nixpkgs",
162
143
  "type": "github"
163
144
  }
164
145
  },
165
146
  "nixpkgs-lib": {
166
147
  "locked": {
167
- "lastModified": 1761765539,
168
- "narHash": "sha256-b0yj6kfvO8ApcSE+QmA6mUfu8IYG6/uU28OFn4PaC8M=",
148
+ "lastModified": 1765674936,
149
+ "narHash": "sha256-k00uTP4JNfmejrCLJOwdObYC9jHRrr/5M/a/8L2EIdo=",
169
150
  "owner": "nix-community",
170
151
  "repo": "nixpkgs.lib",
171
- "rev": "719359f4562934ae99f5443f20aa06c2ffff91fc",
152
+ "rev": "2075416fcb47225d9b68ac469a5c4801a9c4dd85",
172
153
  "type": "github"
173
154
  },
174
155
  "original": {
@@ -177,23 +158,6 @@
177
158
  "type": "github"
178
159
  }
179
160
  },
180
- "playground": {
181
- "flake": false,
182
- "locked": {
183
- "lastModified": 1756729856,
184
- "narHash": "sha256-xJnIfcIyLRTXsf+N8OOMnqzRkx2gT/DSta7qCm8yU7Y=",
185
- "owner": "darksoil-studio",
186
- "repo": "holochain-playground",
187
- "rev": "5e858641de8ac6113cfa6b47ea1350762a629a61",
188
- "type": "github"
189
- },
190
- "original": {
191
- "owner": "darksoil-studio",
192
- "ref": "main",
193
- "repo": "holochain-playground",
194
- "type": "github"
195
- }
196
- },
197
161
  "root": {
198
162
  "inputs": {
199
163
  "flake-parts": [
@@ -215,11 +179,11 @@
215
179
  ]
216
180
  },
217
181
  "locked": {
218
- "lastModified": 1762396738,
219
- "narHash": "sha256-BarSecuxtzp1boERdABLkkoxQTi6s/V33lJwUbWLrLY=",
182
+ "lastModified": 1768963622,
183
+ "narHash": "sha256-n6VHiUgrYD9yjagzG6ncVVqFbVTsKCI54tR9PNAFCo0=",
220
184
  "owner": "oxalica",
221
185
  "repo": "rust-overlay",
222
- "rev": "c63598992afd54d215d54f2b764adc0484c2b159",
186
+ "rev": "2ef5b3362af585a83bafd34e7fc9b1f388c2e5e2",
223
187
  "type": "github"
224
188
  },
225
189
  "original": {
package/flake.nix CHANGED
@@ -2,7 +2,7 @@
2
2
  description = "Flake for Holochain app development";
3
3
 
4
4
  inputs = {
5
- holonix.url = "github:holochain/holonix?ref=main";
5
+ holonix.url = "github:holochain/holonix?ref=main-0.6";
6
6
 
7
7
  nixpkgs.follows = "holonix/nixpkgs";
8
8
  flake-parts.follows = "holonix/flake-parts";
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@holochain/hc-spin",
3
- "version": "0.600.0",
4
- "holochainVersion": "0.6.0",
3
+ "version": "0.600.2-rc.0",
4
+ "holochainVersion": "0.6.1-rc.0",
5
5
  "description": "CLI to run Holochain apps during development.",
6
6
  "author": "matthme",
7
7
  "homepage": "https://developer.holochain.org",
@@ -36,7 +36,7 @@
36
36
  "@electron-toolkit/preload": "^3.0.0",
37
37
  "@electron-toolkit/utils": "^3.0.0",
38
38
  "@holochain/client": "^0.20.0",
39
- "@holochain/hc-spin-rust-utils": "0.600.0",
39
+ "@holochain/hc-spin-rust-utils": "0.601.1-rc.0",
40
40
  "@msgpack/msgpack": "^2.8.0",
41
41
  "bufferutil": "4.0.8",
42
42
  "commander": "11.1.0",
package/src/main/index.ts CHANGED
@@ -21,7 +21,7 @@ import path from 'path';
21
21
  import split from 'split';
22
22
 
23
23
  import { menu } from './menu';
24
- import { validateCliArgs } from './validateArgs';
24
+ import { Transport, validateCliArgs } from './validateArgs';
25
25
  import { createHappWindow, loadHappWindow } from './windows';
26
26
 
27
27
  const rustUtils = require('@holochain/hc-spin-rust-utils');
@@ -66,7 +66,11 @@ cli
66
66
  '--signaling-url <url>',
67
67
  'Url of the signaling server to use. By default, hc spin spins up a local development signaling server for you but this argument allows you to specify a custom one.',
68
68
  )
69
- .option('--open-devtools', 'Automatically open the devtools on startup.');
69
+ .option('--open-devtools', 'Automatically open the devtools on startup.')
70
+ .option(
71
+ '--transport <quic|webrtc>',
72
+ 'Configure network transport. Defaults to quic, compatible with the iroh transport used in in Holochain by default. Set to `webrtc` for tx5 transport.',
73
+ );
70
74
 
71
75
  cli.parse();
72
76
  // console.log('Got CLI opts: ', cli.opts());
@@ -171,7 +175,7 @@ const handleSignZomeCall = async (
171
175
  return signedZomeCall;
172
176
  };
173
177
 
174
- async function startLocalServices(): Promise<[string, string]> {
178
+ async function startLocalServices(transport: Transport): Promise<[string, string]> {
175
179
  const localServicesHandle = childProcess.spawn('kitsune2-bootstrap-srv');
176
180
  return new Promise((resolve) => {
177
181
  let bootStrapUrl;
@@ -183,7 +187,7 @@ async function startLocalServices(): Promise<[string, string]> {
183
187
  if (line.includes('#kitsune2_bootstrap_srv#listening#')) {
184
188
  const hostAndPort = line.split('#kitsune2_bootstrap_srv#listening#')[1].split('#')[0];
185
189
  bootStrapUrl = `http://${hostAndPort}`;
186
- signalUrl = `ws://${hostAndPort}`;
190
+ signalUrl = transport === 'quic' ? `http://${hostAndPort}` : `ws://${hostAndPort}`;
187
191
  }
188
192
  if (line.includes('#kitsune2_bootstrap_srv#running#')) {
189
193
  bootstrapRunning = true;
@@ -209,6 +213,7 @@ async function spawnSandboxes(
209
213
  bootStrapUrl: string,
210
214
  signalUrl: string,
211
215
  appId: string,
216
+ transport: Transport,
212
217
  networkSeed?: string,
213
218
  targetArcFactor?: number,
214
219
  ): Promise<
@@ -239,8 +244,7 @@ async function spawnSandboxes(
239
244
  if (targetArcFactor !== undefined) {
240
245
  generateArgs.push('--target-arc-factor', targetArcFactor.toString());
241
246
  }
242
- generateArgs.push('--bootstrap', bootStrapUrl, 'webrtc', signalUrl);
243
- // console.log('GENERATE ARGS: ', generateArgs);
247
+ generateArgs.push('--bootstrap', bootStrapUrl, transport, signalUrl);
244
248
 
245
249
  let readyConductors = 0;
246
250
  const portsInfo: Record<number, PortsInfo> = {};
@@ -302,7 +306,7 @@ app.whenReady().then(async () => {
302
306
  );
303
307
  }
304
308
 
305
- const [bootstrapUrl, signalingUrl] = await startLocalServices();
309
+ const [bootstrapUrl, signalingUrl] = await startLocalServices(CLI_OPTS.transport);
306
310
 
307
311
  const [sandboxHandle, sandboxPaths, portsInfo] = await spawnSandboxes(
308
312
  CLI_OPTS.numAgents,
@@ -310,6 +314,7 @@ app.whenReady().then(async () => {
310
314
  CLI_OPTS.bootstrapUrl ? CLI_OPTS.bootstrapUrl : bootstrapUrl,
311
315
  CLI_OPTS.singalingUrl ? CLI_OPTS.singalingUrl : signalingUrl,
312
316
  CLI_OPTS.appId,
317
+ CLI_OPTS.transport,
313
318
  CLI_OPTS.networkSeed,
314
319
  CLI_OPTS.targetArcFactor,
315
320
  );
@@ -14,6 +14,7 @@ export type CliOpts = {
14
14
  signalingUrl?: string;
15
15
  bootstrapUrl?: string;
16
16
  openDevtools?: boolean;
17
+ transport?: Transport;
17
18
  };
18
19
 
19
20
  export type CliOptsValidated = {
@@ -27,8 +28,11 @@ export type CliOptsValidated = {
27
28
  bootstrapUrl: string | undefined;
28
29
  happOrWebhappPath: HappOrWebhappPath;
29
30
  openDevtools: boolean;
31
+ transport: Transport;
30
32
  };
31
33
 
34
+ export type Transport = 'quic' | 'webrtc';
35
+
32
36
  export type HappOrWebhappPath = {
33
37
  type: 'happ' | 'webhapp';
34
38
  path: string;
@@ -104,5 +108,6 @@ export function validateCliArgs(
104
108
  ? { type: 'happ', path: happOrWebhappPath }
105
109
  : { type: 'webhapp', path: happOrWebhappPath },
106
110
  openDevtools: cliOpts.openDevtools ? true : false,
111
+ transport: cliOpts.transport || 'quic',
107
112
  };
108
113
  }