@sentropic/h2a-runtime 0.98.3 → 0.98.5

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 (49) hide show
  1. package/dist/gateway-host/sessions.d.ts +6 -0
  2. package/dist/gateway-host/sessions.d.ts.map +1 -1
  3. package/dist/gateway-host/sessions.js +64 -0
  4. package/dist/gateway-host/sessions.js.map +1 -1
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +35 -10
  7. package/dist/index.js.map +1 -1
  8. package/dist/llm-mesh-accounts.d.ts +15 -2
  9. package/dist/llm-mesh-accounts.d.ts.map +1 -1
  10. package/dist/llm-mesh-accounts.js +13 -3
  11. package/dist/llm-mesh-accounts.js.map +1 -1
  12. package/dist/native-terminal/crash-safe-log.d.ts +17 -0
  13. package/dist/native-terminal/crash-safe-log.d.ts.map +1 -0
  14. package/dist/native-terminal/crash-safe-log.js +79 -0
  15. package/dist/native-terminal/crash-safe-log.js.map +1 -0
  16. package/dist/native-terminal/fault-counters.d.ts +38 -0
  17. package/dist/native-terminal/fault-counters.d.ts.map +1 -0
  18. package/dist/native-terminal/fault-counters.js +46 -0
  19. package/dist/native-terminal/fault-counters.js.map +1 -0
  20. package/dist/native-terminal/host.d.ts.map +1 -1
  21. package/dist/native-terminal/host.js +98 -37
  22. package/dist/native-terminal/host.js.map +1 -1
  23. package/dist/native-terminal/journal.d.ts +5 -1
  24. package/dist/native-terminal/journal.d.ts.map +1 -1
  25. package/dist/native-terminal/journal.js +4 -1
  26. package/dist/native-terminal/journal.js.map +1 -1
  27. package/dist/native-terminal/process.d.ts.map +1 -1
  28. package/dist/native-terminal/process.js +38 -11
  29. package/dist/native-terminal/process.js.map +1 -1
  30. package/dist/native-terminal/server.d.ts +31 -0
  31. package/dist/native-terminal/server.d.ts.map +1 -1
  32. package/dist/native-terminal/server.js +196 -45
  33. package/dist/native-terminal/server.js.map +1 -1
  34. package/dist/native-terminal/socket-path.d.ts +1 -0
  35. package/dist/native-terminal/socket-path.d.ts.map +1 -1
  36. package/dist/native-terminal/socket-path.js +3 -3
  37. package/dist/native-terminal/socket-path.js.map +1 -1
  38. package/dist/native-terminal/supervisor.d.ts.map +1 -1
  39. package/dist/native-terminal/supervisor.js +60 -1
  40. package/dist/native-terminal/supervisor.js.map +1 -1
  41. package/dist/registry.d.ts +23 -0
  42. package/dist/registry.d.ts.map +1 -1
  43. package/dist/registry.js +53 -0
  44. package/dist/registry.js.map +1 -1
  45. package/dist/resume-launch-options.d.ts +59 -0
  46. package/dist/resume-launch-options.d.ts.map +1 -0
  47. package/dist/resume-launch-options.js +64 -0
  48. package/dist/resume-launch-options.js.map +1 -0
  49. package/package.json +1 -1
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Pinned launch options for `runtime:run --resume` — recovery + SELF-HEAL of
3
+ * the conflicting-rows outage (2026-10): two registry rows for one
4
+ * convId/cwd/tool with different bare/gatewayMode pins used to be a bare fatal
5
+ * ("cannot recover pinned launch options: conflicting registry rows") that
6
+ * blocked EVERY resume of that conversation, even when all but one row
7
+ * provably described a dead session.
8
+ *
9
+ * The resolution: probe each conflicting row with the SAME 3-state vocabulary
10
+ * as the managed-host resolver (`probeManagedRowLiveness`). A row whose
11
+ * session is PROVABLY dead (dead probe, or positively ended) is pruned from
12
+ * the registry under the lock (`removeRegistryRowsById`); a live or UNKNOWN
13
+ * row stays (fail closed — a probe failure is never death). When one row (or
14
+ * none) remains, the resume continues normally with it; a still-conflicting
15
+ * set stays a fatal, but now naming the ids in cause and the repair action
16
+ * instead of leaving the operator to guess.
17
+ */
18
+ import { type ManagedHostProbeResult, type RegistryEntry } from "./registry.js";
19
+ /** Injectable session probes (tests stay deterministic, no tmux/host needed). */
20
+ export type ResumeLaunchProbes = {
21
+ readonly native?: (name: string) => ManagedHostProbeResult;
22
+ readonly tmux?: (name: string) => ManagedHostProbeResult;
23
+ };
24
+ /**
25
+ * Same conflict predicate as the pre-self-heal fatal: any row pinning launch
26
+ * options (bare/gatewayMode) that differ from the first row's. All rows in the
27
+ * set share convId/cwd/tool, so ANY difference poisons the whole set.
28
+ */
29
+ export declare function pinnedLaunchOptionsConflict(entries: readonly RegistryEntry[]): boolean;
30
+ /** Actionable fatal for a conflict that survived the self-heal. */
31
+ export declare function conflictingRowsReason(ids: readonly string[]): string;
32
+ export type PinnedLaunchResolution = {
33
+ readonly state: "unreadable";
34
+ readonly reason: string;
35
+ } | {
36
+ readonly state: "conflict";
37
+ readonly reason: string;
38
+ readonly ids: readonly string[];
39
+ } | {
40
+ readonly state: "ok";
41
+ readonly entries: RegistryEntry[];
42
+ readonly prunedIds: readonly string[];
43
+ };
44
+ /**
45
+ * Resolve the rows that pin launch options for a resume of `convId` in `cwd`
46
+ * under tool `tool`: read the registry (3-state), keep only managed local rows
47
+ * for this conversation, self-heal a conflicting set by pruning provably-dead
48
+ * rows, and report what remains. Pure over injectable probes; the registry
49
+ * write (pruning) goes through the registry lock.
50
+ */
51
+ export declare function resolvePinnedLaunchEntries(args: {
52
+ readonly convId: string;
53
+ readonly cwd: string;
54
+ readonly tool: string;
55
+ /** Defaults to the canonical registry path (honors REMOTE_CLI_CONFIG_HOME). */
56
+ readonly registryPath?: string;
57
+ readonly probes?: ResumeLaunchProbes;
58
+ }): PinnedLaunchResolution;
59
+ //# sourceMappingURL=resume-launch-options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resume-launch-options.d.ts","sourceRoot":"","sources":["../src/resume-launch-options.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAML,KAAK,sBAAsB,EAC3B,KAAK,aAAa,EACnB,MAAM,eAAe,CAAC;AAEvB,iFAAiF;AACjF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,sBAAsB,CAAC;IAC3D,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,sBAAsB,CAAC;CAC1D,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,SAAS,aAAa,EAAE,GAChC,OAAO,CAIT;AAED,mEAAmE;AACnE,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAKpE;AAED,MAAM,MAAM,sBAAsB,GAC9B;IAAE,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACzD;IAAE,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GACxF;IAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,aAAa,EAAE,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAC;AAEvG;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE;IAC/C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,+EAA+E;IAC/E,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,kBAAkB,CAAC;CACtC,GAAG,sBAAsB,CA0BzB"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Pinned launch options for `runtime:run --resume` — recovery + SELF-HEAL of
3
+ * the conflicting-rows outage (2026-10): two registry rows for one
4
+ * convId/cwd/tool with different bare/gatewayMode pins used to be a bare fatal
5
+ * ("cannot recover pinned launch options: conflicting registry rows") that
6
+ * blocked EVERY resume of that conversation, even when all but one row
7
+ * provably described a dead session.
8
+ *
9
+ * The resolution: probe each conflicting row with the SAME 3-state vocabulary
10
+ * as the managed-host resolver (`probeManagedRowLiveness`). A row whose
11
+ * session is PROVABLY dead (dead probe, or positively ended) is pruned from
12
+ * the registry under the lock (`removeRegistryRowsById`); a live or UNKNOWN
13
+ * row stays (fail closed — a probe failure is never death). When one row (or
14
+ * none) remains, the resume continues normally with it; a still-conflicting
15
+ * set stays a fatal, but now naming the ids in cause and the repair action
16
+ * instead of leaving the operator to guess.
17
+ */
18
+ import { isManagedLocalKind, loadRegistry, probeManagedRowLiveness, removeRegistryRowsById, resolveRegistryPath, } from "./registry.js";
19
+ /**
20
+ * Same conflict predicate as the pre-self-heal fatal: any row pinning launch
21
+ * options (bare/gatewayMode) that differ from the first row's. All rows in the
22
+ * set share convId/cwd/tool, so ANY difference poisons the whole set.
23
+ */
24
+ export function pinnedLaunchOptionsConflict(entries) {
25
+ return entries.some((entry) => entry.bare !== entries[0]?.bare || entry.gatewayMode !== entries[0]?.gatewayMode);
26
+ }
27
+ /** Actionable fatal for a conflict that survived the self-heal. */
28
+ export function conflictingRowsReason(ids) {
29
+ return ("cannot recover pinned launch options: conflicting registry rows: ids " +
30
+ `${ids.join(", ")} — stop the stale session or remove its row`);
31
+ }
32
+ /**
33
+ * Resolve the rows that pin launch options for a resume of `convId` in `cwd`
34
+ * under tool `tool`: read the registry (3-state), keep only managed local rows
35
+ * for this conversation, self-heal a conflicting set by pruning provably-dead
36
+ * rows, and report what remains. Pure over injectable probes; the registry
37
+ * write (pruning) goes through the registry lock.
38
+ */
39
+ export function resolvePinnedLaunchEntries(args) {
40
+ const registryPath = args.registryPath ?? resolveRegistryPath();
41
+ const read = loadRegistry(registryPath);
42
+ if (read.state === "unknown") {
43
+ return { state: "unreadable", reason: read.reason };
44
+ }
45
+ let entries = read.entries.filter((entry) => isManagedLocalKind(entry.kind) && entry.convId === args.convId &&
46
+ entry.cwd === args.cwd && entry.tool === args.tool);
47
+ if (!pinnedLaunchOptionsConflict(entries)) {
48
+ return { state: "ok", entries, prunedIds: [] };
49
+ }
50
+ const deadIds = entries
51
+ .filter((entry) => probeManagedRowLiveness(entry, args.probes) === "dead")
52
+ .map((entry) => entry.id);
53
+ if (deadIds.length > 0) {
54
+ removeRegistryRowsById(deadIds, registryPath);
55
+ const pruned = new Set(deadIds);
56
+ entries = entries.filter((entry) => !pruned.has(entry.id));
57
+ }
58
+ if (pinnedLaunchOptionsConflict(entries)) {
59
+ const ids = entries.map((entry) => entry.id);
60
+ return { state: "conflict", ids, reason: conflictingRowsReason(ids) };
61
+ }
62
+ return { state: "ok", entries, prunedIds: deadIds };
63
+ }
64
+ //# sourceMappingURL=resume-launch-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resume-launch-options.js","sourceRoot":"","sources":["../src/resume-launch-options.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,uBAAuB,EACvB,sBAAsB,EACtB,mBAAmB,GAGpB,MAAM,eAAe,CAAC;AAQvB;;;;GAIG;AACH,MAAM,UAAU,2BAA2B,CACzC,OAAiC;IAEjC,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAC5B,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,KAAK,CAAC,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,WAAW,CACjF,CAAC;AACJ,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,qBAAqB,CAAC,GAAsB;IAC1D,OAAO,CACL,uEAAuE;QACvE,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,6CAA6C,CAC/D,CAAC;AACJ,CAAC;AAOD;;;;;;GAMG;AACH,MAAM,UAAU,0BAA0B,CAAC,IAO1C;IACC,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,mBAAmB,EAAE,CAAC;IAChE,MAAM,IAAI,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;IACxC,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IACtD,CAAC;IACD,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAC1C,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM;QAC9D,KAAK,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CACnD,CAAC;IACF,IAAI,CAAC,2BAA2B,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1C,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IACjD,CAAC;IACD,MAAM,OAAO,GAAG,OAAO;SACpB,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,uBAAuB,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,MAAM,CAAC;SACzE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC5B,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,sBAAsB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;QAChC,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7D,CAAC;IACD,IAAI,2BAA2B,CAAC,OAAO,CAAC,EAAE,CAAC;QACzC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC7C,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,qBAAqB,CAAC,GAAG,CAAC,EAAE,CAAC;IACxE,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;AACtD,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sentropic/h2a-runtime",
3
- "version": "0.98.3",
3
+ "version": "0.98.5",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {