@sentropic/h2a-runtime 0.81.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 (253) hide show
  1. package/dist/account-pool.d.ts +168 -0
  2. package/dist/account-pool.d.ts.map +1 -0
  3. package/dist/account-pool.js +385 -0
  4. package/dist/account-pool.js.map +1 -0
  5. package/dist/agents-projection.d.ts +56 -0
  6. package/dist/agents-projection.d.ts.map +1 -0
  7. package/dist/agents-projection.js +82 -0
  8. package/dist/agents-projection.js.map +1 -0
  9. package/dist/attach.d.ts +75 -0
  10. package/dist/attach.d.ts.map +1 -0
  11. package/dist/attach.js +432 -0
  12. package/dist/attach.js.map +1 -0
  13. package/dist/auth-bundle.d.ts +21 -0
  14. package/dist/auth-bundle.d.ts.map +1 -0
  15. package/dist/auth-bundle.js +112 -0
  16. package/dist/auth-bundle.js.map +1 -0
  17. package/dist/auth-diagnostics.d.ts +18 -0
  18. package/dist/auth-diagnostics.d.ts.map +1 -0
  19. package/dist/auth-diagnostics.js +23 -0
  20. package/dist/auth-diagnostics.js.map +1 -0
  21. package/dist/auth-login.d.ts +9 -0
  22. package/dist/auth-login.d.ts.map +1 -0
  23. package/dist/auth-login.js +21 -0
  24. package/dist/auth-login.js.map +1 -0
  25. package/dist/auth-refresh.d.ts +32 -0
  26. package/dist/auth-refresh.d.ts.map +1 -0
  27. package/dist/auth-refresh.js +83 -0
  28. package/dist/auth-refresh.js.map +1 -0
  29. package/dist/auth-tools.d.ts +55 -0
  30. package/dist/auth-tools.d.ts.map +1 -0
  31. package/dist/auth-tools.js +163 -0
  32. package/dist/auth-tools.js.map +1 -0
  33. package/dist/browser-bridge-local.d.ts +27 -0
  34. package/dist/browser-bridge-local.d.ts.map +1 -0
  35. package/dist/browser-bridge-local.js +51 -0
  36. package/dist/browser-bridge-local.js.map +1 -0
  37. package/dist/browser.d.ts +53 -0
  38. package/dist/browser.d.ts.map +1 -0
  39. package/dist/browser.js +61 -0
  40. package/dist/browser.js.map +1 -0
  41. package/dist/conductor-launch.d.ts +179 -0
  42. package/dist/conductor-launch.d.ts.map +1 -0
  43. package/dist/conductor-launch.js +414 -0
  44. package/dist/conductor-launch.js.map +1 -0
  45. package/dist/config.d.ts +182 -0
  46. package/dist/config.d.ts.map +1 -0
  47. package/dist/config.js +334 -0
  48. package/dist/config.js.map +1 -0
  49. package/dist/conv-guard.d.ts +76 -0
  50. package/dist/conv-guard.d.ts.map +1 -0
  51. package/dist/conv-guard.js +131 -0
  52. package/dist/conv-guard.js.map +1 -0
  53. package/dist/convsync.d.ts +24 -0
  54. package/dist/convsync.d.ts.map +1 -0
  55. package/dist/convsync.js +108 -0
  56. package/dist/convsync.js.map +1 -0
  57. package/dist/cred-health.d.ts +96 -0
  58. package/dist/cred-health.d.ts.map +1 -0
  59. package/dist/cred-health.js +170 -0
  60. package/dist/cred-health.js.map +1 -0
  61. package/dist/delegate.d.ts +406 -0
  62. package/dist/delegate.d.ts.map +1 -0
  63. package/dist/delegate.js +739 -0
  64. package/dist/delegate.js.map +1 -0
  65. package/dist/enroll.d.ts +91 -0
  66. package/dist/enroll.d.ts.map +1 -0
  67. package/dist/enroll.js +248 -0
  68. package/dist/enroll.js.map +1 -0
  69. package/dist/fanout.d.ts +63 -0
  70. package/dist/fanout.d.ts.map +1 -0
  71. package/dist/fanout.js +115 -0
  72. package/dist/fanout.js.map +1 -0
  73. package/dist/forward.d.ts +66 -0
  74. package/dist/forward.d.ts.map +1 -0
  75. package/dist/forward.js +141 -0
  76. package/dist/forward.js.map +1 -0
  77. package/dist/gitdiff.d.ts +31 -0
  78. package/dist/gitdiff.d.ts.map +1 -0
  79. package/dist/gitdiff.js +133 -0
  80. package/dist/gitdiff.js.map +1 -0
  81. package/dist/h2a-bridge.d.ts +102 -0
  82. package/dist/h2a-bridge.d.ts.map +1 -0
  83. package/dist/h2a-bridge.js +333 -0
  84. package/dist/h2a-bridge.js.map +1 -0
  85. package/dist/h2a-jobs.d.ts +235 -0
  86. package/dist/h2a-jobs.d.ts.map +1 -0
  87. package/dist/h2a-jobs.js +388 -0
  88. package/dist/h2a-jobs.js.map +1 -0
  89. package/dist/h2a-ping.d.ts +38 -0
  90. package/dist/h2a-ping.d.ts.map +1 -0
  91. package/dist/h2a-ping.js +58 -0
  92. package/dist/h2a-ping.js.map +1 -0
  93. package/dist/index.d.ts +98 -0
  94. package/dist/index.d.ts.map +1 -0
  95. package/dist/index.js +5887 -0
  96. package/dist/index.js.map +1 -0
  97. package/dist/interactive-throttle.d.ts +164 -0
  98. package/dist/interactive-throttle.d.ts.map +1 -0
  99. package/dist/interactive-throttle.js +194 -0
  100. package/dist/interactive-throttle.js.map +1 -0
  101. package/dist/lineage-client.d.ts +77 -0
  102. package/dist/lineage-client.d.ts.map +1 -0
  103. package/dist/lineage-client.js +117 -0
  104. package/dist/lineage-client.js.map +1 -0
  105. package/dist/lineage-lease.d.ts +152 -0
  106. package/dist/lineage-lease.d.ts.map +1 -0
  107. package/dist/lineage-lease.js +303 -0
  108. package/dist/lineage-lease.js.map +1 -0
  109. package/dist/llm-gateway-runtime/accounts.d.ts +48 -0
  110. package/dist/llm-gateway-runtime/accounts.d.ts.map +1 -0
  111. package/dist/llm-gateway-runtime/accounts.js +226 -0
  112. package/dist/llm-gateway-runtime/accounts.js.map +1 -0
  113. package/dist/llm-gateway-runtime/index.d.ts +4 -0
  114. package/dist/llm-gateway-runtime/index.d.ts.map +1 -0
  115. package/dist/llm-gateway-runtime/index.js +58 -0
  116. package/dist/llm-gateway-runtime/index.js.map +1 -0
  117. package/dist/llm-gateway-runtime/model-catalog.d.ts +36 -0
  118. package/dist/llm-gateway-runtime/model-catalog.d.ts.map +1 -0
  119. package/dist/llm-gateway-runtime/model-catalog.js +146 -0
  120. package/dist/llm-gateway-runtime/model-catalog.js.map +1 -0
  121. package/dist/llm-gateway-runtime/proxy-anthropic.d.ts +3 -0
  122. package/dist/llm-gateway-runtime/proxy-anthropic.d.ts.map +1 -0
  123. package/dist/llm-gateway-runtime/proxy-anthropic.js +139 -0
  124. package/dist/llm-gateway-runtime/proxy-anthropic.js.map +1 -0
  125. package/dist/llm-gateway-runtime/proxy-openai.d.ts +117 -0
  126. package/dist/llm-gateway-runtime/proxy-openai.d.ts.map +1 -0
  127. package/dist/llm-gateway-runtime/proxy-openai.js +1132 -0
  128. package/dist/llm-gateway-runtime/proxy-openai.js.map +1 -0
  129. package/dist/llm-gateway-runtime/session-ledger.d.ts +32 -0
  130. package/dist/llm-gateway-runtime/session-ledger.d.ts.map +1 -0
  131. package/dist/llm-gateway-runtime/session-ledger.js +62 -0
  132. package/dist/llm-gateway-runtime/session-ledger.js.map +1 -0
  133. package/dist/llm-gateway-runtime/sticky.d.ts +40 -0
  134. package/dist/llm-gateway-runtime/sticky.d.ts.map +1 -0
  135. package/dist/llm-gateway-runtime/sticky.js +254 -0
  136. package/dist/llm-gateway-runtime/sticky.js.map +1 -0
  137. package/dist/llm-mesh.d.ts +102 -0
  138. package/dist/llm-mesh.d.ts.map +1 -0
  139. package/dist/llm-mesh.js +433 -0
  140. package/dist/llm-mesh.js.map +1 -0
  141. package/dist/migrate-candidates.d.ts +35 -0
  142. package/dist/migrate-candidates.d.ts.map +1 -0
  143. package/dist/migrate-candidates.js +128 -0
  144. package/dist/migrate-candidates.js.map +1 -0
  145. package/dist/migrate.d.ts +125 -0
  146. package/dist/migrate.d.ts.map +1 -0
  147. package/dist/migrate.js +561 -0
  148. package/dist/migrate.js.map +1 -0
  149. package/dist/plugin-manifest.d.ts +143 -0
  150. package/dist/plugin-manifest.d.ts.map +1 -0
  151. package/dist/plugin-manifest.js +233 -0
  152. package/dist/plugin-manifest.js.map +1 -0
  153. package/dist/plugin.d.ts +274 -0
  154. package/dist/plugin.d.ts.map +1 -0
  155. package/dist/plugin.js +919 -0
  156. package/dist/plugin.js.map +1 -0
  157. package/dist/pod-liveness.d.ts +51 -0
  158. package/dist/pod-liveness.d.ts.map +1 -0
  159. package/dist/pod-liveness.js +80 -0
  160. package/dist/pod-liveness.js.map +1 -0
  161. package/dist/profile-menu.d.ts +7 -0
  162. package/dist/profile-menu.d.ts.map +1 -0
  163. package/dist/profile-menu.js +52 -0
  164. package/dist/profile-menu.js.map +1 -0
  165. package/dist/profiles.d.ts +23 -0
  166. package/dist/profiles.d.ts.map +1 -0
  167. package/dist/profiles.js +66 -0
  168. package/dist/profiles.js.map +1 -0
  169. package/dist/protocol-local.d.ts +27 -0
  170. package/dist/protocol-local.d.ts.map +1 -0
  171. package/dist/protocol-local.js +12 -0
  172. package/dist/protocol-local.js.map +1 -0
  173. package/dist/pty.d.ts +26 -0
  174. package/dist/pty.d.ts.map +1 -0
  175. package/dist/pty.js +45 -0
  176. package/dist/pty.js.map +1 -0
  177. package/dist/readiness.d.ts +38 -0
  178. package/dist/readiness.d.ts.map +1 -0
  179. package/dist/readiness.js +169 -0
  180. package/dist/readiness.js.map +1 -0
  181. package/dist/registry.d.ts +258 -0
  182. package/dist/registry.d.ts.map +1 -0
  183. package/dist/registry.js +570 -0
  184. package/dist/registry.js.map +1 -0
  185. package/dist/relaunch.d.ts +52 -0
  186. package/dist/relaunch.d.ts.map +1 -0
  187. package/dist/relaunch.js +76 -0
  188. package/dist/relaunch.js.map +1 -0
  189. package/dist/restore.d.ts +165 -0
  190. package/dist/restore.d.ts.map +1 -0
  191. package/dist/restore.js +530 -0
  192. package/dist/restore.js.map +1 -0
  193. package/dist/run.d.ts +29 -0
  194. package/dist/run.d.ts.map +1 -0
  195. package/dist/run.js +206 -0
  196. package/dist/run.js.map +1 -0
  197. package/dist/secrets.d.ts +25 -0
  198. package/dist/secrets.d.ts.map +1 -0
  199. package/dist/secrets.js +98 -0
  200. package/dist/secrets.js.map +1 -0
  201. package/dist/session-restore.d.ts +26 -0
  202. package/dist/session-restore.d.ts.map +1 -0
  203. package/dist/session-restore.js +122 -0
  204. package/dist/session-restore.js.map +1 -0
  205. package/dist/skills-sync.d.ts +126 -0
  206. package/dist/skills-sync.d.ts.map +1 -0
  207. package/dist/skills-sync.js +255 -0
  208. package/dist/skills-sync.js.map +1 -0
  209. package/dist/smoke.d.ts +23 -0
  210. package/dist/smoke.d.ts.map +1 -0
  211. package/dist/smoke.js +138 -0
  212. package/dist/smoke.js.map +1 -0
  213. package/dist/soft-refresh.d.ts +107 -0
  214. package/dist/soft-refresh.d.ts.map +1 -0
  215. package/dist/soft-refresh.js +426 -0
  216. package/dist/soft-refresh.js.map +1 -0
  217. package/dist/sync-status.d.ts +22 -0
  218. package/dist/sync-status.d.ts.map +1 -0
  219. package/dist/sync-status.js +41 -0
  220. package/dist/sync-status.js.map +1 -0
  221. package/dist/sync.d.ts +77 -0
  222. package/dist/sync.d.ts.map +1 -0
  223. package/dist/sync.js +302 -0
  224. package/dist/sync.js.map +1 -0
  225. package/dist/throttle-signatures.d.ts +43 -0
  226. package/dist/throttle-signatures.d.ts.map +1 -0
  227. package/dist/throttle-signatures.js +116 -0
  228. package/dist/throttle-signatures.js.map +1 -0
  229. package/dist/tmux.d.ts +286 -0
  230. package/dist/tmux.d.ts.map +1 -0
  231. package/dist/tmux.js +970 -0
  232. package/dist/tmux.js.map +1 -0
  233. package/dist/tunnel.d.ts +25 -0
  234. package/dist/tunnel.d.ts.map +1 -0
  235. package/dist/tunnel.js +127 -0
  236. package/dist/tunnel.js.map +1 -0
  237. package/dist/workspace-merge.d.ts +17 -0
  238. package/dist/workspace-merge.d.ts.map +1 -0
  239. package/dist/workspace-merge.js +153 -0
  240. package/dist/workspace-merge.js.map +1 -0
  241. package/dist/workspace-sync-incremental.d.ts +64 -0
  242. package/dist/workspace-sync-incremental.d.ts.map +1 -0
  243. package/dist/workspace-sync-incremental.js +199 -0
  244. package/dist/workspace-sync-incremental.js.map +1 -0
  245. package/dist/workspace-sync.d.ts +3 -0
  246. package/dist/workspace-sync.d.ts.map +1 -0
  247. package/dist/workspace-sync.js +187 -0
  248. package/dist/workspace-sync.js.map +1 -0
  249. package/dist/workspace.d.ts +70 -0
  250. package/dist/workspace.d.ts.map +1 -0
  251. package/dist/workspace.js +173 -0
  252. package/dist/workspace.js.map +1 -0
  253. package/package.json +44 -0
@@ -0,0 +1,169 @@
1
+ /**
2
+ * readiness.ts — Phase A
3
+ *
4
+ * Best-effort, network-free readiness check before a session migration.
5
+ * All checks use spawnSync only — no network calls, never throws.
6
+ *
7
+ * Exported: checkReadiness(opts?) → ReadinessResult
8
+ */
9
+ import { existsSync, statSync } from "node:fs";
10
+ import { homedir } from "node:os";
11
+ import { spawnSync } from "node:child_process";
12
+ import { join } from "node:path";
13
+ import { localConvStat } from "./convsync.js";
14
+ // ---------------------------------------------------------------------------
15
+ // Thresholds for lazy mode
16
+ // ---------------------------------------------------------------------------
17
+ /** Max files in working set before switching to "lazy" mode. */
18
+ const LAZY_FILES_THRESHOLD = 200;
19
+ /** Max total bytes (50 MB) in working set before switching to "lazy" mode. */
20
+ const LAZY_BYTES_THRESHOLD = 50 * 1024 * 1024;
21
+ /** Transfer rate estimate: 10 MB/s */
22
+ const TRANSFER_RATE_BYTES_PER_SEC = 10_000_000;
23
+ // ---------------------------------------------------------------------------
24
+ // Implementation
25
+ // ---------------------------------------------------------------------------
26
+ /**
27
+ * Check whether the local workspace is ready for a session migration.
28
+ *
29
+ * All checks are best-effort and synchronous (no network, no throws).
30
+ * Returns a structured ReadinessResult.
31
+ */
32
+ export function checkReadiness(opts = {}) {
33
+ const cwd = opts.cwd ?? process.cwd();
34
+ const profile = opts.profile;
35
+ const home = opts.home ?? homedir();
36
+ const spawn = opts.spawnImpl ?? spawnSync;
37
+ const blockers = [];
38
+ const warnings = [];
39
+ let mode = "full";
40
+ // ------------------------------------------------------------------
41
+ // auth_ok — `remote auth status` rc=0
42
+ // ------------------------------------------------------------------
43
+ try {
44
+ const authResult = spawn("remote", ["auth", "status"], {
45
+ cwd,
46
+ encoding: "utf8",
47
+ timeout: 10_000,
48
+ });
49
+ if (authResult.status !== 0) {
50
+ blockers.push("auth: CLI not authenticated");
51
+ }
52
+ }
53
+ catch {
54
+ blockers.push("auth: CLI not authenticated");
55
+ }
56
+ // ------------------------------------------------------------------
57
+ // repo_bootstrapped — `git rev-parse HEAD` rc=0
58
+ // ------------------------------------------------------------------
59
+ let gitOk = false;
60
+ try {
61
+ const gitResult = spawn("git", ["rev-parse", "HEAD"], {
62
+ cwd,
63
+ encoding: "utf8",
64
+ timeout: 5_000,
65
+ });
66
+ gitOk = gitResult.status === 0;
67
+ if (!gitOk) {
68
+ blockers.push("repo: not a git repository");
69
+ }
70
+ }
71
+ catch {
72
+ blockers.push("repo: not a git repository");
73
+ }
74
+ // ------------------------------------------------------------------
75
+ // plugins_parity_ok — non-blocking warning
76
+ // Not all profiles have a plugin manifest; absence is not a blocker.
77
+ // ------------------------------------------------------------------
78
+ // ------------------------------------------------------------------
79
+ // conv_resolvable — non-blocking warning
80
+ // Claude-profile only: verify a conversation exists for this cwd.
81
+ // Other profiles (codex/agy) don't use path-keyed conversations.
82
+ // ------------------------------------------------------------------
83
+ if (profile !== undefined &&
84
+ (profile === "claude" || profile === "claude-code")) {
85
+ try {
86
+ const conv = localConvStat(cwd, home);
87
+ if (!conv) {
88
+ warnings.push("conv: no local conversation found for this directory — " +
89
+ "migrate will proceed but no active context will be transferred");
90
+ }
91
+ }
92
+ catch {
93
+ // best-effort: skip on any error
94
+ }
95
+ }
96
+ // ------------------------------------------------------------------
97
+ // deps_rebuilt — no-op in local mode
98
+ // ------------------------------------------------------------------
99
+ // ------------------------------------------------------------------
100
+ // hot_set_synced — in "full" mode, check working set size
101
+ // Only meaningful when we have a git repo
102
+ // ------------------------------------------------------------------
103
+ let pendingFiles = 0;
104
+ let pendingBytes = 0;
105
+ if (gitOk) {
106
+ try {
107
+ // Modified/staged files relative to HEAD
108
+ const diffResult = spawn("git", ["diff", "--name-only", "HEAD", "--"], {
109
+ cwd,
110
+ encoding: "utf8",
111
+ timeout: 15_000,
112
+ });
113
+ // Untracked files (not in .gitignore)
114
+ const untrackedResult = spawn("git", ["ls-files", "--others", "--exclude-standard"], {
115
+ cwd,
116
+ encoding: "utf8",
117
+ timeout: 15_000,
118
+ });
119
+ const diffLines = diffResult.status === 0 && diffResult.stdout
120
+ ? diffResult.stdout
121
+ .split("\n")
122
+ .map((l) => l.trim())
123
+ .filter(Boolean)
124
+ : [];
125
+ const untrackedLines = untrackedResult.status === 0 && untrackedResult.stdout
126
+ ? untrackedResult.stdout
127
+ .split("\n")
128
+ .map((l) => l.trim())
129
+ .filter(Boolean)
130
+ : [];
131
+ const allPendingFiles = [...new Set([...diffLines, ...untrackedLines])];
132
+ pendingFiles = allPendingFiles.length;
133
+ // Estimate bytes for pending files
134
+ for (const file of allPendingFiles) {
135
+ try {
136
+ const filePath = join(cwd, file);
137
+ if (existsSync(filePath)) {
138
+ pendingBytes += statSync(filePath).size;
139
+ }
140
+ }
141
+ catch {
142
+ // best-effort: skip files we can't stat
143
+ }
144
+ }
145
+ // Switch to lazy if working set is too large
146
+ if (pendingFiles >= LAZY_FILES_THRESHOLD ||
147
+ pendingBytes >= LAZY_BYTES_THRESHOLD) {
148
+ mode = "lazy";
149
+ }
150
+ }
151
+ catch {
152
+ // best-effort: if git commands fail, leave pendingFiles/pendingBytes at 0
153
+ }
154
+ }
155
+ const est_seconds = Math.ceil(pendingBytes / TRANSFER_RATE_BYTES_PER_SEC);
156
+ const ready = blockers.length === 0;
157
+ return {
158
+ ready,
159
+ mode,
160
+ blockers,
161
+ warnings,
162
+ pending: {
163
+ files: pendingFiles,
164
+ bytes: pendingBytes,
165
+ est_seconds,
166
+ },
167
+ };
168
+ }
169
+ //# sourceMappingURL=readiness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readiness.js","sourceRoot":"","sources":["../src/readiness.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,258 @@
1
+ /**
2
+ * Live-session registry — the source of truth for `remote ls` / `remote
3
+ * restore`, so they stop GUESSING sessions from filesystem mtimes.
4
+ *
5
+ * Entries land here from:
6
+ * - `remote run` (source "run" — local tmux sessions),
7
+ * - Claude Code hooks (source "hook" — `remote enroll --hook claude-*`),
8
+ * - the restore scanner (source "scan" — legacy fallback),
9
+ * - the control-plane (source "remote" — reconciled by the caller).
10
+ *
11
+ * The file is `<configDir>/registry.json`, written atomically (tmp + rename).
12
+ * Every function takes an optional explicit path so tests never touch the real
13
+ * config dir (default path honors REMOTE_CLI_CONFIG_HOME like config.ts).
14
+ */
15
+ export type RegistryTool = "claude" | "codex" | "agy";
16
+ export type RegistryKind = "local-tmux" | "local" | "remote";
17
+ export type RegistrySource = "run" | "hook" | "scan" | "remote";
18
+ /**
19
+ * Delegated-job extension (P1 of cross-type agent delegation). A job IS a
20
+ * RegistryEntry with `role: "job"` — same atomic-write, same liveness guards,
21
+ * same `listLive`. These fields are OPTIONAL so every existing entry stays a
22
+ * valid RegistryEntry (back-compat).
23
+ */
24
+ export type RegistryRole = "job";
25
+ export type JobState = "pending" | "running" | "throttled" | "done" | "failed";
26
+ /**
27
+ * Rate-limit ("throttled") bookkeeping for a HEADLESS LOCAL job whose agent CLI
28
+ * hit a TRANSIENT provider rate-limit (reliability slice 1). A throttled job
29
+ * KEEPS its concurrency slot (the limit is account-wide; admitting a replacement
30
+ * just burns the same quota) and is auto-resumed by the conductor on
31
+ * `nextRetryAt` with exponential backoff, up to a hard attempt cap. All fields
32
+ * are written under `withRegistryLock`; the whole object is optional so every
33
+ * existing entry stays a valid RegistryEntry (back-compat).
34
+ */
35
+ export type ThrottleInfo = {
36
+ /** How many times this job has entered `throttled` (drives the backoff). */
37
+ attempts: number;
38
+ /** ISO ts of the FIRST throttle (for age / history windows). */
39
+ firstAt: string;
40
+ /** ISO ts the conductor may resume the job at (now + jitteredDelay(attempts)). */
41
+ nextRetryAt: string;
42
+ /** The signature tag that classified the last throttle (e.g. claude:rate-limited). */
43
+ lastSignature?: string;
44
+ };
45
+ export type RegistryEntry = {
46
+ /** Stable key: claude session uuid / codex rollout id / remoteId / tmux slug. */
47
+ id: string;
48
+ tool: RegistryTool;
49
+ kind: RegistryKind;
50
+ cwd: string;
51
+ label?: string;
52
+ /** Conversation id usable with the CLI's --resume. */
53
+ convId?: string;
54
+ /** Control-plane session id (kind "remote"). */
55
+ remoteId?: string;
56
+ /** Full tmux session name (kind "local-tmux"), e.g. `remote-surch`. */
57
+ tmuxSession?: string;
58
+ /** Local process id (kind "local"); liveness = process.kill(pid, 0). */
59
+ pid?: number;
60
+ enrolledAt: string;
61
+ lastSeenAt: string;
62
+ endedAt?: string;
63
+ source: RegistrySource;
64
+ /** "job" marks a delegated agent (see `delegate.ts`); absent = a session. */
65
+ role?: RegistryRole;
66
+ /** Lifecycle of a delegated job (role "job" only). */
67
+ jobState?: JobState;
68
+ /** Parent job/session id that delegated this job. */
69
+ parent?: string;
70
+ /** The task the delegated agent was primed with. */
71
+ task?: string;
72
+ /** h2a instance to address the `job.done` callback to (P3); the delegating
73
+ * parent/master. Absent = no callback recipient (best-effort, no-op). */
74
+ callbackTo?: string;
75
+ /**
76
+ * P4 — queued-launch spec. A job over the concurrency cap is enrolled
77
+ * `pending` WITHOUT being launched; the conductor launches it later. These
78
+ * fields carry everything `startJob` needs to launch it from the queue (they
79
+ * are also set on an immediately-launched job, harmlessly). All optional so
80
+ * every existing entry stays a valid RegistryEntry (back-compat).
81
+ */
82
+ /** Run the job in a Pod (the remote control-plane URL), else a local tmux session. */
83
+ remoteTarget?: string;
84
+ /** Run-once-exit headless mode (claude -p / codex exec). */
85
+ headless?: boolean;
86
+ /** The cwd the delegate was invoked from (origin for the per-job worktree/logs). */
87
+ originCwd?: string;
88
+ /** Explicit `--cwd` override (local; used as-is, no worktree). */
89
+ explicitCwd?: string;
90
+ /** Remaining spawn-depth budget this job may spend if it re-delegates (P4 depth clamp). */
91
+ depthBudget?: number;
92
+ /** Track workpackage id to mirror this job under (`track item new --parent`). */
93
+ trackWp?: string;
94
+ /** Rate-limit backoff/resume bookkeeping (HEADLESS LOCAL only; reliability slice 1). */
95
+ throttle?: ThrottleInfo;
96
+ /** Model override passed to the CLI binary (--model for claude, -m for codex). */
97
+ model?: string;
98
+ /** Effort/reasoning override (claude --effort; not supported by codex). */
99
+ effort?: string;
100
+ /** Force a specific account from the pool (bypass selectAccountWithFallback). */
101
+ accountId?: string;
102
+ /**
103
+ * Pinned llm-mesh gateway choice, captured at launch from an EXPLICIT
104
+ * --gw/--no-gw. Re-emitted verbatim by `remote restore` so each instance
105
+ * keeps its own gateway posture instead of falling back to the global
106
+ * default. Absent = launched in "auto" mode (follows the default).
107
+ */
108
+ gatewayMode?: "gateway" | "direct";
109
+ };
110
+ export type EnrollInput = {
111
+ id: string;
112
+ tool: RegistryTool;
113
+ kind: RegistryKind;
114
+ cwd: string;
115
+ source: RegistrySource;
116
+ label?: string;
117
+ convId?: string;
118
+ remoteId?: string;
119
+ tmuxSession?: string;
120
+ pid?: number;
121
+ role?: RegistryRole;
122
+ jobState?: JobState;
123
+ parent?: string;
124
+ task?: string;
125
+ callbackTo?: string;
126
+ remoteTarget?: string;
127
+ headless?: boolean;
128
+ originCwd?: string;
129
+ explicitCwd?: string;
130
+ depthBudget?: number;
131
+ trackWp?: string;
132
+ throttle?: ThrottleInfo;
133
+ model?: string;
134
+ effort?: string;
135
+ accountId?: string;
136
+ gatewayMode?: "gateway" | "direct";
137
+ };
138
+ /** Injectable liveness probes (tests stay deterministic, no tmux/pid needed). */
139
+ export type LivenessOpts = {
140
+ tmuxHasSession?: (name: string) => boolean;
141
+ pidAlive?: (pid: number) => boolean;
142
+ /** System boot time (ms epoch). A `kind:"local"` entry last seen before this
143
+ * is dead — its process died in the reboot, so its PID must not be trusted
144
+ * (PID reuse would falsely resurrect it). Injectable for tests. */
145
+ bootTimeMs?: number;
146
+ /** cmdline of a pid (to detect PID reuse after a crash). Injectable for tests. */
147
+ processCmdline?: (pid: number) => string | undefined;
148
+ };
149
+ type RegistryOpts = LivenessOpts & {
150
+ path?: string;
151
+ };
152
+ export declare function resolveRegistryPath(): string;
153
+ export declare function loadRegistry(path?: string): RegistryEntry[];
154
+ /**
155
+ * Run `fn` under the registry lock: load the current entries, let `fn` mutate
156
+ * them (and compute a return value), then persist atomically — all inside ONE
157
+ * critical section, so concurrent processes serialize and no enroll/advance is
158
+ * lost. `fn` returns `{ entries, result, save? }`: `entries` is what to save
159
+ * (return the same array you mutated), `result` is passed back to the caller, and
160
+ * `save:false` skips the write entirely (a read-only no-op must not rewrite — nor
161
+ * create — the file). If the lock can't be taken (a crashed holder, contention
162
+ * storm), we proceed WITHOUT it rather than block a hook — best-effort,
163
+ * last-writer-wins as before. Exported for tests.
164
+ */
165
+ export declare function withRegistryLock<T>(path: string, fn: (entries: RegistryEntry[]) => {
166
+ entries: RegistryEntry[];
167
+ result: T;
168
+ save?: boolean;
169
+ }): T;
170
+ /**
171
+ * Upsert by id. A re-enroll refreshes lastSeenAt, merges the new fields over
172
+ * the stored ones, and REVIVES an ended entry (endedAt is dropped) — e.g. a
173
+ * claude SessionStart on a resumed conversation.
174
+ */
175
+ export declare function enroll(input: EnrollInput, path?: string): RegistryEntry;
176
+ /**
177
+ * ATOMIC "is there a free slot? → enroll-as-running" (S3 fix). The cap check and
178
+ * the running-enroll happen in ONE locked critical section, so two concurrent
179
+ * `delegate`s can never both see the same free slot and overshoot the cap.
180
+ * `running` counts CURRENT `running` jobs (`role:"job"`); when `running < cap`
181
+ * the `input` is upserted with `jobState:"running"` and the returned entry is
182
+ * non-undefined. When the cap is full, NOTHING is written and `undefined` is
183
+ * returned (the caller enqueues a `pending` entry instead). Exported for tests.
184
+ */
185
+ export declare function tryClaimSlot(input: EnrollInput, cap: number, path?: string): RegistryEntry | undefined;
186
+ export declare function canTransitionJob(from: JobState, to: JobState): boolean;
187
+ /**
188
+ * Does a job in `state` OCCUPY a concurrency slot? `running` does, and so does
189
+ * `throttled` — a throttled job is mid-flight (it KEEPS its slot rather than
190
+ * letting the conductor admit a replacement that would immediately throttle on
191
+ * the same account-wide limit). `pending`/`done`/`failed` do not. Pure, exported
192
+ * for the cap/admission logic in delegate.ts and its tests.
193
+ */
194
+ export declare function occupiesSlot(state: JobState): boolean;
195
+ /**
196
+ * Move a job to `to`, persisting the new state (and stamping endedAt for the
197
+ * terminal states). Returns the updated entry, or undefined when the id is
198
+ * unknown / not a job / the transition is illegal. Reuses the atomic write.
199
+ */
200
+ export declare function advanceJob(id: string, to: JobState, path?: string): RegistryEntry | undefined;
201
+ /** Live job entries (role "job"), liveness reconciled like any other entry. */
202
+ export declare function listJobs(opts?: RegistryOpts): RegistryEntry[];
203
+ /** Refresh lastSeenAt. Returns false when the id is unknown. */
204
+ export declare function touchEntry(id: string, path?: string): boolean;
205
+ /** Record the session's end. Returns false when the id is unknown. */
206
+ export declare function markEnded(id: string, path?: string): boolean;
207
+ /**
208
+ * Liveness:
209
+ * - local-tmux -> the tmux session exists,
210
+ * - local -> pid alive (when recorded) AND not endedAt; without a pid
211
+ * (hook-enrolled: the hook's parent pid is a throwaway shell)
212
+ * we trust SessionEnd + prune,
213
+ * - remote -> always "live" here; the CALLER reconciles against
214
+ * listRemoteSessions (the registry cannot probe the cluster).
215
+ */
216
+ export declare function isLive(e: RegistryEntry, opts?: LivenessOpts): boolean;
217
+ /** Entries considered live right now (see isLive for the per-kind rules). */
218
+ export declare function listLive(opts?: RegistryOpts): RegistryEntry[];
219
+ /**
220
+ * Drop DEAD entries whose last activity (endedAt, else lastSeenAt) is older
221
+ * than maxAgeHours. Live entries always stay; recently-dead ones stay too so
222
+ * `restore` can still resume them after a reboot via the scan fallback.
223
+ * Returns the number of removed entries.
224
+ */
225
+ export declare function prune(maxAgeHours: number, opts?: RegistryOpts): number;
226
+ /** Map a CLI profile name to a registry tool (undefined for shell/opencode/…). */
227
+ export declare function coerceRegistryTool(profile: string): RegistryTool | undefined;
228
+ /**
229
+ * Auto-enrolment after `remote run` started a local tmux session. Best-effort
230
+ * plumbing: never throws (a registry hiccup must not break the run).
231
+ */
232
+ export declare function enrollFromRun(args: {
233
+ profile: string;
234
+ slug: string;
235
+ tmuxSession: string;
236
+ cwd: string;
237
+ convId?: string;
238
+ gatewayMode?: "gateway" | "direct";
239
+ }): void;
240
+ export type LocalLsRow = {
241
+ slug: string;
242
+ profile: string;
243
+ state: "attached" | "detached" | "live";
244
+ path: string;
245
+ /** "registry" = enrolled (reliable cwd/convId); "guess" = tmux-only. */
246
+ badge: "registry" | "guess";
247
+ /** custom display name set via `remote rename`, shown in PROJECT column */
248
+ displayName?: string;
249
+ };
250
+ /**
251
+ * LOCAL rows for `remote ls`: live tmux sessions joined with the registry
252
+ * ([registry] vs [guess] badge), plus live registry-only sessions (e.g. a
253
+ * hook-enrolled claude running in a plain terminal). Dead registry entries are
254
+ * pruned on the way (layout maxAgeHours).
255
+ */
256
+ export declare function listLocalForLs(opts?: RegistryOpts): LocalLsRow[];
257
+ export {};
258
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}