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
@@ -1,31 +1,58 @@
1
1
  /**
2
2
  * Hub API Client
3
3
  * @purpose HTTP client for Context Hub API — headless agent access to dashboard data
4
+ * @perf Caches hub config for 5 seconds to avoid repeated filesystem reads
4
5
  */
5
6
  import { readFileSync, existsSync } from "fs";
6
7
  import { join } from "path";
7
8
  import * as path from "path";
9
+ // Cache for hub config to avoid repeated filesystem reads
10
+ let _hubConfigCache;
11
+ const HUB_CONFIG_CACHE_TTL_MS = 5000;
12
+ // Cache for project root lookup
13
+ let _projectRootCache;
8
14
  function findProjectRoot(cwd) {
9
- let dir = cwd || process.cwd();
15
+ const startDir = cwd || process.cwd();
16
+ // Return cached result if same cwd
17
+ if (_projectRootCache && _projectRootCache.cwd === startDir) {
18
+ return _projectRootCache.root;
19
+ }
20
+ let dir = startDir;
10
21
  while (dir !== path.dirname(dir)) {
11
22
  if (existsSync(join(dir, ".jfl", "config.json")) || existsSync(join(dir, ".jfl"))) {
23
+ _projectRootCache = { root: dir, cwd: startDir };
12
24
  return dir;
13
25
  }
14
26
  dir = path.dirname(dir);
15
27
  }
16
- return cwd || process.cwd();
28
+ _projectRootCache = { root: startDir, cwd: startDir };
29
+ return startDir;
17
30
  }
18
31
  export function getHubConfig(cwd) {
19
- const root = findProjectRoot(cwd);
32
+ const effectiveCwd = cwd || process.cwd();
33
+ const now = Date.now();
34
+ // Return cached config if still valid
35
+ if (_hubConfigCache &&
36
+ _hubConfigCache.cwd === effectiveCwd &&
37
+ (now - _hubConfigCache.ts) < HUB_CONFIG_CACHE_TTL_MS) {
38
+ return _hubConfigCache.config;
39
+ }
40
+ const root = findProjectRoot(effectiveCwd);
20
41
  const portFile = join(root, ".jfl", "context-hub.port");
21
42
  const tokenFile = join(root, ".jfl", "context-hub.token");
22
- if (!existsSync(portFile))
43
+ if (!existsSync(portFile)) {
44
+ _hubConfigCache = { config: null, cwd: effectiveCwd, ts: now };
23
45
  return null;
46
+ }
24
47
  const port = parseInt(readFileSync(portFile, "utf-8").trim(), 10);
25
- if (isNaN(port))
48
+ if (isNaN(port)) {
49
+ _hubConfigCache = { config: null, cwd: effectiveCwd, ts: now };
26
50
  return null;
51
+ }
27
52
  const token = existsSync(tokenFile) ? readFileSync(tokenFile, "utf-8").trim() : "";
28
- return { port, token, baseUrl: `http://localhost:${port}` };
53
+ const config = { port, token, baseUrl: `http://localhost:${port}` };
54
+ _hubConfigCache = { config, cwd: effectiveCwd, ts: now };
55
+ return config;
29
56
  }
30
57
  export async function hubFetch(path, config) {
31
58
  const hub = config || getHubConfig();
@@ -1 +1 @@
1
- {"version":3,"file":"hub-client.js","sourceRoot":"","sources":["../../src/lib/hub-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAA;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAQ5B,SAAS,eAAe,CAAC,GAAY;IACnC,IAAI,GAAG,GAAG,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAA;IAC9B,OAAO,GAAG,KAAK,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACjC,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;YAClF,OAAO,GAAG,CAAA;QACZ,CAAC;QACD,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IACzB,CAAC;IACD,OAAO,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAA;AAC7B,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAY;IACvC,MAAM,IAAI,GAAG,eAAe,CAAC,GAAG,CAAC,CAAA;IACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,kBAAkB,CAAC,CAAA;IACvD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,mBAAmB,CAAC,CAAA;IAEzD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAA;IAEtC,MAAM,IAAI,GAAG,QAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAA;IACjE,IAAI,KAAK,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAA;IAE5B,MAAM,KAAK,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IAElF,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,oBAAoB,IAAI,EAAE,EAAE,CAAA;AAC7D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAI,IAAY,EAAE,MAAkB;IAChE,MAAM,GAAG,GAAG,MAAM,IAAI,YAAY,EAAE,CAAA;IACpC,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAA;IAExE,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,OAAO,GAAG,IAAI,EAAE,CAAA;IACnC,MAAM,OAAO,GAA2B,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAA;IAC9E,IAAI,GAAG,CAAC,KAAK;QAAE,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,GAAG,CAAC,KAAK,EAAE,CAAA;IAE/D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC3B,OAAO;QACP,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;KACnC,CAAC,CAAA;IACF,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAA;IAC9E,OAAO,GAAG,CAAC,IAAI,EAAgB,CAAA;AACjC,CAAC"}
1
+ {"version":3,"file":"hub-client.js","sourceRoot":"","sources":["../../src/lib/hub-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * IDE Pane Registry
3
+ *
4
+ * Built-in pane types, agent-to-command resolution, and dependency checking
5
+ * for the jfl ide workspace system.
6
+ *
7
+ * @purpose Resolve pane names to commands, discover available panes, check dependencies
8
+ */
9
+ import type { IdeLayout, IdePane, IdePaneType, IdeConfig } from "../types/ide.js";
10
+ interface BuiltinPaneDef {
11
+ type: IdePaneType;
12
+ title: string;
13
+ command: string;
14
+ description: string;
15
+ }
16
+ declare const BUILTIN_PANES: Record<string, BuiltinPaneDef>;
17
+ export declare function hasPi(): boolean;
18
+ export declare function hasTmuxIde(): boolean;
19
+ export declare function hasTmux(): boolean;
20
+ export declare function getProjectRoot(): string;
21
+ export declare function getIdeConfigPath(root: string): string;
22
+ export declare function getRootIdeYmlPath(root: string): string;
23
+ export declare function loadIdeLayout(root: string): IdeLayout | null;
24
+ export declare function saveIdeLayout(root: string, layout: IdeLayout): void;
25
+ export declare function syncToRoot(root: string): void;
26
+ export declare function getIdeConfig(root: string): IdeConfig;
27
+ export declare function setIdeConfig(root: string, ideConfig: Partial<IdeConfig>): void;
28
+ export declare function resolveAgentCommand(_root: string, agentName: string): string;
29
+ export declare function resolveServiceCommand(serviceName: string): string;
30
+ export declare function resolvePrimaryPaneCommand(ideConfig: IdeConfig): {
31
+ title: string;
32
+ command?: string;
33
+ type: IdePaneType;
34
+ };
35
+ export declare function createDefaultLayout(root: string, ideConfig: IdeConfig): IdeLayout;
36
+ export declare function createWelcomeLayout(root: string, ideConfig: IdeConfig): IdeLayout;
37
+ interface AvailableItem {
38
+ name: string;
39
+ category: "agent" | "builtin" | "service";
40
+ description: string;
41
+ inWorkspace: boolean;
42
+ }
43
+ export declare function getAvailableItems(root: string, layout: IdeLayout | null): AvailableItem[];
44
+ export declare function resolvePane(root: string, name: string, options?: {
45
+ title?: string;
46
+ cmd?: string;
47
+ }): IdePane | null;
48
+ export declare function checkDependencies(root: string, name: string): {
49
+ ok: boolean;
50
+ checks: Array<{
51
+ label: string;
52
+ ok: boolean;
53
+ hint?: string;
54
+ }>;
55
+ };
56
+ export declare function detectNewSinceLastLaunch(root: string, layout: IdeLayout | null): string[];
57
+ export { BUILTIN_PANES };
58
+ //# sourceMappingURL=ide-panes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ide-panes.d.ts","sourceRoot":"","sources":["../../src/lib/ide-panes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,508 @@
1
+ /**
2
+ * IDE Pane Registry
3
+ *
4
+ * Built-in pane types, agent-to-command resolution, and dependency checking
5
+ * for the jfl ide workspace system.
6
+ *
7
+ * @purpose Resolve pane names to commands, discover available panes, check dependencies
8
+ */
9
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from "fs";
10
+ import { join } from "path";
11
+ import { execSync } from "child_process";
12
+ import { listAgentConfigs, loadAgentConfig } from "./agent-config.js";
13
+ const BUILTIN_PANES = {
14
+ events: {
15
+ type: "events",
16
+ title: "Events",
17
+ command: 'jfl context-hub events --follow 2>/dev/null || echo "Context Hub not running. Run: jfl context-hub start"',
18
+ description: "Event stream from Context Hub",
19
+ },
20
+ eval: {
21
+ type: "eval",
22
+ title: "Eval",
23
+ command: 'watch -n 5 "cat .jfl/eval/eval.jsonl 2>/dev/null | tail -20 || echo No eval data yet"',
24
+ description: "Metrics dashboard (auto-refresh)",
25
+ },
26
+ training: {
27
+ type: "training",
28
+ title: "Training",
29
+ command: 'watch -n 10 "ls -la .jfl/replay/ 2>/dev/null | tail -10 || echo No replay buffer yet"',
30
+ description: "Replay buffer stats",
31
+ },
32
+ topology: {
33
+ type: "topology",
34
+ title: "Topology",
35
+ command: 'jfl services deps 2>/dev/null || echo "No services registered"',
36
+ description: "Service dependency graph",
37
+ },
38
+ alerts: {
39
+ type: "alerts",
40
+ title: "Alerts",
41
+ command: 'jfl context-hub events --follow --filter "alert,error,warning" 2>/dev/null || echo "No alerts"',
42
+ description: "Filtered alert events",
43
+ },
44
+ };
45
+ export function hasPi() {
46
+ try {
47
+ execSync("which pi", { stdio: "ignore" });
48
+ return true;
49
+ }
50
+ catch {
51
+ return false;
52
+ }
53
+ }
54
+ export function hasTmuxIde() {
55
+ try {
56
+ execSync("which tmux-ide", { stdio: "ignore" });
57
+ return true;
58
+ }
59
+ catch {
60
+ return false;
61
+ }
62
+ }
63
+ export function hasTmux() {
64
+ try {
65
+ execSync("which tmux", { stdio: "ignore" });
66
+ return true;
67
+ }
68
+ catch {
69
+ return false;
70
+ }
71
+ }
72
+ export function getProjectRoot() {
73
+ try {
74
+ return execSync("git rev-parse --show-toplevel", { encoding: "utf-8" }).trim();
75
+ }
76
+ catch {
77
+ return process.cwd();
78
+ }
79
+ }
80
+ export function getIdeConfigPath(root) {
81
+ return join(root, ".jfl", "ide.yml");
82
+ }
83
+ export function getRootIdeYmlPath(root) {
84
+ return join(root, "ide.yml");
85
+ }
86
+ function yamlValue(val) {
87
+ if (val.includes('"') || val.includes("'")) {
88
+ const escaped = val.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
89
+ return `"${escaped}"`;
90
+ }
91
+ return val;
92
+ }
93
+ function readYaml(content) {
94
+ const lines = content.split("\n");
95
+ const result = {};
96
+ const currentRows = [];
97
+ let currentRow = null;
98
+ let currentPane = null;
99
+ let inRows = false;
100
+ let inPanes = false;
101
+ let inTheme = false;
102
+ for (const line of lines) {
103
+ const stripped = line.trim();
104
+ if (!stripped || stripped.startsWith("#"))
105
+ continue;
106
+ const indent = line.length - line.trimStart().length;
107
+ if (indent === 0 && stripped.startsWith("name:")) {
108
+ result.name = stripped.replace("name:", "").trim().replace(/^["']|["']$/g, "");
109
+ }
110
+ else if (indent === 0 && stripped.startsWith("before:")) {
111
+ result.before = stripped.replace("before:", "").trim();
112
+ }
113
+ else if (indent === 0 && stripped === "rows:") {
114
+ inRows = true;
115
+ inTheme = false;
116
+ }
117
+ else if (indent === 0 && stripped === "theme:") {
118
+ inTheme = true;
119
+ inRows = false;
120
+ result.theme = {};
121
+ }
122
+ else if (inTheme && indent >= 2) {
123
+ const colonIdx = stripped.indexOf(":");
124
+ if (colonIdx > 0) {
125
+ const key = stripped.slice(0, colonIdx).trim();
126
+ const val = stripped.slice(colonIdx + 1).trim();
127
+ result.theme[key] = val;
128
+ }
129
+ }
130
+ else if (inRows) {
131
+ if (indent === 2 && stripped.startsWith("- size:")) {
132
+ if (currentRow) {
133
+ if (currentPane)
134
+ currentRow.panes.push(currentPane);
135
+ currentPane = null;
136
+ currentRows.push(currentRow);
137
+ }
138
+ currentRow = { size: stripped.replace("- size:", "").trim().replace(/^["']|["']$/g, ""), panes: [] };
139
+ inPanes = false;
140
+ }
141
+ else if (indent === 4 && stripped === "panes:") {
142
+ inPanes = true;
143
+ }
144
+ else if (inPanes && indent === 6 && stripped.startsWith("- title:")) {
145
+ if (currentPane && currentRow)
146
+ currentRow.panes.push(currentPane);
147
+ currentPane = { title: stripped.replace("- title:", "").trim().replace(/^["']|["']$/g, "") };
148
+ }
149
+ else if (currentPane && indent >= 8) {
150
+ const colonIdx = stripped.indexOf(":");
151
+ if (colonIdx > 0) {
152
+ const k = stripped.slice(0, colonIdx).trim();
153
+ let raw = stripped.slice(colonIdx + 1).trim();
154
+ if (raw.startsWith('"') && raw.endsWith('"')) {
155
+ raw = raw.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, "\\");
156
+ }
157
+ else if (raw.startsWith("'") && raw.endsWith("'")) {
158
+ raw = raw.slice(1, -1);
159
+ }
160
+ let v = raw;
161
+ if (v === "true")
162
+ v = true;
163
+ if (v === "false")
164
+ v = false;
165
+ currentPane[k] = v;
166
+ }
167
+ }
168
+ }
169
+ }
170
+ if (currentRow) {
171
+ if (currentPane)
172
+ currentRow.panes.push(currentPane);
173
+ currentRows.push(currentRow);
174
+ }
175
+ return {
176
+ name: result.name || "workspace",
177
+ before: result.before,
178
+ rows: currentRows,
179
+ theme: result.theme,
180
+ };
181
+ }
182
+ function toYaml(layout) {
183
+ const lines = [];
184
+ if (layout.name)
185
+ lines.push(`name: ${layout.name}`);
186
+ if (layout.before)
187
+ lines.push(`before: ${yamlValue(layout.before)}`);
188
+ lines.push("");
189
+ lines.push("rows:");
190
+ for (const row of layout.rows) {
191
+ lines.push(` - size: ${row.size || "50%"}`);
192
+ lines.push(" panes:");
193
+ for (const pane of row.panes) {
194
+ lines.push(` - title: "${pane.title}"`);
195
+ if (pane.command)
196
+ lines.push(` command: ${yamlValue(pane.command)}`);
197
+ if (pane.size)
198
+ lines.push(` size: ${pane.size}`);
199
+ if (pane.focus)
200
+ lines.push(` focus: true`);
201
+ if (pane.type)
202
+ lines.push(` type: ${pane.type}`);
203
+ if (pane.agent)
204
+ lines.push(` agent: ${pane.agent}`);
205
+ }
206
+ }
207
+ if (layout.theme) {
208
+ lines.push("");
209
+ lines.push("theme:");
210
+ for (const [k, v] of Object.entries(layout.theme)) {
211
+ lines.push(` ${k}: ${v}`);
212
+ }
213
+ }
214
+ lines.push("");
215
+ return lines.join("\n");
216
+ }
217
+ export function loadIdeLayout(root) {
218
+ const configPath = getIdeConfigPath(root);
219
+ if (!existsSync(configPath))
220
+ return null;
221
+ try {
222
+ const content = readFileSync(configPath, "utf-8");
223
+ return readYaml(content);
224
+ }
225
+ catch {
226
+ return null;
227
+ }
228
+ }
229
+ export function saveIdeLayout(root, layout) {
230
+ const configPath = getIdeConfigPath(root);
231
+ const dir = join(root, ".jfl");
232
+ if (!existsSync(dir))
233
+ mkdirSync(dir, { recursive: true });
234
+ writeFileSync(configPath, toYaml(layout));
235
+ }
236
+ export function syncToRoot(root) {
237
+ const src = getIdeConfigPath(root);
238
+ const dest = getRootIdeYmlPath(root);
239
+ if (existsSync(src)) {
240
+ const content = readFileSync(src, "utf-8");
241
+ writeFileSync(dest, content);
242
+ }
243
+ }
244
+ export function getIdeConfig(root) {
245
+ const configPath = join(root, ".jfl", "config.json");
246
+ if (!existsSync(configPath))
247
+ return {};
248
+ try {
249
+ const config = JSON.parse(readFileSync(configPath, "utf-8"));
250
+ return {
251
+ primary: config.ide?.primary,
252
+ piAsked: config.ide?.piAsked,
253
+ };
254
+ }
255
+ catch {
256
+ return {};
257
+ }
258
+ }
259
+ export function setIdeConfig(root, ideConfig) {
260
+ const configPath = join(root, ".jfl", "config.json");
261
+ let config = {};
262
+ if (existsSync(configPath)) {
263
+ try {
264
+ config = JSON.parse(readFileSync(configPath, "utf-8"));
265
+ }
266
+ catch {
267
+ config = {};
268
+ }
269
+ }
270
+ config.ide = { ...(config.ide || {}), ...ideConfig };
271
+ const dir = join(root, ".jfl");
272
+ if (!existsSync(dir))
273
+ mkdirSync(dir, { recursive: true });
274
+ writeFileSync(configPath, JSON.stringify(config, null, 2) + "\n");
275
+ }
276
+ export function resolveAgentCommand(_root, agentName) {
277
+ return `jfl peter agent run ${agentName} 2>/dev/null || echo "Agent ${agentName} failed to start"`;
278
+ }
279
+ export function resolveServiceCommand(serviceName) {
280
+ return `watch -n 30 "jfl services status ${serviceName} 2>/dev/null || echo 'Service ${serviceName} not found'"`;
281
+ }
282
+ export function resolvePrimaryPaneCommand(ideConfig) {
283
+ if (ideConfig.primary === "pi") {
284
+ return { title: "Pi Assistant", type: "pi", command: "jfl pi 2>/dev/null || claude" };
285
+ }
286
+ return { title: "Claude", type: "claude", command: "claude" };
287
+ }
288
+ export function createDefaultLayout(root, ideConfig) {
289
+ const projectName = root.split("/").pop() || "workspace";
290
+ const primary = resolvePrimaryPaneCommand(ideConfig);
291
+ return {
292
+ name: projectName,
293
+ before: "jfl context-hub ensure 2>/dev/null",
294
+ rows: [
295
+ {
296
+ size: "100%",
297
+ panes: [
298
+ {
299
+ title: primary.title,
300
+ type: primary.type,
301
+ command: primary.command,
302
+ size: "50%",
303
+ focus: true,
304
+ },
305
+ {
306
+ title: "Shell",
307
+ type: "shell",
308
+ size: "50%",
309
+ },
310
+ ],
311
+ },
312
+ ],
313
+ theme: {
314
+ accent: "colour75",
315
+ border: "colour238",
316
+ bg: "colour235",
317
+ fg: "colour248",
318
+ },
319
+ };
320
+ }
321
+ export function createWelcomeLayout(root, ideConfig) {
322
+ const layout = createDefaultLayout(root, ideConfig);
323
+ const agents = listAgentConfigs(root);
324
+ const services = getRegisteredServiceNames(root);
325
+ let welcomeText = "echo '\\n Welcome to JFL IDE\\n'";
326
+ welcomeText += ` && echo ' Available pane types:'`;
327
+ welcomeText += ` && echo ' events - Event stream from Context Hub'`;
328
+ welcomeText += ` && echo ' eval - Metrics dashboard'`;
329
+ welcomeText += ` && echo ' alerts - Alert events'`;
330
+ welcomeText += ` && echo ' topology - Service dependency graph'`;
331
+ welcomeText += ` && echo ' training - Replay buffer stats'`;
332
+ if (agents.length > 0) {
333
+ welcomeText += ` && echo '' && echo ' Agents:'`;
334
+ for (const a of agents) {
335
+ try {
336
+ const agentConfig = loadAgentConfig(root, a);
337
+ welcomeText += ` && echo ' ${a.padEnd(16)} ${agentConfig.metric}'`;
338
+ }
339
+ catch {
340
+ welcomeText += ` && echo ' ${a}'`;
341
+ }
342
+ }
343
+ }
344
+ if (services.length > 0) {
345
+ welcomeText += ` && echo '' && echo ' Services:'`;
346
+ for (const s of services) {
347
+ welcomeText += ` && echo ' ${s}'`;
348
+ }
349
+ }
350
+ welcomeText += ` && echo '' && echo ' Add panes: jfl ide add <name> [--row N]'`;
351
+ welcomeText += ` && echo ' See all: jfl ide available'`;
352
+ welcomeText += ` && echo '' && exec $SHELL`;
353
+ layout.rows[0].panes[1] = {
354
+ title: "Welcome",
355
+ type: "welcome",
356
+ command: welcomeText,
357
+ size: "50%",
358
+ };
359
+ return layout;
360
+ }
361
+ function getRegisteredServiceNames(root) {
362
+ const configPath = join(root, ".jfl", "config.json");
363
+ if (!existsSync(configPath))
364
+ return [];
365
+ try {
366
+ const config = JSON.parse(readFileSync(configPath, "utf-8"));
367
+ return (config.registered_services || []).map((s) => s.name);
368
+ }
369
+ catch {
370
+ return [];
371
+ }
372
+ }
373
+ export function getAvailableItems(root, layout) {
374
+ const items = [];
375
+ const inWorkspace = (name) => {
376
+ if (!layout)
377
+ return false;
378
+ for (const row of layout.rows) {
379
+ for (const pane of row.panes) {
380
+ if (pane.agent === name || pane.type === name)
381
+ return true;
382
+ if (pane.title.toLowerCase() === name.toLowerCase())
383
+ return true;
384
+ }
385
+ }
386
+ return false;
387
+ };
388
+ const agents = listAgentConfigs(root);
389
+ for (const a of agents) {
390
+ try {
391
+ const agentConfig = loadAgentConfig(root, a);
392
+ items.push({
393
+ name: a,
394
+ category: "agent",
395
+ description: agentConfig.metric,
396
+ inWorkspace: inWorkspace(a),
397
+ });
398
+ }
399
+ catch {
400
+ items.push({
401
+ name: a,
402
+ category: "agent",
403
+ description: "(config error)",
404
+ inWorkspace: inWorkspace(a),
405
+ });
406
+ }
407
+ }
408
+ for (const [name, def] of Object.entries(BUILTIN_PANES)) {
409
+ items.push({
410
+ name,
411
+ category: "builtin",
412
+ description: def.description,
413
+ inWorkspace: inWorkspace(name),
414
+ });
415
+ }
416
+ const services = getRegisteredServiceNames(root);
417
+ for (const s of services) {
418
+ items.push({
419
+ name: s,
420
+ category: "service",
421
+ description: "Service health pane",
422
+ inWorkspace: inWorkspace(s),
423
+ });
424
+ }
425
+ return items;
426
+ }
427
+ export function resolvePane(root, name, options) {
428
+ if (options?.title && options?.cmd) {
429
+ return {
430
+ title: options.title,
431
+ command: options.cmd,
432
+ type: "custom",
433
+ };
434
+ }
435
+ if (BUILTIN_PANES[name]) {
436
+ const def = BUILTIN_PANES[name];
437
+ return {
438
+ title: def.title,
439
+ command: def.command,
440
+ type: def.type,
441
+ };
442
+ }
443
+ const agents = listAgentConfigs(root);
444
+ if (agents.includes(name)) {
445
+ return {
446
+ title: name,
447
+ command: resolveAgentCommand(root, name),
448
+ type: "agent",
449
+ agent: name,
450
+ };
451
+ }
452
+ const services = getRegisteredServiceNames(root);
453
+ if (services.includes(name)) {
454
+ return {
455
+ title: name,
456
+ command: resolveServiceCommand(name),
457
+ type: "service",
458
+ };
459
+ }
460
+ return null;
461
+ }
462
+ export function checkDependencies(root, name) {
463
+ const checks = [];
464
+ const agents = listAgentConfigs(root);
465
+ if (agents.includes(name)) {
466
+ checks.push({ label: "Agent TOML configured", ok: true });
467
+ try {
468
+ const agentConfig = loadAgentConfig(root, name);
469
+ const evalPath = join(root, agentConfig.eval.script);
470
+ checks.push({
471
+ label: `Eval script exists (${agentConfig.eval.script})`,
472
+ ok: existsSync(evalPath),
473
+ hint: existsSync(evalPath) ? undefined : `Create: ${agentConfig.eval.script}`,
474
+ });
475
+ }
476
+ catch {
477
+ checks.push({ label: "Agent config valid", ok: false, hint: `Fix: .jfl/agents/${name}.toml` });
478
+ }
479
+ }
480
+ if (BUILTIN_PANES[name]) {
481
+ if (name === "events" || name === "alerts") {
482
+ let hubRunning = false;
483
+ try {
484
+ execSync("jfl context-hub status 2>/dev/null", { stdio: "ignore" });
485
+ hubRunning = true;
486
+ }
487
+ catch { /* not running */ }
488
+ checks.push({
489
+ label: "Context Hub running",
490
+ ok: hubRunning,
491
+ hint: hubRunning ? undefined : "Will start automatically",
492
+ });
493
+ }
494
+ }
495
+ return { ok: checks.every((c) => c.ok || c.hint?.includes("automatically")), checks };
496
+ }
497
+ export function detectNewSinceLastLaunch(root, layout) {
498
+ const messages = [];
499
+ const items = getAvailableItems(root, layout);
500
+ for (const item of items) {
501
+ if (!item.inWorkspace && item.category === "agent") {
502
+ messages.push(`${item.name} agent configured \u2192 jfl ide add ${item.name}`);
503
+ }
504
+ }
505
+ return messages;
506
+ }
507
+ export { BUILTIN_PANES };
508
+ //# sourceMappingURL=ide-panes.js.map