@sentropic/h2a 0.90.0 → 0.90.2

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 (47) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/.codex-plugin/plugin.json +1 -1
  3. package/dist/bin.js +17 -0
  4. package/dist/bin.js.map +1 -1
  5. package/dist/cli-contract.js +2 -2
  6. package/dist/cli-contract.js.map +1 -1
  7. package/dist/cli.d.ts +6 -1
  8. package/dist/cli.d.ts.map +1 -1
  9. package/dist/cli.js +68 -7
  10. package/dist/cli.js.map +1 -1
  11. package/dist/hosts/installation-doctor.d.ts +119 -0
  12. package/dist/hosts/installation-doctor.d.ts.map +1 -0
  13. package/dist/hosts/installation-doctor.js +2093 -0
  14. package/dist/hosts/installation-doctor.js.map +1 -0
  15. package/dist/index.d.ts +1 -0
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +1 -0
  18. package/dist/index.js.map +1 -1
  19. package/dist/runtime/feed/index.d.ts +1 -0
  20. package/dist/runtime/feed/index.d.ts.map +1 -1
  21. package/dist/runtime/feed/index.js +1 -0
  22. package/dist/runtime/feed/index.js.map +1 -1
  23. package/dist/runtime/feed/local.d.ts +43 -0
  24. package/dist/runtime/feed/local.d.ts.map +1 -0
  25. package/dist/runtime/feed/local.js +31 -0
  26. package/dist/runtime/feed/local.js.map +1 -0
  27. package/dist/runtime/host-config-root.d.ts +15 -0
  28. package/dist/runtime/host-config-root.d.ts.map +1 -0
  29. package/dist/runtime/host-config-root.js +26 -0
  30. package/dist/runtime/host-config-root.js.map +1 -0
  31. package/dist/runtime/identity/readers.d.ts.map +1 -1
  32. package/dist/runtime/identity/readers.js +4 -3
  33. package/dist/runtime/identity/readers.js.map +1 -1
  34. package/dist/runtime/local-files/paths.d.ts.map +1 -1
  35. package/dist/runtime/local-files/paths.js +10 -1
  36. package/dist/runtime/local-files/paths.js.map +1 -1
  37. package/dist/runtime/mcp/handlers.d.ts.map +1 -1
  38. package/dist/runtime/mcp/handlers.js +2 -1
  39. package/dist/runtime/mcp/handlers.js.map +1 -1
  40. package/dist/runtime/version/agent-version.d.ts.map +1 -1
  41. package/dist/runtime/version/agent-version.js +3 -2
  42. package/dist/runtime/version/agent-version.js.map +1 -1
  43. package/dist/status-bar-writer.d.ts +39 -0
  44. package/dist/status-bar-writer.d.ts.map +1 -0
  45. package/dist/status-bar-writer.js +249 -0
  46. package/dist/status-bar-writer.js.map +1 -0
  47. package/package.json +2 -2
@@ -0,0 +1,249 @@
1
+ import { closeSync, mkdirSync, openSync, readFileSync, renameSync, statSync, unlinkSync, utimesSync, writeFileSync, writeSync, } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { readStatusSnapshot, renderStatusBar, renderWorkloadBar, } from "./status-surface.js";
4
+ /**
5
+ * Single background producer of tmux status-bar text.
6
+ *
7
+ * The 2026-07-31 spawn storm: the installed surface embedded
8
+ * `#(h2a status --bar ...)` in status-left AND status-right, and tmux re-runs
9
+ * both commands once per status-interval for EVERY session — two node
10
+ * startups per session per 5s (~16/s at 40 sessions, measured load 197). The
11
+ * surface now embeds only `#(cat <file>)`; this writer is the one process
12
+ * that computes every session's bar text and publishes it to those files.
13
+ *
14
+ * Self-limiting by construction: a lease makes it single-instance per h2a
15
+ * root, it exits once no installed session remains, and each tick costs two
16
+ * bounded tmux list calls plus in-process rendering — never a subprocess per
17
+ * session.
18
+ */
19
+ /** Duplicated in @sentropic/h2a-runtime (tmux.ts): the CLI is a peer, not an import. */
20
+ export const STATUS_BAR_WRITER_LOCK_FILE = "writer.lock";
21
+ const DEFAULT_INTERVAL_MS = 5000;
22
+ const DEFAULT_STALE_MS = 60_000;
23
+ /**
24
+ * Take the single-writer lease. A held lock only blocks us while its holder
25
+ * is alive AND fresh: liveness alone is not enough (pid reuse after a crash),
26
+ * freshness alone is not enough (a hung writer keeps refreshing nothing).
27
+ */
28
+ export function acquireStatusBarWriterLease(dir, probe) {
29
+ mkdirSync(dir, { recursive: true });
30
+ const lockPath = join(dir, STATUS_BAR_WRITER_LOCK_FILE);
31
+ const payload = JSON.stringify({
32
+ pid: probe.pid,
33
+ acquiredAt: new Date().toISOString(),
34
+ });
35
+ const tryExclusive = () => {
36
+ try {
37
+ const fd = openSync(lockPath, "wx");
38
+ try {
39
+ writeSync(fd, payload);
40
+ }
41
+ finally {
42
+ closeSync(fd);
43
+ }
44
+ return true;
45
+ }
46
+ catch {
47
+ return false;
48
+ }
49
+ };
50
+ if (tryExclusive())
51
+ return true;
52
+ try {
53
+ const fresh = Date.now() - statSync(lockPath).mtimeMs <=
54
+ (probe.staleMs ?? DEFAULT_STALE_MS);
55
+ const holder = JSON.parse(readFileSync(lockPath, "utf8"));
56
+ if (fresh && typeof holder.pid === "number" && probe.isAlive(holder.pid)) {
57
+ return false;
58
+ }
59
+ }
60
+ catch {
61
+ // Unreadable lock: treat as stale.
62
+ }
63
+ try {
64
+ unlinkSync(lockPath);
65
+ }
66
+ catch {
67
+ // Lost the removal race; the winner holds a valid lease.
68
+ }
69
+ return tryExclusive();
70
+ }
71
+ /** Touch the lock so ensure-side staleness checks see a live writer. */
72
+ export function refreshStatusBarWriterLease(dir, pid) {
73
+ const lockPath = join(dir, STATUS_BAR_WRITER_LOCK_FILE);
74
+ try {
75
+ const holder = JSON.parse(readFileSync(lockPath, "utf8"));
76
+ if (holder.pid !== pid)
77
+ return false;
78
+ const now = new Date();
79
+ utimesSync(lockPath, now, now);
80
+ return true;
81
+ }
82
+ catch {
83
+ return false;
84
+ }
85
+ }
86
+ export function releaseStatusBarWriterLease(dir, pid) {
87
+ const lockPath = join(dir, STATUS_BAR_WRITER_LOCK_FILE);
88
+ try {
89
+ const holder = JSON.parse(readFileSync(lockPath, "utf8"));
90
+ if (holder.pid !== pid)
91
+ return;
92
+ unlinkSync(lockPath);
93
+ }
94
+ catch {
95
+ // Already gone.
96
+ }
97
+ }
98
+ async function loadStatusBarRuntime() {
99
+ try {
100
+ const packageName = "@sentropic/h2a-runtime";
101
+ const runtime = (await import(packageName));
102
+ if (typeof runtime.listStatusBarTargets !== "function" ||
103
+ typeof runtime.statusBarFilesForSession !== "function" ||
104
+ typeof runtime.statusBarRoot !== "function") {
105
+ return undefined;
106
+ }
107
+ return runtime;
108
+ }
109
+ catch {
110
+ return undefined;
111
+ }
112
+ }
113
+ function processIsAlive(pid) {
114
+ try {
115
+ process.kill(pid, 0);
116
+ return true;
117
+ }
118
+ catch (error) {
119
+ return error.code === "EPERM";
120
+ }
121
+ }
122
+ function writeAtomic(path, text) {
123
+ const tmp = join(dirname(path), `.${process.pid}.tmp`);
124
+ writeFileSync(tmp, text);
125
+ renameSync(tmp, path);
126
+ }
127
+ function delay(ms, signal) {
128
+ return new Promise((resolve) => {
129
+ let settled = false;
130
+ const finish = () => {
131
+ if (settled)
132
+ return;
133
+ settled = true;
134
+ clearTimeout(timer);
135
+ signal?.removeEventListener("abort", onAbort);
136
+ resolve();
137
+ };
138
+ const onAbort = () => finish();
139
+ const timer = setTimeout(finish, ms);
140
+ if (signal?.aborted)
141
+ finish();
142
+ else
143
+ signal?.addEventListener("abort", onAbort, { once: true });
144
+ });
145
+ }
146
+ async function renderLeftBar(root, target) {
147
+ const snapshot = await readStatusSnapshot({
148
+ root,
149
+ tmuxSession: target.session,
150
+ ...(target.ownerInstance ? { ownerInstance: target.ownerInstance } : {}),
151
+ includeGateway: false,
152
+ includeManagedInventory: false,
153
+ includePresence: false,
154
+ });
155
+ return renderWorkloadBar(snapshot);
156
+ }
157
+ async function renderRightBar(root, target) {
158
+ const snapshot = await readStatusSnapshot({
159
+ root,
160
+ tmuxSession: target.session,
161
+ includePresence: false,
162
+ includeDelegations: false,
163
+ includeManagedInventory: false,
164
+ includeInbox: false,
165
+ includeLoops: false,
166
+ });
167
+ // Mirror the CLI bar: reserve room for the static left marker and clock;
168
+ // the route is omitted rather than silently cut when it cannot fit.
169
+ const gatewayWidth = target.clientWidth === undefined
170
+ ? undefined
171
+ : Math.max(0, target.clientWidth - 32);
172
+ return renderStatusBar(snapshot, "gateway", gatewayWidth);
173
+ }
174
+ export async function runStatusBarWriter(options, streams) {
175
+ const runtime = await loadStatusBarRuntime();
176
+ if (!runtime) {
177
+ streams.stderr.write("h2a status --write-bars: @sentropic/h2a-runtime is unavailable; bars keep their static placeholders\n");
178
+ return 1;
179
+ }
180
+ const dir = runtime.statusBarRoot(options.root);
181
+ const pid = process.pid;
182
+ if (!acquireStatusBarWriterLease(dir, { pid, isAlive: processIsAlive })) {
183
+ // Another live writer already produces the bars; arriving second is the
184
+ // normal outcome of every install calling ensure.
185
+ return 0;
186
+ }
187
+ const interval = options.intervalMs ?? DEFAULT_INTERVAL_MS;
188
+ const written = new Set();
189
+ let emptyTicks = 0;
190
+ try {
191
+ while (!options.signal?.aborted) {
192
+ const targets = runtime.listStatusBarTargets();
193
+ if (targets.length === 0) {
194
+ emptyTicks += 1;
195
+ // Self-limiting: two consecutive empty ticks mean no installed
196
+ // session remains, so the writer leaves instead of idling forever.
197
+ if (emptyTicks >= 2)
198
+ break;
199
+ }
200
+ else {
201
+ emptyTicks = 0;
202
+ }
203
+ const current = new Set();
204
+ for (const target of targets) {
205
+ const files = runtime.statusBarFilesForSession(target.session, options.root);
206
+ current.add(files.left);
207
+ current.add(files.right);
208
+ try {
209
+ writeAtomic(files.left, await renderLeftBar(options.root, target));
210
+ writeAtomic(files.right, await renderRightBar(options.root, target));
211
+ written.add(files.left);
212
+ written.add(files.right);
213
+ }
214
+ catch {
215
+ // One session's failed render keeps its previous text for a tick;
216
+ // absence still degrades to the static placeholder, never a spawn.
217
+ }
218
+ }
219
+ for (const file of [...written]) {
220
+ if (current.has(file))
221
+ continue;
222
+ try {
223
+ unlinkSync(file);
224
+ }
225
+ catch {
226
+ // Already gone.
227
+ }
228
+ written.delete(file);
229
+ }
230
+ refreshStatusBarWriterLease(dir, pid);
231
+ await delay(interval, options.signal);
232
+ }
233
+ return 0;
234
+ }
235
+ finally {
236
+ // Leave placeholders, not last-known lies: a stopped writer must not
237
+ // freeze yesterday's counts on the bar.
238
+ for (const file of written) {
239
+ try {
240
+ unlinkSync(file);
241
+ }
242
+ catch {
243
+ // Already gone.
244
+ }
245
+ }
246
+ releaseStatusBarWriterLease(dir, pid);
247
+ }
248
+ }
249
+ //# sourceMappingURL=status-bar-writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-bar-writer.js","sourceRoot":"","sources":["../src/status-bar-writer.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sentropic/h2a",
3
- "version": "0.90.0",
3
+ "version": "0.90.2",
4
4
  "description": "h2a — the unified CLI + core for human-to-agent coordination.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -52,7 +52,7 @@
52
52
  "@hono/mcp": "^0.3.0",
53
53
  "@hono/node-server": "^2.0.12",
54
54
  "@modelcontextprotocol/sdk": "^1.30.0",
55
- "@sentropic/track": "^0.90.0",
55
+ "@sentropic/track": "^0.90.2",
56
56
  "hono": "^4.12.32"
57
57
  },
58
58
  "peerDependencies": {