harnery 0.45.1 → 0.46.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 (332) hide show
  1. package/dist/commander.d.ts +13 -0
  2. package/dist/commander.d.ts.map +1 -1
  3. package/dist/commands/admission.d.ts.map +1 -1
  4. package/dist/commands/admission.js +214 -27
  5. package/dist/commands/agents.d.ts +4 -0
  6. package/dist/commands/agents.d.ts.map +1 -1
  7. package/dist/commands/agents.js +102 -25
  8. package/dist/commands/browse.d.ts +3 -0
  9. package/dist/commands/browse.d.ts.map +1 -1
  10. package/dist/commands/browse.js +172 -8
  11. package/dist/commands/fetch.js +1 -0
  12. package/dist/commands/ledger-v3.d.ts.map +1 -1
  13. package/dist/commands/ledger-v3.js +8 -2
  14. package/dist/commands/presence.d.ts.map +1 -1
  15. package/dist/commands/presence.js +40 -0
  16. package/dist/commands/qa-run.d.ts.map +1 -1
  17. package/dist/commands/qa-run.js +4 -3
  18. package/dist/commands/review-pack.d.ts.map +1 -1
  19. package/dist/commands/review-pack.js +33 -6
  20. package/dist/commands/workflow.d.ts.map +1 -1
  21. package/dist/commands/workflow.js +6 -45
  22. package/dist/core/agents/coord-client.d.ts.map +1 -1
  23. package/dist/core/agents/coord-client.js +0 -18
  24. package/dist/core/agents/index.d.ts +1 -0
  25. package/dist/core/agents/index.d.ts.map +1 -1
  26. package/dist/core/agents/index.js +1 -0
  27. package/dist/core/agents/live-authority-v3.d.ts.map +1 -1
  28. package/dist/core/agents/live-authority-v3.js +11 -4
  29. package/dist/core/agents/render/session-context.d.ts +0 -6
  30. package/dist/core/agents/render/session-context.d.ts.map +1 -1
  31. package/dist/core/agents/render/session-context.js +1 -6
  32. package/dist/core/agents/session-events.d.ts.map +1 -1
  33. package/dist/core/agents/session-events.js +12 -4
  34. package/dist/core/agents/state/heartbeat-reader.d.ts +3 -0
  35. package/dist/core/agents/state/heartbeat-reader.d.ts.map +1 -1
  36. package/dist/core/agents/state/live-coordination-view.d.ts +3 -1
  37. package/dist/core/agents/state/live-coordination-view.d.ts.map +1 -1
  38. package/dist/core/agents/state/live-coordination-view.js +6 -2
  39. package/dist/core/agents/state/parent-reference-contract.d.ts +16 -0
  40. package/dist/core/agents/state/parent-reference-contract.d.ts.map +1 -0
  41. package/dist/core/agents/state/parent-reference-contract.js +1 -0
  42. package/dist/core/agents/state/parent-reference.d.ts +18 -0
  43. package/dist/core/agents/state/parent-reference.d.ts.map +1 -0
  44. package/dist/core/agents/state/parent-reference.js +119 -0
  45. package/dist/core/agents/state/pidmap.js +2 -2
  46. package/dist/core/agents/state/proc-start.d.ts +20 -31
  47. package/dist/core/agents/state/proc-start.d.ts.map +1 -1
  48. package/dist/core/agents/state/proc-start.js +37 -70
  49. package/dist/core/agents/state/service-process.d.ts +61 -0
  50. package/dist/core/agents/state/service-process.d.ts.map +1 -0
  51. package/dist/core/agents/state/service-process.js +143 -0
  52. package/dist/core/config.d.ts +39 -0
  53. package/dist/core/config.d.ts.map +1 -1
  54. package/dist/core/config.js +63 -0
  55. package/dist/core/context/index.d.ts +6 -4
  56. package/dist/core/context/index.d.ts.map +1 -1
  57. package/dist/core/context/index.js +194 -256
  58. package/dist/core/context/observation.d.ts +9 -9
  59. package/dist/core/context/observation.d.ts.map +1 -1
  60. package/dist/core/context/observation.js +37 -6
  61. package/dist/core/diagnostics/path-identity.d.ts +1 -1
  62. package/dist/core/diagnostics/path-identity.d.ts.map +1 -1
  63. package/dist/core/diagnostics/path-identity.js +51 -6
  64. package/dist/core/events/v3/canonical.js +43 -14
  65. package/dist/core/events/v3/index.d.ts +1 -1
  66. package/dist/core/events/v3/index.d.ts.map +1 -1
  67. package/dist/core/events/v3/index.js +1 -1
  68. package/dist/core/events/v3/producers/recorder.d.ts +34 -0
  69. package/dist/core/events/v3/producers/recorder.d.ts.map +1 -1
  70. package/dist/core/events/v3/producers/recorder.js +117 -13
  71. package/dist/core/events/v3/reader.d.ts.map +1 -1
  72. package/dist/core/events/v3/reader.js +53 -13
  73. package/dist/core/events/v3/runtime-build.d.ts +14 -0
  74. package/dist/core/events/v3/runtime-build.d.ts.map +1 -1
  75. package/dist/core/events/v3/runtime-build.js +44 -0
  76. package/dist/core/events/v3/validate.d.ts.map +1 -1
  77. package/dist/core/events/v3/validate.js +36 -1
  78. package/dist/core/governor/index.d.ts +2 -1
  79. package/dist/core/governor/index.d.ts.map +1 -1
  80. package/dist/core/governor/index.js +2 -1
  81. package/dist/core/governor/service-read.d.ts +3 -10
  82. package/dist/core/governor/service-read.d.ts.map +1 -1
  83. package/dist/core/governor/service-read.js +10 -94
  84. package/dist/core/governor/service.d.ts +3 -7
  85. package/dist/core/governor/service.d.ts.map +1 -1
  86. package/dist/core/governor/service.js +17 -182
  87. package/dist/core/hooks/adapter/native-parent.d.ts +23 -0
  88. package/dist/core/hooks/adapter/native-parent.d.ts.map +1 -0
  89. package/dist/core/hooks/adapter/native-parent.js +91 -0
  90. package/dist/core/hooks/cli.js +79 -4
  91. package/dist/core/hooks/resolve/owner.d.ts +0 -11
  92. package/dist/core/hooks/resolve/owner.d.ts.map +1 -1
  93. package/dist/core/hooks/resolve/owner.js +2 -25
  94. package/dist/core/hooks/shell-admission.d.ts +84 -0
  95. package/dist/core/hooks/shell-admission.d.ts.map +1 -0
  96. package/dist/core/hooks/shell-admission.js +622 -0
  97. package/dist/core/hooks/shell-commit-tree.d.ts +2 -0
  98. package/dist/core/hooks/shell-commit-tree.d.ts.map +1 -0
  99. package/dist/core/hooks/shell-commit-tree.js +104 -0
  100. package/dist/core/inbox/contract.d.ts +12 -0
  101. package/dist/core/inbox/contract.d.ts.map +1 -1
  102. package/dist/core/inbox/contract.js +16 -0
  103. package/dist/core/inbox/peer-messages.d.ts +41 -16
  104. package/dist/core/inbox/peer-messages.d.ts.map +1 -1
  105. package/dist/core/inbox/peer-messages.js +372 -15
  106. package/dist/core/inbox/service.d.ts +8 -1
  107. package/dist/core/inbox/service.d.ts.map +1 -1
  108. package/dist/core/inbox/service.js +83 -3
  109. package/dist/core/inbox/targets.d.ts +17 -3
  110. package/dist/core/inbox/targets.d.ts.map +1 -1
  111. package/dist/core/inbox/targets.js +77 -2
  112. package/dist/core/presence/git.d.ts +18 -12
  113. package/dist/core/presence/git.d.ts.map +1 -1
  114. package/dist/core/presence/git.js +32 -38
  115. package/dist/core/presence/index.d.ts +2 -2
  116. package/dist/core/presence/index.d.ts.map +1 -1
  117. package/dist/core/presence/index.js +8 -6
  118. package/dist/core/presence/mail.d.ts +133 -0
  119. package/dist/core/presence/mail.d.ts.map +1 -0
  120. package/dist/core/presence/mail.js +464 -0
  121. package/dist/core/resources/sampler.js +2 -2
  122. package/dist/core/resources/service-status.d.ts +2 -14
  123. package/dist/core/resources/service-status.d.ts.map +1 -1
  124. package/dist/core/resources/service-status.js +3 -23
  125. package/dist/core/resources/service.d.ts +3 -7
  126. package/dist/core/resources/service.d.ts.map +1 -1
  127. package/dist/core/resources/service.js +12 -101
  128. package/dist/core/resources/status.d.ts.map +1 -1
  129. package/dist/core/resources/status.js +3 -2
  130. package/dist/core/semantic/contract.d.ts +5 -5
  131. package/dist/core/semantic/service.d.ts.map +1 -1
  132. package/dist/core/semantic/service.js +9 -2
  133. package/dist/core/servers/index.d.ts +0 -2
  134. package/dist/core/servers/index.d.ts.map +1 -1
  135. package/dist/core/servers/index.js +3 -18
  136. package/dist/core/storage/modes.d.ts +4 -0
  137. package/dist/core/storage/modes.d.ts.map +1 -1
  138. package/dist/core/storage/modes.js +4 -0
  139. package/dist/core/storage/segments.d.ts.map +1 -1
  140. package/dist/core/storage/segments.js +5 -4
  141. package/dist/core/supervisor/service.d.ts +4 -7
  142. package/dist/core/supervisor/service.d.ts.map +1 -1
  143. package/dist/core/supervisor/service.js +23 -122
  144. package/dist/core/supervisor/services.js +2 -2
  145. package/dist/core/supervisor/status.d.ts +3 -17
  146. package/dist/core/supervisor/status.d.ts.map +1 -1
  147. package/dist/core/supervisor/status.js +7 -70
  148. package/dist/core/workflow/engine.js +2 -1
  149. package/dist/core/workflow/index.d.ts +3 -4
  150. package/dist/core/workflow/index.d.ts.map +1 -1
  151. package/dist/core/workflow/index.js +2 -2
  152. package/dist/core/workflow/proof.d.ts.map +1 -1
  153. package/dist/core/workflow/proof.js +30 -74
  154. package/dist/core/workflow/resume-lock.d.ts +17 -0
  155. package/dist/core/workflow/resume-lock.d.ts.map +1 -0
  156. package/dist/core/workflow/resume-lock.js +158 -0
  157. package/dist/core/workflow/run-state.d.ts +0 -21
  158. package/dist/core/workflow/run-state.d.ts.map +1 -1
  159. package/dist/core/workflow/run-state.js +3 -174
  160. package/dist/core/workflow/workspaces/leases.d.ts +4 -0
  161. package/dist/core/workflow/workspaces/leases.d.ts.map +1 -1
  162. package/dist/core/workflow/workspaces/leases.js +1 -1
  163. package/dist/core/workflow/workspaces/local-git.js +91 -210
  164. package/dist/core/workflow/workspaces/ownership.d.ts +0 -7
  165. package/dist/core/workflow/workspaces/ownership.d.ts.map +1 -1
  166. package/dist/core/workflow/workspaces/ownership.js +3 -130
  167. package/dist/core/workflow/workspaces/reclaim.d.ts +4 -7
  168. package/dist/core/workflow/workspaces/reclaim.d.ts.map +1 -1
  169. package/dist/core/workflow/workspaces/reclaim.js +0 -4
  170. package/dist/core/workflow/workspaces/recovery.d.ts +1 -1
  171. package/dist/core/workflow/workspaces/recovery.d.ts.map +1 -1
  172. package/dist/core/workflow/workspaces/recovery.js +1 -1
  173. package/dist/core/workflow/workspaces/state.d.ts.map +1 -1
  174. package/dist/core/workflow/workspaces/state.js +1 -4
  175. package/dist/lib/admission-history.d.ts +96 -0
  176. package/dist/lib/admission-history.d.ts.map +1 -0
  177. package/dist/lib/admission-history.js +196 -0
  178. package/dist/lib/admission.d.ts +56 -7
  179. package/dist/lib/admission.d.ts.map +1 -1
  180. package/dist/lib/admission.js +161 -19
  181. package/dist/lib/browser/client.d.ts +18 -0
  182. package/dist/lib/browser/client.d.ts.map +1 -1
  183. package/dist/lib/browser/client.js +100 -12
  184. package/dist/lib/browser/content-checks.d.ts +3 -1
  185. package/dist/lib/browser/content-checks.d.ts.map +1 -1
  186. package/dist/lib/browser/content-checks.js +10 -2
  187. package/dist/lib/browser/critique.d.ts +32 -0
  188. package/dist/lib/browser/critique.d.ts.map +1 -1
  189. package/dist/lib/browser/critique.js +72 -3
  190. package/dist/lib/browser/geometry.d.ts +2 -0
  191. package/dist/lib/browser/geometry.d.ts.map +1 -1
  192. package/dist/lib/browser/geometry.js +61 -15
  193. package/dist/lib/browser/index.d.ts +1 -1
  194. package/dist/lib/browser/index.d.ts.map +1 -1
  195. package/dist/lib/browser/index.js +1 -1
  196. package/dist/lib/browser/page-review-contracts.d.ts +6 -1
  197. package/dist/lib/browser/page-review-contracts.d.ts.map +1 -1
  198. package/dist/lib/browser/page-review-contracts.js +6 -1
  199. package/dist/lib/browser/page-review-judge.d.ts +3 -1
  200. package/dist/lib/browser/page-review-judge.d.ts.map +1 -1
  201. package/dist/lib/browser/page-review-judge.js +41 -11
  202. package/dist/lib/browser/page-review-pack.d.ts +3 -0
  203. package/dist/lib/browser/page-review-pack.d.ts.map +1 -1
  204. package/dist/lib/browser/page-review-pack.js +5 -2
  205. package/dist/lib/browser/qa-run-contracts.d.ts +11 -0
  206. package/dist/lib/browser/qa-run-contracts.d.ts.map +1 -1
  207. package/dist/lib/browser/qa-run-contracts.js +11 -4
  208. package/dist/lib/browser/qa-run.d.ts.map +1 -1
  209. package/dist/lib/browser/qa-run.js +73 -16
  210. package/dist/lib/browser/runts.d.ts +4 -2
  211. package/dist/lib/browser/runts.d.ts.map +1 -1
  212. package/dist/lib/browser/runts.js +84 -33
  213. package/dist/lib/browser/windows-chrome.d.ts +14 -0
  214. package/dist/lib/browser/windows-chrome.d.ts.map +1 -1
  215. package/dist/lib/browser/windows-chrome.js +42 -0
  216. package/dist/lib/browser/windows-login-sync.d.ts +110 -0
  217. package/dist/lib/browser/windows-login-sync.d.ts.map +1 -0
  218. package/dist/lib/browser/windows-login-sync.js +171 -0
  219. package/dist/lib/cookies/client.d.ts +30 -5
  220. package/dist/lib/cookies/client.d.ts.map +1 -1
  221. package/dist/lib/cookies/client.js +55 -10
  222. package/dist/lib/cookies/index.d.ts +1 -1
  223. package/dist/lib/cookies/index.d.ts.map +1 -1
  224. package/dist/lib/cookies/index.js +1 -1
  225. package/dist/lib/docs-metadata-sync.d.ts.map +1 -1
  226. package/dist/lib/docs-metadata-sync.js +41 -2
  227. package/dist/lib/durable-job.d.ts +8 -0
  228. package/dist/lib/durable-job.d.ts.map +1 -1
  229. package/dist/lib/durable-job.js +10 -0
  230. package/dist/lib/http/client.d.ts +9 -8
  231. package/dist/lib/http/client.d.ts.map +1 -1
  232. package/dist/lib/http/client.js +44 -2
  233. package/dist/lib/instructions/templates.js +4 -4
  234. package/package.json +2 -2
  235. package/src/commander.ts +13 -0
  236. package/src/commands/admission.ts +272 -29
  237. package/src/commands/agents.ts +132 -27
  238. package/src/commands/browse.ts +208 -6
  239. package/src/commands/fetch.ts +1 -0
  240. package/src/commands/ledger-v3.ts +8 -2
  241. package/src/commands/presence.ts +49 -0
  242. package/src/commands/qa-run.ts +4 -3
  243. package/src/commands/review-pack.ts +41 -5
  244. package/src/commands/workflow.ts +8 -58
  245. package/src/core/agents/coord-client.ts +0 -20
  246. package/src/core/agents/index.ts +6 -0
  247. package/src/core/agents/live-authority-v3.ts +11 -4
  248. package/src/core/agents/render/session-context.ts +1 -7
  249. package/src/core/agents/session-events.ts +18 -3
  250. package/src/core/agents/state/heartbeat-reader.ts +3 -0
  251. package/src/core/agents/state/live-coordination-view.ts +13 -6
  252. package/src/core/agents/state/parent-reference-contract.ts +14 -0
  253. package/src/core/agents/state/parent-reference.ts +179 -0
  254. package/src/core/agents/state/pidmap.ts +2 -2
  255. package/src/core/agents/state/proc-start.ts +41 -69
  256. package/src/core/agents/state/service-process.ts +217 -0
  257. package/src/core/config.ts +85 -0
  258. package/src/core/context/index.ts +207 -272
  259. package/src/core/context/observation.ts +40 -9
  260. package/src/core/diagnostics/path-identity.ts +52 -6
  261. package/src/core/events/v3/canonical.ts +46 -13
  262. package/src/core/events/v3/index.ts +3 -0
  263. package/src/core/events/v3/producers/recorder.ts +151 -13
  264. package/src/core/events/v3/reader.ts +55 -11
  265. package/src/core/events/v3/runtime-build.ts +62 -0
  266. package/src/core/events/v3/validate.ts +42 -1
  267. package/src/core/governor/index.ts +1 -2
  268. package/src/core/governor/service-read.ts +15 -114
  269. package/src/core/governor/service.ts +36 -220
  270. package/src/core/hooks/adapter/native-parent.ts +109 -0
  271. package/src/core/hooks/cli.ts +83 -4
  272. package/src/core/hooks/resolve/owner.ts +2 -25
  273. package/src/core/hooks/shell-admission.ts +634 -0
  274. package/src/core/hooks/shell-commit-tree.ts +102 -0
  275. package/src/core/inbox/contract.ts +18 -0
  276. package/src/core/inbox/peer-messages.ts +501 -15
  277. package/src/core/inbox/service.ts +108 -3
  278. package/src/core/inbox/targets.ts +94 -3
  279. package/src/core/presence/git.ts +45 -37
  280. package/src/core/presence/index.ts +16 -8
  281. package/src/core/presence/mail.ts +620 -0
  282. package/src/core/resources/sampler.ts +3 -2
  283. package/src/core/resources/service-status.ts +6 -35
  284. package/src/core/resources/service.ts +23 -133
  285. package/src/core/resources/status.ts +3 -2
  286. package/src/core/semantic/service.ts +8 -2
  287. package/src/core/servers/index.ts +3 -23
  288. package/src/core/storage/modes.ts +6 -0
  289. package/src/core/storage/segments.ts +5 -4
  290. package/src/core/supervisor/service.ts +33 -155
  291. package/src/core/supervisor/services.ts +2 -2
  292. package/src/core/supervisor/status.ts +10 -85
  293. package/src/core/workflow/engine.ts +1 -1
  294. package/src/core/workflow/index.ts +2 -13
  295. package/src/core/workflow/proof.ts +35 -83
  296. package/src/core/workflow/resume-lock.ts +179 -0
  297. package/src/core/workflow/run-state.ts +3 -207
  298. package/src/core/workflow/workspaces/leases.ts +1 -1
  299. package/src/core/workflow/workspaces/local-git.ts +120 -239
  300. package/src/core/workflow/workspaces/ownership.ts +3 -158
  301. package/src/core/workflow/workspaces/reclaim.ts +3 -9
  302. package/src/core/workflow/workspaces/recovery.ts +1 -1
  303. package/src/core/workflow/workspaces/state.ts +1 -5
  304. package/src/lib/admission-history.ts +267 -0
  305. package/src/lib/admission.ts +217 -19
  306. package/src/lib/browser/client.ts +147 -35
  307. package/src/lib/browser/content-checks.ts +14 -3
  308. package/src/lib/browser/critique.ts +113 -3
  309. package/src/lib/browser/geometry.ts +63 -14
  310. package/src/lib/browser/index.ts +5 -0
  311. package/src/lib/browser/page-review-contracts.ts +6 -1
  312. package/src/lib/browser/page-review-judge.ts +58 -13
  313. package/src/lib/browser/page-review-pack.ts +13 -2
  314. package/src/lib/browser/qa-run-contracts.ts +30 -4
  315. package/src/lib/browser/qa-run.ts +78 -17
  316. package/src/lib/browser/runts.ts +85 -37
  317. package/src/lib/browser/windows-chrome.ts +50 -0
  318. package/src/lib/browser/windows-login-sync.ts +275 -0
  319. package/src/lib/cookies/client.ts +62 -10
  320. package/src/lib/cookies/index.ts +3 -0
  321. package/src/lib/docs-metadata-sync.ts +44 -2
  322. package/src/lib/durable-job.ts +15 -0
  323. package/src/lib/http/client.ts +63 -1
  324. package/src/lib/instructions/templates.ts +4 -4
  325. package/dist/core/agents/state/process-handle.d.ts +0 -26
  326. package/dist/core/agents/state/process-handle.d.ts.map +0 -1
  327. package/dist/core/agents/state/process-handle.js +0 -121
  328. package/dist/core/workflow/recovery-audit.d.ts +0 -30
  329. package/dist/core/workflow/recovery-audit.d.ts.map +0 -1
  330. package/dist/core/workflow/recovery-audit.js +0 -116
  331. package/src/core/agents/state/process-handle.ts +0 -165
  332. package/src/core/workflow/recovery-audit.ts +0 -181
@@ -8,4 +8,18 @@ export { liveEventV3BuildId, livePlatformV3 } from "./runtime-identity.js";
8
8
  */
9
9
  export declare function currentHarneryRuntimeBuild(): string;
10
10
  export declare function harneryPackageRoot(): string;
11
+ export interface HarneryBuild {
12
+ version: string;
13
+ revision: string;
14
+ }
15
+ /** The installed package version and runtime revision; "unknown" when unreadable. */
16
+ export declare function installedHarneryBuild(): HarneryBuild;
17
+ export interface ServiceBuildStatus {
18
+ running_build: HarneryBuild | null;
19
+ installed_build: HarneryBuild;
20
+ restart_needed: boolean;
21
+ build_status: string;
22
+ }
23
+ /** A missing or unknown running build, or any difference, means restart. */
24
+ export declare function serviceBuildStatus(recorded: unknown): ServiceBuildStatus;
11
25
  //# sourceMappingURL=runtime-build.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-build.d.ts","sourceRoot":"","sources":["../../../../src/core/events/v3/runtime-build.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE3E;;;;;;GAMG;AACH,wBAAgB,0BAA0B,IAAI,MAAM,CAuBnD;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C"}
1
+ {"version":3,"file":"runtime-build.d.ts","sourceRoot":"","sources":["../../../../src/core/events/v3/runtime-build.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE3E;;;;;;GAMG;AACH,wBAAgB,0BAA0B,IAAI,MAAM,CAuBnD;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,qFAAqF;AACrF,wBAAgB,qBAAqB,IAAI,YAAY,CAkBpD;AAED,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,YAAY,GAAG,IAAI,CAAC;IACnC,eAAe,EAAE,YAAY,CAAC;IAC9B,cAAc,EAAE,OAAO,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,4EAA4E;AAC5E,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,OAAO,GAAG,kBAAkB,CA0BxE"}
@@ -38,3 +38,47 @@ export function currentHarneryRuntimeBuild() {
38
38
  export function harneryPackageRoot() {
39
39
  return resolve(dirname(fileURLToPath(import.meta.url)), "../../../..");
40
40
  }
41
+ /** The installed package version and runtime revision; "unknown" when unreadable. */
42
+ export function installedHarneryBuild() {
43
+ let version = "unknown";
44
+ let revision = "unknown";
45
+ try {
46
+ const manifest = JSON.parse(readFileSync(resolve(harneryPackageRoot(), "package.json"), "utf8"));
47
+ if (typeof manifest.version === "string" && manifest.version.length <= 100)
48
+ version = manifest.version;
49
+ }
50
+ catch {
51
+ // Missing package metadata cannot establish that a running build is current.
52
+ }
53
+ try {
54
+ revision = currentHarneryRuntimeBuild();
55
+ }
56
+ catch {
57
+ // Status still reports the unavailable build instead of guessing a match.
58
+ }
59
+ return { version, revision };
60
+ }
61
+ /** A missing or unknown running build, or any difference, means restart. */
62
+ export function serviceBuildStatus(recorded) {
63
+ const installed_build = installedHarneryBuild();
64
+ const candidate = recorded;
65
+ const known = (value) => typeof value === "string" && value.length > 0 && value.length <= 100 && value !== "unknown";
66
+ const running_build = candidate && known(candidate.version) && known(candidate.revision)
67
+ ? { version: candidate.version, revision: candidate.revision }
68
+ : null;
69
+ const restart_needed = running_build === null ||
70
+ installed_build.version === "unknown" ||
71
+ installed_build.revision === "unknown" ||
72
+ running_build.version !== installed_build.version ||
73
+ running_build.revision !== installed_build.revision;
74
+ return {
75
+ running_build,
76
+ installed_build,
77
+ restart_needed,
78
+ build_status: running_build === null
79
+ ? "running build unknown; restart needed"
80
+ : restart_needed
81
+ ? "restart needed"
82
+ : "current",
83
+ };
84
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../../src/core/events/v3/validate.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,OAAO,EAAiB,MAAM,eAAe,CAAC;AAE5D,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAuCD,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,uBAAuB,CAkBvE;AAkSD,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAKtE"}
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../../src/core/events/v3/validate.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,OAAO,EAAiB,MAAM,eAAe,CAAC;AAE5D,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAgFD,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,uBAAuB,CAkBvE;AAkSD,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAKtE"}
@@ -1,8 +1,43 @@
1
1
  import { Value } from "@sinclair/typebox/value";
2
2
  import { canonicalJsonV3 } from "./canonical.js";
3
3
  import { EventV3Schema } from "./contract.js";
4
+ /**
5
+ * Every union member requires its own literal `event_type`, so only the member
6
+ * named by a value's `event_type` can accept it. Checking that one member gives
7
+ * the union's verdict without trying the other variants, which more than halves
8
+ * a full-ledger read. Returns null, falling back to the whole union, if a member
9
+ * ever stops carrying a required unique literal.
10
+ */
11
+ let eventVariantsByType;
12
+ function eventVariantsByTypeV3() {
13
+ if (eventVariantsByType !== undefined)
14
+ return eventVariantsByType;
15
+ const variants = new Map();
16
+ for (const variant of EventV3Schema.anyOf) {
17
+ const literal = variant.properties.event_type?.const;
18
+ if (typeof literal !== "string" ||
19
+ !variant.required?.includes("event_type") ||
20
+ variants.has(literal)) {
21
+ eventVariantsByType = null;
22
+ return null;
23
+ }
24
+ variants.set(literal, variant);
25
+ }
26
+ eventVariantsByType = variants;
27
+ return variants;
28
+ }
29
+ function checkEventSchemaV3(value) {
30
+ const variants = eventVariantsByTypeV3();
31
+ if (!variants)
32
+ return Value.Check(EventV3Schema, value);
33
+ const eventType = typeof value === "object" && value !== null
34
+ ? value.event_type
35
+ : undefined;
36
+ const variant = typeof eventType === "string" ? variants.get(eventType) : undefined;
37
+ return variant !== undefined && Value.Check(variant, value);
38
+ }
4
39
  export function validateEventV3(value) {
5
- if (!Value.Check(EventV3Schema, value)) {
40
+ if (!checkEventSchemaV3(value)) {
6
41
  return {
7
42
  ok: false,
8
43
  issues: [...Value.Errors(EventV3Schema, value)]
@@ -2,6 +2,7 @@ export { approveGovernorPlan, findCompletedMissionGoverning, rejectGovernorPlan,
2
2
  export { readGovernorPlan, readGovernorPlanReviewReceipt, readGovernorPlans, } from "./plan-read.js";
3
3
  export { type CreateGovernorPlanTemplateInput, type CreateGovernorReplanningInput, GOVERNOR_PLAN_SCHEMA_VERSION, type GovernorPlanEvent, type GovernorPlanEventType, type GovernorPlanHistory, type GovernorPlanMilestone, type GovernorPlanOutcome, type GovernorPlanProposal, type GovernorPlanRecord, type GovernorPlanRequest, type GovernorPlanReviewFinding, type GovernorPlanReviewReceipt, type GovernorPlanReviewReviewer, type GovernorPlanReviewRound, type GovernorPlanReviewStatus, type GovernorPlanReviewSummary, type GovernorPlanReviewVerdict, type GovernorPlanStatus, type GovernorPlanTemplate, type GovernorPlanWorkSpec, type GovernorReplanningPolicy, MAX_GOVERNOR_PLAN_REVIEWERS, MAX_GOVERNOR_PLAN_REVISION_ROUNDS, } from "./plan-types.js";
4
4
  export { type GovernorDispatchOutcome, type GovernorRunReport, type GovernorStopReason, type RunGovernorInput, runGovernor, } from "./runner.js";
5
- export { type ConfigureGovernorServiceInput, configureGovernorService, GOVERNOR_SERVICE_CONFIG_SCHEMA_VERSION, GOVERNOR_SERVICE_RUNTIME_SCHEMA_VERSION, GOVERNOR_SERVICE_STATUS_SCHEMA_VERSION, type GovernorServiceConfig, type GovernorServiceEngineConfig, type GovernorServiceGoalRuntime, type GovernorServiceGoalState, type GovernorServiceProcessState, type GovernorServiceRuntime, type GovernorServiceStatus, type GovernorServiceStatusRecord, type GovernorServiceSweepOutcome, type GovernorServiceSweepReport, governorServiceLogPath, type RunGovernorServiceDaemonInput, type RunGovernorServiceSweepInput, readGovernorServiceConfig, readGovernorServiceRuntime, readGovernorServiceStatus, requestGovernorServiceStop, runGovernorServiceDaemon, runGovernorServiceSweep, spawnGovernorService, } from "./service.js";
5
+ export { type ConfigureGovernorServiceInput, configureGovernorService, GOVERNOR_SERVICE_CONFIG_SCHEMA_VERSION, GOVERNOR_SERVICE_RUNTIME_SCHEMA_VERSION, GOVERNOR_SERVICE_STATUS_SCHEMA_VERSION, type GovernorServiceConfig, type GovernorServiceEngineConfig, type GovernorServiceGoalRuntime, type GovernorServiceGoalState, type GovernorServiceProcessState, type GovernorServiceRuntime, type GovernorServiceStatus, type GovernorServiceStatusRecord, type GovernorServiceSweepOutcome, type GovernorServiceSweepReport, governorServiceLogPath, type RunGovernorServiceDaemonInput, type RunGovernorServiceSweepInput, readGovernorServiceConfig, requestGovernorServiceStop, runGovernorServiceDaemon, runGovernorServiceSweep, spawnGovernorService, } from "./service.js";
6
+ export { readGovernorServiceRuntime, readGovernorServiceStatus } from "./service-read.js";
6
7
  export { assertGovernorId, type CreateGovernorInput, type CreateGovernorMissionInput, collectGovernorWork, createGovernor, GOVERNOR_INTENT_SCHEMA_VERSION, type GovernorAutomationPolicy, type GovernorIntent, type GovernorLimits, type GovernorListResult, type GovernorListWarning, type GovernorMission, type GovernorNextAction, type GovernorProjection, type GovernorRecord, type GovernorState, listGovernors, listGovernorsWithWarnings, newGovernorId, readGovernor, } from "./state.js";
7
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/governor/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,6BAA6B,EAC7B,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,gBAAgB,EAChB,6BAA6B,EAC7B,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,KAAK,+BAA+B,EACpC,KAAK,6BAA6B,EAClC,4BAA4B,EAC5B,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,yBAAyB,EAC9B,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAC9B,KAAK,yBAAyB,EAC9B,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,wBAAwB,EAC7B,2BAA2B,EAC3B,iCAAiC,GAClC,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,WAAW,GACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,KAAK,6BAA6B,EAClC,wBAAwB,EACxB,sCAAsC,EACtC,uCAAuC,EACvC,sCAAsC,EACtC,KAAK,qBAAqB,EAC1B,KAAK,2BAA2B,EAChC,KAAK,0BAA0B,EAC/B,KAAK,wBAAwB,EAC7B,KAAK,2BAA2B,EAChC,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,2BAA2B,EAChC,KAAK,2BAA2B,EAChC,KAAK,0BAA0B,EAC/B,sBAAsB,EACtB,KAAK,6BAA6B,EAClC,KAAK,4BAA4B,EACjC,yBAAyB,EACzB,0BAA0B,EAC1B,yBAAyB,EACzB,0BAA0B,EAC1B,wBAAwB,EACxB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,gBAAgB,EAChB,KAAK,mBAAmB,EACxB,KAAK,0BAA0B,EAC/B,mBAAmB,EACnB,cAAc,EACd,8BAA8B,EAC9B,KAAK,wBAAwB,EAC7B,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,aAAa,EACb,yBAAyB,EACzB,aAAa,EACb,YAAY,GACb,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/governor/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,6BAA6B,EAC7B,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,gBAAgB,EAChB,6BAA6B,EAC7B,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,KAAK,+BAA+B,EACpC,KAAK,6BAA6B,EAClC,4BAA4B,EAC5B,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,yBAAyB,EAC9B,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAC9B,KAAK,yBAAyB,EAC9B,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,wBAAwB,EAC7B,2BAA2B,EAC3B,iCAAiC,GAClC,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,WAAW,GACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,KAAK,6BAA6B,EAClC,wBAAwB,EACxB,sCAAsC,EACtC,uCAAuC,EACvC,sCAAsC,EACtC,KAAK,qBAAqB,EAC1B,KAAK,2BAA2B,EAChC,KAAK,0BAA0B,EAC/B,KAAK,wBAAwB,EAC7B,KAAK,2BAA2B,EAChC,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,2BAA2B,EAChC,KAAK,2BAA2B,EAChC,KAAK,0BAA0B,EAC/B,sBAAsB,EACtB,KAAK,6BAA6B,EAClC,KAAK,4BAA4B,EACjC,yBAAyB,EACzB,0BAA0B,EAC1B,wBAAwB,EACxB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,0BAA0B,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAC1F,OAAO,EACL,gBAAgB,EAChB,KAAK,mBAAmB,EACxB,KAAK,0BAA0B,EAC/B,mBAAmB,EACnB,cAAc,EACd,8BAA8B,EAC9B,KAAK,wBAAwB,EAC7B,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,aAAa,EACb,yBAAyB,EACzB,aAAa,EACb,YAAY,GACb,MAAM,YAAY,CAAC"}
@@ -2,5 +2,6 @@ export { approveGovernorPlan, findCompletedMissionGoverning, rejectGovernorPlan,
2
2
  export { readGovernorPlan, readGovernorPlanReviewReceipt, readGovernorPlans, } from "./plan-read.js";
3
3
  export { GOVERNOR_PLAN_SCHEMA_VERSION, MAX_GOVERNOR_PLAN_REVIEWERS, MAX_GOVERNOR_PLAN_REVISION_ROUNDS, } from "./plan-types.js";
4
4
  export { runGovernor, } from "./runner.js";
5
- export { configureGovernorService, GOVERNOR_SERVICE_CONFIG_SCHEMA_VERSION, GOVERNOR_SERVICE_RUNTIME_SCHEMA_VERSION, GOVERNOR_SERVICE_STATUS_SCHEMA_VERSION, governorServiceLogPath, readGovernorServiceConfig, readGovernorServiceRuntime, readGovernorServiceStatus, requestGovernorServiceStop, runGovernorServiceDaemon, runGovernorServiceSweep, spawnGovernorService, } from "./service.js";
5
+ export { configureGovernorService, GOVERNOR_SERVICE_CONFIG_SCHEMA_VERSION, GOVERNOR_SERVICE_RUNTIME_SCHEMA_VERSION, GOVERNOR_SERVICE_STATUS_SCHEMA_VERSION, governorServiceLogPath, readGovernorServiceConfig, requestGovernorServiceStop, runGovernorServiceDaemon, runGovernorServiceSweep, spawnGovernorService, } from "./service.js";
6
+ export { readGovernorServiceRuntime, readGovernorServiceStatus } from "./service-read.js";
6
7
  export { assertGovernorId, collectGovernorWork, createGovernor, GOVERNOR_INTENT_SCHEMA_VERSION, listGovernors, listGovernorsWithWarnings, newGovernorId, readGovernor, } from "./state.js";
@@ -1,15 +1,8 @@
1
- import { type ProcessGenerationVerdict } from "../agents/state/proc-start.js";
2
- import type { GovernorServiceBuild, GovernorServiceConfig, GovernorServiceProcessDependencies, GovernorServiceRuntime, GovernorServiceStatus, GovernorServiceStatusRecord } from "./service.js";
3
- export declare function currentGovernorServiceBuild(): GovernorServiceBuild;
4
- export declare function governorServiceBuildStatus(record: GovernorServiceStatusRecord | undefined): Pick<GovernorServiceStatus, "running_build" | "installed_build" | "restart_needed" | "build_status">;
5
- /** An unknown token or process probe cannot establish a running or stopped owner. */
6
- export declare function observeGovernorServiceProcess(record: Pick<GovernorServiceStatusRecord, "pid" | "host" | "state" | "start_token"> | undefined, dependencies?: GovernorServiceProcessDependencies): {
7
- generation: ProcessGenerationVerdict;
8
- liveness: GovernorServiceStatus["liveness"];
9
- };
1
+ import { type ServiceProcessDependencies } from "../agents/state/service-process.js";
2
+ import type { GovernorServiceConfig, GovernorServiceRuntime, GovernorServiceStatus } from "./service.js";
10
3
  export declare function readGovernorServiceConfig(coordRootRaw: string): GovernorServiceConfig;
11
4
  export declare function readGovernorServiceRuntime(coordRootRaw: string): GovernorServiceRuntime | undefined;
12
- export declare function readGovernorServiceStatus(coordRootRaw: string, dependencies?: GovernorServiceProcessDependencies): GovernorServiceStatus;
5
+ export declare function readGovernorServiceStatus(coordRootRaw: string, dependencies?: ServiceProcessDependencies): GovernorServiceStatus;
13
6
  export declare function governorServiceLogPath(coordRoot: string): string;
14
7
  export interface GovernorServiceLogReadOptions {
15
8
  max_bytes?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"service-read.d.ts","sourceRoot":"","sources":["../../../src/core/governor/service-read.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,KAAK,wBAAwB,EAE9B,MAAM,+BAA+B,CAAC;AAMvC,OAAO,KAAK,EACV,oBAAoB,EACpB,qBAAqB,EACrB,kCAAkC,EAClC,sBAAsB,EACtB,qBAAqB,EACrB,2BAA2B,EAC5B,MAAM,cAAc,CAAC;AAMtB,wBAAgB,2BAA2B,IAAI,oBAAoB,CAqBlE;AAED,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,2BAA2B,GAAG,SAAS,GAC9C,IAAI,CACL,qBAAqB,EACrB,eAAe,GAAG,iBAAiB,GAAG,gBAAgB,GAAG,cAAc,CACxE,CAgCA;AAED,qFAAqF;AACrF,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,IAAI,CAAC,2BAA2B,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,aAAa,CAAC,GAAG,SAAS,EAC/F,YAAY,GAAE,kCAAuC,GACpD;IAAE,UAAU,EAAE,wBAAwB,CAAC;IAAC,QAAQ,EAAE,qBAAqB,CAAC,UAAU,CAAC,CAAA;CAAE,CA2BvF;AAOD,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,qBAAqB,CA0BrF;AAED,wBAAgB,0BAA0B,CACxC,YAAY,EAAE,MAAM,GACnB,sBAAsB,GAAG,SAAS,CAgBpC;AAED,wBAAgB,yBAAyB,CACvC,YAAY,EAAE,MAAM,EACpB,YAAY,GAAE,kCAAuC,GACpD,qBAAqB,CA4BvB;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAahE;AAED,MAAM,WAAW,6BAA6B;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,4BAA4B;IAC3C,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;CACpB;AAeD,wFAAwF;AACxF,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE,6BAAkC,GAC1C,4BAA4B,CA6D9B"}
1
+ {"version":3,"file":"service-read.d.ts","sourceRoot":"","sources":["../../../src/core/governor/service-read.ts"],"names":[],"mappings":"AAKA,OAAO,EAGL,KAAK,0BAA0B,EAChC,MAAM,oCAAoC,CAAC;AAM5C,OAAO,KAAK,EACV,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EAEtB,MAAM,cAAc,CAAC;AAMtB,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,qBAAqB,CA0BrF;AAED,wBAAgB,0BAA0B,CACxC,YAAY,EAAE,MAAM,GACnB,sBAAsB,GAAG,SAAS,CAgBpC;AAED,wBAAgB,yBAAyB,CACvC,YAAY,EAAE,MAAM,EACpB,YAAY,GAAE,0BAA+B,GAC5C,qBAAqB,CA8BvB;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAahE;AAED,MAAM,WAAW,6BAA6B;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,4BAA4B;IAC3C,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;CACpB;AAeD,wFAAwF;AACxF,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE,6BAAkC,GAC1C,4BAA4B,CA6D9B"}
@@ -1,101 +1,15 @@
1
1
  import { closeSync, existsSync, openSync, readFileSync, readSync, statSync } from "node:fs";
2
- import { hostname } from "node:os";
3
2
  import { join, resolve } from "node:path";
4
3
  import { gunzipSync } from "node:zlib";
5
4
  import { coordEnv } from "../../lib/env.js";
6
- import { verifyProcessGeneration, } from "../agents/state/proc-start.js";
7
- import { currentHarneryRuntimeBuild } from "../events/v3/runtime-build.js";
5
+ import { observeServiceProcess, } from "../agents/state/service-process.js";
6
+ import { serviceBuildStatus } from "../events/v3/runtime-build.js";
8
7
  import { createStorageCatalog } from "../storage/catalog.js";
9
8
  import { parseLogRecord } from "../storage/jsonl.js";
10
9
  import { familyLogDirectory, readSegmentManifest } from "../storage/segments.js";
11
10
  const MAX_FILE_BYTES = 512 * 1024;
12
11
  const MAX_LOG_RECORDS = 10_000;
13
12
  const MAX_GOALS = 100;
14
- export function currentGovernorServiceBuild() {
15
- let version = "unknown";
16
- let revision = "unknown";
17
- try {
18
- const manifest = JSON.parse(readFileSync(new URL("../../../package.json", import.meta.url), "utf8"));
19
- if (typeof manifest.version === "string" && manifest.version.length <= 100) {
20
- version = manifest.version;
21
- }
22
- }
23
- catch {
24
- // Missing package metadata cannot establish that the running build is current.
25
- }
26
- try {
27
- revision = currentHarneryRuntimeBuild();
28
- }
29
- catch {
30
- // Status still reports the unavailable build instead of guessing a match.
31
- }
32
- return { version, revision };
33
- }
34
- export function governorServiceBuildStatus(record) {
35
- const installed_build = currentGovernorServiceBuild();
36
- const candidate = record?.running_build;
37
- const running_build = candidate &&
38
- typeof candidate.version === "string" &&
39
- candidate.version.length > 0 &&
40
- candidate.version.length <= 100 &&
41
- typeof candidate.revision === "string" &&
42
- candidate.revision.length > 0 &&
43
- candidate.revision.length <= 100 &&
44
- candidate.version !== "unknown" &&
45
- candidate.revision !== "unknown"
46
- ? candidate
47
- : null;
48
- const restart_needed = running_build === null ||
49
- installed_build.version === "unknown" ||
50
- installed_build.revision === "unknown" ||
51
- running_build.version !== installed_build.version ||
52
- running_build.revision !== installed_build.revision;
53
- return {
54
- running_build,
55
- installed_build,
56
- restart_needed,
57
- build_status: running_build === null
58
- ? "running build unknown; restart needed"
59
- : restart_needed
60
- ? "restart needed"
61
- : "current",
62
- };
63
- }
64
- /** An unknown token or process probe cannot establish a running or stopped owner. */
65
- export function observeGovernorServiceProcess(record, dependencies = {}) {
66
- if (!record)
67
- return { generation: "unknown", liveness: "stopped" };
68
- const generation = record.host === hostname()
69
- ? verifyProcessGeneration(record.pid, record.start_token, dependencies.readToken)
70
- : "unknown";
71
- if (record.host !== hostname())
72
- return { generation, liveness: "unknown" };
73
- try {
74
- const present = (dependencies.probePid ?? probePid)(record.pid);
75
- if (!present)
76
- return { generation, liveness: "stopped" };
77
- }
78
- catch (error) {
79
- return {
80
- generation,
81
- liveness: error.code === "ESRCH" ? "stopped" : "unknown",
82
- };
83
- }
84
- return {
85
- generation,
86
- liveness: generation === "same"
87
- ? record.state === "stopped"
88
- ? "stopped"
89
- : "running"
90
- : generation === "different"
91
- ? "stopped"
92
- : "unknown",
93
- };
94
- }
95
- function probePid(pid) {
96
- process.kill(pid, 0);
97
- return true;
98
- }
99
13
  export function readGovernorServiceConfig(coordRootRaw) {
100
14
  const coordRoot = resolve(coordRootRaw);
101
15
  const config = readBoundedJson(join(serviceDir(coordRoot), "config.json"), "governor service configuration");
@@ -151,15 +65,17 @@ export function readGovernorServiceStatus(coordRootRaw, dependencies = {}) {
151
65
  catch {
152
66
  // Runtime is recoverable and must not make the dashboard unreadable.
153
67
  }
154
- const observation = observeGovernorServiceProcess(record, dependencies);
155
- if (!record && existsSync(join(serviceDir(coordRoot), "status.json"))) {
156
- observation.liveness = "unknown";
157
- }
68
+ const observation = record
69
+ ? observeServiceProcess(record, dependencies)
70
+ : {
71
+ generation: "unknown",
72
+ liveness: existsSync(join(serviceDir(coordRoot), "status.json")) ? "unknown" : "stopped",
73
+ };
158
74
  return {
159
- running: observation.liveness === "running" && record?.state !== "stopped",
75
+ running: observation.liveness === "running",
160
76
  stale: observation.liveness === "stopped" && record !== undefined && record.state !== "stopped",
161
77
  ...observation,
162
- ...governorServiceBuildStatus(record),
78
+ ...serviceBuildStatus(record?.running_build),
163
79
  record,
164
80
  config,
165
81
  runtime,
@@ -1,4 +1,5 @@
1
- import { type ProcessGenerationSignalDependencies, type ProcessGenerationVerdict } from "../agents/state/proc-start.js";
1
+ import { type ProcessGenerationVerdict } from "../agents/state/proc-start.js";
2
+ import { type ServiceProcessDependencies } from "../agents/state/service-process.js";
2
3
  import { type NormalizedPolicy, type PolicyIsolation } from "../policy/index.js";
3
4
  import type { RunWorkItemInput } from "../work/index.js";
4
5
  import { type GovernorRunReport, type GovernorStopReason } from "./runner.js";
@@ -55,9 +56,6 @@ export interface GovernorServiceBuild {
55
56
  version: string;
56
57
  revision: string;
57
58
  }
58
- export interface GovernorServiceProcessDependencies extends ProcessGenerationSignalDependencies {
59
- probePid?: (pid: number) => boolean;
60
- }
61
59
  export interface GovernorServiceStatusRecord {
62
60
  schema_version: typeof GOVERNOR_SERVICE_STATUS_SCHEMA_VERSION;
63
61
  pid: number;
@@ -122,10 +120,8 @@ export interface RunGovernorServiceDaemonInput {
122
120
  }
123
121
  export declare function configureGovernorService(input: ConfigureGovernorServiceInput): GovernorServiceConfig;
124
122
  export declare function readGovernorServiceConfig(coordRootRaw: string): GovernorServiceConfig;
125
- export declare function readGovernorServiceRuntime(coordRootRaw: string): GovernorServiceRuntime | undefined;
126
- export declare function readGovernorServiceStatus(coordRootRaw: string, dependencies?: GovernorServiceProcessDependencies): GovernorServiceStatus;
127
123
  export declare function spawnGovernorService(coordRootRaw: string): Promise<GovernorServiceStatus>;
128
- export declare function requestGovernorServiceStop(coordRootRaw: string, dependencies?: GovernorServiceProcessDependencies): GovernorServiceStatus;
124
+ export declare function requestGovernorServiceStop(coordRootRaw: string, dependencies?: ServiceProcessDependencies): GovernorServiceStatus;
129
125
  export declare function runGovernorServiceSweep(input: RunGovernorServiceSweepInput): Promise<GovernorServiceSweepReport>;
130
126
  export declare function runGovernorServiceDaemon(input: RunGovernorServiceDaemonInput): Promise<GovernorServiceStatusRecord>;
131
127
  export declare function governorServiceLogPath(coordRoot: string): string;
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/core/governor/service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/core/governor/service.ts"],"names":[],"mappings":"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"}
@@ -1,17 +1,19 @@
1
1
  import { spawn } from "node:child_process";
2
2
  import { randomBytes, randomUUID } from "node:crypto";
3
- import { chmodSync, closeSync, existsSync, mkdirSync, openSync, readFileSync, renameSync, rmSync, statSync, unlinkSync, writeFileSync, } from "node:fs";
3
+ import { chmodSync, closeSync, existsSync, mkdirSync, openSync, readFileSync, renameSync, rmSync, statSync, writeFileSync, } from "node:fs";
4
4
  import { hostname } from "node:os";
5
5
  import { dirname, join, resolve } from "node:path";
6
6
  import { coordEnv } from "../../lib/env.js";
7
- import { processStartToken, signalIfSameGeneration, } from "../agents/state/proc-start.js";
7
+ import { processStartToken } from "../agents/state/proc-start.js";
8
+ import { acquireServiceLease, requestServiceStop, serviceStartRefusal, } from "../agents/state/service-process.js";
8
9
  import { resolveBinName } from "../config.js";
10
+ import { installedHarneryBuild } from "../events/v3/runtime-build.js";
9
11
  import { normalizePolicy } from "../policy/index.js";
10
12
  import { closeProcessLoggers, legacyLogFields, processLogger } from "../storage/logger.js";
11
13
  import { stateDirMode, stateFileMode } from "../storage/modes.js";
12
14
  import { RotatingTextSink } from "../storage/process-log.js";
13
15
  import { runGovernor } from "./runner.js";
14
- import { currentGovernorServiceBuild, governorServiceBuildStatus, observeGovernorServiceProcess, } from "./service-read.js";
16
+ import { readGovernorServiceRuntime, readGovernorServiceStatus } from "./service-read.js";
15
17
  import { readGovernor } from "./state.js";
16
18
  export const GOVERNOR_SERVICE_CONFIG_SCHEMA_VERSION = 1;
17
19
  export const GOVERNOR_SERVICE_RUNTIME_SCHEMA_VERSION = 1;
@@ -21,15 +23,9 @@ const MAX_GOALS = 100;
21
23
  const MAX_ERROR = 2_000;
22
24
  export function configureGovernorService(input) {
23
25
  const coordRoot = resolve(input.coordRoot);
24
- const active = readStatusRecord(coordRoot);
25
- if (!active && existsSync(serviceStatusPath(coordRoot))) {
26
- throw serviceStartRefusal(coordRoot, undefined, "unknown");
27
- }
28
- if (active) {
29
- const liveness = statusOwnerIsLive(active);
30
- if (liveness !== "stopped")
31
- throw serviceStartRefusal(coordRoot, active.pid, liveness);
32
- }
26
+ const current = readGovernorServiceStatus(coordRoot);
27
+ if (current.liveness !== "stopped")
28
+ throw startRefusal(coordRoot, current.record?.pid, current.liveness);
33
29
  const goalIds = unique(input.goalIds.map((value) => value.trim()).filter(Boolean));
34
30
  if (goalIds.length < 1 || goalIds.length > MAX_GOALS) {
35
31
  throw new Error(`governor service requires from 1 to ${MAX_GOALS} unique goal ids`);
@@ -65,57 +61,12 @@ export function readGovernorServiceConfig(coordRootRaw) {
65
61
  validateConfig(coordRoot, config);
66
62
  return config;
67
63
  }
68
- export function readGovernorServiceRuntime(coordRootRaw) {
69
- const coordRoot = resolve(coordRootRaw);
70
- if (!existsSync(serviceRuntimePath(coordRoot)))
71
- return undefined;
72
- const runtime = readBoundedJson(serviceRuntimePath(coordRoot), "governor service runtime");
73
- if (runtime.schema_version !== GOVERNOR_SERVICE_RUNTIME_SCHEMA_VERSION ||
74
- !validTimestamp(runtime.config_created_at) ||
75
- !validTimestamp(runtime.updated_at) ||
76
- !runtime.goals ||
77
- typeof runtime.goals !== "object" ||
78
- Array.isArray(runtime.goals)) {
79
- throw new Error("governor service runtime has an unsupported schema");
80
- }
81
- return runtime;
82
- }
83
- export function readGovernorServiceStatus(coordRootRaw, dependencies = {}) {
84
- const coordRoot = resolve(coordRootRaw);
85
- const record = readStatusRecord(coordRoot);
86
- let config;
87
- let runtime;
88
- try {
89
- config = readGovernorServiceConfig(coordRoot);
90
- }
91
- catch {
92
- // A service has no usable configuration until explicitly configured.
93
- }
94
- try {
95
- runtime = readGovernorServiceRuntime(coordRoot);
96
- }
97
- catch {
98
- // Status remains readable when recoverable runtime state is corrupt.
99
- }
100
- const observation = observeGovernorServiceProcess(record, dependencies);
101
- if (!record && existsSync(serviceStatusPath(coordRoot)))
102
- observation.liveness = "unknown";
103
- return {
104
- running: observation.liveness === "running" && record?.state !== "stopped",
105
- stale: observation.liveness === "stopped" && record !== undefined && record.state !== "stopped",
106
- ...observation,
107
- ...governorServiceBuildStatus(record),
108
- record,
109
- config,
110
- runtime,
111
- };
112
- }
113
64
  export async function spawnGovernorService(coordRootRaw) {
114
65
  const coordRoot = resolve(coordRootRaw);
115
66
  readGovernorServiceConfig(coordRoot);
116
67
  const current = readGovernorServiceStatus(coordRoot);
117
68
  if (current.liveness !== "stopped") {
118
- throw serviceStartRefusal(coordRoot, current.record?.pid, current.liveness);
69
+ throw startRefusal(coordRoot, current.record?.pid, current.liveness);
119
70
  }
120
71
  mkdirSync(serviceDir(coordRoot), { recursive: true, mode: stateDirMode() });
121
72
  const sharedLogs = coordEnv("SHARED_LOGS") !== "0";
@@ -164,18 +115,7 @@ export function requestGovernorServiceStop(coordRootRaw, dependencies = {}) {
164
115
  if ((status.record?.state === "stopped" || !status.record) && status.liveness === "stopped") {
165
116
  return { ...status, signal_sent: false, signal_verdict: status.generation };
166
117
  }
167
- writePrivateJsonAtomic(serviceStopPath(coordRoot), {
168
- requested_at: new Date().toISOString(),
169
- requested_by_pid: process.pid,
170
- });
171
- const signal = status.record?.host === hostname() && status.record.state !== "stopped"
172
- ? signalIfSameGeneration(status.record.pid, status.record.start_token, "SIGTERM", dependencies)
173
- : { sent: false, verdict: status.generation };
174
- return {
175
- ...readGovernorServiceStatus(coordRoot, dependencies),
176
- signal_sent: signal.sent,
177
- signal_verdict: signal.verdict,
178
- };
118
+ return requestServiceStop(status, () => readGovernorServiceStatus(coordRoot, dependencies), serviceStopPath(coordRoot), dependencies);
179
119
  }
180
120
  export async function runGovernorServiceSweep(input) {
181
121
  const coordRoot = resolve(input.coordRoot);
@@ -313,23 +253,17 @@ export async function runGovernorServiceSweep(input) {
313
253
  export async function runGovernorServiceDaemon(input) {
314
254
  const coordRoot = resolve(input.coordRoot);
315
255
  const config = readGovernorServiceConfig(coordRoot);
316
- const existing = readStatusRecord(coordRoot);
317
- if (!existing && existsSync(serviceStatusPath(coordRoot))) {
318
- throw serviceStartRefusal(coordRoot, undefined, "unknown");
319
- }
320
- if (existing) {
321
- const liveness = statusOwnerIsLive(existing);
322
- if (liveness !== "stopped")
323
- throw serviceStartRefusal(coordRoot, existing.pid, liveness);
324
- }
325
- const release = acquireServiceLease(coordRoot);
256
+ const current = readGovernorServiceStatus(coordRoot);
257
+ if (current.liveness !== "stopped")
258
+ throw startRefusal(coordRoot, current.record?.pid, current.liveness);
259
+ const { release } = acquireServiceLease(serviceLeasePath(coordRoot), (pid, liveness) => startRefusal(coordRoot, pid, liveness), { running_build: installedHarneryBuild() });
326
260
  rmSync(serviceStopPath(coordRoot), { force: true });
327
261
  const now = new Date().toISOString();
328
262
  const status = {
329
263
  schema_version: GOVERNOR_SERVICE_STATUS_SCHEMA_VERSION,
330
264
  pid: process.pid,
331
265
  start_token: processStartToken(process.pid) ?? undefined,
332
- running_build: currentGovernorServiceBuild(),
266
+ running_build: installedHarneryBuild(),
333
267
  host: hostname(),
334
268
  nonce: randomUUID(),
335
269
  state: "starting",
@@ -537,107 +471,8 @@ function normalizeIsolation(value) {
537
471
  }
538
472
  throw new Error("service isolation must be shared, worktree, sandbox, or remote");
539
473
  }
540
- function acquireServiceLease(coordRoot) {
541
- const path = serviceLeasePath(coordRoot);
542
- mkdirSync(dirname(path), { recursive: true, mode: stateDirMode() });
543
- const owner = {
544
- pid: process.pid,
545
- start_token: processStartToken(process.pid) ?? undefined,
546
- running_build: currentGovernorServiceBuild(),
547
- host: hostname(),
548
- nonce: randomUUID(),
549
- created_at: new Date().toISOString(),
550
- };
551
- const acquire = () => {
552
- try {
553
- const fd = openSync(path, "wx", stateFileMode());
554
- try {
555
- writeFileSync(fd, `${JSON.stringify(owner)}\n`, "utf8");
556
- }
557
- finally {
558
- closeSync(fd);
559
- }
560
- return true;
561
- }
562
- catch (error) {
563
- if (error.code !== "EEXIST")
564
- throw error;
565
- return false;
566
- }
567
- };
568
- if (!acquire()) {
569
- const existing = readLease(path);
570
- const liveness = existing ? leaseOwnerIsLive(existing) : "unknown";
571
- if (liveness !== "stopped") {
572
- throw serviceStartRefusal(coordRoot, existing?.pid, liveness);
573
- }
574
- unlinkSync(path);
575
- if (!acquire())
576
- throw new Error("governor service lease raced with another process");
577
- }
578
- return () => {
579
- try {
580
- const existing = readLease(path);
581
- if (existing?.nonce === owner.nonce)
582
- unlinkSync(path);
583
- }
584
- catch {
585
- // A stale lease is recoverable by the next explicit service start.
586
- }
587
- };
588
- }
589
- function readLease(path) {
590
- try {
591
- const value = JSON.parse(readFileSync(path, "utf8"));
592
- return Number.isSafeInteger(value.pid) &&
593
- (value.pid ?? 0) > 0 &&
594
- typeof value.host === "string" &&
595
- typeof value.nonce === "string" &&
596
- typeof value.created_at === "string"
597
- ? {
598
- ...value,
599
- start_token: typeof value.start_token === "string" ? value.start_token : undefined,
600
- }
601
- : null;
602
- }
603
- catch {
604
- return null;
605
- }
606
- }
607
- function leaseOwnerIsLive(lease) {
608
- return observeGovernorServiceProcess({ ...lease, state: "running" }).liveness;
609
- }
610
- function readStatusRecord(coordRoot) {
611
- if (!existsSync(serviceStatusPath(coordRoot)))
612
- return undefined;
613
- try {
614
- const value = readBoundedJson(serviceStatusPath(coordRoot), "governor service status");
615
- if (value.schema_version !== GOVERNOR_SERVICE_STATUS_SCHEMA_VERSION ||
616
- !Number.isSafeInteger(value.pid) ||
617
- value.pid < 1 ||
618
- typeof value.host !== "string" ||
619
- typeof value.nonce !== "string" ||
620
- !validTimestamp(value.started_at) ||
621
- !validTimestamp(value.heartbeat_at)) {
622
- return undefined;
623
- }
624
- return {
625
- ...value,
626
- start_token: typeof value.start_token === "string" ? value.start_token : undefined,
627
- };
628
- }
629
- catch {
630
- return undefined;
631
- }
632
- }
633
- function statusOwnerIsLive(record) {
634
- return observeGovernorServiceProcess(record).liveness;
635
- }
636
- function serviceStartRefusal(coordRoot, pid, liveness) {
637
- const reason = liveness === "unknown"
638
- ? `governor service process generation is unknown${pid ? ` for pid ${pid}` : ""}`
639
- : `governor service process is still running under pid ${pid}`;
640
- return new Error(`${reason}; run \`${resolveBinName(coordRoot)} governor service stop\` to write a durable stop request before starting or reconfiguring it`);
474
+ function startRefusal(coordRoot, pid, liveness) {
475
+ return serviceStartRefusal("governor service", `${resolveBinName(coordRoot)} governor service stop`, pid, liveness);
641
476
  }
642
477
  export function appendGovernorServiceDiagnostic(coordRoot, data) {
643
478
  if (coordEnv("SHARED_LOGS") !== "0") {