jfl 0.4.3 → 0.5.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 (428) hide show
  1. package/README.md +15 -5
  2. package/dist/commands/context-hub.d.ts.map +1 -1
  3. package/dist/commands/context-hub.js +818 -39
  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 +1218 -2
  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/status.d.ts.map +1 -1
  45. package/dist/commands/status.js +22 -4
  46. package/dist/commands/status.js.map +1 -1
  47. package/dist/commands/viz.d.ts.map +1 -1
  48. package/dist/commands/viz.js +417 -0
  49. package/dist/commands/viz.js.map +1 -1
  50. package/dist/dashboard-static/assets/index-B6b867Pv.js +121 -0
  51. package/dist/dashboard-static/assets/index-Y4BrqxV-.css +1 -0
  52. package/dist/dashboard-static/index.html +2 -2
  53. package/dist/index.js +228 -62
  54. package/dist/index.js.map +1 -1
  55. package/dist/lib/agent-config.d.ts +52 -0
  56. package/dist/lib/agent-config.d.ts.map +1 -0
  57. package/dist/lib/agent-config.js +231 -0
  58. package/dist/lib/agent-config.js.map +1 -0
  59. package/dist/lib/agent-generator.d.ts +10 -0
  60. package/dist/lib/agent-generator.d.ts.map +1 -1
  61. package/dist/lib/agent-generator.js +64 -10
  62. package/dist/lib/agent-generator.js.map +1 -1
  63. package/dist/lib/agent-session.d.ts +104 -0
  64. package/dist/lib/agent-session.d.ts.map +1 -0
  65. package/dist/lib/agent-session.js +627 -0
  66. package/dist/lib/agent-session.js.map +1 -0
  67. package/dist/lib/eval-snapshot.d.ts +47 -0
  68. package/dist/lib/eval-snapshot.d.ts.map +1 -0
  69. package/dist/lib/eval-snapshot.js +315 -0
  70. package/dist/lib/eval-snapshot.js.map +1 -0
  71. package/dist/lib/eval-store.d.ts +5 -0
  72. package/dist/lib/eval-store.d.ts.map +1 -1
  73. package/dist/lib/eval-store.js +33 -3
  74. package/dist/lib/eval-store.js.map +1 -1
  75. package/dist/lib/findings-engine.d.ts +51 -0
  76. package/dist/lib/findings-engine.d.ts.map +1 -0
  77. package/dist/lib/findings-engine.js +338 -0
  78. package/dist/lib/findings-engine.js.map +1 -0
  79. package/dist/lib/flow-engine.d.ts +8 -0
  80. package/dist/lib/flow-engine.d.ts.map +1 -1
  81. package/dist/lib/flow-engine.js +84 -2
  82. package/dist/lib/flow-engine.js.map +1 -1
  83. package/dist/lib/hub-client.d.ts +1 -0
  84. package/dist/lib/hub-client.d.ts.map +1 -1
  85. package/dist/lib/hub-client.js +33 -6
  86. package/dist/lib/hub-client.js.map +1 -1
  87. package/dist/lib/ide-panes.d.ts +58 -0
  88. package/dist/lib/ide-panes.d.ts.map +1 -0
  89. package/dist/lib/ide-panes.js +508 -0
  90. package/dist/lib/ide-panes.js.map +1 -0
  91. package/dist/lib/memory-db.js +4 -4
  92. package/dist/lib/memory-db.js.map +1 -1
  93. package/dist/lib/memory-indexer.d.ts.map +1 -1
  94. package/dist/lib/memory-indexer.js +3 -0
  95. package/dist/lib/memory-indexer.js.map +1 -1
  96. package/dist/lib/memory-search.d.ts +148 -4
  97. package/dist/lib/memory-search.d.ts.map +1 -1
  98. package/dist/lib/memory-search.js +496 -58
  99. package/dist/lib/memory-search.js.map +1 -1
  100. package/dist/lib/meta-orchestrator.d.ts +104 -0
  101. package/dist/lib/meta-orchestrator.d.ts.map +1 -0
  102. package/dist/lib/meta-orchestrator.js +373 -0
  103. package/dist/lib/meta-orchestrator.js.map +1 -0
  104. package/dist/lib/peer-agent-generator.d.ts.map +1 -1
  105. package/dist/lib/peer-agent-generator.js +43 -19
  106. package/dist/lib/peer-agent-generator.js.map +1 -1
  107. package/dist/lib/policy-head.d.ts +25 -0
  108. package/dist/lib/policy-head.d.ts.map +1 -0
  109. package/dist/lib/policy-head.js +136 -0
  110. package/dist/lib/policy-head.js.map +1 -0
  111. package/dist/lib/replay-buffer.d.ts +93 -0
  112. package/dist/lib/replay-buffer.d.ts.map +1 -0
  113. package/dist/lib/replay-buffer.js +302 -0
  114. package/dist/lib/replay-buffer.js.map +1 -0
  115. package/dist/lib/sentinel-rl.d.ts +97 -0
  116. package/dist/lib/sentinel-rl.d.ts.map +1 -0
  117. package/dist/lib/sentinel-rl.js +430 -0
  118. package/dist/lib/sentinel-rl.js.map +1 -0
  119. package/dist/lib/session-lock.d.ts +61 -0
  120. package/dist/lib/session-lock.d.ts.map +1 -0
  121. package/dist/lib/session-lock.js +438 -0
  122. package/dist/lib/session-lock.js.map +1 -0
  123. package/dist/lib/stratus-client.d.ts +1 -0
  124. package/dist/lib/stratus-client.d.ts.map +1 -1
  125. package/dist/lib/stratus-client.js +24 -2
  126. package/dist/lib/stratus-client.js.map +1 -1
  127. package/dist/lib/telemetry-agent-v2.d.ts +128 -0
  128. package/dist/lib/telemetry-agent-v2.d.ts.map +1 -0
  129. package/dist/lib/telemetry-agent-v2.js +1042 -0
  130. package/dist/lib/telemetry-agent-v2.js.map +1 -0
  131. package/dist/lib/telemetry-agent.d.ts.map +1 -1
  132. package/dist/lib/telemetry-agent.js +27 -6
  133. package/dist/lib/telemetry-agent.js.map +1 -1
  134. package/dist/lib/telemetry-digest.d.ts.map +1 -1
  135. package/dist/lib/telemetry-digest.js +27 -5
  136. package/dist/lib/telemetry-digest.js.map +1 -1
  137. package/dist/lib/telemetry.d.ts.map +1 -1
  138. package/dist/lib/telemetry.js +29 -4
  139. package/dist/lib/telemetry.js.map +1 -1
  140. package/dist/lib/text-preprocessing.d.ts +83 -0
  141. package/dist/lib/text-preprocessing.d.ts.map +1 -0
  142. package/dist/lib/text-preprocessing.js +261 -0
  143. package/dist/lib/text-preprocessing.js.map +1 -0
  144. package/dist/lib/training-buffer.d.ts +86 -0
  145. package/dist/lib/training-buffer.d.ts.map +1 -0
  146. package/dist/lib/training-buffer.js +139 -0
  147. package/dist/lib/training-buffer.js.map +1 -0
  148. package/dist/lib/tuple-miner.d.ts +30 -0
  149. package/dist/lib/tuple-miner.d.ts.map +1 -0
  150. package/dist/lib/tuple-miner.js +427 -0
  151. package/dist/lib/tuple-miner.js.map +1 -0
  152. package/dist/lib/vm-backend.d.ts +72 -0
  153. package/dist/lib/vm-backend.d.ts.map +1 -0
  154. package/dist/lib/vm-backend.js +175 -0
  155. package/dist/lib/vm-backend.js.map +1 -0
  156. package/dist/lib/workspace/backend.d.ts +53 -0
  157. package/dist/lib/workspace/backend.d.ts.map +1 -0
  158. package/dist/lib/workspace/backend.js +37 -0
  159. package/dist/lib/workspace/backend.js.map +1 -0
  160. package/dist/lib/workspace/cmux-adapter.d.ts +46 -0
  161. package/dist/lib/workspace/cmux-adapter.d.ts.map +1 -0
  162. package/dist/lib/workspace/cmux-adapter.js +261 -0
  163. package/dist/lib/workspace/cmux-adapter.js.map +1 -0
  164. package/dist/lib/workspace/data-pipeline.d.ts +35 -0
  165. package/dist/lib/workspace/data-pipeline.d.ts.map +1 -0
  166. package/dist/lib/workspace/data-pipeline.js +463 -0
  167. package/dist/lib/workspace/data-pipeline.js.map +1 -0
  168. package/dist/lib/workspace/engine.d.ts +64 -0
  169. package/dist/lib/workspace/engine.d.ts.map +1 -0
  170. package/dist/lib/workspace/engine.js +397 -0
  171. package/dist/lib/workspace/engine.js.map +1 -0
  172. package/dist/lib/workspace/notifications.d.ts +14 -0
  173. package/dist/lib/workspace/notifications.d.ts.map +1 -0
  174. package/dist/lib/workspace/notifications.js +41 -0
  175. package/dist/lib/workspace/notifications.js.map +1 -0
  176. package/dist/lib/workspace/surface-registry.d.ts +49 -0
  177. package/dist/lib/workspace/surface-registry.d.ts.map +1 -0
  178. package/dist/lib/workspace/surface-registry.js +217 -0
  179. package/dist/lib/workspace/surface-registry.js.map +1 -0
  180. package/dist/lib/workspace/surface-type.d.ts +153 -0
  181. package/dist/lib/workspace/surface-type.d.ts.map +1 -0
  182. package/dist/lib/workspace/surface-type.js +9 -0
  183. package/dist/lib/workspace/surface-type.js.map +1 -0
  184. package/dist/lib/workspace/surfaces/agent-overview.d.ts +16 -0
  185. package/dist/lib/workspace/surfaces/agent-overview.d.ts.map +1 -0
  186. package/dist/lib/workspace/surfaces/agent-overview.js +116 -0
  187. package/dist/lib/workspace/surfaces/agent-overview.js.map +1 -0
  188. package/dist/lib/workspace/surfaces/agent.d.ts +16 -0
  189. package/dist/lib/workspace/surfaces/agent.d.ts.map +1 -0
  190. package/dist/lib/workspace/surfaces/agent.js +112 -0
  191. package/dist/lib/workspace/surfaces/agent.js.map +1 -0
  192. package/dist/lib/workspace/surfaces/claude.d.ts +15 -0
  193. package/dist/lib/workspace/surfaces/claude.d.ts.map +1 -0
  194. package/dist/lib/workspace/surfaces/claude.js +23 -0
  195. package/dist/lib/workspace/surfaces/claude.js.map +1 -0
  196. package/dist/lib/workspace/surfaces/dashboard.d.ts +21 -0
  197. package/dist/lib/workspace/surfaces/dashboard.d.ts.map +1 -0
  198. package/dist/lib/workspace/surfaces/dashboard.js +32 -0
  199. package/dist/lib/workspace/surfaces/dashboard.js.map +1 -0
  200. package/dist/lib/workspace/surfaces/eval.d.ts +15 -0
  201. package/dist/lib/workspace/surfaces/eval.d.ts.map +1 -0
  202. package/dist/lib/workspace/surfaces/eval.js +42 -0
  203. package/dist/lib/workspace/surfaces/eval.js.map +1 -0
  204. package/dist/lib/workspace/surfaces/event-stream.d.ts +16 -0
  205. package/dist/lib/workspace/surfaces/event-stream.d.ts.map +1 -0
  206. package/dist/lib/workspace/surfaces/event-stream.js +40 -0
  207. package/dist/lib/workspace/surfaces/event-stream.js.map +1 -0
  208. package/dist/lib/workspace/surfaces/flow.d.ts +16 -0
  209. package/dist/lib/workspace/surfaces/flow.d.ts.map +1 -0
  210. package/dist/lib/workspace/surfaces/flow.js +49 -0
  211. package/dist/lib/workspace/surfaces/flow.js.map +1 -0
  212. package/dist/lib/workspace/surfaces/index.d.ts +16 -0
  213. package/dist/lib/workspace/surfaces/index.d.ts.map +1 -0
  214. package/dist/lib/workspace/surfaces/index.js +16 -0
  215. package/dist/lib/workspace/surfaces/index.js.map +1 -0
  216. package/dist/lib/workspace/surfaces/portfolio.d.ts +16 -0
  217. package/dist/lib/workspace/surfaces/portfolio.d.ts.map +1 -0
  218. package/dist/lib/workspace/surfaces/portfolio.js +102 -0
  219. package/dist/lib/workspace/surfaces/portfolio.js.map +1 -0
  220. package/dist/lib/workspace/surfaces/service.d.ts +16 -0
  221. package/dist/lib/workspace/surfaces/service.d.ts.map +1 -0
  222. package/dist/lib/workspace/surfaces/service.js +45 -0
  223. package/dist/lib/workspace/surfaces/service.js.map +1 -0
  224. package/dist/lib/workspace/surfaces/shell.d.ts +15 -0
  225. package/dist/lib/workspace/surfaces/shell.d.ts.map +1 -0
  226. package/dist/lib/workspace/surfaces/shell.js +19 -0
  227. package/dist/lib/workspace/surfaces/shell.js.map +1 -0
  228. package/dist/lib/workspace/surfaces/telemetry.d.ts +16 -0
  229. package/dist/lib/workspace/surfaces/telemetry.d.ts.map +1 -0
  230. package/dist/lib/workspace/surfaces/telemetry.js +48 -0
  231. package/dist/lib/workspace/surfaces/telemetry.js.map +1 -0
  232. package/dist/lib/workspace/surfaces/topology.d.ts +15 -0
  233. package/dist/lib/workspace/surfaces/topology.d.ts.map +1 -0
  234. package/dist/lib/workspace/surfaces/topology.js +19 -0
  235. package/dist/lib/workspace/surfaces/topology.js.map +1 -0
  236. package/dist/lib/workspace/surfaces/training.d.ts +16 -0
  237. package/dist/lib/workspace/surfaces/training.d.ts.map +1 -0
  238. package/dist/lib/workspace/surfaces/training.js +22 -0
  239. package/dist/lib/workspace/surfaces/training.js.map +1 -0
  240. package/dist/lib/workspace/tmux-adapter.d.ts +27 -0
  241. package/dist/lib/workspace/tmux-adapter.d.ts.map +1 -0
  242. package/dist/lib/workspace/tmux-adapter.js +106 -0
  243. package/dist/lib/workspace/tmux-adapter.js.map +1 -0
  244. package/dist/mcp/context-hub-mcp.js +7 -24
  245. package/dist/mcp/context-hub-mcp.js.map +1 -1
  246. package/dist/types/flows.d.ts +2 -0
  247. package/dist/types/flows.d.ts.map +1 -1
  248. package/dist/types/ide.d.ts +49 -0
  249. package/dist/types/ide.d.ts.map +1 -0
  250. package/dist/types/ide.js +5 -0
  251. package/dist/types/ide.js.map +1 -0
  252. package/dist/types/platform-digest.d.ts +228 -0
  253. package/dist/types/platform-digest.d.ts.map +1 -0
  254. package/dist/types/platform-digest.js +5 -0
  255. package/dist/types/platform-digest.js.map +1 -0
  256. package/dist/types/telemetry-digest.d.ts +2 -0
  257. package/dist/types/telemetry-digest.d.ts.map +1 -1
  258. package/dist/utils/ensure-project.d.ts +1 -0
  259. package/dist/utils/ensure-project.d.ts.map +1 -1
  260. package/dist/utils/ensure-project.js +19 -7
  261. package/dist/utils/ensure-project.js.map +1 -1
  262. package/dist/utils/jfl-config.d.ts +1 -0
  263. package/dist/utils/jfl-config.d.ts.map +1 -1
  264. package/dist/utils/jfl-config.js +19 -1
  265. package/dist/utils/jfl-config.js.map +1 -1
  266. package/dist/utils/jfl-paths.d.ts +5 -0
  267. package/dist/utils/jfl-paths.d.ts.map +1 -1
  268. package/dist/utils/jfl-paths.js +25 -3
  269. package/dist/utils/jfl-paths.js.map +1 -1
  270. package/package.json +3 -2
  271. package/packages/pi/AGENTS.md +112 -0
  272. package/packages/pi/extensions/agent-grid.ts +191 -0
  273. package/packages/pi/extensions/agent-names.ts +178 -0
  274. package/packages/pi/extensions/autoresearch.ts +427 -0
  275. package/packages/pi/extensions/bookmarks.ts +85 -0
  276. package/packages/pi/extensions/context.ts +151 -0
  277. package/packages/pi/extensions/crm-tool.ts +61 -0
  278. package/packages/pi/extensions/eval-tool.ts +224 -0
  279. package/packages/pi/extensions/eval.ts +60 -0
  280. package/packages/pi/extensions/footer.ts +239 -0
  281. package/packages/pi/extensions/hud-tool.ts +145 -0
  282. package/packages/pi/extensions/index.ts +392 -0
  283. package/packages/pi/extensions/journal.ts +224 -0
  284. package/packages/pi/extensions/map-bridge.ts +178 -0
  285. package/packages/pi/extensions/memory-tool.ts +68 -0
  286. package/packages/pi/extensions/notifications.ts +73 -0
  287. package/packages/pi/extensions/peter-parker.ts +202 -0
  288. package/packages/pi/extensions/policy-head-tool.ts +276 -0
  289. package/packages/pi/extensions/portfolio-bridge.ts +90 -0
  290. package/packages/pi/extensions/session.ts +90 -0
  291. package/packages/pi/extensions/shortcuts.ts +259 -0
  292. package/packages/pi/extensions/stratus-bridge.ts +115 -0
  293. package/packages/pi/extensions/synopsis-tool.ts +83 -0
  294. package/packages/pi/extensions/tool-renderers.ts +352 -0
  295. package/packages/pi/extensions/training-buffer-tool.ts +368 -0
  296. package/packages/pi/extensions/types.ts +163 -0
  297. package/packages/pi/package-lock.json +346 -0
  298. package/packages/pi/package.json +44 -0
  299. package/packages/pi/skills/agent-browser/SKILL.md +116 -0
  300. package/packages/pi/skills/brand-architect/SKILL.md +240 -0
  301. package/packages/pi/skills/brand-architect/config.yaml +137 -0
  302. package/packages/pi/skills/campaign-hud/config.yaml +112 -0
  303. package/packages/pi/skills/content-creator/SKILL.md +294 -0
  304. package/packages/pi/skills/context/SKILL.md +65 -0
  305. package/packages/pi/skills/debug/MULTI_AGENT.md +360 -0
  306. package/packages/pi/skills/debug/SKILL.md +554 -0
  307. package/packages/pi/skills/end/SKILL.md +1782 -0
  308. package/packages/pi/skills/eval/SKILL.md +75 -0
  309. package/packages/pi/skills/fly-deploy/SKILL.md +676 -0
  310. package/packages/pi/skills/founder-video/SKILL.md +467 -0
  311. package/packages/pi/skills/hud/SKILL.md +160 -0
  312. package/packages/pi/skills/orchestrate/SKILL.md +74 -0
  313. package/packages/pi/skills/pi-agents/SKILL.md +78 -0
  314. package/packages/pi/skills/react-best-practices/AGENTS.md +2249 -0
  315. package/packages/pi/skills/react-best-practices/README.md +123 -0
  316. package/packages/pi/skills/react-best-practices/SKILL.md +125 -0
  317. package/packages/pi/skills/react-best-practices/metadata.json +15 -0
  318. package/packages/pi/skills/react-best-practices/rules/_sections.md +46 -0
  319. package/packages/pi/skills/react-best-practices/rules/_template.md +28 -0
  320. package/packages/pi/skills/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  321. package/packages/pi/skills/react-best-practices/rules/advanced-use-latest.md +49 -0
  322. package/packages/pi/skills/react-best-practices/rules/async-api-routes.md +38 -0
  323. package/packages/pi/skills/react-best-practices/rules/async-defer-await.md +80 -0
  324. package/packages/pi/skills/react-best-practices/rules/async-dependencies.md +36 -0
  325. package/packages/pi/skills/react-best-practices/rules/async-parallel.md +28 -0
  326. package/packages/pi/skills/react-best-practices/rules/async-suspense-boundaries.md +99 -0
  327. package/packages/pi/skills/react-best-practices/rules/bundle-barrel-imports.md +59 -0
  328. package/packages/pi/skills/react-best-practices/rules/bundle-conditional.md +31 -0
  329. package/packages/pi/skills/react-best-practices/rules/bundle-defer-third-party.md +49 -0
  330. package/packages/pi/skills/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
  331. package/packages/pi/skills/react-best-practices/rules/bundle-preload.md +50 -0
  332. package/packages/pi/skills/react-best-practices/rules/client-event-listeners.md +74 -0
  333. package/packages/pi/skills/react-best-practices/rules/client-swr-dedup.md +56 -0
  334. package/packages/pi/skills/react-best-practices/rules/js-batch-dom-css.md +82 -0
  335. package/packages/pi/skills/react-best-practices/rules/js-cache-function-results.md +80 -0
  336. package/packages/pi/skills/react-best-practices/rules/js-cache-property-access.md +28 -0
  337. package/packages/pi/skills/react-best-practices/rules/js-cache-storage.md +70 -0
  338. package/packages/pi/skills/react-best-practices/rules/js-combine-iterations.md +32 -0
  339. package/packages/pi/skills/react-best-practices/rules/js-early-exit.md +50 -0
  340. package/packages/pi/skills/react-best-practices/rules/js-hoist-regexp.md +45 -0
  341. package/packages/pi/skills/react-best-practices/rules/js-index-maps.md +37 -0
  342. package/packages/pi/skills/react-best-practices/rules/js-length-check-first.md +49 -0
  343. package/packages/pi/skills/react-best-practices/rules/js-min-max-loop.md +82 -0
  344. package/packages/pi/skills/react-best-practices/rules/js-set-map-lookups.md +24 -0
  345. package/packages/pi/skills/react-best-practices/rules/js-tosorted-immutable.md +57 -0
  346. package/packages/pi/skills/react-best-practices/rules/rendering-activity.md +26 -0
  347. package/packages/pi/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
  348. package/packages/pi/skills/react-best-practices/rules/rendering-conditional-render.md +40 -0
  349. package/packages/pi/skills/react-best-practices/rules/rendering-content-visibility.md +38 -0
  350. package/packages/pi/skills/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
  351. package/packages/pi/skills/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
  352. package/packages/pi/skills/react-best-practices/rules/rendering-svg-precision.md +28 -0
  353. package/packages/pi/skills/react-best-practices/rules/rerender-defer-reads.md +39 -0
  354. package/packages/pi/skills/react-best-practices/rules/rerender-dependencies.md +45 -0
  355. package/packages/pi/skills/react-best-practices/rules/rerender-derived-state.md +29 -0
  356. package/packages/pi/skills/react-best-practices/rules/rerender-functional-setstate.md +74 -0
  357. package/packages/pi/skills/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
  358. package/packages/pi/skills/react-best-practices/rules/rerender-memo.md +44 -0
  359. package/packages/pi/skills/react-best-practices/rules/rerender-transitions.md +40 -0
  360. package/packages/pi/skills/react-best-practices/rules/server-after-nonblocking.md +73 -0
  361. package/packages/pi/skills/react-best-practices/rules/server-cache-lru.md +41 -0
  362. package/packages/pi/skills/react-best-practices/rules/server-cache-react.md +26 -0
  363. package/packages/pi/skills/react-best-practices/rules/server-parallel-fetching.md +79 -0
  364. package/packages/pi/skills/react-best-practices/rules/server-serialization.md +38 -0
  365. package/packages/pi/skills/remotion-best-practices/SKILL.md +43 -0
  366. package/packages/pi/skills/remotion-best-practices/rules/3d.md +86 -0
  367. package/packages/pi/skills/remotion-best-practices/rules/animations.md +29 -0
  368. package/packages/pi/skills/remotion-best-practices/rules/assets/charts-bar-chart.tsx +173 -0
  369. package/packages/pi/skills/remotion-best-practices/rules/assets/text-animations-typewriter.tsx +100 -0
  370. package/packages/pi/skills/remotion-best-practices/rules/assets/text-animations-word-highlight.tsx +108 -0
  371. package/packages/pi/skills/remotion-best-practices/rules/assets.md +78 -0
  372. package/packages/pi/skills/remotion-best-practices/rules/audio.md +172 -0
  373. package/packages/pi/skills/remotion-best-practices/rules/calculate-metadata.md +104 -0
  374. package/packages/pi/skills/remotion-best-practices/rules/can-decode.md +75 -0
  375. package/packages/pi/skills/remotion-best-practices/rules/charts.md +58 -0
  376. package/packages/pi/skills/remotion-best-practices/rules/compositions.md +146 -0
  377. package/packages/pi/skills/remotion-best-practices/rules/display-captions.md +126 -0
  378. package/packages/pi/skills/remotion-best-practices/rules/extract-frames.md +229 -0
  379. package/packages/pi/skills/remotion-best-practices/rules/fonts.md +152 -0
  380. package/packages/pi/skills/remotion-best-practices/rules/get-audio-duration.md +58 -0
  381. package/packages/pi/skills/remotion-best-practices/rules/get-video-dimensions.md +68 -0
  382. package/packages/pi/skills/remotion-best-practices/rules/get-video-duration.md +58 -0
  383. package/packages/pi/skills/remotion-best-practices/rules/gifs.md +138 -0
  384. package/packages/pi/skills/remotion-best-practices/rules/images.md +130 -0
  385. package/packages/pi/skills/remotion-best-practices/rules/import-srt-captions.md +67 -0
  386. package/packages/pi/skills/remotion-best-practices/rules/lottie.md +68 -0
  387. package/packages/pi/skills/remotion-best-practices/rules/measuring-dom-nodes.md +35 -0
  388. package/packages/pi/skills/remotion-best-practices/rules/measuring-text.md +143 -0
  389. package/packages/pi/skills/remotion-best-practices/rules/sequencing.md +106 -0
  390. package/packages/pi/skills/remotion-best-practices/rules/tailwind.md +11 -0
  391. package/packages/pi/skills/remotion-best-practices/rules/text-animations.md +20 -0
  392. package/packages/pi/skills/remotion-best-practices/rules/timing.md +179 -0
  393. package/packages/pi/skills/remotion-best-practices/rules/transcribe-captions.md +19 -0
  394. package/packages/pi/skills/remotion-best-practices/rules/transitions.md +122 -0
  395. package/packages/pi/skills/remotion-best-practices/rules/trimming.md +53 -0
  396. package/packages/pi/skills/remotion-best-practices/rules/videos.md +171 -0
  397. package/packages/pi/skills/search/SKILL.md +220 -0
  398. package/packages/pi/skills/spec/SKILL.md +377 -0
  399. package/packages/pi/skills/startup/SKILL.md +315 -0
  400. package/packages/pi/skills/web-architect/SKILL.md +309 -0
  401. package/packages/pi/skills/x-algorithm/SKILL.md +305 -0
  402. package/packages/pi/teams/dev-team.yaml +63 -0
  403. package/packages/pi/teams/gtm-team.yaml +79 -0
  404. package/packages/pi/themes/jfl.theme.json +76 -0
  405. package/packages/pi/tsconfig.json +21 -0
  406. package/scripts/collect-tuples.sh +124 -0
  407. package/scripts/destroy-fleet.sh +37 -0
  408. package/scripts/jfl-ide.sh +48 -0
  409. package/scripts/session/session-cleanup.sh +4 -11
  410. package/scripts/session/session-init.sh +6 -0
  411. package/scripts/session/session-sync.sh +25 -0
  412. package/scripts/setup-branch-protection.sh +106 -0
  413. package/scripts/spawn-fleet.sh +144 -0
  414. package/scripts/train-policy-head.py +434 -0
  415. package/scripts/vm-swarm/README.md +301 -0
  416. package/scripts/vm-swarm/collect-tuples.sh +331 -0
  417. package/scripts/vm-swarm/create-base-template.sh +339 -0
  418. package/scripts/vm-swarm/kill-fleet.sh +204 -0
  419. package/scripts/vm-swarm/monitor-fleet.sh +346 -0
  420. package/scripts/vm-swarm/spawn-fleet.sh +304 -0
  421. package/template/.github/workflows/jfl-eval.yml +105 -8
  422. package/template/.github/workflows/jfl-review.yml +4 -0
  423. package/template/scripts/session/session-end.sh +69 -6
  424. package/template/scripts/session/session-init.sh +55 -30
  425. package/template/scripts/session/session-lock.sh +464 -0
  426. package/template/templates/service-agent/workflows/jfl-eval.yml +19 -0
  427. package/dist/dashboard-static/assets/index-B6kRK9Rq.js +0 -116
  428. 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
+ }