@sentropic/h2a-cli 0.9.0 → 0.11.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 (52) hide show
  1. package/dist/cli-contract.d.ts.map +1 -1
  2. package/dist/cli-contract.js +26 -2
  3. package/dist/cli-contract.js.map +1 -1
  4. package/dist/cli.d.ts.map +1 -1
  5. package/dist/cli.js +81 -4
  6. package/dist/cli.js.map +1 -1
  7. package/dist/index.d.ts +3 -2
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +2 -1
  10. package/dist/index.js.map +1 -1
  11. package/dist/mcp.d.ts +1 -1
  12. package/dist/mcp.d.ts.map +1 -1
  13. package/dist/mcp.js +4 -1
  14. package/dist/mcp.js.map +1 -1
  15. package/dist/runtime/blockage/index.d.ts +3 -0
  16. package/dist/runtime/blockage/index.d.ts.map +1 -0
  17. package/dist/runtime/blockage/index.js +3 -0
  18. package/dist/runtime/blockage/index.js.map +1 -0
  19. package/dist/runtime/blockage/notifiers.d.ts +52 -0
  20. package/dist/runtime/blockage/notifiers.d.ts.map +1 -0
  21. package/dist/runtime/blockage/notifiers.js +74 -0
  22. package/dist/runtime/blockage/notifiers.js.map +1 -0
  23. package/dist/runtime/blockage/registry.d.ts +30 -0
  24. package/dist/runtime/blockage/registry.d.ts.map +1 -0
  25. package/dist/runtime/blockage/registry.js +86 -0
  26. package/dist/runtime/blockage/registry.js.map +1 -0
  27. package/dist/runtime/drumbeat/index.d.ts +1 -0
  28. package/dist/runtime/drumbeat/index.d.ts.map +1 -1
  29. package/dist/runtime/drumbeat/index.js +1 -0
  30. package/dist/runtime/drumbeat/index.js.map +1 -1
  31. package/dist/runtime/drumbeat/relaunchers.d.ts +53 -0
  32. package/dist/runtime/drumbeat/relaunchers.d.ts.map +1 -0
  33. package/dist/runtime/drumbeat/relaunchers.js +93 -0
  34. package/dist/runtime/drumbeat/relaunchers.js.map +1 -0
  35. package/dist/runtime/local-files/paths.d.ts +1 -0
  36. package/dist/runtime/local-files/paths.d.ts.map +1 -1
  37. package/dist/runtime/local-files/paths.js +2 -1
  38. package/dist/runtime/local-files/paths.js.map +1 -1
  39. package/dist/runtime/mcp/handlers.d.ts +14 -0
  40. package/dist/runtime/mcp/handlers.d.ts.map +1 -1
  41. package/dist/runtime/mcp/handlers.js +51 -0
  42. package/dist/runtime/mcp/handlers.js.map +1 -1
  43. package/dist/runtime/mcp/notifications.d.ts.map +1 -1
  44. package/dist/runtime/mcp/notifications.js +33 -3
  45. package/dist/runtime/mcp/notifications.js.map +1 -1
  46. package/dist/runtime/mcp/server.d.ts.map +1 -1
  47. package/dist/runtime/mcp/server.js +7 -1
  48. package/dist/runtime/mcp/server.js.map +1 -1
  49. package/dist/runtime/mcp/tools.d.ts.map +1 -1
  50. package/dist/runtime/mcp/tools.js +37 -0
  51. package/dist/runtime/mcp/tools.js.map +1 -1
  52. package/package.json +2 -2
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC7F,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAUlD,OAAO,EACL,eAAe,EACf,cAAc,EACd,eAAe,EACf,sBAAsB,EACtB,aAAa,EACb,MAAM,EACN,WAAW,EACX,aAAa,EACb,cAAc,EACf,CAAC;AAEF,OAAO,EACL,sBAAsB,EACtB,6BAA6B,EAI9B,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,qBAAqB,EACrB,wBAAwB,EACxB,gBAAgB,EAChB,wBAAwB,EACxB,gBAAgB,EAChB,cAAc,EACd,QAAQ,EACR,YAAY,EACZ,eAAe,EACf,cAAc,EACd,sBAAsB,EACtB,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,SAAS,EACT,aAAa,EACb,QAAQ,EACR,YAAY,EACZ,aAAa,EAiBd,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACL,4BAA4B,EAC5B,sBAAsB,EACtB,eAAe,EACf,eAAe,EACf,WAAW,EAYZ,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,gBAAgB,EAGjB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EACL,eAAe,EAGhB,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,YAAY,EACZ,kBAAkB,EAClB,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,wBAAwB,EAQzB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,EACf,oBAAoB,EACpB,kBAAkB,EAQnB,MAAM,2BAA2B,CAAC;AAEnC,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,cAAc;IACd,eAAe;IACf,eAAe;CACP,CAAC;AAEX,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,WAAW,EAAE,oBAAoB;IACjC,eAAe,EAAE,gBAAgB;IACjC,QAAQ,EAAE,eAAe;IACzB,KAAK,EAAE,aAAa;IACpB,YAAY,EAAE,sBAAsB;CAC5B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC7F,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAUlD,OAAO,EACL,eAAe,EACf,cAAc,EACd,eAAe,EACf,sBAAsB,EACtB,aAAa,EACb,MAAM,EACN,WAAW,EACX,aAAa,EACb,cAAc,EACf,CAAC;AAEF,OAAO,EACL,sBAAsB,EACtB,6BAA6B,EAI9B,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,qBAAqB,EACrB,wBAAwB,EACxB,gBAAgB,EAChB,wBAAwB,EACxB,gBAAgB,EAChB,cAAc,EACd,QAAQ,EACR,YAAY,EACZ,eAAe,EACf,cAAc,EACd,sBAAsB,EACtB,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,SAAS,EACT,aAAa,EACb,QAAQ,EACR,YAAY,EACZ,aAAa,EAiBd,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACL,4BAA4B,EAC5B,sBAAsB,EACtB,eAAe,EACf,eAAe,EACf,WAAW,EAYZ,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,gBAAgB,EAGjB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EACL,eAAe,EAGhB,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,YAAY,EACZ,kBAAkB,EAClB,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,eAAe,EACf,UAAU,EACV,wBAAwB,EACxB,wBAAwB,EAUzB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,aAAa,EACb,YAAY,EACZ,aAAa,EACb,eAAe,EACf,eAAe,IAAI,uBAAuB,EAC1C,eAAe,EACf,eAAe,EACf,aAAa,IAAI,qBAAqB,EACtC,sBAAsB,EAKvB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,EACf,oBAAoB,EACpB,kBAAkB,EAQnB,MAAM,2BAA2B,CAAC;AAEnC,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,cAAc;IACd,eAAe;IACf,eAAe;CACP,CAAC;AAEX,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,WAAW,EAAE,oBAAoB;IACjC,eAAe,EAAE,gBAAgB;IACjC,QAAQ,EAAE,eAAe;IACzB,KAAK,EAAE,aAAa;IACpB,YAAY,EAAE,sBAAsB;CAC5B,CAAC"}
package/dist/mcp.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const H2A_CLI_MCP_TOOL_NAMES: readonly ["h2a_register_instance", "h2a_discover_instances", "h2a_open_negotiation", "h2a_offer", "h2a_counteroffer", "h2a_sign", "h2a_stabilize", "h2a_inbox", "h2a_append_journal", "h2a_escalate", "h2a_session_open", "h2a_session_close", "h2a_discover_sessions", "h2a_nhi_report", "h2a_nhi_inventory", "h2a_nhi_attest", "h2a_nhi_offboard"];
1
+ export declare const H2A_CLI_MCP_TOOL_NAMES: readonly ["h2a_register_instance", "h2a_discover_instances", "h2a_open_negotiation", "h2a_offer", "h2a_counteroffer", "h2a_sign", "h2a_stabilize", "h2a_inbox", "h2a_append_journal", "h2a_escalate", "h2a_session_open", "h2a_session_close", "h2a_discover_sessions", "h2a_nhi_report", "h2a_nhi_inventory", "h2a_nhi_attest", "h2a_nhi_offboard", "h2a_blockage_raise", "h2a_blockage_list", "h2a_blockage_resolve"];
2
2
  //# sourceMappingURL=mcp.d.ts.map
package/dist/mcp.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,sBAAsB,sVAkBzB,CAAC"}
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,sBAAsB,yZAqBzB,CAAC"}
package/dist/mcp.js CHANGED
@@ -15,6 +15,9 @@ export const H2A_CLI_MCP_TOOL_NAMES = [
15
15
  "h2a_nhi_report",
16
16
  "h2a_nhi_inventory",
17
17
  "h2a_nhi_attest",
18
- "h2a_nhi_offboard"
18
+ "h2a_nhi_offboard",
19
+ "h2a_blockage_raise",
20
+ "h2a_blockage_list",
21
+ "h2a_blockage_resolve"
19
22
  ];
20
23
  //# sourceMappingURL=mcp.js.map
package/dist/mcp.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,uBAAuB;IACvB,wBAAwB;IACxB,sBAAsB;IACtB,WAAW;IACX,kBAAkB;IAClB,UAAU;IACV,eAAe;IACf,WAAW;IACX,oBAAoB;IACpB,cAAc;IACd,kBAAkB;IAClB,mBAAmB;IACnB,uBAAuB;IACvB,gBAAgB;IAChB,mBAAmB;IACnB,gBAAgB;IAChB,kBAAkB;CACV,CAAC"}
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,uBAAuB;IACvB,wBAAwB;IACxB,sBAAsB;IACtB,WAAW;IACX,kBAAkB;IAClB,UAAU;IACV,eAAe;IACf,WAAW;IACX,oBAAoB;IACpB,cAAc;IACd,kBAAkB;IAClB,mBAAmB;IACnB,uBAAuB;IACvB,gBAAgB;IAChB,mBAAmB;IACnB,gBAAgB;IAChB,kBAAkB;IAClB,oBAAoB;IACpB,mBAAmB;IACnB,sBAAsB;CACd,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { raiseBlockage, readBlockage, listBlockages, resolveBlockage, type RaiseBlockageInput } from "./registry.js";
2
+ export { loggingNotifier, commandNotifier, pollingNotifier, chainNotifier, defaultNotifierRuntime, type BlockageNotifier, type BlockagePeer, type NotifierRuntime } from "./notifiers.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/runtime/blockage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,YAAY,EACZ,aAAa,EACb,eAAe,EACf,KAAK,kBAAkB,EACxB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,eAAe,EACf,eAAe,EACf,eAAe,EACf,aAAa,EACb,sBAAsB,EACtB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,eAAe,EACrB,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { raiseBlockage, readBlockage, listBlockages, resolveBlockage } from "./registry.js";
2
+ export { loggingNotifier, commandNotifier, pollingNotifier, chainNotifier, defaultNotifierRuntime } from "./notifiers.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/runtime/blockage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,YAAY,EACZ,aAAa,EACb,eAAe,EAEhB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,eAAe,EACf,eAAe,EACf,eAAe,EACf,aAAa,EACb,sBAAsB,EAIvB,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Blockage delivery adapters (DEC-092, EVO-3 Phase B). Connected peers already
3
+ * get the `peer.blocked`/`peer.unblocked` MCP push (DEC-052) — these adapters
4
+ * are for waking **disconnected** peers, mirroring the drumbeat relauncher
5
+ * adapters (DEC-091). The real per-host wake command is install-time config
6
+ * (D6 / EVO-1); here is the in-repo abstraction + the agy polling fallback,
7
+ * behind an injectable runtime so it is unit-testable with no host.
8
+ */
9
+ import type { H2ABlockage } from "@sentropic/h2a";
10
+ /** A peer to (try to) notify of a blockage. */
11
+ export interface BlockagePeer {
12
+ readonly instance: string;
13
+ readonly host?: string;
14
+ }
15
+ /** Adapter that delivers a blockage to a disconnected peer. */
16
+ export interface BlockageNotifier {
17
+ /** Returns true if a notification was delivered/dispatched. */
18
+ notify(blockage: H2ABlockage, peer: BlockagePeer): boolean | Promise<boolean>;
19
+ }
20
+ /** Process I/O the adapters need — injected so tests supply a fake. */
21
+ export interface NotifierRuntime {
22
+ run(file: string, args: readonly string[]): boolean;
23
+ note?(line: string): void;
24
+ }
25
+ export declare const defaultNotifierRuntime: NotifierRuntime;
26
+ interface NotifierCommonOptions {
27
+ log?: (line: string) => void;
28
+ }
29
+ /** Dry-run default: only logs what it would deliver. */
30
+ export declare function loggingNotifier(write: (line: string) => void): BlockageNotifier;
31
+ /**
32
+ * Wake a disconnected peer by running a configured per-host command. The
33
+ * template substitutes `{instance}` (the blocked agent), `{reason}` and
34
+ * `{peer}` (the peer being woken). The actual command per host (claude wake /
35
+ * codex remote-control / gemini hooks) is supplied at install time (D6).
36
+ */
37
+ export declare function commandNotifier(options: {
38
+ command: readonly string[];
39
+ runtime?: NotifierRuntime;
40
+ log?: (line: string) => void;
41
+ }): BlockageNotifier;
42
+ /**
43
+ * The agy fallback: agy has no background daemon (capability matrix), so it
44
+ * cannot be woken — its imported plugin polls `h2a blockage list` instead. This
45
+ * adapter therefore declines (push is a no-op); it exists so a chain can mark a
46
+ * peer as "poll-only" explicitly rather than silently dropping it.
47
+ */
48
+ export declare function pollingNotifier(options?: NotifierCommonOptions): BlockageNotifier;
49
+ /** Try each adapter in order; the first to deliver wins. */
50
+ export declare function chainNotifier(...notifiers: readonly BlockageNotifier[]): BlockageNotifier;
51
+ export {};
52
+ //# sourceMappingURL=notifiers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifiers.d.ts","sourceRoot":"","sources":["../../../src/runtime/blockage/notifiers.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,+CAA+C;AAC/C,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,+DAA+D;AAC/D,MAAM,WAAW,gBAAgB;IAC/B,+DAA+D;IAC/D,MAAM,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC/E;AAED,uEAAuE;AACvE,MAAM,WAAW,eAAe;IAC9B,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC;IACpD,IAAI,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,eAAO,MAAM,sBAAsB,EAAE,eAKpC,CAAC;AAEF,UAAU,qBAAqB;IAC7B,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B;AAED,wDAAwD;AACxD,wBAAgB,eAAe,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,gBAAgB,CAS/E;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE;IACvC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B,GAAG,gBAAgB,CAkBnB;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,GAAE,qBAA0B,GAAG,gBAAgB,CASrF;AAED,4DAA4D;AAC5D,wBAAgB,aAAa,CAAC,GAAG,SAAS,EAAE,SAAS,gBAAgB,EAAE,GAAG,gBAAgB,CASzF"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Blockage delivery adapters (DEC-092, EVO-3 Phase B). Connected peers already
3
+ * get the `peer.blocked`/`peer.unblocked` MCP push (DEC-052) — these adapters
4
+ * are for waking **disconnected** peers, mirroring the drumbeat relauncher
5
+ * adapters (DEC-091). The real per-host wake command is install-time config
6
+ * (D6 / EVO-1); here is the in-repo abstraction + the agy polling fallback,
7
+ * behind an injectable runtime so it is unit-testable with no host.
8
+ */
9
+ import { spawnSync } from "node:child_process";
10
+ export const defaultNotifierRuntime = {
11
+ run(file, args) {
12
+ const res = spawnSync(file, [...args], { stdio: "ignore" });
13
+ return res.status === 0;
14
+ }
15
+ };
16
+ /** Dry-run default: only logs what it would deliver. */
17
+ export function loggingNotifier(write) {
18
+ return {
19
+ notify(blockage, peer) {
20
+ write(`blockage: would notify ${peer.instance}${peer.host ? ` (${peer.host})` : ""} of ${blockage.instance} blocked: ${blockage.reason}`);
21
+ return true;
22
+ }
23
+ };
24
+ }
25
+ /**
26
+ * Wake a disconnected peer by running a configured per-host command. The
27
+ * template substitutes `{instance}` (the blocked agent), `{reason}` and
28
+ * `{peer}` (the peer being woken). The actual command per host (claude wake /
29
+ * codex remote-control / gemini hooks) is supplied at install time (D6).
30
+ */
31
+ export function commandNotifier(options) {
32
+ const runtime = options.runtime ?? defaultNotifierRuntime;
33
+ return {
34
+ notify(blockage, peer) {
35
+ if (options.command.length === 0)
36
+ return false;
37
+ const subst = (s) => s
38
+ .replaceAll("{instance}", blockage.instance)
39
+ .replaceAll("{reason}", blockage.reason)
40
+ .replaceAll("{peer}", peer.instance);
41
+ const [file, ...args] = options.command.map(subst);
42
+ const ok = runtime.run(file, args);
43
+ options.log?.(`blockage[command]: notify ${peer.instance} of ${blockage.instance} → ${file} (${ok ? "ok" : "failed"})`);
44
+ return ok;
45
+ }
46
+ };
47
+ }
48
+ /**
49
+ * The agy fallback: agy has no background daemon (capability matrix), so it
50
+ * cannot be woken — its imported plugin polls `h2a blockage list` instead. This
51
+ * adapter therefore declines (push is a no-op); it exists so a chain can mark a
52
+ * peer as "poll-only" explicitly rather than silently dropping it.
53
+ */
54
+ export function pollingNotifier(options = {}) {
55
+ return {
56
+ notify(blockage, peer) {
57
+ options.log?.(`blockage[polling]: ${peer.instance} is poll-only (no daemon) — will see ${blockage.instance} via 'h2a blockage list'`);
58
+ return false;
59
+ }
60
+ };
61
+ }
62
+ /** Try each adapter in order; the first to deliver wins. */
63
+ export function chainNotifier(...notifiers) {
64
+ return {
65
+ async notify(blockage, peer) {
66
+ for (const n of notifiers) {
67
+ if (await n.notify(blockage, peer))
68
+ return true;
69
+ }
70
+ return false;
71
+ }
72
+ };
73
+ }
74
+ //# sourceMappingURL=notifiers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifiers.js","sourceRoot":"","sources":["../../../src/runtime/blockage/notifiers.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAsB/C,MAAM,CAAC,MAAM,sBAAsB,GAAoB;IACrD,GAAG,CAAC,IAAI,EAAE,IAAI;QACZ,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC5D,OAAO,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC;IAC1B,CAAC;CACF,CAAC;AAMF,wDAAwD;AACxD,MAAM,UAAU,eAAe,CAAC,KAA6B;IAC3D,OAAO;QACL,MAAM,CAAC,QAAQ,EAAE,IAAI;YACnB,KAAK,CACH,0BAA0B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,OAAO,QAAQ,CAAC,QAAQ,aAAa,QAAQ,CAAC,MAAM,EAAE,CACnI,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,OAI/B;IACC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,sBAAsB,CAAC;IAC1D,OAAO;QACL,MAAM,CAAC,QAAQ,EAAE,IAAI;YACnB,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAC;YAC/C,MAAM,KAAK,GAAG,CAAC,CAAS,EAAU,EAAE,CAClC,CAAC;iBACE,UAAU,CAAC,YAAY,EAAE,QAAQ,CAAC,QAAQ,CAAC;iBAC3C,UAAU,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC;iBACvC,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YACzC,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACnD,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACnC,OAAO,CAAC,GAAG,EAAE,CACX,6BAA6B,IAAI,CAAC,QAAQ,OAAO,QAAQ,CAAC,QAAQ,MAAM,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,GAAG,CACzG,CAAC;YACF,OAAO,EAAE,CAAC;QACZ,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,UAAiC,EAAE;IACjE,OAAO;QACL,MAAM,CAAC,QAAQ,EAAE,IAAI;YACnB,OAAO,CAAC,GAAG,EAAE,CACX,sBAAsB,IAAI,CAAC,QAAQ,wCAAwC,QAAQ,CAAC,QAAQ,0BAA0B,CACvH,CAAC;YACF,OAAO,KAAK,CAAC;QACf,CAAC;KACF,CAAC;AACJ,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,aAAa,CAAC,GAAG,SAAsC;IACrE,OAAO;QACL,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI;YACzB,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;gBAC1B,IAAI,MAAM,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC;oBAAE,OAAO,IAAI,CAAC;YAClD,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Durable blockage registry (DEC-092, EVO-3). Parallel to the drumbeat
3
+ * registry: a peer's blockage must outlive the ~15s presence sweep so other
4
+ * agents can see it and help. Stored at `<root>/.h2a/blockage/<safe-instance>.json`.
5
+ * The `NotificationDispatcher` diffs this directory to push `peer.blocked` /
6
+ * `peer.unblocked` to subscribed peers (DEC-052).
7
+ */
8
+ import type { H2ABlockage } from "@sentropic/h2a";
9
+ export interface RaiseBlockageInput {
10
+ readonly instance: string;
11
+ readonly scope: string;
12
+ readonly reason: string;
13
+ readonly needs?: string;
14
+ }
15
+ /**
16
+ * Raise (upsert) a blockage. A fresh raise clears any prior resolution — the
17
+ * agent is blocked again, on possibly a new reason.
18
+ */
19
+ export declare function raiseBlockage(root: string, input: RaiseBlockageInput, now?: number): H2ABlockage;
20
+ export declare function readBlockage(root: string, instance: string): H2ABlockage | undefined;
21
+ export declare function listBlockages(root: string): H2ABlockage[];
22
+ /**
23
+ * Resolve a blockage (idempotent). Returns the resolved blockage, or undefined
24
+ * if the instance has none recorded. Re-resolving keeps the first resolution.
25
+ */
26
+ export declare function resolveBlockage(root: string, instance: string, options?: {
27
+ by?: string;
28
+ now?: number;
29
+ }): H2ABlockage | undefined;
30
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/runtime/blockage/registry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAYlD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,kBAAkB,EACzB,GAAG,GAAE,MAAmB,GACvB,WAAW,CAWb;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAQpF;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE,CAmBzD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;IAAE,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAC1C,WAAW,GAAG,SAAS,CAWzB"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Durable blockage registry (DEC-092, EVO-3). Parallel to the drumbeat
3
+ * registry: a peer's blockage must outlive the ~15s presence sweep so other
4
+ * agents can see it and help. Stored at `<root>/.h2a/blockage/<safe-instance>.json`.
5
+ * The `NotificationDispatcher` diffs this directory to push `peer.blocked` /
6
+ * `peer.unblocked` to subscribed peers (DEC-052).
7
+ */
8
+ import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from "node:fs";
9
+ import { join } from "node:path";
10
+ import { localStorePaths, safePathSegment } from "../local-files/paths.js";
11
+ function entryFile(root, instance) {
12
+ return join(localStorePaths(root).blockage, `${safePathSegment(instance)}.json`);
13
+ }
14
+ function ensureDir(root) {
15
+ mkdirSync(localStorePaths(root).blockage, { recursive: true });
16
+ }
17
+ /**
18
+ * Raise (upsert) a blockage. A fresh raise clears any prior resolution — the
19
+ * agent is blocked again, on possibly a new reason.
20
+ */
21
+ export function raiseBlockage(root, input, now = Date.now()) {
22
+ ensureDir(root);
23
+ const blockage = {
24
+ instance: input.instance,
25
+ scope: input.scope,
26
+ reason: input.reason,
27
+ ...(input.needs ? { needs: input.needs } : {}),
28
+ raisedAt: new Date(now).toISOString()
29
+ };
30
+ writeFileSync(entryFile(root, input.instance), `${JSON.stringify(blockage, null, 2)}\n`, "utf8");
31
+ return blockage;
32
+ }
33
+ export function readBlockage(root, instance) {
34
+ const file = entryFile(root, instance);
35
+ if (!existsSync(file))
36
+ return undefined;
37
+ try {
38
+ return JSON.parse(readFileSync(file, "utf8"));
39
+ }
40
+ catch {
41
+ return undefined;
42
+ }
43
+ }
44
+ export function listBlockages(root) {
45
+ const dir = localStorePaths(root).blockage;
46
+ let names;
47
+ try {
48
+ names = readdirSync(dir);
49
+ }
50
+ catch (err) {
51
+ if (err.code === "ENOENT")
52
+ return [];
53
+ throw err;
54
+ }
55
+ const out = [];
56
+ for (const name of names) {
57
+ if (!name.endsWith(".json"))
58
+ continue;
59
+ try {
60
+ out.push(JSON.parse(readFileSync(join(dir, name), "utf8")));
61
+ }
62
+ catch {
63
+ // skip malformed
64
+ }
65
+ }
66
+ return out;
67
+ }
68
+ /**
69
+ * Resolve a blockage (idempotent). Returns the resolved blockage, or undefined
70
+ * if the instance has none recorded. Re-resolving keeps the first resolution.
71
+ */
72
+ export function resolveBlockage(root, instance, options = {}) {
73
+ const current = readBlockage(root, instance);
74
+ if (!current)
75
+ return undefined;
76
+ if (current.resolvedAt !== undefined)
77
+ return current;
78
+ const resolved = {
79
+ ...current,
80
+ resolvedAt: new Date(options.now ?? Date.now()).toISOString(),
81
+ ...(options.by ? { resolvedBy: options.by } : {})
82
+ };
83
+ writeFileSync(entryFile(root, instance), `${JSON.stringify(resolved, null, 2)}\n`, "utf8");
84
+ return resolved;
85
+ }
86
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/runtime/blockage/registry.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  export { recordStop, readDrumbeatEntry, listDrumbeat, clearDrumbeatEntry, markRelanced, type H2ADrumbeatEntry, type RecordStopInput } from "./registry.js";
2
2
  export { scanDrumbeat, H2A_DEFAULT_MAX_RELANCES, type H2ADrumbeatFinding, type H2ADrumbeatReason, type H2ADrumbeatScanResult, type ScanDrumbeatOptions } from "./scan.js";
3
3
  export { drumbeatTick, runDrumbeatWatch, loggingRelauncher, type H2ARelauncher, type DrumbeatTickOptions, type DrumbeatTickResult, type DrumbeatWatchOptions } from "./watch.js";
4
+ export { localTmuxRelauncher, headlessRelauncher, chainRelauncher, tmuxTarget, defaultRelauncherRuntime, type RelauncherRuntime, type H2ARelauncherKind } from "./relaunchers.js";
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/runtime/drumbeat/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,YAAY,EACZ,kBAAkB,EAClB,YAAY,EACZ,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACrB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,YAAY,EACZ,wBAAwB,EACxB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACzB,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EAC1B,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/runtime/drumbeat/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,YAAY,EACZ,kBAAkB,EAClB,YAAY,EACZ,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACrB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,YAAY,EACZ,wBAAwB,EACxB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACzB,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EAC1B,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,eAAe,EACf,UAAU,EACV,wBAAwB,EACxB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACvB,MAAM,kBAAkB,CAAC"}
@@ -1,4 +1,5 @@
1
1
  export { recordStop, readDrumbeatEntry, listDrumbeat, clearDrumbeatEntry, markRelanced } from "./registry.js";
2
2
  export { scanDrumbeat, H2A_DEFAULT_MAX_RELANCES } from "./scan.js";
3
3
  export { drumbeatTick, runDrumbeatWatch, loggingRelauncher } from "./watch.js";
4
+ export { localTmuxRelauncher, headlessRelauncher, chainRelauncher, tmuxTarget, defaultRelauncherRuntime } from "./relaunchers.js";
4
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/runtime/drumbeat/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,YAAY,EACZ,kBAAkB,EAClB,YAAY,EAGb,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,YAAY,EACZ,wBAAwB,EAKzB,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EAKlB,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/runtime/drumbeat/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,YAAY,EACZ,kBAAkB,EAClB,YAAY,EAGb,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,YAAY,EACZ,wBAAwB,EAKzB,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EAKlB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,eAAe,EACf,UAAU,EACV,wBAAwB,EAGzB,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Drumbeat relauncher adapters (DEC-091, slice D3). D2 shipped the dumb daemon
3
+ * + the `H2ARelauncher` interface with only a logging adapter; D3 supplies the
4
+ * two **local** adapters that actually revive a stalled agent:
5
+ *
6
+ * - **local-tmux**: `tmux send-keys` the resume/launch command into the pane
7
+ * captured at launch (DEC-085 `launchContext.tmux`). The natural revive for a
8
+ * user-local agent — it lands back in its original terminal.
9
+ * - **headless**: detached background respawn of the captured command + a
10
+ * notification (the PRINCIPAL escalation is wired fully in D7).
11
+ *
12
+ * `chainRelauncher` composes them (try tmux, fall back to headless) — the
13
+ * "local-tmux adapter + headless fallback" of D3. The actual process I/O is
14
+ * behind an injectable `RelauncherRuntime` so the adapters are unit-testable
15
+ * with no real tmux or child processes. The remote adapter is D4.
16
+ */
17
+ import type { H2ARelauncher } from "./watch.js";
18
+ /** Process I/O the adapters need — injected so tests supply a fake. */
19
+ export interface RelauncherRuntime {
20
+ /** Run a foreground command; return true on exit code 0. */
21
+ run(file: string, args: readonly string[]): boolean;
22
+ /** Spawn a detached background process; return true if it started. */
23
+ spawnDetached(command: string, options: {
24
+ cwd?: string;
25
+ }): boolean;
26
+ /** Optional side-channel note (relances are observable). */
27
+ notify?(line: string): void;
28
+ }
29
+ export declare const defaultRelauncherRuntime: RelauncherRuntime;
30
+ interface RelauncherCommonOptions {
31
+ runtime?: RelauncherRuntime;
32
+ log?: (line: string) => void;
33
+ }
34
+ /**
35
+ * Build a tmux target-pane spec from a captured `launchContext.tmux`. With a
36
+ * window it is `session:window.pane`; otherwise the pane is assumed to be a
37
+ * unique tmux pane id (`%N`, captured via `#{pane_id}` by the D6 plugins) and
38
+ * targeted directly.
39
+ */
40
+ export declare function tmuxTarget(t: {
41
+ session: string;
42
+ window?: string;
43
+ pane: string;
44
+ }): string;
45
+ /** Revive a stalled agent by sending its resume/launch command into its pane. */
46
+ export declare function localTmuxRelauncher(options?: RelauncherCommonOptions): H2ARelauncher;
47
+ /** Fallback: detached background respawn of the captured command + notify. */
48
+ export declare function headlessRelauncher(options?: RelauncherCommonOptions): H2ARelauncher;
49
+ /** Try each adapter in order; the first to issue a relance wins (D3 fallback). */
50
+ export declare function chainRelauncher(...relaunchers: readonly H2ARelauncher[]): H2ARelauncher;
51
+ export type H2ARelauncherKind = "logging" | "local-tmux" | "headless" | "auto";
52
+ export {};
53
+ //# sourceMappingURL=relaunchers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relaunchers.d.ts","sourceRoot":"","sources":["../../../src/runtime/drumbeat/relaunchers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,uEAAuE;AACvE,MAAM,WAAW,iBAAiB;IAChC,4DAA4D;IAC5D,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC;IACpD,sEAAsE;IACtE,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;IACnE,4DAA4D;IAC5D,MAAM,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,eAAO,MAAM,wBAAwB,EAAE,iBAmBtC,CAAC;AAEF,UAAU,uBAAuB;IAC/B,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAExF;AAED,iFAAiF;AACjF,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,uBAA4B,GAAG,aAAa,CAexF;AAED,8EAA8E;AAC9E,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,uBAA4B,GAAG,aAAa,CAcvF;AAED,kFAAkF;AAClF,wBAAgB,eAAe,CAAC,GAAG,WAAW,EAAE,SAAS,aAAa,EAAE,GAAG,aAAa,CASvF;AAED,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,YAAY,GAAG,UAAU,GAAG,MAAM,CAAC"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Drumbeat relauncher adapters (DEC-091, slice D3). D2 shipped the dumb daemon
3
+ * + the `H2ARelauncher` interface with only a logging adapter; D3 supplies the
4
+ * two **local** adapters that actually revive a stalled agent:
5
+ *
6
+ * - **local-tmux**: `tmux send-keys` the resume/launch command into the pane
7
+ * captured at launch (DEC-085 `launchContext.tmux`). The natural revive for a
8
+ * user-local agent — it lands back in its original terminal.
9
+ * - **headless**: detached background respawn of the captured command + a
10
+ * notification (the PRINCIPAL escalation is wired fully in D7).
11
+ *
12
+ * `chainRelauncher` composes them (try tmux, fall back to headless) — the
13
+ * "local-tmux adapter + headless fallback" of D3. The actual process I/O is
14
+ * behind an injectable `RelauncherRuntime` so the adapters are unit-testable
15
+ * with no real tmux or child processes. The remote adapter is D4.
16
+ */
17
+ import { spawn, spawnSync } from "node:child_process";
18
+ export const defaultRelauncherRuntime = {
19
+ run(file, args) {
20
+ const res = spawnSync(file, [...args], { stdio: "ignore" });
21
+ return res.status === 0;
22
+ },
23
+ spawnDetached(command, options) {
24
+ try {
25
+ const child = spawn(command, {
26
+ cwd: options.cwd,
27
+ shell: true,
28
+ detached: true,
29
+ stdio: "ignore"
30
+ });
31
+ child.unref();
32
+ return child.pid !== undefined;
33
+ }
34
+ catch {
35
+ return false;
36
+ }
37
+ }
38
+ };
39
+ /**
40
+ * Build a tmux target-pane spec from a captured `launchContext.tmux`. With a
41
+ * window it is `session:window.pane`; otherwise the pane is assumed to be a
42
+ * unique tmux pane id (`%N`, captured via `#{pane_id}` by the D6 plugins) and
43
+ * targeted directly.
44
+ */
45
+ export function tmuxTarget(t) {
46
+ return t.window !== undefined ? `${t.session}:${t.window}.${t.pane}` : t.pane;
47
+ }
48
+ /** Revive a stalled agent by sending its resume/launch command into its pane. */
49
+ export function localTmuxRelauncher(options = {}) {
50
+ const runtime = options.runtime ?? defaultRelauncherRuntime;
51
+ return {
52
+ relance(finding) {
53
+ const lc = finding.launchContext;
54
+ if (!lc?.tmux)
55
+ return false; // not a tmux-launched agent — let the chain fall through
56
+ const command = lc.resumeCommand ?? lc.command;
57
+ const target = tmuxTarget(lc.tmux);
58
+ const ok = runtime.run("tmux", ["send-keys", "-t", target, command, "Enter"]);
59
+ options.log?.(`drumbeat[local-tmux]: relance ${finding.instance} → tmux send-keys -t ${target} (${ok ? "ok" : "failed"})`);
60
+ return ok;
61
+ }
62
+ };
63
+ }
64
+ /** Fallback: detached background respawn of the captured command + notify. */
65
+ export function headlessRelauncher(options = {}) {
66
+ const runtime = options.runtime ?? defaultRelauncherRuntime;
67
+ return {
68
+ relance(finding) {
69
+ const lc = finding.launchContext;
70
+ const command = lc?.resumeCommand ?? lc?.command;
71
+ if (!command)
72
+ return false; // nothing to respawn
73
+ const ok = runtime.spawnDetached(command, { cwd: lc?.cwd });
74
+ const note = `drumbeat[headless]: relance ${finding.instance} → detached "${command}" (${ok ? "spawned" : "failed"})`;
75
+ options.log?.(note);
76
+ runtime.notify?.(note);
77
+ return ok;
78
+ }
79
+ };
80
+ }
81
+ /** Try each adapter in order; the first to issue a relance wins (D3 fallback). */
82
+ export function chainRelauncher(...relaunchers) {
83
+ return {
84
+ async relance(finding) {
85
+ for (const r of relaunchers) {
86
+ if (await r.relance(finding))
87
+ return true;
88
+ }
89
+ return false;
90
+ }
91
+ };
92
+ }
93
+ //# sourceMappingURL=relaunchers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relaunchers.js","sourceRoot":"","sources":["../../../src/runtime/drumbeat/relaunchers.ts"],"names":[],"mappings":"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"}
@@ -33,6 +33,7 @@ export interface LocalStorePaths {
33
33
  outbox: string;
34
34
  presence: string;
35
35
  drumbeat: string;
36
+ blockage: string;
36
37
  }
37
38
  export declare function localStorePaths(root: string): LocalStorePaths;
38
39
  export declare function presenceFile(paths: LocalStorePaths, sessionId: string): string;
@@ -1 +1 @@
1
- {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../../src/runtime/local-files/paths.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAIlD;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAmB7D;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAE9E;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAEpF;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,eAAe,EACtB,aAAa,EAAE,MAAM,GACpB,MAAM,CAER;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEvE"}
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../../src/runtime/local-files/paths.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAIlD;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAoB7D;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAE9E;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAEpF;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,eAAe,EACtB,aAAa,EAAE,MAAM,GACpB,MAAM,CAER;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEvE"}
@@ -39,7 +39,8 @@ export function localStorePaths(root) {
39
39
  inbox: join(root, "inbox"),
40
40
  outbox: join(root, "outbox"),
41
41
  presence: join(root, "presence"),
42
- drumbeat: join(root, "drumbeat")
42
+ drumbeat: join(root, "drumbeat"),
43
+ blockage: join(root, "blockage")
43
44
  };
44
45
  }
45
46
  export function presenceFile(paths, sessionId) {
@@ -1 +1 @@
1
- {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/runtime/local-files/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,eAAe,CAAC,EAAU;IACxC,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IAC1D,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;IACnD,OAAO,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;AAC9C,CAAC;AAqBD,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO;QACL,IAAI;QACJ,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC;QAChC,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,iBAAiB,CAAC;QACpD,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,YAAY,CAAC;QAC1C,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,iBAAiB,CAAC;QACpD,aAAa,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,sBAAsB,CAAC;QAC7D,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,gBAAgB,CAAC;QAClD,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC;QAClC,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC;QAChC,WAAW,EAAE,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC;QACtC,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC;QAClC,YAAY,EAAE,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC;QACxC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC;QAC1B,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC;QAC5B,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC;QAChC,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC;KACjC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAsB,EAAE,SAAiB;IACpE,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,eAAe,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAsB,EAAE,aAAqB;IAC1E,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,eAAe,CAAC,aAAa,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,KAAsB,EACtB,aAAqB;IAErB,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,aAAa,CAAC,EAAE,eAAe,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAsB,EAAE,KAAa;IAC5D,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAsB,EAAE,KAAa;IAC7D,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;AACpD,CAAC"}
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/runtime/local-files/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,eAAe,CAAC,EAAU;IACxC,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IAC1D,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;IACnD,OAAO,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;AAC9C,CAAC;AAsBD,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO;QACL,IAAI;QACJ,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC;QAChC,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,iBAAiB,CAAC;QACpD,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,YAAY,CAAC;QAC1C,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,iBAAiB,CAAC;QACpD,aAAa,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,sBAAsB,CAAC;QAC7D,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,gBAAgB,CAAC;QAClD,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC;QAClC,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC;QAChC,WAAW,EAAE,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC;QACtC,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC;QAClC,YAAY,EAAE,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC;QACxC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC;QAC1B,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC;QAC5B,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC;QAChC,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC;QAChC,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC;KACjC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAsB,EAAE,SAAiB;IACpE,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,eAAe,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAsB,EAAE,aAAqB;IAC1E,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,eAAe,CAAC,aAAa,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,KAAsB,EACtB,aAAqB;IAErB,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,aAAa,CAAC,EAAE,eAAe,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAsB,EAAE,KAAa;IAC5D,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAsB,EAAE,KAAa;IAC7D,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;AACpD,CAAC"}
@@ -91,6 +91,20 @@ export declare function handleNhiOffboard(store: LocalStore, args: {
91
91
  instance?: string;
92
92
  reason?: string;
93
93
  } | undefined): McpToolResult | McpErrorResult;
94
+ export declare function handleBlockageRaise(store: LocalStore, args: {
95
+ instance?: string;
96
+ reason?: string;
97
+ scope?: string;
98
+ needs?: string;
99
+ } | undefined): McpToolResult | McpErrorResult;
100
+ export declare function handleBlockageList(store: LocalStore, args: {
101
+ scope?: string;
102
+ active?: boolean;
103
+ } | undefined): McpToolResult | McpErrorResult;
104
+ export declare function handleBlockageResolve(store: LocalStore, args: {
105
+ instance?: string;
106
+ by?: string;
107
+ } | undefined): McpToolResult | McpErrorResult;
94
108
  export declare function notImplemented(toolName: string): McpErrorResult;
95
109
  export {};
96
110
  //# sourceMappingURL=handlers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../../src/runtime/mcp/handlers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../../src/runtime/mcp/handlers.ts"],"names":[],"mappings":"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"}