opentasks 0.1.3 → 0.2.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 (273) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +174 -49
  3. package/dist/cli.d.ts +20 -0
  4. package/dist/cli.d.ts.map +1 -1
  5. package/dist/cli.js +451 -15
  6. package/dist/cli.js.map +1 -1
  7. package/dist/client/client.d.ts +54 -0
  8. package/dist/client/client.d.ts.map +1 -1
  9. package/dist/client/client.js +148 -4
  10. package/dist/client/client.js.map +1 -1
  11. package/dist/client/index.d.ts +1 -1
  12. package/dist/client/index.d.ts.map +1 -1
  13. package/dist/client/index.js +1 -1
  14. package/dist/client/index.js.map +1 -1
  15. package/dist/core/discover.d.ts.map +1 -1
  16. package/dist/core/discover.js +7 -2
  17. package/dist/core/discover.js.map +1 -1
  18. package/dist/core/hash.d.ts.map +1 -1
  19. package/dist/core/hash.js +7 -0
  20. package/dist/core/hash.js.map +1 -1
  21. package/dist/core/id.d.ts +1 -1
  22. package/dist/core/id.d.ts.map +1 -1
  23. package/dist/core/id.js +2 -0
  24. package/dist/core/id.js.map +1 -1
  25. package/dist/core/worktree.js +4 -4
  26. package/dist/core/worktree.js.map +1 -1
  27. package/dist/daemon/events.d.ts +82 -0
  28. package/dist/daemon/events.d.ts.map +1 -0
  29. package/dist/daemon/events.js +71 -0
  30. package/dist/daemon/events.js.map +1 -0
  31. package/dist/daemon/flush.d.ts.map +1 -1
  32. package/dist/daemon/flush.js +12 -2
  33. package/dist/daemon/flush.js.map +1 -1
  34. package/dist/daemon/health-counters.d.ts +38 -0
  35. package/dist/daemon/health-counters.d.ts.map +1 -0
  36. package/dist/daemon/health-counters.js +42 -0
  37. package/dist/daemon/health-counters.js.map +1 -0
  38. package/dist/daemon/idempotency.d.ts +50 -0
  39. package/dist/daemon/idempotency.d.ts.map +1 -0
  40. package/dist/daemon/idempotency.js +104 -0
  41. package/dist/daemon/idempotency.js.map +1 -0
  42. package/dist/daemon/ipc.d.ts +32 -2
  43. package/dist/daemon/ipc.d.ts.map +1 -1
  44. package/dist/daemon/ipc.js +54 -3
  45. package/dist/daemon/ipc.js.map +1 -1
  46. package/dist/daemon/lifecycle.d.ts.map +1 -1
  47. package/dist/daemon/lifecycle.js +145 -9
  48. package/dist/daemon/lifecycle.js.map +1 -1
  49. package/dist/daemon/location-state.d.ts +60 -1
  50. package/dist/daemon/location-state.d.ts.map +1 -1
  51. package/dist/daemon/location-state.js +136 -31
  52. package/dist/daemon/location-state.js.map +1 -1
  53. package/dist/daemon/methods/context-files.d.ts.map +1 -1
  54. package/dist/daemon/methods/context-files.js +4 -3
  55. package/dist/daemon/methods/context-files.js.map +1 -1
  56. package/dist/daemon/methods/events.d.ts +22 -0
  57. package/dist/daemon/methods/events.d.ts.map +1 -0
  58. package/dist/daemon/methods/events.js +30 -0
  59. package/dist/daemon/methods/events.js.map +1 -0
  60. package/dist/daemon/methods/graph.d.ts +7 -0
  61. package/dist/daemon/methods/graph.d.ts.map +1 -1
  62. package/dist/daemon/methods/graph.js +24 -14
  63. package/dist/daemon/methods/graph.js.map +1 -1
  64. package/dist/daemon/methods/lifecycle.d.ts +16 -0
  65. package/dist/daemon/methods/lifecycle.d.ts.map +1 -1
  66. package/dist/daemon/methods/lifecycle.js +3 -1
  67. package/dist/daemon/methods/lifecycle.js.map +1 -1
  68. package/dist/daemon/methods/location.js.map +1 -1
  69. package/dist/daemon/methods/sync.d.ts +48 -2
  70. package/dist/daemon/methods/sync.d.ts.map +1 -1
  71. package/dist/daemon/methods/sync.js +106 -3
  72. package/dist/daemon/methods/sync.js.map +1 -1
  73. package/dist/daemon/methods/tools.d.ts.map +1 -1
  74. package/dist/daemon/methods/tools.js +42 -8
  75. package/dist/daemon/methods/tools.js.map +1 -1
  76. package/dist/daemon/methods/watch.d.ts +24 -0
  77. package/dist/daemon/methods/watch.d.ts.map +1 -1
  78. package/dist/daemon/methods/watch.js +178 -88
  79. package/dist/daemon/methods/watch.js.map +1 -1
  80. package/dist/graph/EdgeTypeRegistry.d.ts.map +1 -1
  81. package/dist/graph/EdgeTypeRegistry.js +32 -0
  82. package/dist/graph/EdgeTypeRegistry.js.map +1 -1
  83. package/dist/graph/FederatedGraph.d.ts.map +1 -1
  84. package/dist/graph/GraphologyAdapter.d.ts.map +1 -1
  85. package/dist/graph/GraphologyAdapter.js.map +1 -1
  86. package/dist/graph/HydratingFederatedGraph.d.ts.map +1 -1
  87. package/dist/graph/HydratingFederatedGraph.js +1 -1
  88. package/dist/graph/HydratingFederatedGraph.js.map +1 -1
  89. package/dist/graph/attempts.d.ts +50 -0
  90. package/dist/graph/attempts.d.ts.map +1 -0
  91. package/dist/graph/attempts.js +51 -0
  92. package/dist/graph/attempts.js.map +1 -0
  93. package/dist/graph/coordination.d.ts +4 -2
  94. package/dist/graph/coordination.d.ts.map +1 -1
  95. package/dist/graph/coordination.js +77 -85
  96. package/dist/graph/coordination.js.map +1 -1
  97. package/dist/graph/expansion.d.ts.map +1 -1
  98. package/dist/graph/expansion.js +1 -1
  99. package/dist/graph/expansion.js.map +1 -1
  100. package/dist/graph/git-graph-syncer.d.ts +24 -0
  101. package/dist/graph/git-graph-syncer.d.ts.map +1 -1
  102. package/dist/graph/git-graph-syncer.js +95 -28
  103. package/dist/graph/git-graph-syncer.js.map +1 -1
  104. package/dist/graph/provider-store.d.ts +12 -1
  105. package/dist/graph/provider-store.d.ts.map +1 -1
  106. package/dist/graph/provider-store.js +35 -8
  107. package/dist/graph/provider-store.js.map +1 -1
  108. package/dist/graph/query.d.ts.map +1 -1
  109. package/dist/graph/query.js +18 -2
  110. package/dist/graph/query.js.map +1 -1
  111. package/dist/graph/store.d.ts +18 -2
  112. package/dist/graph/store.d.ts.map +1 -1
  113. package/dist/graph/store.js +43 -0
  114. package/dist/graph/store.js.map +1 -1
  115. package/dist/graph/sync.js +1 -1
  116. package/dist/graph/sync.js.map +1 -1
  117. package/dist/graph/types.d.ts +9 -1
  118. package/dist/graph/types.d.ts.map +1 -1
  119. package/dist/graph/types.js.map +1 -1
  120. package/dist/graph/validation.d.ts.map +1 -1
  121. package/dist/graph/validation.js +20 -2
  122. package/dist/graph/validation.js.map +1 -1
  123. package/dist/index.d.ts +2 -0
  124. package/dist/index.d.ts.map +1 -1
  125. package/dist/index.js +4 -0
  126. package/dist/index.js.map +1 -1
  127. package/dist/materialization/archiver.d.ts.map +1 -1
  128. package/dist/materialization/archiver.js.map +1 -1
  129. package/dist/materialization/snapshot.d.ts.map +1 -1
  130. package/dist/materialization/snapshot.js +1 -1
  131. package/dist/materialization/snapshot.js.map +1 -1
  132. package/dist/materialization/types.d.ts +7 -5
  133. package/dist/materialization/types.d.ts.map +1 -1
  134. package/dist/materialization/types.js.map +1 -1
  135. package/dist/mcp/server.d.ts +2 -1
  136. package/dist/mcp/server.d.ts.map +1 -1
  137. package/dist/mcp/server.js +308 -11
  138. package/dist/mcp/server.js.map +1 -1
  139. package/dist/providers/beads.d.ts.map +1 -1
  140. package/dist/providers/beads.js +2 -0
  141. package/dist/providers/beads.js.map +1 -1
  142. package/dist/providers/claude-tasks.d.ts.map +1 -1
  143. package/dist/providers/claude-tasks.js.map +1 -1
  144. package/dist/providers/global.js +1 -1
  145. package/dist/providers/global.js.map +1 -1
  146. package/dist/providers/location.d.ts.map +1 -1
  147. package/dist/providers/location.js.map +1 -1
  148. package/dist/providers/map-client-factory.d.ts.map +1 -1
  149. package/dist/providers/map-client-factory.js +1 -1
  150. package/dist/providers/map-client-factory.js.map +1 -1
  151. package/dist/providers/map-connector.js +1 -1
  152. package/dist/providers/map-connector.js.map +1 -1
  153. package/dist/providers/map-event-bridge.d.ts.map +1 -1
  154. package/dist/providers/map-event-bridge.js +1 -0
  155. package/dist/providers/map-event-bridge.js.map +1 -1
  156. package/dist/providers/map.d.ts.map +1 -1
  157. package/dist/providers/map.js +5 -2
  158. package/dist/providers/map.js.map +1 -1
  159. package/dist/providers/native.d.ts.map +1 -1
  160. package/dist/providers/native.js +21 -8
  161. package/dist/providers/native.js.map +1 -1
  162. package/dist/providers/registry.js +1 -1
  163. package/dist/providers/registry.js.map +1 -1
  164. package/dist/providers/sudocode.d.ts.map +1 -1
  165. package/dist/providers/sudocode.js +5 -11
  166. package/dist/providers/sudocode.js.map +1 -1
  167. package/dist/providers/traits/Reconcilable.d.ts.map +1 -1
  168. package/dist/providers/traits/TaskManageable.d.ts +15 -1
  169. package/dist/providers/traits/TaskManageable.d.ts.map +1 -1
  170. package/dist/providers/traits/TaskManageable.js +26 -0
  171. package/dist/providers/traits/TaskManageable.js.map +1 -1
  172. package/dist/providers/traits/Watchable.d.ts +6 -0
  173. package/dist/providers/traits/Watchable.d.ts.map +1 -1
  174. package/dist/providers/traits/Watchable.js.map +1 -1
  175. package/dist/providers/types.d.ts +1 -1
  176. package/dist/providers/types.d.ts.map +1 -1
  177. package/dist/schema/edges.d.ts +5 -1
  178. package/dist/schema/edges.d.ts.map +1 -1
  179. package/dist/schema/index.d.ts +2 -2
  180. package/dist/schema/index.d.ts.map +1 -1
  181. package/dist/schema/index.js +1 -1
  182. package/dist/schema/index.js.map +1 -1
  183. package/dist/schema/nodes.d.ts +55 -2
  184. package/dist/schema/nodes.d.ts.map +1 -1
  185. package/dist/schema/storage.d.ts +2 -0
  186. package/dist/schema/storage.d.ts.map +1 -1
  187. package/dist/schema/validation.d.ts +6 -2
  188. package/dist/schema/validation.d.ts.map +1 -1
  189. package/dist/schema/validation.js +18 -1
  190. package/dist/schema/validation.js.map +1 -1
  191. package/dist/sessionlog/agent/registry.js.map +1 -1
  192. package/dist/sessionlog/agent/session-types.d.ts.map +1 -1
  193. package/dist/sessionlog/agent/types.d.ts.map +1 -1
  194. package/dist/sessionlog/commands/clean.js +1 -1
  195. package/dist/sessionlog/commands/clean.js.map +1 -1
  196. package/dist/sessionlog/commands/disable.d.ts.map +1 -1
  197. package/dist/sessionlog/commands/disable.js.map +1 -1
  198. package/dist/sessionlog/commands/doctor.js +1 -1
  199. package/dist/sessionlog/commands/doctor.js.map +1 -1
  200. package/dist/sessionlog/commands/enable.js +1 -1
  201. package/dist/sessionlog/commands/enable.js.map +1 -1
  202. package/dist/sessionlog/commands/resume.js +1 -1
  203. package/dist/sessionlog/commands/resume.js.map +1 -1
  204. package/dist/sessionlog/commands/rewind.d.ts.map +1 -1
  205. package/dist/sessionlog/commands/rewind.js +1 -1
  206. package/dist/sessionlog/commands/rewind.js.map +1 -1
  207. package/dist/sessionlog/commands/status.d.ts.map +1 -1
  208. package/dist/sessionlog/commands/status.js.map +1 -1
  209. package/dist/sessionlog/hooks/lifecycle.d.ts.map +1 -1
  210. package/dist/sessionlog/hooks/lifecycle.js +3 -3
  211. package/dist/sessionlog/hooks/lifecycle.js.map +1 -1
  212. package/dist/sessionlog/security/redaction.js +1 -1
  213. package/dist/sessionlog/security/redaction.js.map +1 -1
  214. package/dist/sessionlog/store/checkpoint-store.d.ts.map +1 -1
  215. package/dist/sessionlog/store/checkpoint-store.js +2 -2
  216. package/dist/sessionlog/store/checkpoint-store.js.map +1 -1
  217. package/dist/sessionlog/store/native-store.d.ts.map +1 -1
  218. package/dist/sessionlog/store/native-store.js.map +1 -1
  219. package/dist/sessionlog/store/session-store.d.ts.map +1 -1
  220. package/dist/sessionlog/store/session-store.js +1 -1
  221. package/dist/sessionlog/store/session-store.js.map +1 -1
  222. package/dist/sessionlog/strategy/attribution.js +2 -2
  223. package/dist/sessionlog/strategy/attribution.js.map +1 -1
  224. package/dist/sessionlog/strategy/common.d.ts +1 -1
  225. package/dist/sessionlog/strategy/common.d.ts.map +1 -1
  226. package/dist/sessionlog/strategy/common.js +3 -3
  227. package/dist/sessionlog/strategy/common.js.map +1 -1
  228. package/dist/sessionlog/strategy/content-overlap.d.ts.map +1 -1
  229. package/dist/sessionlog/strategy/content-overlap.js +1 -1
  230. package/dist/sessionlog/strategy/content-overlap.js.map +1 -1
  231. package/dist/sessionlog/strategy/manual-commit.d.ts.map +1 -1
  232. package/dist/sessionlog/strategy/manual-commit.js +6 -16
  233. package/dist/sessionlog/strategy/manual-commit.js.map +1 -1
  234. package/dist/sessionlog/utils/preview-rewind.d.ts.map +1 -1
  235. package/dist/sessionlog/utils/preview-rewind.js +1 -1
  236. package/dist/sessionlog/utils/preview-rewind.js.map +1 -1
  237. package/dist/sessionlog/utils/trailers.d.ts.map +1 -1
  238. package/dist/sessionlog/utils/trailers.js +0 -1
  239. package/dist/sessionlog/utils/trailers.js.map +1 -1
  240. package/dist/storage/interface.d.ts +64 -0
  241. package/dist/storage/interface.d.ts.map +1 -1
  242. package/dist/storage/interface.js.map +1 -1
  243. package/dist/storage/jsonl.js +2 -2
  244. package/dist/storage/jsonl.js.map +1 -1
  245. package/dist/storage/sqlite-schema.d.ts +8 -2
  246. package/dist/storage/sqlite-schema.d.ts.map +1 -1
  247. package/dist/storage/sqlite-schema.js +10 -1
  248. package/dist/storage/sqlite-schema.js.map +1 -1
  249. package/dist/storage/sqlite.d.ts +16 -1
  250. package/dist/storage/sqlite.d.ts.map +1 -1
  251. package/dist/storage/sqlite.js +134 -2
  252. package/dist/storage/sqlite.js.map +1 -1
  253. package/dist/tools/link.js +1 -1
  254. package/dist/tools/link.js.map +1 -1
  255. package/dist/tools/query.d.ts.map +1 -1
  256. package/dist/tools/query.js +8 -29
  257. package/dist/tools/query.js.map +1 -1
  258. package/dist/tools/task.d.ts.map +1 -1
  259. package/dist/tools/task.js +115 -5
  260. package/dist/tools/task.js.map +1 -1
  261. package/dist/tools/types.d.ts +84 -3
  262. package/dist/tools/types.d.ts.map +1 -1
  263. package/dist/tools/types.js.map +1 -1
  264. package/dist/version.d.ts +14 -0
  265. package/dist/version.d.ts.map +1 -0
  266. package/dist/version.js +44 -0
  267. package/dist/version.js.map +1 -0
  268. package/package.json +32 -7
  269. package/skills/opentasks/SKILL.md +226 -0
  270. package/skills/opentasks/dependency-management.md +119 -0
  271. package/skills/opentasks/feedback-and-review.md +100 -0
  272. package/skills/opentasks/linking-external-data.md +103 -0
  273. package/skills/opentasks/spec-to-implementation.md +171 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idempotency.js","sourceRoot":"","sources":["../../src/daemon/idempotency.ts"],"names":[],"mappings":"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"}
@@ -31,9 +31,21 @@ export interface IPCError {
31
31
  data?: unknown;
32
32
  }
33
33
  /**
34
- * Method handler function
34
+ * Per-connection context passed to method handlers. Lets a handler register a
35
+ * subscription filter bound to the requesting connection, so the server can do
36
+ * filtered per-subscriber broadcasts (see `broadcastToSubscribers`).
35
37
  */
36
- export type MethodHandler<P = unknown, R = unknown> = (params: P) => Promise<R>;
38
+ export interface ConnectionContext {
39
+ /** Register/replace this connection's subscription filter. */
40
+ subscribe(filter: unknown): void;
41
+ /** Clear this connection's subscription. */
42
+ unsubscribe(): void;
43
+ }
44
+ /**
45
+ * Method handler function. The optional `ctx` carries per-connection state;
46
+ * handlers that don't need it simply ignore the second argument.
47
+ */
48
+ export type MethodHandler<P = unknown, R = unknown> = (params: P, ctx: ConnectionContext) => Promise<R>;
37
49
  /**
38
50
  * Handler for server-push notifications (messages with id: null and a method field)
39
51
  */
@@ -50,6 +62,11 @@ export interface IPCServer {
50
62
  handle<P = unknown, R = unknown>(method: string, handler: MethodHandler<P, R>): void;
51
63
  /** Send a JSON-RPC notification to all connected clients */
52
64
  broadcastNotification(method: string, params: unknown): void;
65
+ /**
66
+ * Send a notification only to subscriber connections whose registered filter
67
+ * satisfies `matches`. Connections without a subscription receive nothing.
68
+ */
69
+ broadcastToSubscribers(method: string, params: unknown, matches: (filter: unknown) => boolean): void;
53
70
  /** Get current connection count */
54
71
  getConnectionCount(): number;
55
72
  /** Socket path */
@@ -77,6 +94,19 @@ export declare const JSON_RPC_ERRORS: {
77
94
  readonly message: "Internal error";
78
95
  };
79
96
  };
97
+ /**
98
+ * Usable byte length of a Unix-domain socket path on this platform. The kernel's
99
+ * `sockaddr_un.sun_path` is a fixed-size buffer and the path must be
100
+ * NUL-terminated, so the usable length is one byte less than the buffer:
101
+ * - macOS / *BSD: 104-byte buffer → 103 usable
102
+ * - Linux: 108-byte buffer → 107 usable
103
+ * - Windows: named pipes, not sun_path → no comparable limit
104
+ *
105
+ * A path over the limit is silently truncated by the kernel on bind(), which
106
+ * collides otherwise-distinct daemons onto one socket file and surfaces as a
107
+ * bogus EADDRINUSE. Deeply-nested checkouts hit this on macOS in particular.
108
+ */
109
+ export declare function maxSocketPathBytes(platform?: NodeJS.Platform): number;
80
110
  /**
81
111
  * Create an IPC server
82
112
  *
@@ -1 +1 @@
1
- {"version":3,"file":"ipc.d.ts","sourceRoot":"","sources":["../../src/daemon/ipc.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,QAAQ,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;AAEhF;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;AAE5E;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,gCAAgC;IAChC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB,yDAAyD;IACzD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtB,gCAAgC;IAChC,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;IAErF,4DAA4D;IAC5D,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IAE7D,mCAAmC;IACnC,kBAAkB,IAAI,MAAM,CAAC;IAE7B,kBAAkB;IAClB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAMD,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;CAMlB,CAAC;AAMX;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAmO7D;AAMD;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,wBAAwB;IACxB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzB,6BAA6B;IAC7B,UAAU,IAAI,IAAI,CAAC;IAEnB,yCAAyC;IACzC,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAEnE,uFAAuF;IACvF,cAAc,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,IAAI,CAAC;IAEzD,yBAAyB;IACzB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAmJ7D"}
1
+ {"version":3,"file":"ipc.d.ts","sourceRoot":"","sources":["../../src/daemon/ipc.ts"],"names":[],"mappings":"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"}
@@ -20,6 +20,25 @@ export const JSON_RPC_ERRORS = {
20
20
  // ============================================================================
21
21
  // Implementation
22
22
  // ============================================================================
23
+ /**
24
+ * Usable byte length of a Unix-domain socket path on this platform. The kernel's
25
+ * `sockaddr_un.sun_path` is a fixed-size buffer and the path must be
26
+ * NUL-terminated, so the usable length is one byte less than the buffer:
27
+ * - macOS / *BSD: 104-byte buffer → 103 usable
28
+ * - Linux: 108-byte buffer → 107 usable
29
+ * - Windows: named pipes, not sun_path → no comparable limit
30
+ *
31
+ * A path over the limit is silently truncated by the kernel on bind(), which
32
+ * collides otherwise-distinct daemons onto one socket file and surfaces as a
33
+ * bogus EADDRINUSE. Deeply-nested checkouts hit this on macOS in particular.
34
+ */
35
+ export function maxSocketPathBytes(platform = process.platform) {
36
+ if (platform === 'win32')
37
+ return Number.POSITIVE_INFINITY;
38
+ if (platform === 'linux')
39
+ return 107;
40
+ return 103;
41
+ }
23
42
  /**
24
43
  * Create an IPC server
25
44
  *
@@ -28,6 +47,8 @@ export const JSON_RPC_ERRORS = {
28
47
  export function createIPCServer(socketPath) {
29
48
  const handlers = new Map();
30
49
  const connections = new Set();
50
+ /** Per-connection subscription filters, for filtered broadcasts. */
51
+ const subscriptions = new Map();
31
52
  let server = null;
32
53
  /**
33
54
  * Create error response
@@ -80,7 +101,7 @@ export function createIPCServer(socketPath) {
80
101
  /**
81
102
  * Handle a single request
82
103
  */
83
- async function handleRequest(request) {
104
+ async function handleRequest(request, ctx) {
84
105
  // Notifications (id is null) don't get responses
85
106
  const isNotification = request.id === null;
86
107
  const handler = handlers.get(request.method);
@@ -90,7 +111,7 @@ export function createIPCServer(socketPath) {
90
111
  return errorResponse(request.id, JSON_RPC_ERRORS.METHOD_NOT_FOUND);
91
112
  }
92
113
  try {
93
- const result = await handler(request.params);
114
+ const result = await handler(request.params, ctx);
94
115
  if (isNotification)
95
116
  return null;
96
117
  return successResponse(request.id, result);
@@ -113,6 +134,11 @@ export function createIPCServer(socketPath) {
113
134
  */
114
135
  function handleConnection(socket) {
115
136
  connections.add(socket);
137
+ // Per-connection context — lets watch.subscribe bind a filter to this socket.
138
+ const ctx = {
139
+ subscribe: (filter) => subscriptions.set(socket, filter),
140
+ unsubscribe: () => subscriptions.delete(socket),
141
+ };
116
142
  let buffer = '';
117
143
  socket.on('data', async (data) => {
118
144
  buffer += data.toString();
@@ -141,7 +167,7 @@ export function createIPCServer(socketPath) {
141
167
  continue;
142
168
  }
143
169
  // Handle request
144
- const response = await handleRequest(requestOrError);
170
+ const response = await handleRequest(requestOrError, ctx);
145
171
  if (response) {
146
172
  socket.write(JSON.stringify(response) + '\n');
147
173
  }
@@ -149,9 +175,11 @@ export function createIPCServer(socketPath) {
149
175
  });
150
176
  socket.on('close', () => {
151
177
  connections.delete(socket);
178
+ subscriptions.delete(socket);
152
179
  });
153
180
  socket.on('error', () => {
154
181
  connections.delete(socket);
182
+ subscriptions.delete(socket);
155
183
  });
156
184
  }
157
185
  return {
@@ -160,6 +188,16 @@ export function createIPCServer(socketPath) {
160
188
  if (server) {
161
189
  throw new DaemonError('IPC_ERROR', 'Server already started');
162
190
  }
191
+ // Reject an unbindable socket path up front. Longer than the platform's
192
+ // sun_path buffer, the kernel truncates it on bind() — colliding daemons
193
+ // and raising a bogus EADDRINUSE. A clear error beats that mystery.
194
+ const socketPathBytes = Buffer.byteLength(socketPath, 'utf8');
195
+ const socketPathLimit = maxSocketPathBytes();
196
+ if (socketPathBytes > socketPathLimit) {
197
+ throw new DaemonError('IPC_ERROR', `Daemon socket path is ${socketPathBytes} bytes but ${process.platform} allows at most ` +
198
+ `${socketPathLimit}; the OS truncates longer paths on bind() (a bogus EADDRINUSE). Use a ` +
199
+ `shorter task-graph or data-dir path. Path: ${socketPath}`);
200
+ }
163
201
  // Remove existing socket file
164
202
  try {
165
203
  await fs.unlink(socketPath);
@@ -188,6 +226,7 @@ export function createIPCServer(socketPath) {
188
226
  socket.destroy();
189
227
  }
190
228
  connections.clear();
229
+ subscriptions.clear();
191
230
  // Close server
192
231
  return new Promise((resolve) => {
193
232
  server.close(() => {
@@ -215,6 +254,18 @@ export function createIPCServer(socketPath) {
215
254
  }
216
255
  }
217
256
  },
257
+ broadcastToSubscribers(method, params, matches) {
258
+ const notification = JSON.stringify({ jsonrpc: '2.0', id: null, method, params }) + '\n';
259
+ for (const [socket, filter] of subscriptions) {
260
+ try {
261
+ if (matches(filter))
262
+ socket.write(notification);
263
+ }
264
+ catch {
265
+ // Connection may be dead — ignore
266
+ }
267
+ }
268
+ },
218
269
  getConnectionCount() {
219
270
  return connections.size;
220
271
  },
@@ -1 +1 @@
1
- {"version":3,"file":"ipc.js","sourceRoot":"","sources":["../../src/daemon/ipc.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ipc.js","sourceRoot":"","sources":["../../src/daemon/ipc.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../src/daemon/lifecycle.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,OAAO,EAAiC,KAAK,YAAY,EAAoB,MAAM,YAAY,CAAC;AAUhG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAiBpD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAoBjE;;GAEG;AACH,UAAU,gBAAgB;IACxB,wBAAwB;IACxB,OAAO,EAAE,MAAM,CAAC;IAEhB,uDAAuD;IACvD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B,yCAAyC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,0BAA2B,SAAQ,gBAAgB;IAClE,oCAAoC;IACpC,YAAY,EAAE,MAAM,CAAC;IAErB,uEAAuE;IACvE,KAAK,EAAE,UAAU,CAAC;IAElB,mDAAmD;IACnD,eAAe,CAAC,EAAE,sBAAsB,CAAC;CAC1C;AAED;;GAEG;AACH,MAAM,WAAW,yBAA0B,SAAQ,gBAAgB;IACjE,gDAAgD;IAChD,YAAY,EAAE,MAAM,CAAC;IAErB,gFAAgF;IAChF,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,0BAA0B,GAAG,yBAAyB,CAAC;AAElF;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB,uBAAuB;IACvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB,iCAAiC;IACjC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtB,wBAAwB;IACxB,SAAS,IAAI,YAAY,CAAC;IAE1B,0BAA0B;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAE5B,4CAA4C;IAC5C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,0CAA0C;IAC1C,OAAO,EAAE,OAAO,CAAC;IAEjB,6BAA6B;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,qBAAqB;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AA2ID;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAkB7F;AAMD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAKzD"}
1
+ {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../src/daemon/lifecycle.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,OAAO,EAAiC,KAAK,YAAY,EAAoB,MAAM,YAAY,CAAC;AAUhG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAqBpD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAajE;;GAEG;AACH,UAAU,gBAAgB;IACxB,wBAAwB;IACxB,OAAO,EAAE,MAAM,CAAC;IAEhB,uDAAuD;IACvD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B,yCAAyC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,0BAA2B,SAAQ,gBAAgB;IAClE,oCAAoC;IACpC,YAAY,EAAE,MAAM,CAAC;IAErB,uEAAuE;IACvE,KAAK,EAAE,UAAU,CAAC;IAElB,mDAAmD;IACnD,eAAe,CAAC,EAAE,sBAAsB,CAAC;CAC1C;AAED;;GAEG;AACH,MAAM,WAAW,yBAA0B,SAAQ,gBAAgB;IACjE,gDAAgD;IAChD,YAAY,EAAE,MAAM,CAAC;IAErB,gFAAgF;IAChF,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,0BAA0B,GAAG,yBAAyB,CAAC;AAElF;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB,uBAAuB;IACvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB,iCAAiC;IACjC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtB,wBAAwB;IACxB,SAAS,IAAI,YAAY,CAAC;IAE1B,0BAA0B;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAE5B,4CAA4C;IAC5C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,0CAA0C;IAC1C,OAAO,EAAE,OAAO,CAAC;IAEjB,6BAA6B;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,qBAAqB;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AA2ID;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAkB7F;AAMD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAKzD"}
@@ -28,14 +28,18 @@ import { registerProviderMethods } from './methods/provider.js';
28
28
  import { registerArchiveMethods } from './methods/archive.js';
29
29
  import { registerContextFilesMethods } from './methods/context-files.js';
30
30
  import { registerWatchMethods } from './methods/watch.js';
31
- import { registerSyncMethods } from './methods/sync.js';
31
+ import { registerSyncMethods, registerMultiLocationSyncMethods } from './methods/sync.js';
32
+ import { registerEventMethods } from './methods/events.js';
33
+ import { createEventManager } from './events.js';
34
+ import { createIdempotencyStore } from './idempotency.js';
35
+ import { createHealthCounters } from './health-counters.js';
32
36
  import { createGitGraphSyncer, } from '../graph/git-graph-syncer.js';
33
37
  import { loadConfigFile } from '../config/loader.js';
34
38
  import { createBeadsProvider } from '../providers/beads.js';
35
39
  import { createSudocodeProvider } from '../providers/sudocode.js';
36
40
  import { createClaudeTasksProvider } from '../providers/claude-tasks.js';
37
41
  import { createGlobalProvider } from '../providers/global.js';
38
- import { createLocationState, createSingleLocationResolver, createMultiLocationResolver, } from './location-state.js';
42
+ import { createLocationState, reloadLocationGitSyncer, createSingleLocationResolver, createMultiLocationResolver } from './location-state.js';
39
43
  import { readWorktreeRegistry } from '../core/worktree.js';
40
44
  // ============================================================================
41
45
  // Constants
@@ -202,6 +206,7 @@ function createSingleLocationDaemon(config) {
202
206
  let sessionlogLinker = null;
203
207
  let reconciliationIntervalHandle = null;
204
208
  let providerIntervalHandles = null;
209
+ let claimSweepIntervalHandle = null;
205
210
  // Git graph syncer — null when `sync.git.enabled` is false (default).
206
211
  // When enabled: installed merge driver + optional pull-on-startup + optional
207
212
  // auto-commit/push timer managed internally by the syncer.
@@ -329,6 +334,10 @@ function createSingleLocationDaemon(config) {
329
334
  healthy: true,
330
335
  };
331
336
  const locationResolver = createSingleLocationResolver(locationState);
337
+ // Tracks otherwise-silent watcher/reconcile failures so `health` can
338
+ // surface them (P3 M3 / F10). Git sync failures come from the syncer's
339
+ // own SyncerHealth, exposed alongside via getSyncHealth below.
340
+ const healthCounters = createHealthCounters();
332
341
  // 9. Register method handlers
333
342
  registerLifecycleMethods({
334
343
  server: ipcServer,
@@ -336,10 +345,16 @@ function createSingleLocationDaemon(config) {
336
345
  shutdown: () => daemon.stop(),
337
346
  version,
338
347
  startedAt: new Date(startedAt),
348
+ getHealthCounters: () => healthCounters.snapshot(),
349
+ getSyncHealth: () => gitSyncer?.getHealth() ?? null,
339
350
  });
351
+ // One idempotency store per daemon: dedupes retried creates carrying an
352
+ // idempotency_key within a TTL window (P3 M3 / F9).
353
+ const idempotencyStore = createIdempotencyStore();
340
354
  registerGraphMethods({
341
355
  server: ipcServer,
342
356
  locationResolver,
357
+ idempotencyStore,
343
358
  });
344
359
  // Create shared skill tracker registry (only if enabled in config)
345
360
  const skillTrackingEnabled = openTasksConfig?.tracking?.skillTracking !== false;
@@ -363,10 +378,25 @@ function createSingleLocationDaemon(config) {
363
378
  server: ipcServer,
364
379
  locationResolver,
365
380
  });
381
+ // One event manager per daemon process: the watch broadcaster stamps
382
+ // each event through it (seq + epoch + ring buffer), and events.since
383
+ // replays from the same buffer (P3 M2).
384
+ const eventManager = createEventManager();
366
385
  registerWatchMethods({
367
386
  server: ipcServer,
368
387
  locationResolver,
388
+ eventManager,
389
+ onWatcherError: () => healthCounters.recordWatcherError(),
369
390
  });
391
+ registerEventMethods({
392
+ server: ipcServer,
393
+ eventManager,
394
+ });
395
+ // Record reconcile outcomes for `health` (F10) while preserving the
396
+ // existing swallow-errors behavior (a reconcile failure is non-fatal).
397
+ const trackReconcile = (p) => {
398
+ void p.then(() => healthCounters.recordReconcileRun(), () => healthCounters.recordReconcileError());
399
+ };
370
400
  const disabledSync = {
371
401
  enabled: false,
372
402
  autoCommit: false,
@@ -423,7 +453,16 @@ function createSingleLocationDaemon(config) {
423
453
  }
424
454
  if (options.doInitialPull && gitSyncConfig.pullOnStartup) {
425
455
  try {
426
- await gitSyncer.pull();
456
+ const pullResult = await gitSyncer.pull();
457
+ // The startup pull mutates graph.jsonl on disk, but the file
458
+ // watcher isn't started yet and SQLite still holds the
459
+ // pre-pull snapshot. Reload so queries see the pulled peer
460
+ // data — and, critically, so the next local flush (a
461
+ // full-file overwrite from SQLite) can't clobber the pulled
462
+ // nodes back off disk.
463
+ if (pullResult.hasChanges) {
464
+ await store.reload();
465
+ }
427
466
  }
428
467
  catch {
429
468
  /* initial pull failure is non-fatal */
@@ -447,6 +486,12 @@ function createSingleLocationDaemon(config) {
447
486
  registerSyncMethods({
448
487
  server: ipcServer,
449
488
  getSyncer: () => gitSyncer,
489
+ // Serialize manual sync/pull with the flush so a pending flush can't
490
+ // clobber a freshly-pulled graph.jsonl (F2 race); reload SQLite after.
491
+ flushManager: flushManager ?? undefined,
492
+ reloadStore: async () => {
493
+ await store.reload();
494
+ },
450
495
  getSyncStatus: () => ({
451
496
  enabled: gitSyncConfig.enabled,
452
497
  remote: gitSyncConfig.remote,
@@ -454,6 +499,7 @@ function createSingleLocationDaemon(config) {
454
499
  autoPush: gitSyncConfig.autoPush,
455
500
  pullOnStartup: gitSyncConfig.pullOnStartup,
456
501
  autoSyncRunning: gitSyncer?.isAutoSyncRunning() ?? false,
502
+ health: gitSyncer?.getHealth(),
457
503
  }),
458
504
  reloadSyncer: async () => {
459
505
  // Re-read `.opentasks/config.json` from disk — the whole
@@ -482,6 +528,7 @@ function createSingleLocationDaemon(config) {
482
528
  autoPush: gitSyncConfig.autoPush,
483
529
  pullOnStartup: gitSyncConfig.pullOnStartup,
484
530
  autoSyncRunning: gitSyncer?.isAutoSyncRunning() ?? false,
531
+ health: gitSyncer?.getHealth(),
485
532
  };
486
533
  },
487
534
  });
@@ -494,7 +541,7 @@ function createSingleLocationDaemon(config) {
494
541
  fileWatcher.onchange((event) => {
495
542
  if (event.category === 'graph' && onReload !== 'none' && activeProviderStore) {
496
543
  // After external graph changes, reconcile provider-backed nodes
497
- void activeProviderStore.reconcileProviders().catch(() => { });
544
+ trackReconcile(activeProviderStore.reconcileProviders());
498
545
  }
499
546
  });
500
547
  await fileWatcher.start();
@@ -510,10 +557,30 @@ function createSingleLocationDaemon(config) {
510
557
  if (bgInterval > 0) {
511
558
  reconciliationIntervalHandle = setInterval(() => {
512
559
  if (activeProviderStore) {
513
- void activeProviderStore.reconcileProviders().catch(() => { });
560
+ trackReconcile(activeProviderStore.reconcileProviders());
514
561
  }
515
562
  }, bgInterval);
516
563
  }
564
+ // 12c-bis. Background lease reaper — atomically clears expired claims so
565
+ // a crashed/AFK agent's tasks become claimable again and the change
566
+ // flushes (reaching watchers). Steal-on-expiry already makes them
567
+ // reclaimable; this actively cleans up the stale claim fields + notifies.
568
+ const LEASE_SWEEP_INTERVAL_MS = 60_000;
569
+ claimSweepIntervalHandle = setInterval(() => {
570
+ if (!activeProviderStore || !flushManager)
571
+ return;
572
+ const fm = flushManager;
573
+ void activeProviderStore
574
+ .sweepExpiredClaims()
575
+ .then((cleared) => {
576
+ if (cleared.length === 0)
577
+ return;
578
+ for (const id of cleared)
579
+ fm.markDirty(id);
580
+ fm.schedule();
581
+ })
582
+ .catch(() => { });
583
+ }, LEASE_SWEEP_INTERVAL_MS);
517
584
  // 12d. Start per-provider reconciliation intervals
518
585
  const providerIntervals = reconciliationConfig?.providerIntervals;
519
586
  if (providerIntervals && Object.keys(providerIntervals).length > 0) {
@@ -522,7 +589,7 @@ function createSingleLocationDaemon(config) {
522
589
  if (interval > 0) {
523
590
  providerIntervalHandles.set(providerName, setInterval(() => {
524
591
  if (activeProviderStore) {
525
- void activeProviderStore.reconcileProviders({ providers: [providerName] }).catch(() => { });
592
+ trackReconcile(activeProviderStore.reconcileProviders({ providers: [providerName] }));
526
593
  }
527
594
  }, interval));
528
595
  }
@@ -578,6 +645,10 @@ function createSingleLocationDaemon(config) {
578
645
  clearInterval(handle);
579
646
  providerIntervalHandles = null;
580
647
  }
648
+ if (claimSweepIntervalHandle) {
649
+ clearInterval(claimSweepIntervalHandle);
650
+ claimSweepIntervalHandle = null;
651
+ }
581
652
  if (gitSyncer) {
582
653
  try {
583
654
  gitSyncer.stopAutoSync();
@@ -657,6 +728,10 @@ function createSingleLocationDaemon(config) {
657
728
  clearInterval(handle);
658
729
  providerIntervalHandles = null;
659
730
  }
731
+ if (claimSweepIntervalHandle) {
732
+ clearInterval(claimSweepIntervalHandle);
733
+ claimSweepIntervalHandle = null;
734
+ }
660
735
  // Stop provider watching before tearing down file watcher and store
661
736
  if (activeProviderStore) {
662
737
  activeProviderStore.stopProviderWatching();
@@ -748,6 +823,13 @@ function createMultiLocationDaemon(config) {
748
823
  // Managers
749
824
  const lockManager = createLockManager(daemonHomePath);
750
825
  const registryManager = createRegistryManager(registryPath);
826
+ // Tracks otherwise-silent watcher/reconcile failures so `health` can surface
827
+ // them (P3 M3 / F10). Factory-scoped so the per-location watcher setup and the
828
+ // IPC method registration share one tracker.
829
+ const healthCounters = createHealthCounters();
830
+ const trackReconcile = (p) => {
831
+ void p.then(() => healthCounters.recordReconcileRun(), () => healthCounters.recordReconcileError());
832
+ };
751
833
  // Components
752
834
  let ipcServer = null;
753
835
  let locationResolver = null;
@@ -792,7 +874,14 @@ function createMultiLocationDaemon(config) {
792
874
  sharedSkillTrackerRegistry = createSkillTrackerRegistry();
793
875
  }
794
876
  const locReconciliationConfig = locationConfig?.reconciliation;
795
- const locState = await createLocationState(opentasksPath, hash, isPrimary, sharedSkillTrackerRegistry);
877
+ const locState = await createLocationState(opentasksPath, hash, isPrimary, sharedSkillTrackerRegistry, {
878
+ // Count this location's reload-reconcile runs/errors + reload failures
879
+ // in the daemon's shared health counters (F10). Without this, a
880
+ // multi-location location's reload-path activity is invisible.
881
+ recordReconcileRun: () => healthCounters.recordReconcileRun(),
882
+ recordReconcileError: () => healthCounters.recordReconcileError(),
883
+ recordWatcherError: () => healthCounters.recordWatcherError(),
884
+ });
796
885
  // Wrap store with provider-aware dispatch
797
886
  const defaultProvider = locationConfig?.defaultProvider ?? 'native';
798
887
  locState.providerStore = createProviderAwareStore(locState.store, {
@@ -834,7 +923,7 @@ function createMultiLocationDaemon(config) {
834
923
  if (bgInterval > 0) {
835
924
  locState.reconciliationInterval = setInterval(() => {
836
925
  if (locState.providerStore) {
837
- void locState.providerStore.reconcileProviders().catch(() => { });
926
+ trackReconcile(locState.providerStore.reconcileProviders());
838
927
  }
839
928
  }, bgInterval);
840
929
  }
@@ -846,12 +935,31 @@ function createMultiLocationDaemon(config) {
846
935
  if (interval > 0) {
847
936
  locState.providerReconciliationIntervals.set(providerName, setInterval(() => {
848
937
  if (locState.providerStore) {
849
- void locState.providerStore.reconcileProviders({ providers: [providerName] }).catch(() => { });
938
+ trackReconcile(locState.providerStore.reconcileProviders({ providers: [providerName] }));
850
939
  }
851
940
  }, interval));
852
941
  }
853
942
  }
854
943
  }
944
+ // Background lease reaper — clears expired claims so a crashed/AFK agent's
945
+ // tasks become claimable again, per location (mirrors the single-location
946
+ // daemon). Steal-on-expiry already makes them reclaimable; this is active
947
+ // cleanup + watcher notification.
948
+ locState.claimSweepInterval = setInterval(() => {
949
+ const fm = locState.flushManager;
950
+ if (!locState.providerStore || !fm)
951
+ return;
952
+ void locState.providerStore
953
+ .sweepExpiredClaims()
954
+ .then((cleared) => {
955
+ if (cleared.length === 0)
956
+ return;
957
+ for (const id of cleared)
958
+ fm.markDirty(id);
959
+ fm.schedule();
960
+ })
961
+ .catch(() => { });
962
+ }, 60_000);
855
963
  return locState;
856
964
  }
857
965
  catch {
@@ -979,10 +1087,16 @@ function createMultiLocationDaemon(config) {
979
1087
  return 'degraded';
980
1088
  return 'healthy';
981
1089
  },
1090
+ getHealthCounters: () => healthCounters.snapshot(),
1091
+ // Multi-location daemons don't own a single git syncer; sync health is
1092
+ // not surfaced here.
982
1093
  });
1094
+ // One idempotency store per daemon (P3 M3 / F9) — see single-location path.
1095
+ const idempotencyStore = createIdempotencyStore();
983
1096
  registerGraphMethods({
984
1097
  server: ipcServer,
985
1098
  locationResolver,
1099
+ idempotencyStore,
986
1100
  });
987
1101
  registerToolsMethods({
988
1102
  server: ipcServer,
@@ -1002,9 +1116,31 @@ function createMultiLocationDaemon(config) {
1002
1116
  locationResolver,
1003
1117
  gitCommonDir,
1004
1118
  });
1119
+ // Archive methods are location-aware (resolve per `location` param), so
1120
+ // they wire identically to single-location. Previously absent here.
1121
+ registerArchiveMethods({
1122
+ server: ipcServer,
1123
+ locationResolver,
1124
+ });
1125
+ // Location-aware git sync — each worktree's sync runs through the SAME
1126
+ // coordinated flush-freeze-reload as single-location, resolved per
1127
+ // `location` param. Closes the C2 gap (uncoordinated per-location sync).
1128
+ registerMultiLocationSyncMethods({
1129
+ server: ipcServer,
1130
+ locationResolver,
1131
+ reloadLocationSyncer: (state) => reloadLocationGitSyncer(state),
1132
+ });
1133
+ // One event manager per daemon process (P3 M2) — see single-location path.
1134
+ const eventManager = createEventManager();
1005
1135
  registerWatchMethods({
1006
1136
  server: ipcServer,
1007
1137
  locationResolver,
1138
+ eventManager,
1139
+ onWatcherError: () => healthCounters.recordWatcherError(),
1140
+ });
1141
+ registerEventMethods({
1142
+ server: ipcServer,
1143
+ eventManager,
1008
1144
  });
1009
1145
  // 14. Start IPC server
1010
1146
  await ipcServer.start();