@kdonev/termscape 0.1.8 → 0.2.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.
Files changed (114) hide show
  1. package/README.md +32 -1
  2. package/dist/agents/profiles.d.ts +10 -0
  3. package/dist/agents/profiles.d.ts.map +1 -1
  4. package/dist/agents/profiles.js +12 -0
  5. package/dist/agents/profiles.js.map +1 -1
  6. package/dist/agents/router.d.ts +3 -1
  7. package/dist/agents/router.d.ts.map +1 -1
  8. package/dist/agents/router.js +11 -3
  9. package/dist/agents/router.js.map +1 -1
  10. package/dist/agents/wiring.d.ts.map +1 -1
  11. package/dist/agents/wiring.js +16 -1
  12. package/dist/agents/wiring.js.map +1 -1
  13. package/dist/cli-args.d.ts +10 -0
  14. package/dist/cli-args.d.ts.map +1 -1
  15. package/dist/cli-args.js +2 -0
  16. package/dist/cli-args.js.map +1 -1
  17. package/dist/cli.js +15 -258
  18. package/dist/cli.js.map +1 -1
  19. package/dist/debug.d.ts.map +1 -1
  20. package/dist/debug.js +7 -0
  21. package/dist/debug.js.map +1 -1
  22. package/dist/hub.d.ts +40 -1
  23. package/dist/hub.d.ts.map +1 -1
  24. package/dist/hub.js +163 -10
  25. package/dist/hub.js.map +1 -1
  26. package/dist/hub.tgz +0 -0
  27. package/dist/main.d.ts +7 -0
  28. package/dist/main.d.ts.map +1 -0
  29. package/dist/main.js +343 -0
  30. package/dist/main.js.map +1 -0
  31. package/dist/mcp/server.d.ts.map +1 -1
  32. package/dist/mcp/server.js +5 -2
  33. package/dist/mcp/server.js.map +1 -1
  34. package/dist/protocol/domain.d.ts +35 -0
  35. package/dist/protocol/domain.d.ts.map +1 -1
  36. package/dist/protocol/domain.js +31 -2
  37. package/dist/protocol/domain.js.map +1 -1
  38. package/dist/protocol/index.d.ts +1 -0
  39. package/dist/protocol/index.d.ts.map +1 -1
  40. package/dist/protocol/index.js +1 -0
  41. package/dist/protocol/index.js.map +1 -1
  42. package/dist/protocol/peer.d.ts +12 -0
  43. package/dist/protocol/peer.d.ts.map +1 -1
  44. package/dist/protocol/peer.js +30 -1
  45. package/dist/protocol/peer.js.map +1 -1
  46. package/dist/protocol/version.d.ts +12 -0
  47. package/dist/protocol/version.d.ts.map +1 -0
  48. package/dist/protocol/version.js +37 -0
  49. package/dist/protocol/version.js.map +1 -0
  50. package/dist/protocol/ws.d.ts +67 -1
  51. package/dist/protocol/ws.d.ts.map +1 -1
  52. package/dist/protocol/ws.js +11 -1
  53. package/dist/protocol/ws.js.map +1 -1
  54. package/dist/remote/enroll.d.ts.map +1 -1
  55. package/dist/remote/enroll.js +22 -1
  56. package/dist/remote/enroll.js.map +1 -1
  57. package/dist/remote/join.d.ts.map +1 -1
  58. package/dist/remote/join.js +10 -1
  59. package/dist/remote/join.js.map +1 -1
  60. package/dist/remote/peer-serve.d.ts.map +1 -1
  61. package/dist/remote/peer-serve.js +14 -0
  62. package/dist/remote/peer-serve.js.map +1 -1
  63. package/dist/remote/peer.d.ts +7 -0
  64. package/dist/remote/peer.d.ts.map +1 -1
  65. package/dist/remote/peer.js +25 -1
  66. package/dist/remote/peer.js.map +1 -1
  67. package/dist/remote/registry.d.ts +24 -2
  68. package/dist/remote/registry.d.ts.map +1 -1
  69. package/dist/remote/registry.js +76 -5
  70. package/dist/remote/registry.js.map +1 -1
  71. package/dist/server.d.ts.map +1 -1
  72. package/dist/server.js +16 -3
  73. package/dist/server.js.map +1 -1
  74. package/dist/session/manager.d.ts +5 -0
  75. package/dist/session/manager.d.ts.map +1 -1
  76. package/dist/session/manager.js +7 -2
  77. package/dist/session/manager.js.map +1 -1
  78. package/dist/session/pty.d.ts +17 -2
  79. package/dist/session/pty.d.ts.map +1 -1
  80. package/dist/session/pty.js +69 -9
  81. package/dist/session/pty.js.map +1 -1
  82. package/dist/supervisor.d.ts +44 -0
  83. package/dist/supervisor.d.ts.map +1 -0
  84. package/dist/supervisor.js +125 -0
  85. package/dist/supervisor.js.map +1 -0
  86. package/dist/update/host.d.ts +19 -0
  87. package/dist/update/host.d.ts.map +1 -0
  88. package/dist/update/host.js +56 -0
  89. package/dist/update/host.js.map +1 -0
  90. package/dist/update/install.d.ts +38 -0
  91. package/dist/update/install.d.ts.map +1 -0
  92. package/dist/update/install.js +81 -0
  93. package/dist/update/install.js.map +1 -0
  94. package/dist/update/post-install.d.ts +2 -0
  95. package/dist/update/post-install.d.ts.map +1 -0
  96. package/dist/update/post-install.js +39 -0
  97. package/dist/update/post-install.js.map +1 -0
  98. package/dist/update/restart.d.ts +31 -0
  99. package/dist/update/restart.d.ts.map +1 -0
  100. package/dist/update/restart.js +65 -0
  101. package/dist/update/restart.js.map +1 -0
  102. package/dist/update/resume.d.ts +5 -0
  103. package/dist/update/resume.d.ts.map +1 -0
  104. package/dist/update/resume.js +47 -0
  105. package/dist/update/resume.js.map +1 -0
  106. package/dist/update/updater.d.ts +57 -0
  107. package/dist/update/updater.d.ts.map +1 -0
  108. package/dist/update/updater.js +190 -0
  109. package/dist/update/updater.js.map +1 -0
  110. package/package.json +1 -1
  111. package/web/assets/{index-i7fXLKF0.js → index-BoqmaIyh.js} +9 -9
  112. package/web/assets/index-Czi_vAR-.css +1 -0
  113. package/web/index.html +2 -2
  114. package/web/assets/index-gfbbNQK4.css +0 -1
package/README.md CHANGED
@@ -216,6 +216,11 @@ back into the agent's terminal. Nothing is stored unless someone says yes.
216
216
  Every agent is also given a brief explaining its address, its peers, and that
217
217
  text arriving as `[from <address>] ...` is a colleague rather than the human.
218
218
 
219
+ A shell window (`shell`, `powershell`, or any profile that gets no brief) is
220
+ not an agent, and a message sent to one is a command: it is typed without the
221
+ `[from <address>]` prefix, which the shell would otherwise try to run. A shell
222
+ never replies, so the sender is told to read its screen for the output.
223
+
219
224
  ## Agent profiles
220
225
 
221
226
  An agent CLI is configuration, not code. Built-ins are `claude`, `codex`,
@@ -406,6 +411,31 @@ Two consequences worth knowing:
406
411
  - Resume relaunches in the **same working directory**, because that is how
407
412
  Claude Code finds a conversation. Move the folder and resume starts fresh.
408
413
 
414
+ ## Updating
415
+
416
+ The hub asks npm for a newer release shortly after it starts and every six
417
+ hours after that. When there is one, an **update** button appears next to the
418
+ version in the top bar. Nothing restarts until you press it. Then the hub
419
+ downloads the release, restarts on the same address in the same terminal,
420
+ and the canvas reconnects on its own. The agents that were running stop with
421
+ the old hub and are resumed by the new one, continuing their conversations.
422
+ (Stopping the hub yourself is different: those agents come back stopped, as
423
+ described under [State and restart](#state-and-restart).)
424
+
425
+ This works for `npx @kdonev/termscape` and for a global `npm install -g`. A
426
+ checkout of this repository updates the way checkouts do, so for one of those
427
+ the button only links to the release. `--no-update-check` (or
428
+ `TERMSCAPE_NO_UPDATE_CHECK=1`) turns the check off.
429
+
430
+ Other machines take the canvas's own build, not npm's. When one runs a
431
+ different version from the canvas, its row in the machines panel gets an
432
+ **update** button, so you pick when each machine restarts. A deployed machine
433
+ is redeployed over SSH. A joined one runs the join installer again by itself
434
+ (its output is in `~/.termscape/update.log` there) and rejoins as the same
435
+ machine. Either way, the agents that were running there are resumed. A joined machine one protocol version behind the canvas stays on the
436
+ canvas as *outdated* until you update it. Machines joined with 0.1.9 or
437
+ earlier can't update themselves yet, so re-run the join command on those once.
438
+
409
439
  ## Remote machines
410
440
 
411
441
  Add a machine in the panel. The hub is copied over SSH, installed, and started as a
@@ -434,7 +464,8 @@ could be talked into sending an attacker's text to a peer.
434
464
  - Every agent gets its own bearer token. The sender of a message is taken from
435
465
  that token, never from the arguments, so attribution cannot be forged.
436
466
  - Messages are length-capped, rate-limited per sender, and always arrive with a
437
- visible `[from <address>]` prefix.
467
+ visible `[from <address>]` prefix - except in a shell, where they arrive as
468
+ the bare command and are still recorded, sender included, in the message log.
438
469
  - Every delivery attempt is recorded with its outcome and shown in the message
439
470
  log. Nothing is delivered invisibly.
440
471
  - `spawn_agent` is capped per workspace, so a confused agent cannot recurse the
@@ -184,6 +184,16 @@ export declare const BUILTIN_PROFILES: Record<string, AgentProfile>;
184
184
  * agent and `none` for an unwired one.
185
185
  */
186
186
  export declare function briefMode(p: AgentProfile): 'flag' | 'typed' | 'none';
187
+ /**
188
+ * Whether this profile runs a plain terminal - a shell - rather than an agent.
189
+ *
190
+ * The same test as "gets no brief", and for the same reason: nothing in the
191
+ * window was ever told what a `[from ...]` line is. A shell does not read text
192
+ * typed at it, it runs it, so what is sent there is a command and is sent as
193
+ * one, with no attribution in front of it (issue 30). And it never answers:
194
+ * its output stays on its own screen, where `read_screen` is how to see it.
195
+ */
196
+ export declare function isPlainTerminal(p: AgentProfile): boolean;
187
197
  export declare class ProfileRegistry {
188
198
  private profiles;
189
199
  constructor(profiles?: Record<string, AgentProfile>);
@@ -1 +1 @@
1
- {"version":3,"file":"profiles.d.ts","sourceRoot":"","sources":["../../src/agents/profiles.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAItD;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,0EAA0E;IAC1E,GAAG,EAAE,OAAO,CAAC;IACb,mCAAmC;IACnC,MAAM,EAAE,OAAO,GAAG,WAAW,CAAC;IAC9B,6EAA6E;IAC7E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,UAAU,CAAC;IACnB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA+BG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IAClC;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IAItB;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAIlB;;;;;;;;;;;;OAYG;IACH,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,8CAA8C;IAC9C,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAa1C;AAOD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAmUzD,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,YAAY,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAEpE;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAA+B;gBAEnC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC;IAInD,oEAAoE;IACpE,MAAM,CAAC,IAAI,IAAI,eAAe;IA0C9B,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAIpC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY;IAMjC,IAAI,IAAI,YAAY,EAAE;IAItB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;CAIjC;AAED,+EAA+E;AAC/E,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAI5E;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,EAAE,CAElF"}
1
+ {"version":3,"file":"profiles.d.ts","sourceRoot":"","sources":["../../src/agents/profiles.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAItD;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,0EAA0E;IAC1E,GAAG,EAAE,OAAO,CAAC;IACb,mCAAmC;IACnC,MAAM,EAAE,OAAO,GAAG,WAAW,CAAC;IAC9B,6EAA6E;IAC7E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,UAAU,CAAC;IACnB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA+BG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IAClC;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IAItB;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAIlB;;;;;;;;;;;;OAYG;IACH,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,8CAA8C;IAC9C,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAa1C;AAOD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAmUzD,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,YAAY,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAEpE;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,YAAY,GAAG,OAAO,CAExD;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAA+B;gBAEnC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC;IAInD,oEAAoE;IACpE,MAAM,CAAC,IAAI,IAAI,eAAe;IA0C9B,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAIpC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY;IAMjC,IAAI,IAAI,YAAY,EAAE;IAItB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;CAIjC;AAED,+EAA+E;AAC/E,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAI5E;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,EAAE,CAElF"}
@@ -427,6 +427,18 @@ export const BUILTIN_PROFILES = {
427
427
  export function briefMode(p) {
428
428
  return p.brief ?? (p.mcp ? 'flag' : 'none');
429
429
  }
430
+ /**
431
+ * Whether this profile runs a plain terminal - a shell - rather than an agent.
432
+ *
433
+ * The same test as "gets no brief", and for the same reason: nothing in the
434
+ * window was ever told what a `[from ...]` line is. A shell does not read text
435
+ * typed at it, it runs it, so what is sent there is a command and is sent as
436
+ * one, with no attribution in front of it (issue 30). And it never answers:
437
+ * its output stays on its own screen, where `read_screen` is how to see it.
438
+ */
439
+ export function isPlainTerminal(p) {
440
+ return briefMode(p) === 'none';
441
+ }
430
442
  export class ProfileRegistry {
431
443
  profiles;
432
444
  constructor(profiles) {
@@ -1 +1 @@
1
- {"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../src/agents/profiles.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../src/agents/profiles.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,13 @@
1
1
  import { type Message } from '../protocol/index.js';
2
2
  import type { Store } from '../db/store.js';
3
3
  import type { SessionManager } from '../session/manager.js';
4
- import type { ProfileRegistry } from './profiles.js';
4
+ import { type ProfileRegistry } from './profiles.js';
5
5
  export interface DeliveryResult {
6
6
  delivered: boolean;
7
7
  deliveredAt: number | null;
8
8
  error?: string;
9
+ /** The target is a shell: the text went in as a command, unattributed. */
10
+ shell?: boolean;
9
11
  }
10
12
  /**
11
13
  * Delivers agent-to-agent messages.
@@ -1 +1 @@
1
- {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/agents/router.ts"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,OAAO,EACb,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAoBD;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,aAAa;IAItB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAN5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;gBAG1B,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,cAAc,EACxB,QAAQ,EAAE,eAAe,EACzB,SAAS,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI;IAGlD,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,cAAc;CAsDrE"}
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/agents/router.ts"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,OAAO,EACb,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAmB,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AAEtE,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0EAA0E;IAC1E,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAoBD;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,aAAa;IAItB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAN5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;gBAG1B,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,cAAc,EACxB,QAAQ,EAAE,eAAe,EACzB,SAAS,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI;IAGlD,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,cAAc;CAkErE"}
@@ -1,5 +1,7 @@
1
1
  import { randomUUID } from 'node:crypto';
2
2
  import { encodeInjection, formatMessage, INJECT_SUBMIT, MESSAGE_RATE_LIMIT, } from '../protocol/index.js';
3
+ import { debug } from '../debug.js';
4
+ import { isPlainTerminal } from './profiles.js';
3
5
  /** Simple fixed-window counter, per sender address. */
4
6
  class RateLimiter {
5
7
  hits = new Map();
@@ -60,6 +62,8 @@ export class MessageRouter {
60
62
  };
61
63
  this.store.insertMessage(m);
62
64
  this.onMessage(m);
65
+ debug('deliver', `message ${id} ${fromAddr} -> ${toAddr} (${body.length} chars): ${state}` +
66
+ (error ? ` - ${error}` : ''));
63
67
  return { delivered: state === 'delivered', deliveredAt: m.deliveredAt, error };
64
68
  };
65
69
  if (!this.limiter.check(fromAddr)) {
@@ -74,12 +78,16 @@ export class MessageRouter {
74
78
  }
75
79
  const profile = this.profiles.get(target.profile);
76
80
  const mode = profile?.inject ?? 'bracketed';
81
+ const shell = profile ? isPlainTerminal(profile) : false;
77
82
  try {
83
+ debug('deliver', `message ${id} typing into session ${target.id} (${toAddr}), inject ${mode}` +
84
+ (shell ? ', as a shell command' : ''));
78
85
  // Attribution comes from the hub's own record of who is calling, never
79
- // from the sender's arguments, so it cannot be spoofed.
80
- this.sessions.inject(target.id, encodeInjection(formatMessage(fromAddr, body), mode), INJECT_SUBMIT);
86
+ // from the sender's arguments, so it cannot be spoofed. Not for a shell,
87
+ // though: it would run `[from ...]` as part of the command line.
88
+ this.sessions.inject(target.id, encodeInjection(shell ? body : formatMessage(fromAddr, body), mode), INJECT_SUBMIT);
81
89
  pty.markBusy();
82
- return record('delivered');
90
+ return { ...record('delivered'), shell };
83
91
  }
84
92
  catch (err) {
85
93
  return record('failed', err.message);
@@ -1 +1 @@
1
- {"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/agents/router.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/agents/router.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"wiring.d.ts","sourceRoot":"","sources":["../../src/agents/wiring.ts"],"names":[],"mappings":"AAGA,OAAO,EAAa,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7D;;;;GAIG;AAEH,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,YAAY,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,gFAAgF;IAChF,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB;;;;;;OAMG;IACH,kBAAkB,EAAE,MAAM,CAAC;IAC3B;;;;;;;OAOG;IACH,cAAc,EAAE,MAAM,CAAC;IACvB;;;;;;OAMG;IACH,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEtD;AAOD,wBAAgB,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,YAAY,CAyD5D;AAsMD;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CA8GtD"}
1
+ {"version":3,"file":"wiring.d.ts","sourceRoot":"","sources":["../../src/agents/wiring.ts"],"names":[],"mappings":"AAGA,OAAO,EAAa,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7D;;;;GAIG;AAEH,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,YAAY,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,gFAAgF;IAChF,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB;;;;;;OAMG;IACH,kBAAkB,EAAE,MAAM,CAAC;IAC3B;;;;;;;OAOG;IACH,cAAc,EAAE,MAAM,CAAC;IACvB;;;;;;OAMG;IACH,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEtD;AAOD,wBAAgB,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,YAAY,CAyD5D;AA2MD;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAwHtD"}
@@ -148,6 +148,11 @@ function writeWiredFiles(input, paths) {
148
148
  { hooks: [{ type: 'command', command: hookCmd('waiting') }] },
149
149
  ],
150
150
  Stop: [{ hooks: [{ type: 'command', command: hookCmd('idle') }] }],
151
+ // A fresh start, a resume or a /clear: at its prompt, with no
152
+ // turn behind it for Stop to have reported. Without this the hub
153
+ // cannot tell whether a first instruction was taken, and presses
154
+ // no second Enter for one that was not.
155
+ SessionStart: [{ hooks: [{ type: 'command', command: hookCmd('start') }] }],
151
156
  },
152
157
  }
153
158
  : {}, null, 2));
@@ -275,7 +280,8 @@ always \`workspace/name\`, and every one of them appears in
275
280
  attached to it, with their workspaces and the agent CLIs each has
276
281
  installed. Call this before passing \`host\` to \`spawn_agent\`.
277
282
  - \`send_message\` — send text to another agent. It is typed directly into
278
- their terminal, as if a user had pasted it.
283
+ their terminal, as if a user had pasted it. Sent to a shell, it runs as a
284
+ command: see "Sending to a shell" below.
279
285
  - \`list_templates\` — the saved ways of starting an agent: what CLI each one
280
286
  runs, on what model, with what opening instruction. A template id is what
281
287
  \`spawn_agent\` takes as its \`profile\`.
@@ -334,6 +340,15 @@ Do not loop on \`read_screen\` to watch the other agent work. It shows you a
334
340
  half-typed answer at best, delivers nothing, and the wait does not end any
335
341
  sooner for having been watched. If you only want to know whether someone is
336
342
  still going, \`list_agents\` says idle or busy in one call.
343
+
344
+ ## Sending to a shell
345
+
346
+ Some windows on the canvas are plain shells, not agents — \`list_agents\`
347
+ shows their profile as \`shell\` or \`powershell\`. What you send one is run as
348
+ a command, exactly as written, with no \`[from ...]\` prefix, so send only the
349
+ command. A shell never replies: its output stays on its own screen. Call
350
+ \`read_screen\` on it to see what the command printed, and again if it was
351
+ still running.
337
352
  `;
338
353
  }
339
354
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"wiring.js","sourceRoot":"","sources":["../../src/agents/wiring.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wiring.js","sourceRoot":"","sources":["../../src/agents/wiring.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import type { parseArgs } from 'node:util';
1
2
  /**
2
3
  * The hub's command line, in a module of its own.
3
4
  *
@@ -53,6 +54,10 @@ export declare const CLI_OPTIONS: {
53
54
  readonly type: "boolean";
54
55
  readonly default: false;
55
56
  };
57
+ readonly 'no-update-check': {
58
+ readonly type: "boolean";
59
+ readonly default: false;
60
+ };
56
61
  readonly version: {
57
62
  readonly type: "boolean";
58
63
  readonly default: false;
@@ -62,4 +67,9 @@ export declare const CLI_OPTIONS: {
62
67
  readonly default: false;
63
68
  };
64
69
  };
70
+ /** What `parseArgs` makes of CLI_OPTIONS. */
71
+ export type CliValues = ReturnType<typeof parseArgs<{
72
+ options: typeof CLI_OPTIONS;
73
+ strict: true;
74
+ }>>['values'];
65
75
  //# sourceMappingURL=cli-args.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cli-args.d.ts","sourceRoot":"","sources":["../src/cli-args.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAeoD,CAAC"}
1
+ {"version":3,"file":"cli-args.d.ts","sourceRoot":"","sources":["../src/cli-args.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAE3C;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiBoD,CAAC;AAE7E,6CAA6C;AAC7C,MAAM,MAAM,SAAS,GAAG,UAAU,CAChC,OAAO,SAAS,CAAC;IAAE,OAAO,EAAE,OAAO,WAAW,CAAC;IAAC,MAAM,EAAE,IAAI,CAAA;CAAE,CAAC,CAChE,CAAC,QAAQ,CAAC,CAAC"}
package/dist/cli-args.js CHANGED
@@ -31,6 +31,8 @@ export const CLI_OPTIONS = {
31
31
  'no-open': { type: 'boolean', default: false },
32
32
  // The canvas opens in a window of its own unless this asks for a tab.
33
33
  browser: { type: 'boolean', default: false },
34
+ // Checking npm for a newer release is on unless this says otherwise.
35
+ 'no-update-check': { type: 'boolean', default: false },
34
36
  version: { type: 'boolean', default: false },
35
37
  help: { type: 'boolean', default: false },
36
38
  };
@@ -1 +1 @@
1
- {"version":3,"file":"cli-args.js","sourceRoot":"","sources":["../src/cli-args.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;IACxB,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;IAC7C,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;IACzB,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;IAC1B,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;IACxB,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;IAChC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;IACzB,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;IACzC,oEAAoE;IACpE,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;IAC9C,sEAAsE;IACtE,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;IAC5C,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;IAC5C,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;CACiC,CAAC"}
1
+ {"version":3,"file":"cli-args.js","sourceRoot":"","sources":["../src/cli-args.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;IACxB,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;IAC7C,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;IACzB,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;IAC1B,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;IACxB,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;IAChC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;IACzB,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;IACzC,oEAAoE;IACpE,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;IAC9C,sEAAsE;IACtE,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;IAC5C,qEAAqE;IACrE,iBAAiB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;IACtD,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;IAC5C,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;CACiC,CAAC"}
package/dist/cli.js CHANGED
@@ -1,269 +1,26 @@
1
1
  #!/usr/bin/env node
2
- import { mkdirSync, rmSync, writeFileSync } from 'node:fs';
3
2
  import { parseArgs } from 'node:util';
4
- import { Hub, HUB_VERSION } from './hub.js';
5
- import { serve, MEMORABLE_PORTS } from './server.js';
6
- import { mintClientToken } from './agents/tokens.js';
7
- import { paths } from './paths.js';
8
- import { listenPlan } from './remote/lan.js';
9
- import { joinCanvas } from './remote/join.js';
10
- import { openInBrowser } from './browser.js';
11
- import { openAppWindow } from './window/open-window.js';
12
- import { ProfileRegistry } from './agents/profiles.js';
13
- import { which } from './agents/resolve.js';
14
- import { debugTopics } from './debug.js';
3
+ import { fileURLToPath } from 'node:url';
15
4
  import { CLI_OPTIONS } from './cli-args.js';
16
- /** How long shutdown waits for open connections to close. See `shutdown`. */
17
- const SERVER_CLOSE_DEADLINE_MS = 2000;
18
- /**
19
- * Warn when no agent CLI is installed.
20
- *
21
- * Without this the first thing a new user does - start an agent - fails inside
22
- * a terminal window on the canvas, where the error is easy to miss and reads
23
- * like the hub is broken. Checking every profile that wires up MCP, rather
24
- * than "claude" specifically, keeps a custom ~/.termscape/agents.toml counted.
5
+ import { shouldSupervise, supervise } from './supervisor.js';
6
+ /*
7
+ * Deliberately almost empty. Deciding whether this process is the hub or the
8
+ * supervisor that runs it has to happen before anything loads a native
9
+ * module: the supervisor outlives every hub it starts, and on Windows a
10
+ * global update cannot replace a .node file any live process has loaded. So
11
+ * the hub is imported only on the branch that runs it.
25
12
  */
26
- function preflightAgents() {
27
- const agents = ProfileRegistry.load()
28
- .list()
29
- .filter((profile) => profile.mcp);
30
- if (agents.length === 0)
31
- return;
32
- if (agents.some((profile) => which(profile.command)))
33
- return;
34
- const names = agents.map((profile) => profile.command).join(', ');
35
- console.error(`[warn] no agent CLI found on PATH (looked for: ${names})`);
36
- console.error(' install one - https://claude.com/claude-code - or set');
37
- console.error(' an absolute "command" in ~/.termscape/agents.toml.');
38
- console.error(' Terminals with the "shell" profile still work.');
39
- console.error('');
40
- }
41
- async function main() {
13
+ async function run() {
42
14
  const { values } = parseArgs({ options: CLI_OPTIONS, strict: true });
43
- if (values.version) {
44
- console.log(HUB_VERSION);
15
+ const cliPath = fileURLToPath(import.meta.url);
16
+ if (shouldSupervise(values, cliPath)) {
17
+ await supervise(cliPath);
45
18
  return;
46
19
  }
47
- if (values.help) {
48
- console.log(`termscape ${HUB_VERSION}
49
-
50
- --port <n> port to bind; 0 lets the OS pick. Default: the first
51
- free memorable port (7777, 4242, ...)
52
- --listen <addr> bind address. Default: every interface, so the canvas is
53
- reachable from your network with its token and another
54
- machine can attach from the join page - the one page
55
- served *without* the token. "loopback" keeps the hub to
56
- this machine, and turns that page off with it
57
- --headless serve no web UI; used when running as a remote hub
58
- --token <t> client token to use instead of generating one
59
- --open open the canvas even when not on a terminal
60
- --no-open do not open the canvas; just print the url
61
- --browser open the canvas in the browser instead of its own
62
- window. Closing that window stops the hub; closing a
63
- browser tab does not
64
-
65
- Joining another machine's canvas:
66
-
67
- --join <url> dial that hub and put this machine on its canvas
68
- --join-token <t> single-use token from its join page; not needed once
69
- this machine has enrolled once
70
- --label <name> how to name this machine there (default: hostname)
71
- `);
72
- return;
73
- }
74
- preflightAgents();
75
- mkdirSync(paths.home(), { recursive: true });
76
- const clientToken = values.token ?? mintClientToken();
77
- writeFileSync(paths.tokenFile(), clientToken, { mode: 0o600 });
78
- // The join installer reads this to stop a previous hub before replacing its
79
- // files; on Windows a loaded .node cannot be deleted while it runs.
80
- writeFileSync(paths.pidFile(), String(process.pid));
81
- const plan = listenPlan(values.listen, { headless: values.headless });
82
- const hub = new Hub();
83
- const { app, origin, lanOrigin, lanAltOrigin, enrollOrigin, enrollAltOrigin, port, peerServer, } = await serve({
84
- hub,
85
- host: plan.host,
86
- enroll: plan.enroll,
87
- // The join page has to be typed by hand on another machine, so prefer a
88
- // port worth remembering unless one was asked for explicitly.
89
- port: values.port === undefined ? MEMORABLE_PORTS : Number(values.port),
90
- clientToken,
91
- headless: values.headless,
92
- });
93
- const url = `${origin}/?token=${clientToken}`;
94
- // A remote hub is parsed by the deployer, so keep this line machine-readable.
95
- console.log(`termscape hub ${HUB_VERSION} listening on ${origin}`);
96
- console.log(`TERMSCAPE_PORT=${port}`);
97
- // Said out loud because it is easy to leave on, and because a remote
98
- // session only traces if the hub on the *other* machine was started with
99
- // it too - a half-traced path is what makes an input look lost.
100
- const traced = debugTopics();
101
- if (traced.length > 0) {
102
- console.log(` tracing: ${traced.join(', ')} (TERMSCAPE_DEBUG)`);
103
- }
104
- /*
105
- * Binding wide and answering the join page is the default now, which makes
106
- * it news rather than a confirmation - so it is said first, before the URLs,
107
- * and it says what it costs before it says what it buys. The old banner put
108
- * this last, where it read as an acknowledgement of something the operator
109
- * had just typed.
110
- *
111
- * The way out is printed on the enrolling path too, not only the other one.
112
- * It is the branch where somebody might want it.
113
- */
114
- if (!values.headless && lanOrigin) {
115
- const where = lanOrigin.replace(/^http:\/\//, '');
116
- console.log(`\n on your network at ${where}`);
117
- if (enrollOrigin) {
118
- console.log(` anyone who can reach it can load the join page and`);
119
- console.log(` attach a machine to this canvas. Everything else`);
120
- console.log(` needs the token below.`);
121
- console.log(` --listen loopback keeps the hub to this machine.`);
122
- }
123
- else {
124
- console.log(` the canvas needs the token below, so this is worth`);
125
- console.log(` opening on a phone or a second screen.`);
126
- console.log(` --listen loopback keeps the hub to this machine.`);
127
- }
128
- }
129
- if (!values.headless)
130
- console.log(`\n open: ${url}`);
131
- // The canvas is worth opening from a phone or a second screen, and that
132
- // needs the token too - so offer the whole URL, not just the host.
133
- if (!values.headless && lanOrigin) {
134
- console.log(` or ${lanOrigin}/?token=${clientToken}`);
135
- // If the name does not resolve on the other machine, the IP always will.
136
- if (lanAltOrigin)
137
- console.log(` or ${lanAltOrigin}/?token=${clientToken}`);
138
- }
139
- if (enrollOrigin) {
140
- console.log(`\n enroll: ${enrollOrigin}/join`);
141
- if (enrollAltOrigin)
142
- console.log(` or ${enrollAltOrigin}/join`);
143
- }
144
- else if (!values.headless) {
145
- // Only two ways to get here now that the default enrolls: the operator
146
- // asked for loopback, or this machine has no address anyone could reach it
147
- // on. Saying which is the difference between a setting they chose and a
148
- // network they need to go and look at.
149
- const why = values.listen === undefined
150
- ? 'this machine has no address another machine could reach it on'
151
- : 'this hub is bound to loopback';
152
- console.log(`\n no join page: ${why}`);
153
- }
154
- if (!values.headless)
155
- console.log('');
156
- // The canvas hub asks us to stop when the user drops this host, so the
157
- // machine does not keep a hub running that belongs to nobody.
158
- // A join that was refused cannot be retried into working, and this hub was
159
- // started only to join. Stopping frees its install for a re-run.
160
- hub.on('joinFailed', (message) => {
161
- console.error(`[join] cannot join: ${message}`);
162
- void shutdown('join failed');
163
- });
164
- hub.on('peerShutdown', () => {
165
- console.log('\n[peer] the canvas dropped this host; stopping');
166
- void shutdown('peer');
167
- });
168
- let link = null;
169
- if (values.join) {
170
- link = joinCanvas({
171
- hub,
172
- peerServer,
173
- hubUrl: values.join,
174
- joinToken: values['join-token'],
175
- label: values.label,
176
- });
177
- }
178
- let shuttingDown = false;
179
- const shutdown = async (signal) => {
180
- if (shuttingDown)
181
- return;
182
- shuttingDown = true;
183
- console.log(`\n[${signal}] saving state...`);
184
- // Snapshots are forced here: this is the write that makes a clean restart
185
- // come back with the right screens.
186
- try {
187
- link?.stop();
188
- hub.shutdown();
189
- }
190
- catch (err) {
191
- // Stopping is the one thing this must not fail at. A throw here used to
192
- // skip the exit below and leave the hub up with nothing to stop it.
193
- console.error('[shutdown]', err instanceof Error ? err.message : err);
194
- }
195
- try {
196
- rmSync(paths.pidFile(), { force: true });
197
- }
198
- catch {
199
- // Best effort; a stale pid file is handled by whoever reads it.
200
- }
201
- /*
202
- * Closing the server is given a deadline rather than waited out. It waits
203
- * for every websocket to finish its close handshake, and a client that
204
- * never answers - a tab on a laptop that went to sleep, a machine on the
205
- * other end of a dead link, anything that opened a socket and went quiet -
206
- * held it open indefinitely. The canvas window had gone, the terminal was
207
- * still held, and only Ctrl+C gave it back. State is already saved by now;
208
- * all that is left to lose is a goodbye nobody is listening for.
209
- */
210
- await Promise.race([
211
- app.close().catch(() => {
212
- // Server already down.
213
- }),
214
- new Promise((resolve) => setTimeout(resolve, SERVER_CLOSE_DEADLINE_MS).unref()),
215
- ]);
216
- // node-pty on ConPTY keeps handles that can hold the loop open past close.
217
- process.exit(0);
218
- };
219
- for (const sig of ['SIGINT', 'SIGTERM']) {
220
- process.on(sig, () => void shutdown(sig));
221
- }
222
- process.on('uncaughtException', (err) => {
223
- console.error('[fatal]', err);
224
- void shutdown('uncaughtException');
225
- });
226
- // Node escalates an unhandled rejection to uncaughtException, which above
227
- // stops the hub. A peer refusing a request is a normal thing that must not
228
- // cost the user every agent running on this machine, so it is logged and
229
- // survived instead. Call sites still catch their own; this is the net.
230
- process.on('unhandledRejection', (reason) => {
231
- console.error('[unhandled]', reason instanceof Error ? reason.message : reason);
232
- });
233
- /*
234
- * Opening the canvas is the default, not a flag.
235
- *
236
- * The URL carries a token, so it is long and cannot be retyped - leaving
237
- * the user to copy it out of scrollback is most of the friction in a
238
- * one-command install. A headless hub has no UI to open, and a hub started
239
- * by a script or a supervisor has nobody watching, which is what the TTY
240
- * check stands in for. --open overrides that check; --no-open beats both.
241
- *
242
- * What opens is a window of the canvas's own, which is the app: closing it
243
- * stops the hub, as Ctrl+C would. --browser asks for a tab instead, and a
244
- * machine with no webview to show gets one anyway rather than nothing.
245
- * Opened after `shutdown` exists, since closing the window calls it.
246
- */
247
- const wantsCanvas = !values.headless &&
248
- !values['no-open'] &&
249
- (values.open || process.stdout.isTTY === true);
250
- if (wantsCanvas && values.browser) {
251
- openInBrowser(url);
252
- }
253
- else if (wantsCanvas) {
254
- openAppWindow(url, {
255
- onClosed: () => void shutdown('window closed'),
256
- onUnavailable: () => {
257
- console.error('[app] no native window here; opening the browser instead');
258
- openInBrowser(url);
259
- },
260
- onCrashed: (why) => {
261
- console.error(`[app] the window exited (${why}); the hub is still running at ${url}`);
262
- },
263
- });
264
- }
20
+ const { main } = await import('./main.js');
21
+ await main(values, cliPath);
265
22
  }
266
- main().catch((err) => {
23
+ run().catch((err) => {
267
24
  console.error(err);
268
25
  process.exit(1);
269
26
  });