jfl 0.4.4 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (533) hide show
  1. package/dist/commands/context-hub.d.ts +1 -0
  2. package/dist/commands/context-hub.d.ts.map +1 -1
  3. package/dist/commands/context-hub.js +1064 -41
  4. package/dist/commands/context-hub.js.map +1 -1
  5. package/dist/commands/eval.d.ts +1 -1
  6. package/dist/commands/eval.d.ts.map +1 -1
  7. package/dist/commands/eval.js +192 -1
  8. package/dist/commands/eval.js.map +1 -1
  9. package/dist/commands/findings.d.ts +6 -0
  10. package/dist/commands/findings.d.ts.map +1 -0
  11. package/dist/commands/findings.js +203 -0
  12. package/dist/commands/findings.js.map +1 -0
  13. package/dist/commands/hud.d.ts.map +1 -1
  14. package/dist/commands/hud.js +47 -9
  15. package/dist/commands/hud.js.map +1 -1
  16. package/dist/commands/ide.d.ts +27 -0
  17. package/dist/commands/ide.d.ts.map +1 -0
  18. package/dist/commands/ide.js +546 -0
  19. package/dist/commands/ide.js.map +1 -0
  20. package/dist/commands/onboard.d.ts.map +1 -1
  21. package/dist/commands/onboard.js +212 -2
  22. package/dist/commands/onboard.js.map +1 -1
  23. package/dist/commands/openclaw.d.ts +3 -0
  24. package/dist/commands/openclaw.d.ts.map +1 -1
  25. package/dist/commands/openclaw.js +76 -2
  26. package/dist/commands/openclaw.js.map +1 -1
  27. package/dist/commands/peter.d.ts +3 -0
  28. package/dist/commands/peter.d.ts.map +1 -1
  29. package/dist/commands/peter.js +1168 -58
  30. package/dist/commands/peter.js.map +1 -1
  31. package/dist/commands/pi-fleet.d.ts +18 -0
  32. package/dist/commands/pi-fleet.d.ts.map +1 -0
  33. package/dist/commands/pi-fleet.js +382 -0
  34. package/dist/commands/pi-fleet.js.map +1 -0
  35. package/dist/commands/pi.d.ts.map +1 -1
  36. package/dist/commands/pi.js +18 -3
  37. package/dist/commands/pi.js.map +1 -1
  38. package/dist/commands/scope.d.ts.map +1 -1
  39. package/dist/commands/scope.js +90 -1
  40. package/dist/commands/scope.js.map +1 -1
  41. package/dist/commands/services.d.ts.map +1 -1
  42. package/dist/commands/services.js +18 -0
  43. package/dist/commands/services.js.map +1 -1
  44. package/dist/commands/setup.d.ts +12 -0
  45. package/dist/commands/setup.d.ts.map +1 -0
  46. package/dist/commands/setup.js +322 -0
  47. package/dist/commands/setup.js.map +1 -0
  48. package/dist/commands/status.d.ts.map +1 -1
  49. package/dist/commands/status.js +22 -4
  50. package/dist/commands/status.js.map +1 -1
  51. package/dist/commands/train.d.ts +33 -0
  52. package/dist/commands/train.d.ts.map +1 -0
  53. package/dist/commands/train.js +510 -0
  54. package/dist/commands/train.js.map +1 -0
  55. package/dist/commands/verify.d.ts +14 -0
  56. package/dist/commands/verify.d.ts.map +1 -0
  57. package/dist/commands/verify.js +276 -0
  58. package/dist/commands/verify.js.map +1 -0
  59. package/dist/commands/viz.d.ts.map +1 -1
  60. package/dist/commands/viz.js +417 -0
  61. package/dist/commands/viz.js.map +1 -1
  62. package/dist/dashboard-static/assets/index-CW9ZxqX8.css +1 -0
  63. package/dist/dashboard-static/assets/index-DNN__p4K.js +121 -0
  64. package/dist/dashboard-static/index.html +2 -2
  65. package/dist/index.js +324 -64
  66. package/dist/index.js.map +1 -1
  67. package/dist/lib/agent-config.d.ts +52 -0
  68. package/dist/lib/agent-config.d.ts.map +1 -0
  69. package/dist/lib/agent-config.js +231 -0
  70. package/dist/lib/agent-config.js.map +1 -0
  71. package/dist/lib/agent-generator.d.ts +10 -0
  72. package/dist/lib/agent-generator.d.ts.map +1 -1
  73. package/dist/lib/agent-generator.js +64 -10
  74. package/dist/lib/agent-generator.js.map +1 -1
  75. package/dist/lib/agent-session.d.ts +104 -0
  76. package/dist/lib/agent-session.d.ts.map +1 -0
  77. package/dist/lib/agent-session.js +635 -0
  78. package/dist/lib/agent-session.js.map +1 -0
  79. package/dist/lib/eval-snapshot.d.ts +47 -0
  80. package/dist/lib/eval-snapshot.d.ts.map +1 -0
  81. package/dist/lib/eval-snapshot.js +315 -0
  82. package/dist/lib/eval-snapshot.js.map +1 -0
  83. package/dist/lib/eval-store.d.ts +5 -0
  84. package/dist/lib/eval-store.d.ts.map +1 -1
  85. package/dist/lib/eval-store.js +33 -3
  86. package/dist/lib/eval-store.js.map +1 -1
  87. package/dist/lib/findings-engine.d.ts +51 -0
  88. package/dist/lib/findings-engine.d.ts.map +1 -0
  89. package/dist/lib/findings-engine.js +338 -0
  90. package/dist/lib/findings-engine.js.map +1 -0
  91. package/dist/lib/flow-engine.d.ts +8 -0
  92. package/dist/lib/flow-engine.d.ts.map +1 -1
  93. package/dist/lib/flow-engine.js +84 -2
  94. package/dist/lib/flow-engine.js.map +1 -1
  95. package/dist/lib/hub-client.d.ts +1 -0
  96. package/dist/lib/hub-client.d.ts.map +1 -1
  97. package/dist/lib/hub-client.js +33 -6
  98. package/dist/lib/hub-client.js.map +1 -1
  99. package/dist/lib/ide-panes.d.ts +58 -0
  100. package/dist/lib/ide-panes.d.ts.map +1 -0
  101. package/dist/lib/ide-panes.js +508 -0
  102. package/dist/lib/ide-panes.js.map +1 -0
  103. package/dist/lib/memory-db.js +4 -4
  104. package/dist/lib/memory-db.js.map +1 -1
  105. package/dist/lib/memory-indexer.d.ts.map +1 -1
  106. package/dist/lib/memory-indexer.js +3 -0
  107. package/dist/lib/memory-indexer.js.map +1 -1
  108. package/dist/lib/memory-search.d.ts +148 -4
  109. package/dist/lib/memory-search.d.ts.map +1 -1
  110. package/dist/lib/memory-search.js +496 -58
  111. package/dist/lib/memory-search.js.map +1 -1
  112. package/dist/lib/meta-orchestrator.d.ts +104 -0
  113. package/dist/lib/meta-orchestrator.d.ts.map +1 -0
  114. package/dist/lib/meta-orchestrator.js +373 -0
  115. package/dist/lib/meta-orchestrator.js.map +1 -0
  116. package/dist/lib/peer-agent-generator.d.ts.map +1 -1
  117. package/dist/lib/peer-agent-generator.js +43 -19
  118. package/dist/lib/peer-agent-generator.js.map +1 -1
  119. package/dist/lib/pi-sky/bridge.d.ts +55 -0
  120. package/dist/lib/pi-sky/bridge.d.ts.map +1 -0
  121. package/dist/lib/pi-sky/bridge.js +264 -0
  122. package/dist/lib/pi-sky/bridge.js.map +1 -0
  123. package/dist/lib/pi-sky/cost-monitor.d.ts +21 -0
  124. package/dist/lib/pi-sky/cost-monitor.d.ts.map +1 -0
  125. package/dist/lib/pi-sky/cost-monitor.js +126 -0
  126. package/dist/lib/pi-sky/cost-monitor.js.map +1 -0
  127. package/dist/lib/pi-sky/eval-sweep.d.ts +27 -0
  128. package/dist/lib/pi-sky/eval-sweep.d.ts.map +1 -0
  129. package/dist/lib/pi-sky/eval-sweep.js +141 -0
  130. package/dist/lib/pi-sky/eval-sweep.js.map +1 -0
  131. package/dist/lib/pi-sky/event-router.d.ts +32 -0
  132. package/dist/lib/pi-sky/event-router.d.ts.map +1 -0
  133. package/dist/lib/pi-sky/event-router.js +176 -0
  134. package/dist/lib/pi-sky/event-router.js.map +1 -0
  135. package/dist/lib/pi-sky/experiment.d.ts +9 -0
  136. package/dist/lib/pi-sky/experiment.d.ts.map +1 -0
  137. package/dist/lib/pi-sky/experiment.js +83 -0
  138. package/dist/lib/pi-sky/experiment.js.map +1 -0
  139. package/dist/lib/pi-sky/index.d.ts +16 -0
  140. package/dist/lib/pi-sky/index.d.ts.map +1 -0
  141. package/dist/lib/pi-sky/index.js +16 -0
  142. package/dist/lib/pi-sky/index.js.map +1 -0
  143. package/dist/lib/pi-sky/stratus-gate.d.ts +28 -0
  144. package/dist/lib/pi-sky/stratus-gate.d.ts.map +1 -0
  145. package/dist/lib/pi-sky/stratus-gate.js +61 -0
  146. package/dist/lib/pi-sky/stratus-gate.js.map +1 -0
  147. package/dist/lib/pi-sky/swarm.d.ts +28 -0
  148. package/dist/lib/pi-sky/swarm.d.ts.map +1 -0
  149. package/dist/lib/pi-sky/swarm.js +208 -0
  150. package/dist/lib/pi-sky/swarm.js.map +1 -0
  151. package/dist/lib/pi-sky/types.d.ts +139 -0
  152. package/dist/lib/pi-sky/types.d.ts.map +1 -0
  153. package/dist/lib/pi-sky/types.js +2 -0
  154. package/dist/lib/pi-sky/types.js.map +1 -0
  155. package/dist/lib/pi-sky/voice-bridge.d.ts +20 -0
  156. package/dist/lib/pi-sky/voice-bridge.d.ts.map +1 -0
  157. package/dist/lib/pi-sky/voice-bridge.js +91 -0
  158. package/dist/lib/pi-sky/voice-bridge.js.map +1 -0
  159. package/dist/lib/policy-head.d.ts +40 -0
  160. package/dist/lib/policy-head.d.ts.map +1 -0
  161. package/dist/lib/policy-head.js +234 -0
  162. package/dist/lib/policy-head.js.map +1 -0
  163. package/dist/lib/predictor.d.ts +10 -0
  164. package/dist/lib/predictor.d.ts.map +1 -1
  165. package/dist/lib/predictor.js +46 -7
  166. package/dist/lib/predictor.js.map +1 -1
  167. package/dist/lib/replay-buffer.d.ts +93 -0
  168. package/dist/lib/replay-buffer.d.ts.map +1 -0
  169. package/dist/lib/replay-buffer.js +302 -0
  170. package/dist/lib/replay-buffer.js.map +1 -0
  171. package/dist/lib/sentinel-rl.d.ts +97 -0
  172. package/dist/lib/sentinel-rl.d.ts.map +1 -0
  173. package/dist/lib/sentinel-rl.js +430 -0
  174. package/dist/lib/sentinel-rl.js.map +1 -0
  175. package/dist/lib/session-lock.d.ts +61 -0
  176. package/dist/lib/session-lock.d.ts.map +1 -0
  177. package/dist/lib/session-lock.js +438 -0
  178. package/dist/lib/session-lock.js.map +1 -0
  179. package/dist/lib/setup/agent-generator.d.ts +18 -0
  180. package/dist/lib/setup/agent-generator.d.ts.map +1 -0
  181. package/dist/lib/setup/agent-generator.js +114 -0
  182. package/dist/lib/setup/agent-generator.js.map +1 -0
  183. package/dist/lib/setup/context-analyzer.d.ts +16 -0
  184. package/dist/lib/setup/context-analyzer.d.ts.map +1 -0
  185. package/dist/lib/setup/context-analyzer.js +112 -0
  186. package/dist/lib/setup/context-analyzer.js.map +1 -0
  187. package/dist/lib/setup/doc-auditor.d.ts +54 -0
  188. package/dist/lib/setup/doc-auditor.d.ts.map +1 -0
  189. package/dist/lib/setup/doc-auditor.js +629 -0
  190. package/dist/lib/setup/doc-auditor.js.map +1 -0
  191. package/dist/lib/setup/domain-generator.d.ts +7 -0
  192. package/dist/lib/setup/domain-generator.d.ts.map +1 -0
  193. package/dist/lib/setup/domain-generator.js +58 -0
  194. package/dist/lib/setup/domain-generator.js.map +1 -0
  195. package/dist/lib/setup/smart-eval-generator.d.ts +38 -0
  196. package/dist/lib/setup/smart-eval-generator.d.ts.map +1 -0
  197. package/dist/lib/setup/smart-eval-generator.js +378 -0
  198. package/dist/lib/setup/smart-eval-generator.js.map +1 -0
  199. package/dist/lib/setup/smart-recommender.d.ts +63 -0
  200. package/dist/lib/setup/smart-recommender.d.ts.map +1 -0
  201. package/dist/lib/setup/smart-recommender.js +329 -0
  202. package/dist/lib/setup/smart-recommender.js.map +1 -0
  203. package/dist/lib/setup/spec-generator.d.ts +63 -0
  204. package/dist/lib/setup/spec-generator.d.ts.map +1 -0
  205. package/dist/lib/setup/spec-generator.js +310 -0
  206. package/dist/lib/setup/spec-generator.js.map +1 -0
  207. package/dist/lib/setup/violation-agent-generator.d.ts +32 -0
  208. package/dist/lib/setup/violation-agent-generator.d.ts.map +1 -0
  209. package/dist/lib/setup/violation-agent-generator.js +255 -0
  210. package/dist/lib/setup/violation-agent-generator.js.map +1 -0
  211. package/dist/lib/stratus-client.d.ts +1 -0
  212. package/dist/lib/stratus-client.d.ts.map +1 -1
  213. package/dist/lib/stratus-client.js +24 -2
  214. package/dist/lib/stratus-client.js.map +1 -1
  215. package/dist/lib/telemetry-agent-v2.d.ts +128 -0
  216. package/dist/lib/telemetry-agent-v2.d.ts.map +1 -0
  217. package/dist/lib/telemetry-agent-v2.js +1042 -0
  218. package/dist/lib/telemetry-agent-v2.js.map +1 -0
  219. package/dist/lib/telemetry-agent.d.ts.map +1 -1
  220. package/dist/lib/telemetry-agent.js +27 -6
  221. package/dist/lib/telemetry-agent.js.map +1 -1
  222. package/dist/lib/telemetry-digest.d.ts.map +1 -1
  223. package/dist/lib/telemetry-digest.js +27 -5
  224. package/dist/lib/telemetry-digest.js.map +1 -1
  225. package/dist/lib/telemetry.d.ts.map +1 -1
  226. package/dist/lib/telemetry.js +29 -4
  227. package/dist/lib/telemetry.js.map +1 -1
  228. package/dist/lib/text-preprocessing.d.ts +83 -0
  229. package/dist/lib/text-preprocessing.d.ts.map +1 -0
  230. package/dist/lib/text-preprocessing.js +261 -0
  231. package/dist/lib/text-preprocessing.js.map +1 -0
  232. package/dist/lib/training-buffer.d.ts +86 -0
  233. package/dist/lib/training-buffer.d.ts.map +1 -0
  234. package/dist/lib/training-buffer.js +139 -0
  235. package/dist/lib/training-buffer.js.map +1 -0
  236. package/dist/lib/tuple-miner.d.ts +30 -0
  237. package/dist/lib/tuple-miner.d.ts.map +1 -0
  238. package/dist/lib/tuple-miner.js +427 -0
  239. package/dist/lib/tuple-miner.js.map +1 -0
  240. package/dist/lib/vm-backend.d.ts +72 -0
  241. package/dist/lib/vm-backend.d.ts.map +1 -0
  242. package/dist/lib/vm-backend.js +175 -0
  243. package/dist/lib/vm-backend.js.map +1 -0
  244. package/dist/lib/workspace/backend.d.ts +53 -0
  245. package/dist/lib/workspace/backend.d.ts.map +1 -0
  246. package/dist/lib/workspace/backend.js +37 -0
  247. package/dist/lib/workspace/backend.js.map +1 -0
  248. package/dist/lib/workspace/cmux-adapter.d.ts +46 -0
  249. package/dist/lib/workspace/cmux-adapter.d.ts.map +1 -0
  250. package/dist/lib/workspace/cmux-adapter.js +261 -0
  251. package/dist/lib/workspace/cmux-adapter.js.map +1 -0
  252. package/dist/lib/workspace/data-pipeline.d.ts +35 -0
  253. package/dist/lib/workspace/data-pipeline.d.ts.map +1 -0
  254. package/dist/lib/workspace/data-pipeline.js +463 -0
  255. package/dist/lib/workspace/data-pipeline.js.map +1 -0
  256. package/dist/lib/workspace/engine.d.ts +64 -0
  257. package/dist/lib/workspace/engine.d.ts.map +1 -0
  258. package/dist/lib/workspace/engine.js +397 -0
  259. package/dist/lib/workspace/engine.js.map +1 -0
  260. package/dist/lib/workspace/notifications.d.ts +14 -0
  261. package/dist/lib/workspace/notifications.d.ts.map +1 -0
  262. package/dist/lib/workspace/notifications.js +41 -0
  263. package/dist/lib/workspace/notifications.js.map +1 -0
  264. package/dist/lib/workspace/surface-registry.d.ts +49 -0
  265. package/dist/lib/workspace/surface-registry.d.ts.map +1 -0
  266. package/dist/lib/workspace/surface-registry.js +217 -0
  267. package/dist/lib/workspace/surface-registry.js.map +1 -0
  268. package/dist/lib/workspace/surface-type.d.ts +153 -0
  269. package/dist/lib/workspace/surface-type.d.ts.map +1 -0
  270. package/dist/lib/workspace/surface-type.js +9 -0
  271. package/dist/lib/workspace/surface-type.js.map +1 -0
  272. package/dist/lib/workspace/surfaces/agent-overview.d.ts +16 -0
  273. package/dist/lib/workspace/surfaces/agent-overview.d.ts.map +1 -0
  274. package/dist/lib/workspace/surfaces/agent-overview.js +116 -0
  275. package/dist/lib/workspace/surfaces/agent-overview.js.map +1 -0
  276. package/dist/lib/workspace/surfaces/agent.d.ts +16 -0
  277. package/dist/lib/workspace/surfaces/agent.d.ts.map +1 -0
  278. package/dist/lib/workspace/surfaces/agent.js +112 -0
  279. package/dist/lib/workspace/surfaces/agent.js.map +1 -0
  280. package/dist/lib/workspace/surfaces/claude.d.ts +15 -0
  281. package/dist/lib/workspace/surfaces/claude.d.ts.map +1 -0
  282. package/dist/lib/workspace/surfaces/claude.js +23 -0
  283. package/dist/lib/workspace/surfaces/claude.js.map +1 -0
  284. package/dist/lib/workspace/surfaces/dashboard.d.ts +21 -0
  285. package/dist/lib/workspace/surfaces/dashboard.d.ts.map +1 -0
  286. package/dist/lib/workspace/surfaces/dashboard.js +32 -0
  287. package/dist/lib/workspace/surfaces/dashboard.js.map +1 -0
  288. package/dist/lib/workspace/surfaces/eval.d.ts +15 -0
  289. package/dist/lib/workspace/surfaces/eval.d.ts.map +1 -0
  290. package/dist/lib/workspace/surfaces/eval.js +42 -0
  291. package/dist/lib/workspace/surfaces/eval.js.map +1 -0
  292. package/dist/lib/workspace/surfaces/event-stream.d.ts +16 -0
  293. package/dist/lib/workspace/surfaces/event-stream.d.ts.map +1 -0
  294. package/dist/lib/workspace/surfaces/event-stream.js +40 -0
  295. package/dist/lib/workspace/surfaces/event-stream.js.map +1 -0
  296. package/dist/lib/workspace/surfaces/flow.d.ts +16 -0
  297. package/dist/lib/workspace/surfaces/flow.d.ts.map +1 -0
  298. package/dist/lib/workspace/surfaces/flow.js +49 -0
  299. package/dist/lib/workspace/surfaces/flow.js.map +1 -0
  300. package/dist/lib/workspace/surfaces/index.d.ts +16 -0
  301. package/dist/lib/workspace/surfaces/index.d.ts.map +1 -0
  302. package/dist/lib/workspace/surfaces/index.js +16 -0
  303. package/dist/lib/workspace/surfaces/index.js.map +1 -0
  304. package/dist/lib/workspace/surfaces/portfolio.d.ts +16 -0
  305. package/dist/lib/workspace/surfaces/portfolio.d.ts.map +1 -0
  306. package/dist/lib/workspace/surfaces/portfolio.js +102 -0
  307. package/dist/lib/workspace/surfaces/portfolio.js.map +1 -0
  308. package/dist/lib/workspace/surfaces/service.d.ts +16 -0
  309. package/dist/lib/workspace/surfaces/service.d.ts.map +1 -0
  310. package/dist/lib/workspace/surfaces/service.js +45 -0
  311. package/dist/lib/workspace/surfaces/service.js.map +1 -0
  312. package/dist/lib/workspace/surfaces/shell.d.ts +15 -0
  313. package/dist/lib/workspace/surfaces/shell.d.ts.map +1 -0
  314. package/dist/lib/workspace/surfaces/shell.js +19 -0
  315. package/dist/lib/workspace/surfaces/shell.js.map +1 -0
  316. package/dist/lib/workspace/surfaces/telemetry.d.ts +16 -0
  317. package/dist/lib/workspace/surfaces/telemetry.d.ts.map +1 -0
  318. package/dist/lib/workspace/surfaces/telemetry.js +48 -0
  319. package/dist/lib/workspace/surfaces/telemetry.js.map +1 -0
  320. package/dist/lib/workspace/surfaces/topology.d.ts +15 -0
  321. package/dist/lib/workspace/surfaces/topology.d.ts.map +1 -0
  322. package/dist/lib/workspace/surfaces/topology.js +19 -0
  323. package/dist/lib/workspace/surfaces/topology.js.map +1 -0
  324. package/dist/lib/workspace/surfaces/training.d.ts +16 -0
  325. package/dist/lib/workspace/surfaces/training.d.ts.map +1 -0
  326. package/dist/lib/workspace/surfaces/training.js +22 -0
  327. package/dist/lib/workspace/surfaces/training.js.map +1 -0
  328. package/dist/lib/workspace/tmux-adapter.d.ts +27 -0
  329. package/dist/lib/workspace/tmux-adapter.d.ts.map +1 -0
  330. package/dist/lib/workspace/tmux-adapter.js +106 -0
  331. package/dist/lib/workspace/tmux-adapter.js.map +1 -0
  332. package/dist/mcp/context-hub-mcp.js +7 -24
  333. package/dist/mcp/context-hub-mcp.js.map +1 -1
  334. package/dist/types/flows.d.ts +2 -0
  335. package/dist/types/flows.d.ts.map +1 -1
  336. package/dist/types/ide.d.ts +49 -0
  337. package/dist/types/ide.d.ts.map +1 -0
  338. package/dist/types/ide.js +5 -0
  339. package/dist/types/ide.js.map +1 -0
  340. package/dist/types/platform-digest.d.ts +228 -0
  341. package/dist/types/platform-digest.d.ts.map +1 -0
  342. package/dist/types/platform-digest.js +5 -0
  343. package/dist/types/platform-digest.js.map +1 -0
  344. package/dist/types/telemetry-digest.d.ts +2 -0
  345. package/dist/types/telemetry-digest.d.ts.map +1 -1
  346. package/dist/utils/ensure-project.d.ts +1 -0
  347. package/dist/utils/ensure-project.d.ts.map +1 -1
  348. package/dist/utils/ensure-project.js +19 -7
  349. package/dist/utils/ensure-project.js.map +1 -1
  350. package/dist/utils/jfl-config.d.ts +1 -0
  351. package/dist/utils/jfl-config.d.ts.map +1 -1
  352. package/dist/utils/jfl-config.js +19 -1
  353. package/dist/utils/jfl-config.js.map +1 -1
  354. package/dist/utils/jfl-paths.d.ts +5 -0
  355. package/dist/utils/jfl-paths.d.ts.map +1 -1
  356. package/dist/utils/jfl-paths.js +25 -3
  357. package/dist/utils/jfl-paths.js.map +1 -1
  358. package/package.json +3 -2
  359. package/packages/pi/AGENTS.md +112 -0
  360. package/packages/pi/extensions/agent-grid.ts +191 -0
  361. package/packages/pi/extensions/agent-names.ts +178 -0
  362. package/packages/pi/extensions/autoresearch.ts +427 -0
  363. package/packages/pi/extensions/bookmarks.ts +85 -0
  364. package/packages/pi/extensions/context.ts +184 -0
  365. package/packages/pi/extensions/crm-tool.ts +61 -0
  366. package/packages/pi/extensions/eval-tool.ts +224 -0
  367. package/packages/pi/extensions/eval.ts +60 -0
  368. package/packages/pi/extensions/footer.ts +239 -0
  369. package/packages/pi/extensions/hub-resolver.ts +63 -0
  370. package/packages/pi/extensions/hud-tool.ts +145 -0
  371. package/packages/pi/extensions/index.ts +405 -0
  372. package/packages/pi/extensions/journal.ts +224 -0
  373. package/packages/pi/extensions/map-bridge.ts +178 -0
  374. package/packages/pi/extensions/memory-tool.ts +73 -0
  375. package/packages/pi/extensions/notifications.ts +73 -0
  376. package/packages/pi/extensions/peter-parker.ts +202 -0
  377. package/packages/pi/extensions/policy-head-tool.ts +276 -0
  378. package/packages/pi/extensions/portfolio-bridge.ts +90 -0
  379. package/packages/pi/extensions/session.ts +142 -0
  380. package/packages/pi/extensions/shortcuts.ts +259 -0
  381. package/packages/pi/extensions/stratus-bridge.ts +115 -0
  382. package/packages/pi/extensions/synopsis-tool.ts +83 -0
  383. package/packages/pi/extensions/tool-renderers.ts +353 -0
  384. package/packages/pi/extensions/training-buffer-tool.ts +368 -0
  385. package/packages/pi/extensions/types.ts +163 -0
  386. package/packages/pi/package-lock.json +346 -0
  387. package/packages/pi/package.json +44 -0
  388. package/packages/pi/skills/agent-browser/SKILL.md +116 -0
  389. package/packages/pi/skills/brand-architect/SKILL.md +240 -0
  390. package/packages/pi/skills/brand-architect/config.yaml +137 -0
  391. package/packages/pi/skills/campaign-hud/config.yaml +112 -0
  392. package/packages/pi/skills/content-creator/SKILL.md +294 -0
  393. package/packages/pi/skills/context/SKILL.md +65 -0
  394. package/packages/pi/skills/debug/MULTI_AGENT.md +360 -0
  395. package/packages/pi/skills/debug/SKILL.md +554 -0
  396. package/packages/pi/skills/end/SKILL.md +1782 -0
  397. package/packages/pi/skills/eval/SKILL.md +75 -0
  398. package/packages/pi/skills/fly-deploy/SKILL.md +676 -0
  399. package/packages/pi/skills/founder-video/SKILL.md +467 -0
  400. package/packages/pi/skills/hud/SKILL.md +160 -0
  401. package/packages/pi/skills/orchestrate/SKILL.md +74 -0
  402. package/packages/pi/skills/pi-agents/SKILL.md +78 -0
  403. package/packages/pi/skills/react-best-practices/AGENTS.md +2249 -0
  404. package/packages/pi/skills/react-best-practices/README.md +123 -0
  405. package/packages/pi/skills/react-best-practices/SKILL.md +125 -0
  406. package/packages/pi/skills/react-best-practices/metadata.json +15 -0
  407. package/packages/pi/skills/react-best-practices/rules/_sections.md +46 -0
  408. package/packages/pi/skills/react-best-practices/rules/_template.md +28 -0
  409. package/packages/pi/skills/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  410. package/packages/pi/skills/react-best-practices/rules/advanced-use-latest.md +49 -0
  411. package/packages/pi/skills/react-best-practices/rules/async-api-routes.md +38 -0
  412. package/packages/pi/skills/react-best-practices/rules/async-defer-await.md +80 -0
  413. package/packages/pi/skills/react-best-practices/rules/async-dependencies.md +36 -0
  414. package/packages/pi/skills/react-best-practices/rules/async-parallel.md +28 -0
  415. package/packages/pi/skills/react-best-practices/rules/async-suspense-boundaries.md +99 -0
  416. package/packages/pi/skills/react-best-practices/rules/bundle-barrel-imports.md +59 -0
  417. package/packages/pi/skills/react-best-practices/rules/bundle-conditional.md +31 -0
  418. package/packages/pi/skills/react-best-practices/rules/bundle-defer-third-party.md +49 -0
  419. package/packages/pi/skills/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
  420. package/packages/pi/skills/react-best-practices/rules/bundle-preload.md +50 -0
  421. package/packages/pi/skills/react-best-practices/rules/client-event-listeners.md +74 -0
  422. package/packages/pi/skills/react-best-practices/rules/client-swr-dedup.md +56 -0
  423. package/packages/pi/skills/react-best-practices/rules/js-batch-dom-css.md +82 -0
  424. package/packages/pi/skills/react-best-practices/rules/js-cache-function-results.md +80 -0
  425. package/packages/pi/skills/react-best-practices/rules/js-cache-property-access.md +28 -0
  426. package/packages/pi/skills/react-best-practices/rules/js-cache-storage.md +70 -0
  427. package/packages/pi/skills/react-best-practices/rules/js-combine-iterations.md +32 -0
  428. package/packages/pi/skills/react-best-practices/rules/js-early-exit.md +50 -0
  429. package/packages/pi/skills/react-best-practices/rules/js-hoist-regexp.md +45 -0
  430. package/packages/pi/skills/react-best-practices/rules/js-index-maps.md +37 -0
  431. package/packages/pi/skills/react-best-practices/rules/js-length-check-first.md +49 -0
  432. package/packages/pi/skills/react-best-practices/rules/js-min-max-loop.md +82 -0
  433. package/packages/pi/skills/react-best-practices/rules/js-set-map-lookups.md +24 -0
  434. package/packages/pi/skills/react-best-practices/rules/js-tosorted-immutable.md +57 -0
  435. package/packages/pi/skills/react-best-practices/rules/rendering-activity.md +26 -0
  436. package/packages/pi/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
  437. package/packages/pi/skills/react-best-practices/rules/rendering-conditional-render.md +40 -0
  438. package/packages/pi/skills/react-best-practices/rules/rendering-content-visibility.md +38 -0
  439. package/packages/pi/skills/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
  440. package/packages/pi/skills/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
  441. package/packages/pi/skills/react-best-practices/rules/rendering-svg-precision.md +28 -0
  442. package/packages/pi/skills/react-best-practices/rules/rerender-defer-reads.md +39 -0
  443. package/packages/pi/skills/react-best-practices/rules/rerender-dependencies.md +45 -0
  444. package/packages/pi/skills/react-best-practices/rules/rerender-derived-state.md +29 -0
  445. package/packages/pi/skills/react-best-practices/rules/rerender-functional-setstate.md +74 -0
  446. package/packages/pi/skills/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
  447. package/packages/pi/skills/react-best-practices/rules/rerender-memo.md +44 -0
  448. package/packages/pi/skills/react-best-practices/rules/rerender-transitions.md +40 -0
  449. package/packages/pi/skills/react-best-practices/rules/server-after-nonblocking.md +73 -0
  450. package/packages/pi/skills/react-best-practices/rules/server-cache-lru.md +41 -0
  451. package/packages/pi/skills/react-best-practices/rules/server-cache-react.md +26 -0
  452. package/packages/pi/skills/react-best-practices/rules/server-parallel-fetching.md +79 -0
  453. package/packages/pi/skills/react-best-practices/rules/server-serialization.md +38 -0
  454. package/packages/pi/skills/remotion-best-practices/SKILL.md +43 -0
  455. package/packages/pi/skills/remotion-best-practices/rules/3d.md +86 -0
  456. package/packages/pi/skills/remotion-best-practices/rules/animations.md +29 -0
  457. package/packages/pi/skills/remotion-best-practices/rules/assets/charts-bar-chart.tsx +173 -0
  458. package/packages/pi/skills/remotion-best-practices/rules/assets/text-animations-typewriter.tsx +100 -0
  459. package/packages/pi/skills/remotion-best-practices/rules/assets/text-animations-word-highlight.tsx +108 -0
  460. package/packages/pi/skills/remotion-best-practices/rules/assets.md +78 -0
  461. package/packages/pi/skills/remotion-best-practices/rules/audio.md +172 -0
  462. package/packages/pi/skills/remotion-best-practices/rules/calculate-metadata.md +104 -0
  463. package/packages/pi/skills/remotion-best-practices/rules/can-decode.md +75 -0
  464. package/packages/pi/skills/remotion-best-practices/rules/charts.md +58 -0
  465. package/packages/pi/skills/remotion-best-practices/rules/compositions.md +146 -0
  466. package/packages/pi/skills/remotion-best-practices/rules/display-captions.md +126 -0
  467. package/packages/pi/skills/remotion-best-practices/rules/extract-frames.md +229 -0
  468. package/packages/pi/skills/remotion-best-practices/rules/fonts.md +152 -0
  469. package/packages/pi/skills/remotion-best-practices/rules/get-audio-duration.md +58 -0
  470. package/packages/pi/skills/remotion-best-practices/rules/get-video-dimensions.md +68 -0
  471. package/packages/pi/skills/remotion-best-practices/rules/get-video-duration.md +58 -0
  472. package/packages/pi/skills/remotion-best-practices/rules/gifs.md +138 -0
  473. package/packages/pi/skills/remotion-best-practices/rules/images.md +130 -0
  474. package/packages/pi/skills/remotion-best-practices/rules/import-srt-captions.md +67 -0
  475. package/packages/pi/skills/remotion-best-practices/rules/lottie.md +68 -0
  476. package/packages/pi/skills/remotion-best-practices/rules/measuring-dom-nodes.md +35 -0
  477. package/packages/pi/skills/remotion-best-practices/rules/measuring-text.md +143 -0
  478. package/packages/pi/skills/remotion-best-practices/rules/sequencing.md +106 -0
  479. package/packages/pi/skills/remotion-best-practices/rules/tailwind.md +11 -0
  480. package/packages/pi/skills/remotion-best-practices/rules/text-animations.md +20 -0
  481. package/packages/pi/skills/remotion-best-practices/rules/timing.md +179 -0
  482. package/packages/pi/skills/remotion-best-practices/rules/transcribe-captions.md +19 -0
  483. package/packages/pi/skills/remotion-best-practices/rules/transitions.md +122 -0
  484. package/packages/pi/skills/remotion-best-practices/rules/trimming.md +53 -0
  485. package/packages/pi/skills/remotion-best-practices/rules/videos.md +171 -0
  486. package/packages/pi/skills/search/SKILL.md +220 -0
  487. package/packages/pi/skills/spec/SKILL.md +377 -0
  488. package/packages/pi/skills/startup/SKILL.md +315 -0
  489. package/packages/pi/skills/web-architect/SKILL.md +309 -0
  490. package/packages/pi/skills/x-algorithm/SKILL.md +305 -0
  491. package/packages/pi/teams/dev-team.yaml +63 -0
  492. package/packages/pi/teams/gtm-team.yaml +79 -0
  493. package/packages/pi/themes/jfl.theme.json +76 -0
  494. package/packages/pi/tsconfig.json +21 -0
  495. package/scripts/collect-tuples.sh +124 -0
  496. package/scripts/destroy-fleet.sh +37 -0
  497. package/scripts/jfl-ide.sh +48 -0
  498. package/scripts/session/session-cleanup.sh +4 -11
  499. package/scripts/session/session-init.sh +6 -0
  500. package/scripts/session/session-sync.sh +25 -0
  501. package/scripts/setup-branch-protection.sh +106 -0
  502. package/scripts/spawn-fleet.sh +144 -0
  503. package/scripts/train/requirements.txt +5 -0
  504. package/scripts/train/train-policy-head.py +477 -0
  505. package/scripts/train/v2/dataset.py +81 -0
  506. package/scripts/train/v2/domain.json +18 -0
  507. package/scripts/train/v2/eval.py +196 -0
  508. package/scripts/train/v2/generate_data.py +219 -0
  509. package/scripts/train/v2/infer.py +188 -0
  510. package/scripts/train/v2/model.py +112 -0
  511. package/scripts/train/v2/precompute.py +132 -0
  512. package/scripts/train/v2/train.py +302 -0
  513. package/scripts/train/v2/transform_buffer.py +227 -0
  514. package/scripts/train/v2/validate_data.py +115 -0
  515. package/scripts/train-policy-head.py +434 -0
  516. package/scripts/vm-swarm/README.md +301 -0
  517. package/scripts/vm-swarm/collect-tuples.sh +331 -0
  518. package/scripts/vm-swarm/create-base-template.sh +339 -0
  519. package/scripts/vm-swarm/kill-fleet.sh +204 -0
  520. package/scripts/vm-swarm/monitor-fleet.sh +346 -0
  521. package/scripts/vm-swarm/spawn-fleet.sh +304 -0
  522. package/template/.claude/settings.json +2 -15
  523. package/template/.github/workflows/jfl-eval.yml +6 -1
  524. package/template/.github/workflows/jfl-review.yml +4 -0
  525. package/template/scripts/session/session-cleanup.sh +2 -11
  526. package/template/scripts/session/session-end-hub.sh +72 -0
  527. package/template/scripts/session/session-end.sh +69 -6
  528. package/template/scripts/session/session-init.sh +55 -30
  529. package/template/scripts/session/session-lock.sh +464 -0
  530. package/template/scripts/session/session-start-hub.sh +105 -0
  531. package/template/templates/service-agent/workflows/jfl-eval.yml +19 -0
  532. package/dist/dashboard-static/assets/index-B6kRK9Rq.js +0 -116
  533. package/dist/dashboard-static/assets/index-BpdKJPLu.css +0 -1
@@ -0,0 +1,368 @@
1
+ /**
2
+ * Training Buffer Tool
3
+ *
4
+ * Wraps the RL training buffer for the Pi agent. Two modes:
5
+ * 1. Automatic: captures (state, action, reward) tuples on agent_end events
6
+ * 2. Manual: jfl_training_buffer tool lets the agent record tuples explicitly
7
+ *
8
+ * Also provides /tuples command for inspecting the buffer and /mine command
9
+ * for extracting tuples from project history.
10
+ *
11
+ * @purpose RL training buffer — automatic + manual tuple capture, mining from history
12
+ */
13
+
14
+ import { existsSync, readFileSync } from "fs"
15
+ import { join } from "path"
16
+ import type { PiContext, JflConfig, AgentEndEvent } from "./types.js"
17
+ import { emitCustomEvent } from "./map-bridge.js"
18
+
19
+ let projectRoot = ""
20
+
21
+ async function getTrainingBuffer(): Promise<any> {
22
+ try {
23
+ // @ts-ignore — resolved from jfl package at runtime
24
+ const { TrainingBuffer } = await import("../../src/lib/training-buffer.js")
25
+ return new TrainingBuffer(projectRoot)
26
+ } catch {
27
+ return null
28
+ }
29
+ }
30
+
31
+ async function getTupleMiner(): Promise<any> {
32
+ try {
33
+ // @ts-ignore — resolved from jfl package at runtime
34
+ return await import("../../src/lib/tuple-miner.js")
35
+ } catch {
36
+ return null
37
+ }
38
+ }
39
+
40
+ export async function setupTrainingBufferTool(ctx: PiContext, _config: JflConfig): Promise<void> {
41
+ projectRoot = ctx.session.projectRoot
42
+
43
+ ctx.registerTool({
44
+ name: "jfl_training_buffer",
45
+ description: "Record a training tuple (state, action, reward) in the RL training buffer. Use after completing a task to capture the outcome for policy head training.",
46
+ inputSchema: {
47
+ type: "object",
48
+ properties: {
49
+ action_type: {
50
+ type: "string",
51
+ description: "Type of action taken",
52
+ enum: ["fix", "refactor", "feature", "test", "config", "experiment"],
53
+ },
54
+ description: {
55
+ type: "string",
56
+ description: "What was done (1-2 sentences)",
57
+ },
58
+ files: {
59
+ type: "string",
60
+ description: "Comma-separated list of files changed",
61
+ },
62
+ scope: {
63
+ type: "string",
64
+ description: "Scope of change",
65
+ enum: ["small", "medium", "large"],
66
+ },
67
+ outcome: {
68
+ type: "string",
69
+ description: "Did it improve things?",
70
+ enum: ["improved", "neutral", "regressed"],
71
+ },
72
+ delta: {
73
+ type: "string",
74
+ description: "Numeric score delta if known (e.g. 0.02 or -0.01)",
75
+ },
76
+ },
77
+ required: ["action_type", "description", "outcome"],
78
+ },
79
+ async handler(input) {
80
+ const {
81
+ action_type,
82
+ description,
83
+ files,
84
+ scope,
85
+ outcome,
86
+ delta: deltaStr,
87
+ } = input as {
88
+ action_type: string
89
+ description: string
90
+ files?: string
91
+ scope?: string
92
+ outcome: string
93
+ delta?: string
94
+ }
95
+
96
+ const tb = await getTrainingBuffer()
97
+ if (!tb) {
98
+ return "Training buffer unavailable. Ensure jfl-cli is built (npm run build)."
99
+ }
100
+
101
+ const delta = deltaStr ? parseFloat(deltaStr) : (
102
+ outcome === "improved" ? 0.02 :
103
+ outcome === "regressed" ? -0.01 :
104
+ 0.0
105
+ )
106
+
107
+ const existing: any[] = tb.read()
108
+ const recentDeltas = existing.slice(-10).map((e: any) => e.reward.composite_delta)
109
+ const currentScore = existing.length > 0
110
+ ? existing[existing.length - 1].state.composite_score + existing[existing.length - 1].reward.composite_delta
111
+ : 0
112
+
113
+ const entry = tb.append({
114
+ agent: "pi-agent",
115
+ state: {
116
+ composite_score: currentScore,
117
+ dimension_scores: {},
118
+ tests_passing: 0,
119
+ tests_total: 0,
120
+ trajectory_length: existing.length,
121
+ recent_deltas: recentDeltas,
122
+ agent: "pi-agent",
123
+ },
124
+ action: {
125
+ type: action_type as "fix" | "refactor" | "feature" | "test" | "config" | "experiment",
126
+ description,
127
+ files_affected: files ? files.split(",").map(f => f.trim()) : [],
128
+ scope: (scope || "medium") as "small" | "medium" | "large",
129
+ branch: ctx.session.branch,
130
+ },
131
+ reward: {
132
+ composite_delta: delta,
133
+ dimension_deltas: {},
134
+ tests_added: 0,
135
+ quality_score: outcome === "improved" ? 1.0 : outcome === "regressed" ? 0.0 : 0.5,
136
+ improved: outcome === "improved",
137
+ },
138
+ metadata: {
139
+ branch: ctx.session.branch,
140
+ source: "manual",
141
+ },
142
+ })
143
+
144
+ await emitCustomEvent(ctx, "training:tuple:added", { id: entry.id, delta })
145
+
146
+ return [
147
+ `Training tuple recorded: ${entry.id}`,
148
+ ` Action: ${action_type} — ${description.slice(0, 60)}`,
149
+ ` Delta: ${delta >= 0 ? "+" : ""}${delta.toFixed(4)}`,
150
+ ` Buffer now has ${existing.length + 1} tuples`,
151
+ ].join("\n")
152
+ },
153
+ })
154
+
155
+ ctx.registerTool({
156
+ name: "jfl_mine_tuples",
157
+ description: "Mine training tuples from project history (journals, MAP events, eval results, telemetry). Extracts (state, action, reward) data that can train the policy head.",
158
+ inputSchema: {
159
+ type: "object",
160
+ properties: {
161
+ source: {
162
+ type: "string",
163
+ description: "What to mine from",
164
+ enum: ["journals", "flows", "sessions", "evals", "all"],
165
+ },
166
+ write: {
167
+ type: "string",
168
+ description: "Write mined tuples to training buffer? (yes/no, default: no)",
169
+ enum: ["yes", "no"],
170
+ },
171
+ },
172
+ required: ["source"],
173
+ },
174
+ async handler(input) {
175
+ const { source, write: writeFlag } = input as { source: string; write?: string }
176
+
177
+ const miner = await getTupleMiner()
178
+ if (!miner) {
179
+ return "Tuple miner unavailable. Ensure jfl-cli is built."
180
+ }
181
+
182
+ const tb = await getTrainingBuffer()
183
+ let tuples: any[] = []
184
+
185
+ switch (source) {
186
+ case "journals":
187
+ tuples = miner.mineJournalTuples(projectRoot)
188
+ break
189
+ case "flows":
190
+ tuples = miner.mineFlowTuples(projectRoot)
191
+ break
192
+ case "sessions":
193
+ tuples = miner.mineSessionTuples(projectRoot)
194
+ break
195
+ case "evals":
196
+ tuples = miner.mineEvalTuples(projectRoot)
197
+ break
198
+ case "all": {
199
+ const result = miner.mineAll({ dirs: [projectRoot], telemetry: true })
200
+ tuples = result.tuples
201
+ break
202
+ }
203
+ }
204
+
205
+ if (writeFlag === "yes" && tb && tuples.length > 0) {
206
+ for (const t of tuples) {
207
+ tb.append(t)
208
+ }
209
+ await emitCustomEvent(ctx, "training:mined", { count: tuples.length, source })
210
+ }
211
+
212
+ const improved = tuples.filter((t: any) => t.reward.improved).length
213
+ const avgDelta = tuples.length > 0
214
+ ? tuples.reduce((sum: number, t: any) => sum + t.reward.composite_delta, 0) / tuples.length
215
+ : 0
216
+
217
+ const lines = [
218
+ `Mined ${tuples.length} tuples from ${source}`,
219
+ ` Improved: ${improved}/${tuples.length} (${tuples.length > 0 ? ((improved / tuples.length) * 100).toFixed(0) : 0}%)`,
220
+ ` Avg delta: ${avgDelta >= 0 ? "+" : ""}${avgDelta.toFixed(4)}`,
221
+ ` Agents: ${[...new Set(tuples.map((t: any) => t.agent))].join(", ") || "none"}`,
222
+ ]
223
+
224
+ if (writeFlag === "yes") {
225
+ lines.push(` Written to training buffer ✓`)
226
+ } else {
227
+ lines.push(` Dry run — pass write="yes" to persist`)
228
+ }
229
+
230
+ return lines.join("\n")
231
+ },
232
+ })
233
+
234
+ ctx.registerCommand({
235
+ name: "tuples",
236
+ description: "Show training buffer stats and recent tuples",
237
+ async handler(_args, ctx) {
238
+ const tb = await getTrainingBuffer()
239
+ if (!tb) {
240
+ ctx.ui.notify("Training buffer unavailable.", { level: "warn" })
241
+ return
242
+ }
243
+
244
+ const stats = tb.stats()
245
+ const entries: any[] = tb.read()
246
+ const recent = entries.slice(-5)
247
+
248
+ const lines = [
249
+ `Training Buffer: ${stats.total} tuples`,
250
+ ` Avg reward: ${stats.avgReward >= 0 ? "+" : ""}${stats.avgReward.toFixed(4)}`,
251
+ ` Improvement rate: ${(stats.improvedRate * 100).toFixed(1)}%`,
252
+ ` By agent: ${Object.entries(stats.byAgent).map(([k, v]) => `${k}=${v}`).join(", ") || "none"}`,
253
+ ` By source: ${Object.entries(stats.bySource).map(([k, v]) => `${k}=${v}`).join(", ") || "none"}`,
254
+ "",
255
+ "Recent tuples:",
256
+ ]
257
+
258
+ for (const e of recent as any[]) {
259
+ const sign = e.reward.composite_delta >= 0 ? "+" : ""
260
+ lines.push(` [${sign}${e.reward.composite_delta.toFixed(4)}] ${e.action.type}: ${e.action.description.slice(0, 60)}`)
261
+ }
262
+
263
+ ctx.ui.notify(lines.join("\n"), { level: "info" })
264
+ },
265
+ })
266
+
267
+ ctx.registerCommand({
268
+ name: "mine",
269
+ description: "Mine training tuples from project history and write to buffer",
270
+ async handler(args, ctx) {
271
+ const source = args.trim() || "all"
272
+ const miner = await getTupleMiner()
273
+ if (!miner) {
274
+ ctx.ui.notify("Tuple miner unavailable.", { level: "warn" })
275
+ return
276
+ }
277
+
278
+ const tb = await getTrainingBuffer()
279
+ if (!tb) {
280
+ ctx.ui.notify("Training buffer unavailable.", { level: "warn" })
281
+ return
282
+ }
283
+
284
+ const result = miner.mineAll({
285
+ dirs: [projectRoot],
286
+ telemetry: source === "all",
287
+ })
288
+
289
+ for (const t of result.tuples) {
290
+ tb.append(t)
291
+ }
292
+
293
+ await emitCustomEvent(ctx, "training:mined", {
294
+ count: result.tuples.length,
295
+ stats: result.stats,
296
+ })
297
+
298
+ ctx.ui.notify(
299
+ [
300
+ `Mined ${result.stats.totalMined} tuples:`,
301
+ ` Journals: ${result.stats.journalTuples}`,
302
+ ` Sessions: ${result.stats.sessionTuples}`,
303
+ ` Flows: ${result.stats.flowTuples}`,
304
+ ` Evals: ${result.stats.evalTuples}`,
305
+ ` Telemetry: ${result.stats.telemetryTuples}`,
306
+ `Written to training buffer ✓`,
307
+ ].join("\n"),
308
+ { level: "info" }
309
+ )
310
+ },
311
+ })
312
+ }
313
+
314
+ export async function onTrainingAgentEnd(
315
+ ctx: PiContext,
316
+ event: AgentEndEvent
317
+ ): Promise<void> {
318
+ const turnCount = event.messages?.length ?? event.turnCount ?? 0
319
+ if (turnCount < 2) return
320
+
321
+ const tb = await getTrainingBuffer()
322
+ if (!tb) return
323
+
324
+ const existing: any[] = tb.read()
325
+ const recentDeltas = existing.slice(-10).map((e: any) => e.reward.composite_delta)
326
+ const currentScore = existing.length > 0
327
+ ? existing[existing.length - 1].state.composite_score + existing[existing.length - 1].reward.composite_delta
328
+ : 0
329
+
330
+ const filesChanged = event.filesChanged || []
331
+ const exitReason = event.exitReason as string | undefined
332
+ const isSuccess = exitReason !== "error" && exitReason !== "timeout"
333
+
334
+ const entry = tb.append({
335
+ agent: "pi-agent",
336
+ state: {
337
+ composite_score: currentScore,
338
+ dimension_scores: {},
339
+ tests_passing: 0,
340
+ tests_total: 0,
341
+ trajectory_length: existing.length,
342
+ recent_deltas: recentDeltas,
343
+ agent: "pi-agent",
344
+ },
345
+ action: {
346
+ type: filesChanged.some(f => f.endsWith(".test.ts") || f.endsWith(".test.js")) ? "test"
347
+ : filesChanged.some(f => f.includes("config") || f.includes(".json")) ? "config"
348
+ : "feature",
349
+ description: `Agent turn: ${turnCount} turns, ${filesChanged.length} files changed`,
350
+ files_affected: filesChanged.slice(0, 20),
351
+ scope: filesChanged.length > 10 ? "large" : filesChanged.length > 3 ? "medium" : "small",
352
+ branch: ctx.session.branch,
353
+ },
354
+ reward: {
355
+ composite_delta: isSuccess ? 0.01 : -0.005,
356
+ dimension_deltas: {},
357
+ tests_added: 0,
358
+ quality_score: isSuccess ? 0.7 : 0.3,
359
+ improved: isSuccess,
360
+ },
361
+ metadata: {
362
+ branch: ctx.session.branch,
363
+ source: "ci",
364
+ },
365
+ })
366
+
367
+ await emitCustomEvent(ctx, "training:tuple:auto", { id: entry.id })
368
+ }
@@ -0,0 +1,163 @@
1
+ /**
2
+ * JFL Pi Extension Types
3
+ *
4
+ * Full type definitions for the JFL Pi extension layer.
5
+ * PiContext wraps Pi's real ExtensionAPI and exposes full TUI capabilities
6
+ * to all JFL sub-extensions.
7
+ *
8
+ * @purpose Type definitions for JFL Pi extension — full TUI + lifecycle access
9
+ */
10
+
11
+ // ─── Tool / Command formats for JFL sub-extensions ───────────────────────────
12
+
13
+ export interface JflToolDef {
14
+ name: string
15
+ label?: string
16
+ description: string
17
+ promptSnippet?: string
18
+ promptGuidelines?: string[]
19
+ inputSchema: {
20
+ type: "object"
21
+ properties: Record<string, { type: string; description?: string; enum?: string[] }>
22
+ required?: string[]
23
+ }
24
+ handler(input: Record<string, unknown>): Promise<string>
25
+ renderCall?(args: Record<string, any>, theme: PiTheme): any
26
+ renderResult?(result: any, options: { expanded: boolean; isPartial: boolean }, theme: PiTheme): any
27
+ }
28
+
29
+ export interface JflCommandDef {
30
+ name: string
31
+ description?: string
32
+ handler(args: string, ctx: PiContext): Promise<void> | void
33
+ }
34
+
35
+ // ─── Pi Theme interface (subset we use) ──────────────────────────────────────
36
+
37
+ export interface PiTheme {
38
+ fg(color: string, text: string): string
39
+ bg(color: string, text: string): string
40
+ bold(text: string): string
41
+ }
42
+
43
+ // ─── Widget factory signature ────────────────────────────────────────────────
44
+
45
+ export type WidgetFactory = (tui: any, theme: PiTheme) => {
46
+ render: (width: number) => string[]
47
+ invalidate: () => void
48
+ }
49
+
50
+ // ─── PiContext shim — passed to all JFL sub-extensions ───────────────────────
51
+
52
+ export interface PiContext {
53
+ session: {
54
+ readonly projectRoot: string
55
+ readonly id: string
56
+ readonly branch: string
57
+ }
58
+
59
+ log(msg: string, level?: "debug" | "info" | "warn" | "error"): void
60
+ emit(event: string, data?: unknown): void
61
+ on(event: string, handler: (data: unknown) => void | Promise<void>): void
62
+
63
+ registerTool(tool: JflToolDef): void
64
+ registerCommand(cmd: JflCommandDef): void
65
+ registerShortcut(key: string, opts: { description: string; handler: () => Promise<void> | void }): void
66
+
67
+ ui: {
68
+ notify(msg: string, opts?: { level?: "info" | "warn" | "error" | "success" }): void
69
+ input(title: string, placeholder?: string): Promise<string | undefined>
70
+ confirm(title: string, message: string): Promise<boolean>
71
+ select<T extends string>(title: string, items: Array<{ value: T; label: string; description?: string }>): Promise<T | null>
72
+ editor(title: string, content: string): Promise<string | undefined>
73
+ custom<T>(factory: (tui: any, theme: PiTheme, keybindings: any, done: (result: T) => void) => any, opts?: { overlay?: boolean; overlayOptions?: any; onHandle?: (handle: any) => void }): Promise<T>
74
+ setWidget(id: string, content: string[] | WidgetFactory | undefined, opts?: { placement?: "aboveEditor" | "belowEditor" }): void
75
+ setStatus(key: string, text: string | undefined): void
76
+ setFooter(factory: ((tui: any, theme: PiTheme, footerData: any) => any) | undefined): void
77
+ setEditorText(text: string): void
78
+ theme: PiTheme
79
+ hasUI: boolean
80
+ }
81
+
82
+ pi: {
83
+ setSessionName(name: string): void
84
+ appendEntry(type: string, data?: unknown): void
85
+ setLabel(entryId: string, label: string | undefined): void
86
+ sendMessage(msg: { customType: string; content: string; display?: boolean; details?: any }, opts?: { triggerTurn?: boolean; deliverAs?: "steer" | "followUp" | "nextTurn" }): void
87
+ events: { on(event: string, handler: (data: unknown) => void): void; emit(event: string, data?: unknown): void }
88
+ getActiveTools(): string[]
89
+ getAllTools(): Array<{ name: string; description: string }>
90
+ exec(command: string, args: string[], opts?: { signal?: AbortSignal; timeout?: number }): Promise<{ stdout: string; stderr: string; code: number }>
91
+ sessionManager: any
92
+ model: any
93
+ }
94
+
95
+ cancel(): { cancel: true }
96
+ }
97
+
98
+ // ─── Pi event shapes ──────────────────────────────────────────────────────────
99
+
100
+ export interface AgentStartEvent {
101
+ prompt?: string
102
+ model?: string
103
+ }
104
+
105
+ export interface AgentEndEvent {
106
+ messages?: unknown[]
107
+ turnCount?: number
108
+ model?: string
109
+ duration?: number
110
+ filesChanged?: string[]
111
+ toolsUsed?: string[]
112
+ exitReason?: "success" | "error" | "cancelled" | "max_turns"
113
+ }
114
+
115
+ export interface ToolExecutionEvent {
116
+ toolName?: string
117
+ tool?: string
118
+ result?: unknown
119
+ isError?: boolean
120
+ duration?: number
121
+ }
122
+
123
+ export interface TurnStartEvent {
124
+ turnIndex: number
125
+ timestamp: number
126
+ }
127
+
128
+ export interface TurnEndEvent {
129
+ turnIndex: number
130
+ message?: any
131
+ toolResults?: any[]
132
+ }
133
+
134
+ export interface ModelSelectEvent {
135
+ model: { provider: string; id: string }
136
+ previousModel?: { provider: string; id: string }
137
+ source: "set" | "cycle" | "restore"
138
+ }
139
+
140
+ // ─── JFL config ──────────────────────────────────────────────────────────────
141
+
142
+ export interface JflConfig {
143
+ name?: string
144
+ type?: "gtm" | "service" | "portfolio"
145
+ setup?: "building-product" | "gtm-only" | "contributor"
146
+ working_branch?: string
147
+ portfolio_parent?: string
148
+ gtm_parent?: string
149
+ context_scope?: {
150
+ produces?: string[]
151
+ consumes?: string[]
152
+ denied?: string[]
153
+ }
154
+ pi?: {
155
+ max_peter_iterations?: number
156
+ enable_stratus?: boolean
157
+ enable_portfolio_sync?: boolean
158
+ disable_footer?: boolean
159
+ disable_shortcuts?: boolean
160
+ disable_notifications?: boolean
161
+ auto_start?: boolean
162
+ }
163
+ }