aicodeman 1.30.0 → 1.32.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 (185) hide show
  1. package/README.md +7 -6
  2. package/dist/config/cli-registry/schema.d.ts +8 -0
  3. package/dist/config/cli-registry/schema.d.ts.map +1 -1
  4. package/dist/config/cli-registry/schema.js +29 -0
  5. package/dist/config/cli-registry/schema.js.map +1 -1
  6. package/dist/config/cli-registry/stock.d.ts.map +1 -1
  7. package/dist/config/cli-registry/stock.js +62 -7
  8. package/dist/config/cli-registry/stock.js.map +1 -1
  9. package/dist/config/cli-registry/types.d.ts +62 -0
  10. package/dist/config/cli-registry/types.d.ts.map +1 -1
  11. package/dist/config/remote-wake-limits.d.ts +23 -0
  12. package/dist/config/remote-wake-limits.d.ts.map +1 -0
  13. package/dist/config/remote-wake-limits.js +23 -0
  14. package/dist/config/remote-wake-limits.js.map +1 -0
  15. package/dist/custom-model-hosts.d.ts +32 -0
  16. package/dist/custom-model-hosts.d.ts.map +1 -1
  17. package/dist/custom-model-hosts.js.map +1 -1
  18. package/dist/custom-model-injection-apply.d.ts +29 -1
  19. package/dist/custom-model-injection-apply.d.ts.map +1 -1
  20. package/dist/custom-model-injection-apply.js +191 -5
  21. package/dist/custom-model-injection-apply.js.map +1 -1
  22. package/dist/custom-model-injection.d.ts +35 -9
  23. package/dist/custom-model-injection.d.ts.map +1 -1
  24. package/dist/custom-model-injection.js +37 -16
  25. package/dist/custom-model-injection.js.map +1 -1
  26. package/dist/mux-interface.d.ts +12 -0
  27. package/dist/mux-interface.d.ts.map +1 -1
  28. package/dist/remote-hosts.d.ts +20 -0
  29. package/dist/remote-hosts.d.ts.map +1 -1
  30. package/dist/remote-hosts.js +33 -0
  31. package/dist/remote-hosts.js.map +1 -1
  32. package/dist/remote-wake.d.ts +446 -0
  33. package/dist/remote-wake.d.ts.map +1 -0
  34. package/dist/remote-wake.js +880 -0
  35. package/dist/remote-wake.js.map +1 -0
  36. package/dist/session-env-clamp.d.ts +12 -7
  37. package/dist/session-env-clamp.d.ts.map +1 -1
  38. package/dist/session-env-clamp.js +12 -7
  39. package/dist/session-env-clamp.js.map +1 -1
  40. package/dist/session-submit-verifier.d.ts +44 -0
  41. package/dist/session-submit-verifier.d.ts.map +1 -0
  42. package/dist/session-submit-verifier.js +122 -0
  43. package/dist/session-submit-verifier.js.map +1 -0
  44. package/dist/session.d.ts +9 -0
  45. package/dist/session.d.ts.map +1 -1
  46. package/dist/session.js +42 -1
  47. package/dist/session.js.map +1 -1
  48. package/dist/tmux-manager.d.ts.map +1 -1
  49. package/dist/tmux-manager.js +9 -0
  50. package/dist/tmux-manager.js.map +1 -1
  51. package/dist/types/session.d.ts +26 -0
  52. package/dist/types/session.d.ts.map +1 -1
  53. package/dist/types/session.js.map +1 -1
  54. package/dist/web/public/admin-ui.js.gz +0 -0
  55. package/dist/web/public/api-client.c9b1cddc.js.gz +0 -0
  56. package/dist/web/public/app.a792bf71.js +38 -0
  57. package/dist/web/public/app.a792bf71.js.br +0 -0
  58. package/dist/web/public/app.a792bf71.js.gz +0 -0
  59. package/dist/web/public/approvals-ui.js.gz +0 -0
  60. package/dist/web/public/{constants.258b140f.js → constants.b26748e9.js} +123 -0
  61. package/dist/web/public/constants.b26748e9.js.br +0 -0
  62. package/dist/web/public/constants.b26748e9.js.gz +0 -0
  63. package/dist/web/public/cron-ui.js.gz +0 -0
  64. package/dist/web/public/entrance-animations.js.gz +0 -0
  65. package/dist/web/public/home-sessions.js.gz +0 -0
  66. package/dist/web/public/host-wake-ui.js +440 -0
  67. package/dist/web/public/host-wake-ui.js.br +0 -0
  68. package/dist/web/public/host-wake-ui.js.gz +0 -0
  69. package/dist/web/public/i18n.d22be5c4.js +1 -0
  70. package/dist/web/public/i18n.d22be5c4.js.br +0 -0
  71. package/dist/web/public/i18n.d22be5c4.js.gz +0 -0
  72. package/dist/web/public/{image-input.cd4b97c4.js → image-input.a216cf9e.js} +8 -4
  73. package/dist/web/public/image-input.a216cf9e.js.br +0 -0
  74. package/dist/web/public/image-input.a216cf9e.js.gz +0 -0
  75. package/dist/web/public/index.html +191 -12
  76. package/dist/web/public/index.html.br +0 -0
  77. package/dist/web/public/index.html.gz +0 -0
  78. package/dist/web/public/input-cjk.8bc46081.js.gz +0 -0
  79. package/dist/web/public/{keyboard-accessory.2cf04f17.js → keyboard-accessory.c1e7c7b7.js} +280 -15
  80. package/dist/web/public/keyboard-accessory.c1e7c7b7.js.br +0 -0
  81. package/dist/web/public/keyboard-accessory.c1e7c7b7.js.gz +0 -0
  82. package/dist/web/public/mobile-handlers.6f354a87.js.gz +0 -0
  83. package/dist/web/public/mobile-overview.js.gz +0 -0
  84. package/dist/web/public/mobile.6caaa28a.css.gz +0 -0
  85. package/dist/web/public/notification-manager.36ea4624.js.gz +0 -0
  86. package/dist/web/public/orchestrator-panel.js.gz +0 -0
  87. package/dist/web/public/{panels-ui.5b07ad14.js → panels-ui.28df5053.js} +5 -5
  88. package/dist/web/public/panels-ui.28df5053.js.br +0 -0
  89. package/dist/web/public/panels-ui.28df5053.js.gz +0 -0
  90. package/dist/web/public/ralph-panel.6de2d0f8.js.gz +0 -0
  91. package/dist/web/public/ralph-wizard.13a1831e.js.gz +0 -0
  92. package/dist/web/public/readmymind-ui.js.gz +0 -0
  93. package/dist/web/public/reboot-restore-ui.js.gz +0 -0
  94. package/dist/web/public/respawn-ui.ff0dae4c.js.gz +0 -0
  95. package/dist/web/public/sanitize-html.bc7078d6.js.gz +0 -0
  96. package/dist/web/public/session-lineage.js.gz +0 -0
  97. package/dist/web/public/session-ui.7df17fd3.js +88 -0
  98. package/dist/web/public/session-ui.7df17fd3.js.br +0 -0
  99. package/dist/web/public/session-ui.7df17fd3.js.gz +0 -0
  100. package/dist/web/public/settings-ui.df5ffb68.js +78 -0
  101. package/dist/web/public/settings-ui.df5ffb68.js.br +0 -0
  102. package/dist/web/public/settings-ui.df5ffb68.js.gz +0 -0
  103. package/dist/web/public/styles.74f312e5.css +1 -0
  104. package/dist/web/public/styles.74f312e5.css.br +0 -0
  105. package/dist/web/public/styles.74f312e5.css.gz +0 -0
  106. package/dist/web/public/subagent-windows.e6ca799f.js.gz +0 -0
  107. package/dist/web/public/sw.js.gz +0 -0
  108. package/dist/web/public/tab-rail-resize.42c24949.js.gz +0 -0
  109. package/dist/web/public/terminal-keycode229-recovery.fb91b25b.js.gz +0 -0
  110. package/dist/web/public/terminal-split.js +804 -0
  111. package/dist/web/public/terminal-split.js.br +0 -0
  112. package/dist/web/public/terminal-split.js.gz +0 -0
  113. package/dist/web/public/terminal-ui.32fbeaf6.js +2 -0
  114. package/dist/web/public/terminal-ui.32fbeaf6.js.br +0 -0
  115. package/dist/web/public/terminal-ui.32fbeaf6.js.gz +0 -0
  116. package/dist/web/public/ultracode-panel.js.gz +0 -0
  117. package/dist/web/public/ultracode-windows.js.gz +0 -0
  118. package/dist/web/public/upload.html.gz +0 -0
  119. package/dist/web/public/vendor/dompurify.min.js.gz +0 -0
  120. package/dist/web/public/vendor/marked.min.js.gz +0 -0
  121. package/dist/web/public/vendor/xterm-addon-fit.min.js.gz +0 -0
  122. package/dist/web/public/vendor/xterm-addon-serialize.min.js.gz +0 -0
  123. package/dist/web/public/vendor/xterm-addon-unicode11.min.js.gz +0 -0
  124. package/dist/web/public/vendor/xterm-addon-webgl.min.js.gz +0 -0
  125. package/dist/web/public/vendor/xterm-predictive-echo.bd6882b8.js.gz +0 -0
  126. package/dist/web/public/vendor/xterm-zerolag-input.6fee72f2.js.gz +0 -0
  127. package/dist/web/public/vendor/xterm.css.gz +0 -0
  128. package/dist/web/public/vendor/xterm.min.js.gz +0 -0
  129. package/dist/web/public/voice-input.c4b51eb6.js.gz +0 -0
  130. package/dist/web/public/voice-pcm-worklet.js.gz +0 -0
  131. package/dist/web/public/webview-tabs.js.gz +0 -0
  132. package/dist/web/routes/custom-model-routes.d.ts +173 -0
  133. package/dist/web/routes/custom-model-routes.d.ts.map +1 -1
  134. package/dist/web/routes/custom-model-routes.js +628 -11
  135. package/dist/web/routes/custom-model-routes.js.map +1 -1
  136. package/dist/web/routes/index.d.ts +1 -1
  137. package/dist/web/routes/index.d.ts.map +1 -1
  138. package/dist/web/routes/index.js +1 -1
  139. package/dist/web/routes/index.js.map +1 -1
  140. package/dist/web/routes/session-routes.d.ts +6 -1
  141. package/dist/web/routes/session-routes.d.ts.map +1 -1
  142. package/dist/web/routes/session-routes.js +448 -17
  143. package/dist/web/routes/session-routes.js.map +1 -1
  144. package/dist/web/schemas.d.ts +15 -0
  145. package/dist/web/schemas.d.ts.map +1 -1
  146. package/dist/web/schemas.js +76 -0
  147. package/dist/web/schemas.js.map +1 -1
  148. package/dist/web/server.d.ts +21 -0
  149. package/dist/web/server.d.ts.map +1 -1
  150. package/dist/web/server.js +142 -9
  151. package/dist/web/server.js.map +1 -1
  152. package/dist/web/sse-events.d.ts +25 -2
  153. package/dist/web/sse-events.d.ts.map +1 -1
  154. package/dist/web/sse-events.js +30 -3
  155. package/dist/web/sse-events.js.map +1 -1
  156. package/package.json +1 -1
  157. package/skills/codeman/SKILL.md +75 -26
  158. package/skills/codeman/preamble.sh +66 -19
  159. package/skills/codeman/reference/recipes.md +1 -1
  160. package/dist/web/public/app.6d2dc4e8.js +0 -38
  161. package/dist/web/public/app.6d2dc4e8.js.br +0 -0
  162. package/dist/web/public/app.6d2dc4e8.js.gz +0 -0
  163. package/dist/web/public/constants.258b140f.js.br +0 -0
  164. package/dist/web/public/constants.258b140f.js.gz +0 -0
  165. package/dist/web/public/i18n.5f897ed5.js +0 -1
  166. package/dist/web/public/i18n.5f897ed5.js.br +0 -0
  167. package/dist/web/public/i18n.5f897ed5.js.gz +0 -0
  168. package/dist/web/public/image-input.cd4b97c4.js.br +0 -0
  169. package/dist/web/public/image-input.cd4b97c4.js.gz +0 -0
  170. package/dist/web/public/keyboard-accessory.2cf04f17.js.br +0 -0
  171. package/dist/web/public/keyboard-accessory.2cf04f17.js.gz +0 -0
  172. package/dist/web/public/panels-ui.5b07ad14.js.br +0 -0
  173. package/dist/web/public/panels-ui.5b07ad14.js.gz +0 -0
  174. package/dist/web/public/session-ui.42b81477.js +0 -77
  175. package/dist/web/public/session-ui.42b81477.js.br +0 -0
  176. package/dist/web/public/session-ui.42b81477.js.gz +0 -0
  177. package/dist/web/public/settings-ui.58f1d756.js +0 -67
  178. package/dist/web/public/settings-ui.58f1d756.js.br +0 -0
  179. package/dist/web/public/settings-ui.58f1d756.js.gz +0 -0
  180. package/dist/web/public/styles.e6edfb0b.css +0 -1
  181. package/dist/web/public/styles.e6edfb0b.css.br +0 -0
  182. package/dist/web/public/styles.e6edfb0b.css.gz +0 -0
  183. package/dist/web/public/terminal-ui.4f8d5820.js +0 -2
  184. package/dist/web/public/terminal-ui.4f8d5820.js.br +0 -0
  185. package/dist/web/public/terminal-ui.4f8d5820.js.gz +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"remote-hosts.d.ts","sourceRoot":"","sources":["../src/remote-hosts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"remote-hosts.d.ts","sourceRoot":"","sources":["../src/remote-hosts.ts"],"names":[],"mappings":"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"}
@@ -496,6 +496,31 @@ export function remoteDisplayPath(remote) {
496
496
  const path = 'remotePath' in remote ? remote.remotePath : remote.path;
497
497
  return `${remote.username}@${remote.host}:${path}`;
498
498
  }
499
+ /**
500
+ * Refresh HOST-level config on a RESTORED `SessionRemote`.
501
+ *
502
+ * A session's `remote` block is persisted at launch time (mux-sessions.json /
503
+ * state.json) and recovery uses that snapshot, so a field ADDED to the host config
504
+ * later never reaches an already-running session — not even across a Codeman
505
+ * restart. That is exactly how a `wakeCommand` added to `remote-hosts.json` would
506
+ * silently do nothing until the session is relaunched (which for an owned remote
507
+ * session means killing the remote tmux).
508
+ *
509
+ * Deliberately narrow: ONLY `wakeCommand`/`wakeMac` are taken from the host config,
510
+ * and the host is authoritative for them (removing one in the config turns that
511
+ * wake path off again). The other host-level fields (`commands`, ssh options) stay as
512
+ * persisted so this cannot silently change how an existing pane connects.
513
+ */
514
+ export function rehydrateRemoteHostFields(remote, hostsById) {
515
+ if (!remote)
516
+ return remote;
517
+ const host = hostsById.get(remote.hostId);
518
+ if (!host)
519
+ return remote;
520
+ if (remote.wakeCommand === host.wakeCommand && remote.wakeMac === host.wakeMac)
521
+ return remote;
522
+ return { ...remote, wakeCommand: host.wakeCommand, wakeMac: host.wakeMac };
523
+ }
499
524
  export function toSessionRemote(host, remoteCase) {
500
525
  return {
501
526
  hostId: host.id,
@@ -505,6 +530,10 @@ export function toSessionRemote(host, remoteCase) {
505
530
  port: host.port,
506
531
  remotePath: remoteCase.remotePath,
507
532
  commands: host.commands,
533
+ // Wake-on-LAN command/MAC travel with the session so the input route can wake a
534
+ // sleeping host without a second config read (see remote-wake.ts).
535
+ wakeCommand: host.wakeCommand,
536
+ wakeMac: host.wakeMac,
508
537
  // COD-105 — the COD-104 launch path creates the remote session, so we own it
509
538
  // (an explicit kill may propagate a remote kill-session). Discovered+attached
510
539
  // sessions go through `toAttachedSessionRemote` with `owned: false`.
@@ -538,6 +567,10 @@ export function toAttachedSessionRemote(host, remoteSessionName, remotePath) {
538
567
  port: host.port,
539
568
  remotePath,
540
569
  commands: host.commands,
570
+ // An attached session can be woken exactly the same way — the identity of the
571
+ // creator does not change whether the host is asleep.
572
+ wakeCommand: host.wakeCommand,
573
+ wakeMac: host.wakeMac,
541
574
  // Discovered + attached — another Codeman created it. Detach-not-kill.
542
575
  owned: false,
543
576
  remoteSessionName,
@@ -1 +1 @@
1
- {"version":3,"file":"remote-hosts.js","sourceRoot":"","sources":["../src/remote-hosts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAC;AAU3D,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC,MAAM,iBAAiB,GAAG,mBAAmB,CAAC;AAC9C,MAAM,iBAAiB,GAAG,mBAAmB,CAAC;AAE9C,MAAM,UAAU,eAAe,CAAC,SAAiB;IAC/C,OAAO,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,SAAiB;IAC/C,OAAO,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;AAC5C,CAAC;AAED,KAAK,UAAU,aAAa,CAAI,IAAY;IAC1C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAE,MAAc,CAAC,CAAC,CAAC,EAAE,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,cAAc,CAAI,SAAiB,EAAE,IAAY,EAAE,KAAU;IAC1E,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtE,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,SAAiB;IACrD,OAAO,aAAa,CAAa,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,SAAiB,EAAE,KAAmB;IAC3E,MAAM,cAAc,CAAC,SAAS,EAAE,eAAe,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,SAAiB;IACrD,OAAO,aAAa,CAAa,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,SAAiB,EAAE,KAAmB;IAC3E,MAAM,cAAc,CAAC,SAAS,EAAE,eAAe,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,CAAC;AACrE,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,kBAAkB,GAAG,qBAAqB,CAAC;AAEjD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,uBAAuB,CAAC,OAAe;IACrD,OAAO,QAAQ,kBAAkB,aAAa,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;AACvE,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,iBAAiB,CAAC,IAAiB,EAAE,QAA6B;IACzE,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACzC,IAAI,OAAO,IAAI,UAAU,IAAI,OAAO;QAAE,OAAO,IAAI,CAAC;IAClD,OAAO,OAAO,EAAE,OAAO,IAAI,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AACjE,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,2BAA2B,CAAC,IAAiB;IAC3D,0FAA0F;IAC1F,yFAAyF;IACzF,sFAAsF;IACtF,2FAA2F;IAC3F,MAAM,YAAY,GAAG,QAAQ,kBAAkB,QAAQ,CAAC;IACxD,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC9C,OAAO,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,uBAAuB,CAAC,GAAG,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAA2C;IACzE,OAAO,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;AACzC,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,OAAO,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,GAAG,CAAC;AAChD,CAAC;AAED;;;;;;GAMG;AACH,SAAS,kBAAkB,CAAC,YAAoB;IAC9C,IAAI,YAAY,KAAK,GAAG;QAAE,OAAO,OAAO,EAAE,CAAC;IAC3C,IAAI,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACjF,IAAI,YAAY,KAAK,OAAO;QAAE,OAAO,OAAO,EAAE,CAAC;IAC/C,IAAI,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IACnG,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAmD;IACxF,MAAM,KAAK,GAAa,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;IACpD,MAAM,iBAAiB,GAAG,CAAC,MAAM,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACtG,IAAI,CAAC,iBAAiB;QAAE,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAC3D,IAAI,MAAM,CAAC,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACjD,IAAI,MAAM,CAAC,YAAY;QAAE,KAAK,CAAC,IAAI,CAAC,MAAM,WAAW,CAAC,kBAAkB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC;IAClG,IAAI,MAAM,CAAC,QAAQ;QAAE,KAAK,CAAC,IAAI,CAAC,MAAM,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACtE,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,MAAM,WAAW,CAAC,2BAA2B,MAAM,CAAC,UAAU,QAAQ,CAAC,EAAE,CAAC,CAAC;IACxF,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,eAAe,IAAI,EAAE,EAAE,CAAC;QAC/C,KAAK,CAAC,IAAI,CAAC,MAAM,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,2BAA2B,CACzC,IAAuE;IAEvE,sFAAsF;IACtF,OAAO,CAAC,GAAG,sBAAsB,CAAC,IAAI,CAAC,EAAE,eAAe,CAAC,IAAI,CAAC,EAAE,mBAAmB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACjG,CAAC;AAUD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,IAAuE;IAEvE,yEAAyE;IACzE,qEAAqE;IACrE,6EAA6E;IAC7E,4EAA4E;IAC5E,wBAAwB;IACxB,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;QACvB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC/C,CAAC;IACD,MAAM,OAAO,GAAG,2BAA2B,CAAC,IAAI,CAAC,CAAC;IAClD,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QACjE,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QAC/B,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,eAAe,IAAI,CAAC,IAAI,mDAAmD;aACnF,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAChC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,MAAM,GACV,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,QAAQ,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,CAAE,GAA4B,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9G,2EAA2E;QAC3E,yDAAyD;QACzD,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YAClB,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,wCAAwC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE;aAC7E,CAAC;QACJ,CAAC;QACD,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,eAAe,IAAI,CAAC,IAAI,mDAAmD;SACnF,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,SAAS,YAAY,CAAC,IAAiB;IACrC,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,iCAAiC,CAC/C,IAAuE,EACvE,IAAiB;IAEjB,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,OAAO;QACL,GAAG,sBAAsB,CAAC,IAAI,CAAC;QAC/B,eAAe,CAAC,IAAI,CAAC;QACrB,WAAW,CAAC,uBAAuB,CAAC,GAAG,GAAG,YAAY,CAAC,CAAC;KACzD,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACd,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,IAAuE,EACvE,IAAiB;IAEjB,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IACzC,MAAM,OAAO,GAAG,iCAAiC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC9D,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QACjE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAC5C,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,8BAA8B,CAC5C,IAAuE,EACvE,iBAAyB;IAEzB,MAAM,CAAC,GAAG,EAAE,GAAG,cAAc,CAAC,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAC9D,MAAM,SAAS,GAAG,yCAAyC,WAAW,CAAC,iBAAiB,CAAC,cAAc,CAAC;IACxG,OAAO,CAAC,GAAG,EAAE,GAAG,cAAc,EAAE,eAAe,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC3F,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,MAAyE,EACzE,iBAAyB;IAEzB,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACpC,MAAM,OAAO,GAAG,8BAA8B,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC1E,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QAC9C,OAAO,uBAAuB,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,GAAG,GAA2C,CAAC;QACtD,OAAO,uBAAuB,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC;IAChG,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAmB,EAAE,MAAe;IAC1E,IAAI,MAAM;QAAE,OAAO,SAAS,CAAC;IAC7B,IAAI,IAAI,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5B,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,GAAG;QAAE,OAAO,SAAS,CAAC;IACpD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,8BAA8B,CAC5C,IAAuE;IAEvE,MAAM,CAAC,GAAG,EAAE,GAAG,cAAc,CAAC,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAC9D,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,sBAAsB,EAAE,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3F,8EAA8E;IAC9E,6EAA6E;IAC7E,8EAA8E;IAC9E,MAAM,SAAS,GACb,gIAAgI,CAAC;IACnI,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC;IAC1D,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAc;IACnD,MAAM,GAAG,GAAwB,EAAE,CAAC;IACpC,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,2EAA2E;QAC3E,oEAAoE;QACpE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAClC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAChC,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,CAAC,GAAG,IAAI,CAAC;QACzD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,SAAS;QAC3C,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;QACnC,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;QACnC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,SAAS;QACrE,kFAAkF;QAClF,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/C,MAAM,eAAe,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChG,GAAG,CAAC,IAAI,CAAC;YACP,IAAI;YACJ,QAAQ,EAAE,eAAe,GAAG,CAAC;YAC7B,eAAe;YACf,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;YAC5B,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;SAC7B,CAAC,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,MAAyE;IAEzE,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;QACvB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,OAAO,GAAG,8BAA8B,CAAC,MAAM,CAAC,CAAC;IACvD,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QACjE,OAAO,sBAAsB,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,4EAA4E;QAC5E,uEAAuE;QACvE,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,MAAkH;IAElH,MAAM,IAAI,GAAG,YAAY,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;IACtE,OAAO,GAAG,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAgB,EAAE,UAAsB;IACtE,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,EAAE;QACf,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,UAAU,EAAE,UAAU,CAAC,UAAU;QACjC,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,6EAA6E;QAC7E,8EAA8E;QAC9E,qEAAqE;QACrE,KAAK,EAAE,IAAI;QACX,6EAA6E;QAC7E,8EAA8E;QAC9E,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,eAAe,EAAE,IAAI,CAAC,eAAe;KACtC,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,uBAAuB,CACrC,IAAgB,EAChB,iBAAyB,EACzB,UAAkB;IAElB,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,EAAE;QACf,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,UAAU;QACV,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,uEAAuE;QACvE,KAAK,EAAE,KAAK;QACZ,iBAAiB;QACjB,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,eAAe,EAAE,IAAI,CAAC,eAAe;KACtC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"remote-hosts.js","sourceRoot":"","sources":["../src/remote-hosts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAC;AAU3D,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC,MAAM,iBAAiB,GAAG,mBAAmB,CAAC;AAC9C,MAAM,iBAAiB,GAAG,mBAAmB,CAAC;AAE9C,MAAM,UAAU,eAAe,CAAC,SAAiB;IAC/C,OAAO,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,SAAiB;IAC/C,OAAO,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;AAC5C,CAAC;AAED,KAAK,UAAU,aAAa,CAAI,IAAY;IAC1C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAE,MAAc,CAAC,CAAC,CAAC,EAAE,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,cAAc,CAAI,SAAiB,EAAE,IAAY,EAAE,KAAU;IAC1E,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtE,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,SAAiB;IACrD,OAAO,aAAa,CAAa,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,SAAiB,EAAE,KAAmB;IAC3E,MAAM,cAAc,CAAC,SAAS,EAAE,eAAe,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,SAAiB;IACrD,OAAO,aAAa,CAAa,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,SAAiB,EAAE,KAAmB;IAC3E,MAAM,cAAc,CAAC,SAAS,EAAE,eAAe,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,CAAC;AACrE,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,kBAAkB,GAAG,qBAAqB,CAAC;AAEjD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,uBAAuB,CAAC,OAAe;IACrD,OAAO,QAAQ,kBAAkB,aAAa,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;AACvE,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,iBAAiB,CAAC,IAAiB,EAAE,QAA6B;IACzE,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACzC,IAAI,OAAO,IAAI,UAAU,IAAI,OAAO;QAAE,OAAO,IAAI,CAAC;IAClD,OAAO,OAAO,EAAE,OAAO,IAAI,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AACjE,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,2BAA2B,CAAC,IAAiB;IAC3D,0FAA0F;IAC1F,yFAAyF;IACzF,sFAAsF;IACtF,2FAA2F;IAC3F,MAAM,YAAY,GAAG,QAAQ,kBAAkB,QAAQ,CAAC;IACxD,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC9C,OAAO,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,uBAAuB,CAAC,GAAG,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAA2C;IACzE,OAAO,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;AACzC,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,OAAO,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,GAAG,CAAC;AAChD,CAAC;AAED;;;;;;GAMG;AACH,SAAS,kBAAkB,CAAC,YAAoB;IAC9C,IAAI,YAAY,KAAK,GAAG;QAAE,OAAO,OAAO,EAAE,CAAC;IAC3C,IAAI,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACjF,IAAI,YAAY,KAAK,OAAO;QAAE,OAAO,OAAO,EAAE,CAAC;IAC/C,IAAI,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IACnG,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAmD;IACxF,MAAM,KAAK,GAAa,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;IACpD,MAAM,iBAAiB,GAAG,CAAC,MAAM,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACtG,IAAI,CAAC,iBAAiB;QAAE,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAC3D,IAAI,MAAM,CAAC,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACjD,IAAI,MAAM,CAAC,YAAY;QAAE,KAAK,CAAC,IAAI,CAAC,MAAM,WAAW,CAAC,kBAAkB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC;IAClG,IAAI,MAAM,CAAC,QAAQ;QAAE,KAAK,CAAC,IAAI,CAAC,MAAM,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACtE,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,MAAM,WAAW,CAAC,2BAA2B,MAAM,CAAC,UAAU,QAAQ,CAAC,EAAE,CAAC,CAAC;IACxF,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,eAAe,IAAI,EAAE,EAAE,CAAC;QAC/C,KAAK,CAAC,IAAI,CAAC,MAAM,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,2BAA2B,CACzC,IAAuE;IAEvE,sFAAsF;IACtF,OAAO,CAAC,GAAG,sBAAsB,CAAC,IAAI,CAAC,EAAE,eAAe,CAAC,IAAI,CAAC,EAAE,mBAAmB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACjG,CAAC;AAUD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,IAAuE;IAEvE,yEAAyE;IACzE,qEAAqE;IACrE,6EAA6E;IAC7E,4EAA4E;IAC5E,wBAAwB;IACxB,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;QACvB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC/C,CAAC;IACD,MAAM,OAAO,GAAG,2BAA2B,CAAC,IAAI,CAAC,CAAC;IAClD,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QACjE,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QAC/B,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,eAAe,IAAI,CAAC,IAAI,mDAAmD;aACnF,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAChC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,MAAM,GACV,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,QAAQ,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,CAAE,GAA4B,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9G,2EAA2E;QAC3E,yDAAyD;QACzD,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YAClB,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,wCAAwC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE;aAC7E,CAAC;QACJ,CAAC;QACD,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,eAAe,IAAI,CAAC,IAAI,mDAAmD;SACnF,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,SAAS,YAAY,CAAC,IAAiB;IACrC,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,iCAAiC,CAC/C,IAAuE,EACvE,IAAiB;IAEjB,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,OAAO;QACL,GAAG,sBAAsB,CAAC,IAAI,CAAC;QAC/B,eAAe,CAAC,IAAI,CAAC;QACrB,WAAW,CAAC,uBAAuB,CAAC,GAAG,GAAG,YAAY,CAAC,CAAC;KACzD,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACd,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,IAAuE,EACvE,IAAiB;IAEjB,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IACzC,MAAM,OAAO,GAAG,iCAAiC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC9D,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QACjE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAC5C,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,8BAA8B,CAC5C,IAAuE,EACvE,iBAAyB;IAEzB,MAAM,CAAC,GAAG,EAAE,GAAG,cAAc,CAAC,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAC9D,MAAM,SAAS,GAAG,yCAAyC,WAAW,CAAC,iBAAiB,CAAC,cAAc,CAAC;IACxG,OAAO,CAAC,GAAG,EAAE,GAAG,cAAc,EAAE,eAAe,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC3F,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,MAAyE,EACzE,iBAAyB;IAEzB,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACpC,MAAM,OAAO,GAAG,8BAA8B,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC1E,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QAC9C,OAAO,uBAAuB,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,GAAG,GAA2C,CAAC;QACtD,OAAO,uBAAuB,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC;IAChG,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAmB,EAAE,MAAe;IAC1E,IAAI,MAAM;QAAE,OAAO,SAAS,CAAC;IAC7B,IAAI,IAAI,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5B,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,GAAG;QAAE,OAAO,SAAS,CAAC;IACpD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,8BAA8B,CAC5C,IAAuE;IAEvE,MAAM,CAAC,GAAG,EAAE,GAAG,cAAc,CAAC,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAC9D,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,sBAAsB,EAAE,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3F,8EAA8E;IAC9E,6EAA6E;IAC7E,8EAA8E;IAC9E,MAAM,SAAS,GACb,gIAAgI,CAAC;IACnI,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC;IAC1D,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAc;IACnD,MAAM,GAAG,GAAwB,EAAE,CAAC;IACpC,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,2EAA2E;QAC3E,oEAAoE;QACpE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAClC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAChC,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,CAAC,GAAG,IAAI,CAAC;QACzD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,SAAS;QAC3C,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;QACnC,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;QACnC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,SAAS;QACrE,kFAAkF;QAClF,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/C,MAAM,eAAe,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChG,GAAG,CAAC,IAAI,CAAC;YACP,IAAI;YACJ,QAAQ,EAAE,eAAe,GAAG,CAAC;YAC7B,eAAe;YACf,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;YAC5B,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;SAC7B,CAAC,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,MAAyE;IAEzE,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;QACvB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,OAAO,GAAG,8BAA8B,CAAC,MAAM,CAAC,CAAC;IACvD,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QACjE,OAAO,sBAAsB,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,4EAA4E;QAC5E,uEAAuE;QACvE,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,MAAkH;IAElH,MAAM,IAAI,GAAG,YAAY,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;IACtE,OAAO,GAAG,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC;AACrD,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,yBAAyB,CACvC,MAAqB,EACrB,SAA0C;IAE1C,IAAI,CAAC,MAAM;QAAE,OAAO,MAAM,CAAC;IAC3B,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC1C,IAAI,CAAC,IAAI;QAAE,OAAO,MAAM,CAAC;IACzB,IAAI,MAAM,CAAC,WAAW,KAAK,IAAI,CAAC,WAAW,IAAI,MAAM,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO;QAAE,OAAO,MAAM,CAAC;IAC9F,OAAO,EAAE,GAAG,MAAM,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAgB,EAAE,UAAsB;IACtE,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,EAAE;QACf,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,UAAU,EAAE,UAAU,CAAC,UAAU;QACjC,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,gFAAgF;QAChF,mEAAmE;QACnE,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,6EAA6E;QAC7E,8EAA8E;QAC9E,qEAAqE;QACrE,KAAK,EAAE,IAAI;QACX,6EAA6E;QAC7E,8EAA8E;QAC9E,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,eAAe,EAAE,IAAI,CAAC,eAAe;KACtC,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,uBAAuB,CACrC,IAAgB,EAChB,iBAAyB,EACzB,UAAkB;IAElB,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,EAAE;QACf,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,UAAU;QACV,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,8EAA8E;QAC9E,sDAAsD;QACtD,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,uEAAuE;QACvE,KAAK,EAAE,KAAK;QACZ,iBAAiB;QACjB,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,eAAe,EAAE,IAAI,CAAC,eAAe;KACtC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,446 @@
1
+ /**
2
+ * @fileoverview Wake a SLEEPING remote host from user input (user-triggered Wake-on-LAN).
3
+ *
4
+ * A durable remote session survives SSH drops (COD-104) and auto-reconnects
5
+ * (COD-108), but nothing brings the HOST back: if the remote machine suspended,
6
+ * the local tmux pane's `ssh` child stalls silently. `tmux send-keys` then
7
+ * SUCCEEDS against a pane that will never deliver the bytes, so typed input is
8
+ * lost with no error anywhere — the failure this module exists to close.
9
+ *
10
+ * Design (deliberately narrow, see docs/remote-sessions.md §Wake-on-LAN):
11
+ * - An EXPLICIT request wakes a host, and nothing else: user input on an
12
+ * established session (`handleInput`), the wake button (`ensureAwake`), or the
13
+ * user's own session create/attach request (`ensureHostAwake`, wired in the HTTP
14
+ * routes). Everything that runs on a TIMER — the auto-reconnect watcher, boot
15
+ * recovery, the reachability probe, session discovery — must never wake one, or
16
+ * a host would be re-woken ~45 s after each suspend and could never stay asleep
17
+ * (the "keepalive pings a sleeping host" failure already solved for a different
18
+ * consumer by `hufflepuff-mcp-lazy`). The create path is deliberately wired in
19
+ * `session-routes.ts` and NOT in the shared session service, because
20
+ * `cron-service.ts` builds sessions there without a user waiting on the answer.
21
+ * - Detection is a cheap TCP connect to the SSH port (no auth, no ssh client,
22
+ * a few hundred bytes — below any meaningful activity threshold), throttled
23
+ * per session. No SSH keepalive is added to the launch command: keepalives
24
+ * would move bytes into an otherwise idle connection every interval, which is
25
+ * exactly the "an open pipe keeps the host awake" bug the remote-side idle
26
+ * detector was rewritten to avoid.
27
+ * - While a wake is in flight, input is BUFFERED and flushed in order once the
28
+ * pane is reattached, so the user's first characters after a long pause are
29
+ * not the ones that get eaten.
30
+ *
31
+ * The pure decisions and the IO are separated so the decision table can be
32
+ * unit-tested without tmux, ssh, or a real host.
33
+ *
34
+ * @module remote-wake
35
+ */
36
+ /** Minimum spacing between two reachability probes for the same session. */
37
+ export declare const REMOTE_WAKE_PROBE_MIN_INTERVAL_MS = 30000;
38
+ /** TCP-connect timeout for a reachability probe (host awake ≈ a few ms). */
39
+ export declare const REMOTE_WAKE_PROBE_TIMEOUT_MS = 1500;
40
+ /** Poll spacing while waiting for a woken host to accept SSH again. */
41
+ export declare const REMOTE_WAKE_READY_INTERVAL_MS = 1500;
42
+ /** Bounded wait for the host to come back after the wake command ran. */
43
+ export declare const REMOTE_WAKE_READY_TIMEOUT_MS = 90000;
44
+ /**
45
+ * Budget for a wake that an HTTP REQUEST is waiting on (session create/attach).
46
+ * Deliberately shorter than {@link REMOTE_WAKE_READY_TIMEOUT_MS}: the dashboard is
47
+ * served through a reverse proxy whose default `proxy_read_timeout` is 60 s, so a
48
+ * 90 s wait would be cut off AT THE PROXY while the session was still being built —
49
+ * the browser reports a failure for a session that exists. The budget has to cover
50
+ * the WHOLE request, not just the wait: 40 s here + the 1.5 s reachability probe +
51
+ * the tmux prereq probe's own 15 s timeout = 56.5 s worst case, still under 60 s.
52
+ * ⚠ The wake ITSELF counts against this, which the original arithmetic omitted: a
53
+ * `command` target can spend REMOTE_WAKE_COMMAND_TIMEOUT_MS before the readiness poll
54
+ * begins, which would have made the real worst case ~68 s. `_wakeAndWait` therefore
55
+ * subtracts the wake's measured elapsed time from this budget rather than adding to it.
56
+ * A warm S3 resume measures ~12 s, so 40 s is >3× the observed wake.
57
+ */
58
+ export declare const REMOTE_WAKE_REQUEST_READY_TIMEOUT_MS = 40000;
59
+ /** The wake command itself must not hang the wake flow. */
60
+ export declare const REMOTE_WAKE_COMMAND_TIMEOUT_MS = 10000;
61
+ /**
62
+ * Settle time between respawning the ssh pane and flushing buffered input: the
63
+ * respawned `ssh` needs a moment to run `tmux -L codeman-remote … -A` and attach,
64
+ * and bytes written into a still-connecting pane land in nothing.
65
+ */
66
+ export declare const REMOTE_WAKE_ATTACH_SETTLE_MS = 1500;
67
+ /**
68
+ * Cap on buffered input per session while a host is being woken. 4 KB is a lot
69
+ * of typing for a ~10 s wake; beyond it the OLDEST bytes are dropped (keeping the
70
+ * tail preserves what the user just typed, and a silently unbounded buffer would
71
+ * be a memory leak keyed on user input).
72
+ */
73
+ export declare const REMOTE_WAKE_PENDING_MAX_BYTES = 4096;
74
+ /** Default SSH port used when the host config has no explicit `port`. */
75
+ export declare const DEFAULT_SSH_PORT = 22;
76
+ /** What the input path should do with a chunk of user input. Pure. */
77
+ export type RemoteInputAction = 'deliver' | 'probe' | 'buffer';
78
+ /**
79
+ * The caller-facing outcome of {@link RemoteWakeRegistry.handleInput}: either the
80
+ * caller writes the bytes as usual, or the registry took ownership of them.
81
+ */
82
+ export type RemoteInputOutcome = 'deliver' | 'buffered' | 'dropped';
83
+ /**
84
+ * Decide what to do with an input chunk on an input route. Mirrors
85
+ * {@link RemoteWakeRegistry.handleInput} so the throttle table has exactly ONE
86
+ * definition and is unit-testable:
87
+ *
88
+ * - a wake already in flight → buffer (the flush owns delivery),
89
+ * - no wake command configured → deliver (feature off, today's behavior),
90
+ * - the last probe said "down" → buffer (no second probe; re-probing a known
91
+ * sleeping host on every keystroke would add seconds of latency per character),
92
+ * - never probed / throttle window elapsed → probe,
93
+ * - probed "up" inside the window → deliver.
94
+ *
95
+ * Pure — no clock, no IO.
96
+ */
97
+ export declare function decideRemoteInputAction(args: {
98
+ hasWakeTarget: boolean;
99
+ waking: boolean;
100
+ probeAgeMs: number;
101
+ lastReachable?: boolean;
102
+ minProbeIntervalMs?: number;
103
+ }): RemoteInputAction;
104
+ /**
105
+ * Append `data` to the pending buffer, dropping the OLDEST whole chunks when the cap
106
+ * is exceeded. Returns the resulting buffer — the SAME array reference when the chunk
107
+ * was rejected, so the caller can tell the two apart. Pure.
108
+ *
109
+ * A chunk LARGER than the cap is dropped outright rather than trimmed: one paste is
110
+ * one `input` value, and it was never typed character by character, so delivering its
111
+ * tail would execute a fragment of it (with the trailing carriage return, if the paste
112
+ * had one) — a partial command the user never sent. Keeping the tail is right for
113
+ * typing, where the newest bytes are the ones the user just produced, and wrong for a
114
+ * chunk that arrived whole.
115
+ */
116
+ export declare function appendBoundedPending(pending: string[], data: string, maxBytes?: number): string[];
117
+ /** The remote fields the wake flow needs. Structurally satisfied by `SessionRemote`. */
118
+ export interface WakeableRemote {
119
+ wakeCommand?: string;
120
+ wakeMac?: string;
121
+ hostId: string;
122
+ label: string;
123
+ host: string;
124
+ port?: number;
125
+ /** SSH jump host (`-J`): the host is reached THROUGH it, never directly. */
126
+ jumpHost?: string;
127
+ /** SOCKS5 proxy (`ProxyCommand=nc -X 5 …`): same, the direct address may not even route. */
128
+ socksProxy?: string;
129
+ /** Extra `-o KEY=VALUE` options; a `ProxyCommand`/`ProxyJump` in here proxies the host too. */
130
+ extraSshOptions?: string[];
131
+ }
132
+ /**
133
+ * Whether the bare TCP probe can answer for this host at all. Pure.
134
+ *
135
+ * The probe connects straight to `host:port`. A host behind a jump host or a SOCKS
136
+ * proxy (the cloudflared case) is reachable ONLY through that proxy, so the direct
137
+ * connect fails while ssh works — and every consumer of the verdict would then act on
138
+ * a "sleeping" host that is fine: a permanent banner, a create-path gate that hides the
139
+ * real ssh error, and (with a wake target) input buffered for the life of the session
140
+ * because the readiness poll can never succeed. Such a host is reachability-UNKNOWN:
141
+ * the registry never buffers for it, never gates on it, and reports `null` rather than
142
+ * `false`. A wake target can still be fired for it, blind.
143
+ */
144
+ export declare function isProbeable(remote: WakeableRemote): boolean;
145
+ /**
146
+ * A resolved wake path for a host. `command` wins over `mac` (an explicit override
147
+ * beats the default path), and `null` means the host cannot be woken at all — which
148
+ * is what the UI turns into "configure WoL" instead of "wake".
149
+ */
150
+ export type WakeTarget = {
151
+ kind: 'command';
152
+ command: string;
153
+ } | {
154
+ kind: 'mac';
155
+ macs: number[][];
156
+ } | null;
157
+ /**
158
+ * Resolve the wake target from host config. Pure.
159
+ *
160
+ * A malformed `wakeMac` resolves to `null` rather than throwing: the schema
161
+ * already rejects one at config time, so this can only be reached with a config
162
+ * written by hand, and a broken MAC must not break the input route.
163
+ */
164
+ export declare function resolveWakeTarget(remote: WakeableRemote | undefined): WakeTarget;
165
+ /**
166
+ * Parse a comma-separated MAC list into byte arrays. Pure; returns null when any
167
+ * entry is malformed (all-or-nothing, so a typo cannot half-arm a host).
168
+ */
169
+ export declare function parseMacList(value: string, maxMacs?: number): number[][] | null;
170
+ /**
171
+ * Build a Wake-on-LAN "magic packet": six `0xFF` bytes then the MAC repeated 16
172
+ * times. Pure — the shape is asserted byte-for-byte in the tests because a packet
173
+ * that is off by one byte simply never wakes anything.
174
+ */
175
+ export declare function buildMagicPacket(mac: number[]): Buffer;
176
+ /**
177
+ * The slice of `Session` the wake flow uses — an interface rather than the
178
+ * concrete class so the registry is testable without a tmux server.
179
+ */
180
+ export interface WakeableSession {
181
+ readonly id: string;
182
+ readonly remote: WakeableRemote | undefined;
183
+ /** COD-108 reattach: respawns the local ssh pane, idempotently attaching the durable remote tmux. */
184
+ reattachRemote(): Promise<boolean>;
185
+ /** Write bytes to the session's pane. `fromUser` marks input a person typed (or an agent sent for them). */
186
+ writeViaMux(data: string, options?: {
187
+ fromUser?: boolean;
188
+ }): Promise<boolean>;
189
+ }
190
+ /** Injected IO so the registry holds no direct dependency on ssh/net/child_process in tests. */
191
+ export interface RemoteWakeDeps {
192
+ /** Cheap reachability probe. Must resolve false (never throw) for a sleeping host. */
193
+ probe(remote: WakeableRemote): Promise<boolean>;
194
+ /** Run the resolved wake target (magic packet or host command). Resolves false on failure. */
195
+ wake(target: NonNullable<WakeTarget>): Promise<boolean>;
196
+ /** Poll until the woken host accepts connections again. */
197
+ waitUntilReady(remote: WakeableRemote, opts?: {
198
+ timeoutMs?: number;
199
+ signal?: AbortSignal;
200
+ }): Promise<boolean>;
201
+ /** Sleep helper (injected for tests). */
202
+ delay(ms: number): Promise<void>;
203
+ /** Notify the COD-108 watcher so an exhausted backoff is reset. */
204
+ noteReconnected?(sessionId: string, success: boolean): void;
205
+ /** SSE broadcast. */
206
+ broadcast?(event: 'remote:hostWaking' | 'remote:hostWakeFailed' | 'remote:sessionReconnected', payload: Record<string, unknown>): void;
207
+ /** Structured diagnostics. */
208
+ log?(message: string): void;
209
+ /**
210
+ * Resolve the host's CURRENT wake config for a session whose persisted `remote`
211
+ * snapshot predates it (or was configured after launch). Called at most once per
212
+ * `REMOTE_WAKE_RESOLVE_TTL_MS` per session, and only when the session's own copy
213
+ * has no wake target — so a config saved in the UI works without restarting the
214
+ * session, without a per-keystroke config read.
215
+ */
216
+ resolveRemote?(session: WakeableSession): Promise<WakeableRemote | undefined>;
217
+ }
218
+ /** Probe freshness for the UI's reachability check (a tab switch is not a hammer). */
219
+ export declare const REMOTE_WAKE_REACHABILITY_TTL_MS = 5000;
220
+ /** How long a resolved host config is trusted before asking the resolver again. */
221
+ export declare const REMOTE_WAKE_RESOLVE_TTL_MS = 30000;
222
+ /**
223
+ * What the UI is allowed to offer for a host: how it can be woken, if at all. The
224
+ * `'none'` case is what the banner turns into "configure WoL" instead of "wake".
225
+ */
226
+ export type WakeConfigured = 'command' | 'mac' | 'none';
227
+ /** Which wake path a host config provides (mirrors {@link resolveWakeTarget}). Pure. */
228
+ export declare function wakeConfigured(remote: WakeableRemote | undefined): WakeConfigured;
229
+ /**
230
+ * Outcome of waking a host for a caller that has NO session yet (the create/attach
231
+ * routes). A union rather than a boolean because the cases need different handling:
232
+ * `'no-target'` must leave the caller's behavior byte-identical (no probe, no extra
233
+ * latency for a host without WoL), `'unprobeable'` likewise (a proxied host, see
234
+ * {@link isProbeable} — the probe cannot tell asleep from awake, so nothing is gated on
235
+ * it), and only `'failed'` is an error that deserves its own message instead of the
236
+ * caller's usual one.
237
+ */
238
+ export type HostWakeOutcome = 'no-target' | 'unprobeable' | 'ready' | 'failed';
239
+ /**
240
+ * Per-session wake state + single-flight wake flow.
241
+ *
242
+ * One instance per web server (module singleton in the routes file, like the
243
+ * signal-wait registry). State is keyed by session id and dropped with the
244
+ * session.
245
+ */
246
+ export declare class RemoteWakeRegistry {
247
+ private readonly deps;
248
+ private readonly states;
249
+ /**
250
+ * Aborted by {@link stop} on shutdown. Every in-flight readiness poll is holding an
251
+ * HTTP request open (the wake route blocks on it), and Fastify's `close()` waits for
252
+ * in-flight requests — so without this a restart during a wake sits out the full 90 s
253
+ * budget. The same problem `sessionWaits.cancelEverything()` exists for.
254
+ */
255
+ private readonly shutdown;
256
+ private stopped;
257
+ constructor(deps: RemoteWakeDeps);
258
+ /** Drop a session's state (session closed/killed). The pending buffer goes with it. */
259
+ drop(sessionId: string): void;
260
+ /**
261
+ * Resolve every in-flight wake as failed and refuse new ones (server shutdown).
262
+ *
263
+ * Called from `WebServer.stop()`: an in-flight wake is awaited by a request, and the
264
+ * server's own `app.close()` does not abort in-flight requests, so shutdown would wait
265
+ * out the poll. Nothing is lost by failing them — the state flush happens earlier in
266
+ * `stop()`, and the process is going away.
267
+ */
268
+ stop(): void;
269
+ /** Whether a wake is currently in flight (diagnostics/tests). */
270
+ isWaking(sessionId: string): boolean;
271
+ /** Buffered input bytes for a session (diagnostics/tests). */
272
+ pendingBytes(sessionId: string): number;
273
+ /**
274
+ * Number of keys with wake state (diagnostics/tests). Pins that a LOCAL session never
275
+ * gets an entry: the input gate runs on every keystroke, so an entry per local session
276
+ * would be a map the size of the session list, swept only on cleanup.
277
+ */
278
+ stateCount(): number;
279
+ /** Whether this session's host has any wake path configured at all. */
280
+ hasWakeTarget(session: WakeableSession): Promise<boolean>;
281
+ /** Which wake path is configured (`'none'` when the UI should offer configuration). */
282
+ wakeConfigured(session: WakeableSession): Promise<WakeConfigured>;
283
+ /**
284
+ * Reachability for the UI: probe unless a recent result is still fresh. `null` for a
285
+ * host the probe cannot reach (see {@link isProbeable}): unknown is not unreachable.
286
+ *
287
+ * Shares the per-session probe state with the input path on purpose — a fresh
288
+ * answer is exactly what the input ladder wants, and an `unreachable` verdict here
289
+ * makes the next keystroke buffer + wake instead of vanishing into a stalled pane.
290
+ */
291
+ checkReachable(session: WakeableSession, opts?: {
292
+ force?: boolean;
293
+ ttlMs?: number;
294
+ }): Promise<boolean | null>;
295
+ /**
296
+ * Decide + act for one input chunk.
297
+ *
298
+ * `'deliver'` means the caller writes it as usual (today's path, zero added
299
+ * cost). `'buffered'` means the registry took ownership of the bytes: it either
300
+ * queued them behind an in-flight wake or started a wake, and will flush them
301
+ * in order once the pane is reattached.
302
+ */
303
+ handleInput(session: WakeableSession, data: string): Promise<RemoteInputOutcome>;
304
+ /**
305
+ * Block until the host is reachable and the pane is reattached — the
306
+ * send-and-wait path, where the HTTP response stays open anyway and buffering
307
+ * would break the wait contract.
308
+ */
309
+ ensureAwake(session: WakeableSession, opts?: {
310
+ force?: boolean;
311
+ timeoutMs?: number;
312
+ }): Promise<boolean>;
313
+ /**
314
+ * Host-scoped reachability, for a caller that has no session yet (create/attach).
315
+ * Shares the per-HOST probe state with {@link ensureHostAwake}, so the probe the
316
+ * wake flow just paid for also answers "was that ssh failure really a sleeping
317
+ * machine?". Never wakes anything — it is a question, not an action. `null` when the
318
+ * question cannot be answered (see {@link isProbeable}).
319
+ */
320
+ checkHostReachable(remote: WakeableRemote, opts?: {
321
+ force?: boolean;
322
+ ttlMs?: number;
323
+ }): Promise<boolean | null>;
324
+ /**
325
+ * Wake a host for a REQUEST that is waiting on it — the session create/attach
326
+ * routes, where there is no session to reattach and no input to buffer yet.
327
+ *
328
+ * `'no-target'` returns without probing, so a host without WoL config costs
329
+ * nothing and behaves exactly as before. Single-flight per host, so a double click
330
+ * (or two cases on the same host) sends one packet and shares one readiness poll.
331
+ */
332
+ ensureHostAwake(remote: WakeableRemote, opts?: {
333
+ timeoutMs?: number;
334
+ requestedBy?: string;
335
+ }): Promise<HostWakeOutcome>;
336
+ /**
337
+ * Single-flight wake for a host with no session (see {@link ensureHostAwake}). Uses the
338
+ * same single-flight `waking` slot the session flow uses — but a DIFFERENT key
339
+ * (`host:<id>` vs the session id), so a session wake and a create-path wake for the same
340
+ * host are two independent flows rather than one shared poll. Harmless (both are
341
+ * user-initiated and the host only wakes once), and keying them together would mean a
342
+ * create request joining an unrelated session's wake and inheriting its budget.
343
+ */
344
+ private wakeHost;
345
+ /**
346
+ * Single-flight wake: probe-free (the caller already knows the host is down),
347
+ * run the wake command, poll for readiness, reattach the pane, flush the buffer.
348
+ */
349
+ wake(session: WakeableSession, opts?: {
350
+ timeoutMs?: number;
351
+ }): Promise<boolean>;
352
+ /**
353
+ * Fire the wake target for a host whose readiness cannot be verified (see
354
+ * {@link isProbeable}): no readiness poll (it could never succeed), no reattach (the
355
+ * COD-108 watcher owns the pane once ssh works again), no `hostWaking` broadcast (its
356
+ * toast promises a wait that does not happen). The caller learns only whether the
357
+ * packet/command went out — and a wake IO that throws is a failed wake, never a
358
+ * rejected route.
359
+ */
360
+ private _wakeBlind;
361
+ /**
362
+ * Broadcast + run the wake target + wait for SSH. Shared by the session flow (which
363
+ * then reattaches and flushes the buffer) and the create/attach flow (which has no
364
+ * pane yet). On failure the probe state is reset so the NEXT attempt probes and
365
+ * retries instead of trusting a stale "down" verdict forever.
366
+ */
367
+ private _wakeAndWait;
368
+ private _state;
369
+ /**
370
+ * The host config to act on: the session's own `remote` when it is fresh enough, else a
371
+ * freshly resolved one.
372
+ *
373
+ * The persisted `remote` snapshot is taken at launch, so a wake target configured AFTER
374
+ * the session started (e.g. through the banner's config dialog, or by adding `wakeMac`
375
+ * to `remote-hosts.json`) is invisible to it. Recovery rehydration (server.ts) covers
376
+ * restarts; this covers the live session, and it is why saving the dialog takes effect
377
+ * without restarting anything.
378
+ *
379
+ * ⚠️ The host config wins in BOTH directions, so the resolver is consulted on the TTL
380
+ * regardless of whether the session already carries a target. Preferring the snapshot
381
+ * whenever it HAD one meant removing a MAC/command in the config (or the dialog) never
382
+ * took effect for a running session — the feature stayed on with a target nobody could
383
+ * see in the config any more, which is exactly the "host config is authoritative"
384
+ * promise failing in the one direction a user can observe.
385
+ */
386
+ private _effectiveRemote;
387
+ /** Queue a chunk; `'dropped'` when it was over the cap and never entered the buffer. */
388
+ private _enqueue;
389
+ private _flush;
390
+ }
391
+ /**
392
+ * Cheap reachability probe: a bare TCP connect to the SSH port. Only meaningful for a
393
+ * host the registry deems probeable (see {@link isProbeable}); the registry never asks
394
+ * it about a proxied host.
395
+ *
396
+ * Deliberately NOT an `ssh … true` probe: that opens a full session (auth,
397
+ * remote log, process) every throttle window for a question a SYN already
398
+ * answers. Any byte count it does move is a few hundred bytes per probe, far
399
+ * below the remote idle detector's traffic threshold, so probing cannot keep a
400
+ * host awake.
401
+ */
402
+ export declare function probeRemoteHostReachable(remote: WakeableRemote, timeoutMs?: number): Promise<boolean>;
403
+ /**
404
+ * Run a host's wake command (e.g. a Wake-on-LAN wrapper script). No shell — the
405
+ * value is a single executable path, so nothing in it can be interpreted.
406
+ * Resolves false on any failure (missing binary, non-zero exit, timeout) rather
407
+ * than throwing: a broken wake command must not break the input route.
408
+ */
409
+ export declare function runRemoteWakeCommand(command: string, timeoutMs?: number): Promise<boolean>;
410
+ /**
411
+ * Send Wake-on-LAN magic packets for every MAC, over UDP to the broadcast address.
412
+ *
413
+ * This is the whole reason `wakeMac` exists: the common case needs no external
414
+ * script. Broadcast on 255.255.255.255 is what the CLI `wakeonlan` does and what the
415
+ * NICs here answer to; the socket is closed as soon as the packets are queued, so a
416
+ * sleeping host cannot leave a handle behind. Resolves false on any failure (no
417
+ * interface to broadcast on, permission) rather than throwing — a broken network
418
+ * must not break the wake flow, which reports the failure itself.
419
+ */
420
+ export declare function sendWakePackets(addresses: number[][], port?: number, createSocket?: WakeSocketFactory): Promise<boolean>;
421
+ /** The `dgram` surface {@link sendWakePackets} uses — injectable so the bind/setBroadcast ORDER is testable. */
422
+ export interface WakeSocket {
423
+ bind(callback: () => void): void;
424
+ setBroadcast(flag: boolean): void;
425
+ send(msg: Buffer, port: number, address: string, callback: (err?: Error | null) => void): void;
426
+ close(): void;
427
+ once(event: 'error', listener: (err: Error) => void): void;
428
+ }
429
+ export type WakeSocketFactory = () => WakeSocket;
430
+ /** Poll the host until it accepts connections again, or the bound is hit. */
431
+ export declare function waitUntilRemoteReady(remote: WakeableRemote, opts?: {
432
+ intervalMs?: number;
433
+ timeoutMs?: number;
434
+ signal?: AbortSignal;
435
+ probe?: (remote: WakeableRemote) => Promise<boolean>;
436
+ }): Promise<boolean>;
437
+ /**
438
+ * Production wiring: all IO defaults, overridable for tests.
439
+ *
440
+ * The readiness poll uses the SAME probe as the rest of the deps, overridden or not.
441
+ * Wiring it to the module default instead let a caller that injected `probe` still
442
+ * poll the real host during the wait — under vitest, a TCP connect to a production
443
+ * address on every shutdown test (which the vitest guard is what finally caught).
444
+ */
445
+ export declare function createDefaultRemoteWakeDeps(overrides?: Partial<RemoteWakeDeps>): RemoteWakeDeps;
446
+ //# sourceMappingURL=remote-wake.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-wake.d.ts","sourceRoot":"","sources":["../src/remote-wake.ts"],"names":[],"mappings":"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"}