harnery 0.42.0 → 0.44.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 (343) hide show
  1. package/README.md +3 -3
  2. package/dist/commander.d.ts +16 -0
  3. package/dist/commander.d.ts.map +1 -1
  4. package/dist/commander.js +18 -0
  5. package/dist/commands/agents.d.ts.map +1 -1
  6. package/dist/commands/agents.js +95 -52
  7. package/dist/commands/browse.d.ts.map +1 -1
  8. package/dist/commands/browse.js +38 -11
  9. package/dist/commands/diagnostics.d.ts.map +1 -1
  10. package/dist/commands/diagnostics.js +10 -0
  11. package/dist/commands/doctor.d.ts +12 -0
  12. package/dist/commands/doctor.d.ts.map +1 -1
  13. package/dist/commands/doctor.js +22 -7
  14. package/dist/commands/governor.js +22 -10
  15. package/dist/commands/inbox.d.ts +1 -1
  16. package/dist/commands/inbox.d.ts.map +1 -1
  17. package/dist/commands/inbox.js +55 -2
  18. package/dist/commands/rm.d.ts.map +1 -1
  19. package/dist/commands/rm.js +28 -4
  20. package/dist/commands/servers.d.ts.map +1 -1
  21. package/dist/commands/servers.js +16 -1
  22. package/dist/commands/supervisor.d.ts.map +1 -1
  23. package/dist/commands/supervisor.js +7 -2
  24. package/dist/commands/toc.d.ts +14 -0
  25. package/dist/commands/toc.d.ts.map +1 -1
  26. package/dist/commands/toc.js +7 -4
  27. package/dist/commands/tunnel.d.ts +65 -0
  28. package/dist/commands/tunnel.d.ts.map +1 -1
  29. package/dist/commands/tunnel.js +290 -101
  30. package/dist/commands/web-fetch.d.ts +3 -2
  31. package/dist/commands/web-fetch.d.ts.map +1 -1
  32. package/dist/commands/web-fetch.js +25 -19
  33. package/dist/commands/web.d.ts +7 -1
  34. package/dist/commands/web.d.ts.map +1 -1
  35. package/dist/commands/web.js +9 -3
  36. package/dist/commands/workflow.js +24 -30
  37. package/dist/core/agents/live-authority-v3.d.ts +1 -0
  38. package/dist/core/agents/live-authority-v3.d.ts.map +1 -1
  39. package/dist/core/agents/live-authority-v3.js +11 -0
  40. package/dist/core/agents/live-lifecycle-v3.d.ts +4 -2
  41. package/dist/core/agents/live-lifecycle-v3.d.ts.map +1 -1
  42. package/dist/core/agents/live-lifecycle-v3.js +28 -7
  43. package/dist/core/agents/mailbox.d.ts +9 -8
  44. package/dist/core/agents/mailbox.d.ts.map +1 -1
  45. package/dist/core/agents/mailbox.js +24 -17
  46. package/dist/core/agents/render/prompt-context.d.ts +2 -0
  47. package/dist/core/agents/render/prompt-context.d.ts.map +1 -1
  48. package/dist/core/agents/render/prompt-context.js +19 -17
  49. package/dist/core/agents/render/session-context.d.ts +2 -8
  50. package/dist/core/agents/render/session-context.d.ts.map +1 -1
  51. package/dist/core/agents/render/session-context.js +64 -43
  52. package/dist/core/agents/rules/stop-hook.js +3 -3
  53. package/dist/core/agents/state/heartbeat-writer.d.ts.map +1 -1
  54. package/dist/core/agents/state/heartbeat-writer.js +25 -14
  55. package/dist/core/agents/state/live-coordination-writer.d.ts.map +1 -1
  56. package/dist/core/agents/state/live-coordination-writer.js +5 -0
  57. package/dist/core/agents/state/names.d.ts +43 -3
  58. package/dist/core/agents/state/names.d.ts.map +1 -1
  59. package/dist/core/agents/state/names.js +87 -3
  60. package/dist/core/agents/state/pidmap.d.ts.map +1 -1
  61. package/dist/core/agents/state/pidmap.js +5 -0
  62. package/dist/core/agents/state/proc-start.d.ts +19 -0
  63. package/dist/core/agents/state/proc-start.d.ts.map +1 -1
  64. package/dist/core/agents/state/proc-start.js +41 -0
  65. package/dist/core/agents/state/stale-sweep.d.ts.map +1 -1
  66. package/dist/core/agents/state/stale-sweep.js +180 -70
  67. package/dist/core/agents/state/unchanged-file.d.ts +44 -0
  68. package/dist/core/agents/state/unchanged-file.d.ts.map +1 -0
  69. package/dist/core/agents/state/unchanged-file.js +390 -0
  70. package/dist/core/context/index.d.ts +22 -10
  71. package/dist/core/context/index.d.ts.map +1 -1
  72. package/dist/core/context/index.js +381 -119
  73. package/dist/core/context/observation.d.ts +26 -0
  74. package/dist/core/context/observation.d.ts.map +1 -0
  75. package/dist/core/context/observation.js +11 -0
  76. package/dist/core/diagnostics/bundle.d.ts.map +1 -1
  77. package/dist/core/diagnostics/bundle.js +25 -14
  78. package/dist/core/diagnostics/path-identity.d.ts +3 -0
  79. package/dist/core/diagnostics/path-identity.d.ts.map +1 -0
  80. package/dist/core/diagnostics/path-identity.js +12 -0
  81. package/dist/core/diagnostics/sanitize.d.ts.map +1 -1
  82. package/dist/core/diagnostics/sanitize.js +4 -3
  83. package/dist/core/events/v3/authority-outbox.d.ts.map +1 -1
  84. package/dist/core/events/v3/authority-outbox.js +29 -0
  85. package/dist/core/events/v3/generation-custody.d.ts +5 -0
  86. package/dist/core/events/v3/generation-custody.d.ts.map +1 -0
  87. package/dist/core/events/v3/generation-custody.js +50 -0
  88. package/dist/core/events/v3/producers/coordination-recorder.d.ts +1 -0
  89. package/dist/core/events/v3/producers/coordination-recorder.d.ts.map +1 -1
  90. package/dist/core/events/v3/producers/coordination-recorder.js +7 -0
  91. package/dist/core/events/v3/producers/recorder.d.ts.map +1 -1
  92. package/dist/core/events/v3/producers/recorder.js +77 -64
  93. package/dist/core/events/v3/support-storage/pack-reader.d.ts.map +1 -1
  94. package/dist/core/events/v3/support-storage/pack-reader.js +42 -16
  95. package/dist/core/governor/planning.d.ts.map +1 -1
  96. package/dist/core/governor/planning.js +14 -1
  97. package/dist/core/governor/service-read.d.ts +10 -2
  98. package/dist/core/governor/service-read.d.ts.map +1 -1
  99. package/dist/core/governor/service-read.js +105 -22
  100. package/dist/core/governor/service.d.ts +20 -2
  101. package/dist/core/governor/service.d.ts.map +1 -1
  102. package/dist/core/governor/service.js +72 -47
  103. package/dist/core/hooks/cli.js +120 -23
  104. package/dist/core/hooks/fork-lineage.d.ts +40 -0
  105. package/dist/core/hooks/fork-lineage.d.ts.map +1 -0
  106. package/dist/core/hooks/fork-lineage.js +62 -0
  107. package/dist/core/hooks/resolve/transcript.d.ts +16 -0
  108. package/dist/core/hooks/resolve/transcript.d.ts.map +1 -1
  109. package/dist/core/hooks/resolve/transcript.js +84 -0
  110. package/dist/core/hooks/shell-rm.d.ts +2 -0
  111. package/dist/core/hooks/shell-rm.d.ts.map +1 -0
  112. package/dist/core/hooks/shell-rm.js +105 -0
  113. package/dist/core/hooks/shell-tokens.d.ts +12 -0
  114. package/dist/core/hooks/shell-tokens.d.ts.map +1 -0
  115. package/dist/core/hooks/shell-tokens.js +97 -0
  116. package/dist/core/hooks/shell-waiter.d.ts.map +1 -1
  117. package/dist/core/hooks/shell-waiter.js +3 -93
  118. package/dist/core/inbox/contract.d.ts +2 -1
  119. package/dist/core/inbox/contract.d.ts.map +1 -1
  120. package/dist/core/inbox/index.d.ts +2 -0
  121. package/dist/core/inbox/index.d.ts.map +1 -1
  122. package/dist/core/inbox/index.js +2 -0
  123. package/dist/core/inbox/peer-messages.d.ts +37 -0
  124. package/dist/core/inbox/peer-messages.d.ts.map +1 -0
  125. package/dist/core/inbox/peer-messages.js +72 -0
  126. package/dist/core/inbox/service.d.ts +8 -1
  127. package/dist/core/inbox/service.d.ts.map +1 -1
  128. package/dist/core/inbox/service.js +67 -21
  129. package/dist/core/inbox/targets.d.ts +22 -0
  130. package/dist/core/inbox/targets.d.ts.map +1 -0
  131. package/dist/core/inbox/targets.js +108 -0
  132. package/dist/core/inbox/watcher.js +7 -3
  133. package/dist/core/journal/index.d.ts.map +1 -1
  134. package/dist/core/journal/index.js +17 -2
  135. package/dist/core/resources/contract.d.ts +3 -0
  136. package/dist/core/resources/contract.d.ts.map +1 -1
  137. package/dist/core/resources/service-status.d.ts +14 -1
  138. package/dist/core/resources/service-status.d.ts.map +1 -1
  139. package/dist/core/resources/service-status.js +23 -13
  140. package/dist/core/resources/service.d.ts +9 -1
  141. package/dist/core/resources/service.d.ts.map +1 -1
  142. package/dist/core/resources/service.js +47 -27
  143. package/dist/core/resources/status.d.ts +2 -5
  144. package/dist/core/resources/status.d.ts.map +1 -1
  145. package/dist/core/resources/status.js +36 -7
  146. package/dist/core/semantic/contract.d.ts +5 -5
  147. package/dist/core/servers/index.d.ts +24 -13
  148. package/dist/core/servers/index.d.ts.map +1 -1
  149. package/dist/core/servers/index.js +132 -92
  150. package/dist/core/servers/tunnels.d.ts +3 -5
  151. package/dist/core/servers/tunnels.d.ts.map +1 -1
  152. package/dist/core/servers/tunnels.js +3 -9
  153. package/dist/core/storage/process-log.d.ts +12 -0
  154. package/dist/core/storage/process-log.d.ts.map +1 -1
  155. package/dist/core/storage/process-log.js +10 -2
  156. package/dist/core/supervisor/contract.d.ts +12 -0
  157. package/dist/core/supervisor/contract.d.ts.map +1 -1
  158. package/dist/core/supervisor/explanations.d.ts.map +1 -1
  159. package/dist/core/supervisor/explanations.js +2 -1
  160. package/dist/core/supervisor/findings.d.ts.map +1 -1
  161. package/dist/core/supervisor/findings.js +54 -9
  162. package/dist/core/supervisor/service.d.ts +9 -1
  163. package/dist/core/supervisor/service.d.ts.map +1 -1
  164. package/dist/core/supervisor/service.js +59 -29
  165. package/dist/core/supervisor/services.d.ts.map +1 -1
  166. package/dist/core/supervisor/services.js +22 -1
  167. package/dist/core/supervisor/status.d.ts +17 -2
  168. package/dist/core/supervisor/status.d.ts.map +1 -1
  169. package/dist/core/supervisor/status.js +70 -12
  170. package/dist/core/supervisor/timeline.d.ts.map +1 -1
  171. package/dist/core/supervisor/timeline.js +2 -1
  172. package/dist/core/work/state.js +7 -7
  173. package/dist/core/workflow/engine.d.ts.map +1 -1
  174. package/dist/core/workflow/engine.js +105 -32
  175. package/dist/core/workflow/failure-evidence.d.ts +16 -0
  176. package/dist/core/workflow/failure-evidence.d.ts.map +1 -0
  177. package/dist/core/workflow/failure-evidence.js +114 -0
  178. package/dist/core/workflow/index.d.ts +1 -1
  179. package/dist/core/workflow/index.d.ts.map +1 -1
  180. package/dist/core/workflow/index.js +1 -1
  181. package/dist/core/workflow/live-session-v3.d.ts +6 -0
  182. package/dist/core/workflow/live-session-v3.d.ts.map +1 -1
  183. package/dist/core/workflow/live-session-v3.js +126 -5
  184. package/dist/core/workflow/proof.d.ts +5 -5
  185. package/dist/core/workflow/proof.d.ts.map +1 -1
  186. package/dist/core/workflow/proof.js +115 -20
  187. package/dist/core/workflow/run-state.d.ts +3 -1
  188. package/dist/core/workflow/run-state.d.ts.map +1 -1
  189. package/dist/core/workflow/run-state.js +31 -27
  190. package/dist/core/workflow/spawn-claude.d.ts.map +1 -1
  191. package/dist/core/workflow/spawn-claude.js +19 -0
  192. package/dist/core/workflow/spawn-codex.d.ts.map +1 -1
  193. package/dist/core/workflow/spawn-codex.js +13 -0
  194. package/dist/core/workflow/spawn-cursor.d.ts.map +1 -1
  195. package/dist/core/workflow/spawn-cursor.js +19 -0
  196. package/dist/core/workflow/spawn-opencode.d.ts.map +1 -1
  197. package/dist/core/workflow/spawn-opencode.js +14 -0
  198. package/dist/core/workflow/types.d.ts +64 -17
  199. package/dist/core/workflow/types.d.ts.map +1 -1
  200. package/dist/core/workflow/workspaces/index.d.ts +0 -1
  201. package/dist/core/workflow/workspaces/index.d.ts.map +1 -1
  202. package/dist/core/workflow/workspaces/index.js +0 -1
  203. package/dist/core/workflow/workspaces/leases.d.ts +3 -1
  204. package/dist/core/workflow/workspaces/leases.d.ts.map +1 -1
  205. package/dist/core/workflow/workspaces/leases.js +30 -16
  206. package/dist/core/workflow/workspaces/local-git.d.ts +6 -2
  207. package/dist/core/workflow/workspaces/local-git.d.ts.map +1 -1
  208. package/dist/core/workflow/workspaces/local-git.js +270 -6
  209. package/dist/core/workflow/workspaces/ownership.d.ts +11 -0
  210. package/dist/core/workflow/workspaces/ownership.d.ts.map +1 -0
  211. package/dist/core/workflow/workspaces/ownership.js +194 -0
  212. package/dist/core/workflow/workspaces/reclaim.d.ts +35 -0
  213. package/dist/core/workflow/workspaces/reclaim.d.ts.map +1 -1
  214. package/dist/core/workflow/workspaces/reclaim.js +14 -0
  215. package/dist/core/workflow/workspaces/recovery.d.ts.map +1 -1
  216. package/dist/core/workflow/workspaces/recovery.js +21 -13
  217. package/dist/core/workflow/workspaces/state.d.ts +1 -0
  218. package/dist/core/workflow/workspaces/state.d.ts.map +1 -1
  219. package/dist/core/workflow/workspaces/state.js +21 -1
  220. package/dist/lib/browser/windows-chrome.d.ts +100 -12
  221. package/dist/lib/browser/windows-chrome.d.ts.map +1 -1
  222. package/dist/lib/browser/windows-chrome.js +262 -73
  223. package/dist/lib/docs-links.d.ts.map +1 -1
  224. package/dist/lib/docs-links.js +45 -2
  225. package/dist/lib/guarded-remove.d.ts +7 -0
  226. package/dist/lib/guarded-remove.d.ts.map +1 -1
  227. package/dist/lib/guarded-remove.js +106 -12
  228. package/dist/lib/identities/assume.d.ts.map +1 -1
  229. package/dist/lib/identities/assume.js +4 -0
  230. package/dist/lib/tunnel/allowlist.d.ts +44 -0
  231. package/dist/lib/tunnel/allowlist.d.ts.map +1 -0
  232. package/dist/lib/tunnel/allowlist.js +204 -0
  233. package/dist/lib/tunnel/current-address.d.ts +41 -0
  234. package/dist/lib/tunnel/current-address.d.ts.map +1 -0
  235. package/dist/lib/tunnel/current-address.js +123 -0
  236. package/dist/lib/tunnel/gate.js +13 -6
  237. package/dist/lib/tunnel/processes.d.ts +39 -0
  238. package/dist/lib/tunnel/processes.d.ts.map +1 -0
  239. package/dist/lib/tunnel/processes.js +121 -0
  240. package/dist/lib/tunnel/state.d.ts +28 -3
  241. package/dist/lib/tunnel/state.d.ts.map +1 -1
  242. package/dist/lib/tunnel/state.js +98 -27
  243. package/dist/lib/zip/index.d.ts +41 -0
  244. package/dist/lib/zip/index.d.ts.map +1 -0
  245. package/dist/lib/zip/index.js +398 -0
  246. package/package.json +8 -1
  247. package/src/commander.ts +32 -0
  248. package/src/commands/agents.ts +151 -74
  249. package/src/commands/browse.ts +50 -14
  250. package/src/commands/diagnostics.ts +10 -0
  251. package/src/commands/doctor.ts +26 -7
  252. package/src/commands/governor.ts +23 -10
  253. package/src/commands/inbox.ts +52 -2
  254. package/src/commands/rm.ts +43 -4
  255. package/src/commands/servers.ts +16 -4
  256. package/src/commands/supervisor.ts +7 -2
  257. package/src/commands/toc.ts +14 -6
  258. package/src/commands/tunnel.ts +394 -116
  259. package/src/commands/web-fetch.ts +30 -19
  260. package/src/commands/web.ts +9 -3
  261. package/src/commands/workflow.ts +30 -30
  262. package/src/core/agents/live-authority-v3.ts +17 -0
  263. package/src/core/agents/live-lifecycle-v3.ts +52 -14
  264. package/src/core/agents/mailbox.ts +26 -17
  265. package/src/core/agents/render/prompt-context.ts +35 -20
  266. package/src/core/agents/render/session-context.ts +92 -48
  267. package/src/core/agents/rules/stop-hook.ts +3 -3
  268. package/src/core/agents/state/heartbeat-writer.ts +29 -12
  269. package/src/core/agents/state/live-coordination-writer.ts +29 -0
  270. package/src/core/agents/state/names.ts +117 -6
  271. package/src/core/agents/state/pidmap.ts +13 -0
  272. package/src/core/agents/state/proc-start.ts +57 -0
  273. package/src/core/agents/state/stale-sweep.ts +247 -82
  274. package/src/core/agents/state/unchanged-file.ts +456 -0
  275. package/src/core/context/index.ts +446 -136
  276. package/src/core/context/observation.ts +29 -0
  277. package/src/core/diagnostics/bundle.ts +23 -18
  278. package/src/core/diagnostics/path-identity.ts +15 -0
  279. package/src/core/diagnostics/sanitize.ts +4 -3
  280. package/src/core/events/v3/authority-outbox.ts +56 -0
  281. package/src/core/events/v3/generation-custody.ts +59 -0
  282. package/src/core/events/v3/producers/coordination-recorder.ts +15 -0
  283. package/src/core/events/v3/producers/recorder.ts +94 -68
  284. package/src/core/events/v3/support-storage/pack-reader.ts +45 -19
  285. package/src/core/governor/planning.ts +20 -8
  286. package/src/core/governor/service-read.ts +128 -20
  287. package/src/core/governor/service.ts +119 -42
  288. package/src/core/hooks/cli.ts +139 -22
  289. package/src/core/hooks/fork-lineage.ts +82 -0
  290. package/src/core/hooks/resolve/transcript.ts +88 -0
  291. package/src/core/hooks/shell-rm.ts +103 -0
  292. package/src/core/hooks/shell-tokens.ts +96 -0
  293. package/src/core/hooks/shell-waiter.ts +4 -91
  294. package/src/core/inbox/contract.ts +2 -1
  295. package/src/core/inbox/index.ts +2 -0
  296. package/src/core/inbox/peer-messages.ts +94 -0
  297. package/src/core/inbox/service.ts +88 -22
  298. package/src/core/inbox/targets.ts +148 -0
  299. package/src/core/inbox/watcher.ts +8 -9
  300. package/src/core/journal/index.ts +19 -2
  301. package/src/core/resources/contract.ts +4 -0
  302. package/src/core/resources/service-status.ts +35 -12
  303. package/src/core/resources/service.ts +71 -24
  304. package/src/core/resources/status.ts +57 -8
  305. package/src/core/servers/index.ts +177 -91
  306. package/src/core/servers/tunnels.ts +3 -11
  307. package/src/core/storage/process-log.ts +17 -2
  308. package/src/core/supervisor/contract.ts +13 -0
  309. package/src/core/supervisor/explanations.ts +4 -1
  310. package/src/core/supervisor/findings.ts +68 -10
  311. package/src/core/supervisor/service.ts +88 -26
  312. package/src/core/supervisor/services.ts +26 -8
  313. package/src/core/supervisor/status.ts +89 -12
  314. package/src/core/supervisor/timeline.ts +2 -1
  315. package/src/core/work/state.ts +7 -7
  316. package/src/core/workflow/engine.ts +131 -49
  317. package/src/core/workflow/failure-evidence.ts +141 -0
  318. package/src/core/workflow/index.ts +0 -1
  319. package/src/core/workflow/live-session-v3.ts +146 -5
  320. package/src/core/workflow/proof.ts +134 -26
  321. package/src/core/workflow/run-state.ts +31 -29
  322. package/src/core/workflow/spawn-claude.ts +18 -0
  323. package/src/core/workflow/spawn-codex.ts +13 -0
  324. package/src/core/workflow/spawn-cursor.ts +18 -0
  325. package/src/core/workflow/spawn-opencode.ts +14 -0
  326. package/src/core/workflow/types.ts +51 -17
  327. package/src/core/workflow/workspaces/index.ts +0 -1
  328. package/src/core/workflow/workspaces/leases.ts +48 -17
  329. package/src/core/workflow/workspaces/local-git.ts +315 -5
  330. package/src/core/workflow/workspaces/ownership.ts +232 -0
  331. package/src/core/workflow/workspaces/reclaim.ts +58 -0
  332. package/src/core/workflow/workspaces/recovery.ts +25 -13
  333. package/src/core/workflow/workspaces/state.ts +20 -0
  334. package/src/lib/browser/windows-chrome.ts +346 -86
  335. package/src/lib/docs-links.ts +49 -2
  336. package/src/lib/guarded-remove.ts +132 -14
  337. package/src/lib/identities/assume.ts +4 -0
  338. package/src/lib/tunnel/allowlist.ts +208 -0
  339. package/src/lib/tunnel/current-address.ts +158 -0
  340. package/src/lib/tunnel/gate.ts +16 -8
  341. package/src/lib/tunnel/processes.ts +149 -0
  342. package/src/lib/tunnel/state.ts +123 -27
  343. package/src/lib/zip/index.ts +483 -0
@@ -250,12 +250,13 @@ function registerServiceCommand(governor, registry, emit) {
250
250
  .action(async (opts) => {
251
251
  await withGovernorRootAsync(emit, async (coordRoot) => {
252
252
  let status = requestGovernorServiceStop(coordRoot);
253
+ const signal = { signal_sent: status.signal_sent, signal_verdict: status.signal_verdict };
253
254
  const deadline = Date.now() + 5_000;
254
255
  while (status.running && Date.now() < deadline) {
255
256
  await delay(50);
256
257
  status = readGovernorServiceStatus(coordRoot);
257
258
  }
258
- emitServiceStatus(status, opts.json, emit);
259
+ emitServiceStatus({ ...status, ...signal }, opts.json, emit);
259
260
  });
260
261
  });
261
262
  service
@@ -372,19 +373,30 @@ function emitServiceStatus(status, json, emit) {
372
373
  emit.data(status);
373
374
  return;
374
375
  }
375
- if (!status.config && !status.record) {
376
- emit.text("governor service: unconfigured\n");
377
- return;
378
- }
379
- const state = status.running
380
- ? (status.record?.state ?? "running")
381
- : status.stale
382
- ? "stale"
383
- : "stopped";
376
+ const state = status.liveness === "unknown"
377
+ ? "unknown"
378
+ : !status.config && !status.record
379
+ ? "unconfigured"
380
+ : status.running
381
+ ? (status.record?.state ?? "running")
382
+ : status.stale
383
+ ? "stale"
384
+ : "stopped";
384
385
  const lines = [
385
386
  `governor service: ${state}`,
387
+ `generation: ${status.generation}`,
388
+ `liveness: ${status.liveness}`,
389
+ `running build: ${status.running_build ? `${status.running_build.version} (${status.running_build.revision})` : "unknown"}`,
390
+ `installed build: ${status.installed_build.version} (${status.installed_build.revision})`,
391
+ `build: ${status.build_status}`,
386
392
  `goals: ${status.config?.goal_ids.join(", ") || "none"}`,
387
393
  ];
394
+ if (status.signal_sent !== undefined) {
395
+ lines.push(`signal sent: ${status.signal_sent ? "yes" : "no"} (${status.signal_verdict})`);
396
+ if (!status.signal_sent && status.record?.state !== "stopped") {
397
+ lines.push("The durable stop request remains for the service to read.");
398
+ }
399
+ }
388
400
  if (status.record) {
389
401
  lines.push(`pid: ${status.record.pid} on ${status.record.host}`);
390
402
  lines.push(`heartbeat: ${status.record.heartbeat_at}`);
@@ -1,5 +1,5 @@
1
1
  import type { Command } from "commander";
2
2
  import type { EmitContext } from "../commander.js";
3
3
  import type { HarneryInboxService } from "../core/inbox/service.js";
4
- export declare function registerInboxCommand(program: Command, emit: EmitContext, service?: HarneryInboxService): void;
4
+ export declare function registerInboxCommand(program: Command, emit: EmitContext, service?: HarneryInboxService, defaultRecipient?: () => string): void;
5
5
  //# sourceMappingURL=inbox.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"inbox.d.ts","sourceRoot":"","sources":["../../src/commands/inbox.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAEpE,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,WAAW,EACjB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,IAAI,CAmCN"}
1
+ {"version":3,"file":"inbox.d.ts","sourceRoot":"","sources":["../../src/commands/inbox.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAGpE,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,WAAW,EACjB,OAAO,CAAC,EAAE,mBAAmB,EAC7B,gBAAgB,CAAC,EAAE,MAAM,MAAM,GAC9B,IAAI,CA6EN"}
@@ -1,10 +1,12 @@
1
- export function registerInboxCommand(program, emit, service) {
1
+ import { watchInbox } from "../core/inbox/watcher.js";
2
+ export function registerInboxCommand(program, emit, service, defaultRecipient) {
2
3
  const inbox = program.command("inbox").description("Inspect private coordination inbox state");
3
4
  inbox
4
- .command("list <recipient>")
5
+ .command("list [recipient]")
5
6
  .option("--json", "Emit stable JSON")
6
7
  .action((recipient, options) => {
7
8
  run(emit, () => {
9
+ recipient = requireRecipient(recipient, defaultRecipient);
8
10
  const rows = requireInboxService(service)
9
11
  .pending(recipient)
10
12
  .map((record) => ({
@@ -14,6 +16,7 @@ export function registerInboxCommand(program, emit, service) {
14
16
  created_at: record.created_at,
15
17
  body_bytes: record.body_bytes,
16
18
  body: record.body,
19
+ state: "pending",
17
20
  }));
18
21
  if (options.json) {
19
22
  emit.config({ format: "json" });
@@ -37,6 +40,56 @@ export function registerInboxCommand(program, emit, service) {
37
40
  emit.rows([status]);
38
41
  });
39
42
  });
43
+ inbox
44
+ .command("watch [recipient]")
45
+ .description("Surface pending messages for this instance; poll history until timeout")
46
+ .option("--timeout <seconds>", "Stop after this many seconds", "60")
47
+ .option("--json", "Emit one JSON record per surfaced message")
48
+ .action(async (recipient, options) => {
49
+ let controller;
50
+ let timer;
51
+ try {
52
+ const instanceId = requireRecipient(recipient, defaultRecipient);
53
+ const inboxService = requireInboxService(service);
54
+ const seconds = Number(options.timeout);
55
+ if (!Number.isFinite(seconds) || seconds <= 0 || seconds > 3600)
56
+ throw new Error("--timeout must be greater than 0 and at most 3600 seconds");
57
+ controller = new AbortController();
58
+ timer = setTimeout(() => controller.abort(), seconds * 1000);
59
+ if (options.json)
60
+ emit.config({ format: "json" });
61
+ for await (const message of watchInbox(inboxService, instanceId, {
62
+ signal: controller.signal,
63
+ })) {
64
+ const row = { ...message, state: "surfaced" };
65
+ if (options.json)
66
+ emit.data(row);
67
+ else
68
+ emit.rows([row]);
69
+ // An output error leaves this ID pending for prompt recovery.
70
+ await new Promise((resolve, reject) => process.stdout.write("", (error) => (error ? reject(error) : resolve())));
71
+ inboxService.acknowledgeSurface(instanceId, [message.message_id]);
72
+ }
73
+ }
74
+ catch (error) {
75
+ emit.error({
76
+ code: "inbox_failed",
77
+ message: error instanceof Error ? error.message : String(error),
78
+ });
79
+ emit.setExitCode(1);
80
+ }
81
+ finally {
82
+ if (timer)
83
+ clearTimeout(timer);
84
+ controller?.abort();
85
+ }
86
+ });
87
+ }
88
+ function requireRecipient(recipient, fallback) {
89
+ const resolved = recipient ?? fallback?.();
90
+ if (!resolved)
91
+ throw new Error("recipient instance is required outside an agent session");
92
+ return resolved;
40
93
  }
41
94
  function requireInboxService(service) {
42
95
  if (!service)
@@ -1 +1 @@
1
- {"version":3,"file":"rm.d.ts","sourceRoot":"","sources":["../../src/commands/rm.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAU1E,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,WAAW,EACjB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,IAAI,CAgFN"}
1
+ {"version":3,"file":"rm.d.ts","sourceRoot":"","sources":["../../src/commands/rm.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAW1E,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,WAAW,EACjB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,IAAI,CAsHN"}
@@ -1,7 +1,8 @@
1
1
  import { spawnSync } from "node:child_process";
2
- import { existsSync } from "node:fs";
3
- import { isAbsolute, relative, resolve, sep } from "node:path";
2
+ import { existsSync, lstatSync, readFileSync, realpathSync } from "node:fs";
3
+ import { dirname, isAbsolute, relative, resolve, sep } from "node:path";
4
4
  import { resolveCoordRoot } from "../core/agents/coord-client.js";
5
+ import { artifactsRoot, parseArtifactManifest } from "../core/artifacts/index.js";
5
6
  import { readCoordinationViewV3, requireAuthoritySafeCoordinationViewV3, } from "../core/events/v3/coordination-view.js";
6
7
  import { liveInstanceIdV3 } from "../core/events/v3/live-route-observer.js";
7
8
  import { resolveOwner } from "../core/hooks/resolve/owner.js";
@@ -12,6 +13,8 @@ export function registerRmCommand(program, emit, context) {
12
13
  .description("Preview guarded removal of untracked files; --yes applies permanent deletion")
13
14
  .requiredOption("--root <directory>", "Allowed directory; each target must be strictly inside it")
14
15
  .option("-r, --recursive", "Permit directory removal after inspecting its complete contents")
16
+ .option("--clean-clone", "Remove only clean standalone clones inside one owned artifact; refuse local-only commits and worktrees")
17
+ .option("--entry-limit <n>", "Maximum inspected entries, 1-100000 (default 10000); larger limits require one current caller-owned managed artifact as --root", (value) => Number(value))
15
18
  .option("--allow-protected <path>", "Remove this one protected path (Git metadata, credentials, Harnery state, keys) inside a target; repeat per path", (value, previous = []) => [...previous, value])
16
19
  .option("--yes", "Permanently remove validated targets")
17
20
  .option("--dry-run", "Preview only, even with --yes")
@@ -43,7 +46,26 @@ export function registerRmCommand(program, emit, context) {
43
46
  // The workspace this command coordinates, and the checkout it runs in:
44
47
  // their own .git and .harnery can never be allowed.
45
48
  const liveRoots = [coordRoot, gitTopLevel(process.cwd())].filter((dir) => Boolean(dir));
46
- const report = guardedRemove(paths, { ...options, liveRoots }, checkClaims);
49
+ const assertOwnedArtifact = (root) => {
50
+ if (!coordRoot || dirname(root) !== realpathSync(artifactsRoot(coordRoot)))
51
+ throw new Error("Copied state requires --root to name one owned managed artifact");
52
+ const view = requireAuthoritySafeCoordinationViewV3(readCoordinationViewV3(coordRoot));
53
+ const owner = resolveOwner({ payload: null, coordRoot });
54
+ const ownId = owner ? liveInstanceIdV3(owner.instance_id) : undefined;
55
+ if (!ownId || !view.instances[ownId]?.authority_eligible)
56
+ throw new Error("Copied state requires an authenticated current artifact owner");
57
+ const record = resolve(root, ".harnery-artifact.json");
58
+ const stat = lstatSync(record);
59
+ if (!stat.isFile() || stat.isSymbolicLink())
60
+ throw new Error("An owned artifact requires a regular manifest file");
61
+ const parsed = parseArtifactManifest(JSON.parse(readFileSync(record, "utf8")));
62
+ if (!parsed.ok ||
63
+ parsed.manifest.released_at ||
64
+ !parsed.manifest.created_by?.instance_id ||
65
+ liveInstanceIdV3(parsed.manifest.created_by.instance_id) !== ownId)
66
+ throw new Error("Copied state requires a valid unreleased artifact owned by the caller");
67
+ };
68
+ const report = guardedRemove(paths, { ...options, liveRoots, assertOwnedArtifact }, checkClaims);
47
69
  if (options.json) {
48
70
  emit.config({ format: "json" });
49
71
  emit.data(report);
@@ -54,7 +76,9 @@ export function registerRmCommand(program, emit, context) {
54
76
  ...report.targets,
55
77
  ];
56
78
  if (report.protected.length)
57
- lines.push("Protected paths named with --allow-protected:", ...report.protected.map((path) => ` ${path}`));
79
+ lines.push(options.cleanClone
80
+ ? "Verified clone metadata:"
81
+ : "Protected paths named with --allow-protected:", ...report.protected.map((path) => ` ${path}`));
58
82
  if (report.links.length)
59
83
  lines.push("Links removed as links (their targets are untouched):", ...report.links.map((link) => ` ${link.path} -> ${link.target}`));
60
84
  if (!report.applied)
@@ -1 +1 @@
1
- {"version":3,"file":"servers.d.ts","sourceRoot":"","sources":["../../src/commands/servers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAG1E,OAAO,EAWL,KAAK,aAAa,EAMnB,MAAM,0BAA0B,CAAC;AAElC,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,WAAW,EACjB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,IAAI,CA0YN;AA8BD,4DAA4D;AAC5D,wBAAgB,YAAY,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAmDvE"}
1
+ {"version":3,"file":"servers.d.ts","sourceRoot":"","sources":["../../src/commands/servers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAG1E,OAAO,EAWL,KAAK,aAAa,EAMnB,MAAM,0BAA0B,CAAC;AAElC,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,WAAW,EACjB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,IAAI,CAsZN;AA8BD,4DAA4D;AAC5D,wBAAgB,YAAY,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAmDvE"}
@@ -81,6 +81,7 @@ export function registerServersCommand(program, emit, context) {
81
81
  type: "unregistered",
82
82
  label: stray.command,
83
83
  pid: stray.pid,
84
+ ...(stray.start_token ? { start_token: stray.start_token } : {}),
84
85
  host: hostname(),
85
86
  started_at: new Date().toISOString(),
86
87
  registered_at: new Date().toISOString(),
@@ -141,7 +142,19 @@ export function registerServersCommand(program, emit, context) {
141
142
  emit.data({ applied: Boolean(options.yes), pruned: report.pruned, decisions, results });
142
143
  }
143
144
  else {
144
- const lines = decisions.map((d) => `${d.action === "stop" ? (options.yes ? "stopped" : "would stop") : "keep"} ${d.id} ${d.reason}`);
145
+ const lines = decisions.map((decision) => {
146
+ const result = results.find((item) => item.id === decision.id);
147
+ const action = decision.action === "keep"
148
+ ? "keep"
149
+ : !options.yes
150
+ ? "would stop"
151
+ : result?.stopped
152
+ ? "stopped"
153
+ : result?.method === "not-running"
154
+ ? "already stopped"
155
+ : "could not stop";
156
+ return `${action} ${decision.id} ${result?.detail ?? decision.reason}`;
157
+ });
145
158
  if (report.pruned.length)
146
159
  lines.push(`Removed records of exited servers: ${report.pruned.join(", ")}`);
147
160
  if (!decisions.length)
@@ -150,6 +163,8 @@ export function registerServersCommand(program, emit, context) {
150
163
  lines.push("Preview only. Re-run with --yes to stop.");
151
164
  emit.text(lines.join("\n"));
152
165
  }
166
+ if (results.some((result) => result.method === "refused"))
167
+ emit.setExitCode(1);
153
168
  }
154
169
  catch (error) {
155
170
  fail(error);
@@ -1 +1 @@
1
- {"version":3,"file":"supervisor.d.ts","sourceRoot":"","sources":["../../src/commands/supervisor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAe1E,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,WAAW,EACjB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,IAAI,CAwGN"}
1
+ {"version":3,"file":"supervisor.d.ts","sourceRoot":"","sources":["../../src/commands/supervisor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAe1E,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,WAAW,EACjB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,IAAI,CA6GN"}
@@ -53,11 +53,16 @@ export function registerSupervisorCommand(program, emit, context) {
53
53
  .action(async (options) => {
54
54
  try {
55
55
  const root = resolve(options.root ?? coordRoot(context));
56
- let status = requestSupervisorStop(root);
56
+ const requested = requestSupervisorStop(root);
57
+ let status = requested;
57
58
  const deadline = Date.now() + 5_000;
58
59
  while (status.running && Date.now() < deadline) {
59
60
  await new Promise((done) => setTimeout(done, 50));
60
- status = readSupervisorStatus(root);
61
+ status = {
62
+ ...readSupervisorStatus(root),
63
+ signal_sent: requested.signal_sent,
64
+ signal_verdict: requested.signal_verdict,
65
+ };
61
66
  }
62
67
  emit.data(status);
63
68
  }
@@ -1,5 +1,19 @@
1
1
  import type { Command } from "commander";
2
2
  import type { EmitContext } from "../commander.js";
3
+ interface SectionOpts {
4
+ json?: boolean;
5
+ caseSensitive?: boolean;
6
+ }
7
+ interface SectionResult {
8
+ file: string;
9
+ matched_header: string;
10
+ matched_level: number;
11
+ line_start: number;
12
+ line_end: number;
13
+ content: string;
14
+ }
3
15
  export declare function registerTocCommand(program: Command, emit: EmitContext): void;
4
16
  export declare function registerSectionCommand(program: Command, emit: EmitContext): void;
17
+ export declare function runSection(file: string, query: string, opts: SectionOpts): Promise<SectionResult>;
18
+ export {};
5
19
  //# sourceMappingURL=toc.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"toc.d.ts","sourceRoot":"","sources":["../../src/commands/toc.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AA4CnD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,GAAG,IAAI,CAqB5E;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,GAAG,IAAI,CA0BhF"}
1
+ {"version":3,"file":"toc.d.ts","sourceRoot":"","sources":["../../src/commands/toc.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAiBnD,UAAU,WAAW;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAeD,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,GAAG,IAAI,CAqB5E;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,GAAG,IAAI,CA0BhF;AA8ED,wBAAsB,UAAU,CAC9B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,WAAW,GAChB,OAAO,CAAC,aAAa,CAAC,CA+CxB"}
@@ -116,15 +116,18 @@ function renderToc(r) {
116
116
  }
117
117
  return lines.join("\n");
118
118
  }
119
- async function runSection(file, query, opts) {
119
+ export async function runSection(file, query, opts) {
120
120
  if (!query.trim())
121
121
  throw new Error("header query required");
122
122
  const tocResult = await runToc(file, {});
123
123
  const absPath = resolve(file);
124
124
  const lines = readFileSync(absPath, "utf8").split("\n");
125
- const matches = tocResult.headers.filter((h) => opts.caseSensitive
126
- ? h.text.includes(query)
127
- : h.text.toLowerCase().includes(query.toLowerCase()));
125
+ const same = (a, b) => opts.caseSensitive ? a === b : a.toLowerCase() === b.toLowerCase();
126
+ const contains = (a, b) => opts.caseSensitive ? a.includes(b) : a.toLowerCase().includes(b.toLowerCase());
127
+ // A header that equals the query wins over headers that merely contain it,
128
+ // so "Media" can still select "## Media" beside "## Media recipes".
129
+ const exact = tocResult.headers.filter((h) => same(h.text, query.trim()));
130
+ const matches = exact.length > 0 ? exact : tocResult.headers.filter((h) => contains(h.text, query));
128
131
  if (matches.length === 0) {
129
132
  throw new Error(`no header matching "${query}". Run \`${resolveBinName()} toc ${file}\` to list available headers.`);
130
133
  }
@@ -1,10 +1,48 @@
1
1
  import type { Command } from "commander";
2
2
  import type { EmitContext, HarneryProgramContext } from "../commander.js";
3
+ import { type DetectOptions, detectPublicAddresses } from "../lib/tunnel/current-address.js";
3
4
  import { type TunnelProvider, type TunnelState } from "../lib/tunnel/state.js";
4
5
  export declare function tunnelLogDestinations(name: string, provider: TunnelProvider, env?: NodeJS.ProcessEnv, root?: string): {
5
6
  gate: string;
6
7
  provider: string;
7
8
  };
9
+ export interface GateLaunch {
10
+ command: string;
11
+ /** Arguments before the gate's own `--name` and `--port`. */
12
+ arguments: string[];
13
+ }
14
+ export interface GateLaunchInputs {
15
+ /** Absolute path of `lib/tunnel/gate.ts` beside this file, whether or not it exists. */
16
+ gateScript: string;
17
+ gateScriptExists: boolean;
18
+ /** True when this process runs on Bun (so `execPath` is a Bun binary). */
19
+ underBun: boolean;
20
+ execPath: string;
21
+ /** The script this process was started with (`argv[1]`): the host CLI's entry or bundle. */
22
+ entryScript: string | undefined;
23
+ entryScriptExists: boolean;
24
+ bunOnPath: boolean;
25
+ }
26
+ /**
27
+ * How to start the gate worker, which is a `Bun.serve` process (HTTP and
28
+ * WebSocket reverse proxy):
29
+ * 1. From a source or package checkout, `gate.ts` sits beside this module and
30
+ * runs directly.
31
+ * 2. Inside a single-file bundle there is no such file. The CLI then
32
+ * re-executes itself with the hidden `tunnel gate` task, which loads the
33
+ * gate in-process. This uses the running Bun binary, so Bun need not be
34
+ * on PATH.
35
+ * Null means neither works (a Node host with no Bun, or an unknown entry).
36
+ */
37
+ export declare function resolveGateLaunch(i: GateLaunchInputs): GateLaunch | null;
38
+ /**
39
+ * How to start the log wrapper that rotates each process's output. Beside a
40
+ * source or package checkout the default (this package's own wrapper file)
41
+ * works; inside a single-file bundle the CLI re-executes itself with the hidden
42
+ * `tunnel log-worker` task instead.
43
+ */
44
+ export declare function resolveWorkerLaunch(i: GateLaunchInputs): GateLaunch | undefined;
45
+ export declare function downOne(name: string, killed: Set<number>): number;
8
46
  /**
9
47
  * Restart ONE instance's gate in place, deliberately leaving the provider
10
48
  * process running.
@@ -20,5 +58,32 @@ export declare function reloadOne(state: TunnelState): Promise<{
20
58
  ok: boolean;
21
59
  message: string;
22
60
  }>;
61
+ export interface RefreshCurrentOptions {
62
+ emit?: EmitContext;
63
+ /** Reload running Cloudflare gates after an allowlist change, keeping their URLs. */
64
+ reload: boolean;
65
+ /** Speak only when the allowlist changed or no address could be detected. */
66
+ quiet?: boolean;
67
+ /** Lookup timeout and retries; a sync that must not stall offline passes small ones. */
68
+ detectOptions?: DetectOptions;
69
+ /** Replaces the lookup (tests). */
70
+ detect?: typeof detectPublicAddresses;
71
+ }
72
+ export interface RefreshCurrentResult {
73
+ /** False only when a requested reload of a live gate failed. A failed lookup is a warning, not a failure. */
74
+ ok: boolean;
75
+ /** The allowlist gained or lost an entry. */
76
+ changed: boolean;
77
+ /** Entries newly allowed. */
78
+ added: string[];
79
+ removed: string[];
80
+ warnings: string[];
81
+ }
82
+ /**
83
+ * `tunnel allow add --current`: allow this machine's own public addresses, as
84
+ * Cloudflare sees them, and drop the ones allowed by the previous refresh.
85
+ * Exported so a host CLI can run it before `tunnel up` and from its own sync.
86
+ */
87
+ export declare function refreshCurrentAddress(options: RefreshCurrentOptions): Promise<RefreshCurrentResult>;
23
88
  export declare function registerTunnelCommand(program: Command, emitParam: EmitContext, contextParam?: HarneryProgramContext): void;
24
89
  //# sourceMappingURL=tunnel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tunnel.d.ts","sourceRoot":"","sources":["../../src/commands/tunnel.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAgB1E,OAAO,EAYL,KAAK,cAAc,EACnB,KAAK,WAAW,EAGjB,MAAM,wBAAwB,CAAC;AAuDhC,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,cAAc,EACxB,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,IAAI,SAAgB,GACnB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAcpC;AA2sBD;;;;;;;;;;GAUG;AACH,wBAAsB,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAiF7F;AAkND,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,WAAW,EACtB,YAAY,CAAC,EAAE,qBAAqB,GACnC,IAAI,CAkFN"}
1
+ {"version":3,"file":"tunnel.d.ts","sourceRoot":"","sources":["../../src/commands/tunnel.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAiB1E,OAAO,EACL,KAAK,aAAa,EAClB,qBAAqB,EAEtB,MAAM,kCAAkC,CAAC;AAQ1C,OAAO,EAYL,KAAK,cAAc,EACnB,KAAK,WAAW,EAGjB,MAAM,wBAAwB,CAAC;AAyDhC,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,cAAc,EACxB,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,IAAI,SAAgB,GACnB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAcpC;AAmHD,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,6DAA6D;IAC7D,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,wFAAwF;IACxF,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,0EAA0E;IAC1E,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,4FAA4F;IAC5F,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,gBAAgB,GAAG,UAAU,GAAG,IAAI,CAWxE;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,gBAAgB,GAAG,UAAU,GAAG,SAAS,CAM/E;AA2iBD,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,CA0BjE;AA2DD;;;;;;;;;;GAUG;AACH,wBAAsB,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAwF7F;AAoQD,MAAM,WAAW,qBAAqB;IACpC,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,qFAAqF;IACrF,MAAM,EAAE,OAAO,CAAC;IAChB,6EAA6E;IAC7E,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,wFAAwF;IACxF,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,mCAAmC;IACnC,MAAM,CAAC,EAAE,OAAO,qBAAqB,CAAC;CACvC;AAED,MAAM,WAAW,oBAAoB;IACnC,6GAA6G;IAC7G,EAAE,EAAE,OAAO,CAAC;IACZ,6CAA6C;IAC7C,OAAO,EAAE,OAAO,CAAC;IACjB,6BAA6B;IAC7B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,oBAAoB,CAAC,CAuC/B;AAaD,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,WAAW,EACtB,YAAY,CAAC,EAAE,qBAAqB,GACnC,IAAI,CA+GN"}