pi-harness-runtime 0.9.25 → 0.10.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 (321) hide show
  1. package/CHANGELOG.md +27 -7
  2. package/README.md +51 -51
  3. package/harness/auto-compact.ts +1 -1
  4. package/harness/autonomous-review.ts +88 -0
  5. package/harness/context-compact-orchestrator.ts +23 -23
  6. package/harness/context-window-manager.ts +5 -5
  7. package/harness/continue-prompt.ts +3 -3
  8. package/harness/e2e/minimax-quota-scraper.ts +1 -1
  9. package/harness/forked-summarizer.ts +4 -4
  10. package/harness/herdr-agents.ts +91 -0
  11. package/harness/index.ts +5 -5
  12. package/harness/loop-code-agent.ts +284 -0
  13. package/harness/loop-controller.ts +201 -0
  14. package/harness/loop-review-agent.ts +295 -0
  15. package/harness/loop-runtime.ts +10 -10
  16. package/harness/loop-types.ts +118 -0
  17. package/harness/notification-events.ts +3 -3
  18. package/harness/output-limit-handler.ts +1 -1
  19. package/harness/partial-recovery.ts +3 -3
  20. package/harness/session-memory.ts +5 -5
  21. package/index.ts +46 -32
  22. package/package.json +1 -1
  23. package/packages/a2a-adapter/package.json +1 -1
  24. package/packages/a2a-adapter/src/types.ts +5 -5
  25. package/packages/auth/package.json +1 -1
  26. package/packages/autonomous-refactor/package.json +1 -1
  27. package/packages/autonomous-runtime/dist/inbox.d.ts +3 -3
  28. package/packages/autonomous-runtime/dist/inbox.js +12 -12
  29. package/packages/autonomous-runtime/dist/lease.js +14 -14
  30. package/packages/autonomous-runtime/dist/types.js +1 -1
  31. package/packages/autonomous-runtime/package.json +1 -1
  32. package/packages/autonomous-runtime/src/inbox.ts +12 -12
  33. package/packages/autonomous-runtime/src/lease.ts +15 -15
  34. package/packages/autonomous-runtime/src/types.ts +13 -13
  35. package/packages/autonomous-runtime/tsconfig.tsbuildinfo +1 -1
  36. package/packages/cache-strategy/package.json +1 -1
  37. package/packages/capability-registry/dist/types.js +1 -1
  38. package/packages/capability-registry/package.json +1 -1
  39. package/packages/capability-registry/src/types.ts +5 -5
  40. package/packages/checkpoint/README.md +6 -6
  41. package/packages/checkpoint/dist/differ.js +2 -2
  42. package/packages/checkpoint/dist/engine.js +3 -3
  43. package/packages/checkpoint/dist/index.js +5 -5
  44. package/packages/checkpoint/dist/storage.js +3 -3
  45. package/packages/checkpoint/dist/types.js +1 -1
  46. package/packages/checkpoint/package.json +1 -1
  47. package/packages/checkpoint/src/differ.ts +2 -2
  48. package/packages/checkpoint/src/engine.ts +3 -3
  49. package/packages/checkpoint/src/index.ts +5 -5
  50. package/packages/checkpoint/src/storage.ts +3 -3
  51. package/packages/checkpoint/src/types.ts +10 -10
  52. package/packages/checkpoint/tsconfig.tsbuildinfo +1 -1
  53. package/packages/cli-plugin-sdk/package.json +1 -1
  54. package/packages/clipboard/dist/src/clipboard.d.ts.map +1 -1
  55. package/packages/clipboard/dist/src/clipboard.js +15 -7
  56. package/packages/clipboard/dist/src/clipboard.js.map +1 -1
  57. package/packages/clipboard/package.json +1 -1
  58. package/packages/clipboard/src/clipboard.ts +16 -9
  59. package/packages/code-generation/README.md +13 -13
  60. package/packages/code-generation/dist/faker.js +4 -4
  61. package/packages/code-generation/dist/generator.js +3 -3
  62. package/packages/code-generation/dist/index.js +3 -3
  63. package/packages/code-generation/dist/templates/registry.js +1 -1
  64. package/packages/code-generation/dist/types.js +1 -1
  65. package/packages/code-generation/package.json +1 -1
  66. package/packages/code-generation/src/faker.ts +5 -5
  67. package/packages/code-generation/src/generator.ts +4 -4
  68. package/packages/code-generation/src/index.ts +3 -3
  69. package/packages/code-generation/src/templates/registry.ts +1 -1
  70. package/packages/code-generation/src/types.ts +10 -10
  71. package/packages/code-generation/tsconfig.tsbuildinfo +1 -1
  72. package/packages/code-review/README.md +13 -13
  73. package/packages/code-review/dist/engine.js +3 -3
  74. package/packages/code-review/dist/index.js +3 -3
  75. package/packages/code-review/dist/types.js +1 -1
  76. package/packages/code-review/package.json +1 -1
  77. package/packages/code-review/src/engine.ts +3 -3
  78. package/packages/code-review/src/index.ts +3 -3
  79. package/packages/code-review/src/types.ts +10 -10
  80. package/packages/code-review/tsconfig.tsbuildinfo +1 -1
  81. package/packages/codex-adapter/package.json +1 -1
  82. package/packages/context-compiler/dist/compiler.js +1 -1
  83. package/packages/context-compiler/package.json +1 -1
  84. package/packages/context-compiler/src/compiler.ts +1 -1
  85. package/packages/context-compiler/src/types.ts +11 -11
  86. package/packages/context-compiler/test/context-compiler.test.ts +11 -11
  87. package/packages/context-discovery/package.json +1 -1
  88. package/packages/context-manager/package.json +1 -1
  89. package/packages/cookie-sanitizer/README.md +27 -27
  90. package/packages/cookie-sanitizer/package.json +1 -1
  91. package/packages/cost-optimizer/package.json +1 -1
  92. package/packages/cost-optimizer/src/types.ts +5 -5
  93. package/packages/dependency-analyzer/package.json +1 -1
  94. package/packages/django-plugin/dist/analyzer.js +7 -7
  95. package/packages/django-plugin/package.json +1 -1
  96. package/packages/django-plugin/src/analyzer.ts +7 -7
  97. package/packages/doc-generator/package.json +1 -1
  98. package/packages/evaluation-engine/dist/engine.js +9 -9
  99. package/packages/evaluation-engine/package.json +1 -1
  100. package/packages/evaluation-engine/src/engine.ts +9 -9
  101. package/packages/evaluation-engine/src/types.ts +3 -3
  102. package/packages/evaluation-runner/package.json +1 -1
  103. package/packages/event-bus/dist/src/herdr-bus.d.ts +121 -0
  104. package/packages/event-bus/dist/src/herdr-bus.d.ts.map +1 -0
  105. package/packages/event-bus/dist/src/herdr-bus.js +322 -0
  106. package/packages/event-bus/dist/src/herdr-bus.js.map +1 -0
  107. package/packages/event-bus/dist/src/index.d.ts +2 -0
  108. package/packages/event-bus/dist/src/index.d.ts.map +1 -1
  109. package/packages/event-bus/dist/src/index.js +1 -0
  110. package/packages/event-bus/dist/src/index.js.map +1 -1
  111. package/packages/event-bus/package.json +1 -1
  112. package/packages/event-bus/src/herdr-bus.ts +525 -0
  113. package/packages/event-bus/src/index.ts +29 -0
  114. package/packages/event-store/package.json +1 -1
  115. package/packages/experience-replay/dist/replay.js +7 -7
  116. package/packages/experience-replay/package.json +1 -1
  117. package/packages/experience-replay/src/replay.ts +7 -7
  118. package/packages/experience-replay/src/types.ts +5 -5
  119. package/packages/feedback-collector/package.json +1 -1
  120. package/packages/framework-detector/README.md +18 -18
  121. package/packages/framework-detector/dist/detector.js +3 -3
  122. package/packages/framework-detector/dist/index.js +3 -3
  123. package/packages/framework-detector/dist/signatures/registry.js +24 -24
  124. package/packages/framework-detector/dist/types.js +1 -1
  125. package/packages/framework-detector/package.json +1 -1
  126. package/packages/framework-detector/src/detector.ts +3 -3
  127. package/packages/framework-detector/src/index.ts +3 -3
  128. package/packages/framework-detector/src/signatures/registry.ts +24 -24
  129. package/packages/framework-detector/src/types.ts +7 -7
  130. package/packages/framework-detector/tsconfig.tsbuildinfo +1 -1
  131. package/packages/framework-plugin-sdk/README.md +23 -23
  132. package/packages/framework-plugin-sdk/dist/index.js +2 -2
  133. package/packages/framework-plugin-sdk/dist/manager.js +3 -3
  134. package/packages/framework-plugin-sdk/dist/types.js +2 -2
  135. package/packages/framework-plugin-sdk/package.json +1 -1
  136. package/packages/framework-plugin-sdk/src/index.ts +2 -2
  137. package/packages/framework-plugin-sdk/src/manager.ts +3 -3
  138. package/packages/framework-plugin-sdk/src/types.ts +10 -10
  139. package/packages/framework-plugin-sdk/tsconfig.tsbuildinfo +1 -1
  140. package/packages/frappe-plugin/dist/analyzer.js +8 -8
  141. package/packages/frappe-plugin/dist/types.js +1 -1
  142. package/packages/frappe-plugin/package.json +1 -1
  143. package/packages/frappe-plugin/src/analyzer.ts +8 -8
  144. package/packages/frappe-plugin/src/types.ts +10 -10
  145. package/packages/generic-web-plugin/dist/analyzer.js +5 -5
  146. package/packages/generic-web-plugin/package.json +1 -1
  147. package/packages/generic-web-plugin/src/analyzer.ts +5 -5
  148. package/packages/health-monitor/package.json +1 -1
  149. package/packages/health-monitor/src/monitor.ts +1 -1
  150. package/packages/intent-analyzer/package.json +1 -1
  151. package/packages/laravel-plugin/dist/analyzer.js +11 -11
  152. package/packages/laravel-plugin/package.json +1 -1
  153. package/packages/laravel-plugin/src/analyzer.ts +11 -11
  154. package/packages/learning-engine/dist/engine.js +5 -5
  155. package/packages/learning-engine/dist/types.js +1 -1
  156. package/packages/learning-engine/package.json +1 -1
  157. package/packages/learning-engine/src/engine.ts +5 -5
  158. package/packages/learning-engine/src/types.ts +6 -6
  159. package/packages/mcp-adapter/package.json +1 -1
  160. package/packages/memory-engine/dist/engine.js +8 -8
  161. package/packages/memory-engine/dist/types.js +2 -2
  162. package/packages/memory-engine/package.json +1 -1
  163. package/packages/memory-engine/src/engine.ts +8 -8
  164. package/packages/memory-engine/src/types.ts +9 -9
  165. package/packages/model-registry/package.json +1 -1
  166. package/packages/model-registry/src/types.ts +4 -4
  167. package/packages/nextjs-plugin/dist/analyzer.js +9 -9
  168. package/packages/nextjs-plugin/package.json +1 -1
  169. package/packages/nextjs-plugin/src/analyzer.ts +9 -9
  170. package/packages/notification/dist/notification-center.js +1 -1
  171. package/packages/notification/package.json +1 -1
  172. package/packages/notification/src/notification-center.ts +1 -1
  173. package/packages/observability/dist/alerts.js +2 -2
  174. package/packages/observability/dist/health.js +4 -4
  175. package/packages/observability/dist/index.js +6 -6
  176. package/packages/observability/dist/logger.js +7 -7
  177. package/packages/observability/dist/metrics.js +11 -11
  178. package/packages/observability/dist/tracer.js +3 -3
  179. package/packages/observability/dist/types.js +1 -1
  180. package/packages/observability/package.json +1 -1
  181. package/packages/observability/src/alerts.ts +2 -2
  182. package/packages/observability/src/health.ts +4 -4
  183. package/packages/observability/src/index.ts +6 -6
  184. package/packages/observability/src/logger.ts +7 -7
  185. package/packages/observability/src/metrics.ts +11 -11
  186. package/packages/observability/src/tracer.ts +3 -3
  187. package/packages/observability/src/types.ts +7 -7
  188. package/packages/observability/test/observability.test.ts +4 -4
  189. package/packages/observability/tsconfig.tsbuildinfo +1 -1
  190. package/packages/performance-optimizer/dist/optimizer.js +1 -1
  191. package/packages/performance-optimizer/package.json +1 -1
  192. package/packages/performance-optimizer/src/optimizer.ts +1 -1
  193. package/packages/performance-optimizer/src/types.ts +4 -4
  194. package/packages/privilege-broker/package.json +1 -1
  195. package/packages/project-analyzer/dist/analyzer.js +4 -4
  196. package/packages/project-analyzer/dist/index.js +8 -8
  197. package/packages/project-analyzer/dist/signals.js +3 -3
  198. package/packages/project-analyzer/dist/types.js +1 -1
  199. package/packages/project-analyzer/package.json +1 -1
  200. package/packages/project-analyzer/src/analyzer.ts +4 -4
  201. package/packages/project-analyzer/src/index.ts +9 -9
  202. package/packages/project-analyzer/src/signals.ts +4 -4
  203. package/packages/project-analyzer/src/types.ts +15 -15
  204. package/packages/project-analyzer/test/index.test.ts +17 -17
  205. package/packages/project-analyzer/tsconfig.tsbuildinfo +1 -1
  206. package/packages/projection-engine/package.json +1 -1
  207. package/packages/prompt-compiler/dist/section-builder.js +1 -1
  208. package/packages/prompt-compiler/dist/types.js +3 -3
  209. package/packages/prompt-compiler/package.json +1 -1
  210. package/packages/prompt-compiler/src/section-builder.ts +1 -1
  211. package/packages/prompt-compiler/src/types.ts +12 -12
  212. package/packages/prompt-compiler/test/prompt-compiler.test.ts +12 -12
  213. package/packages/prompt-versioning/package.json +1 -1
  214. package/packages/provider-adapter-sdk/dist/builder.js +1 -1
  215. package/packages/provider-adapter-sdk/dist/index.js +5 -5
  216. package/packages/provider-adapter-sdk/dist/registry.js +1 -1
  217. package/packages/provider-adapter-sdk/dist/tester.js +1 -1
  218. package/packages/provider-adapter-sdk/dist/types.js +1 -1
  219. package/packages/provider-adapter-sdk/package.json +1 -1
  220. package/packages/provider-adapter-sdk/src/builder.ts +1 -1
  221. package/packages/provider-adapter-sdk/src/index.ts +6 -6
  222. package/packages/provider-adapter-sdk/src/registry.ts +1 -1
  223. package/packages/provider-adapter-sdk/src/tester.ts +1 -1
  224. package/packages/provider-adapter-sdk/src/types.ts +5 -5
  225. package/packages/provider-adapter-sdk/tsconfig.tsbuildinfo +1 -1
  226. package/packages/provider-router/package.json +1 -1
  227. package/packages/provider-router/src/types.ts +4 -4
  228. package/packages/provider-selector/package.json +1 -1
  229. package/packages/providers/dist/deepagents-adapter.js +1 -1
  230. package/packages/providers/package.json +1 -1
  231. package/packages/providers/src/deepagents-adapter.ts +1 -1
  232. package/packages/quota-manager/package.json +1 -1
  233. package/packages/rate-limiter/package.json +1 -1
  234. package/packages/react-vite-plugin/dist/analyzer.js +7 -7
  235. package/packages/react-vite-plugin/package.json +1 -1
  236. package/packages/react-vite-plugin/src/analyzer.ts +7 -7
  237. package/packages/release-manager/package.json +1 -1
  238. package/packages/requirement-compiler/dist/compiler.js +17 -17
  239. package/packages/requirement-compiler/dist/types.js +2 -2
  240. package/packages/requirement-compiler/package.json +1 -1
  241. package/packages/requirement-compiler/src/compiler.ts +17 -17
  242. package/packages/requirement-compiler/src/types.ts +21 -21
  243. package/packages/requirement-compiler/test/requirement-compiler.test.ts +17 -17
  244. package/packages/runtime/dist/command-executor.js +1 -1
  245. package/packages/runtime/dist/local-runtime-agent.js +1 -1
  246. package/packages/runtime/dist/policy-engine.js +1 -1
  247. package/packages/runtime/dist/runtime-api.js +1 -1
  248. package/packages/runtime/dist/workspace-manager.js +1 -1
  249. package/packages/runtime/package.json +1 -1
  250. package/packages/runtime/src/command-executor.ts +1 -1
  251. package/packages/runtime/src/local-runtime-agent.ts +1 -1
  252. package/packages/runtime/src/policy-engine.ts +1 -1
  253. package/packages/runtime/src/runtime-api.ts +1 -1
  254. package/packages/runtime/src/workspace-manager.ts +1 -1
  255. package/packages/scheduler/package.json +1 -1
  256. package/packages/scheduler-adapter/package.json +1 -1
  257. package/packages/session/README.md +18 -18
  258. package/packages/session/dist/history.js +3 -3
  259. package/packages/session/dist/index.js +5 -5
  260. package/packages/session/dist/manager.js +3 -3
  261. package/packages/session/dist/policy.js +2 -2
  262. package/packages/session/dist/store.js +2 -2
  263. package/packages/session/dist/types.js +1 -1
  264. package/packages/session/package.json +1 -1
  265. package/packages/session/src/history.ts +3 -3
  266. package/packages/session/src/index.ts +5 -5
  267. package/packages/session/src/manager.ts +3 -3
  268. package/packages/session/src/policy.ts +4 -4
  269. package/packages/session/src/store.ts +3 -3
  270. package/packages/session/src/types.ts +10 -10
  271. package/packages/session/tsconfig.tsbuildinfo +1 -1
  272. package/packages/session-api/package.json +1 -1
  273. package/packages/session-export/package.json +1 -1
  274. package/packages/shared-context/package.json +1 -1
  275. package/packages/skill-registry/package.json +1 -1
  276. package/packages/skill-registry/src/types.ts +4 -4
  277. package/packages/sprint-planner/package.json +1 -1
  278. package/packages/subscription-engine/package.json +1 -1
  279. package/packages/task-compiler/dist/compiler.js +7 -7
  280. package/packages/task-compiler/dist/decompose.js +11 -11
  281. package/packages/task-compiler/dist/file-scope.js +6 -6
  282. package/packages/task-compiler/dist/graph.js +6 -6
  283. package/packages/task-compiler/dist/index.js +2 -2
  284. package/packages/task-compiler/dist/types.js +5 -5
  285. package/packages/task-compiler/dist/validate.js +2 -2
  286. package/packages/task-compiler/dist/verification.js +2 -2
  287. package/packages/task-compiler/package.json +1 -1
  288. package/packages/task-compiler/src/command-policy.ts +1 -1
  289. package/packages/task-compiler/src/compiler.ts +7 -7
  290. package/packages/task-compiler/src/decompose.ts +11 -11
  291. package/packages/task-compiler/src/file-scope.ts +6 -6
  292. package/packages/task-compiler/src/graph.ts +6 -6
  293. package/packages/task-compiler/src/index.ts +3 -3
  294. package/packages/task-compiler/src/types.ts +14 -14
  295. package/packages/task-compiler/src/validate.ts +2 -2
  296. package/packages/task-compiler/src/verification.ts +2 -2
  297. package/packages/task-compiler/test/task-compiler.test.ts +10 -10
  298. package/packages/test-data-generator/README.md +13 -13
  299. package/packages/test-data-generator/dist/faker-adapter.js +4 -4
  300. package/packages/test-data-generator/dist/generator.js +3 -3
  301. package/packages/test-data-generator/dist/index.js +3 -3
  302. package/packages/test-data-generator/dist/types.js +1 -1
  303. package/packages/test-data-generator/package.json +1 -1
  304. package/packages/test-data-generator/src/faker-adapter.ts +4 -4
  305. package/packages/test-data-generator/src/generator.ts +3 -3
  306. package/packages/test-data-generator/src/index.ts +3 -3
  307. package/packages/test-data-generator/src/types.ts +9 -9
  308. package/packages/test-data-generator/tsconfig.tsbuildinfo +1 -1
  309. package/packages/test-generator/package.json +1 -1
  310. package/packages/token-estimation/package.json +1 -1
  311. package/packages/token-optimizer/package.json +1 -1
  312. package/packages/tui/package.json +1 -1
  313. package/packages/types/package.json +1 -1
  314. package/packages/types/src/agent-worker-types.ts +5 -5
  315. package/packages/types/src/runtime-types.ts +12 -12
  316. package/packages/types/tsconfig.tsbuildinfo +1 -1
  317. package/packages/workflow-events/package.json +1 -1
  318. package/packages/workspace-scanner/package.json +1 -1
  319. package/packages/worktree/package.json +1 -1
  320. package/renderer.ts +7 -7
  321. package/skills/harness-runtime/SKILL.md +15 -15
@@ -15,7 +15,7 @@ import { dirname } from "node:path";
15
15
  import type { TaskRecord, TaskStatus, TaskEvent } from "./types.js";
16
16
  import { getInboxDir, getTasksPath } from "./types.js";
17
17
 
18
- // ─── Errors ───────────────────────────────────────────────────────────────────
18
+ // --- Errors -------------------------------------------------------------------
19
19
 
20
20
  export class InboxError extends Error {
21
21
  constructor(msg: string) {
@@ -24,7 +24,7 @@ export class InboxError extends Error {
24
24
  }
25
25
  }
26
26
 
27
- // ─── TaskInbox ────────────────────────────────────────────────────────────────
27
+ // --- TaskInbox ----------------------------------------------------------------
28
28
 
29
29
  /**
30
30
  * Manages the append-only task inbox at `~/.pi/harness/inbox/tasks.jsonl`.
@@ -32,9 +32,9 @@ export class InboxError extends Error {
32
32
  * Storage layout:
33
33
  * ```
34
34
  * ~/.pi/harness/inbox/
35
- * ├── tasks.jsonl # append-only log (one JSON line per task)
36
- * ├── claimed/ # active leases (one JSON file per task)
37
- * └── BACKLOG.md # human-friendly authoring surface (optional)
35
+ * +-- tasks.jsonl # append-only log (one JSON line per task)
36
+ * +-- claimed/ # active leases (one JSON file per task)
37
+ * +-- BACKLOG.md # human-friendly authoring surface (optional)
38
38
  * ```
39
39
  *
40
40
  * Operations are:
@@ -61,7 +61,7 @@ export class TaskInbox {
61
61
  }
62
62
  }
63
63
 
64
- // ─── append ──────────────────────────────────────────────────────────────
64
+ // --- append --------------------------------------------------------------
65
65
 
66
66
  /**
67
67
  * Append a new task to tasks.jsonl.
@@ -85,7 +85,7 @@ export class TaskInbox {
85
85
  this._cache = null; // invalidate
86
86
  }
87
87
 
88
- // ─── list ─────────────────────────────────────────────────────────────────
88
+ // --- list -----------------------------------------------------------------
89
89
 
90
90
  /**
91
91
  * Read all tasks from tasks.jsonl.
@@ -131,7 +131,7 @@ export class TaskInbox {
131
131
  return filtered;
132
132
  }
133
133
 
134
- // ─── get ─────────────────────────────────────────────────────────────────
134
+ // --- get -----------------------------------------------------------------
135
135
 
136
136
  /** Retrieve a single task by id, or null if not found. */
137
137
  get(id: string): TaskRecord | null {
@@ -139,7 +139,7 @@ export class TaskInbox {
139
139
  return tasks.find((t) => t.id === id) ?? null;
140
140
  }
141
141
 
142
- // ─── transition ──────────────────────────────────────────────────────────
142
+ // --- transition ----------------------------------------------------------
143
143
 
144
144
  /**
145
145
  * Update a task's status in-place inside tasks.jsonl.
@@ -197,7 +197,7 @@ export class TaskInbox {
197
197
  return updated;
198
198
  }
199
199
 
200
- // ─── markDone / markFailed ───────────────────────────────────────────────
200
+ // --- markDone / markFailed -----------------------------------------------
201
201
 
202
202
  /** Convenience: mark a task as completed with a result. */
203
203
  complete(taskId: string, result: TaskRecord["result"]): TaskRecord {
@@ -231,7 +231,7 @@ export class TaskInbox {
231
231
  );
232
232
  }
233
233
 
234
- // ─── reindex ─────────────────────────────────────────────────────────────
234
+ // --- reindex -------------------------------------------------------------
235
235
 
236
236
  /** Rewrite tasks.jsonl from the given task list. */
237
237
  private _rewriteAll(tasks: TaskRecord[]): void {
@@ -252,7 +252,7 @@ export class TaskInbox {
252
252
  this._cache = null;
253
253
  }
254
254
 
255
- // ─── count ───────────────────────────────────────────────────────────────
255
+ // --- count ---------------------------------------------------------------
256
256
 
257
257
  /** Return counts of tasks grouped by status. */
258
258
  stats(): Record<TaskStatus, number> {
@@ -7,9 +7,9 @@
7
7
  * Filesystem layout:
8
8
  * ```
9
9
  * ~/.pi/harness/inbox/
10
- * ├── tasks.jsonl # task records
11
- * └── claimed/
12
- * └── <task-id>.lease.json # one lease file per claimed task
10
+ * +-- tasks.jsonl # task records
11
+ * +-- claimed/
12
+ * +-- <task-id>.lease.json # one lease file per claimed task
13
13
  * ```
14
14
  *
15
15
  * Safety properties:
@@ -33,7 +33,7 @@ import { join } from "node:path";
33
33
  import type { TaskLease } from "./types.js";
34
34
  import { getLeasesDir } from "./types.js";
35
35
 
36
- // ─── Errors ───────────────────────────────────────────────────────────────────
36
+ // --- Errors -------------------------------------------------------------------
37
37
 
38
38
  export class LeaseError extends Error {
39
39
  constructor(msg: string) {
@@ -42,7 +42,7 @@ export class LeaseError extends Error {
42
42
  }
43
43
  }
44
44
 
45
- // ─── Constants ────────────────────────────────────────────────────────────────
45
+ // --- Constants ----------------------------------------------------------------
46
46
 
47
47
  /** Default lease duration before heartbeat extension is required. */
48
48
  export const DEFAULT_LEASE_TTL_MS = 30_000; // 30 s
@@ -53,7 +53,7 @@ export const HEARTBEAT_INTERVAL_MS = 5_000; // 5 s
53
53
  /** Default worker heartbeat interval extension. */
54
54
  export const HEARTBEAT_EXTENSION_MS = 30_000; // extend by 30 s
55
55
 
56
- // ─── LeaseManager ─────────────────────────────────────────────────────────────
56
+ // --- LeaseManager -------------------------------------------------------------
57
57
 
58
58
  export interface LeaseOptions {
59
59
  leasesDir?: string;
@@ -80,7 +80,7 @@ export class LeaseManager {
80
80
  }
81
81
  }
82
82
 
83
- // ─── claim ───────────────────────────────────────────────────────────────
83
+ // --- claim ---------------------------------------------------------------
84
84
 
85
85
  /**
86
86
  * Atomically claim a task for a worker.
@@ -143,7 +143,7 @@ export class LeaseManager {
143
143
  }
144
144
  }
145
145
 
146
- // ─── heartbeat ────────────────────────────────────────────────────────────
146
+ // --- heartbeat ------------------------------------------------------------
147
147
 
148
148
  /**
149
149
  * Extend a lease's expiry time.
@@ -170,7 +170,7 @@ export class LeaseManager {
170
170
  return updated;
171
171
  }
172
172
 
173
- // ─── release ─────────────────────────────────────────────────────────────
173
+ // --- release -------------------------------------------------------------
174
174
 
175
175
  /**
176
176
  * Explicitly release a lease (task completed or failed without retry).
@@ -186,7 +186,7 @@ export class LeaseManager {
186
186
  this._removeLease(taskId);
187
187
  }
188
188
 
189
- // ─── get ─────────────────────────────────────────────────────────────────
189
+ // --- get -----------------------------------------------------------------
190
190
 
191
191
  /** Read a lease by taskId. Returns null if not found. */
192
192
  get(taskId: string): TaskLease | null {
@@ -199,14 +199,14 @@ export class LeaseManager {
199
199
  }
200
200
  }
201
201
 
202
- // ─── isExpired ────────────────────────────────────────────────────────────
202
+ // --- isExpired ------------------------------------------------------------
203
203
 
204
204
  /** Check if a lease has expired (expiresAt is in the past). */
205
205
  isExpired(lease: TaskLease): boolean {
206
206
  return new Date(lease.expiresAt).getTime() < Date.now();
207
207
  }
208
208
 
209
- // ─── reap ────────────────────────────────────────────────────────────────
209
+ // --- reap ----------------------------------------------------------------
210
210
 
211
211
  /**
212
212
  * Scan all leases and return the ones that have expired.
@@ -256,7 +256,7 @@ export class LeaseManager {
256
256
  return released;
257
257
  }
258
258
 
259
- // ─── recoverOrphanLeases ─────────────────────────────────────────────────
259
+ // --- recoverOrphanLeases -------------------------------------------------
260
260
 
261
261
  /**
262
262
  * On worker startup, release any leases held by dead workers.
@@ -269,7 +269,7 @@ export class LeaseManager {
269
269
  return this.reapAndRelease();
270
270
  }
271
271
 
272
- // ─── listActive ───────────────────────────────────────────────────────────
272
+ // --- listActive -----------------------------------------------------------
273
273
 
274
274
  /** Return all active (non-expired) leases. */
275
275
  listActive(): TaskLease[] {
@@ -298,7 +298,7 @@ export class LeaseManager {
298
298
  return active;
299
299
  }
300
300
 
301
- // ─── internals ───────────────────────────────────────────────────────────
301
+ // --- internals -----------------------------------------------------------
302
302
 
303
303
  private _leasePath(taskId: string): string {
304
304
  return join(this.leasesDir, `${taskId}.lease.json`);
@@ -7,7 +7,7 @@
7
7
  */
8
8
  import { env } from "node:process";
9
9
 
10
- // ─── Capability model ──────────────────────────────────────────────────────────
10
+ // --- Capability model ----------------------------------------------------------
11
11
 
12
12
  /** A named capability that the privilege broker may grant. */
13
13
  export type CapabilityName =
@@ -35,7 +35,7 @@ export type ApprovalClass =
35
35
  | "human_approval_required" // must ask operator
36
36
  | "forbidden"; // never grant, regardless of override
37
37
 
38
- // ─── Task lifecycle ───────────────────────────────────────────────────────────
38
+ // --- Task lifecycle -----------------------------------------------------------
39
39
 
40
40
  export type TaskStatus =
41
41
  | "queued"
@@ -68,7 +68,7 @@ export type TaskEvent = {
68
68
  payload?: Record<string, unknown>;
69
69
  };
70
70
 
71
- // ─── Task record ─────────────────────────────────────────────────────────────
71
+ // --- Task record -------------------------------------------------------------
72
72
 
73
73
  /** The primary durable record for a task. */
74
74
  export interface TaskRecord {
@@ -96,7 +96,7 @@ export interface TaskRecord {
96
96
  history: TaskEvent[];
97
97
  }
98
98
 
99
- // ─── Leasing ──────────────────────────────────────────────────────────────────
99
+ // --- Leasing ------------------------------------------------------------------
100
100
 
101
101
  /** A lease held by a worker on a specific task. */
102
102
  export interface TaskLease {
@@ -108,7 +108,7 @@ export interface TaskLease {
108
108
  attempt: number; // which attempt this lease covers
109
109
  }
110
110
 
111
- // ─── Worker registry ──────────────────────────────────────────────────────────
111
+ // --- Worker registry ----------------------------------------------------------
112
112
 
113
113
  /** Heartbeat emitted by a worker every 5 s to worker-registry.json. */
114
114
  export interface WorkerHeartbeat {
@@ -119,7 +119,7 @@ export interface WorkerHeartbeat {
119
119
  inflightTaskIds: string[];
120
120
  }
121
121
 
122
- // ─── Privilege broker ─────────────────────────────────────────────────────────
122
+ // --- Privilege broker ---------------------------------------------------------
123
123
 
124
124
  /** A resolved grant from the privilege broker. */
125
125
  export interface CapabilityGrant {
@@ -131,7 +131,7 @@ export interface CapabilityGrant {
131
131
  timeoutMs: number;
132
132
  }
133
133
 
134
- // ─── Approval ─────────────────────────────────────────────────────────────────
134
+ // --- Approval -----------------------------------------------------------------
135
135
 
136
136
  /** An in-flight human approval request. */
137
137
  export interface ApprovalRequest {
@@ -145,7 +145,7 @@ export interface ApprovalRequest {
145
145
  expiresAt: string; // ISO-8601 — timeout threshold
146
146
  }
147
147
 
148
- // ─── Scheduler ───────────────────────────────────────────────────────────────
148
+ // --- Scheduler ---------------------------------------------------------------
149
149
 
150
150
  /** A scheduled recurring task. */
151
151
  export interface ScheduledTask {
@@ -165,7 +165,7 @@ export type ScheduleSpec =
165
165
  | { kind: "interval"; intervalMs: number }
166
166
  | { kind: "once"; at: string };
167
167
 
168
- // ─── Notification ─────────────────────────────────────────────────────────────
168
+ // --- Notification -------------------------------------------------------------
169
169
 
170
170
  export type RuntimeNotificationEvent =
171
171
  | "task.claimed"
@@ -189,7 +189,7 @@ export interface NotificationEvent {
189
189
  payload: Record<string, unknown>;
190
190
  }
191
191
 
192
- // ─── Checkpoint ───────────────────────────────────────────────────────────────
192
+ // --- Checkpoint ---------------------------------------------------------------
193
193
 
194
194
  export interface Checkpoint {
195
195
  taskId: string;
@@ -198,7 +198,7 @@ export interface Checkpoint {
198
198
  savedAt: string; // ISO-8601
199
199
  }
200
200
 
201
- // ─── Execution context ────────────────────────────────────────────────────────
201
+ // --- Execution context --------------------------------------------------------
202
202
 
203
203
  /** The context given to the loop runtime when executing a task. */
204
204
  export interface ExecutionContext {
@@ -212,7 +212,7 @@ export interface ExecutionContext {
212
212
  okfBundles: string[]; // content hashes available to planner
213
213
  }
214
214
 
215
- // ─── Task result ─────────────────────────────────────────────────────────────
215
+ // --- Task result -------------------------------------------------------------
216
216
 
217
217
  export interface TaskResult {
218
218
  taskId: string;
@@ -227,7 +227,7 @@ export interface TaskResult {
227
227
  modelUsage?: { inputTokens: number; outputTokens: number; provider: string };
228
228
  }
229
229
 
230
- // ─── Storage paths ────────────────────────────────────────────────────────────
230
+ // --- Storage paths ------------------------------------------------------------
231
231
 
232
232
  const DEFAULT_ROOT = `${env["HOME"] ?? "."}/.pi/harness`;
233
233