@caupulican/pi-adaptative 0.81.42 → 0.84.1

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 (1414) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/dist/bun/cli.d.ts.map +1 -1
  3. package/dist/bun/cli.js.map +1 -1
  4. package/dist/bun/register-bedrock.d.ts.map +1 -1
  5. package/dist/bun/restore-sandbox-env.d.ts.map +1 -1
  6. package/dist/bun/restore-sandbox-env.js.map +1 -1
  7. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.d.ts.map +1 -1
  8. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.js.map +1 -1
  9. package/dist/bundled-resources/extensions/tmux-agent-manager/index.d.ts.map +1 -1
  10. package/dist/bundled-resources/extensions/tmux-agent-manager/index.js +52 -49
  11. package/dist/bundled-resources/extensions/tmux-agent-manager/index.js.map +1 -1
  12. package/dist/bundled-resources/extensions/tmux-agent-manager/index.ts +62 -57
  13. package/dist/bundled-resources/prompts/skillify.md +1 -1
  14. package/dist/bundled-resources/runtimes/pi-shell-engine/commands/fs.py +16 -19
  15. package/dist/bundled-resources/runtimes/pi-shell-engine/commands/search.py +12 -26
  16. package/dist/bundled-resources/runtimes/pi-shell-engine/commands/strings.py +15 -121
  17. package/dist/bundled-resources/runtimes/pi-shell-engine/commands/text.py +52 -79
  18. package/dist/bundled-resources/runtimes/pi-shell-engine/escapes.py +70 -0
  19. package/dist/bundled-resources/runtimes/pi-shell-engine/exec.py +110 -61
  20. package/dist/bundled-resources/runtimes/pi-shell-engine/main.py +106 -23
  21. package/dist/bundled-resources/runtimes/pi-shell-engine/paths.py +10 -0
  22. package/dist/bundled-resources/runtimes/pi-shell-engine/proc.py +12 -4
  23. package/dist/bundled-resources/runtimes/pi-shell-engine/shell_args.py +22 -0
  24. package/dist/bundled-resources/runtimes/pi-shell-engine/state.py +9 -2
  25. package/dist/bundled-resources/runtimes/pi-shell-engine/tokens.py +129 -259
  26. package/dist/bundled-resources/skills/authorized-web-security-audit/SKILL.md +187 -0
  27. package/dist/bundled-resources/skills/authorized-web-security-audit/references/assessment-contract.md +92 -0
  28. package/dist/bundled-resources/skills/deduplicate-by-evidence/SKILL.md +134 -0
  29. package/dist/bundled-resources/skills/evidence-gated-tdd/SKILL.md +93 -0
  30. package/dist/bundled-resources/skills/evidence-gated-tdd/references/evidence-model.md +27 -0
  31. package/dist/bundled-resources/skills/evidence-gated-tdd/references/security-scanners.md +24 -0
  32. package/dist/bundled-resources/skills/harness-self-adaptation/SKILL.md +4 -2
  33. package/dist/bundled-resources/skills/secure-agent-tool-surfaces/SKILL.md +217 -0
  34. package/dist/bundled-resources/skills/secure-agent-tool-surfaces/references/defensive-exploit-catalogue.md +175 -0
  35. package/dist/bundled-resources/skills/secure-agent-tool-surfaces/references/tool-boundary-checklist.md +87 -0
  36. package/dist/bundled-resources/skills/skill-architect/SKILL.md +2 -2
  37. package/dist/bundled-resources/skills/skill-creator/SKILL.md +188 -0
  38. package/dist/bundled-resources/skills/skill-creator/references/pi-skill-contract.md +73 -0
  39. package/dist/bundled-resources/skills/skill-creator/scripts/init-skill.mjs +142 -0
  40. package/dist/bundled-resources/skills/skill-creator/scripts/validate-skill.mjs +122 -0
  41. package/dist/cli/args.d.ts.map +1 -1
  42. package/dist/cli/args.js.map +1 -1
  43. package/dist/cli/config-selector.d.ts.map +1 -1
  44. package/dist/cli/config-selector.js.map +1 -1
  45. package/dist/cli/file-processor.d.ts.map +1 -1
  46. package/dist/cli/file-processor.js +8 -8
  47. package/dist/cli/file-processor.js.map +1 -1
  48. package/dist/cli/initial-message.d.ts +1 -1
  49. package/dist/cli/initial-message.d.ts.map +1 -1
  50. package/dist/cli/initial-message.js.map +1 -1
  51. package/dist/cli/list-models.d.ts.map +1 -1
  52. package/dist/cli/list-models.js.map +1 -1
  53. package/dist/cli/piped-stdin.d.ts +4 -0
  54. package/dist/cli/piped-stdin.d.ts.map +1 -0
  55. package/dist/cli/piped-stdin.js +13 -0
  56. package/dist/cli/piped-stdin.js.map +1 -0
  57. package/dist/cli/session-picker.d.ts.map +1 -1
  58. package/dist/cli/session-picker.js.map +1 -1
  59. package/dist/cli.d.ts.map +1 -1
  60. package/dist/cli.js.map +1 -1
  61. package/dist/config.d.ts +1 -1
  62. package/dist/config.d.ts.map +1 -1
  63. package/dist/config.js +10 -15
  64. package/dist/config.js.map +1 -1
  65. package/dist/core/agent-directory-layout.d.ts.map +1 -1
  66. package/dist/core/agent-directory-layout.js.map +1 -1
  67. package/dist/core/agent-paths.d.ts +1 -1
  68. package/dist/core/agent-paths.d.ts.map +1 -1
  69. package/dist/core/agent-paths.js +1 -1
  70. package/dist/core/agent-paths.js.map +1 -1
  71. package/dist/core/agent-session-contracts.d.ts +5 -9
  72. package/dist/core/agent-session-contracts.d.ts.map +1 -1
  73. package/dist/core/agent-session-contracts.js +1 -12
  74. package/dist/core/agent-session-contracts.js.map +1 -1
  75. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  76. package/dist/core/agent-session-runtime.js +10 -25
  77. package/dist/core/agent-session-runtime.js.map +1 -1
  78. package/dist/core/agent-session-services.d.ts.map +1 -1
  79. package/dist/core/agent-session-services.js.map +1 -1
  80. package/dist/core/agent-session.d.ts +24 -1
  81. package/dist/core/agent-session.d.ts.map +1 -1
  82. package/dist/core/agent-session.js +210 -237
  83. package/dist/core/agent-session.js.map +1 -1
  84. package/dist/core/auth-guidance.d.ts.map +1 -1
  85. package/dist/core/auth-guidance.js.map +1 -1
  86. package/dist/core/auth-storage.d.ts +4 -1
  87. package/dist/core/auth-storage.d.ts.map +1 -1
  88. package/dist/core/auth-storage.js +13 -39
  89. package/dist/core/auth-storage.js.map +1 -1
  90. package/dist/core/autonomy/approval-gate.d.ts.map +1 -1
  91. package/dist/core/autonomy/approval-gate.js.map +1 -1
  92. package/dist/core/autonomy/bounded-completion.d.ts.map +1 -1
  93. package/dist/core/autonomy/bounded-completion.js.map +1 -1
  94. package/dist/core/autonomy/contracts.d.ts.map +1 -1
  95. package/dist/core/autonomy/envelope-enforcement.d.ts.map +1 -1
  96. package/dist/core/autonomy/envelope-enforcement.js.map +1 -1
  97. package/dist/core/autonomy/evidence-finding-projection.d.ts +11 -0
  98. package/dist/core/autonomy/evidence-finding-projection.d.ts.map +1 -0
  99. package/dist/core/autonomy/evidence-finding-projection.js +37 -0
  100. package/dist/core/autonomy/evidence-finding-projection.js.map +1 -0
  101. package/dist/core/autonomy/foreground-envelope.d.ts.map +1 -1
  102. package/dist/core/autonomy/foreground-envelope.js.map +1 -1
  103. package/dist/core/autonomy/gates.d.ts.map +1 -1
  104. package/dist/core/autonomy/gates.js.map +1 -1
  105. package/dist/core/autonomy/lane-private-paths.d.ts.map +1 -1
  106. package/dist/core/autonomy/lane-private-paths.js.map +1 -1
  107. package/dist/core/autonomy/lane-tool-surface.d.ts.map +1 -1
  108. package/dist/core/autonomy/lane-tool-surface.js.map +1 -1
  109. package/dist/core/autonomy/lane-tracker.d.ts.map +1 -1
  110. package/dist/core/autonomy/lane-tracker.js +2 -3
  111. package/dist/core/autonomy/lane-tracker.js.map +1 -1
  112. package/dist/core/autonomy/path-scope.d.ts.map +1 -1
  113. package/dist/core/autonomy/path-scope.js.map +1 -1
  114. package/dist/core/autonomy/risk-assessment.d.ts.map +1 -1
  115. package/dist/core/autonomy/session-lane-record.d.ts.map +1 -1
  116. package/dist/core/autonomy/session-lane-record.js.map +1 -1
  117. package/dist/core/autonomy/status.d.ts.map +1 -1
  118. package/dist/core/autonomy/status.js.map +1 -1
  119. package/dist/core/autonomy/subagent-prompt.d.ts.map +1 -1
  120. package/dist/core/autonomy/subagent-prompt.js.map +1 -1
  121. package/dist/core/autonomy/telemetry-events.d.ts.map +1 -1
  122. package/dist/core/autonomy/telemetry-events.js.map +1 -1
  123. package/dist/core/autonomy-telemetry.d.ts.map +1 -1
  124. package/dist/core/autonomy-telemetry.js +2 -4
  125. package/dist/core/autonomy-telemetry.js.map +1 -1
  126. package/dist/core/background-lane-controller.d.ts.map +1 -1
  127. package/dist/core/background-lane-controller.js +2 -15
  128. package/dist/core/background-lane-controller.js.map +1 -1
  129. package/dist/core/background-tool-task-controller.d.ts +88 -0
  130. package/dist/core/background-tool-task-controller.d.ts.map +1 -0
  131. package/dist/core/background-tool-task-controller.js +470 -0
  132. package/dist/core/background-tool-task-controller.js.map +1 -0
  133. package/dist/core/bash-execution-controller.d.ts +1 -0
  134. package/dist/core/bash-execution-controller.d.ts.map +1 -1
  135. package/dist/core/bash-execution-controller.js +5 -4
  136. package/dist/core/bash-execution-controller.js.map +1 -1
  137. package/dist/core/bash-executor.d.ts.map +1 -1
  138. package/dist/core/bash-executor.js.map +1 -1
  139. package/dist/core/bedrock-sso-login.d.ts.map +1 -1
  140. package/dist/core/bedrock-sso-login.js.map +1 -1
  141. package/dist/core/billing-failover-controller.d.ts.map +1 -1
  142. package/dist/core/billing-failover-controller.js +3 -3
  143. package/dist/core/billing-failover-controller.js.map +1 -1
  144. package/dist/core/billing-failover.d.ts.map +1 -1
  145. package/dist/core/billing-failover.js.map +1 -1
  146. package/dist/core/capability-contract.d.ts.map +1 -1
  147. package/dist/core/catalog-manager.d.ts.map +1 -1
  148. package/dist/core/catalog-manager.js +0 -0
  149. package/dist/core/catalog-manager.js.map +1 -1
  150. package/dist/core/compaction-controller.d.ts +2 -0
  151. package/dist/core/compaction-controller.d.ts.map +1 -1
  152. package/dist/core/compaction-controller.js +21 -8
  153. package/dist/core/compaction-controller.js.map +1 -1
  154. package/dist/core/compaction-support.d.ts +8 -0
  155. package/dist/core/compaction-support.d.ts.map +1 -1
  156. package/dist/core/compaction-support.js +0 -2
  157. package/dist/core/compaction-support.js.map +1 -1
  158. package/dist/core/context/artifact-retrieval.d.ts.map +1 -1
  159. package/dist/core/context/artifact-retrieval.js.map +1 -1
  160. package/dist/core/context/brain-curator.d.ts.map +1 -1
  161. package/dist/core/context/brain-curator.js +14 -33
  162. package/dist/core/context/brain-curator.js.map +1 -1
  163. package/dist/core/context/context-artifacts.d.ts.map +1 -1
  164. package/dist/core/context/context-artifacts.js +16 -24
  165. package/dist/core/context/context-artifacts.js.map +1 -1
  166. package/dist/core/context/context-audit.d.ts.map +1 -1
  167. package/dist/core/context/context-audit.js +3 -17
  168. package/dist/core/context/context-audit.js.map +1 -1
  169. package/dist/core/context/context-composition.d.ts.map +1 -1
  170. package/dist/core/context/context-composition.js.map +1 -1
  171. package/dist/core/context/context-item.d.ts.map +1 -1
  172. package/dist/core/context/context-item.js.map +1 -1
  173. package/dist/core/context/context-prompt-enforcement.d.ts.map +1 -1
  174. package/dist/core/context/context-prompt-enforcement.js +3 -16
  175. package/dist/core/context/context-prompt-enforcement.js.map +1 -1
  176. package/dist/core/context/context-prompt-policy.d.ts.map +1 -1
  177. package/dist/core/context/context-prompt-policy.js.map +1 -1
  178. package/dist/core/context/context-retention.d.ts.map +1 -1
  179. package/dist/core/context/context-retention.js.map +1 -1
  180. package/dist/core/context/context-store-retention.d.ts.map +1 -1
  181. package/dist/core/context/context-store-retention.js.map +1 -1
  182. package/dist/core/context/context-store.d.ts.map +1 -1
  183. package/dist/core/context/context-store.js.map +1 -1
  184. package/dist/core/context/context-tool-result.d.ts +4 -0
  185. package/dist/core/context/context-tool-result.d.ts.map +1 -0
  186. package/dist/core/context/context-tool-result.js +15 -0
  187. package/dist/core/context/context-tool-result.js.map +1 -0
  188. package/dist/core/context/current-work-memory.d.ts.map +1 -1
  189. package/dist/core/context/current-work-memory.js.map +1 -1
  190. package/dist/core/context/file-store-memory-provider.d.ts.map +1 -1
  191. package/dist/core/context/file-store-memory-provider.js +7 -28
  192. package/dist/core/context/file-store-memory-provider.js.map +1 -1
  193. package/dist/core/context/local-memory-search.d.ts +11 -0
  194. package/dist/core/context/local-memory-search.d.ts.map +1 -0
  195. package/dist/core/context/local-memory-search.js +37 -0
  196. package/dist/core/context/local-memory-search.js.map +1 -0
  197. package/dist/core/context/long-term-memory-trigger.d.ts.map +1 -1
  198. package/dist/core/context/long-term-memory-trigger.js.map +1 -1
  199. package/dist/core/context/memory-diagnostics.d.ts.map +1 -1
  200. package/dist/core/context/memory-diagnostics.js.map +1 -1
  201. package/dist/core/context/memory-index-store.d.ts.map +1 -1
  202. package/dist/core/context/memory-index-store.js.map +1 -1
  203. package/dist/core/context/memory-prompt-block.d.ts.map +1 -1
  204. package/dist/core/context/memory-prompt-block.js.map +1 -1
  205. package/dist/core/context/memory-prompt-budget.d.ts.map +1 -1
  206. package/dist/core/context/memory-prompt-budget.js.map +1 -1
  207. package/dist/core/context/memory-provider-contract.d.ts.map +1 -1
  208. package/dist/core/context/memory-provider-contract.js.map +1 -1
  209. package/dist/core/context/memory-retrieval.d.ts.map +1 -1
  210. package/dist/core/context/memory-retrieval.js.map +1 -1
  211. package/dist/core/context/memory-tier-composer.d.ts.map +1 -1
  212. package/dist/core/context/memory-tier-composer.js.map +1 -1
  213. package/dist/core/context/message-text.d.ts +7 -0
  214. package/dist/core/context/message-text.d.ts.map +1 -0
  215. package/dist/core/context/message-text.js +68 -0
  216. package/dist/core/context/message-text.js.map +1 -0
  217. package/dist/core/context/okf-memory-provider.d.ts.map +1 -1
  218. package/dist/core/context/okf-memory-provider.js +4 -30
  219. package/dist/core/context/okf-memory-provider.js.map +1 -1
  220. package/dist/core/context/okf-memory.d.ts.map +1 -1
  221. package/dist/core/context/okf-memory.js.map +1 -1
  222. package/dist/core/context/policy-engine.d.ts.map +1 -1
  223. package/dist/core/context/policy-engine.js.map +1 -1
  224. package/dist/core/context/policy-types.d.ts.map +1 -1
  225. package/dist/core/context/sqlite-runtime-index.d.ts.map +1 -1
  226. package/dist/core/context/sqlite-runtime-index.js.map +1 -1
  227. package/dist/core/context/storage-authority.d.ts.map +1 -1
  228. package/dist/core/context/tool-output-packer.d.ts.map +1 -1
  229. package/dist/core/context/tool-output-packer.js.map +1 -1
  230. package/dist/core/context-gc.d.ts.map +1 -1
  231. package/dist/core/context-gc.js +14 -21
  232. package/dist/core/context-gc.js.map +1 -1
  233. package/dist/core/context-pipeline.d.ts +1 -3
  234. package/dist/core/context-pipeline.d.ts.map +1 -1
  235. package/dist/core/context-pipeline.js +64 -145
  236. package/dist/core/context-pipeline.js.map +1 -1
  237. package/dist/core/cost/cost-summary.d.ts.map +1 -1
  238. package/dist/core/cost/cost-summary.js.map +1 -1
  239. package/dist/core/cost/daily-usage.d.ts.map +1 -1
  240. package/dist/core/cost/daily-usage.js.map +1 -1
  241. package/dist/core/cost/session-usage.d.ts.map +1 -1
  242. package/dist/core/cost/session-usage.js.map +1 -1
  243. package/dist/core/cost-guard.d.ts.map +1 -1
  244. package/dist/core/cost-guard.js.map +1 -1
  245. package/dist/core/default-tool-surface.d.ts.map +1 -1
  246. package/dist/core/default-tool-surface.js +1 -0
  247. package/dist/core/default-tool-surface.js.map +1 -1
  248. package/dist/core/defaults.d.ts.map +1 -1
  249. package/dist/core/delegation/managed-lane-controller.d.ts.map +1 -1
  250. package/dist/core/delegation/managed-lane-controller.js +2 -6
  251. package/dist/core/delegation/managed-lane-controller.js.map +1 -1
  252. package/dist/core/delegation/session-worker-claim.d.ts.map +1 -1
  253. package/dist/core/delegation/session-worker-claim.js.map +1 -1
  254. package/dist/core/delegation/worker-action-journal.d.ts.map +1 -1
  255. package/dist/core/delegation/worker-action-journal.js +0 -4
  256. package/dist/core/delegation/worker-action-journal.js.map +1 -1
  257. package/dist/core/delegation/worker-actions.d.ts.map +1 -1
  258. package/dist/core/delegation/worker-actions.js.map +1 -1
  259. package/dist/core/delegation/worker-agent-control-coordinator.d.ts +1 -0
  260. package/dist/core/delegation/worker-agent-control-coordinator.d.ts.map +1 -1
  261. package/dist/core/delegation/worker-agent-control-coordinator.js +13 -15
  262. package/dist/core/delegation/worker-agent-control-coordinator.js.map +1 -1
  263. package/dist/core/delegation/worker-agent-control.d.ts.map +1 -1
  264. package/dist/core/delegation/worker-agent-control.js +1 -4
  265. package/dist/core/delegation/worker-agent-control.js.map +1 -1
  266. package/dist/core/delegation/worker-attempt-executor.d.ts.map +1 -1
  267. package/dist/core/delegation/worker-attempt-executor.js.map +1 -1
  268. package/dist/core/delegation/worker-claim.d.ts.map +1 -1
  269. package/dist/core/delegation/worker-claim.js.map +1 -1
  270. package/dist/core/delegation/worker-conversation-store.d.ts.map +1 -1
  271. package/dist/core/delegation/worker-conversation-store.js +0 -2
  272. package/dist/core/delegation/worker-conversation-store.js.map +1 -1
  273. package/dist/core/delegation/worker-delegation-controller.d.ts.map +1 -1
  274. package/dist/core/delegation/worker-delegation-controller.js +5 -14
  275. package/dist/core/delegation/worker-delegation-controller.js.map +1 -1
  276. package/dist/core/delegation/worker-delegation-request.d.ts.map +1 -1
  277. package/dist/core/delegation/worker-dispatch-scheduler.d.ts.map +1 -1
  278. package/dist/core/delegation/worker-dispatch-scheduler.js +5 -6
  279. package/dist/core/delegation/worker-dispatch-scheduler.js.map +1 -1
  280. package/dist/core/delegation/worker-execution-policy.d.ts.map +1 -1
  281. package/dist/core/delegation/worker-execution-policy.js.map +1 -1
  282. package/dist/core/delegation/worker-lane-projection.d.ts.map +1 -1
  283. package/dist/core/delegation/worker-lane-projection.js.map +1 -1
  284. package/dist/core/delegation/worker-lifecycle.d.ts.map +1 -1
  285. package/dist/core/delegation/worker-lifecycle.js +0 -3
  286. package/dist/core/delegation/worker-lifecycle.js.map +1 -1
  287. package/dist/core/delegation/worker-notification-coordinator.d.ts.map +1 -1
  288. package/dist/core/delegation/worker-notification-coordinator.js +4 -5
  289. package/dist/core/delegation/worker-notification-coordinator.js.map +1 -1
  290. package/dist/core/delegation/worker-process-owner.d.ts.map +1 -1
  291. package/dist/core/delegation/worker-process-owner.js.map +1 -1
  292. package/dist/core/delegation/worker-profile-resolver.d.ts.map +1 -1
  293. package/dist/core/delegation/worker-profile-resolver.js +1 -2
  294. package/dist/core/delegation/worker-profile-resolver.js.map +1 -1
  295. package/dist/core/delegation/worker-recovery-coordinator.d.ts.map +1 -1
  296. package/dist/core/delegation/worker-recovery-coordinator.js +3 -4
  297. package/dist/core/delegation/worker-recovery-coordinator.js.map +1 -1
  298. package/dist/core/delegation/worker-resource-catalog.d.ts.map +1 -1
  299. package/dist/core/delegation/worker-resource-catalog.js.map +1 -1
  300. package/dist/core/delegation/worker-resource-materializer.d.ts.map +1 -1
  301. package/dist/core/delegation/worker-resource-materializer.js +1 -4
  302. package/dist/core/delegation/worker-resource-materializer.js.map +1 -1
  303. package/dist/core/delegation/worker-runner.d.ts +2 -4
  304. package/dist/core/delegation/worker-runner.d.ts.map +1 -1
  305. package/dist/core/delegation/worker-runner.js +6 -18
  306. package/dist/core/delegation/worker-runner.js.map +1 -1
  307. package/dist/core/delegation/worker-task-label.d.ts.map +1 -1
  308. package/dist/core/delegation/worker-task-label.js.map +1 -1
  309. package/dist/core/delegation/worker-terminal-finalizer.d.ts.map +1 -1
  310. package/dist/core/delegation/worker-terminal-finalizer.js.map +1 -1
  311. package/dist/core/delegation/worker-write-reservation-coordinator.d.ts.map +1 -1
  312. package/dist/core/delegation/worker-write-reservation-coordinator.js +1 -4
  313. package/dist/core/delegation/worker-write-reservation-coordinator.js.map +1 -1
  314. package/dist/core/delegation/worker-write-reservation.d.ts.map +1 -1
  315. package/dist/core/delegation/worker-write-reservation.js +0 -2
  316. package/dist/core/delegation/worker-write-reservation.js.map +1 -1
  317. package/dist/core/diagnostics.d.ts.map +1 -1
  318. package/dist/core/doctor.d.ts +5 -5
  319. package/dist/core/doctor.d.ts.map +1 -1
  320. package/dist/core/doctor.js +16 -20
  321. package/dist/core/doctor.js.map +1 -1
  322. package/dist/core/event-bus.d.ts.map +1 -1
  323. package/dist/core/event-bus.js.map +1 -1
  324. package/dist/core/exec.d.ts.map +1 -1
  325. package/dist/core/exec.js +26 -7
  326. package/dist/core/exec.js.map +1 -1
  327. package/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
  328. package/dist/core/export-html/ansi-to-html.js +21 -74
  329. package/dist/core/export-html/ansi-to-html.js.map +1 -1
  330. package/dist/core/export-html/index.d.ts.map +1 -1
  331. package/dist/core/export-html/index.js +4 -0
  332. package/dist/core/export-html/index.js.map +1 -1
  333. package/dist/core/export-html/session-tree-foundations.d.mts +67 -0
  334. package/dist/core/export-html/session-tree-foundations.mjs +313 -0
  335. package/dist/core/export-html/template.css +14 -41
  336. package/dist/core/export-html/template.html +3 -1
  337. package/dist/core/export-html/template.js +26 -435
  338. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  339. package/dist/core/export-html/tool-renderer.js.map +1 -1
  340. package/dist/core/extension-import-authority.d.ts.map +1 -1
  341. package/dist/core/extension-import-authority.js.map +1 -1
  342. package/dist/core/extension-metadata.d.ts.map +1 -1
  343. package/dist/core/extension-metadata.js.map +1 -1
  344. package/dist/core/extensions/builtin.d.ts +17 -0
  345. package/dist/core/extensions/builtin.d.ts.map +1 -1
  346. package/dist/core/extensions/builtin.js +18 -54
  347. package/dist/core/extensions/builtin.js.map +1 -1
  348. package/dist/core/extensions/entry-resolution.d.ts +3 -0
  349. package/dist/core/extensions/entry-resolution.d.ts.map +1 -0
  350. package/dist/core/extensions/entry-resolution.js +17 -0
  351. package/dist/core/extensions/entry-resolution.js.map +1 -0
  352. package/dist/core/extensions/index.d.ts.map +1 -1
  353. package/dist/core/extensions/loader.d.ts.map +1 -1
  354. package/dist/core/extensions/loader.js +76 -21
  355. package/dist/core/extensions/loader.js.map +1 -1
  356. package/dist/core/extensions/runner.d.ts +2 -0
  357. package/dist/core/extensions/runner.d.ts.map +1 -1
  358. package/dist/core/extensions/runner.js +41 -112
  359. package/dist/core/extensions/runner.js.map +1 -1
  360. package/dist/core/extensions/stale-context.d.ts.map +1 -1
  361. package/dist/core/extensions/storage.d.ts.map +1 -1
  362. package/dist/core/extensions/storage.js.map +1 -1
  363. package/dist/core/extensions/types.d.ts.map +1 -1
  364. package/dist/core/extensions/types.js.map +1 -1
  365. package/dist/core/extensions/wrapper.d.ts.map +1 -1
  366. package/dist/core/extensions/wrapper.js.map +1 -1
  367. package/dist/core/failure-corpus.d.ts.map +1 -1
  368. package/dist/core/failure-corpus.js +2 -5
  369. package/dist/core/failure-corpus.js.map +1 -1
  370. package/dist/core/footer-data-provider.d.ts.map +1 -1
  371. package/dist/core/footer-data-provider.js +27 -33
  372. package/dist/core/footer-data-provider.js.map +1 -1
  373. package/dist/core/foreground-recovery-controller.d.ts.map +1 -1
  374. package/dist/core/foreground-recovery-controller.js +0 -4
  375. package/dist/core/foreground-recovery-controller.js.map +1 -1
  376. package/dist/core/gateways/channel-provider.d.ts.map +1 -1
  377. package/dist/core/gateways/channel-provider.js +7 -5
  378. package/dist/core/gateways/channel-provider.js.map +1 -1
  379. package/dist/core/goal-loop-controller.d.ts.map +1 -1
  380. package/dist/core/goal-loop-controller.js +0 -1
  381. package/dist/core/goal-loop-controller.js.map +1 -1
  382. package/dist/core/goals/compact-goal-context.d.ts.map +1 -1
  383. package/dist/core/goals/compact-goal-context.js +2 -4
  384. package/dist/core/goals/compact-goal-context.js.map +1 -1
  385. package/dist/core/goals/goal-acceptance.d.ts.map +1 -1
  386. package/dist/core/goals/goal-acceptance.js.map +1 -1
  387. package/dist/core/goals/goal-auto-continue-controller.d.ts.map +1 -1
  388. package/dist/core/goals/goal-auto-continue-controller.js +1 -3
  389. package/dist/core/goals/goal-auto-continue-controller.js.map +1 -1
  390. package/dist/core/goals/goal-continuation-controller.d.ts.map +1 -1
  391. package/dist/core/goals/goal-continuation-controller.js.map +1 -1
  392. package/dist/core/goals/goal-continuation-defaults.d.ts.map +1 -1
  393. package/dist/core/goals/goal-continuation-prompt.d.ts.map +1 -1
  394. package/dist/core/goals/goal-continuation-prompt.js.map +1 -1
  395. package/dist/core/goals/goal-lifecycle.d.ts.map +1 -1
  396. package/dist/core/goals/goal-lifecycle.js.map +1 -1
  397. package/dist/core/goals/goal-record.d.ts.map +1 -1
  398. package/dist/core/goals/goal-record.js.map +1 -1
  399. package/dist/core/goals/goal-runtime-snapshot.d.ts.map +1 -1
  400. package/dist/core/goals/goal-runtime-snapshot.js.map +1 -1
  401. package/dist/core/goals/goal-session-controller.d.ts +15 -0
  402. package/dist/core/goals/goal-session-controller.d.ts.map +1 -1
  403. package/dist/core/goals/goal-session-controller.js +27 -3
  404. package/dist/core/goals/goal-session-controller.js.map +1 -1
  405. package/dist/core/goals/goal-state.d.ts.map +1 -1
  406. package/dist/core/goals/goal-state.js +35 -51
  407. package/dist/core/goals/goal-state.js.map +1 -1
  408. package/dist/core/goals/goal-tool-core.d.ts.map +1 -1
  409. package/dist/core/goals/goal-tool-core.js.map +1 -1
  410. package/dist/core/goals/natural-language-goal.d.ts +9 -0
  411. package/dist/core/goals/natural-language-goal.d.ts.map +1 -0
  412. package/dist/core/goals/natural-language-goal.js +23 -0
  413. package/dist/core/goals/natural-language-goal.js.map +1 -0
  414. package/dist/core/goals/session-goal-state.d.ts.map +1 -1
  415. package/dist/core/goals/session-goal-state.js.map +1 -1
  416. package/dist/core/http-dispatcher.d.ts.map +1 -1
  417. package/dist/core/http-dispatcher.js.map +1 -1
  418. package/dist/core/human-input-controller.d.ts.map +1 -1
  419. package/dist/core/human-input-controller.js +2 -3
  420. package/dist/core/human-input-controller.js.map +1 -1
  421. package/dist/core/human-input.d.ts.map +1 -1
  422. package/dist/core/human-input.js.map +1 -1
  423. package/dist/core/improvement-loop.d.ts.map +1 -1
  424. package/dist/core/improvement-loop.js +11 -11
  425. package/dist/core/improvement-loop.js.map +1 -1
  426. package/dist/core/index.d.ts.map +1 -1
  427. package/dist/core/install-telemetry.d.ts.map +1 -1
  428. package/dist/core/install-telemetry.js.map +1 -1
  429. package/dist/core/isolated-text-completion.d.ts +17 -0
  430. package/dist/core/isolated-text-completion.d.ts.map +1 -0
  431. package/dist/core/isolated-text-completion.js +15 -0
  432. package/dist/core/isolated-text-completion.js.map +1 -0
  433. package/dist/core/keybindings.d.ts +47 -2
  434. package/dist/core/keybindings.d.ts.map +1 -1
  435. package/dist/core/keybindings.js +12 -1
  436. package/dist/core/keybindings.js.map +1 -1
  437. package/dist/core/learning/learning-audit.d.ts.map +1 -1
  438. package/dist/core/learning/learning-audit.js.map +1 -1
  439. package/dist/core/learning/learning-gate.d.ts.map +1 -1
  440. package/dist/core/learning/learning-gate.js.map +1 -1
  441. package/dist/core/learning/observation-store.d.ts.map +1 -1
  442. package/dist/core/learning/observation-store.js +0 -2
  443. package/dist/core/learning/observation-store.js.map +1 -1
  444. package/dist/core/learning/reflection-engine.d.ts +1 -1
  445. package/dist/core/learning/reflection-engine.d.ts.map +1 -1
  446. package/dist/core/learning/reflection-engine.js +3 -0
  447. package/dist/core/learning/reflection-engine.js.map +1 -1
  448. package/dist/core/learning/reflection-turn-analysis.d.ts +20 -0
  449. package/dist/core/learning/reflection-turn-analysis.d.ts.map +1 -0
  450. package/dist/core/learning/reflection-turn-analysis.js +136 -0
  451. package/dist/core/learning/reflection-turn-analysis.js.map +1 -0
  452. package/dist/core/learning/session-learning-decision.d.ts.map +1 -1
  453. package/dist/core/learning/session-learning-decision.js.map +1 -1
  454. package/dist/core/learning/skill-curator.d.ts.map +1 -1
  455. package/dist/core/learning/skill-curator.js +0 -3
  456. package/dist/core/learning/skill-curator.js.map +1 -1
  457. package/dist/core/local-runtime-controller.d.ts +39 -0
  458. package/dist/core/local-runtime-controller.d.ts.map +1 -1
  459. package/dist/core/local-runtime-controller.js +41 -62
  460. package/dist/core/local-runtime-controller.js.map +1 -1
  461. package/dist/core/memory/effectiveness-tracker.d.ts.map +1 -1
  462. package/dist/core/memory/effectiveness-tracker.js +4 -2
  463. package/dist/core/memory/effectiveness-tracker.js.map +1 -1
  464. package/dist/core/memory/memory-manager.d.ts.map +1 -1
  465. package/dist/core/memory/memory-manager.js +7 -7
  466. package/dist/core/memory/memory-manager.js.map +1 -1
  467. package/dist/core/memory/memory-provider.d.ts.map +1 -1
  468. package/dist/core/memory/providers/file-store.d.ts +7 -0
  469. package/dist/core/memory/providers/file-store.d.ts.map +1 -1
  470. package/dist/core/memory/providers/file-store.js +48 -13
  471. package/dist/core/memory/providers/file-store.js.map +1 -1
  472. package/dist/core/memory/providers/transcript-recall-worker-protocol.d.ts +47 -0
  473. package/dist/core/memory/providers/transcript-recall-worker-protocol.d.ts.map +1 -0
  474. package/dist/core/memory/providers/transcript-recall-worker-protocol.js +50 -0
  475. package/dist/core/memory/providers/transcript-recall-worker-protocol.js.map +1 -0
  476. package/dist/core/memory/providers/transcript-recall-worker.d.ts +2 -0
  477. package/dist/core/memory/providers/transcript-recall-worker.d.ts.map +1 -0
  478. package/dist/core/memory/providers/transcript-recall-worker.js +143 -0
  479. package/dist/core/memory/providers/transcript-recall-worker.js.map +1 -0
  480. package/dist/core/memory/providers/transcript-recall.d.ts +24 -13
  481. package/dist/core/memory/providers/transcript-recall.d.ts.map +1 -1
  482. package/dist/core/memory/providers/transcript-recall.js +143 -141
  483. package/dist/core/memory/providers/transcript-recall.js.map +1 -1
  484. package/dist/core/memory/providers/user-memory-archive.d.ts +39 -0
  485. package/dist/core/memory/providers/user-memory-archive.d.ts.map +1 -0
  486. package/dist/core/memory/providers/user-memory-archive.js +258 -0
  487. package/dist/core/memory/providers/user-memory-archive.js.map +1 -0
  488. package/dist/core/memory/transcript-index.d.ts.map +1 -1
  489. package/dist/core/memory/transcript-index.js +1 -1
  490. package/dist/core/memory/transcript-index.js.map +1 -1
  491. package/dist/core/memory-controller.d.ts +9 -0
  492. package/dist/core/memory-controller.d.ts.map +1 -1
  493. package/dist/core/memory-controller.js +57 -16
  494. package/dist/core/memory-controller.js.map +1 -1
  495. package/dist/core/model-capability.d.ts.map +1 -1
  496. package/dist/core/model-capability.js.map +1 -1
  497. package/dist/core/model-output-json.d.ts +10 -0
  498. package/dist/core/model-output-json.d.ts.map +1 -0
  499. package/dist/core/model-output-json.js +43 -0
  500. package/dist/core/model-output-json.js.map +1 -0
  501. package/dist/core/model-registry.d.ts +8 -8
  502. package/dist/core/model-registry.d.ts.map +1 -1
  503. package/dist/core/model-registry.js +29 -52
  504. package/dist/core/model-registry.js.map +1 -1
  505. package/dist/core/model-resolver.d.ts.map +1 -1
  506. package/dist/core/model-resolver.js +1 -1
  507. package/dist/core/model-resolver.js.map +1 -1
  508. package/dist/core/model-router/config-diagnostics.d.ts.map +1 -1
  509. package/dist/core/model-router/config-diagnostics.js.map +1 -1
  510. package/dist/core/model-router/executor-route.d.ts.map +1 -1
  511. package/dist/core/model-router/executor-route.js.map +1 -1
  512. package/dist/core/model-router/fitness-gate.d.ts.map +1 -1
  513. package/dist/core/model-router/fitness-gate.js.map +1 -1
  514. package/dist/core/model-router/intent-classifier.d.ts.map +1 -1
  515. package/dist/core/model-router/route-judge.d.ts.map +1 -1
  516. package/dist/core/model-router/route-judge.js +18 -36
  517. package/dist/core/model-router/route-judge.js.map +1 -1
  518. package/dist/core/model-router/session-buffer.d.ts.map +1 -1
  519. package/dist/core/model-router/session-buffer.js.map +1 -1
  520. package/dist/core/model-router/status.d.ts.map +1 -1
  521. package/dist/core/model-router/status.js.map +1 -1
  522. package/dist/core/model-router/tool-escalation.d.ts.map +1 -1
  523. package/dist/core/model-router/tool-escalation.js.map +1 -1
  524. package/dist/core/model-router-controller.d.ts +1 -0
  525. package/dist/core/model-router-controller.d.ts.map +1 -1
  526. package/dist/core/model-router-controller.js +25 -56
  527. package/dist/core/model-router-controller.js.map +1 -1
  528. package/dist/core/model-selection-controller.d.ts +10 -0
  529. package/dist/core/model-selection-controller.d.ts.map +1 -1
  530. package/dist/core/model-selection-controller.js +0 -1
  531. package/dist/core/model-selection-controller.js.map +1 -1
  532. package/dist/core/model-tool-protocol.d.ts.map +1 -1
  533. package/dist/core/model-tool-protocol.js.map +1 -1
  534. package/dist/core/models/adaptation-store.d.ts.map +1 -1
  535. package/dist/core/models/adaptation-store.js +0 -1
  536. package/dist/core/models/adaptation-store.js.map +1 -1
  537. package/dist/core/models/context-sizing.d.ts.map +1 -1
  538. package/dist/core/models/context-sizing.js.map +1 -1
  539. package/dist/core/models/default-model-suggestions.d.ts.map +1 -1
  540. package/dist/core/models/default-model-suggestions.js.map +1 -1
  541. package/dist/core/models/fitness-store.d.ts.map +1 -1
  542. package/dist/core/models/fitness-store.js +0 -1
  543. package/dist/core/models/fitness-store.js.map +1 -1
  544. package/dist/core/models/host-state-store.d.ts.map +1 -1
  545. package/dist/core/models/host-state-store.js +1 -6
  546. package/dist/core/models/host-state-store.js.map +1 -1
  547. package/dist/core/models/llamacpp-runtime.d.ts +4 -19
  548. package/dist/core/models/llamacpp-runtime.d.ts.map +1 -1
  549. package/dist/core/models/llamacpp-runtime.js +32 -136
  550. package/dist/core/models/llamacpp-runtime.js.map +1 -1
  551. package/dist/core/models/local-registration.d.ts.map +1 -1
  552. package/dist/core/models/local-registration.js +82 -115
  553. package/dist/core/models/local-registration.js.map +1 -1
  554. package/dist/core/models/local-runtime.d.ts +12 -18
  555. package/dist/core/models/local-runtime.d.ts.map +1 -1
  556. package/dist/core/models/local-runtime.js +60 -204
  557. package/dist/core/models/local-runtime.js.map +1 -1
  558. package/dist/core/models/model-endpoint.d.ts.map +1 -1
  559. package/dist/core/models/model-endpoint.js.map +1 -1
  560. package/dist/core/models/model-ref.d.ts.map +1 -1
  561. package/dist/core/models/model-ref.js.map +1 -1
  562. package/dist/core/models/needle-runtime.d.ts +7 -3
  563. package/dist/core/models/needle-runtime.d.ts.map +1 -1
  564. package/dist/core/models/needle-runtime.js +16 -92
  565. package/dist/core/models/needle-runtime.js.map +1 -1
  566. package/dist/core/models/perf-profile.d.ts +1 -1
  567. package/dist/core/models/perf-profile.d.ts.map +1 -1
  568. package/dist/core/models/perf-profile.js +6 -13
  569. package/dist/core/models/perf-profile.js.map +1 -1
  570. package/dist/core/models/prism-llamacpp-lifecycle.d.ts.map +1 -1
  571. package/dist/core/models/prism-llamacpp-lifecycle.js.map +1 -1
  572. package/dist/core/models/runtime-arbiter.d.ts.map +1 -1
  573. package/dist/core/models/runtime-arbiter.js +3 -15
  574. package/dist/core/models/runtime-arbiter.js.map +1 -1
  575. package/dist/core/models/runtime-process.d.ts +100 -0
  576. package/dist/core/models/runtime-process.d.ts.map +1 -0
  577. package/dist/core/models/runtime-process.js +183 -0
  578. package/dist/core/models/runtime-process.js.map +1 -0
  579. package/dist/core/orchestration/agent-resume.d.ts.map +1 -1
  580. package/dist/core/orchestration/agent-resume.js.map +1 -1
  581. package/dist/core/orchestration/attempt-usage.d.ts.map +1 -1
  582. package/dist/core/orchestration/attempt-usage.js.map +1 -1
  583. package/dist/core/orchestration/capability-gateway.d.ts.map +1 -1
  584. package/dist/core/orchestration/capability-gateway.js +0 -14
  585. package/dist/core/orchestration/capability-gateway.js.map +1 -1
  586. package/dist/core/orchestration/contracts.d.ts.map +1 -1
  587. package/dist/core/orchestration/contracts.js.map +1 -1
  588. package/dist/core/orchestration/delegation-ledger.d.ts.map +1 -1
  589. package/dist/core/orchestration/delegation-ledger.js +0 -2
  590. package/dist/core/orchestration/delegation-ledger.js.map +1 -1
  591. package/dist/core/orchestration/event-store.d.ts.map +1 -1
  592. package/dist/core/orchestration/event-store.js +1 -14
  593. package/dist/core/orchestration/event-store.js.map +1 -1
  594. package/dist/core/orchestration/lane-tool-manifests.d.ts.map +1 -1
  595. package/dist/core/orchestration/lane-tool-manifests.js.map +1 -1
  596. package/dist/core/orchestration/model-binding.d.ts.map +1 -1
  597. package/dist/core/orchestration/model-binding.js.map +1 -1
  598. package/dist/core/orchestration/policy-compiler.d.ts.map +1 -1
  599. package/dist/core/orchestration/policy-compiler.js +0 -3
  600. package/dist/core/orchestration/policy-compiler.js.map +1 -1
  601. package/dist/core/orchestration/policy-gate.d.ts.map +1 -1
  602. package/dist/core/orchestration/policy-gate.js +0 -2
  603. package/dist/core/orchestration/policy-gate.js.map +1 -1
  604. package/dist/core/orchestration/profile-registry.d.ts.map +1 -1
  605. package/dist/core/orchestration/profile-registry.js +1 -1
  606. package/dist/core/orchestration/profile-registry.js.map +1 -1
  607. package/dist/core/orchestration/profile-store.d.ts.map +1 -1
  608. package/dist/core/orchestration/profile-store.js +0 -3
  609. package/dist/core/orchestration/profile-store.js.map +1 -1
  610. package/dist/core/orchestration/risk-budget.d.ts.map +1 -1
  611. package/dist/core/orchestration/risk-budget.js.map +1 -1
  612. package/dist/core/orchestration/task-runtime.d.ts +1 -0
  613. package/dist/core/orchestration/task-runtime.d.ts.map +1 -1
  614. package/dist/core/orchestration/task-runtime.js +27 -42
  615. package/dist/core/orchestration/task-runtime.js.map +1 -1
  616. package/dist/core/orchestration/work-state-projection.d.ts.map +1 -1
  617. package/dist/core/orchestration/work-state-projection.js.map +1 -1
  618. package/dist/core/orchestration/worker-execution-contract.d.ts.map +1 -1
  619. package/dist/core/orchestration/worker-execution-contract.js.map +1 -1
  620. package/dist/core/orchestration/worker-result-adapter.d.ts.map +1 -1
  621. package/dist/core/orchestration/worker-result-adapter.js.map +1 -1
  622. package/dist/core/output-guard.d.ts.map +1 -1
  623. package/dist/core/output-guard.js.map +1 -1
  624. package/dist/core/package-manager.d.ts +3 -0
  625. package/dist/core/package-manager.d.ts.map +1 -1
  626. package/dist/core/package-manager.js +88 -353
  627. package/dist/core/package-manager.js.map +1 -1
  628. package/dist/core/process-identity.d.ts.map +1 -1
  629. package/dist/core/process-identity.js.map +1 -1
  630. package/dist/core/process-liveness.d.ts +3 -0
  631. package/dist/core/process-liveness.d.ts.map +1 -0
  632. package/dist/core/process-liveness.js +17 -0
  633. package/dist/core/process-liveness.js.map +1 -0
  634. package/dist/core/process-matrix/codes.d.ts.map +1 -1
  635. package/dist/core/process-matrix/resume-launcher.d.ts.map +1 -1
  636. package/dist/core/process-matrix/resume-launcher.js.map +1 -1
  637. package/dist/core/process-matrix/runtime.d.ts.map +1 -1
  638. package/dist/core/process-matrix/runtime.js.map +1 -1
  639. package/dist/core/process-matrix/store.d.ts.map +1 -1
  640. package/dist/core/process-matrix/store.js.map +1 -1
  641. package/dist/core/process-matrix/supervisor.d.ts.map +1 -1
  642. package/dist/core/process-matrix/supervisor.js.map +1 -1
  643. package/dist/core/profile-filter-controller.d.ts.map +1 -1
  644. package/dist/core/profile-filter-controller.js +7 -8
  645. package/dist/core/profile-filter-controller.js.map +1 -1
  646. package/dist/core/profile-registry.d.ts.map +1 -1
  647. package/dist/core/profile-registry.js +1 -2
  648. package/dist/core/profile-registry.js.map +1 -1
  649. package/dist/core/profile-resource-selection.d.ts.map +1 -1
  650. package/dist/core/profile-resource-selection.js +18 -59
  651. package/dist/core/profile-resource-selection.js.map +1 -1
  652. package/dist/core/prompt-markup.d.ts +3 -0
  653. package/dist/core/prompt-markup.d.ts.map +1 -0
  654. package/dist/core/prompt-markup.js +7 -0
  655. package/dist/core/prompt-markup.js.map +1 -0
  656. package/dist/core/prompt-templates.d.ts.map +1 -1
  657. package/dist/core/prompt-templates.js +13 -39
  658. package/dist/core/prompt-templates.js.map +1 -1
  659. package/dist/core/provider-display-names.d.ts.map +1 -1
  660. package/dist/core/python-runtime.d.ts.map +1 -1
  661. package/dist/core/python-runtime.js.map +1 -1
  662. package/dist/core/reflection-controller.d.ts +22 -1
  663. package/dist/core/reflection-controller.d.ts.map +1 -1
  664. package/dist/core/reflection-controller.js +143 -25
  665. package/dist/core/reflection-controller.js.map +1 -1
  666. package/dist/core/reload-blockers.d.ts +2 -1
  667. package/dist/core/reload-blockers.d.ts.map +1 -1
  668. package/dist/core/reload-blockers.js +4 -14
  669. package/dist/core/reload-blockers.js.map +1 -1
  670. package/dist/core/request-auth.d.ts.map +1 -1
  671. package/dist/core/request-auth.js.map +1 -1
  672. package/dist/core/research/automata-provider.d.ts.map +1 -1
  673. package/dist/core/research/automata-provider.js.map +1 -1
  674. package/dist/core/research/evidence-bundle.d.ts.map +1 -1
  675. package/dist/core/research/evidence-bundle.js.map +1 -1
  676. package/dist/core/research/lane-model-resolver.d.ts.map +1 -1
  677. package/dist/core/research/lane-model-resolver.js +0 -1
  678. package/dist/core/research/lane-model-resolver.js.map +1 -1
  679. package/dist/core/research/model-fitness-controller.d.ts.map +1 -1
  680. package/dist/core/research/model-fitness-controller.js +17 -33
  681. package/dist/core/research/model-fitness-controller.js.map +1 -1
  682. package/dist/core/research/model-fitness.d.ts.map +1 -1
  683. package/dist/core/research/model-fitness.js +4 -25
  684. package/dist/core/research/model-fitness.js.map +1 -1
  685. package/dist/core/research/research-gate.d.ts.map +1 -1
  686. package/dist/core/research/research-gate.js.map +1 -1
  687. package/dist/core/research/research-lane-controller.d.ts.map +1 -1
  688. package/dist/core/research/research-lane-controller.js +5 -10
  689. package/dist/core/research/research-lane-controller.js.map +1 -1
  690. package/dist/core/research/research-runner.d.ts +2 -4
  691. package/dist/core/research/research-runner.d.ts.map +1 -1
  692. package/dist/core/research/research-runner.js +17 -48
  693. package/dist/core/research/research-runner.js.map +1 -1
  694. package/dist/core/research/session-evidence-bundle.d.ts.map +1 -1
  695. package/dist/core/research/session-evidence-bundle.js.map +1 -1
  696. package/dist/core/research/workspace-collector.d.ts.map +1 -1
  697. package/dist/core/research/workspace-collector.js.map +1 -1
  698. package/dist/core/resolve-config-value.d.ts.map +1 -1
  699. package/dist/core/resolve-config-value.js.map +1 -1
  700. package/dist/core/resource-ignore.d.ts +6 -0
  701. package/dist/core/resource-ignore.d.ts.map +1 -0
  702. package/dist/core/resource-ignore.js +44 -0
  703. package/dist/core/resource-ignore.js.map +1 -0
  704. package/dist/core/resource-loader.d.ts +0 -1
  705. package/dist/core/resource-loader.d.ts.map +1 -1
  706. package/dist/core/resource-loader.js +52 -187
  707. package/dist/core/resource-loader.js.map +1 -1
  708. package/dist/core/resource-profile-blocks.d.ts +3 -1
  709. package/dist/core/resource-profile-blocks.d.ts.map +1 -1
  710. package/dist/core/resource-profile-blocks.js +8 -5
  711. package/dist/core/resource-profile-blocks.js.map +1 -1
  712. package/dist/core/resource-profile-equality.d.ts.map +1 -1
  713. package/dist/core/resource-profile-equality.js.map +1 -1
  714. package/dist/core/resource-traversal.d.ts +43 -0
  715. package/dist/core/resource-traversal.d.ts.map +1 -0
  716. package/dist/core/resource-traversal.js +84 -0
  717. package/dist/core/resource-traversal.js.map +1 -0
  718. package/dist/core/risk-classifier.d.ts.map +1 -1
  719. package/dist/core/risk-classifier.js.map +1 -1
  720. package/dist/core/runtime-builder.d.ts +4 -1
  721. package/dist/core/runtime-builder.d.ts.map +1 -1
  722. package/dist/core/runtime-builder.js +25 -50
  723. package/dist/core/runtime-builder.js.map +1 -1
  724. package/dist/core/scout-controller.d.ts.map +1 -1
  725. package/dist/core/scout-controller.js +0 -1
  726. package/dist/core/scout-controller.js.map +1 -1
  727. package/dist/core/sdk.d.ts.map +1 -1
  728. package/dist/core/sdk.js.map +1 -1
  729. package/dist/core/secrets/credential-exposure-guard.d.ts.map +1 -1
  730. package/dist/core/secrets/credential-exposure-guard.js +101 -43
  731. package/dist/core/secrets/credential-exposure-guard.js.map +1 -1
  732. package/dist/core/secrets/secret-dotenv.d.ts.map +1 -1
  733. package/dist/core/secrets/secret-dotenv.js +0 -1
  734. package/dist/core/secrets/secret-dotenv.js.map +1 -1
  735. package/dist/core/secrets/secret-vault-format.d.ts.map +1 -1
  736. package/dist/core/secrets/secret-vault-format.js +0 -1
  737. package/dist/core/secrets/secret-vault-format.js.map +1 -1
  738. package/dist/core/secrets/secret-vault.d.ts.map +1 -1
  739. package/dist/core/secrets/secret-vault.js +2 -10
  740. package/dist/core/secrets/secret-vault.js.map +1 -1
  741. package/dist/core/security/secret-text.d.ts.map +1 -1
  742. package/dist/core/security/secret-text.js.map +1 -1
  743. package/dist/core/security/untrusted-boundary.d.ts.map +1 -1
  744. package/dist/core/security/untrusted-boundary.js.map +1 -1
  745. package/dist/core/session-analytics.d.ts.map +1 -1
  746. package/dist/core/session-analytics.js +18 -50
  747. package/dist/core/session-analytics.js.map +1 -1
  748. package/dist/core/session-artifact-bundle.d.ts.map +1 -1
  749. package/dist/core/session-artifact-bundle.js.map +1 -1
  750. package/dist/core/session-cwd.d.ts.map +1 -1
  751. package/dist/core/session-cwd.js +0 -1
  752. package/dist/core/session-cwd.js.map +1 -1
  753. package/dist/core/session-entry-index.d.ts +8 -0
  754. package/dist/core/session-entry-index.d.ts.map +1 -0
  755. package/dist/core/session-entry-index.js +16 -0
  756. package/dist/core/session-entry-index.js.map +1 -0
  757. package/dist/core/session-image-store.d.ts.map +1 -1
  758. package/dist/core/session-image-store.js +0 -3
  759. package/dist/core/session-image-store.js.map +1 -1
  760. package/dist/core/session-jsonl-writer.d.ts +3 -0
  761. package/dist/core/session-jsonl-writer.d.ts.map +1 -0
  762. package/dist/core/session-jsonl-writer.js +38 -0
  763. package/dist/core/session-jsonl-writer.js.map +1 -0
  764. package/dist/core/session-manager-factory.d.ts.map +1 -1
  765. package/dist/core/session-manager-factory.js.map +1 -1
  766. package/dist/core/session-role.d.ts.map +1 -1
  767. package/dist/core/session-role.js.map +1 -1
  768. package/dist/core/session-snapshot.d.ts.map +1 -1
  769. package/dist/core/session-snapshot.js.map +1 -1
  770. package/dist/core/session-supervision-runtime.d.ts.map +1 -1
  771. package/dist/core/session-supervision-runtime.js +1 -4
  772. package/dist/core/session-supervision-runtime.js.map +1 -1
  773. package/dist/core/session-tree-navigator.d.ts.map +1 -1
  774. package/dist/core/session-tree-navigator.js +0 -1
  775. package/dist/core/session-tree-navigator.js.map +1 -1
  776. package/dist/core/settings-manager.d.ts +2 -1
  777. package/dist/core/settings-manager.d.ts.map +1 -1
  778. package/dist/core/settings-manager.js +64 -162
  779. package/dist/core/settings-manager.js.map +1 -1
  780. package/dist/core/skill-block.d.mts +8 -0
  781. package/dist/core/skill-block.mjs +52 -0
  782. package/dist/core/skill-discovery.d.ts +5 -0
  783. package/dist/core/skill-discovery.d.ts.map +1 -0
  784. package/dist/core/skill-discovery.js +34 -0
  785. package/dist/core/skill-discovery.js.map +1 -0
  786. package/dist/core/skills.d.ts.map +1 -1
  787. package/dist/core/skills.js +23 -159
  788. package/dist/core/skills.js.map +1 -1
  789. package/dist/core/slash-commands.d.ts.map +1 -1
  790. package/dist/core/source-info.d.ts.map +1 -1
  791. package/dist/core/source-info.js.map +1 -1
  792. package/dist/core/spawned-usage.d.ts +21 -0
  793. package/dist/core/spawned-usage.d.ts.map +1 -0
  794. package/dist/core/spawned-usage.js +29 -0
  795. package/dist/core/spawned-usage.js.map +1 -0
  796. package/dist/core/system-prompt-builder.d.ts +4 -0
  797. package/dist/core/system-prompt-builder.d.ts.map +1 -1
  798. package/dist/core/system-prompt-builder.js +15 -8
  799. package/dist/core/system-prompt-builder.js.map +1 -1
  800. package/dist/core/system-prompt.d.ts.map +1 -1
  801. package/dist/core/system-prompt.js +53 -35
  802. package/dist/core/system-prompt.js.map +1 -1
  803. package/dist/core/tasks/session-task-state.d.ts.map +1 -1
  804. package/dist/core/tasks/session-task-state.js.map +1 -1
  805. package/dist/core/tasks/task-command.d.ts.map +1 -1
  806. package/dist/core/tasks/task-command.js.map +1 -1
  807. package/dist/core/tasks/task-contract-monitor.d.ts.map +1 -1
  808. package/dist/core/tasks/task-contract-monitor.js.map +1 -1
  809. package/dist/core/tasks/task-projection.d.ts.map +1 -1
  810. package/dist/core/tasks/task-projection.js.map +1 -1
  811. package/dist/core/tasks/task-state.d.ts.map +1 -1
  812. package/dist/core/tasks/task-state.js.map +1 -1
  813. package/dist/core/text-preview.d.ts +4 -0
  814. package/dist/core/text-preview.d.ts.map +1 -0
  815. package/dist/core/text-preview.js +33 -0
  816. package/dist/core/text-preview.js.map +1 -0
  817. package/dist/core/timings.d.ts.map +1 -1
  818. package/dist/core/timings.js.map +1 -1
  819. package/dist/core/tool-capability-policy.d.ts.map +1 -1
  820. package/dist/core/tool-capability-policy.js.map +1 -1
  821. package/dist/core/tool-gate-controller.d.ts.map +1 -1
  822. package/dist/core/tool-gate-controller.js +86 -87
  823. package/dist/core/tool-gate-controller.js.map +1 -1
  824. package/dist/core/tool-protocol-controller.d.ts +4 -1
  825. package/dist/core/tool-protocol-controller.d.ts.map +1 -1
  826. package/dist/core/tool-protocol-controller.js +19 -23
  827. package/dist/core/tool-protocol-controller.js.map +1 -1
  828. package/dist/core/tool-recovery-log-records.d.ts.map +1 -1
  829. package/dist/core/tool-recovery-log-records.js.map +1 -1
  830. package/dist/core/tool-recovery-log-worker.d.ts.map +1 -1
  831. package/dist/core/tool-recovery-log-worker.js.map +1 -1
  832. package/dist/core/tool-recovery-logger.d.ts.map +1 -1
  833. package/dist/core/tool-recovery-logger.js +12 -24
  834. package/dist/core/tool-recovery-logger.js.map +1 -1
  835. package/dist/core/tool-recovery-stats.d.ts.map +1 -1
  836. package/dist/core/tool-recovery-stats.js +16 -22
  837. package/dist/core/tool-recovery-stats.js.map +1 -1
  838. package/dist/core/tool-repair-health.d.ts.map +1 -1
  839. package/dist/core/tool-repair-health.js.map +1 -1
  840. package/dist/core/tool-repair-settings.d.ts.map +1 -1
  841. package/dist/core/tool-repair-settings.js.map +1 -1
  842. package/dist/core/tool-selection/expected-utility.d.ts.map +1 -1
  843. package/dist/core/tool-selection/expected-utility.js.map +1 -1
  844. package/dist/core/tool-selection/promotion.d.ts.map +1 -1
  845. package/dist/core/tool-selection/promotion.js.map +1 -1
  846. package/dist/core/tool-selection/tool-performance-store.d.ts +2 -0
  847. package/dist/core/tool-selection/tool-performance-store.d.ts.map +1 -1
  848. package/dist/core/tool-selection/tool-performance-store.js +49 -7
  849. package/dist/core/tool-selection/tool-performance-store.js.map +1 -1
  850. package/dist/core/tool-selection/tool-phase-timing.d.ts +19 -0
  851. package/dist/core/tool-selection/tool-phase-timing.d.ts.map +1 -0
  852. package/dist/core/tool-selection/tool-phase-timing.js +63 -0
  853. package/dist/core/tool-selection/tool-phase-timing.js.map +1 -0
  854. package/dist/core/tool-selection/tool-selection-controller.d.ts +2 -5
  855. package/dist/core/tool-selection/tool-selection-controller.d.ts.map +1 -1
  856. package/dist/core/tool-selection/tool-selection-controller.js +50 -30
  857. package/dist/core/tool-selection/tool-selection-controller.js.map +1 -1
  858. package/dist/core/toolkit/reflex-interpreter.d.ts +16 -0
  859. package/dist/core/toolkit/reflex-interpreter.d.ts.map +1 -1
  860. package/dist/core/toolkit/reflex-interpreter.js +21 -0
  861. package/dist/core/toolkit/reflex-interpreter.js.map +1 -1
  862. package/dist/core/toolkit/script-registry.d.ts.map +1 -1
  863. package/dist/core/toolkit/script-registry.js.map +1 -1
  864. package/dist/core/toolkit/script-runner.d.ts.map +1 -1
  865. package/dist/core/toolkit/script-runner.js.map +1 -1
  866. package/dist/core/tools/artifact-retrieve.d.ts.map +1 -1
  867. package/dist/core/tools/artifact-retrieve.js.map +1 -1
  868. package/dist/core/tools/ask-question.d.ts +2 -3
  869. package/dist/core/tools/ask-question.d.ts.map +1 -1
  870. package/dist/core/tools/ask-question.js +14 -40
  871. package/dist/core/tools/ask-question.js.map +1 -1
  872. package/dist/core/tools/bash.d.ts +2 -0
  873. package/dist/core/tools/bash.d.ts.map +1 -1
  874. package/dist/core/tools/bash.js +83 -30
  875. package/dist/core/tools/bash.js.map +1 -1
  876. package/dist/core/tools/context-scout.d.ts.map +1 -1
  877. package/dist/core/tools/context-scout.js.map +1 -1
  878. package/dist/core/tools/delegate-status.d.ts.map +1 -1
  879. package/dist/core/tools/delegate-status.js +9 -7
  880. package/dist/core/tools/delegate-status.js.map +1 -1
  881. package/dist/core/tools/delegate.d.ts.map +1 -1
  882. package/dist/core/tools/delegate.js +6 -6
  883. package/dist/core/tools/delegate.js.map +1 -1
  884. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  885. package/dist/core/tools/edit-diff.js.map +1 -1
  886. package/dist/core/tools/edit.d.ts.map +1 -1
  887. package/dist/core/tools/edit.js.map +1 -1
  888. package/dist/core/tools/extensionify.d.ts.map +1 -1
  889. package/dist/core/tools/extensionify.js.map +1 -1
  890. package/dist/core/tools/fff-search-backend.d.ts +19 -0
  891. package/dist/core/tools/fff-search-backend.d.ts.map +1 -1
  892. package/dist/core/tools/fff-search-backend.js +28 -2
  893. package/dist/core/tools/fff-search-backend.js.map +1 -1
  894. package/dist/core/tools/file-encoding-policy.d.ts.map +1 -1
  895. package/dist/core/tools/file-encoding-policy.js.map +1 -1
  896. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
  897. package/dist/core/tools/file-mutation-queue.js.map +1 -1
  898. package/dist/core/tools/find.d.ts +1 -1
  899. package/dist/core/tools/find.d.ts.map +1 -1
  900. package/dist/core/tools/find.js +44 -108
  901. package/dist/core/tools/find.js.map +1 -1
  902. package/dist/core/tools/git-filter.d.ts.map +1 -1
  903. package/dist/core/tools/git-filter.js.map +1 -1
  904. package/dist/core/tools/goal.d.ts.map +1 -1
  905. package/dist/core/tools/goal.js +7 -7
  906. package/dist/core/tools/goal.js.map +1 -1
  907. package/dist/core/tools/grep.d.ts +1 -1
  908. package/dist/core/tools/grep.d.ts.map +1 -1
  909. package/dist/core/tools/grep.js +42 -102
  910. package/dist/core/tools/grep.js.map +1 -1
  911. package/dist/core/tools/index.d.ts.map +1 -1
  912. package/dist/core/tools/index.js.map +1 -1
  913. package/dist/core/tools/ls.d.ts.map +1 -1
  914. package/dist/core/tools/ls.js +20 -36
  915. package/dist/core/tools/ls.js.map +1 -1
  916. package/dist/core/tools/model-fitness.d.ts.map +1 -1
  917. package/dist/core/tools/model-fitness.js.map +1 -1
  918. package/dist/core/tools/orchestration-panel.d.ts +5 -0
  919. package/dist/core/tools/orchestration-panel.d.ts.map +1 -1
  920. package/dist/core/tools/orchestration-panel.js +5 -5
  921. package/dist/core/tools/orchestration-panel.js.map +1 -1
  922. package/dist/core/tools/output-accumulator.d.ts +2 -0
  923. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  924. package/dist/core/tools/output-accumulator.js +24 -36
  925. package/dist/core/tools/output-accumulator.js.map +1 -1
  926. package/dist/core/tools/path-utils.d.ts.map +1 -1
  927. package/dist/core/tools/path-utils.js.map +1 -1
  928. package/dist/core/tools/persistent-process-coordinator.d.ts +31 -0
  929. package/dist/core/tools/persistent-process-coordinator.d.ts.map +1 -0
  930. package/dist/core/tools/persistent-process-coordinator.js +123 -0
  931. package/dist/core/tools/persistent-process-coordinator.js.map +1 -0
  932. package/dist/core/tools/python.d.ts.map +1 -1
  933. package/dist/core/tools/python.js.map +1 -1
  934. package/dist/core/tools/read.d.ts.map +1 -1
  935. package/dist/core/tools/read.js +14 -13
  936. package/dist/core/tools/read.js.map +1 -1
  937. package/dist/core/tools/render-utils.d.ts +29 -0
  938. package/dist/core/tools/render-utils.d.ts.map +1 -1
  939. package/dist/core/tools/render-utils.js +31 -1
  940. package/dist/core/tools/render-utils.js.map +1 -1
  941. package/dist/core/tools/run-process.d.ts.map +1 -1
  942. package/dist/core/tools/run-process.js.map +1 -1
  943. package/dist/core/tools/run-toolkit-script.d.ts.map +1 -1
  944. package/dist/core/tools/run-toolkit-script.js.map +1 -1
  945. package/dist/core/tools/search-command-guard.d.ts +10 -0
  946. package/dist/core/tools/search-command-guard.d.ts.map +1 -1
  947. package/dist/core/tools/search-command-guard.js +118 -31
  948. package/dist/core/tools/search-command-guard.js.map +1 -1
  949. package/dist/core/tools/search-router.d.ts.map +1 -1
  950. package/dist/core/tools/search-router.js.map +1 -1
  951. package/dist/core/tools/search-tool-runtime.d.ts +19 -0
  952. package/dist/core/tools/search-tool-runtime.d.ts.map +1 -0
  953. package/dist/core/tools/search-tool-runtime.js +12 -0
  954. package/dist/core/tools/search-tool-runtime.js.map +1 -0
  955. package/dist/core/tools/secret-store.d.ts.map +1 -1
  956. package/dist/core/tools/secret-store.js.map +1 -1
  957. package/dist/core/tools/shell-command-parser.d.ts.map +1 -1
  958. package/dist/core/tools/shell-command-parser.js.map +1 -1
  959. package/dist/core/tools/shell-contract-router.d.ts.map +1 -1
  960. package/dist/core/tools/shell-contract-router.js +4 -1
  961. package/dist/core/tools/shell-contract-router.js.map +1 -1
  962. package/dist/core/tools/shell-execution-session.d.ts +4 -0
  963. package/dist/core/tools/shell-execution-session.d.ts.map +1 -0
  964. package/dist/core/tools/shell-execution-session.js +11 -0
  965. package/dist/core/tools/shell-execution-session.js.map +1 -0
  966. package/dist/core/tools/shell-output-projection.d.ts +49 -0
  967. package/dist/core/tools/shell-output-projection.d.ts.map +1 -0
  968. package/dist/core/tools/shell-output-projection.js +381 -0
  969. package/dist/core/tools/shell-output-projection.js.map +1 -0
  970. package/dist/core/tools/shell-session.d.ts +2 -13
  971. package/dist/core/tools/shell-session.d.ts.map +1 -1
  972. package/dist/core/tools/shell-session.js +36 -136
  973. package/dist/core/tools/shell-session.js.map +1 -1
  974. package/dist/core/tools/skill-audit.d.ts.map +1 -1
  975. package/dist/core/tools/skill-audit.js.map +1 -1
  976. package/dist/core/tools/skillify.d.ts.map +1 -1
  977. package/dist/core/tools/skillify.js.map +1 -1
  978. package/dist/core/tools/task-steps.d.ts +8 -8
  979. package/dist/core/tools/task-steps.d.ts.map +1 -1
  980. package/dist/core/tools/task-steps.js +17 -18
  981. package/dist/core/tools/task-steps.js.map +1 -1
  982. package/dist/core/tools/tmux-dispatch.d.ts.map +1 -1
  983. package/dist/core/tools/tmux-dispatch.js.map +1 -1
  984. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  985. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  986. package/dist/core/tools/tool-task.d.ts +23 -0
  987. package/dist/core/tools/tool-task.d.ts.map +1 -0
  988. package/dist/core/tools/tool-task.js +93 -0
  989. package/dist/core/tools/tool-task.js.map +1 -0
  990. package/dist/core/tools/windows-shell-engine.d.ts +17 -11
  991. package/dist/core/tools/windows-shell-engine.d.ts.map +1 -1
  992. package/dist/core/tools/windows-shell-engine.js +339 -117
  993. package/dist/core/tools/windows-shell-engine.js.map +1 -1
  994. package/dist/core/tools/windows-shell-state.d.ts.map +1 -1
  995. package/dist/core/tools/windows-shell-state.js.map +1 -1
  996. package/dist/core/tools/worktree-sync.d.ts.map +1 -1
  997. package/dist/core/tools/worktree-sync.js +8 -12
  998. package/dist/core/tools/worktree-sync.js.map +1 -1
  999. package/dist/core/tools/write.d.ts.map +1 -1
  1000. package/dist/core/tools/write.js +0 -1
  1001. package/dist/core/tools/write.js.map +1 -1
  1002. package/dist/core/trust-manager.d.ts.map +1 -1
  1003. package/dist/core/trust-manager.js +7 -40
  1004. package/dist/core/trust-manager.js.map +1 -1
  1005. package/dist/core/util/atomic-file.d.ts +19 -0
  1006. package/dist/core/util/atomic-file.d.ts.map +1 -1
  1007. package/dist/core/util/atomic-file.js +50 -15
  1008. package/dist/core/util/atomic-file.js.map +1 -1
  1009. package/dist/core/util/bounded-file.d.ts.map +1 -1
  1010. package/dist/core/util/bounded-file.js.map +1 -1
  1011. package/dist/core/util/bounded-jsonl.d.ts.map +1 -1
  1012. package/dist/core/util/bounded-jsonl.js +2 -9
  1013. package/dist/core/util/bounded-jsonl.js.map +1 -1
  1014. package/dist/core/util/bounded-value.d.ts.map +1 -1
  1015. package/dist/core/util/bounded-value.js.map +1 -1
  1016. package/dist/core/util/json-size.d.ts +3 -0
  1017. package/dist/core/util/json-size.d.ts.map +1 -0
  1018. package/dist/core/util/json-size.js +95 -0
  1019. package/dist/core/util/json-size.js.map +1 -0
  1020. package/dist/core/util/minimatch-cache.d.ts.map +1 -1
  1021. package/dist/core/util/minimatch-cache.js.map +1 -1
  1022. package/dist/core/util/value-guards.d.ts.map +1 -1
  1023. package/dist/core/util/value-guards.js.map +1 -1
  1024. package/dist/core/worktree-sync/codes.d.ts.map +1 -1
  1025. package/dist/core/worktree-sync/git-engine.d.ts.map +1 -1
  1026. package/dist/core/worktree-sync/git-engine.js +20 -36
  1027. package/dist/core/worktree-sync/git-engine.js.map +1 -1
  1028. package/dist/core/worktree-sync/lane-gate.d.ts.map +1 -1
  1029. package/dist/core/worktree-sync/lane-gate.js +1 -4
  1030. package/dist/core/worktree-sync/lane-gate.js.map +1 -1
  1031. package/dist/core/worktree-sync/runtime.d.ts.map +1 -1
  1032. package/dist/core/worktree-sync/runtime.js.map +1 -1
  1033. package/dist/core/worktree-sync/store.d.ts.map +1 -1
  1034. package/dist/core/worktree-sync/store.js.map +1 -1
  1035. package/dist/core/worktree-sync/watcher.d.ts.map +1 -1
  1036. package/dist/core/worktree-sync/watcher.js.map +1 -1
  1037. package/dist/index.d.ts.map +1 -1
  1038. package/dist/index.js.map +1 -1
  1039. package/dist/main.d.ts.map +1 -1
  1040. package/dist/main.js +10 -32
  1041. package/dist/main.js.map +1 -1
  1042. package/dist/migrations.d.ts.map +1 -1
  1043. package/dist/migrations.js +6 -19
  1044. package/dist/migrations.js.map +1 -1
  1045. package/dist/modes/index.d.ts.map +1 -1
  1046. package/dist/modes/interactive/auth-dialogs-controller.d.ts +3 -0
  1047. package/dist/modes/interactive/auth-dialogs-controller.d.ts.map +1 -1
  1048. package/dist/modes/interactive/auth-dialogs-controller.js +96 -132
  1049. package/dist/modes/interactive/auth-dialogs-controller.js.map +1 -1
  1050. package/dist/modes/interactive/auto-learn-controller.d.ts +1 -31
  1051. package/dist/modes/interactive/auto-learn-controller.d.ts.map +1 -1
  1052. package/dist/modes/interactive/auto-learn-controller.js +86 -307
  1053. package/dist/modes/interactive/auto-learn-controller.js.map +1 -1
  1054. package/dist/modes/interactive/autocomplete-provider.d.ts.map +1 -1
  1055. package/dist/modes/interactive/autocomplete-provider.js.map +1 -1
  1056. package/dist/modes/interactive/autonomy-commands.d.ts.map +1 -1
  1057. package/dist/modes/interactive/autonomy-commands.js +2 -8
  1058. package/dist/modes/interactive/autonomy-commands.js.map +1 -1
  1059. package/dist/modes/interactive/clipboard-input.d.ts +5 -1
  1060. package/dist/modes/interactive/clipboard-input.d.ts.map +1 -1
  1061. package/dist/modes/interactive/clipboard-input.js +17 -0
  1062. package/dist/modes/interactive/clipboard-input.js.map +1 -1
  1063. package/dist/modes/interactive/compaction-queue.d.ts.map +1 -1
  1064. package/dist/modes/interactive/compaction-queue.js +13 -18
  1065. package/dist/modes/interactive/compaction-queue.js.map +1 -1
  1066. package/dist/modes/interactive/components/activity-lane.d.ts.map +1 -1
  1067. package/dist/modes/interactive/components/activity-lane.js +6 -10
  1068. package/dist/modes/interactive/components/activity-lane.js.map +1 -1
  1069. package/dist/modes/interactive/components/armin.d.ts +1 -0
  1070. package/dist/modes/interactive/components/armin.d.ts.map +1 -1
  1071. package/dist/modes/interactive/components/armin.js +10 -21
  1072. package/dist/modes/interactive/components/armin.js.map +1 -1
  1073. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  1074. package/dist/modes/interactive/components/assistant-message.js +1 -6
  1075. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  1076. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  1077. package/dist/modes/interactive/components/bash-execution.js +4 -9
  1078. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  1079. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
  1080. package/dist/modes/interactive/components/bordered-loader.js +0 -3
  1081. package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  1082. package/dist/modes/interactive/components/branch-summary-message.d.ts +3 -8
  1083. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  1084. package/dist/modes/interactive/components/branch-summary-message.js +13 -35
  1085. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  1086. package/dist/modes/interactive/components/compaction-summary-message.d.ts +3 -8
  1087. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  1088. package/dist/modes/interactive/components/compaction-summary-message.js +14 -36
  1089. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  1090. package/dist/modes/interactive/components/config-selector.d.ts +1 -0
  1091. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  1092. package/dist/modes/interactive/components/config-selector.js +20 -43
  1093. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  1094. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
  1095. package/dist/modes/interactive/components/countdown-timer.js +0 -5
  1096. package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
  1097. package/dist/modes/interactive/components/custom-editor.d.ts +2 -0
  1098. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  1099. package/dist/modes/interactive/components/custom-editor.js +4 -8
  1100. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  1101. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  1102. package/dist/modes/interactive/components/custom-message.js +1 -6
  1103. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  1104. package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
  1105. package/dist/modes/interactive/components/daxnuts.js +6 -8
  1106. package/dist/modes/interactive/components/daxnuts.js.map +1 -1
  1107. package/dist/modes/interactive/components/diff.d.ts.map +1 -1
  1108. package/dist/modes/interactive/components/diff.js.map +1 -1
  1109. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  1110. package/dist/modes/interactive/components/dynamic-border.js +0 -1
  1111. package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  1112. package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -1
  1113. package/dist/modes/interactive/components/earendil-announcement.js.map +1 -1
  1114. package/dist/modes/interactive/components/expandable-markdown-message.d.ts +21 -0
  1115. package/dist/modes/interactive/components/expandable-markdown-message.d.ts.map +1 -0
  1116. package/dist/modes/interactive/components/expandable-markdown-message.js +48 -0
  1117. package/dist/modes/interactive/components/expandable-markdown-message.js.map +1 -0
  1118. package/dist/modes/interactive/components/expandable-text.d.ts.map +1 -1
  1119. package/dist/modes/interactive/components/expandable-text.js +0 -2
  1120. package/dist/modes/interactive/components/expandable-text.js.map +1 -1
  1121. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  1122. package/dist/modes/interactive/components/extension-editor.js +1 -9
  1123. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  1124. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  1125. package/dist/modes/interactive/components/extension-input.js +2 -8
  1126. package/dist/modes/interactive/components/extension-input.js.map +1 -1
  1127. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  1128. package/dist/modes/interactive/components/extension-selector.js +5 -20
  1129. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  1130. package/dist/modes/interactive/components/fitness-role-selector.d.ts.map +1 -1
  1131. package/dist/modes/interactive/components/fitness-role-selector.js +0 -1
  1132. package/dist/modes/interactive/components/fitness-role-selector.js.map +1 -1
  1133. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  1134. package/dist/modes/interactive/components/footer.js +1 -5
  1135. package/dist/modes/interactive/components/footer.js.map +1 -1
  1136. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  1137. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  1138. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  1139. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  1140. package/dist/modes/interactive/components/login-dialog.js +4 -10
  1141. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  1142. package/dist/modes/interactive/components/model-selector.d.ts +2 -2
  1143. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  1144. package/dist/modes/interactive/components/model-selector.js +21 -44
  1145. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  1146. package/dist/modes/interactive/components/model-suggestion-selector.d.ts.map +1 -1
  1147. package/dist/modes/interactive/components/model-suggestion-selector.js +0 -1
  1148. package/dist/modes/interactive/components/model-suggestion-selector.js.map +1 -1
  1149. package/dist/modes/interactive/components/oauth-selector.d.ts +1 -1
  1150. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  1151. package/dist/modes/interactive/components/oauth-selector.js +16 -32
  1152. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  1153. package/dist/modes/interactive/components/profile-resource-editor.d.ts +3 -4
  1154. package/dist/modes/interactive/components/profile-resource-editor.d.ts.map +1 -1
  1155. package/dist/modes/interactive/components/profile-resource-editor.js +34 -93
  1156. package/dist/modes/interactive/components/profile-resource-editor.js.map +1 -1
  1157. package/dist/modes/interactive/components/profile-selector.d.ts.map +1 -1
  1158. package/dist/modes/interactive/components/profile-selector.js +0 -1
  1159. package/dist/modes/interactive/components/profile-selector.js.map +1 -1
  1160. package/dist/modes/interactive/components/scoped-models-selector.d.ts +3 -4
  1161. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  1162. package/dist/modes/interactive/components/scoped-models-selector.js +34 -79
  1163. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  1164. package/dist/modes/interactive/components/selector-list.d.ts +63 -0
  1165. package/dist/modes/interactive/components/selector-list.d.ts.map +1 -0
  1166. package/dist/modes/interactive/components/selector-list.js +186 -0
  1167. package/dist/modes/interactive/components/selector-list.js.map +1 -0
  1168. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  1169. package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  1170. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  1171. package/dist/modes/interactive/components/session-selector.js +34 -59
  1172. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  1173. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  1174. package/dist/modes/interactive/components/settings-selector.js +40 -138
  1175. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  1176. package/dist/modes/interactive/components/show-images-selector.d.ts +2 -4
  1177. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
  1178. package/dist/modes/interactive/components/show-images-selector.js +9 -28
  1179. package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
  1180. package/dist/modes/interactive/components/skill-invocation-message.d.ts +3 -8
  1181. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  1182. package/dist/modes/interactive/components/skill-invocation-message.js +12 -40
  1183. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  1184. package/dist/modes/interactive/components/theme-selector.d.ts +2 -5
  1185. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
  1186. package/dist/modes/interactive/components/theme-selector.js +11 -37
  1187. package/dist/modes/interactive/components/theme-selector.js.map +1 -1
  1188. package/dist/modes/interactive/components/thinking-selector.d.ts +2 -4
  1189. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  1190. package/dist/modes/interactive/components/thinking-selector.js +9 -31
  1191. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  1192. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  1193. package/dist/modes/interactive/components/tool-execution.js +9 -28
  1194. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  1195. package/dist/modes/interactive/components/tool-group.d.ts.map +1 -1
  1196. package/dist/modes/interactive/components/tool-group.js +2 -3
  1197. package/dist/modes/interactive/components/tool-group.js.map +1 -1
  1198. package/dist/modes/interactive/components/tool-panel-registry.d.ts.map +1 -1
  1199. package/dist/modes/interactive/components/tool-panel-registry.js +5 -3
  1200. package/dist/modes/interactive/components/tool-panel-registry.js.map +1 -1
  1201. package/dist/modes/interactive/components/tool-title.d.ts.map +1 -1
  1202. package/dist/modes/interactive/components/tool-title.js +0 -4
  1203. package/dist/modes/interactive/components/tool-title.js.map +1 -1
  1204. package/dist/modes/interactive/components/transcript-pager.d.ts +26 -0
  1205. package/dist/modes/interactive/components/transcript-pager.d.ts.map +1 -0
  1206. package/dist/modes/interactive/components/transcript-pager.js +81 -0
  1207. package/dist/modes/interactive/components/transcript-pager.js.map +1 -0
  1208. package/dist/modes/interactive/components/tree-selector.d.ts +1 -12
  1209. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  1210. package/dist/modes/interactive/components/tree-selector.js +42 -402
  1211. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  1212. package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -1
  1213. package/dist/modes/interactive/components/trust-selector.js +4 -16
  1214. package/dist/modes/interactive/components/trust-selector.js.map +1 -1
  1215. package/dist/modes/interactive/components/usage-action-selector.d.ts.map +1 -1
  1216. package/dist/modes/interactive/components/usage-action-selector.js +2 -10
  1217. package/dist/modes/interactive/components/usage-action-selector.js.map +1 -1
  1218. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  1219. package/dist/modes/interactive/components/user-message-selector.js +3 -6
  1220. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  1221. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  1222. package/dist/modes/interactive/components/user-message.js +0 -1
  1223. package/dist/modes/interactive/components/user-message.js.map +1 -1
  1224. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -1
  1225. package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
  1226. package/dist/modes/interactive/config-backup.d.ts.map +1 -1
  1227. package/dist/modes/interactive/config-backup.js.map +1 -1
  1228. package/dist/modes/interactive/editor-overlay-host.d.ts.map +1 -1
  1229. package/dist/modes/interactive/editor-overlay-host.js +0 -3
  1230. package/dist/modes/interactive/editor-overlay-host.js.map +1 -1
  1231. package/dist/modes/interactive/extension-ui-host.d.ts +2 -0
  1232. package/dist/modes/interactive/extension-ui-host.d.ts.map +1 -1
  1233. package/dist/modes/interactive/extension-ui-host.js +51 -72
  1234. package/dist/modes/interactive/extension-ui-host.js.map +1 -1
  1235. package/dist/modes/interactive/external-editor.d.ts.map +1 -1
  1236. package/dist/modes/interactive/external-editor.js +2 -15
  1237. package/dist/modes/interactive/external-editor.js.map +1 -1
  1238. package/dist/modes/interactive/history-reload-math.d.ts.map +1 -1
  1239. package/dist/modes/interactive/history-reload-math.js.map +1 -1
  1240. package/dist/modes/interactive/interactive-event-controller.d.ts.map +1 -1
  1241. package/dist/modes/interactive/interactive-event-controller.js +23 -16
  1242. package/dist/modes/interactive/interactive-event-controller.js.map +1 -1
  1243. package/dist/modes/interactive/interactive-mode.d.ts +13 -4
  1244. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  1245. package/dist/modes/interactive/interactive-mode.js +126 -207
  1246. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  1247. package/dist/modes/interactive/interactive-selection-prompts.d.ts +20 -0
  1248. package/dist/modes/interactive/interactive-selection-prompts.d.ts.map +1 -0
  1249. package/dist/modes/interactive/interactive-selection-prompts.js +43 -0
  1250. package/dist/modes/interactive/interactive-selection-prompts.js.map +1 -0
  1251. package/dist/modes/interactive/key-handlers.d.ts +2 -1
  1252. package/dist/modes/interactive/key-handlers.d.ts.map +1 -1
  1253. package/dist/modes/interactive/key-handlers.js +4 -2
  1254. package/dist/modes/interactive/key-handlers.js.map +1 -1
  1255. package/dist/modes/interactive/loaded-resources-view.d.ts.map +1 -1
  1256. package/dist/modes/interactive/loaded-resources-view.js.map +1 -1
  1257. package/dist/modes/interactive/local-model-commands.d.ts.map +1 -1
  1258. package/dist/modes/interactive/local-model-commands.js +4 -9
  1259. package/dist/modes/interactive/local-model-commands.js.map +1 -1
  1260. package/dist/modes/interactive/model-fitness-presentation.d.ts +21 -0
  1261. package/dist/modes/interactive/model-fitness-presentation.d.ts.map +1 -0
  1262. package/dist/modes/interactive/model-fitness-presentation.js +13 -0
  1263. package/dist/modes/interactive/model-fitness-presentation.js.map +1 -0
  1264. package/dist/modes/interactive/profile-menu-controller.d.ts +2 -0
  1265. package/dist/modes/interactive/profile-menu-controller.d.ts.map +1 -1
  1266. package/dist/modes/interactive/profile-menu-controller.js +79 -171
  1267. package/dist/modes/interactive/profile-menu-controller.js.map +1 -1
  1268. package/dist/modes/interactive/report-commands.d.ts +2 -0
  1269. package/dist/modes/interactive/report-commands.d.ts.map +1 -1
  1270. package/dist/modes/interactive/report-commands.js +12 -6
  1271. package/dist/modes/interactive/report-commands.js.map +1 -1
  1272. package/dist/modes/interactive/resource-display.d.ts.map +1 -1
  1273. package/dist/modes/interactive/resource-display.js.map +1 -1
  1274. package/dist/modes/interactive/resource-shell-commands.d.ts.map +1 -1
  1275. package/dist/modes/interactive/resource-shell-commands.js +6 -23
  1276. package/dist/modes/interactive/resource-shell-commands.js.map +1 -1
  1277. package/dist/modes/interactive/session-flow-commands.d.ts.map +1 -1
  1278. package/dist/modes/interactive/session-flow-commands.js +21 -25
  1279. package/dist/modes/interactive/session-flow-commands.js.map +1 -1
  1280. package/dist/modes/interactive/session-io-commands.d.ts.map +1 -1
  1281. package/dist/modes/interactive/session-io-commands.js.map +1 -1
  1282. package/dist/modes/interactive/session-replacement-errors.d.ts.map +1 -1
  1283. package/dist/modes/interactive/session-replacement-errors.js.map +1 -1
  1284. package/dist/modes/interactive/settings-selector-flow.d.ts.map +1 -1
  1285. package/dist/modes/interactive/settings-selector-flow.js.map +1 -1
  1286. package/dist/modes/interactive/signal-lifecycle.d.ts.map +1 -1
  1287. package/dist/modes/interactive/signal-lifecycle.js.map +1 -1
  1288. package/dist/modes/interactive/startup-checks.d.ts.map +1 -1
  1289. package/dist/modes/interactive/startup-checks.js +12 -8
  1290. package/dist/modes/interactive/startup-checks.js.map +1 -1
  1291. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  1292. package/dist/modes/interactive/theme/theme.js +10 -76
  1293. package/dist/modes/interactive/theme/theme.js.map +1 -1
  1294. package/dist/modes/interactive/usage-commands.d.ts.map +1 -1
  1295. package/dist/modes/interactive/usage-commands.js.map +1 -1
  1296. package/dist/modes/print-mode.d.ts.map +1 -1
  1297. package/dist/modes/print-mode.js +5 -22
  1298. package/dist/modes/print-mode.js.map +1 -1
  1299. package/dist/modes/rpc/jsonl.d.ts.map +1 -1
  1300. package/dist/modes/rpc/jsonl.js +1 -1
  1301. package/dist/modes/rpc/jsonl.js.map +1 -1
  1302. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  1303. package/dist/modes/rpc/rpc-client.js +7 -8
  1304. package/dist/modes/rpc/rpc-client.js.map +1 -1
  1305. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  1306. package/dist/modes/rpc/rpc-mode.js +5 -20
  1307. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  1308. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  1309. package/dist/modes/rpc/rpc-types.js.map +1 -1
  1310. package/dist/modes/termination-signals.d.ts +4 -0
  1311. package/dist/modes/termination-signals.d.ts.map +1 -0
  1312. package/dist/modes/termination-signals.js +21 -0
  1313. package/dist/modes/termination-signals.js.map +1 -0
  1314. package/dist/package-manager-cli.d.ts.map +1 -1
  1315. package/dist/package-manager-cli.js.map +1 -1
  1316. package/dist/utils/ansi-colors.d.ts +5 -0
  1317. package/dist/utils/ansi-colors.d.ts.map +1 -0
  1318. package/dist/utils/ansi-colors.js +38 -0
  1319. package/dist/utils/ansi-colors.js.map +1 -0
  1320. package/dist/utils/ansi.d.ts.map +1 -1
  1321. package/dist/utils/ansi.js.map +1 -1
  1322. package/dist/utils/changelog.d.ts.map +1 -1
  1323. package/dist/utils/changelog.js.map +1 -1
  1324. package/dist/utils/child-process.d.ts.map +1 -1
  1325. package/dist/utils/child-process.js.map +1 -1
  1326. package/dist/utils/clipboard-image.d.ts.map +1 -1
  1327. package/dist/utils/clipboard-image.js.map +1 -1
  1328. package/dist/utils/clipboard-native.d.ts.map +1 -1
  1329. package/dist/utils/clipboard-native.js.map +1 -1
  1330. package/dist/utils/clipboard.d.ts.map +1 -1
  1331. package/dist/utils/clipboard.js.map +1 -1
  1332. package/dist/utils/deprecation.d.ts.map +1 -1
  1333. package/dist/utils/deprecation.js.map +1 -1
  1334. package/dist/utils/exif-orientation.d.ts.map +1 -1
  1335. package/dist/utils/exif-orientation.js.map +1 -1
  1336. package/dist/utils/external-editor-command.d.ts.map +1 -1
  1337. package/dist/utils/external-editor-command.js.map +1 -1
  1338. package/dist/utils/frontmatter.d.ts.map +1 -1
  1339. package/dist/utils/frontmatter.js.map +1 -1
  1340. package/dist/utils/fs-watch.d.ts.map +1 -1
  1341. package/dist/utils/fs-watch.js.map +1 -1
  1342. package/dist/utils/git.d.ts.map +1 -1
  1343. package/dist/utils/git.js +20 -28
  1344. package/dist/utils/git.js.map +1 -1
  1345. package/dist/utils/highlight-js-languages.d.ts.map +1 -1
  1346. package/dist/utils/html.d.ts.map +1 -1
  1347. package/dist/utils/html.js.map +1 -1
  1348. package/dist/utils/image-convert.d.ts.map +1 -1
  1349. package/dist/utils/image-convert.js.map +1 -1
  1350. package/dist/utils/image-resize-core.d.ts.map +1 -1
  1351. package/dist/utils/image-resize-core.js.map +1 -1
  1352. package/dist/utils/image-resize-worker.d.ts.map +1 -1
  1353. package/dist/utils/image-resize-worker.js.map +1 -1
  1354. package/dist/utils/image-resize.d.ts.map +1 -1
  1355. package/dist/utils/image-resize.js.map +1 -1
  1356. package/dist/utils/json.d.ts.map +1 -1
  1357. package/dist/utils/json.js.map +1 -1
  1358. package/dist/utils/mime.d.ts.map +1 -1
  1359. package/dist/utils/mime.js.map +1 -1
  1360. package/dist/utils/open-browser.d.ts.map +1 -1
  1361. package/dist/utils/open-browser.js.map +1 -1
  1362. package/dist/utils/paths.d.ts.map +1 -1
  1363. package/dist/utils/paths.js.map +1 -1
  1364. package/dist/utils/photon.d.ts.map +1 -1
  1365. package/dist/utils/photon.js.map +1 -1
  1366. package/dist/utils/pi-user-agent.d.ts.map +1 -1
  1367. package/dist/utils/pi-user-agent.js.map +1 -1
  1368. package/dist/utils/platform.d.ts.map +1 -1
  1369. package/dist/utils/platform.js.map +1 -1
  1370. package/dist/utils/process-memory.d.ts.map +1 -1
  1371. package/dist/utils/process-memory.js.map +1 -1
  1372. package/dist/utils/safe-write-stream.d.ts.map +1 -1
  1373. package/dist/utils/safe-write-stream.js.map +1 -1
  1374. package/dist/utils/shell.d.ts.map +1 -1
  1375. package/dist/utils/shell.js.map +1 -1
  1376. package/dist/utils/sleep.d.ts.map +1 -1
  1377. package/dist/utils/sleep.js +2 -15
  1378. package/dist/utils/sleep.js.map +1 -1
  1379. package/dist/utils/stdin-events.d.ts +8 -0
  1380. package/dist/utils/stdin-events.d.ts.map +1 -0
  1381. package/dist/utils/stdin-events.js +19 -0
  1382. package/dist/utils/stdin-events.js.map +1 -0
  1383. package/dist/utils/syntax-highlight.d.ts.map +1 -1
  1384. package/dist/utils/syntax-highlight.js +20 -13
  1385. package/dist/utils/syntax-highlight.js.map +1 -1
  1386. package/dist/utils/tools-manager.d.ts +6 -1
  1387. package/dist/utils/tools-manager.d.ts.map +1 -1
  1388. package/dist/utils/tools-manager.js +59 -2
  1389. package/dist/utils/tools-manager.js.map +1 -1
  1390. package/dist/utils/version-check.d.ts.map +1 -1
  1391. package/dist/utils/version-check.js.map +1 -1
  1392. package/dist/utils/windows-self-update.d.ts.map +1 -1
  1393. package/dist/utils/windows-self-update.js.map +1 -1
  1394. package/dist/utils/work-directory.d.ts.map +1 -1
  1395. package/dist/utils/work-directory.js.map +1 -1
  1396. package/docs/compaction.md +11 -3
  1397. package/docs/development.md +1 -1
  1398. package/docs/sessions.md +6 -0
  1399. package/docs/settings.md +1 -1
  1400. package/docs/windows.md +28 -3
  1401. package/docs/work-directory.md +10 -2
  1402. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  1403. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  1404. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  1405. package/examples/extensions/sandbox/package-lock.json +2 -2
  1406. package/examples/extensions/sandbox/package.json +1 -1
  1407. package/examples/extensions/with-deps/package-lock.json +2 -2
  1408. package/examples/extensions/with-deps/package.json +1 -1
  1409. package/npm-shrinkwrap.json +27 -27
  1410. package/package.json +11 -11
  1411. package/dist/utils/streaming-lines.d.ts +0 -20
  1412. package/dist/utils/streaming-lines.d.ts.map +0 -1
  1413. package/dist/utils/streaming-lines.js +0 -79
  1414. package/dist/utils/streaming-lines.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"llamacpp-runtime.d.ts","sourceRoot":"","sources":["../../../src/core/models/llamacpp-runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import { type ChildProcess, spawn } from \"node:child_process\";\nimport {\n\tcreateWriteStream,\n\ttype Dirent,\n\texistsSync,\n\tmkdirSync,\n\treaddirSync,\n\treadFileSync,\n\trmSync,\n\tstatSync,\n\twriteFileSync,\n} from \"node:fs\";\nimport { arch as osArch, platform as osPlatform } from \"node:os\";\nimport { dirname, join, relative } from \"node:path\";\nimport type { Readable, Writable } from \"node:stream\";\nimport { pipeline } from \"node:stream/promises\";\nimport { spawnProcess, spawnProcessSync, waitForChildProcessWithTermination } from \"../../utils/child-process.ts\";\nimport { killProcessTree, trackDetachedChildPid, untrackDetachedChildPid } from \"../../utils/shell.ts\";\nimport { modelsDir as agentModelsDir, runtimesDir as agentRuntimesDir } from \"../agent-paths.ts\";\n\n/**\n * Managed runtime for prism-ml 1-bit GGUF models (Bonsai-27B first). The provider requires their\n * llama.cpp fork (Q1_0_g128 hybrid-attention kernels) — stock llama.cpp/Ollama cannot serve these\n * weights — so this module owns runtime install (prebuilt release download+extract), GGUF\n * downloads, and llama-server lifecycle. Mirrors local-runtime.ts's OllamaRuntime: injectable\n * seams for fetch/spawn/exists, pi-owned directories under agentDir (runtimes/, models/),\n * detached+tracked child processes, onProgress as best-effort UI feedback, honest error taxonomies\n * instead of silent fallbacks.\n *\n * The fork publishes precompiled per-platform archives on GitHub Releases (no local build): pin a\n * release tag, download the matching asset, extract it, and locate the `llama-server` binary once\n * at install time (release archive layouts vary — bin/ vs build/bin/ at the top level — so this is\n * a deterministic one-time scan, not a fallback). The found relative path and backend (cpu/cuda)\n * are persisted to a manifest so later `detect()`/`serve()` calls never need to re-scan.\n */\n\n/**\n * Pinned Prism ML llama.cpp fork release — verified via\n * `GET https://api.github.com/repos/PrismML-Eng/llama.cpp/releases/tags/prism-b9594-38c66ad` on\n * 2026-07-18 (release exists, all assets referenced below are present on it). Bump here (and\n * re-verify with the same API call) when the provider ships new kernels.\n */\nexport const PRISM_LLAMACPP_PINNED_RELEASE = \"prism-b9594-38c66ad\";\n\nexport const PRISM_LLAMACPP_RELEASES_BASE_URL = \"https://github.com/PrismML-Eng/llama.cpp/releases/download\";\n\nexport interface PrismModelDescriptor {\n\trepo: string;\n\tfile: string;\n\tmmprojFile?: string;\n\tdisplayName: string;\n}\n\n/** Curated first-model descriptor; the `/models add` wiring task consumes this. */\nexport const BONSAI_27B: PrismModelDescriptor = {\n\trepo: \"prism-ml/Bonsai-27B-gguf\",\n\tfile: \"Bonsai-27B-Q1_0.gguf\",\n\tmmprojFile: \"Bonsai-27B-mmproj-Q8_0.gguf\",\n\tdisplayName: \"Bonsai-27B (1-bit Q1_0 + vision)\",\n};\n\nexport type PrismBackend = \"cpu\" | \"cuda\";\nexport type PrismAssetKind = \"tar-gz\" | \"zip\";\n\nexport interface PrismLlamaAsset {\n\tname: string;\n\tkind: PrismAssetKind;\n\tbackend: PrismBackend;\n}\n\n// Verbatim asset names from the pinned release (see PRISM_LLAMACPP_PINNED_RELEASE doc comment) —\n// hardcoded rather than templated from the tag because the provider's naming isn't fully\n// consistent across platforms (Windows CPU assets drop the tag/commit segment entirely; the\n// Windows CUDA asset uses a different build-number segment, \"b1\" not \"b9594\").\nconst LINUX_X64_CPU_ASSET = \"llama-prism-b9594-38c66ad-bin-ubuntu-x64.tar.gz\";\nconst LINUX_ARM64_CPU_ASSET = \"llama-prism-b9594-38c66ad-bin-ubuntu-arm64.tar.gz\";\nconst LINUX_X64_CUDA_ASSET = \"llama-prism-b9594-38c66ad-bin-linux-cuda-12.4-x64.tar.gz\";\nconst MACOS_ARM64_ASSET = \"llama-prism-b9594-38c66ad-bin-macos-arm64.tar.gz\";\nconst MACOS_X64_ASSET = \"llama-prism-b9594-38c66ad-bin-macos-x64.tar.gz\";\nconst WIN_X64_CPU_ASSET = \"llama-bin-win-cpu-x64.zip\";\nconst WIN_ARM64_CPU_ASSET = \"llama-bin-win-cpu-arm64.zip\";\n\n/**\n * Maps a platform/arch/GPU triple to the exact Prism llama.cpp release asset for\n * {@link PRISM_LLAMACPP_PINNED_RELEASE} — verified against the real GitHub release, not guessed.\n * CPU asset by default; the CUDA 12.4 variant is only offered for linux x64 with an NVIDIA GPU\n * present (a 12.8 variant also exists upstream but has no wired caller yet). Windows CUDA needs a\n * companion `cudart-*` archive and is out of scope for v1 — Windows always resolves to the CPU zip\n * regardless of `hasNvidiaGpu`. Pure and exported so it's independently testable.\n */\nexport function resolvePrismLlamaAsset(\n\tplat: string,\n\tarchitecture: string,\n\thasNvidiaGpu: boolean,\n): PrismLlamaAsset | undefined {\n\tif (plat === \"linux\") {\n\t\tif (architecture === \"x64\") {\n\t\t\treturn hasNvidiaGpu\n\t\t\t\t? { name: LINUX_X64_CUDA_ASSET, kind: \"tar-gz\", backend: \"cuda\" }\n\t\t\t\t: { name: LINUX_X64_CPU_ASSET, kind: \"tar-gz\", backend: \"cpu\" };\n\t\t}\n\t\tif (architecture === \"arm64\") return { name: LINUX_ARM64_CPU_ASSET, kind: \"tar-gz\", backend: \"cpu\" };\n\t\treturn undefined;\n\t}\n\tif (plat === \"darwin\") {\n\t\tif (architecture === \"arm64\") return { name: MACOS_ARM64_ASSET, kind: \"tar-gz\", backend: \"cpu\" };\n\t\tif (architecture === \"x64\") return { name: MACOS_X64_ASSET, kind: \"tar-gz\", backend: \"cpu\" };\n\t\treturn undefined;\n\t}\n\tif (plat === \"win32\") {\n\t\tif (architecture === \"x64\") return { name: WIN_X64_CPU_ASSET, kind: \"zip\", backend: \"cpu\" };\n\t\tif (architecture === \"arm64\") return { name: WIN_ARM64_CPU_ASSET, kind: \"zip\", backend: \"cpu\" };\n\t\treturn undefined;\n\t}\n\treturn undefined;\n}\n\nexport interface PrismDetectResult {\n\truntimeInstalled: boolean;\n\tbinaryPath?: string;\n\trelease?: string;\n}\n\nexport interface PrismDownloadResult {\n\tok: boolean;\n\tpath?: string;\n\tskipped?: boolean;\n\terror?: string;\n}\n\nexport type PrismServeResult = { ok: true; baseUrl: string } | { ok: false; error: string };\n\ninterface PrismInstallManifest {\n\trelease: string;\n\tbinaryRelPath: string;\n\tbackend: PrismBackend;\n}\n\ntype PrismSpawnOptions = { detached?: boolean; stdio?: \"ignore\"; env?: NodeJS.ProcessEnv };\ntype PrismSpawnFn = (\n\tcommand: string,\n\targs: string[],\n\toptions: PrismSpawnOptions,\n) => Pick<ChildProcess, \"pid\" | \"kill\" | \"unref\" | \"on\">;\ntype PrismExtractArchiveFn = (\n\tinput: Readable,\n\tdestDir: string,\n\tkind: PrismAssetKind,\n) => Promise<{ ok: boolean; error?: string }>;\n\nexport interface PrismLlamaCppDeps {\n\tfetchFn?: typeof fetch;\n\tspawnFn?: PrismSpawnFn;\n\texistsFn?: (path: string) => boolean;\n\tsleepFn?: (ms: number) => Promise<void>;\n\t/** Whether a named command exists on PATH (nvidia-smi, tar — for zip extraction on Windows). */\n\thasCommand?: (command: string) => boolean;\n\t/** Decided once at install time and persisted as `backend` — serve() reads the persisted value\n\t * so `-ngl 99` reflects what was actually installed, not the host's current GPU state. */\n\thasNvidiaGpu?: () => boolean;\n\tplatform?: () => string;\n\tarch?: () => string;\n\t/** Runs the extraction step for a downloaded archive. Injectable so installManaged's\n\t * download->extract->scan orchestration is testable without a real tar/unzip pipeline; defaults\n\t * to the real spawn-based extractor. */\n\textractArchive?: PrismExtractArchiveFn;\n\t/** Health-poll bounds for serve(); default ~120s (240 * 500ms), both overridable for tests. */\n\thealthPollAttempts?: number;\n\thealthPollIntervalMs?: number;\n}\n\nconst EXTRACTION_TIMEOUT_MS = 10 * 60_000;\nconst COMMAND_KILL_GRACE_MS = 2_000;\nconst DEFAULT_HEALTH_POLL_ATTEMPTS = 240;\nconst DEFAULT_HEALTH_POLL_INTERVAL_MS = 500;\nconst HEALTH_CHECK_TIMEOUT_MS = 2_000;\nconst HEAD_REQUEST_TIMEOUT_MS = 10_000;\n\nfunction parseContentLength(header: string | null): number | undefined {\n\tif (!header) return undefined;\n\tconst value = Number(header);\n\treturn Number.isFinite(value) && value >= 0 ? value : undefined;\n}\n\n/**\n * `spawnProcess(..., { stdio: [\"pipe\", ...] })` always yields a non-null `stdin` at runtime, but\n * child-process.ts's typed overload only narrows `.stdin` for the capture-only stdio shape used\n * elsewhere. This makes the true invariant explicit and fails loudly instead of silently\n * misbehaving if it's ever violated by a future stdio change.\n */\nfunction requireStdin(proc: ChildProcess, label: string): Writable {\n\tif (!proc.stdin) throw new Error(`${label}: no stdin pipe`);\n\treturn proc.stdin;\n}\n\nexport class PrismLlamaCppRuntime {\n\tprivate readonly _agentDir: string;\n\tprivate readonly _fetch: typeof fetch;\n\tprivate readonly _spawn: PrismSpawnFn;\n\tprivate readonly _exists: (path: string) => boolean;\n\tprivate readonly _sleep: (ms: number) => Promise<void>;\n\tprivate readonly _hasCommand: (command: string) => boolean;\n\tprivate readonly _hasNvidiaGpu: () => boolean;\n\tprivate readonly _platform: () => string;\n\tprivate readonly _arch: () => string;\n\tprivate readonly _extractArchiveOverride: PrismExtractArchiveFn | undefined;\n\tprivate readonly _healthPollAttempts: number;\n\tprivate readonly _healthPollIntervalMs: number;\n\tprivate _child: Pick<ChildProcess, \"pid\" | \"kill\" | \"unref\" | \"on\"> | undefined;\n\n\tconstructor(args: { agentDir: string; deps?: PrismLlamaCppDeps }) {\n\t\tthis._agentDir = args.agentDir;\n\t\tthis._fetch = args.deps?.fetchFn ?? fetch;\n\t\tthis._spawn =\n\t\t\targs.deps?.spawnFn ?? ((command, argv, options) => spawn(command, argv, { ...options, stdio: \"ignore\" }));\n\t\tthis._exists = args.deps?.existsFn ?? existsSync;\n\t\tthis._sleep = args.deps?.sleepFn ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));\n\t\tthis._hasCommand =\n\t\t\targs.deps?.hasCommand ??\n\t\t\t((command) =>\n\t\t\t\tspawnProcessSync(command, [\"--version\"], { encoding: \"utf8\", timeout: 5_000 }).error === undefined);\n\t\tthis._hasNvidiaGpu = args.deps?.hasNvidiaGpu ?? (() => this._hasCommand(\"nvidia-smi\"));\n\t\tthis._platform = args.deps?.platform ?? osPlatform;\n\t\tthis._arch = args.deps?.arch ?? osArch;\n\t\tthis._extractArchiveOverride = args.deps?.extractArchive;\n\t\tthis._healthPollAttempts = args.deps?.healthPollAttempts ?? DEFAULT_HEALTH_POLL_ATTEMPTS;\n\t\tthis._healthPollIntervalMs = args.deps?.healthPollIntervalMs ?? DEFAULT_HEALTH_POLL_INTERVAL_MS;\n\t}\n\n\truntimeDir(): string {\n\t\treturn agentRuntimesDir(\"prism-llamacpp\", this._agentDir);\n\t}\n\n\tmodelsDir(): string {\n\t\treturn agentModelsDir(\"llamacpp\", this._agentDir);\n\t}\n\n\tprivate _binaryName(): string {\n\t\treturn this._platform() === \"win32\" ? \"llama-server.exe\" : \"llama-server\";\n\t}\n\n\tprivate _manifestPath(): string {\n\t\treturn join(this.runtimeDir(), \"install.json\");\n\t}\n\n\tprivate _readManifest(): PrismInstallManifest | undefined {\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(readFileSync(this._manifestPath(), \"utf8\")) as {\n\t\t\t\trelease?: unknown;\n\t\t\t\tbinaryRelPath?: unknown;\n\t\t\t\tbackend?: unknown;\n\t\t\t};\n\t\t\tif (\n\t\t\t\ttypeof parsed.release === \"string\" &&\n\t\t\t\ttypeof parsed.binaryRelPath === \"string\" &&\n\t\t\t\t(parsed.backend === \"cpu\" || parsed.backend === \"cuda\")\n\t\t\t) {\n\t\t\t\treturn { release: parsed.release, binaryRelPath: parsed.binaryRelPath, backend: parsed.backend };\n\t\t\t}\n\t\t\treturn undefined;\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\tprivate _writeManifest(manifest: PrismInstallManifest): void {\n\t\twriteFileSync(this._manifestPath(), JSON.stringify(manifest, null, \"\\t\"));\n\t}\n\n\tasync detect(): Promise<PrismDetectResult> {\n\t\tconst manifest = this._readManifest();\n\t\tif (!manifest) return { runtimeInstalled: false };\n\t\tconst binaryPath = join(this.runtimeDir(), manifest.binaryRelPath);\n\t\tconst runtimeInstalled = this._exists(binaryPath);\n\t\treturn {\n\t\t\truntimeInstalled,\n\t\t\tbinaryPath: runtimeInstalled ? binaryPath : undefined,\n\t\t\trelease: manifest.release,\n\t\t};\n\t}\n\n\t/** One-time recursive scan for the `llama-server` binary inside a freshly extracted release\n\t * archive — layouts vary (bin/ vs build/bin/ at the top level) across platforms/backends, so\n\t * this locates it deterministically instead of assuming a fixed path, then the result is\n\t * persisted so later calls never need to re-scan. */\n\tprivate _findBinaryRelPath(root: string): string | undefined {\n\t\tconst targetName = this._binaryName();\n\t\tconst stack: string[] = [root];\n\t\twhile (stack.length > 0) {\n\t\t\tconst dir = stack.pop();\n\t\t\tif (dir === undefined) continue;\n\t\t\tlet entries: Dirent[];\n\t\t\ttry {\n\t\t\t\tentries = readdirSync(dir, { withFileTypes: true });\n\t\t\t} catch {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tfor (const entry of entries) {\n\t\t\t\tconst full = join(dir, entry.name);\n\t\t\t\tif (entry.isDirectory()) stack.push(full);\n\t\t\t\telse if (entry.isFile() && entry.name === targetName) return relative(root, full);\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Download the pinned release asset for this host and extract it (consent-gated by the caller,\n\t * same contract as OllamaRuntime#installManaged — this method only does the mechanical\n\t * download+extract+locate and reports the outcome honestly). No compiler toolchain required:\n\t * the fork ships prebuilt binaries.\n\t */\n\tasync installManaged(onProgress?: (status: string) => void): Promise<{ ok: boolean; error?: string }> {\n\t\tconst asset = resolvePrismLlamaAsset(this._platform(), this._arch(), this._hasNvidiaGpu());\n\t\tif (!asset) return { ok: false, error: \"unsupported-platform\" };\n\n\t\tonProgress?.(`Downloading ${asset.name}…`);\n\t\tconst downloadUrl = `${PRISM_LLAMACPP_RELEASES_BASE_URL}/${PRISM_LLAMACPP_PINNED_RELEASE}/${asset.name}`;\n\t\tlet response: Response;\n\t\ttry {\n\t\t\tresponse = await this._fetch(downloadUrl);\n\t\t} catch (error) {\n\t\t\treturn { ok: false, error: `download-fail: ${error instanceof Error ? error.message : String(error)}` };\n\t\t}\n\t\tif (!response.ok || !response.body) {\n\t\t\treturn { ok: false, error: `download-fail: HTTP ${response.status}` };\n\t\t}\n\n\t\tconst destDir = this.runtimeDir();\n\t\tmkdirSync(destDir, { recursive: true });\n\n\t\tonProgress?.(`Extracting ${asset.name}…`);\n\t\tconst extract = this._extractArchiveOverride ?? ((input, dest, kind) => this._extractArchive(input, dest, kind));\n\t\tconst extracted = await extract(response.body as unknown as Readable, destDir, asset.kind);\n\t\tif (!extracted.ok) return extracted;\n\n\t\tonProgress?.(\"Locating llama-server binary…\");\n\t\tconst binaryRelPath = this._findBinaryRelPath(destDir);\n\t\tif (!binaryRelPath) {\n\t\t\treturn { ok: false, error: \"binary-missing: no llama-server binary found in the extracted archive\" };\n\t\t}\n\n\t\tthis._writeManifest({ release: PRISM_LLAMACPP_PINNED_RELEASE, binaryRelPath, backend: asset.backend });\n\t\tonProgress?.(\"Prism llama.cpp runtime installed.\");\n\t\treturn { ok: true };\n\t}\n\n\tprivate async _extractArchive(\n\t\tinput: Readable,\n\t\tdestDir: string,\n\t\tkind: PrismAssetKind,\n\t): Promise<{ ok: boolean; error?: string }> {\n\t\ttry {\n\t\t\treturn kind === \"zip\" ? await this._extractZip(input, destDir) : await this._extractTarGz(input, destDir);\n\t\t} catch (error) {\n\t\t\treturn { ok: false, error: `extract-fail: ${error instanceof Error ? error.message : String(error)}` };\n\t\t}\n\t}\n\n\tprivate async _extractTarGz(input: Readable, destDir: string): Promise<{ ok: boolean; error?: string }> {\n\t\tconst tarProc = spawnProcess(\"tar\", [\"-xzf\", \"-\", \"-C\", destDir], {\n\t\t\tdetached: process.platform !== \"win32\",\n\t\t\tstdio: [\"pipe\", \"ignore\", \"ignore\"],\n\t\t});\n\t\tconst terminationController = new AbortController();\n\t\tconst processWait = waitForChildProcessWithTermination(tarProc, {\n\t\t\tsignal: terminationController.signal,\n\t\t\ttimeoutMs: EXTRACTION_TIMEOUT_MS,\n\t\t\tkillGraceMs: COMMAND_KILL_GRACE_MS,\n\t\t});\n\t\ttry {\n\t\t\tawait pipeline(input, requireStdin(tarProc, \"tar\"));\n\t\t} catch (error) {\n\t\t\tterminationController.abort();\n\t\t\tawait processWait.catch(() => {});\n\t\t\tthrow error;\n\t\t}\n\t\tconst terminal = await processWait;\n\t\tif (terminal.reason === \"timeout\" || terminal.code !== 0) {\n\t\t\treturn {\n\t\t\t\tok: false,\n\t\t\t\terror:\n\t\t\t\t\tterminal.reason === \"timeout\"\n\t\t\t\t\t\t? `extract-fail: tar extraction timed out after ${EXTRACTION_TIMEOUT_MS}ms`\n\t\t\t\t\t\t: `extract-fail: tar exited with code ${terminal.code ?? \"unknown\"}`,\n\t\t\t};\n\t\t}\n\t\treturn { ok: true };\n\t}\n\n\tprivate async _extractZip(input: Readable, destDir: string): Promise<{ ok: boolean; error?: string }> {\n\t\t// Zip's central directory needs seekable file access — buffer to a temp file first.\n\t\tconst zipPath = join(destDir, \"..\", `prism-llamacpp-download-${process.pid}-${Date.now()}.zip`);\n\t\tawait pipeline(input, createWriteStream(zipPath));\n\t\ttry {\n\t\t\tconst extractCommand = this._platform() === \"win32\" && this._hasCommand(\"tar\") ? \"tar\" : \"unzip\";\n\t\t\tconst args = extractCommand === \"tar\" ? [\"-xf\", zipPath, \"-C\", destDir] : [\"-q\", zipPath, \"-d\", destDir];\n\t\t\tconst proc = spawnProcess(extractCommand, args, { detached: process.platform !== \"win32\", stdio: \"ignore\" });\n\t\t\tconst terminal = await waitForChildProcessWithTermination(proc, {\n\t\t\t\ttimeoutMs: EXTRACTION_TIMEOUT_MS,\n\t\t\t\tkillGraceMs: COMMAND_KILL_GRACE_MS,\n\t\t\t});\n\t\t\tif (terminal.reason === \"timeout\" || terminal.code !== 0) {\n\t\t\t\treturn {\n\t\t\t\t\tok: false,\n\t\t\t\t\terror:\n\t\t\t\t\t\tterminal.reason === \"timeout\"\n\t\t\t\t\t\t\t? `extract-fail: ${extractCommand} timed out after ${EXTRACTION_TIMEOUT_MS}ms`\n\t\t\t\t\t\t\t: `extract-fail: ${extractCommand} exited with code ${terminal.code ?? \"unknown\"}`,\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn { ok: true };\n\t\t} finally {\n\t\t\ttry {\n\t\t\t\trmSync(zipPath, { force: true });\n\t\t\t} catch {\n\t\t\t\t// best-effort cleanup\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async _remoteContentLength(url: string): Promise<number | undefined> {\n\t\ttry {\n\t\t\tconst response = await this._fetch(url, {\n\t\t\t\tmethod: \"HEAD\",\n\t\t\t\tsignal: AbortSignal.timeout(HEAD_REQUEST_TIMEOUT_MS),\n\t\t\t});\n\t\t\treturn response.ok ? parseContentLength(response.headers.get(\"content-length\")) : undefined;\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\tprivate _fileSizeBytes(path: string): number | undefined {\n\t\ttry {\n\t\t\treturn statSync(path).size;\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\tprivate _cleanupPartial(path: string): void {\n\t\ttry {\n\t\t\trmSync(path, { force: true });\n\t\t} catch {\n\t\t\t// best-effort cleanup\n\t\t}\n\t}\n\n\t/**\n\t * Wait until a write stream's underlying fd is actually closed. `pipeline()` destroys the\n\t * stream on error but its promise can settle before the fd close completes (Windows in\n\t * particular keeps the file handle open a tick longer) — unlinking before that races with the\n\t * OS and can leave the \"partial\" file behind or fail the delete outright. Resolves immediately\n\t * if the stream already reports `closed`.\n\t */\n\tprivate _waitForStreamClosed(stream: Writable & { closed?: boolean }): Promise<void> {\n\t\tif (stream.closed) return Promise.resolve();\n\t\treturn new Promise((resolve) => {\n\t\t\tstream.once(\"close\", () => resolve());\n\t\t\tstream.destroy();\n\t\t});\n\t}\n\n\t/**\n\t * Stream a GGUF (or mmproj) file from Hugging Face into pi's owned models dir. Skips a re-download\n\t * when the local file already matches the remote size; verifies size when the response reports\n\t * `content-length` and deletes the partial file on any failure or mismatch — never leaves a\n\t * corrupt/truncated weight file behind for a later load to silently misread.\n\t */\n\tasync downloadModel(\n\t\targs: { repo: string; file: string },\n\t\tonProgress?: (status: string) => void,\n\t): Promise<PrismDownloadResult> {\n\t\tconst destPath = join(this.modelsDir(), args.repo, args.file);\n\t\tconst url = `https://huggingface.co/${args.repo}/resolve/main/${args.file}`;\n\t\tmkdirSync(dirname(destPath), { recursive: true });\n\n\t\tif (this._exists(destPath)) {\n\t\t\tconst remoteSize = await this._remoteContentLength(url);\n\t\t\tif (remoteSize !== undefined && remoteSize === this._fileSizeBytes(destPath)) {\n\t\t\t\tonProgress?.(`${args.file} already downloaded (${remoteSize} bytes) — skipping.`);\n\t\t\t\treturn { ok: true, path: destPath, skipped: true };\n\t\t\t}\n\t\t}\n\n\t\tonProgress?.(`Downloading ${args.file} from ${args.repo}…`);\n\t\tlet response: Response;\n\t\ttry {\n\t\t\tresponse = await this._fetch(url);\n\t\t} catch (error) {\n\t\t\treturn { ok: false, error: `download-fail: ${error instanceof Error ? error.message : String(error)}` };\n\t\t}\n\t\tif (!response.ok || !response.body) {\n\t\t\treturn { ok: false, error: `download-fail: HTTP ${response.status}` };\n\t\t}\n\n\t\tconst expectedBytes = parseContentLength(response.headers.get(\"content-length\"));\n\t\tconst writeStream = createWriteStream(destPath);\n\t\ttry {\n\t\t\tawait pipeline(response.body as unknown as Readable, writeStream);\n\t\t} catch (error) {\n\t\t\tawait this._waitForStreamClosed(writeStream);\n\t\t\tthis._cleanupPartial(destPath);\n\t\t\treturn { ok: false, error: `download-fail: ${error instanceof Error ? error.message : String(error)}` };\n\t\t}\n\n\t\tconst actualBytes = this._fileSizeBytes(destPath);\n\t\tif (expectedBytes !== undefined && actualBytes !== expectedBytes) {\n\t\t\tthis._cleanupPartial(destPath);\n\t\t\treturn { ok: false, error: `size-mismatch: expected ${expectedBytes} bytes, got ${actualBytes ?? 0}` };\n\t\t}\n\n\t\tonProgress?.(`${args.file} downloaded (${actualBytes ?? 0} bytes).`);\n\t\treturn { ok: true, path: destPath };\n\t}\n\n\tprivate async _healthUp(baseUrl: string): Promise<boolean> {\n\t\ttry {\n\t\t\tconst response = await this._fetch(`${baseUrl}/health`, {\n\t\t\t\tsignal: AbortSignal.timeout(HEALTH_CHECK_TIMEOUT_MS),\n\t\t\t});\n\t\t\treturn response.ok;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Spawn `llama-server` detached+tracked (killed on parent shutdown even if pi crashes without\n\t * calling stop()) and poll `/health` until ready. `-ngl 99` is only added when the installed\n\t * asset's persisted `backend` is `\"cuda\"`, not from the host's current GPU state.\n\t */\n\tasync serve(args: {\n\t\tmodelPath: string;\n\t\tmmprojPath?: string;\n\t\tport: number;\n\t\tnumCtx: number;\n\t}): Promise<PrismServeResult> {\n\t\tconst manifest = this._readManifest();\n\t\tif (!manifest) return { ok: false, error: \"binary-missing\" };\n\t\tconst binaryPath = join(this.runtimeDir(), manifest.binaryRelPath);\n\t\tif (!this._exists(binaryPath)) return { ok: false, error: \"binary-missing\" };\n\n\t\tconst baseUrl = `http://127.0.0.1:${args.port}`;\n\t\tconst argv = [\n\t\t\t\"-m\",\n\t\t\targs.modelPath,\n\t\t\t...(args.mmprojPath ? [\"--mmproj\", args.mmprojPath] : []),\n\t\t\t\"--host\",\n\t\t\t\"127.0.0.1\",\n\t\t\t\"--port\",\n\t\t\tString(args.port),\n\t\t\t\"-c\",\n\t\t\tString(args.numCtx),\n\t\t\t...(manifest.backend === \"cuda\" ? [\"-ngl\", \"99\"] : []),\n\t\t];\n\n\t\tconst child = this._spawn(binaryPath, argv, {\n\t\t\tdetached: process.platform !== \"win32\",\n\t\t\tstdio: \"ignore\",\n\t\t\tenv: process.env,\n\t\t});\n\t\tif (child.pid) trackDetachedChildPid(child.pid);\n\t\tchild.unref?.();\n\t\tchild.on(\"exit\", () => {\n\t\t\tthis._child = undefined;\n\t\t});\n\t\tthis._child = child;\n\n\t\tfor (let attempt = 0; attempt < this._healthPollAttempts; attempt++) {\n\t\t\tif (await this._healthUp(baseUrl)) return { ok: true, baseUrl };\n\t\t\tawait this._sleep(this._healthPollIntervalMs);\n\t\t}\n\t\tthis.stop();\n\t\treturn { ok: false, error: \"health-timeout\" };\n\t}\n\n\tstop(): { stopped: boolean } {\n\t\tconst child = this._child;\n\t\tif (!child) return { stopped: false };\n\t\tthis._child = undefined;\n\t\tif (child.pid) {\n\t\t\tuntrackDetachedChildPid(child.pid);\n\t\t\tkillProcessTree(child.pid);\n\t\t}\n\t\treturn { stopped: true };\n\t}\n\n\tisRunning(): boolean {\n\t\treturn this._child !== undefined;\n\t}\n}\n"]}
1
+ {"version":3,"file":"llamacpp-runtime.d.ts","sourceRoot":"","sources":["../../../src/core/models/llamacpp-runtime.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,11 @@
1
- import { spawn } from "node:child_process";
2
- import { createWriteStream, existsSync, mkdirSync, readdirSync, readFileSync, rmSync, statSync, writeFileSync, } from "node:fs";
1
+ import { mkdirSync, readdirSync, readFileSync, writeFileSync } from "node:fs";
3
2
  import { arch as osArch, platform as osPlatform } from "node:os";
4
3
  import { dirname, join, relative } from "node:path";
5
4
  import { pipeline } from "node:stream/promises";
6
- import { spawnProcess, spawnProcessSync, waitForChildProcessWithTermination } from "../../utils/child-process.js";
5
+ import { spawnProcess, waitForChildProcessWithTermination } from "../../utils/child-process.js";
7
6
  import { killProcessTree, trackDetachedChildPid, untrackDetachedChildPid } from "../../utils/shell.js";
8
7
  import { modelsDir as agentModelsDir, runtimesDir as agentRuntimesDir } from "../agent-paths.js";
8
+ import { extractZipArchive, fetchRuntimeDownload, installRuntimeArchive, removePartialDownload, requireRuntimeStdin, resolveRuntimeLifecycleDependencies, runtimeCommandAvailable, tryFileSizeBytes, writeRuntimeDownload, } from "./runtime-process.js";
9
9
  /**
10
10
  * Managed runtime for prism-ml 1-bit GGUF models (Bonsai-27B first). The provider requires their
11
11
  * llama.cpp fork (Q1_0_g128 hybrid-attention kernels) — stock llama.cpp/Ollama cannot serve these
@@ -94,45 +94,16 @@ function parseContentLength(header) {
94
94
  const value = Number(header);
95
95
  return Number.isFinite(value) && value >= 0 ? value : undefined;
96
96
  }
97
- /**
98
- * `spawnProcess(..., { stdio: ["pipe", ...] })` always yields a non-null `stdin` at runtime, but
99
- * child-process.ts's typed overload only narrows `.stdin` for the capture-only stdio shape used
100
- * elsewhere. This makes the true invariant explicit and fails loudly instead of silently
101
- * misbehaving if it's ever violated by a future stdio change.
102
- */
103
- function requireStdin(proc, label) {
104
- if (!proc.stdin)
105
- throw new Error(`${label}: no stdin pipe`);
106
- return proc.stdin;
107
- }
108
97
  export class PrismLlamaCppRuntime {
109
- _agentDir;
110
- _fetch;
111
- _spawn;
112
- _exists;
113
- _sleep;
114
- _hasCommand;
115
- _hasNvidiaGpu;
116
- _platform;
117
- _arch;
118
- _extractArchiveOverride;
119
- _healthPollAttempts;
120
- _healthPollIntervalMs;
121
- _child;
122
98
  constructor(args) {
123
99
  this._agentDir = args.agentDir;
124
- this._fetch = args.deps?.fetchFn ?? fetch;
125
- this._spawn =
126
- args.deps?.spawnFn ?? ((command, argv, options) => spawn(command, argv, { ...options, stdio: "ignore" }));
127
- this._exists = args.deps?.existsFn ?? existsSync;
128
- this._sleep = args.deps?.sleepFn ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
129
- this._hasCommand =
130
- args.deps?.hasCommand ??
131
- ((command) => spawnProcessSync(command, ["--version"], { encoding: "utf8", timeout: 5_000 }).error === undefined);
100
+ [this._fetch, this._spawn, this._exists, this._sleep] = resolveRuntimeLifecycleDependencies(args.deps);
101
+ this._hasCommand = args.deps?.hasCommand ?? runtimeCommandAvailable;
132
102
  this._hasNvidiaGpu = args.deps?.hasNvidiaGpu ?? (() => this._hasCommand("nvidia-smi"));
133
103
  this._platform = args.deps?.platform ?? osPlatform;
134
104
  this._arch = args.deps?.arch ?? osArch;
135
- this._extractArchiveOverride = args.deps?.extractArchive;
105
+ this._extractArchiveFn =
106
+ args.deps?.extractArchive ?? ((input, destDir, kind) => this._extractArchive(input, destDir, kind));
136
107
  this._healthPollAttempts = args.deps?.healthPollAttempts ?? DEFAULT_HEALTH_POLL_ATTEMPTS;
137
108
  this._healthPollIntervalMs = args.deps?.healthPollIntervalMs ?? DEFAULT_HEALTH_POLL_INTERVAL_MS;
138
109
  }
@@ -215,26 +186,12 @@ export class PrismLlamaCppRuntime {
215
186
  const asset = resolvePrismLlamaAsset(this._platform(), this._arch(), this._hasNvidiaGpu());
216
187
  if (!asset)
217
188
  return { ok: false, error: "unsupported-platform" };
218
- onProgress?.(`Downloading ${asset.name}…`);
219
189
  const downloadUrl = `${PRISM_LLAMACPP_RELEASES_BASE_URL}/${PRISM_LLAMACPP_PINNED_RELEASE}/${asset.name}`;
220
- let response;
221
- try {
222
- response = await this._fetch(downloadUrl);
223
- }
224
- catch (error) {
225
- return { ok: false, error: `download-fail: ${error instanceof Error ? error.message : String(error)}` };
226
- }
227
- if (!response.ok || !response.body) {
228
- return { ok: false, error: `download-fail: HTTP ${response.status}` };
229
- }
230
- const destDir = this.runtimeDir();
231
- mkdirSync(destDir, { recursive: true });
232
- onProgress?.(`Extracting ${asset.name}…`);
233
- const extract = this._extractArchiveOverride ?? ((input, dest, kind) => this._extractArchive(input, dest, kind));
234
- const extracted = await extract(response.body, destDir, asset.kind);
190
+ const extracted = await this._installArchive(downloadUrl, asset, onProgress);
235
191
  if (!extracted.ok)
236
192
  return extracted;
237
193
  onProgress?.("Locating llama-server binary…");
194
+ const destDir = this.runtimeDir();
238
195
  const binaryRelPath = this._findBinaryRelPath(destDir);
239
196
  if (!binaryRelPath) {
240
197
  return { ok: false, error: "binary-missing: no llama-server binary found in the extracted archive" };
@@ -243,6 +200,9 @@ export class PrismLlamaCppRuntime {
243
200
  onProgress?.("Prism llama.cpp runtime installed.");
244
201
  return { ok: true };
245
202
  }
203
+ _installArchive(downloadUrl, asset, onProgress) {
204
+ return installRuntimeArchive(this._fetch, downloadUrl, this.runtimeDir(), asset, this._extractArchiveFn, onProgress);
205
+ }
246
206
  async _extractArchive(input, destDir, kind) {
247
207
  try {
248
208
  return kind === "zip" ? await this._extractZip(input, destDir) : await this._extractTarGz(input, destDir);
@@ -263,7 +223,7 @@ export class PrismLlamaCppRuntime {
263
223
  killGraceMs: COMMAND_KILL_GRACE_MS,
264
224
  });
265
225
  try {
266
- await pipeline(input, requireStdin(tarProc, "tar"));
226
+ await pipeline(input, requireRuntimeStdin(tarProc, "tar"));
267
227
  }
268
228
  catch (error) {
269
229
  terminationController.abort();
@@ -282,35 +242,15 @@ export class PrismLlamaCppRuntime {
282
242
  return { ok: true };
283
243
  }
284
244
  async _extractZip(input, destDir) {
285
- // Zip's central directory needs seekable file access — buffer to a temp file first.
286
- const zipPath = join(destDir, "..", `prism-llamacpp-download-${process.pid}-${Date.now()}.zip`);
287
- await pipeline(input, createWriteStream(zipPath));
288
- try {
289
- const extractCommand = this._platform() === "win32" && this._hasCommand("tar") ? "tar" : "unzip";
290
- const args = extractCommand === "tar" ? ["-xf", zipPath, "-C", destDir] : ["-q", zipPath, "-d", destDir];
291
- const proc = spawnProcess(extractCommand, args, { detached: process.platform !== "win32", stdio: "ignore" });
292
- const terminal = await waitForChildProcessWithTermination(proc, {
293
- timeoutMs: EXTRACTION_TIMEOUT_MS,
294
- killGraceMs: COMMAND_KILL_GRACE_MS,
295
- });
296
- if (terminal.reason === "timeout" || terminal.code !== 0) {
297
- return {
298
- ok: false,
299
- error: terminal.reason === "timeout"
300
- ? `extract-fail: ${extractCommand} timed out after ${EXTRACTION_TIMEOUT_MS}ms`
301
- : `extract-fail: ${extractCommand} exited with code ${terminal.code ?? "unknown"}`,
302
- };
303
- }
304
- return { ok: true };
305
- }
306
- finally {
307
- try {
308
- rmSync(zipPath, { force: true });
309
- }
310
- catch {
311
- // best-effort cleanup
312
- }
313
- }
245
+ return extractZipArchive({
246
+ input,
247
+ destDir,
248
+ tempPrefix: "prism-llamacpp-download",
249
+ platform: this._platform,
250
+ hasCommand: this._hasCommand,
251
+ timeoutMs: EXTRACTION_TIMEOUT_MS,
252
+ killGraceMs: COMMAND_KILL_GRACE_MS,
253
+ });
314
254
  }
315
255
  async _remoteContentLength(url) {
316
256
  try {
@@ -324,37 +264,6 @@ export class PrismLlamaCppRuntime {
324
264
  return undefined;
325
265
  }
326
266
  }
327
- _fileSizeBytes(path) {
328
- try {
329
- return statSync(path).size;
330
- }
331
- catch {
332
- return undefined;
333
- }
334
- }
335
- _cleanupPartial(path) {
336
- try {
337
- rmSync(path, { force: true });
338
- }
339
- catch {
340
- // best-effort cleanup
341
- }
342
- }
343
- /**
344
- * Wait until a write stream's underlying fd is actually closed. `pipeline()` destroys the
345
- * stream on error but its promise can settle before the fd close completes (Windows in
346
- * particular keeps the file handle open a tick longer) — unlinking before that races with the
347
- * OS and can leave the "partial" file behind or fail the delete outright. Resolves immediately
348
- * if the stream already reports `closed`.
349
- */
350
- _waitForStreamClosed(stream) {
351
- if (stream.closed)
352
- return Promise.resolve();
353
- return new Promise((resolve) => {
354
- stream.once("close", () => resolve());
355
- stream.destroy();
356
- });
357
- }
358
267
  /**
359
268
  * Stream a GGUF (or mmproj) file from Hugging Face into pi's owned models dir. Skips a re-download
360
269
  * when the local file already matches the remote size; verifies size when the response reports
@@ -367,35 +276,22 @@ export class PrismLlamaCppRuntime {
367
276
  mkdirSync(dirname(destPath), { recursive: true });
368
277
  if (this._exists(destPath)) {
369
278
  const remoteSize = await this._remoteContentLength(url);
370
- if (remoteSize !== undefined && remoteSize === this._fileSizeBytes(destPath)) {
279
+ if (remoteSize !== undefined && remoteSize === tryFileSizeBytes(destPath)) {
371
280
  onProgress?.(`${args.file} already downloaded (${remoteSize} bytes) — skipping.`);
372
281
  return { ok: true, path: destPath, skipped: true };
373
282
  }
374
283
  }
375
284
  onProgress?.(`Downloading ${args.file} from ${args.repo}…`);
376
- let response;
377
- try {
378
- response = await this._fetch(url);
379
- }
380
- catch (error) {
381
- return { ok: false, error: `download-fail: ${error instanceof Error ? error.message : String(error)}` };
382
- }
383
- if (!response.ok || !response.body) {
384
- return { ok: false, error: `download-fail: HTTP ${response.status}` };
385
- }
386
- const expectedBytes = parseContentLength(response.headers.get("content-length"));
387
- const writeStream = createWriteStream(destPath);
388
- try {
389
- await pipeline(response.body, writeStream);
390
- }
391
- catch (error) {
392
- await this._waitForStreamClosed(writeStream);
393
- this._cleanupPartial(destPath);
394
- return { ok: false, error: `download-fail: ${error instanceof Error ? error.message : String(error)}` };
395
- }
396
- const actualBytes = this._fileSizeBytes(destPath);
285
+ const download = await fetchRuntimeDownload(this._fetch, url);
286
+ if (!download.ok)
287
+ return download;
288
+ const expectedBytes = parseContentLength(download.response.headers.get("content-length"));
289
+ const written = await writeRuntimeDownload(download.body, destPath);
290
+ if (!written.ok)
291
+ return written;
292
+ const actualBytes = tryFileSizeBytes(destPath);
397
293
  if (expectedBytes !== undefined && actualBytes !== expectedBytes) {
398
- this._cleanupPartial(destPath);
294
+ removePartialDownload(destPath);
399
295
  return { ok: false, error: `size-mismatch: expected ${expectedBytes} bytes, got ${actualBytes ?? 0}` };
400
296
  }
401
297
  onProgress?.(`${args.file} downloaded (${actualBytes ?? 0} bytes).`);
@@ -1 +1 @@
1
- {"version":3,"file":"llamacpp-runtime.js","sourceRoot":"","sources":["../../../src/core/models/llamacpp-runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import { type ChildProcess, spawn } from \"node:child_process\";\nimport {\n\tcreateWriteStream,\n\ttype Dirent,\n\texistsSync,\n\tmkdirSync,\n\treaddirSync,\n\treadFileSync,\n\trmSync,\n\tstatSync,\n\twriteFileSync,\n} from \"node:fs\";\nimport { arch as osArch, platform as osPlatform } from \"node:os\";\nimport { dirname, join, relative } from \"node:path\";\nimport type { Readable, Writable } from \"node:stream\";\nimport { pipeline } from \"node:stream/promises\";\nimport { spawnProcess, spawnProcessSync, waitForChildProcessWithTermination } from \"../../utils/child-process.ts\";\nimport { killProcessTree, trackDetachedChildPid, untrackDetachedChildPid } from \"../../utils/shell.ts\";\nimport { modelsDir as agentModelsDir, runtimesDir as agentRuntimesDir } from \"../agent-paths.ts\";\n\n/**\n * Managed runtime for prism-ml 1-bit GGUF models (Bonsai-27B first). The provider requires their\n * llama.cpp fork (Q1_0_g128 hybrid-attention kernels) — stock llama.cpp/Ollama cannot serve these\n * weights — so this module owns runtime install (prebuilt release download+extract), GGUF\n * downloads, and llama-server lifecycle. Mirrors local-runtime.ts's OllamaRuntime: injectable\n * seams for fetch/spawn/exists, pi-owned directories under agentDir (runtimes/, models/),\n * detached+tracked child processes, onProgress as best-effort UI feedback, honest error taxonomies\n * instead of silent fallbacks.\n *\n * The fork publishes precompiled per-platform archives on GitHub Releases (no local build): pin a\n * release tag, download the matching asset, extract it, and locate the `llama-server` binary once\n * at install time (release archive layouts vary — bin/ vs build/bin/ at the top level — so this is\n * a deterministic one-time scan, not a fallback). The found relative path and backend (cpu/cuda)\n * are persisted to a manifest so later `detect()`/`serve()` calls never need to re-scan.\n */\n\n/**\n * Pinned Prism ML llama.cpp fork release — verified via\n * `GET https://api.github.com/repos/PrismML-Eng/llama.cpp/releases/tags/prism-b9594-38c66ad` on\n * 2026-07-18 (release exists, all assets referenced below are present on it). Bump here (and\n * re-verify with the same API call) when the provider ships new kernels.\n */\nexport const PRISM_LLAMACPP_PINNED_RELEASE = \"prism-b9594-38c66ad\";\n\nexport const PRISM_LLAMACPP_RELEASES_BASE_URL = \"https://github.com/PrismML-Eng/llama.cpp/releases/download\";\n\nexport interface PrismModelDescriptor {\n\trepo: string;\n\tfile: string;\n\tmmprojFile?: string;\n\tdisplayName: string;\n}\n\n/** Curated first-model descriptor; the `/models add` wiring task consumes this. */\nexport const BONSAI_27B: PrismModelDescriptor = {\n\trepo: \"prism-ml/Bonsai-27B-gguf\",\n\tfile: \"Bonsai-27B-Q1_0.gguf\",\n\tmmprojFile: \"Bonsai-27B-mmproj-Q8_0.gguf\",\n\tdisplayName: \"Bonsai-27B (1-bit Q1_0 + vision)\",\n};\n\nexport type PrismBackend = \"cpu\" | \"cuda\";\nexport type PrismAssetKind = \"tar-gz\" | \"zip\";\n\nexport interface PrismLlamaAsset {\n\tname: string;\n\tkind: PrismAssetKind;\n\tbackend: PrismBackend;\n}\n\n// Verbatim asset names from the pinned release (see PRISM_LLAMACPP_PINNED_RELEASE doc comment) —\n// hardcoded rather than templated from the tag because the provider's naming isn't fully\n// consistent across platforms (Windows CPU assets drop the tag/commit segment entirely; the\n// Windows CUDA asset uses a different build-number segment, \"b1\" not \"b9594\").\nconst LINUX_X64_CPU_ASSET = \"llama-prism-b9594-38c66ad-bin-ubuntu-x64.tar.gz\";\nconst LINUX_ARM64_CPU_ASSET = \"llama-prism-b9594-38c66ad-bin-ubuntu-arm64.tar.gz\";\nconst LINUX_X64_CUDA_ASSET = \"llama-prism-b9594-38c66ad-bin-linux-cuda-12.4-x64.tar.gz\";\nconst MACOS_ARM64_ASSET = \"llama-prism-b9594-38c66ad-bin-macos-arm64.tar.gz\";\nconst MACOS_X64_ASSET = \"llama-prism-b9594-38c66ad-bin-macos-x64.tar.gz\";\nconst WIN_X64_CPU_ASSET = \"llama-bin-win-cpu-x64.zip\";\nconst WIN_ARM64_CPU_ASSET = \"llama-bin-win-cpu-arm64.zip\";\n\n/**\n * Maps a platform/arch/GPU triple to the exact Prism llama.cpp release asset for\n * {@link PRISM_LLAMACPP_PINNED_RELEASE} — verified against the real GitHub release, not guessed.\n * CPU asset by default; the CUDA 12.4 variant is only offered for linux x64 with an NVIDIA GPU\n * present (a 12.8 variant also exists upstream but has no wired caller yet). Windows CUDA needs a\n * companion `cudart-*` archive and is out of scope for v1 — Windows always resolves to the CPU zip\n * regardless of `hasNvidiaGpu`. Pure and exported so it's independently testable.\n */\nexport function resolvePrismLlamaAsset(\n\tplat: string,\n\tarchitecture: string,\n\thasNvidiaGpu: boolean,\n): PrismLlamaAsset | undefined {\n\tif (plat === \"linux\") {\n\t\tif (architecture === \"x64\") {\n\t\t\treturn hasNvidiaGpu\n\t\t\t\t? { name: LINUX_X64_CUDA_ASSET, kind: \"tar-gz\", backend: \"cuda\" }\n\t\t\t\t: { name: LINUX_X64_CPU_ASSET, kind: \"tar-gz\", backend: \"cpu\" };\n\t\t}\n\t\tif (architecture === \"arm64\") return { name: LINUX_ARM64_CPU_ASSET, kind: \"tar-gz\", backend: \"cpu\" };\n\t\treturn undefined;\n\t}\n\tif (plat === \"darwin\") {\n\t\tif (architecture === \"arm64\") return { name: MACOS_ARM64_ASSET, kind: \"tar-gz\", backend: \"cpu\" };\n\t\tif (architecture === \"x64\") return { name: MACOS_X64_ASSET, kind: \"tar-gz\", backend: \"cpu\" };\n\t\treturn undefined;\n\t}\n\tif (plat === \"win32\") {\n\t\tif (architecture === \"x64\") return { name: WIN_X64_CPU_ASSET, kind: \"zip\", backend: \"cpu\" };\n\t\tif (architecture === \"arm64\") return { name: WIN_ARM64_CPU_ASSET, kind: \"zip\", backend: \"cpu\" };\n\t\treturn undefined;\n\t}\n\treturn undefined;\n}\n\nexport interface PrismDetectResult {\n\truntimeInstalled: boolean;\n\tbinaryPath?: string;\n\trelease?: string;\n}\n\nexport interface PrismDownloadResult {\n\tok: boolean;\n\tpath?: string;\n\tskipped?: boolean;\n\terror?: string;\n}\n\nexport type PrismServeResult = { ok: true; baseUrl: string } | { ok: false; error: string };\n\ninterface PrismInstallManifest {\n\trelease: string;\n\tbinaryRelPath: string;\n\tbackend: PrismBackend;\n}\n\ntype PrismSpawnOptions = { detached?: boolean; stdio?: \"ignore\"; env?: NodeJS.ProcessEnv };\ntype PrismSpawnFn = (\n\tcommand: string,\n\targs: string[],\n\toptions: PrismSpawnOptions,\n) => Pick<ChildProcess, \"pid\" | \"kill\" | \"unref\" | \"on\">;\ntype PrismExtractArchiveFn = (\n\tinput: Readable,\n\tdestDir: string,\n\tkind: PrismAssetKind,\n) => Promise<{ ok: boolean; error?: string }>;\n\nexport interface PrismLlamaCppDeps {\n\tfetchFn?: typeof fetch;\n\tspawnFn?: PrismSpawnFn;\n\texistsFn?: (path: string) => boolean;\n\tsleepFn?: (ms: number) => Promise<void>;\n\t/** Whether a named command exists on PATH (nvidia-smi, tar — for zip extraction on Windows). */\n\thasCommand?: (command: string) => boolean;\n\t/** Decided once at install time and persisted as `backend` — serve() reads the persisted value\n\t * so `-ngl 99` reflects what was actually installed, not the host's current GPU state. */\n\thasNvidiaGpu?: () => boolean;\n\tplatform?: () => string;\n\tarch?: () => string;\n\t/** Runs the extraction step for a downloaded archive. Injectable so installManaged's\n\t * download->extract->scan orchestration is testable without a real tar/unzip pipeline; defaults\n\t * to the real spawn-based extractor. */\n\textractArchive?: PrismExtractArchiveFn;\n\t/** Health-poll bounds for serve(); default ~120s (240 * 500ms), both overridable for tests. */\n\thealthPollAttempts?: number;\n\thealthPollIntervalMs?: number;\n}\n\nconst EXTRACTION_TIMEOUT_MS = 10 * 60_000;\nconst COMMAND_KILL_GRACE_MS = 2_000;\nconst DEFAULT_HEALTH_POLL_ATTEMPTS = 240;\nconst DEFAULT_HEALTH_POLL_INTERVAL_MS = 500;\nconst HEALTH_CHECK_TIMEOUT_MS = 2_000;\nconst HEAD_REQUEST_TIMEOUT_MS = 10_000;\n\nfunction parseContentLength(header: string | null): number | undefined {\n\tif (!header) return undefined;\n\tconst value = Number(header);\n\treturn Number.isFinite(value) && value >= 0 ? value : undefined;\n}\n\n/**\n * `spawnProcess(..., { stdio: [\"pipe\", ...] })` always yields a non-null `stdin` at runtime, but\n * child-process.ts's typed overload only narrows `.stdin` for the capture-only stdio shape used\n * elsewhere. This makes the true invariant explicit and fails loudly instead of silently\n * misbehaving if it's ever violated by a future stdio change.\n */\nfunction requireStdin(proc: ChildProcess, label: string): Writable {\n\tif (!proc.stdin) throw new Error(`${label}: no stdin pipe`);\n\treturn proc.stdin;\n}\n\nexport class PrismLlamaCppRuntime {\n\tprivate readonly _agentDir: string;\n\tprivate readonly _fetch: typeof fetch;\n\tprivate readonly _spawn: PrismSpawnFn;\n\tprivate readonly _exists: (path: string) => boolean;\n\tprivate readonly _sleep: (ms: number) => Promise<void>;\n\tprivate readonly _hasCommand: (command: string) => boolean;\n\tprivate readonly _hasNvidiaGpu: () => boolean;\n\tprivate readonly _platform: () => string;\n\tprivate readonly _arch: () => string;\n\tprivate readonly _extractArchiveOverride: PrismExtractArchiveFn | undefined;\n\tprivate readonly _healthPollAttempts: number;\n\tprivate readonly _healthPollIntervalMs: number;\n\tprivate _child: Pick<ChildProcess, \"pid\" | \"kill\" | \"unref\" | \"on\"> | undefined;\n\n\tconstructor(args: { agentDir: string; deps?: PrismLlamaCppDeps }) {\n\t\tthis._agentDir = args.agentDir;\n\t\tthis._fetch = args.deps?.fetchFn ?? fetch;\n\t\tthis._spawn =\n\t\t\targs.deps?.spawnFn ?? ((command, argv, options) => spawn(command, argv, { ...options, stdio: \"ignore\" }));\n\t\tthis._exists = args.deps?.existsFn ?? existsSync;\n\t\tthis._sleep = args.deps?.sleepFn ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));\n\t\tthis._hasCommand =\n\t\t\targs.deps?.hasCommand ??\n\t\t\t((command) =>\n\t\t\t\tspawnProcessSync(command, [\"--version\"], { encoding: \"utf8\", timeout: 5_000 }).error === undefined);\n\t\tthis._hasNvidiaGpu = args.deps?.hasNvidiaGpu ?? (() => this._hasCommand(\"nvidia-smi\"));\n\t\tthis._platform = args.deps?.platform ?? osPlatform;\n\t\tthis._arch = args.deps?.arch ?? osArch;\n\t\tthis._extractArchiveOverride = args.deps?.extractArchive;\n\t\tthis._healthPollAttempts = args.deps?.healthPollAttempts ?? DEFAULT_HEALTH_POLL_ATTEMPTS;\n\t\tthis._healthPollIntervalMs = args.deps?.healthPollIntervalMs ?? DEFAULT_HEALTH_POLL_INTERVAL_MS;\n\t}\n\n\truntimeDir(): string {\n\t\treturn agentRuntimesDir(\"prism-llamacpp\", this._agentDir);\n\t}\n\n\tmodelsDir(): string {\n\t\treturn agentModelsDir(\"llamacpp\", this._agentDir);\n\t}\n\n\tprivate _binaryName(): string {\n\t\treturn this._platform() === \"win32\" ? \"llama-server.exe\" : \"llama-server\";\n\t}\n\n\tprivate _manifestPath(): string {\n\t\treturn join(this.runtimeDir(), \"install.json\");\n\t}\n\n\tprivate _readManifest(): PrismInstallManifest | undefined {\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(readFileSync(this._manifestPath(), \"utf8\")) as {\n\t\t\t\trelease?: unknown;\n\t\t\t\tbinaryRelPath?: unknown;\n\t\t\t\tbackend?: unknown;\n\t\t\t};\n\t\t\tif (\n\t\t\t\ttypeof parsed.release === \"string\" &&\n\t\t\t\ttypeof parsed.binaryRelPath === \"string\" &&\n\t\t\t\t(parsed.backend === \"cpu\" || parsed.backend === \"cuda\")\n\t\t\t) {\n\t\t\t\treturn { release: parsed.release, binaryRelPath: parsed.binaryRelPath, backend: parsed.backend };\n\t\t\t}\n\t\t\treturn undefined;\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\tprivate _writeManifest(manifest: PrismInstallManifest): void {\n\t\twriteFileSync(this._manifestPath(), JSON.stringify(manifest, null, \"\\t\"));\n\t}\n\n\tasync detect(): Promise<PrismDetectResult> {\n\t\tconst manifest = this._readManifest();\n\t\tif (!manifest) return { runtimeInstalled: false };\n\t\tconst binaryPath = join(this.runtimeDir(), manifest.binaryRelPath);\n\t\tconst runtimeInstalled = this._exists(binaryPath);\n\t\treturn {\n\t\t\truntimeInstalled,\n\t\t\tbinaryPath: runtimeInstalled ? binaryPath : undefined,\n\t\t\trelease: manifest.release,\n\t\t};\n\t}\n\n\t/** One-time recursive scan for the `llama-server` binary inside a freshly extracted release\n\t * archive — layouts vary (bin/ vs build/bin/ at the top level) across platforms/backends, so\n\t * this locates it deterministically instead of assuming a fixed path, then the result is\n\t * persisted so later calls never need to re-scan. */\n\tprivate _findBinaryRelPath(root: string): string | undefined {\n\t\tconst targetName = this._binaryName();\n\t\tconst stack: string[] = [root];\n\t\twhile (stack.length > 0) {\n\t\t\tconst dir = stack.pop();\n\t\t\tif (dir === undefined) continue;\n\t\t\tlet entries: Dirent[];\n\t\t\ttry {\n\t\t\t\tentries = readdirSync(dir, { withFileTypes: true });\n\t\t\t} catch {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tfor (const entry of entries) {\n\t\t\t\tconst full = join(dir, entry.name);\n\t\t\t\tif (entry.isDirectory()) stack.push(full);\n\t\t\t\telse if (entry.isFile() && entry.name === targetName) return relative(root, full);\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Download the pinned release asset for this host and extract it (consent-gated by the caller,\n\t * same contract as OllamaRuntime#installManaged — this method only does the mechanical\n\t * download+extract+locate and reports the outcome honestly). No compiler toolchain required:\n\t * the fork ships prebuilt binaries.\n\t */\n\tasync installManaged(onProgress?: (status: string) => void): Promise<{ ok: boolean; error?: string }> {\n\t\tconst asset = resolvePrismLlamaAsset(this._platform(), this._arch(), this._hasNvidiaGpu());\n\t\tif (!asset) return { ok: false, error: \"unsupported-platform\" };\n\n\t\tonProgress?.(`Downloading ${asset.name}…`);\n\t\tconst downloadUrl = `${PRISM_LLAMACPP_RELEASES_BASE_URL}/${PRISM_LLAMACPP_PINNED_RELEASE}/${asset.name}`;\n\t\tlet response: Response;\n\t\ttry {\n\t\t\tresponse = await this._fetch(downloadUrl);\n\t\t} catch (error) {\n\t\t\treturn { ok: false, error: `download-fail: ${error instanceof Error ? error.message : String(error)}` };\n\t\t}\n\t\tif (!response.ok || !response.body) {\n\t\t\treturn { ok: false, error: `download-fail: HTTP ${response.status}` };\n\t\t}\n\n\t\tconst destDir = this.runtimeDir();\n\t\tmkdirSync(destDir, { recursive: true });\n\n\t\tonProgress?.(`Extracting ${asset.name}…`);\n\t\tconst extract = this._extractArchiveOverride ?? ((input, dest, kind) => this._extractArchive(input, dest, kind));\n\t\tconst extracted = await extract(response.body as unknown as Readable, destDir, asset.kind);\n\t\tif (!extracted.ok) return extracted;\n\n\t\tonProgress?.(\"Locating llama-server binary…\");\n\t\tconst binaryRelPath = this._findBinaryRelPath(destDir);\n\t\tif (!binaryRelPath) {\n\t\t\treturn { ok: false, error: \"binary-missing: no llama-server binary found in the extracted archive\" };\n\t\t}\n\n\t\tthis._writeManifest({ release: PRISM_LLAMACPP_PINNED_RELEASE, binaryRelPath, backend: asset.backend });\n\t\tonProgress?.(\"Prism llama.cpp runtime installed.\");\n\t\treturn { ok: true };\n\t}\n\n\tprivate async _extractArchive(\n\t\tinput: Readable,\n\t\tdestDir: string,\n\t\tkind: PrismAssetKind,\n\t): Promise<{ ok: boolean; error?: string }> {\n\t\ttry {\n\t\t\treturn kind === \"zip\" ? await this._extractZip(input, destDir) : await this._extractTarGz(input, destDir);\n\t\t} catch (error) {\n\t\t\treturn { ok: false, error: `extract-fail: ${error instanceof Error ? error.message : String(error)}` };\n\t\t}\n\t}\n\n\tprivate async _extractTarGz(input: Readable, destDir: string): Promise<{ ok: boolean; error?: string }> {\n\t\tconst tarProc = spawnProcess(\"tar\", [\"-xzf\", \"-\", \"-C\", destDir], {\n\t\t\tdetached: process.platform !== \"win32\",\n\t\t\tstdio: [\"pipe\", \"ignore\", \"ignore\"],\n\t\t});\n\t\tconst terminationController = new AbortController();\n\t\tconst processWait = waitForChildProcessWithTermination(tarProc, {\n\t\t\tsignal: terminationController.signal,\n\t\t\ttimeoutMs: EXTRACTION_TIMEOUT_MS,\n\t\t\tkillGraceMs: COMMAND_KILL_GRACE_MS,\n\t\t});\n\t\ttry {\n\t\t\tawait pipeline(input, requireStdin(tarProc, \"tar\"));\n\t\t} catch (error) {\n\t\t\tterminationController.abort();\n\t\t\tawait processWait.catch(() => {});\n\t\t\tthrow error;\n\t\t}\n\t\tconst terminal = await processWait;\n\t\tif (terminal.reason === \"timeout\" || terminal.code !== 0) {\n\t\t\treturn {\n\t\t\t\tok: false,\n\t\t\t\terror:\n\t\t\t\t\tterminal.reason === \"timeout\"\n\t\t\t\t\t\t? `extract-fail: tar extraction timed out after ${EXTRACTION_TIMEOUT_MS}ms`\n\t\t\t\t\t\t: `extract-fail: tar exited with code ${terminal.code ?? \"unknown\"}`,\n\t\t\t};\n\t\t}\n\t\treturn { ok: true };\n\t}\n\n\tprivate async _extractZip(input: Readable, destDir: string): Promise<{ ok: boolean; error?: string }> {\n\t\t// Zip's central directory needs seekable file access — buffer to a temp file first.\n\t\tconst zipPath = join(destDir, \"..\", `prism-llamacpp-download-${process.pid}-${Date.now()}.zip`);\n\t\tawait pipeline(input, createWriteStream(zipPath));\n\t\ttry {\n\t\t\tconst extractCommand = this._platform() === \"win32\" && this._hasCommand(\"tar\") ? \"tar\" : \"unzip\";\n\t\t\tconst args = extractCommand === \"tar\" ? [\"-xf\", zipPath, \"-C\", destDir] : [\"-q\", zipPath, \"-d\", destDir];\n\t\t\tconst proc = spawnProcess(extractCommand, args, { detached: process.platform !== \"win32\", stdio: \"ignore\" });\n\t\t\tconst terminal = await waitForChildProcessWithTermination(proc, {\n\t\t\t\ttimeoutMs: EXTRACTION_TIMEOUT_MS,\n\t\t\t\tkillGraceMs: COMMAND_KILL_GRACE_MS,\n\t\t\t});\n\t\t\tif (terminal.reason === \"timeout\" || terminal.code !== 0) {\n\t\t\t\treturn {\n\t\t\t\t\tok: false,\n\t\t\t\t\terror:\n\t\t\t\t\t\tterminal.reason === \"timeout\"\n\t\t\t\t\t\t\t? `extract-fail: ${extractCommand} timed out after ${EXTRACTION_TIMEOUT_MS}ms`\n\t\t\t\t\t\t\t: `extract-fail: ${extractCommand} exited with code ${terminal.code ?? \"unknown\"}`,\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn { ok: true };\n\t\t} finally {\n\t\t\ttry {\n\t\t\t\trmSync(zipPath, { force: true });\n\t\t\t} catch {\n\t\t\t\t// best-effort cleanup\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async _remoteContentLength(url: string): Promise<number | undefined> {\n\t\ttry {\n\t\t\tconst response = await this._fetch(url, {\n\t\t\t\tmethod: \"HEAD\",\n\t\t\t\tsignal: AbortSignal.timeout(HEAD_REQUEST_TIMEOUT_MS),\n\t\t\t});\n\t\t\treturn response.ok ? parseContentLength(response.headers.get(\"content-length\")) : undefined;\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\tprivate _fileSizeBytes(path: string): number | undefined {\n\t\ttry {\n\t\t\treturn statSync(path).size;\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\tprivate _cleanupPartial(path: string): void {\n\t\ttry {\n\t\t\trmSync(path, { force: true });\n\t\t} catch {\n\t\t\t// best-effort cleanup\n\t\t}\n\t}\n\n\t/**\n\t * Wait until a write stream's underlying fd is actually closed. `pipeline()` destroys the\n\t * stream on error but its promise can settle before the fd close completes (Windows in\n\t * particular keeps the file handle open a tick longer) — unlinking before that races with the\n\t * OS and can leave the \"partial\" file behind or fail the delete outright. Resolves immediately\n\t * if the stream already reports `closed`.\n\t */\n\tprivate _waitForStreamClosed(stream: Writable & { closed?: boolean }): Promise<void> {\n\t\tif (stream.closed) return Promise.resolve();\n\t\treturn new Promise((resolve) => {\n\t\t\tstream.once(\"close\", () => resolve());\n\t\t\tstream.destroy();\n\t\t});\n\t}\n\n\t/**\n\t * Stream a GGUF (or mmproj) file from Hugging Face into pi's owned models dir. Skips a re-download\n\t * when the local file already matches the remote size; verifies size when the response reports\n\t * `content-length` and deletes the partial file on any failure or mismatch — never leaves a\n\t * corrupt/truncated weight file behind for a later load to silently misread.\n\t */\n\tasync downloadModel(\n\t\targs: { repo: string; file: string },\n\t\tonProgress?: (status: string) => void,\n\t): Promise<PrismDownloadResult> {\n\t\tconst destPath = join(this.modelsDir(), args.repo, args.file);\n\t\tconst url = `https://huggingface.co/${args.repo}/resolve/main/${args.file}`;\n\t\tmkdirSync(dirname(destPath), { recursive: true });\n\n\t\tif (this._exists(destPath)) {\n\t\t\tconst remoteSize = await this._remoteContentLength(url);\n\t\t\tif (remoteSize !== undefined && remoteSize === this._fileSizeBytes(destPath)) {\n\t\t\t\tonProgress?.(`${args.file} already downloaded (${remoteSize} bytes) — skipping.`);\n\t\t\t\treturn { ok: true, path: destPath, skipped: true };\n\t\t\t}\n\t\t}\n\n\t\tonProgress?.(`Downloading ${args.file} from ${args.repo}…`);\n\t\tlet response: Response;\n\t\ttry {\n\t\t\tresponse = await this._fetch(url);\n\t\t} catch (error) {\n\t\t\treturn { ok: false, error: `download-fail: ${error instanceof Error ? error.message : String(error)}` };\n\t\t}\n\t\tif (!response.ok || !response.body) {\n\t\t\treturn { ok: false, error: `download-fail: HTTP ${response.status}` };\n\t\t}\n\n\t\tconst expectedBytes = parseContentLength(response.headers.get(\"content-length\"));\n\t\tconst writeStream = createWriteStream(destPath);\n\t\ttry {\n\t\t\tawait pipeline(response.body as unknown as Readable, writeStream);\n\t\t} catch (error) {\n\t\t\tawait this._waitForStreamClosed(writeStream);\n\t\t\tthis._cleanupPartial(destPath);\n\t\t\treturn { ok: false, error: `download-fail: ${error instanceof Error ? error.message : String(error)}` };\n\t\t}\n\n\t\tconst actualBytes = this._fileSizeBytes(destPath);\n\t\tif (expectedBytes !== undefined && actualBytes !== expectedBytes) {\n\t\t\tthis._cleanupPartial(destPath);\n\t\t\treturn { ok: false, error: `size-mismatch: expected ${expectedBytes} bytes, got ${actualBytes ?? 0}` };\n\t\t}\n\n\t\tonProgress?.(`${args.file} downloaded (${actualBytes ?? 0} bytes).`);\n\t\treturn { ok: true, path: destPath };\n\t}\n\n\tprivate async _healthUp(baseUrl: string): Promise<boolean> {\n\t\ttry {\n\t\t\tconst response = await this._fetch(`${baseUrl}/health`, {\n\t\t\t\tsignal: AbortSignal.timeout(HEALTH_CHECK_TIMEOUT_MS),\n\t\t\t});\n\t\t\treturn response.ok;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Spawn `llama-server` detached+tracked (killed on parent shutdown even if pi crashes without\n\t * calling stop()) and poll `/health` until ready. `-ngl 99` is only added when the installed\n\t * asset's persisted `backend` is `\"cuda\"`, not from the host's current GPU state.\n\t */\n\tasync serve(args: {\n\t\tmodelPath: string;\n\t\tmmprojPath?: string;\n\t\tport: number;\n\t\tnumCtx: number;\n\t}): Promise<PrismServeResult> {\n\t\tconst manifest = this._readManifest();\n\t\tif (!manifest) return { ok: false, error: \"binary-missing\" };\n\t\tconst binaryPath = join(this.runtimeDir(), manifest.binaryRelPath);\n\t\tif (!this._exists(binaryPath)) return { ok: false, error: \"binary-missing\" };\n\n\t\tconst baseUrl = `http://127.0.0.1:${args.port}`;\n\t\tconst argv = [\n\t\t\t\"-m\",\n\t\t\targs.modelPath,\n\t\t\t...(args.mmprojPath ? [\"--mmproj\", args.mmprojPath] : []),\n\t\t\t\"--host\",\n\t\t\t\"127.0.0.1\",\n\t\t\t\"--port\",\n\t\t\tString(args.port),\n\t\t\t\"-c\",\n\t\t\tString(args.numCtx),\n\t\t\t...(manifest.backend === \"cuda\" ? [\"-ngl\", \"99\"] : []),\n\t\t];\n\n\t\tconst child = this._spawn(binaryPath, argv, {\n\t\t\tdetached: process.platform !== \"win32\",\n\t\t\tstdio: \"ignore\",\n\t\t\tenv: process.env,\n\t\t});\n\t\tif (child.pid) trackDetachedChildPid(child.pid);\n\t\tchild.unref?.();\n\t\tchild.on(\"exit\", () => {\n\t\t\tthis._child = undefined;\n\t\t});\n\t\tthis._child = child;\n\n\t\tfor (let attempt = 0; attempt < this._healthPollAttempts; attempt++) {\n\t\t\tif (await this._healthUp(baseUrl)) return { ok: true, baseUrl };\n\t\t\tawait this._sleep(this._healthPollIntervalMs);\n\t\t}\n\t\tthis.stop();\n\t\treturn { ok: false, error: \"health-timeout\" };\n\t}\n\n\tstop(): { stopped: boolean } {\n\t\tconst child = this._child;\n\t\tif (!child) return { stopped: false };\n\t\tthis._child = undefined;\n\t\tif (child.pid) {\n\t\t\tuntrackDetachedChildPid(child.pid);\n\t\t\tkillProcessTree(child.pid);\n\t\t}\n\t\treturn { stopped: true };\n\t}\n\n\tisRunning(): boolean {\n\t\treturn this._child !== undefined;\n\t}\n}\n"]}
1
+ {"version":3,"file":"llamacpp-runtime.js","sourceRoot":"","sources":["../../../src/core/models/llamacpp-runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ChildProcess } from \"node:child_process\";\nimport { type Dirent, mkdirSync, readdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { arch as osArch, platform as osPlatform } from \"node:os\";\nimport { dirname, join, relative } from \"node:path\";\nimport type { Readable } from \"node:stream\";\nimport { pipeline } from \"node:stream/promises\";\nimport { spawnProcess, waitForChildProcessWithTermination } from \"../../utils/child-process.ts\";\nimport { killProcessTree, trackDetachedChildPid, untrackDetachedChildPid } from \"../../utils/shell.ts\";\nimport { modelsDir as agentModelsDir, runtimesDir as agentRuntimesDir } from \"../agent-paths.ts\";\nimport {\n\textractZipArchive,\n\tfetchRuntimeDownload,\n\tinstallRuntimeArchive,\n\ttype ManagedRuntimeSpawn,\n\tremovePartialDownload,\n\trequireRuntimeStdin,\n\tresolveRuntimeLifecycleDependencies,\n\truntimeCommandAvailable,\n\ttryFileSizeBytes,\n\twriteRuntimeDownload,\n} from \"./runtime-process.ts\";\n\n/**\n * Managed runtime for prism-ml 1-bit GGUF models (Bonsai-27B first). The provider requires their\n * llama.cpp fork (Q1_0_g128 hybrid-attention kernels) — stock llama.cpp/Ollama cannot serve these\n * weights — so this module owns runtime install (prebuilt release download+extract), GGUF\n * downloads, and llama-server lifecycle. Mirrors local-runtime.ts's OllamaRuntime: injectable\n * seams for fetch/spawn/exists, pi-owned directories under agentDir (runtimes/, models/),\n * detached+tracked child processes, onProgress as best-effort UI feedback, honest error taxonomies\n * instead of silent fallbacks.\n *\n * The fork publishes precompiled per-platform archives on GitHub Releases (no local build): pin a\n * release tag, download the matching asset, extract it, and locate the `llama-server` binary once\n * at install time (release archive layouts vary — bin/ vs build/bin/ at the top level — so this is\n * a deterministic one-time scan, not a fallback). The found relative path and backend (cpu/cuda)\n * are persisted to a manifest so later `detect()`/`serve()` calls never need to re-scan.\n */\n\n/**\n * Pinned Prism ML llama.cpp fork release — verified via\n * `GET https://api.github.com/repos/PrismML-Eng/llama.cpp/releases/tags/prism-b9594-38c66ad` on\n * 2026-07-18 (release exists, all assets referenced below are present on it). Bump here (and\n * re-verify with the same API call) when the provider ships new kernels.\n */\nexport const PRISM_LLAMACPP_PINNED_RELEASE = \"prism-b9594-38c66ad\";\n\nexport const PRISM_LLAMACPP_RELEASES_BASE_URL = \"https://github.com/PrismML-Eng/llama.cpp/releases/download\";\n\nexport interface PrismModelDescriptor {\n\trepo: string;\n\tfile: string;\n\tmmprojFile?: string;\n\tdisplayName: string;\n}\n\n/** Curated first-model descriptor; the `/models add` wiring task consumes this. */\nexport const BONSAI_27B: PrismModelDescriptor = {\n\trepo: \"prism-ml/Bonsai-27B-gguf\",\n\tfile: \"Bonsai-27B-Q1_0.gguf\",\n\tmmprojFile: \"Bonsai-27B-mmproj-Q8_0.gguf\",\n\tdisplayName: \"Bonsai-27B (1-bit Q1_0 + vision)\",\n};\n\nexport type PrismBackend = \"cpu\" | \"cuda\";\nexport type PrismAssetKind = \"tar-gz\" | \"zip\";\n\nexport interface PrismLlamaAsset {\n\tname: string;\n\tkind: PrismAssetKind;\n\tbackend: PrismBackend;\n}\n\n// Verbatim asset names from the pinned release (see PRISM_LLAMACPP_PINNED_RELEASE doc comment) —\n// hardcoded rather than templated from the tag because the provider's naming isn't fully\n// consistent across platforms (Windows CPU assets drop the tag/commit segment entirely; the\n// Windows CUDA asset uses a different build-number segment, \"b1\" not \"b9594\").\nconst LINUX_X64_CPU_ASSET = \"llama-prism-b9594-38c66ad-bin-ubuntu-x64.tar.gz\";\nconst LINUX_ARM64_CPU_ASSET = \"llama-prism-b9594-38c66ad-bin-ubuntu-arm64.tar.gz\";\nconst LINUX_X64_CUDA_ASSET = \"llama-prism-b9594-38c66ad-bin-linux-cuda-12.4-x64.tar.gz\";\nconst MACOS_ARM64_ASSET = \"llama-prism-b9594-38c66ad-bin-macos-arm64.tar.gz\";\nconst MACOS_X64_ASSET = \"llama-prism-b9594-38c66ad-bin-macos-x64.tar.gz\";\nconst WIN_X64_CPU_ASSET = \"llama-bin-win-cpu-x64.zip\";\nconst WIN_ARM64_CPU_ASSET = \"llama-bin-win-cpu-arm64.zip\";\n\n/**\n * Maps a platform/arch/GPU triple to the exact Prism llama.cpp release asset for\n * {@link PRISM_LLAMACPP_PINNED_RELEASE} — verified against the real GitHub release, not guessed.\n * CPU asset by default; the CUDA 12.4 variant is only offered for linux x64 with an NVIDIA GPU\n * present (a 12.8 variant also exists upstream but has no wired caller yet). Windows CUDA needs a\n * companion `cudart-*` archive and is out of scope for v1 — Windows always resolves to the CPU zip\n * regardless of `hasNvidiaGpu`. Pure and exported so it's independently testable.\n */\nexport function resolvePrismLlamaAsset(\n\tplat: string,\n\tarchitecture: string,\n\thasNvidiaGpu: boolean,\n): PrismLlamaAsset | undefined {\n\tif (plat === \"linux\") {\n\t\tif (architecture === \"x64\") {\n\t\t\treturn hasNvidiaGpu\n\t\t\t\t? { name: LINUX_X64_CUDA_ASSET, kind: \"tar-gz\", backend: \"cuda\" }\n\t\t\t\t: { name: LINUX_X64_CPU_ASSET, kind: \"tar-gz\", backend: \"cpu\" };\n\t\t}\n\t\tif (architecture === \"arm64\") return { name: LINUX_ARM64_CPU_ASSET, kind: \"tar-gz\", backend: \"cpu\" };\n\t\treturn undefined;\n\t}\n\tif (plat === \"darwin\") {\n\t\tif (architecture === \"arm64\") return { name: MACOS_ARM64_ASSET, kind: \"tar-gz\", backend: \"cpu\" };\n\t\tif (architecture === \"x64\") return { name: MACOS_X64_ASSET, kind: \"tar-gz\", backend: \"cpu\" };\n\t\treturn undefined;\n\t}\n\tif (plat === \"win32\") {\n\t\tif (architecture === \"x64\") return { name: WIN_X64_CPU_ASSET, kind: \"zip\", backend: \"cpu\" };\n\t\tif (architecture === \"arm64\") return { name: WIN_ARM64_CPU_ASSET, kind: \"zip\", backend: \"cpu\" };\n\t\treturn undefined;\n\t}\n\treturn undefined;\n}\n\nexport interface PrismDetectResult {\n\truntimeInstalled: boolean;\n\tbinaryPath?: string;\n\trelease?: string;\n}\n\nexport interface PrismDownloadResult {\n\tok: boolean;\n\tpath?: string;\n\tskipped?: boolean;\n\terror?: string;\n}\n\nexport type PrismServeResult = { ok: true; baseUrl: string } | { ok: false; error: string };\n\ninterface PrismInstallManifest {\n\trelease: string;\n\tbinaryRelPath: string;\n\tbackend: PrismBackend;\n}\n\ntype PrismExtractArchiveFn = (\n\tinput: Readable,\n\tdestDir: string,\n\tkind: PrismAssetKind,\n) => Promise<{ ok: boolean; error?: string }>;\n\nexport interface PrismLlamaCppDeps {\n\tfetchFn?: typeof fetch;\n\tspawnFn?: ManagedRuntimeSpawn;\n\texistsFn?: (path: string) => boolean;\n\tsleepFn?: (ms: number) => Promise<void>;\n\t/** Whether a named command exists on PATH (nvidia-smi, tar — for zip extraction on Windows). */\n\thasCommand?: (command: string) => boolean;\n\t/** Decided once at install time and persisted as `backend` — serve() reads the persisted value\n\t * so `-ngl 99` reflects what was actually installed, not the host's current GPU state. */\n\thasNvidiaGpu?: () => boolean;\n\tplatform?: () => string;\n\tarch?: () => string;\n\t/** Runs the extraction step for a downloaded archive. Injectable so installManaged's\n\t * download->extract->scan orchestration is testable without a real tar/unzip pipeline; defaults\n\t * to the real spawn-based extractor. */\n\textractArchive?: PrismExtractArchiveFn;\n\t/** Health-poll bounds for serve(); default ~120s (240 * 500ms), both overridable for tests. */\n\thealthPollAttempts?: number;\n\thealthPollIntervalMs?: number;\n}\n\nconst EXTRACTION_TIMEOUT_MS = 10 * 60_000;\nconst COMMAND_KILL_GRACE_MS = 2_000;\nconst DEFAULT_HEALTH_POLL_ATTEMPTS = 240;\nconst DEFAULT_HEALTH_POLL_INTERVAL_MS = 500;\nconst HEALTH_CHECK_TIMEOUT_MS = 2_000;\nconst HEAD_REQUEST_TIMEOUT_MS = 10_000;\n\nfunction parseContentLength(header: string | null): number | undefined {\n\tif (!header) return undefined;\n\tconst value = Number(header);\n\treturn Number.isFinite(value) && value >= 0 ? value : undefined;\n}\n\nexport class PrismLlamaCppRuntime {\n\tprivate readonly _agentDir: string;\n\tprivate readonly _fetch: typeof fetch;\n\tprivate readonly _spawn: ManagedRuntimeSpawn;\n\tprivate readonly _exists: (path: string) => boolean;\n\tprivate readonly _sleep: (ms: number) => Promise<void>;\n\tprivate readonly _hasCommand: (command: string) => boolean;\n\tprivate readonly _hasNvidiaGpu: () => boolean;\n\tprivate readonly _platform: () => string;\n\tprivate readonly _arch: () => string;\n\tprivate readonly _extractArchiveFn: PrismExtractArchiveFn;\n\tprivate readonly _healthPollAttempts: number;\n\tprivate readonly _healthPollIntervalMs: number;\n\tprivate _child: Pick<ChildProcess, \"pid\" | \"kill\" | \"unref\" | \"on\"> | undefined;\n\n\tconstructor(args: { agentDir: string; deps?: PrismLlamaCppDeps }) {\n\t\tthis._agentDir = args.agentDir;\n\t\t[this._fetch, this._spawn, this._exists, this._sleep] = resolveRuntimeLifecycleDependencies(args.deps);\n\t\tthis._hasCommand = args.deps?.hasCommand ?? runtimeCommandAvailable;\n\t\tthis._hasNvidiaGpu = args.deps?.hasNvidiaGpu ?? (() => this._hasCommand(\"nvidia-smi\"));\n\t\tthis._platform = args.deps?.platform ?? osPlatform;\n\t\tthis._arch = args.deps?.arch ?? osArch;\n\t\tthis._extractArchiveFn =\n\t\t\targs.deps?.extractArchive ?? ((input, destDir, kind) => this._extractArchive(input, destDir, kind));\n\t\tthis._healthPollAttempts = args.deps?.healthPollAttempts ?? DEFAULT_HEALTH_POLL_ATTEMPTS;\n\t\tthis._healthPollIntervalMs = args.deps?.healthPollIntervalMs ?? DEFAULT_HEALTH_POLL_INTERVAL_MS;\n\t}\n\n\truntimeDir(): string {\n\t\treturn agentRuntimesDir(\"prism-llamacpp\", this._agentDir);\n\t}\n\n\tmodelsDir(): string {\n\t\treturn agentModelsDir(\"llamacpp\", this._agentDir);\n\t}\n\n\tprivate _binaryName(): string {\n\t\treturn this._platform() === \"win32\" ? \"llama-server.exe\" : \"llama-server\";\n\t}\n\n\tprivate _manifestPath(): string {\n\t\treturn join(this.runtimeDir(), \"install.json\");\n\t}\n\n\tprivate _readManifest(): PrismInstallManifest | undefined {\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(readFileSync(this._manifestPath(), \"utf8\")) as {\n\t\t\t\trelease?: unknown;\n\t\t\t\tbinaryRelPath?: unknown;\n\t\t\t\tbackend?: unknown;\n\t\t\t};\n\t\t\tif (\n\t\t\t\ttypeof parsed.release === \"string\" &&\n\t\t\t\ttypeof parsed.binaryRelPath === \"string\" &&\n\t\t\t\t(parsed.backend === \"cpu\" || parsed.backend === \"cuda\")\n\t\t\t) {\n\t\t\t\treturn { release: parsed.release, binaryRelPath: parsed.binaryRelPath, backend: parsed.backend };\n\t\t\t}\n\t\t\treturn undefined;\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\tprivate _writeManifest(manifest: PrismInstallManifest): void {\n\t\twriteFileSync(this._manifestPath(), JSON.stringify(manifest, null, \"\\t\"));\n\t}\n\n\tasync detect(): Promise<PrismDetectResult> {\n\t\tconst manifest = this._readManifest();\n\t\tif (!manifest) return { runtimeInstalled: false };\n\t\tconst binaryPath = join(this.runtimeDir(), manifest.binaryRelPath);\n\t\tconst runtimeInstalled = this._exists(binaryPath);\n\t\treturn {\n\t\t\truntimeInstalled,\n\t\t\tbinaryPath: runtimeInstalled ? binaryPath : undefined,\n\t\t\trelease: manifest.release,\n\t\t};\n\t}\n\n\t/** One-time recursive scan for the `llama-server` binary inside a freshly extracted release\n\t * archive — layouts vary (bin/ vs build/bin/ at the top level) across platforms/backends, so\n\t * this locates it deterministically instead of assuming a fixed path, then the result is\n\t * persisted so later calls never need to re-scan. */\n\tprivate _findBinaryRelPath(root: string): string | undefined {\n\t\tconst targetName = this._binaryName();\n\t\tconst stack: string[] = [root];\n\t\twhile (stack.length > 0) {\n\t\t\tconst dir = stack.pop();\n\t\t\tif (dir === undefined) continue;\n\t\t\tlet entries: Dirent[];\n\t\t\ttry {\n\t\t\t\tentries = readdirSync(dir, { withFileTypes: true });\n\t\t\t} catch {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tfor (const entry of entries) {\n\t\t\t\tconst full = join(dir, entry.name);\n\t\t\t\tif (entry.isDirectory()) stack.push(full);\n\t\t\t\telse if (entry.isFile() && entry.name === targetName) return relative(root, full);\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Download the pinned release asset for this host and extract it (consent-gated by the caller,\n\t * same contract as OllamaRuntime#installManaged — this method only does the mechanical\n\t * download+extract+locate and reports the outcome honestly). No compiler toolchain required:\n\t * the fork ships prebuilt binaries.\n\t */\n\tasync installManaged(onProgress?: (status: string) => void): Promise<{ ok: boolean; error?: string }> {\n\t\tconst asset = resolvePrismLlamaAsset(this._platform(), this._arch(), this._hasNvidiaGpu());\n\t\tif (!asset) return { ok: false, error: \"unsupported-platform\" };\n\n\t\tconst downloadUrl = `${PRISM_LLAMACPP_RELEASES_BASE_URL}/${PRISM_LLAMACPP_PINNED_RELEASE}/${asset.name}`;\n\t\tconst extracted = await this._installArchive(downloadUrl, asset, onProgress);\n\t\tif (!extracted.ok) return extracted;\n\n\t\tonProgress?.(\"Locating llama-server binary…\");\n\t\tconst destDir = this.runtimeDir();\n\t\tconst binaryRelPath = this._findBinaryRelPath(destDir);\n\t\tif (!binaryRelPath) {\n\t\t\treturn { ok: false, error: \"binary-missing: no llama-server binary found in the extracted archive\" };\n\t\t}\n\n\t\tthis._writeManifest({ release: PRISM_LLAMACPP_PINNED_RELEASE, binaryRelPath, backend: asset.backend });\n\t\tonProgress?.(\"Prism llama.cpp runtime installed.\");\n\t\treturn { ok: true };\n\t}\n\n\tprivate _installArchive(\n\t\tdownloadUrl: string,\n\t\tasset: PrismLlamaAsset,\n\t\tonProgress?: (status: string) => void,\n\t): Promise<{ ok: boolean; error?: string }> {\n\t\treturn installRuntimeArchive(\n\t\t\tthis._fetch,\n\t\t\tdownloadUrl,\n\t\t\tthis.runtimeDir(),\n\t\t\tasset,\n\t\t\tthis._extractArchiveFn,\n\t\t\tonProgress,\n\t\t);\n\t}\n\n\tprivate async _extractArchive(\n\t\tinput: Readable,\n\t\tdestDir: string,\n\t\tkind: PrismAssetKind,\n\t): Promise<{ ok: boolean; error?: string }> {\n\t\ttry {\n\t\t\treturn kind === \"zip\" ? await this._extractZip(input, destDir) : await this._extractTarGz(input, destDir);\n\t\t} catch (error) {\n\t\t\treturn { ok: false, error: `extract-fail: ${error instanceof Error ? error.message : String(error)}` };\n\t\t}\n\t}\n\n\tprivate async _extractTarGz(input: Readable, destDir: string): Promise<{ ok: boolean; error?: string }> {\n\t\tconst tarProc = spawnProcess(\"tar\", [\"-xzf\", \"-\", \"-C\", destDir], {\n\t\t\tdetached: process.platform !== \"win32\",\n\t\t\tstdio: [\"pipe\", \"ignore\", \"ignore\"],\n\t\t});\n\t\tconst terminationController = new AbortController();\n\t\tconst processWait = waitForChildProcessWithTermination(tarProc, {\n\t\t\tsignal: terminationController.signal,\n\t\t\ttimeoutMs: EXTRACTION_TIMEOUT_MS,\n\t\t\tkillGraceMs: COMMAND_KILL_GRACE_MS,\n\t\t});\n\t\ttry {\n\t\t\tawait pipeline(input, requireRuntimeStdin(tarProc, \"tar\"));\n\t\t} catch (error) {\n\t\t\tterminationController.abort();\n\t\t\tawait processWait.catch(() => {});\n\t\t\tthrow error;\n\t\t}\n\t\tconst terminal = await processWait;\n\t\tif (terminal.reason === \"timeout\" || terminal.code !== 0) {\n\t\t\treturn {\n\t\t\t\tok: false,\n\t\t\t\terror:\n\t\t\t\t\tterminal.reason === \"timeout\"\n\t\t\t\t\t\t? `extract-fail: tar extraction timed out after ${EXTRACTION_TIMEOUT_MS}ms`\n\t\t\t\t\t\t: `extract-fail: tar exited with code ${terminal.code ?? \"unknown\"}`,\n\t\t\t};\n\t\t}\n\t\treturn { ok: true };\n\t}\n\n\tprivate async _extractZip(input: Readable, destDir: string): Promise<{ ok: boolean; error?: string }> {\n\t\treturn extractZipArchive({\n\t\t\tinput,\n\t\t\tdestDir,\n\t\t\ttempPrefix: \"prism-llamacpp-download\",\n\t\t\tplatform: this._platform,\n\t\t\thasCommand: this._hasCommand,\n\t\t\ttimeoutMs: EXTRACTION_TIMEOUT_MS,\n\t\t\tkillGraceMs: COMMAND_KILL_GRACE_MS,\n\t\t});\n\t}\n\n\tprivate async _remoteContentLength(url: string): Promise<number | undefined> {\n\t\ttry {\n\t\t\tconst response = await this._fetch(url, {\n\t\t\t\tmethod: \"HEAD\",\n\t\t\t\tsignal: AbortSignal.timeout(HEAD_REQUEST_TIMEOUT_MS),\n\t\t\t});\n\t\t\treturn response.ok ? parseContentLength(response.headers.get(\"content-length\")) : undefined;\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\t/**\n\t * Stream a GGUF (or mmproj) file from Hugging Face into pi's owned models dir. Skips a re-download\n\t * when the local file already matches the remote size; verifies size when the response reports\n\t * `content-length` and deletes the partial file on any failure or mismatch — never leaves a\n\t * corrupt/truncated weight file behind for a later load to silently misread.\n\t */\n\tasync downloadModel(\n\t\targs: { repo: string; file: string },\n\t\tonProgress?: (status: string) => void,\n\t): Promise<PrismDownloadResult> {\n\t\tconst destPath = join(this.modelsDir(), args.repo, args.file);\n\t\tconst url = `https://huggingface.co/${args.repo}/resolve/main/${args.file}`;\n\t\tmkdirSync(dirname(destPath), { recursive: true });\n\n\t\tif (this._exists(destPath)) {\n\t\t\tconst remoteSize = await this._remoteContentLength(url);\n\t\t\tif (remoteSize !== undefined && remoteSize === tryFileSizeBytes(destPath)) {\n\t\t\t\tonProgress?.(`${args.file} already downloaded (${remoteSize} bytes) — skipping.`);\n\t\t\t\treturn { ok: true, path: destPath, skipped: true };\n\t\t\t}\n\t\t}\n\n\t\tonProgress?.(`Downloading ${args.file} from ${args.repo}…`);\n\t\tconst download = await fetchRuntimeDownload(this._fetch, url);\n\t\tif (!download.ok) return download;\n\n\t\tconst expectedBytes = parseContentLength(download.response.headers.get(\"content-length\"));\n\t\tconst written = await writeRuntimeDownload(download.body as unknown as Readable, destPath);\n\t\tif (!written.ok) return written;\n\n\t\tconst actualBytes = tryFileSizeBytes(destPath);\n\t\tif (expectedBytes !== undefined && actualBytes !== expectedBytes) {\n\t\t\tremovePartialDownload(destPath);\n\t\t\treturn { ok: false, error: `size-mismatch: expected ${expectedBytes} bytes, got ${actualBytes ?? 0}` };\n\t\t}\n\n\t\tonProgress?.(`${args.file} downloaded (${actualBytes ?? 0} bytes).`);\n\t\treturn { ok: true, path: destPath };\n\t}\n\n\tprivate async _healthUp(baseUrl: string): Promise<boolean> {\n\t\ttry {\n\t\t\tconst response = await this._fetch(`${baseUrl}/health`, {\n\t\t\t\tsignal: AbortSignal.timeout(HEALTH_CHECK_TIMEOUT_MS),\n\t\t\t});\n\t\t\treturn response.ok;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Spawn `llama-server` detached+tracked (killed on parent shutdown even if pi crashes without\n\t * calling stop()) and poll `/health` until ready. `-ngl 99` is only added when the installed\n\t * asset's persisted `backend` is `\"cuda\"`, not from the host's current GPU state.\n\t */\n\tasync serve(args: {\n\t\tmodelPath: string;\n\t\tmmprojPath?: string;\n\t\tport: number;\n\t\tnumCtx: number;\n\t}): Promise<PrismServeResult> {\n\t\tconst manifest = this._readManifest();\n\t\tif (!manifest) return { ok: false, error: \"binary-missing\" };\n\t\tconst binaryPath = join(this.runtimeDir(), manifest.binaryRelPath);\n\t\tif (!this._exists(binaryPath)) return { ok: false, error: \"binary-missing\" };\n\n\t\tconst baseUrl = `http://127.0.0.1:${args.port}`;\n\t\tconst argv = [\n\t\t\t\"-m\",\n\t\t\targs.modelPath,\n\t\t\t...(args.mmprojPath ? [\"--mmproj\", args.mmprojPath] : []),\n\t\t\t\"--host\",\n\t\t\t\"127.0.0.1\",\n\t\t\t\"--port\",\n\t\t\tString(args.port),\n\t\t\t\"-c\",\n\t\t\tString(args.numCtx),\n\t\t\t...(manifest.backend === \"cuda\" ? [\"-ngl\", \"99\"] : []),\n\t\t];\n\n\t\tconst child = this._spawn(binaryPath, argv, {\n\t\t\tdetached: process.platform !== \"win32\",\n\t\t\tstdio: \"ignore\",\n\t\t\tenv: process.env,\n\t\t});\n\t\tif (child.pid) trackDetachedChildPid(child.pid);\n\t\tchild.unref?.();\n\t\tchild.on(\"exit\", () => {\n\t\t\tthis._child = undefined;\n\t\t});\n\t\tthis._child = child;\n\n\t\tfor (let attempt = 0; attempt < this._healthPollAttempts; attempt++) {\n\t\t\tif (await this._healthUp(baseUrl)) return { ok: true, baseUrl };\n\t\t\tawait this._sleep(this._healthPollIntervalMs);\n\t\t}\n\t\tthis.stop();\n\t\treturn { ok: false, error: \"health-timeout\" };\n\t}\n\n\tstop(): { stopped: boolean } {\n\t\tconst child = this._child;\n\t\tif (!child) return { stopped: false };\n\t\tthis._child = undefined;\n\t\tif (child.pid) {\n\t\t\tuntrackDetachedChildPid(child.pid);\n\t\t\tkillProcessTree(child.pid);\n\t\t}\n\t\treturn { stopped: true };\n\t}\n\n\tisRunning(): boolean {\n\t\treturn this._child !== undefined;\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"local-registration.d.ts","sourceRoot":"","sources":["../../../src/core/models/local-registration.ts"],"names":[],"mappings":"AA4CA,MAAM,WAAW,uBAAuB;IACvC,EAAE,EAAE,OAAO,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uFAAuF;IACvF,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,2FAA2F;AAC3F,eAAO,MAAM,eAAe,WAAW,CAAC;AACxC,6EAA6E;AAC7E,eAAO,MAAM,wBAAwB,uBAAuB,CAAC;AAC7D;;;;;;;;;GASG;AACH,eAAO,MAAM,uBAAuB,cAAc,CAAC;AA8DnD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC7B,GAAG,uBAAuB,CAoC1B;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE;IAC/C,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB,GAAG,uBAAuB,CAqC1B;AAED;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE;IAChD,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC7B,GAAG,uBAAuB,CA4B1B;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,uBAAuB,CAgBrG;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,uBAAuB,CAchH;AAED;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,uBAAuB,CAWjH","sourcesContent":["import { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { configFile } from \"../agent-paths.ts\";\n\n/**\n * Persistent registration for pulled local models: merges an \"ollama\" provider entry into the\n * user's `<agentDir>/models.json` — the exact file ModelRegistry loads at startup — so a pulled\n * model resolves as `ollama/<ref>` immediately AND across sessions (usable as session model,\n * lane model, judge, or curator).\n *\n * Non-destructive contract: the file is parsed with STRICT JSON first; a file that only parses\n * with comments/relaxed syntax is the user's hand-authored config and is never rewritten — the\n * caller gets `manualSnippet` to show instead.\n */\n\ninterface ModelsJsonModel {\n\tid: string;\n\tname?: string;\n\tapi?: string;\n\tbaseUrl?: string;\n\tcontextWindow?: number;\n\t/** Measured by the local capacity probe; compaction uses min(contextWindow, servedContextWindow). */\n\tservedContextWindow?: number;\n\tmaxTokens?: number;\n\treasoning?: boolean;\n\ttextToolCallProtocol?: boolean;\n\tinput?: string[];\n\tcost?: { input: number; output: number; cacheRead: number; cacheWrite: number };\n\tcompat?: Record<string, unknown>;\n}\n\ninterface ModelsJson {\n\tproviders: Record<\n\t\tstring,\n\t\t{\n\t\t\tbaseUrl?: string;\n\t\t\tapi?: string;\n\t\t\tapiKey?: string;\n\t\t\tmodels?: ModelsJsonModel[];\n\t\t\t[key: string]: unknown;\n\t\t}\n\t>;\n\t[key: string]: unknown;\n}\n\nexport interface LocalRegistrationResult {\n\tok: boolean;\n\tmodelsJsonPath: string;\n\treason?: string;\n\t/** When the file cannot be safely rewritten: the entry the user should add by hand. */\n\tmanualSnippet?: string;\n}\n\n/** Provider name pi registers pulled local models under (see registerLocalModel below). */\nexport const OLLAMA_PROVIDER = \"ollama\";\n/** Provider name for pi-managed Hugging Face Transformers sidecar models. */\nexport const HF_TRANSFORMERS_PROVIDER = \"pi-hf-transformers\";\n/**\n * Provider name for pi-managed prism llama.cpp models (Bonsai-27B and future curated prism-ml\n * models). This is the built-in `KnownProvider` \"llama-cpp\" (see packages/ai/src/types.ts and the\n * static `llama-cpp/local` catalog entry in models.generated.ts for a user-run server on the\n * conventional port 8080) — model-registry.ts already treats it as auth-exempt, so registration\n * here never needs a synthetic apiKey the way registerTransformersModel does. Because it is a\n * SHARED built-in namespace (not a pi-invented provider name like the two above), registration only\n * ever touches this provider's `models` array — never the whole provider object — so a user's own\n * hand-authored `llama-cpp` override (e.g. for their own server) is never destroyed.\n */\nexport const PRISM_LLAMACPP_PROVIDER = \"llama-cpp\";\n\nfunction localModelEntry(ref: string, contextWindow: number, servedContextWindow?: number): ModelsJsonModel {\n\treturn {\n\t\tid: ref,\n\t\tname: ref,\n\t\tcontextWindow,\n\t\t...(servedContextWindow !== undefined ? { servedContextWindow } : {}),\n\t\tmaxTokens: 2048,\n\t\treasoning: false,\n\t\tinput: [\"text\"],\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t};\n}\n\nfunction transformersModelEntry(args: { modelId: string; baseUrl: string; contextWindow?: number }): ModelsJsonModel {\n\treturn {\n\t\tid: args.modelId,\n\t\tname: args.modelId,\n\t\tbaseUrl: `${args.baseUrl.replace(/\\/$/, \"\")}/v1`,\n\t\tcontextWindow: args.contextWindow ?? 131_072,\n\t\tmaxTokens: 1024,\n\t\treasoning: false,\n\t\tinput: [\"text\"],\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t\tcompat: { supportsUsageInStreaming: false },\n\t};\n}\n\nfunction prismLlamaCppModelEntry(args: {\n\tmodelId: string;\n\tbaseUrl: string;\n\tcontextWindow: number;\n\tservedContextWindow: number;\n}): ModelsJsonModel {\n\treturn {\n\t\tid: args.modelId,\n\t\tname: args.modelId,\n\t\tbaseUrl: `${args.baseUrl.replace(/\\/$/, \"\")}/v1`,\n\t\tcontextWindow: args.contextWindow,\n\t\tservedContextWindow: args.servedContextWindow,\n\t\tmaxTokens: 2048,\n\t\treasoning: false,\n\t\t// Vision rides along via the served mmproj file — unlike localModelEntry's Ollama entries,\n\t\t// which are text-only until per-model vision plumbing exists there too.\n\t\tinput: [\"text\", \"image\"],\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t};\n}\n\nfunction loadStrict(path: string): { json?: ModelsJson; reason?: string } {\n\tif (!existsSync(path)) return { json: { providers: {} } };\n\ttry {\n\t\tconst parsed = JSON.parse(readFileSync(path, \"utf-8\")) as ModelsJson;\n\t\tif (!parsed || typeof parsed !== \"object\") return { reason: \"models.json is not a JSON object\" };\n\t\tparsed.providers = parsed.providers ?? {};\n\t\treturn { json: parsed };\n\t} catch {\n\t\treturn { reason: \"models.json uses comments/relaxed JSON — pi will not rewrite a hand-authored file\" };\n\t}\n}\n\nexport function registerLocalModel(args: {\n\tagentDir: string;\n\tref: string;\n\tbaseUrl: string;\n\tcontextWindow?: number;\n\tservedContextWindow?: number;\n}): LocalRegistrationResult {\n\tconst modelsJsonPath = configFile(args.agentDir, \"models.json\");\n\tconst contextWindow = args.contextWindow ?? 8192;\n\tconst entry = localModelEntry(args.ref, contextWindow, args.servedContextWindow);\n\tconst providerBase = {\n\t\tbaseUrl: `${args.baseUrl.replace(/\\/$/, \"\")}/v1`,\n\t\tapi: \"openai-completions\",\n\t\tapiKey: \"ollama\",\n\t};\n\tconst { json, reason } = loadStrict(modelsJsonPath);\n\tif (!json) {\n\t\treturn {\n\t\t\tok: false,\n\t\t\tmodelsJsonPath,\n\t\t\treason,\n\t\t\tmanualSnippet: JSON.stringify(\n\t\t\t\t{ providers: { [OLLAMA_PROVIDER]: { ...providerBase, models: [entry] } } },\n\t\t\t\tnull,\n\t\t\t\t\"\\t\",\n\t\t\t),\n\t\t};\n\t}\n\tjson.providers[OLLAMA_PROVIDER] ??= { ...providerBase, models: [] };\n\tconst provider = json.providers[OLLAMA_PROVIDER];\n\tprovider.baseUrl ??= providerBase.baseUrl;\n\tprovider.api ??= providerBase.api;\n\tprovider.apiKey ??= providerBase.apiKey;\n\tprovider.models ??= [];\n\tconst existing = provider.models.findIndex((model) => model.id === args.ref);\n\tif (existing >= 0) {\n\t\tprovider.models[existing] = { ...provider.models[existing], ...entry };\n\t} else {\n\t\tprovider.models.push(entry);\n\t}\n\twriteFileSync(modelsJsonPath, `${JSON.stringify(json, null, \"\\t\")}\\n`, \"utf-8\");\n\treturn { ok: true, modelsJsonPath };\n}\n\nexport function registerTransformersModel(args: {\n\tagentDir: string;\n\tmodelId: string;\n\tbaseUrl: string;\n\tcontextWindow?: number;\n}): LocalRegistrationResult {\n\tconst modelsJsonPath = configFile(args.agentDir, \"models.json\");\n\tconst entry = transformersModelEntry(args);\n\tconst providerBase = {\n\t\tname: \"Hugging Face Transformers (pi-managed)\",\n\t\tbaseUrl: entry.baseUrl,\n\t\tapi: \"openai-completions\",\n\t\tapiKey: \"pi-transformers\",\n\t};\n\tconst { json, reason } = loadStrict(modelsJsonPath);\n\tif (!json) {\n\t\treturn {\n\t\t\tok: false,\n\t\t\tmodelsJsonPath,\n\t\t\treason,\n\t\t\tmanualSnippet: JSON.stringify(\n\t\t\t\t{ providers: { [HF_TRANSFORMERS_PROVIDER]: { ...providerBase, models: [entry] } } },\n\t\t\t\tnull,\n\t\t\t\t\"\\t\",\n\t\t\t),\n\t\t};\n\t}\n\tjson.providers[HF_TRANSFORMERS_PROVIDER] ??= { ...providerBase, models: [] };\n\tconst provider = json.providers[HF_TRANSFORMERS_PROVIDER];\n\tprovider.name ??= providerBase.name;\n\tprovider.baseUrl ??= providerBase.baseUrl;\n\tprovider.api ??= providerBase.api;\n\tprovider.apiKey ??= providerBase.apiKey;\n\tprovider.models ??= [];\n\tconst existing = provider.models.findIndex((model) => model.id === args.modelId);\n\tif (existing >= 0) {\n\t\tprovider.models[existing] = { ...provider.models[existing], ...entry };\n\t} else {\n\t\tprovider.models.push(entry);\n\t}\n\twriteFileSync(modelsJsonPath, `${JSON.stringify(json, null, \"\\t\")}\\n`, \"utf-8\");\n\treturn { ok: true, modelsJsonPath };\n}\n\n/**\n * Register a pi-managed prism llama.cpp model (e.g. Bonsai-27B) under the shared built-in\n * \"llama-cpp\" provider. Unlike registerLocalModel/registerTransformersModel, this never writes\n * provider-level baseUrl/api/apiKey: \"llama-cpp\" is a built-in KnownProvider, so model-registry.ts\n * inherits api/baseUrl defaults from the built-in `llama-cpp/local` catalog entry when a model\n * definition omits them, and treats the whole provider as auth-exempt regardless. Each model\n * definition still sets its OWN baseUrl explicitly (this server's actual host:port), which\n * model-registry.ts's `modelDef.baseUrl ?? providerConfig.baseUrl ?? builtInDefaults?.baseUrl`\n * precedence picks up ahead of the built-in default.\n */\nexport function registerPrismLlamaCppModel(args: {\n\tagentDir: string;\n\tmodelId: string;\n\tbaseUrl: string;\n\tcontextWindow: number;\n\tservedContextWindow?: number;\n}): LocalRegistrationResult {\n\tconst modelsJsonPath = configFile(args.agentDir, \"models.json\");\n\tconst entry = prismLlamaCppModelEntry({\n\t\tmodelId: args.modelId,\n\t\tbaseUrl: args.baseUrl,\n\t\tcontextWindow: args.contextWindow,\n\t\tservedContextWindow: args.servedContextWindow ?? args.contextWindow,\n\t});\n\tconst { json, reason } = loadStrict(modelsJsonPath);\n\tif (!json) {\n\t\treturn {\n\t\t\tok: false,\n\t\t\tmodelsJsonPath,\n\t\t\treason,\n\t\t\tmanualSnippet: JSON.stringify({ providers: { [PRISM_LLAMACPP_PROVIDER]: { models: [entry] } } }, null, \"\\t\"),\n\t\t};\n\t}\n\tjson.providers[PRISM_LLAMACPP_PROVIDER] ??= { models: [] };\n\tconst provider = json.providers[PRISM_LLAMACPP_PROVIDER];\n\tprovider.models ??= [];\n\tconst existing = provider.models.findIndex((model) => model.id === args.modelId);\n\tif (existing >= 0) {\n\t\tprovider.models[existing] = { ...provider.models[existing], ...entry };\n\t} else {\n\t\tprovider.models.push(entry);\n\t}\n\twriteFileSync(modelsJsonPath, `${JSON.stringify(json, null, \"\\t\")}\\n`, \"utf-8\");\n\treturn { ok: true, modelsJsonPath };\n}\n\nexport function unregisterLocalModel(args: { agentDir: string; ref: string }): LocalRegistrationResult {\n\tconst modelsJsonPath = configFile(args.agentDir, \"models.json\");\n\tconst { json, reason } = loadStrict(modelsJsonPath);\n\tif (!json) return { ok: false, modelsJsonPath, reason };\n\tconst provider = json.providers[OLLAMA_PROVIDER];\n\tif (!provider?.models) return { ok: true, modelsJsonPath };\n\tconst before = provider.models.length;\n\tprovider.models = provider.models.filter((model) => model.id !== args.ref);\n\tif (provider.models.length === before) return { ok: true, modelsJsonPath };\n\t// Drop the whole provider entry when its last pi-registered model goes (leave user fields alone\n\t// if they added any models themselves — only an all-pi-managed empty list is removed).\n\tif (provider.models.length === 0) {\n\t\tdelete json.providers[OLLAMA_PROVIDER];\n\t}\n\twriteFileSync(modelsJsonPath, `${JSON.stringify(json, null, \"\\t\")}\\n`, \"utf-8\");\n\treturn { ok: true, modelsJsonPath };\n}\n\nexport function unregisterTransformersModel(args: { agentDir: string; modelId: string }): LocalRegistrationResult {\n\tconst modelsJsonPath = configFile(args.agentDir, \"models.json\");\n\tconst { json, reason } = loadStrict(modelsJsonPath);\n\tif (!json) return { ok: false, modelsJsonPath, reason };\n\tconst provider = json.providers[HF_TRANSFORMERS_PROVIDER];\n\tif (!provider?.models) return { ok: true, modelsJsonPath };\n\tconst before = provider.models.length;\n\tprovider.models = provider.models.filter((model) => model.id !== args.modelId);\n\tif (provider.models.length === before) return { ok: true, modelsJsonPath };\n\tif (provider.models.length === 0) {\n\t\tdelete json.providers[HF_TRANSFORMERS_PROVIDER];\n\t}\n\twriteFileSync(modelsJsonPath, `${JSON.stringify(json, null, \"\\t\")}\\n`, \"utf-8\");\n\treturn { ok: true, modelsJsonPath };\n}\n\n/**\n * Drop a pi-registered model entry from the shared \"llama-cpp\" provider. Deliberately never\n * deletes the whole provider object even when its `models` array empties out — see\n * {@link PRISM_LLAMACPP_PROVIDER}'s doc comment: unlike OLLAMA_PROVIDER/HF_TRANSFORMERS_PROVIDER\n * (pi-invented namespaces pi fully owns), \"llama-cpp\" is a built-in provider a user may have\n * independently configured (e.g. a baseUrl override for their own server); this must not remove\n * fields it didn't write.\n */\nexport function unregisterPrismLlamaCppModel(args: { agentDir: string; modelId: string }): LocalRegistrationResult {\n\tconst modelsJsonPath = configFile(args.agentDir, \"models.json\");\n\tconst { json, reason } = loadStrict(modelsJsonPath);\n\tif (!json) return { ok: false, modelsJsonPath, reason };\n\tconst provider = json.providers[PRISM_LLAMACPP_PROVIDER];\n\tif (!provider?.models) return { ok: true, modelsJsonPath };\n\tconst before = provider.models.length;\n\tprovider.models = provider.models.filter((model) => model.id !== args.modelId);\n\tif (provider.models.length === before) return { ok: true, modelsJsonPath };\n\twriteFileSync(modelsJsonPath, `${JSON.stringify(json, null, \"\\t\")}\\n`, \"utf-8\");\n\treturn { ok: true, modelsJsonPath };\n}\n"]}
1
+ {"version":3,"file":"local-registration.d.ts","sourceRoot":"","sources":["../../../src/core/models/local-registration.ts"],"names":[],"mappings":"AA2CA,MAAM,WAAW,uBAAuB;IACvC,EAAE,EAAE,OAAO,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uFAAuF;IACvF,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,2FAA2F;AAC3F,eAAO,MAAM,eAAe,WAAW,CAAC;AACxC,6EAA6E;AAC7E,eAAO,MAAM,wBAAwB,uBAAuB,CAAC;AAC7D;;;;;;;;;GASG;AACH,eAAO,MAAM,uBAAuB,cAAc,CAAC;AA0HnD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC7B,GAAG,uBAAuB,CAe1B;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE;IAC/C,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB,GAAG,uBAAuB,CAe1B;AAED;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE;IAChD,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC7B,GAAG,uBAAuB,CAa1B;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,uBAAuB,CASrG;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,uBAAuB,CAOhH;AAED;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,uBAAuB,CAOjH"}