@caupulican/pi-adaptative 0.81.38 → 0.81.40

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 (881) hide show
  1. package/CHANGELOG.md +131 -0
  2. package/README.md +2 -0
  3. package/dist/bundled-resources/extensions/tmux-agent-manager/README.md +18 -1
  4. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.d.ts +133 -0
  5. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.d.ts.map +1 -0
  6. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.js +198 -0
  7. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.js.map +1 -0
  8. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.ts +311 -0
  9. package/dist/bundled-resources/extensions/tmux-agent-manager/index.d.ts +31 -2
  10. package/dist/bundled-resources/extensions/tmux-agent-manager/index.d.ts.map +1 -1
  11. package/dist/bundled-resources/extensions/tmux-agent-manager/index.js +823 -79
  12. package/dist/bundled-resources/extensions/tmux-agent-manager/index.js.map +1 -1
  13. package/dist/bundled-resources/extensions/tmux-agent-manager/index.ts +1043 -86
  14. package/dist/bundled-resources/runtimes/pi-shell-engine/commands/__init__.py +43 -0
  15. package/dist/bundled-resources/runtimes/pi-shell-engine/commands/fs.py +270 -0
  16. package/dist/bundled-resources/runtimes/pi-shell-engine/commands/search.py +252 -0
  17. package/dist/bundled-resources/runtimes/pi-shell-engine/commands/strings.py +399 -0
  18. package/dist/bundled-resources/runtimes/pi-shell-engine/commands/text.py +575 -0
  19. package/dist/bundled-resources/runtimes/pi-shell-engine/context.py +52 -0
  20. package/dist/bundled-resources/runtimes/pi-shell-engine/errors.py +49 -0
  21. package/dist/bundled-resources/runtimes/pi-shell-engine/exec.py +734 -0
  22. package/dist/bundled-resources/runtimes/pi-shell-engine/expand.py +238 -0
  23. package/dist/bundled-resources/runtimes/pi-shell-engine/main.py +132 -0
  24. package/dist/bundled-resources/runtimes/pi-shell-engine/nodes.py +116 -0
  25. package/dist/bundled-resources/runtimes/pi-shell-engine/parser.py +287 -0
  26. package/dist/bundled-resources/runtimes/pi-shell-engine/proc.py +137 -0
  27. package/dist/bundled-resources/runtimes/pi-shell-engine/state.py +100 -0
  28. package/dist/bundled-resources/runtimes/pi-shell-engine/tokens.py +579 -0
  29. package/dist/bundled-resources/skills/tool-call-repair/SKILL.md +19 -9
  30. package/dist/bundled-resources/skills/tool-call-repair/references/failure-grammar.md +22 -5
  31. package/dist/bundled-resources/skills/tool-call-repair/references/repair-catalogue.md +7 -7
  32. package/dist/bundled-resources/skills/tool-call-repair/references/text-protocol-grammar.md +28 -7
  33. package/dist/cli/args.d.ts +5 -0
  34. package/dist/cli/args.d.ts.map +1 -1
  35. package/dist/cli/args.js +24 -0
  36. package/dist/cli/args.js.map +1 -1
  37. package/dist/core/agent-directory-layout.d.ts +15 -0
  38. package/dist/core/agent-directory-layout.d.ts.map +1 -0
  39. package/dist/core/agent-directory-layout.js +72 -0
  40. package/dist/core/agent-directory-layout.js.map +1 -0
  41. package/dist/core/agent-paths.d.ts +66 -0
  42. package/dist/core/agent-paths.d.ts.map +1 -0
  43. package/dist/core/agent-paths.js +170 -0
  44. package/dist/core/agent-paths.js.map +1 -0
  45. package/dist/core/agent-session-runtime.d.ts +52 -8
  46. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  47. package/dist/core/agent-session-runtime.js +397 -79
  48. package/dist/core/agent-session-runtime.js.map +1 -1
  49. package/dist/core/agent-session-services.d.ts +1 -0
  50. package/dist/core/agent-session-services.d.ts.map +1 -1
  51. package/dist/core/agent-session-services.js +4 -3
  52. package/dist/core/agent-session-services.js.map +1 -1
  53. package/dist/core/agent-session.d.ts +255 -103
  54. package/dist/core/agent-session.d.ts.map +1 -1
  55. package/dist/core/agent-session.js +754 -1173
  56. package/dist/core/agent-session.js.map +1 -1
  57. package/dist/core/autonomy/approval-gate.d.ts +3 -2
  58. package/dist/core/autonomy/approval-gate.d.ts.map +1 -1
  59. package/dist/core/autonomy/approval-gate.js +6 -28
  60. package/dist/core/autonomy/approval-gate.js.map +1 -1
  61. package/dist/core/autonomy/bounded-completion.d.ts +1 -1
  62. package/dist/core/autonomy/bounded-completion.d.ts.map +1 -1
  63. package/dist/core/autonomy/bounded-completion.js +1 -1
  64. package/dist/core/autonomy/bounded-completion.js.map +1 -1
  65. package/dist/core/autonomy/contracts.d.ts +26 -9
  66. package/dist/core/autonomy/contracts.d.ts.map +1 -1
  67. package/dist/core/autonomy/contracts.js.map +1 -1
  68. package/dist/core/autonomy/foreground-envelope.d.ts +8 -2
  69. package/dist/core/autonomy/foreground-envelope.d.ts.map +1 -1
  70. package/dist/core/autonomy/foreground-envelope.js +8 -25
  71. package/dist/core/autonomy/foreground-envelope.js.map +1 -1
  72. package/dist/core/autonomy/gates.d.ts.map +1 -1
  73. package/dist/core/autonomy/gates.js +8 -10
  74. package/dist/core/autonomy/gates.js.map +1 -1
  75. package/dist/core/autonomy/lane-private-paths.d.ts +2 -0
  76. package/dist/core/autonomy/lane-private-paths.d.ts.map +1 -0
  77. package/dist/core/autonomy/lane-private-paths.js +16 -0
  78. package/dist/core/autonomy/lane-private-paths.js.map +1 -0
  79. package/dist/core/autonomy/lane-tool-surface.d.ts +10 -0
  80. package/dist/core/autonomy/lane-tool-surface.d.ts.map +1 -1
  81. package/dist/core/autonomy/lane-tool-surface.js +46 -8
  82. package/dist/core/autonomy/lane-tool-surface.js.map +1 -1
  83. package/dist/core/autonomy/lane-tracker.d.ts +24 -1
  84. package/dist/core/autonomy/lane-tracker.d.ts.map +1 -1
  85. package/dist/core/autonomy/lane-tracker.js +43 -1
  86. package/dist/core/autonomy/lane-tracker.js.map +1 -1
  87. package/dist/core/autonomy/risk-assessment.d.ts +1 -2
  88. package/dist/core/autonomy/risk-assessment.d.ts.map +1 -1
  89. package/dist/core/autonomy/risk-assessment.js +1 -123
  90. package/dist/core/autonomy/risk-assessment.js.map +1 -1
  91. package/dist/core/autonomy/session-lane-record.d.ts +4 -4
  92. package/dist/core/autonomy/session-lane-record.d.ts.map +1 -1
  93. package/dist/core/autonomy/session-lane-record.js +16 -29
  94. package/dist/core/autonomy/session-lane-record.js.map +1 -1
  95. package/dist/core/autonomy/telemetry-events.d.ts +1 -1
  96. package/dist/core/autonomy/telemetry-events.d.ts.map +1 -1
  97. package/dist/core/autonomy/telemetry-events.js +1 -1
  98. package/dist/core/autonomy/telemetry-events.js.map +1 -1
  99. package/dist/core/autonomy-telemetry.d.ts +7 -7
  100. package/dist/core/autonomy-telemetry.d.ts.map +1 -1
  101. package/dist/core/autonomy-telemetry.js +9 -9
  102. package/dist/core/autonomy-telemetry.js.map +1 -1
  103. package/dist/core/background-lane-controller.d.ts +90 -156
  104. package/dist/core/background-lane-controller.d.ts.map +1 -1
  105. package/dist/core/background-lane-controller.js +192 -968
  106. package/dist/core/background-lane-controller.js.map +1 -1
  107. package/dist/core/bash-execution-controller.d.ts +4 -0
  108. package/dist/core/bash-execution-controller.d.ts.map +1 -1
  109. package/dist/core/bash-execution-controller.js +7 -1
  110. package/dist/core/bash-execution-controller.js.map +1 -1
  111. package/dist/core/capability-contract.d.ts +4 -0
  112. package/dist/core/capability-contract.d.ts.map +1 -0
  113. package/dist/core/capability-contract.js +28 -0
  114. package/dist/core/capability-contract.js.map +1 -0
  115. package/dist/core/compaction-controller.d.ts +90 -0
  116. package/dist/core/compaction-controller.d.ts.map +1 -0
  117. package/dist/core/compaction-controller.js +452 -0
  118. package/dist/core/compaction-controller.js.map +1 -0
  119. package/dist/core/compaction-support.d.ts +24 -13
  120. package/dist/core/compaction-support.d.ts.map +1 -1
  121. package/dist/core/compaction-support.js +43 -7
  122. package/dist/core/compaction-support.js.map +1 -1
  123. package/dist/core/context/context-artifacts.d.ts +6 -2
  124. package/dist/core/context/context-artifacts.d.ts.map +1 -1
  125. package/dist/core/context/context-artifacts.js +34 -2
  126. package/dist/core/context/context-artifacts.js.map +1 -1
  127. package/dist/core/context/context-audit.d.ts +33 -1
  128. package/dist/core/context/context-audit.d.ts.map +1 -1
  129. package/dist/core/context/context-audit.js +31 -5
  130. package/dist/core/context/context-audit.js.map +1 -1
  131. package/dist/core/context/context-store-retention.d.ts +8 -2
  132. package/dist/core/context/context-store-retention.d.ts.map +1 -1
  133. package/dist/core/context/context-store-retention.js +158 -35
  134. package/dist/core/context/context-store-retention.js.map +1 -1
  135. package/dist/core/context/okf-memory.d.ts.map +1 -1
  136. package/dist/core/context/okf-memory.js +9 -11
  137. package/dist/core/context/okf-memory.js.map +1 -1
  138. package/dist/core/context/sqlite-runtime-index.d.ts.map +1 -1
  139. package/dist/core/context/sqlite-runtime-index.js +6 -8
  140. package/dist/core/context/sqlite-runtime-index.js.map +1 -1
  141. package/dist/core/context-gc.d.ts +3 -0
  142. package/dist/core/context-gc.d.ts.map +1 -1
  143. package/dist/core/context-gc.js +26 -6
  144. package/dist/core/context-gc.js.map +1 -1
  145. package/dist/core/context-pipeline.d.ts +26 -4
  146. package/dist/core/context-pipeline.d.ts.map +1 -1
  147. package/dist/core/context-pipeline.js +146 -18
  148. package/dist/core/context-pipeline.js.map +1 -1
  149. package/dist/core/cost-guard.d.ts +19 -3
  150. package/dist/core/cost-guard.d.ts.map +1 -1
  151. package/dist/core/cost-guard.js +18 -3
  152. package/dist/core/cost-guard.js.map +1 -1
  153. package/dist/core/default-tool-surface.d.ts.map +1 -1
  154. package/dist/core/default-tool-surface.js +1 -0
  155. package/dist/core/default-tool-surface.js.map +1 -1
  156. package/dist/core/delegation/managed-lane-controller.d.ts +34 -0
  157. package/dist/core/delegation/managed-lane-controller.d.ts.map +1 -0
  158. package/dist/core/delegation/managed-lane-controller.js +217 -0
  159. package/dist/core/delegation/managed-lane-controller.js.map +1 -0
  160. package/dist/core/delegation/session-worker-claim.d.ts +44 -0
  161. package/dist/core/delegation/session-worker-claim.d.ts.map +1 -0
  162. package/dist/core/delegation/session-worker-claim.js +98 -0
  163. package/dist/core/delegation/session-worker-claim.js.map +1 -0
  164. package/dist/core/delegation/worker-actions.d.ts +7 -5
  165. package/dist/core/delegation/worker-actions.d.ts.map +1 -1
  166. package/dist/core/delegation/worker-actions.js +20 -4
  167. package/dist/core/delegation/worker-actions.js.map +1 -1
  168. package/dist/core/delegation/worker-claim.d.ts +56 -0
  169. package/dist/core/delegation/worker-claim.d.ts.map +1 -0
  170. package/dist/core/delegation/worker-claim.js +239 -0
  171. package/dist/core/delegation/worker-claim.js.map +1 -0
  172. package/dist/core/delegation/worker-delegation-controller.d.ts +110 -0
  173. package/dist/core/delegation/worker-delegation-controller.d.ts.map +1 -0
  174. package/dist/core/delegation/worker-delegation-controller.js +861 -0
  175. package/dist/core/delegation/worker-delegation-controller.js.map +1 -0
  176. package/dist/core/delegation/worker-delegation-request.d.ts +11 -0
  177. package/dist/core/delegation/worker-delegation-request.d.ts.map +1 -0
  178. package/dist/core/delegation/worker-delegation-request.js +2 -0
  179. package/dist/core/delegation/worker-delegation-request.js.map +1 -0
  180. package/dist/core/delegation/worker-dispatch-scheduler.d.ts +40 -0
  181. package/dist/core/delegation/worker-dispatch-scheduler.d.ts.map +1 -0
  182. package/dist/core/delegation/worker-dispatch-scheduler.js +93 -0
  183. package/dist/core/delegation/worker-dispatch-scheduler.js.map +1 -0
  184. package/dist/core/delegation/worker-execution-policy.d.ts +62 -0
  185. package/dist/core/delegation/worker-execution-policy.d.ts.map +1 -0
  186. package/dist/core/delegation/worker-execution-policy.js +160 -0
  187. package/dist/core/delegation/worker-execution-policy.js.map +1 -0
  188. package/dist/core/delegation/worker-lane-projection.d.ts +14 -0
  189. package/dist/core/delegation/worker-lane-projection.d.ts.map +1 -0
  190. package/dist/core/delegation/worker-lane-projection.js +100 -0
  191. package/dist/core/delegation/worker-lane-projection.js.map +1 -0
  192. package/dist/core/delegation/worker-lifecycle.d.ts +97 -0
  193. package/dist/core/delegation/worker-lifecycle.d.ts.map +1 -0
  194. package/dist/core/delegation/worker-lifecycle.js +339 -0
  195. package/dist/core/delegation/worker-lifecycle.js.map +1 -0
  196. package/dist/core/delegation/worker-notification-coordinator.d.ts +36 -0
  197. package/dist/core/delegation/worker-notification-coordinator.d.ts.map +1 -0
  198. package/dist/core/delegation/worker-notification-coordinator.js +90 -0
  199. package/dist/core/delegation/worker-notification-coordinator.js.map +1 -0
  200. package/dist/core/delegation/worker-profile-resolver.d.ts +55 -0
  201. package/dist/core/delegation/worker-profile-resolver.d.ts.map +1 -0
  202. package/dist/core/delegation/worker-profile-resolver.js +113 -0
  203. package/dist/core/delegation/worker-profile-resolver.js.map +1 -0
  204. package/dist/core/delegation/worker-runner.d.ts +25 -14
  205. package/dist/core/delegation/worker-runner.d.ts.map +1 -1
  206. package/dist/core/delegation/worker-runner.js +122 -53
  207. package/dist/core/delegation/worker-runner.js.map +1 -1
  208. package/dist/core/delegation/worker-task-label.d.ts +3 -0
  209. package/dist/core/delegation/worker-task-label.d.ts.map +1 -0
  210. package/dist/core/delegation/worker-task-label.js +11 -0
  211. package/dist/core/delegation/worker-task-label.js.map +1 -0
  212. package/dist/core/doctor.d.ts +8 -0
  213. package/dist/core/doctor.d.ts.map +1 -1
  214. package/dist/core/doctor.js +32 -1
  215. package/dist/core/doctor.js.map +1 -1
  216. package/dist/core/extensions/index.d.ts +1 -1
  217. package/dist/core/extensions/index.d.ts.map +1 -1
  218. package/dist/core/extensions/index.js.map +1 -1
  219. package/dist/core/extensions/loader.d.ts +5 -1
  220. package/dist/core/extensions/loader.d.ts.map +1 -1
  221. package/dist/core/extensions/loader.js +68 -13
  222. package/dist/core/extensions/loader.js.map +1 -1
  223. package/dist/core/extensions/runner.d.ts.map +1 -1
  224. package/dist/core/extensions/runner.js +7 -0
  225. package/dist/core/extensions/runner.js.map +1 -1
  226. package/dist/core/extensions/storage.d.ts +8 -0
  227. package/dist/core/extensions/storage.d.ts.map +1 -0
  228. package/dist/core/extensions/storage.js +28 -0
  229. package/dist/core/extensions/storage.js.map +1 -0
  230. package/dist/core/extensions/types.d.ts +101 -1
  231. package/dist/core/extensions/types.d.ts.map +1 -1
  232. package/dist/core/extensions/types.js.map +1 -1
  233. package/dist/core/failure-corpus.d.ts +1 -15
  234. package/dist/core/failure-corpus.d.ts.map +1 -1
  235. package/dist/core/failure-corpus.js +9 -37
  236. package/dist/core/failure-corpus.js.map +1 -1
  237. package/dist/core/foreground-recovery-controller.d.ts +52 -0
  238. package/dist/core/foreground-recovery-controller.d.ts.map +1 -0
  239. package/dist/core/foreground-recovery-controller.js +111 -0
  240. package/dist/core/foreground-recovery-controller.js.map +1 -0
  241. package/dist/core/gateways/channel-provider.d.ts +3 -0
  242. package/dist/core/gateways/channel-provider.d.ts.map +1 -1
  243. package/dist/core/gateways/channel-provider.js +31 -6
  244. package/dist/core/gateways/channel-provider.js.map +1 -1
  245. package/dist/core/goal-loop-controller.d.ts +17 -1
  246. package/dist/core/goal-loop-controller.d.ts.map +1 -1
  247. package/dist/core/goal-loop-controller.js +79 -11
  248. package/dist/core/goal-loop-controller.js.map +1 -1
  249. package/dist/core/goals/goal-acceptance.d.ts +11 -0
  250. package/dist/core/goals/goal-acceptance.d.ts.map +1 -0
  251. package/dist/core/goals/goal-acceptance.js +25 -0
  252. package/dist/core/goals/goal-acceptance.js.map +1 -0
  253. package/dist/core/goals/goal-auto-continue-controller.d.ts +27 -0
  254. package/dist/core/goals/goal-auto-continue-controller.d.ts.map +1 -0
  255. package/dist/core/goals/goal-auto-continue-controller.js +93 -0
  256. package/dist/core/goals/goal-auto-continue-controller.js.map +1 -0
  257. package/dist/core/goals/goal-continuation-controller.d.ts +48 -2
  258. package/dist/core/goals/goal-continuation-controller.d.ts.map +1 -1
  259. package/dist/core/goals/goal-continuation-controller.js +87 -0
  260. package/dist/core/goals/goal-continuation-controller.js.map +1 -1
  261. package/dist/core/goals/goal-continuation-defaults.d.ts +39 -0
  262. package/dist/core/goals/goal-continuation-defaults.d.ts.map +1 -1
  263. package/dist/core/goals/goal-continuation-defaults.js +42 -0
  264. package/dist/core/goals/goal-continuation-defaults.js.map +1 -1
  265. package/dist/core/goals/goal-continuation-prompt.d.ts +5 -1
  266. package/dist/core/goals/goal-continuation-prompt.d.ts.map +1 -1
  267. package/dist/core/goals/goal-continuation-prompt.js +56 -15
  268. package/dist/core/goals/goal-continuation-prompt.js.map +1 -1
  269. package/dist/core/goals/goal-lifecycle.d.ts +20 -0
  270. package/dist/core/goals/goal-lifecycle.d.ts.map +1 -0
  271. package/dist/core/goals/goal-lifecycle.js +17 -0
  272. package/dist/core/goals/goal-lifecycle.js.map +1 -0
  273. package/dist/core/goals/goal-runtime-snapshot.d.ts +105 -4
  274. package/dist/core/goals/goal-runtime-snapshot.d.ts.map +1 -1
  275. package/dist/core/goals/goal-runtime-snapshot.js +91 -6
  276. package/dist/core/goals/goal-runtime-snapshot.js.map +1 -1
  277. package/dist/core/goals/goal-state.d.ts +90 -1
  278. package/dist/core/goals/goal-state.d.ts.map +1 -1
  279. package/dist/core/goals/goal-state.js +78 -15
  280. package/dist/core/goals/goal-state.js.map +1 -1
  281. package/dist/core/goals/goal-tool-core.d.ts +58 -2
  282. package/dist/core/goals/goal-tool-core.d.ts.map +1 -1
  283. package/dist/core/goals/goal-tool-core.js +82 -6
  284. package/dist/core/goals/goal-tool-core.js.map +1 -1
  285. package/dist/core/goals/session-goal-state.d.ts +13 -6
  286. package/dist/core/goals/session-goal-state.d.ts.map +1 -1
  287. package/dist/core/goals/session-goal-state.js +20 -28
  288. package/dist/core/goals/session-goal-state.js.map +1 -1
  289. package/dist/core/human-input.d.ts +100 -0
  290. package/dist/core/human-input.d.ts.map +1 -0
  291. package/dist/core/human-input.js +362 -0
  292. package/dist/core/human-input.js.map +1 -0
  293. package/dist/core/index.d.ts +9 -1
  294. package/dist/core/index.d.ts.map +1 -1
  295. package/dist/core/index.js +9 -1
  296. package/dist/core/index.js.map +1 -1
  297. package/dist/core/{telemetry.d.ts → install-telemetry.d.ts} +1 -1
  298. package/dist/core/install-telemetry.d.ts.map +1 -0
  299. package/dist/core/{telemetry.js → install-telemetry.js} +1 -1
  300. package/dist/core/install-telemetry.js.map +1 -0
  301. package/dist/core/keybindings.d.ts +27 -1
  302. package/dist/core/keybindings.d.ts.map +1 -1
  303. package/dist/core/keybindings.js +34 -8
  304. package/dist/core/keybindings.js.map +1 -1
  305. package/dist/core/learning/learning-audit.d.ts +2 -4
  306. package/dist/core/learning/learning-audit.d.ts.map +1 -1
  307. package/dist/core/learning/learning-audit.js +9 -29
  308. package/dist/core/learning/learning-audit.js.map +1 -1
  309. package/dist/core/learning/learning-gate.d.ts.map +1 -1
  310. package/dist/core/learning/learning-gate.js +1 -6
  311. package/dist/core/learning/learning-gate.js.map +1 -1
  312. package/dist/core/learning/observation-store.d.ts +12 -3
  313. package/dist/core/learning/observation-store.d.ts.map +1 -1
  314. package/dist/core/learning/observation-store.js +30 -15
  315. package/dist/core/learning/observation-store.js.map +1 -1
  316. package/dist/core/learning/session-learning-decision.d.ts +2 -4
  317. package/dist/core/learning/session-learning-decision.d.ts.map +1 -1
  318. package/dist/core/learning/session-learning-decision.js +9 -29
  319. package/dist/core/learning/session-learning-decision.js.map +1 -1
  320. package/dist/core/learning/skill-curator.d.ts +5 -1
  321. package/dist/core/learning/skill-curator.d.ts.map +1 -1
  322. package/dist/core/learning/skill-curator.js +21 -19
  323. package/dist/core/learning/skill-curator.js.map +1 -1
  324. package/dist/core/local-runtime-controller.d.ts +65 -3
  325. package/dist/core/local-runtime-controller.d.ts.map +1 -1
  326. package/dist/core/local-runtime-controller.js +186 -26
  327. package/dist/core/local-runtime-controller.js.map +1 -1
  328. package/dist/core/memory/providers/file-store.d.ts +1 -1
  329. package/dist/core/memory/providers/file-store.d.ts.map +1 -1
  330. package/dist/core/memory/providers/file-store.js +6 -6
  331. package/dist/core/memory/providers/file-store.js.map +1 -1
  332. package/dist/core/memory-controller.d.ts.map +1 -1
  333. package/dist/core/memory-controller.js +4 -4
  334. package/dist/core/memory-controller.js.map +1 -1
  335. package/dist/core/model-capability.d.ts +34 -0
  336. package/dist/core/model-capability.d.ts.map +1 -1
  337. package/dist/core/model-capability.js +43 -1
  338. package/dist/core/model-capability.js.map +1 -1
  339. package/dist/core/model-resolver.d.ts +1 -1
  340. package/dist/core/model-resolver.d.ts.map +1 -1
  341. package/dist/core/model-resolver.js +6 -9
  342. package/dist/core/model-resolver.js.map +1 -1
  343. package/dist/core/model-router/intent-classifier.d.ts +1 -4
  344. package/dist/core/model-router/intent-classifier.d.ts.map +1 -1
  345. package/dist/core/model-router/intent-classifier.js +1 -156
  346. package/dist/core/model-router/intent-classifier.js.map +1 -1
  347. package/dist/core/model-router/tool-escalation.d.ts +15 -0
  348. package/dist/core/model-router/tool-escalation.d.ts.map +1 -1
  349. package/dist/core/model-router/tool-escalation.js +23 -1
  350. package/dist/core/model-router/tool-escalation.js.map +1 -1
  351. package/dist/core/model-router-controller.d.ts +34 -7
  352. package/dist/core/model-router-controller.d.ts.map +1 -1
  353. package/dist/core/model-router-controller.js +95 -16
  354. package/dist/core/model-router-controller.js.map +1 -1
  355. package/dist/core/model-selection-controller.d.ts +4 -4
  356. package/dist/core/model-selection-controller.d.ts.map +1 -1
  357. package/dist/core/model-selection-controller.js.map +1 -1
  358. package/dist/core/model-tool-protocol.d.ts +23 -0
  359. package/dist/core/model-tool-protocol.d.ts.map +1 -0
  360. package/dist/core/model-tool-protocol.js +43 -0
  361. package/dist/core/model-tool-protocol.js.map +1 -0
  362. package/dist/core/models/adaptation-store.d.ts +10 -5
  363. package/dist/core/models/adaptation-store.d.ts.map +1 -1
  364. package/dist/core/models/adaptation-store.js +129 -81
  365. package/dist/core/models/adaptation-store.js.map +1 -1
  366. package/dist/core/models/default-model-suggestions.d.ts.map +1 -1
  367. package/dist/core/models/default-model-suggestions.js +17 -0
  368. package/dist/core/models/default-model-suggestions.js.map +1 -1
  369. package/dist/core/models/fitness-store.d.ts +4 -11
  370. package/dist/core/models/fitness-store.d.ts.map +1 -1
  371. package/dist/core/models/fitness-store.js +87 -51
  372. package/dist/core/models/fitness-store.js.map +1 -1
  373. package/dist/core/models/host-state-store.d.ts +34 -0
  374. package/dist/core/models/host-state-store.d.ts.map +1 -0
  375. package/dist/core/models/host-state-store.js +86 -0
  376. package/dist/core/models/host-state-store.js.map +1 -0
  377. package/dist/core/models/llamacpp-runtime.d.ts +180 -0
  378. package/dist/core/models/llamacpp-runtime.d.ts.map +1 -0
  379. package/dist/core/models/llamacpp-runtime.js +475 -0
  380. package/dist/core/models/llamacpp-runtime.js.map +1 -0
  381. package/dist/core/models/local-registration.d.ts +40 -0
  382. package/dist/core/models/local-registration.d.ts.map +1 -1
  383. package/dist/core/models/local-registration.js +94 -5
  384. package/dist/core/models/local-registration.js.map +1 -1
  385. package/dist/core/models/local-runtime.d.ts.map +1 -1
  386. package/dist/core/models/local-runtime.js +6 -5
  387. package/dist/core/models/local-runtime.js.map +1 -1
  388. package/dist/core/models/model-ref.d.ts +7 -0
  389. package/dist/core/models/model-ref.d.ts.map +1 -1
  390. package/dist/core/models/model-ref.js +26 -0
  391. package/dist/core/models/model-ref.js.map +1 -1
  392. package/dist/core/models/needle-runtime.d.ts +257 -0
  393. package/dist/core/models/needle-runtime.d.ts.map +1 -0
  394. package/dist/core/models/needle-runtime.js +519 -0
  395. package/dist/core/models/needle-runtime.js.map +1 -0
  396. package/dist/core/models/prism-llamacpp-lifecycle.d.ts +89 -0
  397. package/dist/core/models/prism-llamacpp-lifecycle.d.ts.map +1 -0
  398. package/dist/core/models/prism-llamacpp-lifecycle.js +121 -0
  399. package/dist/core/models/prism-llamacpp-lifecycle.js.map +1 -0
  400. package/dist/core/orchestration/agent-resume.d.ts +24 -0
  401. package/dist/core/orchestration/agent-resume.d.ts.map +1 -0
  402. package/dist/core/orchestration/agent-resume.js +90 -0
  403. package/dist/core/orchestration/agent-resume.js.map +1 -0
  404. package/dist/core/orchestration/capability-gateway.d.ts +61 -0
  405. package/dist/core/orchestration/capability-gateway.d.ts.map +1 -0
  406. package/dist/core/orchestration/capability-gateway.js +152 -0
  407. package/dist/core/orchestration/capability-gateway.js.map +1 -0
  408. package/dist/core/orchestration/contracts.d.ts +343 -0
  409. package/dist/core/orchestration/contracts.d.ts.map +1 -0
  410. package/dist/core/orchestration/contracts.js +135 -0
  411. package/dist/core/orchestration/contracts.js.map +1 -0
  412. package/dist/core/orchestration/delegation-ledger.d.ts +56 -0
  413. package/dist/core/orchestration/delegation-ledger.d.ts.map +1 -0
  414. package/dist/core/orchestration/delegation-ledger.js +197 -0
  415. package/dist/core/orchestration/delegation-ledger.js.map +1 -0
  416. package/dist/core/orchestration/event-store.d.ts +83 -0
  417. package/dist/core/orchestration/event-store.d.ts.map +1 -0
  418. package/dist/core/orchestration/event-store.js +560 -0
  419. package/dist/core/orchestration/event-store.js.map +1 -0
  420. package/dist/core/orchestration/lane-tool-manifests.d.ts +9 -0
  421. package/dist/core/orchestration/lane-tool-manifests.d.ts.map +1 -0
  422. package/dist/core/orchestration/lane-tool-manifests.js +37 -0
  423. package/dist/core/orchestration/lane-tool-manifests.js.map +1 -0
  424. package/dist/core/orchestration/model-binding.d.ts +15 -0
  425. package/dist/core/orchestration/model-binding.d.ts.map +1 -0
  426. package/dist/core/orchestration/model-binding.js +29 -0
  427. package/dist/core/orchestration/model-binding.js.map +1 -0
  428. package/dist/core/orchestration/policy-compiler.d.ts +49 -0
  429. package/dist/core/orchestration/policy-compiler.d.ts.map +1 -0
  430. package/dist/core/orchestration/policy-compiler.js +191 -0
  431. package/dist/core/orchestration/policy-compiler.js.map +1 -0
  432. package/dist/core/orchestration/policy-gate.d.ts +18 -0
  433. package/dist/core/orchestration/policy-gate.d.ts.map +1 -0
  434. package/dist/core/orchestration/policy-gate.js +24 -0
  435. package/dist/core/orchestration/policy-gate.js.map +1 -0
  436. package/dist/core/orchestration/profile-registry.d.ts +51 -0
  437. package/dist/core/orchestration/profile-registry.d.ts.map +1 -0
  438. package/dist/core/orchestration/profile-registry.js +393 -0
  439. package/dist/core/orchestration/profile-registry.js.map +1 -0
  440. package/dist/core/orchestration/profile-store.d.ts +31 -0
  441. package/dist/core/orchestration/profile-store.d.ts.map +1 -0
  442. package/dist/core/orchestration/profile-store.js +136 -0
  443. package/dist/core/orchestration/profile-store.js.map +1 -0
  444. package/dist/core/orchestration/risk-budget.d.ts +9 -0
  445. package/dist/core/orchestration/risk-budget.d.ts.map +1 -0
  446. package/dist/core/orchestration/risk-budget.js +48 -0
  447. package/dist/core/orchestration/risk-budget.js.map +1 -0
  448. package/dist/core/orchestration/task-runtime.d.ts +168 -0
  449. package/dist/core/orchestration/task-runtime.d.ts.map +1 -0
  450. package/dist/core/orchestration/task-runtime.js +1600 -0
  451. package/dist/core/orchestration/task-runtime.js.map +1 -0
  452. package/dist/core/orchestration/work-state-projection.d.ts +32 -0
  453. package/dist/core/orchestration/work-state-projection.d.ts.map +1 -0
  454. package/dist/core/orchestration/work-state-projection.js +116 -0
  455. package/dist/core/orchestration/work-state-projection.js.map +1 -0
  456. package/dist/core/orchestration/worker-execution-contract.d.ts +21 -0
  457. package/dist/core/orchestration/worker-execution-contract.d.ts.map +1 -0
  458. package/dist/core/orchestration/worker-execution-contract.js +179 -0
  459. package/dist/core/orchestration/worker-execution-contract.js.map +1 -0
  460. package/dist/core/orchestration/worker-result-adapter.d.ts +21 -0
  461. package/dist/core/orchestration/worker-result-adapter.d.ts.map +1 -0
  462. package/dist/core/orchestration/worker-result-adapter.js +109 -0
  463. package/dist/core/orchestration/worker-result-adapter.js.map +1 -0
  464. package/dist/core/package-manager.d.ts.map +1 -1
  465. package/dist/core/package-manager.js +11 -10
  466. package/dist/core/package-manager.js.map +1 -1
  467. package/dist/core/process-identity.d.ts +11 -0
  468. package/dist/core/process-identity.d.ts.map +1 -0
  469. package/dist/core/process-identity.js +26 -0
  470. package/dist/core/process-identity.js.map +1 -0
  471. package/dist/core/process-matrix/codes.d.ts +83 -0
  472. package/dist/core/process-matrix/codes.d.ts.map +1 -0
  473. package/dist/core/process-matrix/codes.js +15 -0
  474. package/dist/core/process-matrix/codes.js.map +1 -0
  475. package/dist/core/process-matrix/resume-launcher.d.ts +26 -0
  476. package/dist/core/process-matrix/resume-launcher.d.ts.map +1 -0
  477. package/dist/core/process-matrix/resume-launcher.js +62 -0
  478. package/dist/core/process-matrix/resume-launcher.js.map +1 -0
  479. package/dist/core/process-matrix/runtime.d.ts +78 -0
  480. package/dist/core/process-matrix/runtime.d.ts.map +1 -0
  481. package/dist/core/process-matrix/runtime.js +633 -0
  482. package/dist/core/process-matrix/runtime.js.map +1 -0
  483. package/dist/core/process-matrix/store.d.ts +25 -0
  484. package/dist/core/process-matrix/store.d.ts.map +1 -0
  485. package/dist/core/process-matrix/store.js +189 -0
  486. package/dist/core/process-matrix/store.js.map +1 -0
  487. package/dist/core/process-matrix/supervisor.d.ts +75 -0
  488. package/dist/core/process-matrix/supervisor.d.ts.map +1 -0
  489. package/dist/core/process-matrix/supervisor.js +161 -0
  490. package/dist/core/process-matrix/supervisor.js.map +1 -0
  491. package/dist/core/profile-registry.d.ts +7 -0
  492. package/dist/core/profile-registry.d.ts.map +1 -1
  493. package/dist/core/profile-registry.js +25 -7
  494. package/dist/core/profile-registry.js.map +1 -1
  495. package/dist/core/python-runtime.d.ts.map +1 -1
  496. package/dist/core/python-runtime.js +3 -3
  497. package/dist/core/python-runtime.js.map +1 -1
  498. package/dist/core/reflection-controller.d.ts +33 -9
  499. package/dist/core/reflection-controller.d.ts.map +1 -1
  500. package/dist/core/reflection-controller.js +217 -127
  501. package/dist/core/reflection-controller.js.map +1 -1
  502. package/dist/core/reload-blockers.d.ts +36 -0
  503. package/dist/core/reload-blockers.d.ts.map +1 -1
  504. package/dist/core/reload-blockers.js +50 -8
  505. package/dist/core/reload-blockers.js.map +1 -1
  506. package/dist/core/research/evidence-bundle.d.ts.map +1 -1
  507. package/dist/core/research/evidence-bundle.js +1 -6
  508. package/dist/core/research/evidence-bundle.js.map +1 -1
  509. package/dist/core/research/lane-model-resolver.d.ts +33 -0
  510. package/dist/core/research/lane-model-resolver.d.ts.map +1 -0
  511. package/dist/core/research/lane-model-resolver.js +65 -0
  512. package/dist/core/research/lane-model-resolver.js.map +1 -0
  513. package/dist/core/research/model-fitness-controller.d.ts +38 -0
  514. package/dist/core/research/model-fitness-controller.d.ts.map +1 -0
  515. package/dist/core/research/model-fitness-controller.js +106 -0
  516. package/dist/core/research/model-fitness-controller.js.map +1 -0
  517. package/dist/core/research/model-fitness.d.ts +1 -1
  518. package/dist/core/research/model-fitness.d.ts.map +1 -1
  519. package/dist/core/research/model-fitness.js +4 -4
  520. package/dist/core/research/model-fitness.js.map +1 -1
  521. package/dist/core/research/research-gate.d.ts.map +1 -1
  522. package/dist/core/research/research-gate.js +7 -7
  523. package/dist/core/research/research-gate.js.map +1 -1
  524. package/dist/core/research/research-lane-controller.d.ts +62 -0
  525. package/dist/core/research/research-lane-controller.d.ts.map +1 -0
  526. package/dist/core/research/research-lane-controller.js +292 -0
  527. package/dist/core/research/research-lane-controller.js.map +1 -0
  528. package/dist/core/research/session-evidence-bundle.d.ts +2 -4
  529. package/dist/core/research/session-evidence-bundle.d.ts.map +1 -1
  530. package/dist/core/research/session-evidence-bundle.js +10 -46
  531. package/dist/core/research/session-evidence-bundle.js.map +1 -1
  532. package/dist/core/resource-loader.d.ts.map +1 -1
  533. package/dist/core/resource-loader.js +15 -9
  534. package/dist/core/resource-loader.js.map +1 -1
  535. package/dist/core/risk-classifier.d.ts +6 -0
  536. package/dist/core/risk-classifier.d.ts.map +1 -0
  537. package/dist/core/risk-classifier.js +225 -0
  538. package/dist/core/risk-classifier.js.map +1 -0
  539. package/dist/core/runtime-builder.d.ts +76 -17
  540. package/dist/core/runtime-builder.d.ts.map +1 -1
  541. package/dist/core/runtime-builder.js +367 -124
  542. package/dist/core/runtime-builder.js.map +1 -1
  543. package/dist/core/scout-controller.d.ts +6 -0
  544. package/dist/core/scout-controller.d.ts.map +1 -1
  545. package/dist/core/scout-controller.js +66 -52
  546. package/dist/core/scout-controller.js.map +1 -1
  547. package/dist/core/sdk.d.ts +6 -3
  548. package/dist/core/sdk.d.ts.map +1 -1
  549. package/dist/core/sdk.js +64 -27
  550. package/dist/core/sdk.js.map +1 -1
  551. package/dist/core/session-analytics.d.ts.map +1 -1
  552. package/dist/core/session-analytics.js +28 -1
  553. package/dist/core/session-analytics.js.map +1 -1
  554. package/dist/core/session-image-store.d.ts +33 -0
  555. package/dist/core/session-image-store.d.ts.map +1 -0
  556. package/dist/core/session-image-store.js +283 -0
  557. package/dist/core/session-image-store.js.map +1 -0
  558. package/dist/core/session-role.d.ts +33 -0
  559. package/dist/core/session-role.d.ts.map +1 -0
  560. package/dist/core/session-role.js +58 -0
  561. package/dist/core/session-role.js.map +1 -0
  562. package/dist/core/session-snapshot.d.ts +34 -0
  563. package/dist/core/session-snapshot.d.ts.map +1 -0
  564. package/dist/core/session-snapshot.js +68 -0
  565. package/dist/core/session-snapshot.js.map +1 -0
  566. package/dist/core/session-supervision-runtime.d.ts +31 -0
  567. package/dist/core/session-supervision-runtime.d.ts.map +1 -0
  568. package/dist/core/session-supervision-runtime.js +97 -0
  569. package/dist/core/session-supervision-runtime.js.map +1 -0
  570. package/dist/core/settings-manager.d.ts +51 -7
  571. package/dist/core/settings-manager.d.ts.map +1 -1
  572. package/dist/core/settings-manager.js +168 -82
  573. package/dist/core/settings-manager.js.map +1 -1
  574. package/dist/core/system-prompt-builder.d.ts +12 -0
  575. package/dist/core/system-prompt-builder.d.ts.map +1 -1
  576. package/dist/core/system-prompt-builder.js +6 -0
  577. package/dist/core/system-prompt-builder.js.map +1 -1
  578. package/dist/core/system-prompt.d.ts +14 -1
  579. package/dist/core/system-prompt.d.ts.map +1 -1
  580. package/dist/core/system-prompt.js +20 -3
  581. package/dist/core/system-prompt.js.map +1 -1
  582. package/dist/core/tasks/session-task-state.d.ts +13 -6
  583. package/dist/core/tasks/session-task-state.d.ts.map +1 -1
  584. package/dist/core/tasks/session-task-state.js +20 -22
  585. package/dist/core/tasks/session-task-state.js.map +1 -1
  586. package/dist/core/tasks/task-contract-monitor.d.ts +45 -0
  587. package/dist/core/tasks/task-contract-monitor.d.ts.map +1 -0
  588. package/dist/core/tasks/task-contract-monitor.js +56 -0
  589. package/dist/core/tasks/task-contract-monitor.js.map +1 -0
  590. package/dist/core/tasks/task-projection.d.ts +20 -0
  591. package/dist/core/tasks/task-projection.d.ts.map +1 -0
  592. package/dist/core/tasks/task-projection.js +47 -0
  593. package/dist/core/tasks/task-projection.js.map +1 -0
  594. package/dist/core/tasks/task-state.d.ts +12 -0
  595. package/dist/core/tasks/task-state.d.ts.map +1 -1
  596. package/dist/core/tasks/task-state.js +56 -12
  597. package/dist/core/tasks/task-state.js.map +1 -1
  598. package/dist/core/tool-capability-policy.d.ts +13 -0
  599. package/dist/core/tool-capability-policy.d.ts.map +1 -0
  600. package/dist/core/tool-capability-policy.js +85 -0
  601. package/dist/core/tool-capability-policy.js.map +1 -0
  602. package/dist/core/tool-gate-controller.d.ts.map +1 -1
  603. package/dist/core/tool-gate-controller.js +5 -0
  604. package/dist/core/tool-gate-controller.js.map +1 -1
  605. package/dist/core/tool-protocol-controller.d.ts +91 -0
  606. package/dist/core/tool-protocol-controller.d.ts.map +1 -0
  607. package/dist/core/tool-protocol-controller.js +512 -0
  608. package/dist/core/tool-protocol-controller.js.map +1 -0
  609. package/dist/core/tool-recovery-log-records.d.ts +6 -0
  610. package/dist/core/tool-recovery-log-records.d.ts.map +1 -1
  611. package/dist/core/tool-recovery-log-records.js +13 -31
  612. package/dist/core/tool-recovery-log-records.js.map +1 -1
  613. package/dist/core/tool-selection/promotion.d.ts +54 -0
  614. package/dist/core/tool-selection/promotion.d.ts.map +1 -0
  615. package/dist/core/tool-selection/promotion.js +81 -0
  616. package/dist/core/tool-selection/promotion.js.map +1 -0
  617. package/dist/core/tool-selection/tool-performance-store.d.ts +39 -6
  618. package/dist/core/tool-selection/tool-performance-store.d.ts.map +1 -1
  619. package/dist/core/tool-selection/tool-performance-store.js +153 -110
  620. package/dist/core/tool-selection/tool-performance-store.js.map +1 -1
  621. package/dist/core/tool-selection/tool-selection-controller.d.ts +45 -0
  622. package/dist/core/tool-selection/tool-selection-controller.d.ts.map +1 -1
  623. package/dist/core/tool-selection/tool-selection-controller.js +96 -0
  624. package/dist/core/tool-selection/tool-selection-controller.js.map +1 -1
  625. package/dist/core/tools/ask-question.d.ts +124 -0
  626. package/dist/core/tools/ask-question.d.ts.map +1 -0
  627. package/dist/core/tools/ask-question.js +693 -0
  628. package/dist/core/tools/ask-question.js.map +1 -0
  629. package/dist/core/tools/bash.d.ts +18 -0
  630. package/dist/core/tools/bash.d.ts.map +1 -1
  631. package/dist/core/tools/bash.js +95 -16
  632. package/dist/core/tools/bash.js.map +1 -1
  633. package/dist/core/tools/delegate-status.d.ts +44 -2
  634. package/dist/core/tools/delegate-status.d.ts.map +1 -1
  635. package/dist/core/tools/delegate-status.js +214 -19
  636. package/dist/core/tools/delegate-status.js.map +1 -1
  637. package/dist/core/tools/delegate.d.ts +15 -13
  638. package/dist/core/tools/delegate.d.ts.map +1 -1
  639. package/dist/core/tools/delegate.js +124 -22
  640. package/dist/core/tools/delegate.js.map +1 -1
  641. package/dist/core/tools/extensionify.d.ts.map +1 -1
  642. package/dist/core/tools/extensionify.js +1 -0
  643. package/dist/core/tools/extensionify.js.map +1 -1
  644. package/dist/core/tools/goal.d.ts +94 -3
  645. package/dist/core/tools/goal.d.ts.map +1 -1
  646. package/dist/core/tools/goal.js +165 -15
  647. package/dist/core/tools/goal.js.map +1 -1
  648. package/dist/core/tools/model-fitness.d.ts +7 -0
  649. package/dist/core/tools/model-fitness.d.ts.map +1 -1
  650. package/dist/core/tools/model-fitness.js +4 -4
  651. package/dist/core/tools/model-fitness.js.map +1 -1
  652. package/dist/core/tools/orchestration-panel.d.ts +43 -0
  653. package/dist/core/tools/orchestration-panel.d.ts.map +1 -0
  654. package/dist/core/tools/orchestration-panel.js +168 -0
  655. package/dist/core/tools/orchestration-panel.js.map +1 -0
  656. package/dist/core/tools/run-process.d.ts +26 -0
  657. package/dist/core/tools/run-process.d.ts.map +1 -0
  658. package/dist/core/tools/run-process.js +138 -0
  659. package/dist/core/tools/run-process.js.map +1 -0
  660. package/dist/core/tools/shell-contract-router.d.ts +6 -1
  661. package/dist/core/tools/shell-contract-router.d.ts.map +1 -1
  662. package/dist/core/tools/shell-contract-router.js +23 -2
  663. package/dist/core/tools/shell-contract-router.js.map +1 -1
  664. package/dist/core/tools/shell-session.d.ts +89 -0
  665. package/dist/core/tools/shell-session.d.ts.map +1 -0
  666. package/dist/core/tools/shell-session.js +432 -0
  667. package/dist/core/tools/shell-session.js.map +1 -0
  668. package/dist/core/tools/task-steps.d.ts +6 -0
  669. package/dist/core/tools/task-steps.d.ts.map +1 -1
  670. package/dist/core/tools/task-steps.js +165 -8
  671. package/dist/core/tools/task-steps.js.map +1 -1
  672. package/dist/core/tools/tmux-dispatch.d.ts +84 -0
  673. package/dist/core/tools/tmux-dispatch.d.ts.map +1 -0
  674. package/dist/core/tools/tmux-dispatch.js +91 -0
  675. package/dist/core/tools/tmux-dispatch.js.map +1 -0
  676. package/dist/core/tools/windows-shell-engine.d.ts +42 -0
  677. package/dist/core/tools/windows-shell-engine.d.ts.map +1 -0
  678. package/dist/core/tools/windows-shell-engine.js +151 -0
  679. package/dist/core/tools/windows-shell-engine.js.map +1 -0
  680. package/dist/core/tools/windows-shell-state.d.ts +40 -0
  681. package/dist/core/tools/windows-shell-state.d.ts.map +1 -0
  682. package/dist/core/tools/windows-shell-state.js +59 -0
  683. package/dist/core/tools/windows-shell-state.js.map +1 -0
  684. package/dist/core/tools/worktree-sync.d.ts +24 -0
  685. package/dist/core/tools/worktree-sync.d.ts.map +1 -0
  686. package/dist/core/tools/worktree-sync.js +338 -0
  687. package/dist/core/tools/worktree-sync.js.map +1 -0
  688. package/dist/core/trust-manager.d.ts +4 -1
  689. package/dist/core/trust-manager.d.ts.map +1 -1
  690. package/dist/core/trust-manager.js +20 -2
  691. package/dist/core/trust-manager.js.map +1 -1
  692. package/dist/core/util/atomic-file.d.ts +55 -0
  693. package/dist/core/util/atomic-file.d.ts.map +1 -0
  694. package/dist/core/util/atomic-file.js +255 -0
  695. package/dist/core/util/atomic-file.js.map +1 -0
  696. package/dist/core/util/bounded-jsonl.d.ts +10 -0
  697. package/dist/core/util/bounded-jsonl.d.ts.map +1 -0
  698. package/dist/core/util/bounded-jsonl.js +75 -0
  699. package/dist/core/util/bounded-jsonl.js.map +1 -0
  700. package/dist/core/util/minimatch-cache.d.ts +33 -0
  701. package/dist/core/util/minimatch-cache.d.ts.map +1 -0
  702. package/dist/core/util/minimatch-cache.js +0 -0
  703. package/dist/core/util/minimatch-cache.js.map +1 -0
  704. package/dist/core/util/value-guards.d.ts +5 -0
  705. package/dist/core/util/value-guards.d.ts.map +1 -0
  706. package/dist/core/util/value-guards.js +12 -0
  707. package/dist/core/util/value-guards.js.map +1 -0
  708. package/dist/core/worktree-sync/codes.d.ts +227 -0
  709. package/dist/core/worktree-sync/codes.d.ts.map +1 -0
  710. package/dist/core/worktree-sync/codes.js +14 -0
  711. package/dist/core/worktree-sync/codes.js.map +1 -0
  712. package/dist/core/worktree-sync/git-engine.d.ts +156 -0
  713. package/dist/core/worktree-sync/git-engine.d.ts.map +1 -0
  714. package/dist/core/worktree-sync/git-engine.js +1191 -0
  715. package/dist/core/worktree-sync/git-engine.js.map +1 -0
  716. package/dist/core/worktree-sync/lane-gate.d.ts +75 -0
  717. package/dist/core/worktree-sync/lane-gate.d.ts.map +1 -0
  718. package/dist/core/worktree-sync/lane-gate.js +360 -0
  719. package/dist/core/worktree-sync/lane-gate.js.map +1 -0
  720. package/dist/core/worktree-sync/runtime.d.ts +47 -0
  721. package/dist/core/worktree-sync/runtime.d.ts.map +1 -0
  722. package/dist/core/worktree-sync/runtime.js +96 -0
  723. package/dist/core/worktree-sync/runtime.js.map +1 -0
  724. package/dist/core/worktree-sync/store.d.ts +69 -0
  725. package/dist/core/worktree-sync/store.d.ts.map +1 -0
  726. package/dist/core/worktree-sync/store.js +252 -0
  727. package/dist/core/worktree-sync/store.js.map +1 -0
  728. package/dist/core/worktree-sync/watcher.d.ts +29 -0
  729. package/dist/core/worktree-sync/watcher.d.ts.map +1 -0
  730. package/dist/core/worktree-sync/watcher.js +93 -0
  731. package/dist/core/worktree-sync/watcher.js.map +1 -0
  732. package/dist/index.d.ts +13 -3
  733. package/dist/index.d.ts.map +1 -1
  734. package/dist/index.js +12 -2
  735. package/dist/index.js.map +1 -1
  736. package/dist/main.d.ts.map +1 -1
  737. package/dist/main.js +179 -1
  738. package/dist/main.js.map +1 -1
  739. package/dist/migrations.d.ts +7 -0
  740. package/dist/migrations.d.ts.map +1 -1
  741. package/dist/migrations.js +197 -1
  742. package/dist/migrations.js.map +1 -1
  743. package/dist/modes/interactive/auto-learn-controller.d.ts +16 -1
  744. package/dist/modes/interactive/auto-learn-controller.d.ts.map +1 -1
  745. package/dist/modes/interactive/auto-learn-controller.js +50 -8
  746. package/dist/modes/interactive/auto-learn-controller.js.map +1 -1
  747. package/dist/modes/interactive/clipboard-input.d.ts +7 -1
  748. package/dist/modes/interactive/clipboard-input.d.ts.map +1 -1
  749. package/dist/modes/interactive/clipboard-input.js +44 -6
  750. package/dist/modes/interactive/clipboard-input.js.map +1 -1
  751. package/dist/modes/interactive/components/profile-resource-editor.d.ts.map +1 -1
  752. package/dist/modes/interactive/components/profile-resource-editor.js +23 -1
  753. package/dist/modes/interactive/components/profile-resource-editor.js.map +1 -1
  754. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  755. package/dist/modes/interactive/components/settings-selector.js +2 -2
  756. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  757. package/dist/modes/interactive/config-backup.d.ts.map +1 -1
  758. package/dist/modes/interactive/config-backup.js +5 -4
  759. package/dist/modes/interactive/config-backup.js.map +1 -1
  760. package/dist/modes/interactive/extension-ui-host.d.ts +14 -0
  761. package/dist/modes/interactive/extension-ui-host.d.ts.map +1 -1
  762. package/dist/modes/interactive/extension-ui-host.js +76 -15
  763. package/dist/modes/interactive/extension-ui-host.js.map +1 -1
  764. package/dist/modes/interactive/interactive-mode.d.ts +4 -0
  765. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  766. package/dist/modes/interactive/interactive-mode.js +67 -1
  767. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  768. package/dist/modes/interactive/key-handlers.d.ts.map +1 -1
  769. package/dist/modes/interactive/key-handlers.js +1 -1
  770. package/dist/modes/interactive/key-handlers.js.map +1 -1
  771. package/dist/modes/interactive/local-model-commands.d.ts +43 -0
  772. package/dist/modes/interactive/local-model-commands.d.ts.map +1 -1
  773. package/dist/modes/interactive/local-model-commands.js +290 -3
  774. package/dist/modes/interactive/local-model-commands.js.map +1 -1
  775. package/dist/modes/interactive/profile-menu-controller.d.ts.map +1 -1
  776. package/dist/modes/interactive/profile-menu-controller.js +7 -7
  777. package/dist/modes/interactive/profile-menu-controller.js.map +1 -1
  778. package/dist/modes/interactive/report-commands.d.ts.map +1 -1
  779. package/dist/modes/interactive/report-commands.js +21 -0
  780. package/dist/modes/interactive/report-commands.js.map +1 -1
  781. package/dist/modes/interactive/session-flow-commands.d.ts +17 -2
  782. package/dist/modes/interactive/session-flow-commands.d.ts.map +1 -1
  783. package/dist/modes/interactive/session-flow-commands.js +74 -21
  784. package/dist/modes/interactive/session-flow-commands.js.map +1 -1
  785. package/dist/modes/interactive/session-io-commands.d.ts.map +1 -1
  786. package/dist/modes/interactive/session-io-commands.js +16 -6
  787. package/dist/modes/interactive/session-io-commands.js.map +1 -1
  788. package/dist/modes/interactive/session-replacement-errors.d.ts +7 -0
  789. package/dist/modes/interactive/session-replacement-errors.d.ts.map +1 -0
  790. package/dist/modes/interactive/session-replacement-errors.js +15 -0
  791. package/dist/modes/interactive/session-replacement-errors.js.map +1 -0
  792. package/dist/modes/interactive/startup-checks.d.ts.map +1 -1
  793. package/dist/modes/interactive/startup-checks.js +1 -1
  794. package/dist/modes/interactive/startup-checks.js.map +1 -1
  795. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  796. package/dist/modes/rpc/rpc-mode.js +82 -23
  797. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  798. package/dist/modes/rpc/rpc-types.d.ts +15 -0
  799. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  800. package/dist/modes/rpc/rpc-types.js +138 -1
  801. package/dist/modes/rpc/rpc-types.js.map +1 -1
  802. package/dist/utils/clipboard-image.d.ts.map +1 -1
  803. package/dist/utils/clipboard-image.js +2 -13
  804. package/dist/utils/clipboard-image.js.map +1 -1
  805. package/dist/utils/clipboard-native.d.ts +1 -0
  806. package/dist/utils/clipboard-native.d.ts.map +1 -1
  807. package/dist/utils/clipboard-native.js.map +1 -1
  808. package/dist/utils/clipboard.d.ts +1 -0
  809. package/dist/utils/clipboard.d.ts.map +1 -1
  810. package/dist/utils/clipboard.js +52 -1
  811. package/dist/utils/clipboard.js.map +1 -1
  812. package/dist/utils/fs-watch.d.ts +11 -0
  813. package/dist/utils/fs-watch.d.ts.map +1 -1
  814. package/dist/utils/fs-watch.js +20 -2
  815. package/dist/utils/fs-watch.js.map +1 -1
  816. package/dist/utils/highlight-js-languages.d.ts +4 -0
  817. package/dist/utils/highlight-js-languages.d.ts.map +1 -0
  818. package/dist/utils/highlight-js-languages.js +573 -0
  819. package/dist/utils/highlight-js-languages.js.map +1 -0
  820. package/dist/utils/platform.d.ts +3 -0
  821. package/dist/utils/platform.d.ts.map +1 -0
  822. package/dist/utils/platform.js +8 -0
  823. package/dist/utils/platform.js.map +1 -0
  824. package/dist/utils/shell.d.ts +7 -1
  825. package/dist/utils/shell.d.ts.map +1 -1
  826. package/dist/utils/shell.js +21 -6
  827. package/dist/utils/shell.js.map +1 -1
  828. package/dist/utils/syntax-highlight.d.ts.map +1 -1
  829. package/dist/utils/syntax-highlight.js +53 -5
  830. package/dist/utils/syntax-highlight.js.map +1 -1
  831. package/dist/utils/tools-manager.d.ts.map +1 -1
  832. package/dist/utils/tools-manager.js +112 -1
  833. package/dist/utils/tools-manager.js.map +1 -1
  834. package/dist/utils/work-directory.d.ts +11 -0
  835. package/dist/utils/work-directory.d.ts.map +1 -1
  836. package/dist/utils/work-directory.js +30 -9
  837. package/dist/utils/work-directory.js.map +1 -1
  838. package/docs/UI_POLISH_ORCHESTRATION.md +44 -0
  839. package/docs/UI_QUALITY_ORCHESTRATION.md +30 -0
  840. package/docs/docs.json +4 -0
  841. package/docs/extensions.md +62 -2
  842. package/docs/harness-architecture.md +156 -0
  843. package/docs/keybindings.md +11 -1
  844. package/docs/process-matrix.md +153 -0
  845. package/docs/rpc.md +45 -2
  846. package/docs/sessions.md +15 -0
  847. package/docs/settings.md +128 -11
  848. package/docs/task-steps.md +8 -0
  849. package/docs/telemetry.md +19 -0
  850. package/docs/tmux-agent-manager.md +92 -2
  851. package/docs/ui-reference/README.md +9 -0
  852. package/docs/ui-reference/orchestration-after.txt +7 -0
  853. package/docs/ui-reference/orchestration-before.txt +7 -0
  854. package/docs/ui-reference/orchestration-reference.txt +6 -0
  855. package/docs/usage.md +14 -2
  856. package/docs/windows.md +52 -3
  857. package/docs/work-directory.md +42 -2
  858. package/docs/worktree-sync.md +250 -0
  859. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  860. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  861. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  862. package/examples/extensions/question.ts +34 -245
  863. package/examples/extensions/questionnaire.ts +41 -407
  864. package/examples/extensions/sandbox/package-lock.json +2 -2
  865. package/examples/extensions/sandbox/package.json +1 -1
  866. package/examples/extensions/with-deps/package-lock.json +2 -2
  867. package/examples/extensions/with-deps/package.json +1 -1
  868. package/npm-shrinkwrap.json +12 -12
  869. package/package.json +10 -4
  870. package/dist/core/delegation/session-worker-result.d.ts +0 -16
  871. package/dist/core/delegation/session-worker-result.d.ts.map +0 -1
  872. package/dist/core/delegation/session-worker-result.js +0 -53
  873. package/dist/core/delegation/session-worker-result.js.map +0 -1
  874. package/dist/core/delegation/worker-result.d.ts +0 -15
  875. package/dist/core/delegation/worker-result.d.ts.map +0 -1
  876. package/dist/core/delegation/worker-result.js +0 -161
  877. package/dist/core/delegation/worker-result.js.map +0 -1
  878. package/dist/core/telemetry.d.ts.map +0 -1
  879. package/dist/core/telemetry.js.map +0 -1
  880. package/docs/integration-sweep-builder-blueprint-2026-07-09.md +0 -365
  881. package/docs/integration-sweep-resume-2026-07-09.md +0 -407
@@ -1 +1 @@
1
- {"version":3,"file":"fitness-store.d.ts","sourceRoot":"","sources":["../../../src/core/models/fitness-store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAEvE;;;;;;GAMG;AAEH,MAAM,WAAW,eAAe;IAC/B,8DAA8D;IAC9D,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,sBAAsB,IAAI,eAAe,CAWxD;AAED,MAAM,WAAW,mBAAmB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,kBAAkB,CAAC;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,eAAe,CAAC;CACtB;AAQD,qBAAa,YAAY;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAwB;IAEpD,YAAY,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,eAAe,CAAA;KAAE,EAG9E;IAED,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,eAAe,CAAA;KAAE,GAAG,YAAY,CAEpG;IAED,OAAO,CAAC,IAAI;IAaZ,iGAAiG;IACjG,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,mBAAmB,CAQhF;IAED,yFAAyF;IACzF,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAO1B;IAED,qEAAqE;IACrE,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,mBAAmB,EAAE,CAGjD;IAED,4EAA4E;IAC5E,MAAM,IAAI,mBAAmB,EAAE,CAG9B;CACD","sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { cpus, totalmem } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport type { ModelFitnessReport } from \"../research/model-fitness.ts\";\n\n/**\n * Durable, HOST-KEYED storage for model fitness reports. Fitness is a property of a model ON a\n * host (tok/s and latency-driven failures do not travel between machines), so reports are keyed\n * by a hardware fingerprint: the same model can be \"the heavy lifter\" on one machine and\n * \"waiting for better hardware\" on another, and pi remembers both without confusing them —\n * including when settings/dotfiles are synced across machines.\n */\n\nexport interface HostFingerprint {\n\t/** Stable, human-readable id derived from the specs below. */\n\tid: string;\n\tcpu: string;\n\tcores: number;\n\ttotalMemGb: number;\n}\n\nexport function currentHostFingerprint(): HostFingerprint {\n\tconst cpuList = cpus();\n\tconst cpu = (cpuList[0]?.model ?? \"unknown-cpu\").trim();\n\tconst cores = Math.max(1, cpuList.length);\n\tconst totalMemGb = Math.round(totalmem() / 1024 ** 3);\n\tconst id = `${cpu\n\t\t.toLowerCase()\n\t\t.replace(/[^a-z0-9]+/g, \"-\")\n\t\t.replace(/^-+|-+$/g, \"\")\n\t\t.slice(0, 48)}-${cores}c-${totalMemGb}g`;\n\treturn { id, cpu, cores, totalMemGb };\n}\n\nexport interface StoredFitnessReport {\n\tmodel: string;\n\treport: ModelFitnessReport;\n\tat: string;\n\thost: HostFingerprint;\n}\n\ninterface FitnessStoreFile {\n\tversion: 1;\n\t/** hostId -> modelRef -> latest stored report. */\n\thosts: Record<string, Record<string, StoredFitnessReport>>;\n}\n\nexport class FitnessStore {\n\tprivate readonly filePath: string;\n\tprivate readonly fingerprint: () => HostFingerprint;\n\n\tconstructor(filePath: string, options?: { fingerprint?: () => HostFingerprint }) {\n\t\tthis.filePath = filePath;\n\t\tthis.fingerprint = options?.fingerprint ?? currentHostFingerprint;\n\t}\n\n\tstatic forAgentDir(agentDir: string, options?: { fingerprint?: () => HostFingerprint }): FitnessStore {\n\t\treturn new FitnessStore(join(agentDir, \"state\", \"model-fitness.json\"), options);\n\t}\n\n\tprivate load(): FitnessStoreFile {\n\t\ttry {\n\t\t\tif (!existsSync(this.filePath)) return { version: 1, hosts: {} };\n\t\t\tconst parsed = JSON.parse(readFileSync(this.filePath, \"utf-8\")) as FitnessStoreFile;\n\t\t\tif (parsed && parsed.version === 1 && parsed.hosts && typeof parsed.hosts === \"object\") {\n\t\t\t\treturn parsed;\n\t\t\t}\n\t\t} catch {\n\t\t\t// Unreadable/corrupt store: start fresh in memory; the next save rewrites the file.\n\t\t}\n\t\treturn { version: 1, hosts: {} };\n\t}\n\n\t/** Persist the latest report for a model on the CURRENT host. Best-effort, returns the entry. */\n\tsave(model: string, report: ModelFitnessReport, at?: string): StoredFitnessReport {\n\t\tconst host = this.fingerprint();\n\t\tconst entry: StoredFitnessReport = { model, report, at: at ?? new Date().toISOString(), host };\n\t\tconst file = this.load();\n\t\tfile.hosts[host.id] = { ...(file.hosts[host.id] ?? {}), [model]: entry };\n\t\tmkdirSync(dirname(this.filePath), { recursive: true });\n\t\twriteFileSync(this.filePath, `${JSON.stringify(file, null, \"\\t\")}\\n`, \"utf-8\");\n\t\treturn entry;\n\t}\n\n\t/** Drop a model's report for the CURRENT host (uninstall cleanup). No-op when absent. */\n\tremove(model: string): void {\n\t\tconst host = this.fingerprint();\n\t\tconst file = this.load();\n\t\tif (!file.hosts[host.id]?.[model]) return;\n\t\tdelete file.hosts[host.id][model];\n\t\tmkdirSync(dirname(this.filePath), { recursive: true });\n\t\twriteFileSync(this.filePath, `${JSON.stringify(file, null, \"\\t\")}\\n`, \"utf-8\");\n\t}\n\n\t/** Reports for the current host (default) or an explicit host id. */\n\tgetForHost(hostId?: string): StoredFitnessReport[] {\n\t\tconst file = this.load();\n\t\treturn Object.values(file.hosts[hostId ?? this.fingerprint().id] ?? {});\n\t}\n\n\t/** Every stored report across all hosts (for cross-machine comparisons). */\n\tgetAll(): StoredFitnessReport[] {\n\t\tconst file = this.load();\n\t\treturn Object.values(file.hosts).flatMap((models) => Object.values(models));\n\t}\n}\n"]}
1
+ {"version":3,"file":"fitness-store.d.ts","sourceRoot":"","sources":["../../../src/core/models/fitness-store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAGvE,OAAO,EAAE,KAAK,eAAe,EAAqC,MAAM,uBAAuB,CAAC;AAEhG;;;;;;GAMG;AAEH,MAAM,WAAW,mBAAmB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,kBAAkB,CAAC;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,eAAe,CAAC;CACtB;AAyED,qBAAa,YAAY;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsD;IAE9E,YAAY,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,eAAe,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,EAQlG;IAED,MAAM,CAAC,WAAW,CACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,eAAe,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GACnE,YAAY,CAEd;IAED,iGAAiG;IACjG,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,mBAAmB,CAShF;IAED,yFAAyF;IACzF,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAS1B;IAED,qEAAqE;IACrE,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,mBAAmB,EAAE,CAEjD;IAED,4EAA4E;IAC5E,MAAM,IAAI,mBAAmB,EAAE,CAE9B;CACD","sourcesContent":["import { stateFile } from \"../agent-paths.ts\";\nimport type { ModelFitnessReport } from \"../research/model-fitness.ts\";\nimport { isWorkerSession } from \"../session-role.ts\";\nimport { isPlainRecord } from \"../util/value-guards.ts\";\nimport { type HostFingerprint, HostStateStore, isHostFingerprint } from \"./host-state-store.ts\";\n\n/**\n * Durable, HOST-KEYED storage for model fitness reports. Fitness is a property of a model ON a\n * host (tok/s and latency-driven failures do not travel between machines), so reports are keyed\n * by a hardware fingerprint: the same model can be \"the heavy lifter\" on one machine and\n * \"waiting for better hardware\" on another, and pi remembers both without confusing them —\n * including when settings/dotfiles are synced across machines.\n */\n\nexport interface StoredFitnessReport {\n\tmodel: string;\n\treport: ModelFitnessReport;\n\tat: string;\n\thost: HostFingerprint;\n}\n\nfunction isFiniteNumber(value: unknown): value is number {\n\treturn typeof value === \"number\" && Number.isFinite(value);\n}\n\nfunction isLaneScore(value: unknown): boolean {\n\treturn (\n\t\tisPlainRecord(value) &&\n\t\tisFiniteNumber(value.succeeded) &&\n\t\tisFiniteNumber(value.total) &&\n\t\tArray.isArray(value.outcomes) &&\n\t\tvalue.outcomes.every((outcome) => typeof outcome === \"string\") &&\n\t\tisFiniteNumber(value.meanMs) &&\n\t\t(value.tokensPerSecond === undefined || isFiniteNumber(value.tokensPerSecond))\n\t);\n}\n\nfunction isFitnessReport(value: unknown): value is ModelFitnessReport {\n\treturn (\n\t\tisPlainRecord(value) &&\n\t\tisFiniteNumber(value.trials) &&\n\t\t(value.tokensPerSecond === undefined || isFiniteNumber(value.tokensPerSecond)) &&\n\t\tisLaneScore(value.research) &&\n\t\tisLaneScore(value.worker) &&\n\t\tisLaneScore(value.search) &&\n\t\tisLaneScore(value.toolCall) &&\n\t\tisLaneScore(value.digest) &&\n\t\tisPlainRecord(value.judge) &&\n\t\tisFiniteNumber(value.judge.parsed) &&\n\t\tisFiniteNumber(value.judge.planningElevated) &&\n\t\tisFiniteNumber(value.judge.planningTotal) &&\n\t\tisFiniteNumber(value.judge.trivialCheap) &&\n\t\tisFiniteNumber(value.judge.trivialTotal) &&\n\t\tisFiniteNumber(value.judge.total) &&\n\t\tArray.isArray(value.judge.outcomes) &&\n\t\tvalue.judge.outcomes.every((outcome) => typeof outcome === \"string\") &&\n\t\tisFiniteNumber(value.judge.meanMs) &&\n\t\t(value.judge.tokensPerSecond === undefined || isFiniteNumber(value.judge.tokensPerSecond)) &&\n\t\t(value.capacity === undefined ||\n\t\t\t(isPlainRecord(value.capacity) &&\n\t\t\t\tisFiniteNumber(value.capacity.registeredContextWindow) &&\n\t\t\t\tisFiniteNumber(value.capacity.servedContextWindow) &&\n\t\t\t\tArray.isArray(value.capacity.outcomes) &&\n\t\t\t\tvalue.capacity.outcomes.every((outcome) => typeof outcome === \"string\") &&\n\t\t\t\tisFiniteNumber(value.capacity.meanMs))) &&\n\t\tisFiniteNumber(value.totalCostUsd)\n\t);\n}\n\nfunction parseFitnessHost(value: unknown, hostId: string): Record<string, StoredFitnessReport> | undefined {\n\tif (!isPlainRecord(value)) return undefined;\n\tconst reports: Record<string, StoredFitnessReport> = {};\n\tfor (const [model, candidate] of Object.entries(value)) {\n\t\tif (\n\t\t\t!isPlainRecord(candidate) ||\n\t\t\tcandidate.model !== model ||\n\t\t\ttypeof candidate.at !== \"string\" ||\n\t\t\t!isHostFingerprint(candidate.host) ||\n\t\t\tcandidate.host.id !== hostId ||\n\t\t\t!isFitnessReport(candidate.report)\n\t\t)\n\t\t\tcontinue;\n\t\treports[model] = {\n\t\t\tmodel,\n\t\t\treport: candidate.report,\n\t\t\tat: candidate.at,\n\t\t\thost: candidate.host,\n\t\t};\n\t}\n\treturn reports;\n}\n\nexport class FitnessStore {\n\tprivate readonly storage: HostStateStore<Record<string, StoredFitnessReport>>;\n\n\tconstructor(filePath: string, options?: { fingerprint?: () => HostFingerprint; readOnly?: boolean }) {\n\t\tthis.storage = new HostStateStore({\n\t\t\tfilePath,\n\t\t\tversion: 1,\n\t\t\tfingerprint: options?.fingerprint,\n\t\t\treadOnly: options?.readOnly ?? isWorkerSession(),\n\t\t\tparseHost: parseFitnessHost,\n\t\t});\n\t}\n\n\tstatic forAgentDir(\n\t\tagentDir: string,\n\t\toptions?: { fingerprint?: () => HostFingerprint; readOnly?: boolean },\n\t): FitnessStore {\n\t\treturn new FitnessStore(stateFile(agentDir, \"model-fitness.json\"), options);\n\t}\n\n\t/** Persist the latest report for a model on the CURRENT host. Best-effort, returns the entry. */\n\tsave(model: string, report: ModelFitnessReport, at?: string): StoredFitnessReport {\n\t\treturn this.storage.mutateCurrentHost(\n\t\t\t() => ({}),\n\t\t\t(reports, host) => {\n\t\t\t\tconst entry: StoredFitnessReport = { model, report, at: at ?? new Date().toISOString(), host };\n\t\t\t\treports[model] = entry;\n\t\t\t\treturn { result: entry, changed: true };\n\t\t\t},\n\t\t);\n\t}\n\n\t/** Drop a model's report for the CURRENT host (uninstall cleanup). No-op when absent. */\n\tremove(model: string): void {\n\t\tthis.storage.mutateCurrentHost(\n\t\t\t() => ({}),\n\t\t\t(reports) => {\n\t\t\t\tif (!reports[model]) return { result: undefined, changed: false };\n\t\t\t\tdelete reports[model];\n\t\t\t\treturn { result: undefined, changed: true };\n\t\t\t},\n\t\t);\n\t}\n\n\t/** Reports for the current host (default) or an explicit host id. */\n\tgetForHost(hostId?: string): StoredFitnessReport[] {\n\t\treturn Object.values(this.storage.getHost(hostId) ?? {});\n\t}\n\n\t/** Every stored report across all hosts (for cross-machine comparisons). */\n\tgetAll(): StoredFitnessReport[] {\n\t\treturn this.storage.getAllHosts().flatMap((reports) => Object.values(reports));\n\t}\n}\n"]}
@@ -1,71 +1,107 @@
1
- import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
- import { cpus, totalmem } from "node:os";
3
- import { dirname, join } from "node:path";
4
- export function currentHostFingerprint() {
5
- const cpuList = cpus();
6
- const cpu = (cpuList[0]?.model ?? "unknown-cpu").trim();
7
- const cores = Math.max(1, cpuList.length);
8
- const totalMemGb = Math.round(totalmem() / 1024 ** 3);
9
- const id = `${cpu
10
- .toLowerCase()
11
- .replace(/[^a-z0-9]+/g, "-")
12
- .replace(/^-+|-+$/g, "")
13
- .slice(0, 48)}-${cores}c-${totalMemGb}g`;
14
- return { id, cpu, cores, totalMemGb };
1
+ import { stateFile } from "../agent-paths.js";
2
+ import { isWorkerSession } from "../session-role.js";
3
+ import { isPlainRecord } from "../util/value-guards.js";
4
+ import { HostStateStore, isHostFingerprint } from "./host-state-store.js";
5
+ function isFiniteNumber(value) {
6
+ return typeof value === "number" && Number.isFinite(value);
7
+ }
8
+ function isLaneScore(value) {
9
+ return (isPlainRecord(value) &&
10
+ isFiniteNumber(value.succeeded) &&
11
+ isFiniteNumber(value.total) &&
12
+ Array.isArray(value.outcomes) &&
13
+ value.outcomes.every((outcome) => typeof outcome === "string") &&
14
+ isFiniteNumber(value.meanMs) &&
15
+ (value.tokensPerSecond === undefined || isFiniteNumber(value.tokensPerSecond)));
16
+ }
17
+ function isFitnessReport(value) {
18
+ return (isPlainRecord(value) &&
19
+ isFiniteNumber(value.trials) &&
20
+ (value.tokensPerSecond === undefined || isFiniteNumber(value.tokensPerSecond)) &&
21
+ isLaneScore(value.research) &&
22
+ isLaneScore(value.worker) &&
23
+ isLaneScore(value.search) &&
24
+ isLaneScore(value.toolCall) &&
25
+ isLaneScore(value.digest) &&
26
+ isPlainRecord(value.judge) &&
27
+ isFiniteNumber(value.judge.parsed) &&
28
+ isFiniteNumber(value.judge.planningElevated) &&
29
+ isFiniteNumber(value.judge.planningTotal) &&
30
+ isFiniteNumber(value.judge.trivialCheap) &&
31
+ isFiniteNumber(value.judge.trivialTotal) &&
32
+ isFiniteNumber(value.judge.total) &&
33
+ Array.isArray(value.judge.outcomes) &&
34
+ value.judge.outcomes.every((outcome) => typeof outcome === "string") &&
35
+ isFiniteNumber(value.judge.meanMs) &&
36
+ (value.judge.tokensPerSecond === undefined || isFiniteNumber(value.judge.tokensPerSecond)) &&
37
+ (value.capacity === undefined ||
38
+ (isPlainRecord(value.capacity) &&
39
+ isFiniteNumber(value.capacity.registeredContextWindow) &&
40
+ isFiniteNumber(value.capacity.servedContextWindow) &&
41
+ Array.isArray(value.capacity.outcomes) &&
42
+ value.capacity.outcomes.every((outcome) => typeof outcome === "string") &&
43
+ isFiniteNumber(value.capacity.meanMs))) &&
44
+ isFiniteNumber(value.totalCostUsd));
45
+ }
46
+ function parseFitnessHost(value, hostId) {
47
+ if (!isPlainRecord(value))
48
+ return undefined;
49
+ const reports = {};
50
+ for (const [model, candidate] of Object.entries(value)) {
51
+ if (!isPlainRecord(candidate) ||
52
+ candidate.model !== model ||
53
+ typeof candidate.at !== "string" ||
54
+ !isHostFingerprint(candidate.host) ||
55
+ candidate.host.id !== hostId ||
56
+ !isFitnessReport(candidate.report))
57
+ continue;
58
+ reports[model] = {
59
+ model,
60
+ report: candidate.report,
61
+ at: candidate.at,
62
+ host: candidate.host,
63
+ };
64
+ }
65
+ return reports;
15
66
  }
16
67
  export class FitnessStore {
17
- filePath;
18
- fingerprint;
68
+ storage;
19
69
  constructor(filePath, options) {
20
- this.filePath = filePath;
21
- this.fingerprint = options?.fingerprint ?? currentHostFingerprint;
70
+ this.storage = new HostStateStore({
71
+ filePath,
72
+ version: 1,
73
+ fingerprint: options?.fingerprint,
74
+ readOnly: options?.readOnly ?? isWorkerSession(),
75
+ parseHost: parseFitnessHost,
76
+ });
22
77
  }
23
78
  static forAgentDir(agentDir, options) {
24
- return new FitnessStore(join(agentDir, "state", "model-fitness.json"), options);
25
- }
26
- load() {
27
- try {
28
- if (!existsSync(this.filePath))
29
- return { version: 1, hosts: {} };
30
- const parsed = JSON.parse(readFileSync(this.filePath, "utf-8"));
31
- if (parsed && parsed.version === 1 && parsed.hosts && typeof parsed.hosts === "object") {
32
- return parsed;
33
- }
34
- }
35
- catch {
36
- // Unreadable/corrupt store: start fresh in memory; the next save rewrites the file.
37
- }
38
- return { version: 1, hosts: {} };
79
+ return new FitnessStore(stateFile(agentDir, "model-fitness.json"), options);
39
80
  }
40
81
  /** Persist the latest report for a model on the CURRENT host. Best-effort, returns the entry. */
41
82
  save(model, report, at) {
42
- const host = this.fingerprint();
43
- const entry = { model, report, at: at ?? new Date().toISOString(), host };
44
- const file = this.load();
45
- file.hosts[host.id] = { ...(file.hosts[host.id] ?? {}), [model]: entry };
46
- mkdirSync(dirname(this.filePath), { recursive: true });
47
- writeFileSync(this.filePath, `${JSON.stringify(file, null, "\t")}\n`, "utf-8");
48
- return entry;
83
+ return this.storage.mutateCurrentHost(() => ({}), (reports, host) => {
84
+ const entry = { model, report, at: at ?? new Date().toISOString(), host };
85
+ reports[model] = entry;
86
+ return { result: entry, changed: true };
87
+ });
49
88
  }
50
89
  /** Drop a model's report for the CURRENT host (uninstall cleanup). No-op when absent. */
51
90
  remove(model) {
52
- const host = this.fingerprint();
53
- const file = this.load();
54
- if (!file.hosts[host.id]?.[model])
55
- return;
56
- delete file.hosts[host.id][model];
57
- mkdirSync(dirname(this.filePath), { recursive: true });
58
- writeFileSync(this.filePath, `${JSON.stringify(file, null, "\t")}\n`, "utf-8");
91
+ this.storage.mutateCurrentHost(() => ({}), (reports) => {
92
+ if (!reports[model])
93
+ return { result: undefined, changed: false };
94
+ delete reports[model];
95
+ return { result: undefined, changed: true };
96
+ });
59
97
  }
60
98
  /** Reports for the current host (default) or an explicit host id. */
61
99
  getForHost(hostId) {
62
- const file = this.load();
63
- return Object.values(file.hosts[hostId ?? this.fingerprint().id] ?? {});
100
+ return Object.values(this.storage.getHost(hostId) ?? {});
64
101
  }
65
102
  /** Every stored report across all hosts (for cross-machine comparisons). */
66
103
  getAll() {
67
- const file = this.load();
68
- return Object.values(file.hosts).flatMap((models) => Object.values(models));
104
+ return this.storage.getAllHosts().flatMap((reports) => Object.values(reports));
69
105
  }
70
106
  }
71
107
  //# sourceMappingURL=fitness-store.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fitness-store.js","sourceRoot":"","sources":["../../../src/core/models/fitness-store.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { cpus, totalmem } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport type { ModelFitnessReport } from \"../research/model-fitness.ts\";\n\n/**\n * Durable, HOST-KEYED storage for model fitness reports. Fitness is a property of a model ON a\n * host (tok/s and latency-driven failures do not travel between machines), so reports are keyed\n * by a hardware fingerprint: the same model can be \"the heavy lifter\" on one machine and\n * \"waiting for better hardware\" on another, and pi remembers both without confusing them —\n * including when settings/dotfiles are synced across machines.\n */\n\nexport interface HostFingerprint {\n\t/** Stable, human-readable id derived from the specs below. */\n\tid: string;\n\tcpu: string;\n\tcores: number;\n\ttotalMemGb: number;\n}\n\nexport function currentHostFingerprint(): HostFingerprint {\n\tconst cpuList = cpus();\n\tconst cpu = (cpuList[0]?.model ?? \"unknown-cpu\").trim();\n\tconst cores = Math.max(1, cpuList.length);\n\tconst totalMemGb = Math.round(totalmem() / 1024 ** 3);\n\tconst id = `${cpu\n\t\t.toLowerCase()\n\t\t.replace(/[^a-z0-9]+/g, \"-\")\n\t\t.replace(/^-+|-+$/g, \"\")\n\t\t.slice(0, 48)}-${cores}c-${totalMemGb}g`;\n\treturn { id, cpu, cores, totalMemGb };\n}\n\nexport interface StoredFitnessReport {\n\tmodel: string;\n\treport: ModelFitnessReport;\n\tat: string;\n\thost: HostFingerprint;\n}\n\ninterface FitnessStoreFile {\n\tversion: 1;\n\t/** hostId -> modelRef -> latest stored report. */\n\thosts: Record<string, Record<string, StoredFitnessReport>>;\n}\n\nexport class FitnessStore {\n\tprivate readonly filePath: string;\n\tprivate readonly fingerprint: () => HostFingerprint;\n\n\tconstructor(filePath: string, options?: { fingerprint?: () => HostFingerprint }) {\n\t\tthis.filePath = filePath;\n\t\tthis.fingerprint = options?.fingerprint ?? currentHostFingerprint;\n\t}\n\n\tstatic forAgentDir(agentDir: string, options?: { fingerprint?: () => HostFingerprint }): FitnessStore {\n\t\treturn new FitnessStore(join(agentDir, \"state\", \"model-fitness.json\"), options);\n\t}\n\n\tprivate load(): FitnessStoreFile {\n\t\ttry {\n\t\t\tif (!existsSync(this.filePath)) return { version: 1, hosts: {} };\n\t\t\tconst parsed = JSON.parse(readFileSync(this.filePath, \"utf-8\")) as FitnessStoreFile;\n\t\t\tif (parsed && parsed.version === 1 && parsed.hosts && typeof parsed.hosts === \"object\") {\n\t\t\t\treturn parsed;\n\t\t\t}\n\t\t} catch {\n\t\t\t// Unreadable/corrupt store: start fresh in memory; the next save rewrites the file.\n\t\t}\n\t\treturn { version: 1, hosts: {} };\n\t}\n\n\t/** Persist the latest report for a model on the CURRENT host. Best-effort, returns the entry. */\n\tsave(model: string, report: ModelFitnessReport, at?: string): StoredFitnessReport {\n\t\tconst host = this.fingerprint();\n\t\tconst entry: StoredFitnessReport = { model, report, at: at ?? new Date().toISOString(), host };\n\t\tconst file = this.load();\n\t\tfile.hosts[host.id] = { ...(file.hosts[host.id] ?? {}), [model]: entry };\n\t\tmkdirSync(dirname(this.filePath), { recursive: true });\n\t\twriteFileSync(this.filePath, `${JSON.stringify(file, null, \"\\t\")}\\n`, \"utf-8\");\n\t\treturn entry;\n\t}\n\n\t/** Drop a model's report for the CURRENT host (uninstall cleanup). No-op when absent. */\n\tremove(model: string): void {\n\t\tconst host = this.fingerprint();\n\t\tconst file = this.load();\n\t\tif (!file.hosts[host.id]?.[model]) return;\n\t\tdelete file.hosts[host.id][model];\n\t\tmkdirSync(dirname(this.filePath), { recursive: true });\n\t\twriteFileSync(this.filePath, `${JSON.stringify(file, null, \"\\t\")}\\n`, \"utf-8\");\n\t}\n\n\t/** Reports for the current host (default) or an explicit host id. */\n\tgetForHost(hostId?: string): StoredFitnessReport[] {\n\t\tconst file = this.load();\n\t\treturn Object.values(file.hosts[hostId ?? this.fingerprint().id] ?? {});\n\t}\n\n\t/** Every stored report across all hosts (for cross-machine comparisons). */\n\tgetAll(): StoredFitnessReport[] {\n\t\tconst file = this.load();\n\t\treturn Object.values(file.hosts).flatMap((models) => Object.values(models));\n\t}\n}\n"]}
1
+ {"version":3,"file":"fitness-store.js","sourceRoot":"","sources":["../../../src/core/models/fitness-store.ts"],"names":[],"mappings":"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","sourcesContent":["import { stateFile } from \"../agent-paths.ts\";\nimport type { ModelFitnessReport } from \"../research/model-fitness.ts\";\nimport { isWorkerSession } from \"../session-role.ts\";\nimport { isPlainRecord } from \"../util/value-guards.ts\";\nimport { type HostFingerprint, HostStateStore, isHostFingerprint } from \"./host-state-store.ts\";\n\n/**\n * Durable, HOST-KEYED storage for model fitness reports. Fitness is a property of a model ON a\n * host (tok/s and latency-driven failures do not travel between machines), so reports are keyed\n * by a hardware fingerprint: the same model can be \"the heavy lifter\" on one machine and\n * \"waiting for better hardware\" on another, and pi remembers both without confusing them —\n * including when settings/dotfiles are synced across machines.\n */\n\nexport interface StoredFitnessReport {\n\tmodel: string;\n\treport: ModelFitnessReport;\n\tat: string;\n\thost: HostFingerprint;\n}\n\nfunction isFiniteNumber(value: unknown): value is number {\n\treturn typeof value === \"number\" && Number.isFinite(value);\n}\n\nfunction isLaneScore(value: unknown): boolean {\n\treturn (\n\t\tisPlainRecord(value) &&\n\t\tisFiniteNumber(value.succeeded) &&\n\t\tisFiniteNumber(value.total) &&\n\t\tArray.isArray(value.outcomes) &&\n\t\tvalue.outcomes.every((outcome) => typeof outcome === \"string\") &&\n\t\tisFiniteNumber(value.meanMs) &&\n\t\t(value.tokensPerSecond === undefined || isFiniteNumber(value.tokensPerSecond))\n\t);\n}\n\nfunction isFitnessReport(value: unknown): value is ModelFitnessReport {\n\treturn (\n\t\tisPlainRecord(value) &&\n\t\tisFiniteNumber(value.trials) &&\n\t\t(value.tokensPerSecond === undefined || isFiniteNumber(value.tokensPerSecond)) &&\n\t\tisLaneScore(value.research) &&\n\t\tisLaneScore(value.worker) &&\n\t\tisLaneScore(value.search) &&\n\t\tisLaneScore(value.toolCall) &&\n\t\tisLaneScore(value.digest) &&\n\t\tisPlainRecord(value.judge) &&\n\t\tisFiniteNumber(value.judge.parsed) &&\n\t\tisFiniteNumber(value.judge.planningElevated) &&\n\t\tisFiniteNumber(value.judge.planningTotal) &&\n\t\tisFiniteNumber(value.judge.trivialCheap) &&\n\t\tisFiniteNumber(value.judge.trivialTotal) &&\n\t\tisFiniteNumber(value.judge.total) &&\n\t\tArray.isArray(value.judge.outcomes) &&\n\t\tvalue.judge.outcomes.every((outcome) => typeof outcome === \"string\") &&\n\t\tisFiniteNumber(value.judge.meanMs) &&\n\t\t(value.judge.tokensPerSecond === undefined || isFiniteNumber(value.judge.tokensPerSecond)) &&\n\t\t(value.capacity === undefined ||\n\t\t\t(isPlainRecord(value.capacity) &&\n\t\t\t\tisFiniteNumber(value.capacity.registeredContextWindow) &&\n\t\t\t\tisFiniteNumber(value.capacity.servedContextWindow) &&\n\t\t\t\tArray.isArray(value.capacity.outcomes) &&\n\t\t\t\tvalue.capacity.outcomes.every((outcome) => typeof outcome === \"string\") &&\n\t\t\t\tisFiniteNumber(value.capacity.meanMs))) &&\n\t\tisFiniteNumber(value.totalCostUsd)\n\t);\n}\n\nfunction parseFitnessHost(value: unknown, hostId: string): Record<string, StoredFitnessReport> | undefined {\n\tif (!isPlainRecord(value)) return undefined;\n\tconst reports: Record<string, StoredFitnessReport> = {};\n\tfor (const [model, candidate] of Object.entries(value)) {\n\t\tif (\n\t\t\t!isPlainRecord(candidate) ||\n\t\t\tcandidate.model !== model ||\n\t\t\ttypeof candidate.at !== \"string\" ||\n\t\t\t!isHostFingerprint(candidate.host) ||\n\t\t\tcandidate.host.id !== hostId ||\n\t\t\t!isFitnessReport(candidate.report)\n\t\t)\n\t\t\tcontinue;\n\t\treports[model] = {\n\t\t\tmodel,\n\t\t\treport: candidate.report,\n\t\t\tat: candidate.at,\n\t\t\thost: candidate.host,\n\t\t};\n\t}\n\treturn reports;\n}\n\nexport class FitnessStore {\n\tprivate readonly storage: HostStateStore<Record<string, StoredFitnessReport>>;\n\n\tconstructor(filePath: string, options?: { fingerprint?: () => HostFingerprint; readOnly?: boolean }) {\n\t\tthis.storage = new HostStateStore({\n\t\t\tfilePath,\n\t\t\tversion: 1,\n\t\t\tfingerprint: options?.fingerprint,\n\t\t\treadOnly: options?.readOnly ?? isWorkerSession(),\n\t\t\tparseHost: parseFitnessHost,\n\t\t});\n\t}\n\n\tstatic forAgentDir(\n\t\tagentDir: string,\n\t\toptions?: { fingerprint?: () => HostFingerprint; readOnly?: boolean },\n\t): FitnessStore {\n\t\treturn new FitnessStore(stateFile(agentDir, \"model-fitness.json\"), options);\n\t}\n\n\t/** Persist the latest report for a model on the CURRENT host. Best-effort, returns the entry. */\n\tsave(model: string, report: ModelFitnessReport, at?: string): StoredFitnessReport {\n\t\treturn this.storage.mutateCurrentHost(\n\t\t\t() => ({}),\n\t\t\t(reports, host) => {\n\t\t\t\tconst entry: StoredFitnessReport = { model, report, at: at ?? new Date().toISOString(), host };\n\t\t\t\treports[model] = entry;\n\t\t\t\treturn { result: entry, changed: true };\n\t\t\t},\n\t\t);\n\t}\n\n\t/** Drop a model's report for the CURRENT host (uninstall cleanup). No-op when absent. */\n\tremove(model: string): void {\n\t\tthis.storage.mutateCurrentHost(\n\t\t\t() => ({}),\n\t\t\t(reports) => {\n\t\t\t\tif (!reports[model]) return { result: undefined, changed: false };\n\t\t\t\tdelete reports[model];\n\t\t\t\treturn { result: undefined, changed: true };\n\t\t\t},\n\t\t);\n\t}\n\n\t/** Reports for the current host (default) or an explicit host id. */\n\tgetForHost(hostId?: string): StoredFitnessReport[] {\n\t\treturn Object.values(this.storage.getHost(hostId) ?? {});\n\t}\n\n\t/** Every stored report across all hosts (for cross-machine comparisons). */\n\tgetAll(): StoredFitnessReport[] {\n\t\treturn this.storage.getAllHosts().flatMap((reports) => Object.values(reports));\n\t}\n}\n"]}
@@ -0,0 +1,34 @@
1
+ export interface HostFingerprint {
2
+ id: string;
3
+ cpu: string;
4
+ cores: number;
5
+ totalMemGb: number;
6
+ }
7
+ export declare function currentHostFingerprint(): HostFingerprint;
8
+ export declare function isHostFingerprint(value: unknown): value is HostFingerprint;
9
+ export interface HostStateMutation<TResult> {
10
+ result: TResult;
11
+ changed: boolean;
12
+ }
13
+ export interface HostStateStoreOptions<THostData> {
14
+ filePath: string;
15
+ version: number;
16
+ fingerprint?: () => HostFingerprint;
17
+ readOnly?: boolean;
18
+ parseHost(value: unknown, hostId: string): THostData | undefined;
19
+ }
20
+ /** Shared lock-safe, atomic substrate for versioned state partitioned by host fingerprint. */
21
+ export declare class HostStateStore<THostData> {
22
+ private readonly filePath;
23
+ private readonly version;
24
+ private readonly fingerprint;
25
+ private readonly readOnly;
26
+ private readonly parseHost;
27
+ constructor(options: HostStateStoreOptions<THostData>);
28
+ private currentHost;
29
+ getHost(hostId?: string): THostData | undefined;
30
+ getAllHosts(): THostData[];
31
+ mutateCurrentHost<TResult>(create: (host: HostFingerprint) => THostData, mutate: (data: THostData, host: HostFingerprint) => HostStateMutation<TResult>): TResult;
32
+ private load;
33
+ }
34
+ //# sourceMappingURL=host-state-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-state-store.d.ts","sourceRoot":"","sources":["../../../src/core/models/host-state-store.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,eAAe;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,sBAAsB,IAAI,eAAe,CAWxD;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,eAAe,CAY1E;AAOD,MAAM,WAAW,iBAAiB,CAAC,OAAO;IACzC,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB,CAAC,SAAS;IAC/C,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,eAAe,CAAC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;CACjE;AAED,8FAA8F;AAC9F,qBAAa,cAAc,CAAC,SAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAwB;IACpD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA4D;IAEtF,YAAY,OAAO,EAAE,qBAAqB,CAAC,SAAS,CAAC,EAMpD;IAED,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,MAAM,SAAwB,GAAG,SAAS,GAAG,SAAS,CAE7D;IAED,WAAW,IAAI,SAAS,EAAE,CAEzB;IAED,iBAAiB,CAAC,OAAO,EACxB,MAAM,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,SAAS,EAC5C,MAAM,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,eAAe,KAAK,iBAAiB,CAAC,OAAO,CAAC,GAC5E,OAAO,CAaT;IAED,OAAO,CAAC,IAAI;CAiBZ","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { cpus, totalmem } from \"node:os\";\nimport { withFileLockSync, writeFileAtomicSync } from \"../util/atomic-file.ts\";\nimport { isPlainRecord } from \"../util/value-guards.ts\";\n\nexport interface HostFingerprint {\n\tid: string;\n\tcpu: string;\n\tcores: number;\n\ttotalMemGb: number;\n}\n\nexport function currentHostFingerprint(): HostFingerprint {\n\tconst cpuList = cpus();\n\tconst cpu = (cpuList[0]?.model ?? \"unknown-cpu\").trim();\n\tconst cores = Math.max(1, cpuList.length);\n\tconst totalMemGb = Math.round(totalmem() / 1024 ** 3);\n\tconst id = `${cpu\n\t\t.toLowerCase()\n\t\t.replace(/[^a-z0-9]+/g, \"-\")\n\t\t.replace(/^-+|-+$/g, \"\")\n\t\t.slice(0, 48)}-${cores}c-${totalMemGb}g`;\n\treturn { id, cpu, cores, totalMemGb };\n}\n\nexport function isHostFingerprint(value: unknown): value is HostFingerprint {\n\treturn (\n\t\tisPlainRecord(value) &&\n\t\ttypeof value.id === \"string\" &&\n\t\tvalue.id.length > 0 &&\n\t\ttypeof value.cpu === \"string\" &&\n\t\tNumber.isSafeInteger(value.cores) &&\n\t\tNumber(value.cores) > 0 &&\n\t\ttypeof value.totalMemGb === \"number\" &&\n\t\tNumber.isFinite(value.totalMemGb) &&\n\t\tvalue.totalMemGb >= 0\n\t);\n}\n\ninterface HostStateFile<THostData> {\n\tversion: number;\n\thosts: Record<string, THostData>;\n}\n\nexport interface HostStateMutation<TResult> {\n\tresult: TResult;\n\tchanged: boolean;\n}\n\nexport interface HostStateStoreOptions<THostData> {\n\tfilePath: string;\n\tversion: number;\n\tfingerprint?: () => HostFingerprint;\n\treadOnly?: boolean;\n\tparseHost(value: unknown, hostId: string): THostData | undefined;\n}\n\n/** Shared lock-safe, atomic substrate for versioned state partitioned by host fingerprint. */\nexport class HostStateStore<THostData> {\n\tprivate readonly filePath: string;\n\tprivate readonly version: number;\n\tprivate readonly fingerprint: () => HostFingerprint;\n\tprivate readonly readOnly: boolean;\n\tprivate readonly parseHost: (value: unknown, hostId: string) => THostData | undefined;\n\n\tconstructor(options: HostStateStoreOptions<THostData>) {\n\t\tthis.filePath = options.filePath;\n\t\tthis.version = options.version;\n\t\tthis.fingerprint = options.fingerprint ?? currentHostFingerprint;\n\t\tthis.readOnly = options.readOnly ?? false;\n\t\tthis.parseHost = options.parseHost;\n\t}\n\n\tprivate currentHost(): HostFingerprint {\n\t\treturn this.fingerprint();\n\t}\n\n\tgetHost(hostId = this.currentHost().id): THostData | undefined {\n\t\treturn this.load().hosts[hostId];\n\t}\n\n\tgetAllHosts(): THostData[] {\n\t\treturn Object.values(this.load().hosts);\n\t}\n\n\tmutateCurrentHost<TResult>(\n\t\tcreate: (host: HostFingerprint) => THostData,\n\t\tmutate: (data: THostData, host: HostFingerprint) => HostStateMutation<TResult>,\n\t): TResult {\n\t\tconst host = this.currentHost();\n\t\tconst execute = (): TResult => {\n\t\t\tconst file = this.load();\n\t\t\tconst data = file.hosts[host.id] ?? create(host);\n\t\t\tfile.hosts[host.id] = data;\n\t\t\tconst mutation = mutate(data, host);\n\t\t\tif (mutation.changed && !this.readOnly) {\n\t\t\t\twriteFileAtomicSync(this.filePath, `${JSON.stringify(file, null, \"\\t\")}\\n`);\n\t\t\t}\n\t\t\treturn mutation.result;\n\t\t};\n\t\treturn this.readOnly ? execute() : withFileLockSync(this.filePath, execute);\n\t}\n\n\tprivate load(): HostStateFile<THostData> {\n\t\tif (!existsSync(this.filePath)) return { version: this.version, hosts: {} };\n\t\ttry {\n\t\t\tconst parsed: unknown = JSON.parse(readFileSync(this.filePath, \"utf-8\"));\n\t\t\tif (!isPlainRecord(parsed) || parsed.version !== this.version || !isPlainRecord(parsed.hosts)) {\n\t\t\t\treturn { version: this.version, hosts: {} };\n\t\t\t}\n\t\t\tconst hosts: Record<string, THostData> = {};\n\t\t\tfor (const [hostId, value] of Object.entries(parsed.hosts)) {\n\t\t\t\tconst host = this.parseHost(value, hostId);\n\t\t\t\tif (host !== undefined) hosts[hostId] = host;\n\t\t\t}\n\t\t\treturn { version: this.version, hosts };\n\t\t} catch {\n\t\t\treturn { version: this.version, hosts: {} };\n\t\t}\n\t}\n}\n"]}
@@ -0,0 +1,86 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { cpus, totalmem } from "node:os";
3
+ import { withFileLockSync, writeFileAtomicSync } from "../util/atomic-file.js";
4
+ import { isPlainRecord } from "../util/value-guards.js";
5
+ export function currentHostFingerprint() {
6
+ const cpuList = cpus();
7
+ const cpu = (cpuList[0]?.model ?? "unknown-cpu").trim();
8
+ const cores = Math.max(1, cpuList.length);
9
+ const totalMemGb = Math.round(totalmem() / 1024 ** 3);
10
+ const id = `${cpu
11
+ .toLowerCase()
12
+ .replace(/[^a-z0-9]+/g, "-")
13
+ .replace(/^-+|-+$/g, "")
14
+ .slice(0, 48)}-${cores}c-${totalMemGb}g`;
15
+ return { id, cpu, cores, totalMemGb };
16
+ }
17
+ export function isHostFingerprint(value) {
18
+ return (isPlainRecord(value) &&
19
+ typeof value.id === "string" &&
20
+ value.id.length > 0 &&
21
+ typeof value.cpu === "string" &&
22
+ Number.isSafeInteger(value.cores) &&
23
+ Number(value.cores) > 0 &&
24
+ typeof value.totalMemGb === "number" &&
25
+ Number.isFinite(value.totalMemGb) &&
26
+ value.totalMemGb >= 0);
27
+ }
28
+ /** Shared lock-safe, atomic substrate for versioned state partitioned by host fingerprint. */
29
+ export class HostStateStore {
30
+ filePath;
31
+ version;
32
+ fingerprint;
33
+ readOnly;
34
+ parseHost;
35
+ constructor(options) {
36
+ this.filePath = options.filePath;
37
+ this.version = options.version;
38
+ this.fingerprint = options.fingerprint ?? currentHostFingerprint;
39
+ this.readOnly = options.readOnly ?? false;
40
+ this.parseHost = options.parseHost;
41
+ }
42
+ currentHost() {
43
+ return this.fingerprint();
44
+ }
45
+ getHost(hostId = this.currentHost().id) {
46
+ return this.load().hosts[hostId];
47
+ }
48
+ getAllHosts() {
49
+ return Object.values(this.load().hosts);
50
+ }
51
+ mutateCurrentHost(create, mutate) {
52
+ const host = this.currentHost();
53
+ const execute = () => {
54
+ const file = this.load();
55
+ const data = file.hosts[host.id] ?? create(host);
56
+ file.hosts[host.id] = data;
57
+ const mutation = mutate(data, host);
58
+ if (mutation.changed && !this.readOnly) {
59
+ writeFileAtomicSync(this.filePath, `${JSON.stringify(file, null, "\t")}\n`);
60
+ }
61
+ return mutation.result;
62
+ };
63
+ return this.readOnly ? execute() : withFileLockSync(this.filePath, execute);
64
+ }
65
+ load() {
66
+ if (!existsSync(this.filePath))
67
+ return { version: this.version, hosts: {} };
68
+ try {
69
+ const parsed = JSON.parse(readFileSync(this.filePath, "utf-8"));
70
+ if (!isPlainRecord(parsed) || parsed.version !== this.version || !isPlainRecord(parsed.hosts)) {
71
+ return { version: this.version, hosts: {} };
72
+ }
73
+ const hosts = {};
74
+ for (const [hostId, value] of Object.entries(parsed.hosts)) {
75
+ const host = this.parseHost(value, hostId);
76
+ if (host !== undefined)
77
+ hosts[hostId] = host;
78
+ }
79
+ return { version: this.version, hosts };
80
+ }
81
+ catch {
82
+ return { version: this.version, hosts: {} };
83
+ }
84
+ }
85
+ }
86
+ //# sourceMappingURL=host-state-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-state-store.js","sourceRoot":"","sources":["../../../src/core/models/host-state-store.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { cpus, totalmem } from \"node:os\";\nimport { withFileLockSync, writeFileAtomicSync } from \"../util/atomic-file.ts\";\nimport { isPlainRecord } from \"../util/value-guards.ts\";\n\nexport interface HostFingerprint {\n\tid: string;\n\tcpu: string;\n\tcores: number;\n\ttotalMemGb: number;\n}\n\nexport function currentHostFingerprint(): HostFingerprint {\n\tconst cpuList = cpus();\n\tconst cpu = (cpuList[0]?.model ?? \"unknown-cpu\").trim();\n\tconst cores = Math.max(1, cpuList.length);\n\tconst totalMemGb = Math.round(totalmem() / 1024 ** 3);\n\tconst id = `${cpu\n\t\t.toLowerCase()\n\t\t.replace(/[^a-z0-9]+/g, \"-\")\n\t\t.replace(/^-+|-+$/g, \"\")\n\t\t.slice(0, 48)}-${cores}c-${totalMemGb}g`;\n\treturn { id, cpu, cores, totalMemGb };\n}\n\nexport function isHostFingerprint(value: unknown): value is HostFingerprint {\n\treturn (\n\t\tisPlainRecord(value) &&\n\t\ttypeof value.id === \"string\" &&\n\t\tvalue.id.length > 0 &&\n\t\ttypeof value.cpu === \"string\" &&\n\t\tNumber.isSafeInteger(value.cores) &&\n\t\tNumber(value.cores) > 0 &&\n\t\ttypeof value.totalMemGb === \"number\" &&\n\t\tNumber.isFinite(value.totalMemGb) &&\n\t\tvalue.totalMemGb >= 0\n\t);\n}\n\ninterface HostStateFile<THostData> {\n\tversion: number;\n\thosts: Record<string, THostData>;\n}\n\nexport interface HostStateMutation<TResult> {\n\tresult: TResult;\n\tchanged: boolean;\n}\n\nexport interface HostStateStoreOptions<THostData> {\n\tfilePath: string;\n\tversion: number;\n\tfingerprint?: () => HostFingerprint;\n\treadOnly?: boolean;\n\tparseHost(value: unknown, hostId: string): THostData | undefined;\n}\n\n/** Shared lock-safe, atomic substrate for versioned state partitioned by host fingerprint. */\nexport class HostStateStore<THostData> {\n\tprivate readonly filePath: string;\n\tprivate readonly version: number;\n\tprivate readonly fingerprint: () => HostFingerprint;\n\tprivate readonly readOnly: boolean;\n\tprivate readonly parseHost: (value: unknown, hostId: string) => THostData | undefined;\n\n\tconstructor(options: HostStateStoreOptions<THostData>) {\n\t\tthis.filePath = options.filePath;\n\t\tthis.version = options.version;\n\t\tthis.fingerprint = options.fingerprint ?? currentHostFingerprint;\n\t\tthis.readOnly = options.readOnly ?? false;\n\t\tthis.parseHost = options.parseHost;\n\t}\n\n\tprivate currentHost(): HostFingerprint {\n\t\treturn this.fingerprint();\n\t}\n\n\tgetHost(hostId = this.currentHost().id): THostData | undefined {\n\t\treturn this.load().hosts[hostId];\n\t}\n\n\tgetAllHosts(): THostData[] {\n\t\treturn Object.values(this.load().hosts);\n\t}\n\n\tmutateCurrentHost<TResult>(\n\t\tcreate: (host: HostFingerprint) => THostData,\n\t\tmutate: (data: THostData, host: HostFingerprint) => HostStateMutation<TResult>,\n\t): TResult {\n\t\tconst host = this.currentHost();\n\t\tconst execute = (): TResult => {\n\t\t\tconst file = this.load();\n\t\t\tconst data = file.hosts[host.id] ?? create(host);\n\t\t\tfile.hosts[host.id] = data;\n\t\t\tconst mutation = mutate(data, host);\n\t\t\tif (mutation.changed && !this.readOnly) {\n\t\t\t\twriteFileAtomicSync(this.filePath, `${JSON.stringify(file, null, \"\\t\")}\\n`);\n\t\t\t}\n\t\t\treturn mutation.result;\n\t\t};\n\t\treturn this.readOnly ? execute() : withFileLockSync(this.filePath, execute);\n\t}\n\n\tprivate load(): HostStateFile<THostData> {\n\t\tif (!existsSync(this.filePath)) return { version: this.version, hosts: {} };\n\t\ttry {\n\t\t\tconst parsed: unknown = JSON.parse(readFileSync(this.filePath, \"utf-8\"));\n\t\t\tif (!isPlainRecord(parsed) || parsed.version !== this.version || !isPlainRecord(parsed.hosts)) {\n\t\t\t\treturn { version: this.version, hosts: {} };\n\t\t\t}\n\t\t\tconst hosts: Record<string, THostData> = {};\n\t\t\tfor (const [hostId, value] of Object.entries(parsed.hosts)) {\n\t\t\t\tconst host = this.parseHost(value, hostId);\n\t\t\t\tif (host !== undefined) hosts[hostId] = host;\n\t\t\t}\n\t\t\treturn { version: this.version, hosts };\n\t\t} catch {\n\t\t\treturn { version: this.version, hosts: {} };\n\t\t}\n\t}\n}\n"]}
@@ -0,0 +1,180 @@
1
+ import { type ChildProcess } from "node:child_process";
2
+ import type { Readable } from "node:stream";
3
+ /**
4
+ * Managed runtime for prism-ml 1-bit GGUF models (Bonsai-27B first). The provider requires their
5
+ * llama.cpp fork (Q1_0_g128 hybrid-attention kernels) — stock llama.cpp/Ollama cannot serve these
6
+ * weights — so this module owns runtime install (prebuilt release download+extract), GGUF
7
+ * downloads, and llama-server lifecycle. Mirrors local-runtime.ts's OllamaRuntime: injectable
8
+ * seams for fetch/spawn/exists, pi-owned directories under agentDir (runtimes/, models/),
9
+ * detached+tracked child processes, onProgress as best-effort UI feedback, honest error taxonomies
10
+ * instead of silent fallbacks.
11
+ *
12
+ * The fork publishes precompiled per-platform archives on GitHub Releases (no local build): pin a
13
+ * release tag, download the matching asset, extract it, and locate the `llama-server` binary once
14
+ * at install time (release archive layouts vary — bin/ vs build/bin/ at the top level — so this is
15
+ * a deterministic one-time scan, not a fallback). The found relative path and backend (cpu/cuda)
16
+ * are persisted to a manifest so later `detect()`/`serve()` calls never need to re-scan.
17
+ */
18
+ /**
19
+ * Pinned Prism ML llama.cpp fork release — verified via
20
+ * `GET https://api.github.com/repos/PrismML-Eng/llama.cpp/releases/tags/prism-b9594-38c66ad` on
21
+ * 2026-07-18 (release exists, all assets referenced below are present on it). Bump here (and
22
+ * re-verify with the same API call) when the provider ships new kernels.
23
+ */
24
+ export declare const PRISM_LLAMACPP_PINNED_RELEASE = "prism-b9594-38c66ad";
25
+ export declare const PRISM_LLAMACPP_RELEASES_BASE_URL = "https://github.com/PrismML-Eng/llama.cpp/releases/download";
26
+ export interface PrismModelDescriptor {
27
+ repo: string;
28
+ file: string;
29
+ mmprojFile?: string;
30
+ displayName: string;
31
+ }
32
+ /** Curated first-model descriptor; the `/models add` wiring task consumes this. */
33
+ export declare const BONSAI_27B: PrismModelDescriptor;
34
+ export type PrismBackend = "cpu" | "cuda";
35
+ export type PrismAssetKind = "tar-gz" | "zip";
36
+ export interface PrismLlamaAsset {
37
+ name: string;
38
+ kind: PrismAssetKind;
39
+ backend: PrismBackend;
40
+ }
41
+ /**
42
+ * Maps a platform/arch/GPU triple to the exact Prism llama.cpp release asset for
43
+ * {@link PRISM_LLAMACPP_PINNED_RELEASE} — verified against the real GitHub release, not guessed.
44
+ * CPU asset by default; the CUDA 12.4 variant is only offered for linux x64 with an NVIDIA GPU
45
+ * present (a 12.8 variant also exists upstream but has no wired caller yet). Windows CUDA needs a
46
+ * companion `cudart-*` archive and is out of scope for v1 — Windows always resolves to the CPU zip
47
+ * regardless of `hasNvidiaGpu`. Pure and exported so it's independently testable.
48
+ */
49
+ export declare function resolvePrismLlamaAsset(plat: string, architecture: string, hasNvidiaGpu: boolean): PrismLlamaAsset | undefined;
50
+ export interface PrismDetectResult {
51
+ runtimeInstalled: boolean;
52
+ binaryPath?: string;
53
+ release?: string;
54
+ }
55
+ export interface PrismDownloadResult {
56
+ ok: boolean;
57
+ path?: string;
58
+ skipped?: boolean;
59
+ error?: string;
60
+ }
61
+ export type PrismServeResult = {
62
+ ok: true;
63
+ baseUrl: string;
64
+ } | {
65
+ ok: false;
66
+ error: string;
67
+ };
68
+ type PrismSpawnOptions = {
69
+ detached?: boolean;
70
+ stdio?: "ignore";
71
+ env?: NodeJS.ProcessEnv;
72
+ };
73
+ type PrismSpawnFn = (command: string, args: string[], options: PrismSpawnOptions) => Pick<ChildProcess, "pid" | "kill" | "unref" | "on">;
74
+ type PrismExtractArchiveFn = (input: Readable, destDir: string, kind: PrismAssetKind) => Promise<{
75
+ ok: boolean;
76
+ error?: string;
77
+ }>;
78
+ export interface PrismLlamaCppDeps {
79
+ fetchFn?: typeof fetch;
80
+ spawnFn?: PrismSpawnFn;
81
+ existsFn?: (path: string) => boolean;
82
+ sleepFn?: (ms: number) => Promise<void>;
83
+ /** Whether a named command exists on PATH (nvidia-smi, tar — for zip extraction on Windows). */
84
+ hasCommand?: (command: string) => boolean;
85
+ /** Decided once at install time and persisted as `backend` — serve() reads the persisted value
86
+ * so `-ngl 99` reflects what was actually installed, not the host's current GPU state. */
87
+ hasNvidiaGpu?: () => boolean;
88
+ platform?: () => string;
89
+ arch?: () => string;
90
+ /** Runs the extraction step for a downloaded archive. Injectable so installManaged's
91
+ * download->extract->scan orchestration is testable without a real tar/unzip pipeline; defaults
92
+ * to the real spawn-based extractor. */
93
+ extractArchive?: PrismExtractArchiveFn;
94
+ /** Health-poll bounds for serve(); default ~120s (240 * 500ms), both overridable for tests. */
95
+ healthPollAttempts?: number;
96
+ healthPollIntervalMs?: number;
97
+ }
98
+ export declare class PrismLlamaCppRuntime {
99
+ private readonly _agentDir;
100
+ private readonly _fetch;
101
+ private readonly _spawn;
102
+ private readonly _exists;
103
+ private readonly _sleep;
104
+ private readonly _hasCommand;
105
+ private readonly _hasNvidiaGpu;
106
+ private readonly _platform;
107
+ private readonly _arch;
108
+ private readonly _extractArchiveOverride;
109
+ private readonly _healthPollAttempts;
110
+ private readonly _healthPollIntervalMs;
111
+ private _child;
112
+ constructor(args: {
113
+ agentDir: string;
114
+ deps?: PrismLlamaCppDeps;
115
+ });
116
+ runtimeDir(): string;
117
+ modelsDir(): string;
118
+ private _binaryName;
119
+ private _manifestPath;
120
+ private _readManifest;
121
+ private _writeManifest;
122
+ detect(): Promise<PrismDetectResult>;
123
+ /** One-time recursive scan for the `llama-server` binary inside a freshly extracted release
124
+ * archive — layouts vary (bin/ vs build/bin/ at the top level) across platforms/backends, so
125
+ * this locates it deterministically instead of assuming a fixed path, then the result is
126
+ * persisted so later calls never need to re-scan. */
127
+ private _findBinaryRelPath;
128
+ /**
129
+ * Download the pinned release asset for this host and extract it (consent-gated by the caller,
130
+ * same contract as OllamaRuntime#installManaged — this method only does the mechanical
131
+ * download+extract+locate and reports the outcome honestly). No compiler toolchain required:
132
+ * the fork ships prebuilt binaries.
133
+ */
134
+ installManaged(onProgress?: (status: string) => void): Promise<{
135
+ ok: boolean;
136
+ error?: string;
137
+ }>;
138
+ private _extractArchive;
139
+ private _extractTarGz;
140
+ private _extractZip;
141
+ private _remoteContentLength;
142
+ private _fileSizeBytes;
143
+ private _cleanupPartial;
144
+ /**
145
+ * Wait until a write stream's underlying fd is actually closed. `pipeline()` destroys the
146
+ * stream on error but its promise can settle before the fd close completes (Windows in
147
+ * particular keeps the file handle open a tick longer) — unlinking before that races with the
148
+ * OS and can leave the "partial" file behind or fail the delete outright. Resolves immediately
149
+ * if the stream already reports `closed`.
150
+ */
151
+ private _waitForStreamClosed;
152
+ /**
153
+ * Stream a GGUF (or mmproj) file from Hugging Face into pi's owned models dir. Skips a re-download
154
+ * when the local file already matches the remote size; verifies size when the response reports
155
+ * `content-length` and deletes the partial file on any failure or mismatch — never leaves a
156
+ * corrupt/truncated weight file behind for a later load to silently misread.
157
+ */
158
+ downloadModel(args: {
159
+ repo: string;
160
+ file: string;
161
+ }, onProgress?: (status: string) => void): Promise<PrismDownloadResult>;
162
+ private _healthUp;
163
+ /**
164
+ * Spawn `llama-server` detached+tracked (killed on parent shutdown even if pi crashes without
165
+ * calling stop()) and poll `/health` until ready. `-ngl 99` is only added when the installed
166
+ * asset's persisted `backend` is `"cuda"`, not from the host's current GPU state.
167
+ */
168
+ serve(args: {
169
+ modelPath: string;
170
+ mmprojPath?: string;
171
+ port: number;
172
+ numCtx: number;
173
+ }): Promise<PrismServeResult>;
174
+ stop(): {
175
+ stopped: boolean;
176
+ };
177
+ isRunning(): boolean;
178
+ }
179
+ export {};
180
+ //# sourceMappingURL=llamacpp-runtime.d.ts.map