@a-company/paradigm 5.37.0 → 5.37.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (194) hide show
  1. package/dist/{accept-orchestration-36AP7HTX.js → accept-orchestration-SBZVK3H4.js} +1 -1
  2. package/dist/{add-FGKNJS3F.js → add-P76GEMGF.js} +1 -1
  3. package/dist/{agent-E7LDKJ4O.js → agent-X6I2YWOB.js} +1 -1
  4. package/dist/{agent-loader-2HXKVL6J.js → agent-loader-RIVI6QPP.js} +1 -1
  5. package/dist/{agent-loader-XS6LIMUG.js → agent-loader-RJRVO5GQ.js} +1 -1
  6. package/dist/{agent-state-L7LCPRC3.js → agent-state-KSQ3S7OB.js} +1 -1
  7. package/dist/{agents-suggest-Y5D6AALG.js → agents-suggest-HYTFMQD3.js} +1 -1
  8. package/dist/{aggregate-OZJRRAQR.js → aggregate-W66DM3GA.js} +1 -1
  9. package/dist/{ambient-4NSPAQDJ.js → ambient-GJAEXF7B.js} +4 -4
  10. package/dist/{assess-AMPVSWK7.js → assess-UFPYEJKP.js} +1 -1
  11. package/dist/{auto-A7VUHCUC.js → auto-RHJXOZFL.js} +1 -1
  12. package/dist/{beacon-YBLUUTYY.js → beacon-5QVYV5DF.js} +1 -1
  13. package/dist/{calibration-FQ4YVOE4.js → calibration-OLJYB5HN.js} +1 -1
  14. package/dist/{check-46QL3KMQ.js → check-THVGY4R5.js} +1 -1
  15. package/dist/{chunk-EMMMBAID.js → chunk-3KVVC4WV.js} +1 -1
  16. package/dist/{chunk-3QMRDN65.js → chunk-4Q7XYPL4.js} +2 -2
  17. package/dist/{chunk-3OMJI5TT.js → chunk-4SCKMGTB.js} +2 -2
  18. package/dist/chunk-5TAVYPOV.js +2 -0
  19. package/dist/{chunk-6PP2RPIZ.js → chunk-74SGKSRQ.js} +2 -2
  20. package/dist/{chunk-RN35IVA2.js → chunk-BV5PRPLB.js} +1 -1
  21. package/dist/{chunk-YG5G5GEQ.js → chunk-CMCQHU46.js} +13 -13
  22. package/dist/{chunk-JIF7OSGH.js → chunk-CVPKQ3JH.js} +1 -1
  23. package/dist/{chunk-RLJ5K3J5.js → chunk-D6ZXAI26.js} +1 -1
  24. package/dist/chunk-EK4ZRIFJ.js +3 -0
  25. package/dist/{chunk-X54WXWCX.js → chunk-FILLU77P.js} +5 -5
  26. package/dist/{chunk-7PB7AXQE.js → chunk-J6KWGCHN.js} +1 -1
  27. package/dist/{chunk-BCOPNVPY.js → chunk-JOHAOLEC.js} +2 -2
  28. package/dist/{chunk-JUOOVKK6.js → chunk-KFNHCQ4R.js} +1 -1
  29. package/dist/{chunk-77WX6HGV.js → chunk-LBQBWIEX.js} +1 -1
  30. package/dist/chunk-MBPLJKE5.js +3 -0
  31. package/dist/{chunk-W6WVJLHO.js → chunk-ODVKPZZ4.js} +1 -1
  32. package/dist/{chunk-5YHR77AL.js → chunk-ORDKEGII.js} +1 -1
  33. package/dist/chunk-QGZRM6ZB.js +2 -0
  34. package/dist/chunk-QO7YPQXC.js +2 -0
  35. package/dist/{chunk-DG3VCY43.js → chunk-SUU6M4JH.js} +1 -1
  36. package/dist/{chunk-XNB4TZTD.js → chunk-UNHTQLYO.js} +1 -1
  37. package/dist/chunk-UPFCBVXY.js +3 -0
  38. package/dist/{chunk-6QKCUEEY.js → chunk-VCKKJDLP.js} +1 -1
  39. package/dist/{chunk-4W5TBL3O.js → chunk-VG7FN2TU.js} +1 -1
  40. package/dist/{chunk-7YTAA6XA.js → chunk-WS2N27RX.js} +1 -1
  41. package/dist/{chunk-7SGNNVE5.js → chunk-X3U3IGYT.js} +2 -2
  42. package/dist/{chunk-IW5K3RNR.js → chunk-ZUAUFZRJ.js} +1 -1
  43. package/dist/{claude-OX54QSLC.js → claude-4LR3LJQZ.js} +1 -1
  44. package/dist/{claude-cli-FHLJQVJC.js → claude-cli-UP6HGH7C.js} +1 -1
  45. package/dist/{claude-code-GVGU3A3B.js → claude-code-RLJ4GX77.js} +1 -1
  46. package/dist/{claude-code-teams-ZRHPTGPP.js → claude-code-teams-R37HJY3Y.js} +1 -1
  47. package/dist/{compliance-PHSPVYK2.js → compliance-BPGQMQAX.js} +3 -3
  48. package/dist/{compliance-health-HCZTJDN7.js → compliance-health-JNP3P35P.js} +1 -1
  49. package/dist/{conductor-LYBMM66Z.js → conductor-Y5IXELTL.js} +1 -1
  50. package/dist/{config-schema-URJW6UZH.js → config-schema-GUQY2QN7.js} +1 -1
  51. package/dist/{constellation-PX3ZKMWQ.js → constellation-CG7C4WFE.js} +1 -1
  52. package/dist/{context-audit-APFKELFT.js → context-audit-XRPT3OU2.js} +2 -2
  53. package/dist/{cost-B5SAHPOJ.js → cost-IDNVMAEV.js} +1 -1
  54. package/dist/{cost-MMWUDGZC.js → cost-PK4KIF7R.js} +1 -1
  55. package/dist/{cursor-cli-Q2HLQ5TE.js → cursor-cli-QKF7Z6M2.js} +1 -1
  56. package/dist/{cursorrules-3BW6K6D5.js → cursorrules-U5O4G5T4.js} +1 -1
  57. package/dist/{decision-loader-4KMQVAXZ.js → decision-loader-2XPZE4EZ.js} +1 -1
  58. package/dist/{delete-7PQZUERZ.js → delete-P5VULXR4.js} +1 -1
  59. package/dist/{diff-F2HUO2H3.js → diff-JVEYCXUC.js} +1 -1
  60. package/dist/{discipline-ARFFIXQL.js → discipline-H7LDI6NT.js} +1 -1
  61. package/dist/{dist-MRZDZ5SX.js → dist-3ZCH25SG.js} +1 -1
  62. package/dist/{dist-KGRCLBJP-R5CCPPXN.js → dist-KGRCLBJP-2QAPFYNF.js} +1 -1
  63. package/dist/{dist-YUXXIXB3.js → dist-QBTQW4ZW.js} +1 -1
  64. package/dist/{dist-OKM6BXTH.js → dist-VGFSP3XM.js} +1 -1
  65. package/dist/{dist-VWC6FA46.js → dist-VXCZWVVJ.js} +1 -1
  66. package/dist/{dist-5IUWRFG6.js → dist-W3XCATBJ.js} +1 -1
  67. package/dist/{docs-6WOQILZS.js → docs-EDQ2STFK.js} +1 -1
  68. package/dist/{docs-BI2DO7B2.js → docs-USDAF26F.js} +2 -2
  69. package/dist/doctor-G37LCXG5.js +2 -0
  70. package/dist/{drift-6QPDKKUO.js → drift-ILZE5BFJ.js} +1 -1
  71. package/dist/{echo-3JJDKCNF.js → echo-UPTQUEDU.js} +1 -1
  72. package/dist/{edit-PLCGL5OV.js → edit-GUU3HBVW.js} +1 -1
  73. package/dist/{enforcement-IWABOHMY.js → enforcement-46XWPNSA.js} +1 -1
  74. package/dist/{enforcement-5MHSQAXE.js → enforcement-BEGPQIUN.js} +1 -1
  75. package/dist/{event-5J3GBWKT.js → event-Y3VXC2RV.js} +1 -1
  76. package/dist/{explain-files-LPHTJL4N.js → explain-files-3GPZUETV.js} +1 -1
  77. package/dist/{export-NXUFTFPW.js → export-CV5KCTPS.js} +1 -1
  78. package/dist/{flow-IT2IVXXT.js → flow-POQP27WA.js} +1 -1
  79. package/dist/{gap-narrator-DVXPWNFN.js → gap-narrator-NTXLUI7I.js} +1 -1
  80. package/dist/{global-J2VTYKCC.js → global-C44FW4G2.js} +1 -1
  81. package/dist/{graduate-N2HF4JT6.js → graduate-3BBSC27A.js} +1 -1
  82. package/dist/graph-CNDE5TAT.js +2 -0
  83. package/dist/{graph-server-TBHHBFOM.js → graph-server-COZR5C3Z.js} +1 -1
  84. package/dist/{habits-JTMWGVPH.js → habits-BX2IRSUI.js} +3 -3
  85. package/dist/{history-FHS7EC3Z.js → history-UW454SDP.js} +1 -1
  86. package/dist/{hooks-BL6CXRVK.js → hooks-BNWRGACA.js} +1 -1
  87. package/dist/index.js +5 -5
  88. package/dist/init-EHVSM7YY.js +2 -0
  89. package/dist/{integrity-UBMZCB77.js → integrity-UYDOOJDP.js} +1 -1
  90. package/dist/{integrity-checker-VSR3ITBL.js → integrity-checker-DHGMZQDG.js} +1 -1
  91. package/dist/journal-loader-GLH7XFTK.js +2 -0
  92. package/dist/{lint-KQQ2RMSJ.js → lint-IGKE6UPS.js} +1 -1
  93. package/dist/{list-37UCWCOQ.js → list-5IUGP3ZB.js} +1 -1
  94. package/dist/{list-6WY4CFUR.js → list-YKIQNKGB.js} +1 -1
  95. package/dist/lore-loader-RVQI5GXL.js +2 -0
  96. package/dist/{lore-loader-PBUDKXAJ.js → lore-loader-XY5MZRR2.js} +1 -1
  97. package/dist/{lore-server-A3KKZLSY.js → lore-server-FC2GMDLT.js} +1 -1
  98. package/dist/{manual-HKI6OXB4.js → manual-RXSPSFLL.js} +1 -1
  99. package/dist/mcp.js +1 -1
  100. package/dist/{migrate-W3KCXLDS.js → migrate-YQG2FG3J.js} +2 -2
  101. package/dist/{migrate-assessments-D2TOBJ5V.js → migrate-assessments-GEI5WMI2.js} +1 -1
  102. package/dist/{model-discovery-TWX4A4YD.js → model-discovery-HMB3YI4L.js} +1 -1
  103. package/dist/{nomination-engine-A24774W4.js → nomination-engine-KNSOAT4W.js} +1 -1
  104. package/dist/{notebook-LXJ2LHUA.js → notebook-PE3JSYZI.js} +1 -1
  105. package/dist/notebook-loader-CENTDDUJ.js +2 -0
  106. package/dist/{orchestrate-WFCNV2II.js → orchestrate-RCAMBOIB.js} +1 -1
  107. package/dist/{peers-7TPZTKH7.js → peers-P2KXU7ZK.js} +1 -1
  108. package/dist/{persona-UGTCFEGT.js → persona-STQWZH5P.js} +1 -1
  109. package/dist/{pipeline-7PZ6ILWX.js → pipeline-MZUITRVN.js} +1 -1
  110. package/dist/{platform-server-YIBX4YDJ.js → platform-server-DNAMH4YI.js} +2 -2
  111. package/dist/{plugin-update-checker-2EM4K45U.js → plugin-update-checker-M7PW434O.js} +1 -1
  112. package/dist/{portal-check-YSDJRZUR.js → portal-check-Z3OCQEQR.js} +1 -1
  113. package/dist/{portal-compliance-OBPK2IR5.js → portal-compliance-4MG5F2GI.js} +1 -1
  114. package/dist/{probe-WKXR3IN4.js → probe-B22G2JKF.js} +1 -1
  115. package/dist/{project-type-MRBJAKC7.js → project-type-EUCFKEAZ.js} +1 -1
  116. package/dist/{promote-VHBA56KW.js → promote-NJQDZBZA.js} +2 -2
  117. package/dist/{providers-RX7SBLHZ.js → providers-AWA7WLLM.js} +1 -1
  118. package/dist/{quiz-3SQNPRJ3.js → quiz-FE5UGAY2.js} +1 -1
  119. package/dist/{record-7QJPZZP7.js → record-YXPB34MY.js} +1 -1
  120. package/dist/{registry-LR5QACRK.js → registry-KOOKFUWD.js} +2 -2
  121. package/dist/reindex-O3WUCEE2.js +2 -0
  122. package/dist/{remember-SFGBTTEE.js → remember-MJRNTXYS.js} +1 -1
  123. package/dist/{retag-GFXUYP7S.js → retag-N5XF3KXP.js} +1 -1
  124. package/dist/{review-6KKZWV3A.js → review-6UAH6V3R.js} +1 -1
  125. package/dist/{review-GEBSYOZB.js → review-77QI6VOC.js} +1 -1
  126. package/dist/{ripple-4F5ZCXS4.js → ripple-ZGDITCGB.js} +1 -1
  127. package/dist/{roster-RI3UC2YI.js → roster-HV5KYUOI.js} +1 -1
  128. package/dist/{scaffold-WA4L2K7J.js → scaffold-D57JXPCC.js} +1 -1
  129. package/dist/{scopes-commands-5FFIUDRC.js → scopes-commands-NSPERZWV.js} +1 -1
  130. package/dist/{sentinel-37ZEEWT7.js → sentinel-HYAZ3CO5.js} +2 -2
  131. package/dist/{sentinel-bridge-EZGFRVFH.js → sentinel-bridge-VR357PKL.js} +1 -1
  132. package/dist/{serve-2BXDL35A.js → serve-L52ZUTU6.js} +2 -2
  133. package/dist/{serve-5JME5QEM.js → serve-OY6XYL7F.js} +2 -2
  134. package/dist/{serve-2LSTQFFQ.js → serve-U47GULB6.js} +2 -2
  135. package/dist/{server-XLHIYDTZ.js → server-2MNROHF6.js} +1 -1
  136. package/dist/{server-AIXFROYL.js → server-4YNUIK4W.js} +1 -1
  137. package/dist/session-tracker-D2CH7RJF.js +2 -0
  138. package/dist/{session-work-log-6GKGUQ5C.js → session-work-log-BX434ZLK.js} +1 -1
  139. package/dist/{session-work-log-UYMIWWOX.js → session-work-log-NQA7WJEC.js} +1 -1
  140. package/dist/{setup-ZM4JFV5D.js → setup-3F5IK7MO.js} +2 -2
  141. package/dist/{setup-F2N4LUR7.js → setup-KPIMRZ4Q.js} +1 -1
  142. package/dist/{shift-DDYVQJ75.js → shift-RRNL6E4O.js} +3 -3
  143. package/dist/{show-RFOIR2GQ.js → show-BOAVWZPZ.js} +1 -1
  144. package/dist/{show-CZLVYLM5.js → show-PJ5LFLIL.js} +1 -1
  145. package/dist/{snapshot-6N564OUJ.js → snapshot-L2G56RPL.js} +1 -1
  146. package/dist/{spawn-HYARN3RL.js → spawn-M5BAV252.js} +1 -1
  147. package/dist/{status-WBJ6D7BD.js → status-77M3SDIF.js} +1 -1
  148. package/dist/{status-CUG3PKGC.js → status-A37ECYNJ.js} +1 -1
  149. package/dist/{summary-2AM4QVPW.js → summary-LXLHFRN7.js} +1 -1
  150. package/dist/{sweep-WHDT7ENV.js → sweep-HU74OPVW.js} +1 -1
  151. package/dist/{switch-HBGIFNF6.js → switch-CTW4PDGI.js} +1 -1
  152. package/dist/{symphony-CWKKMFAS.js → symphony-7INZR43F.js} +5 -5
  153. package/dist/{symphony-VTHVTE57.js → symphony-G6IENE4K.js} +1 -1
  154. package/dist/{symphony-loader-RYFZOQJS.js → symphony-loader-VA4UREOM.js} +1 -1
  155. package/dist/{symphony-peers-LWBUQ3T4.js → symphony-peers-U4KHMKGI.js} +1 -1
  156. package/dist/{symphony-peers-ISJPKX7W.js → symphony-peers-X5NGWXFP.js} +1 -1
  157. package/dist/{symphony-relay-L3BY6RGM.js → symphony-relay-2RHG25Z4.js} +1 -1
  158. package/dist/{sync-WIFD7UCL.js → sync-DLUBV5HQ.js} +1 -1
  159. package/dist/{sync-llms-MZ3RQWFX.js → sync-llms-7CAI74QL.js} +1 -1
  160. package/dist/{task-loader-EU7JLTR3.js → task-loader-NZFDTUQ5.js} +1 -1
  161. package/dist/{team-C3PWO7XL.js → team-NSP6PMPS.js} +1 -1
  162. package/dist/{test-6MUL4EXS.js → test-BQJMS4Y2.js} +1 -1
  163. package/dist/{thread-K6UHDIUW.js → thread-HFXK65D4.js} +1 -1
  164. package/dist/{timeline-S26CQWHT.js → timeline-K3ZFKJ3R.js} +1 -1
  165. package/dist/tools-NNPANZRA.js +2 -0
  166. package/dist/{triage-YF6WYZY4.js → triage-FCWOZASE.js} +1 -1
  167. package/dist/{tutorial-UEBX7Z2G.js → tutorial-UC6YQMNN.js} +1 -1
  168. package/dist/{university-UMT7PAKE.js → university-FJ7OCOA3.js} +1 -1
  169. package/dist/{upgrade-USW7YJEX.js → upgrade-GX56QE3C.js} +1 -1
  170. package/dist/{validate-VZGBVTPM.js → validate-C6SMKGYD.js} +1 -1
  171. package/dist/{validate-2PZTNYSS.js → validate-LSCDOLBO.js} +1 -1
  172. package/dist/{validate-KW3YFGTV.js → validate-VZXTJHGO.js} +1 -1
  173. package/dist/{watch-KQU3S7KE.js → watch-PZCCUP6K.js} +1 -1
  174. package/dist/{watch-HL3ZOALL.js → watch-YCODNIET.js} +1 -1
  175. package/dist/{wisdom-UU7HOE3M.js → wisdom-XZ3QKPNP.js} +1 -1
  176. package/dist/{work-log-loader-J27XSFCE.js → work-log-loader-DL5GZ2BQ.js} +1 -1
  177. package/dist/workspace-MKSQN7B2.js +2 -0
  178. package/package.json +1 -1
  179. package/dist/chunk-BRHQJLTG.js +0 -2
  180. package/dist/chunk-DSYEGRQ2.js +0 -3
  181. package/dist/chunk-F5BSUC2L.js +0 -3
  182. package/dist/chunk-NFQLONFY.js +0 -3
  183. package/dist/chunk-OVDYPOHR.js +0 -2
  184. package/dist/chunk-XHJ27CER.js +0 -2
  185. package/dist/doctor-JLTCBMS4.js +0 -2
  186. package/dist/graph-VLMP6DW2.js +0 -2
  187. package/dist/init-ZS7RAR7L.js +0 -2
  188. package/dist/journal-loader-EELDB4P2.js +0 -2
  189. package/dist/lore-loader-CP5RUJ4A.js +0 -2
  190. package/dist/notebook-loader-CF52PNZC.js +0 -2
  191. package/dist/reindex-F7EV3Z34.js +0 -2
  192. package/dist/session-tracker-VSFRNFRL.js +0 -2
  193. package/dist/tools-4WKLLDFU.js +0 -2
  194. package/dist/workspace-CE6LNXVI.js +0 -2
@@ -1,15 +1,15 @@
1
1
  #!/usr/bin/env node
2
- import {d,k,j,h,c,e as e$1,f,s,m,g,q as q$1,v,w,i,r,o,p as p$1,u,t,z,x,C,y,A,B}from'./chunk-JIF7OSGH.js';import'./chunk-7SWEOPWF.js';import'./chunk-DSYEGRQ2.js';import'./chunk-XHJ27CER.js';import e from'chalk';import*as b from'path';import*as p from'fs';import*as q from'os';async function te(s){let o=process.cwd();if(s.remote){await Y(o,s.remote);return}let r=d(o);console.log(e.green(`\u2713 Joined as ${e.bold(r.id)}`));let i=k().filter(l=>l.id!==r.id);if(i.length>0){console.log(e.cyan(`
2
+ import {d,k,j,h,c,e as e$1,f,s,m,g,q as q$1,v,w,i,r,o,p as p$1,u,t,z,x,C,y,A,B}from'./chunk-CVPKQ3JH.js';import'./chunk-7SWEOPWF.js';import'./chunk-MBPLJKE5.js';import'./chunk-5TAVYPOV.js';import e from'chalk';import*as b from'path';import*as p from'fs';import*as q from'os';async function te(s){let o=process.cwd();if(s.remote){await Y(o,s.remote);return}let r=d(o);console.log(e.green(`\u2713 Joined as ${e.bold(r.id)}`));let i=k().filter(l=>l.id!==r.id);if(i.length>0){console.log(e.cyan(`
3
3
  Found ${i.length} other session${i.length!==1?"s":""}:`));for(let l of i){let t=j(l)?e.yellow("asleep"):e.green("awake");console.log(` ${e.white(l.id)} \u2014 ${l.name} [${t}]`);}}else console.log(e.gray(`
4
4
  No other sessions found. Open another terminal and run "paradigm symphony join".`));console.log(e.gray(`
5
- Tip: Set up polling with: /loop 10s paradigm_symphony_poll`));}async function Y(s,o){let{SymphonyRelay:r}=await import('./symphony-relay-L3BY6RGM.js'),n,i;if(o.includes("#")){let c=o.split("#");n=c[0],i=c[1];}else n=o;n.includes(":")||(n=`${n}:3939`);let l=h(s);l||(l=d(s));let t;if(i)t=i,console.log(e.cyan(`
5
+ Tip: Set up polling with: /loop 10s paradigm_symphony_poll`));}async function Y(s,o){let{SymphonyRelay:r}=await import('./symphony-relay-2RHG25Z4.js'),n,i;if(o.includes("#")){let c=o.split("#");n=c[0],i=c[1];}else n=o;n.includes(":")||(n=`${n}:3939`);let l=h(s);l||(l=d(s));let t;if(i)t=i,console.log(e.cyan(`
6
6
  Connecting to ${n} with embedded pairing code...`));else if(console.log(e.cyan(`
7
7
  Connecting to ${n}...`)),console.log(e.white(" Enter the 6-digit pairing code shown on the host:")),t=await K(" Code: "),t=t.trim(),!/^\d{6}$/.test(t)){console.log(e.red(" Invalid code. Must be 6 digits."));return}let a=new r({mode:"client",peerId:l.id,events:{onPeerConnected:(c,g)=>{console.log(e.green(` \u2713 Connected to ${e.bold(g)} (${c})`));},onPeerDisconnected:c=>{console.log(e.yellow(` Peer ${c} disconnected. Reconnecting...`));},onMessageRelayed:(c,g,y)=>{console.log(e.gray(` \u2190 Message ${c.slice(0,8)} from ${g} \u2192 ${y}`));},onError:c=>{console.log(e.red(` Error: ${c.message}`));}}});try{await a.connectToServer(n,t),console.log(e.green(`
8
8
  \u2713 Paired and connected!`)),console.log(e.gray(" Messages from remote agents will appear in your inbox.")),console.log(e.gray(` Press Ctrl+C to disconnect.
9
9
  `)),process.on("SIGINT",()=>{console.log(e.yellow(`
10
10
  Disconnecting...`)),a.stop(),process.exit(0);}),await new Promise(()=>{});}catch(c){console.log(e.red(` Failed to connect: ${c.message}`)),a.stop();}}function K(s){return new Promise(o=>{process.stdout.write(s);let r="";process.stdin.setEncoding("utf-8"),process.stdin.resume(),process.stdin.once("data",n=>{r=n.toString(),process.stdin.pause(),o(r);});})}async function se(){let s=process.cwd(),o=c(s),r=e$1(o);console.log(r?e.green(`\u2713 Left the score: ${o}`):e.yellow("No active part found for this project."));}async function re(){let s$1=process.cwd(),o=h(s$1);if(!o){console.log(e.yellow('Not joined. Run "paradigm symphony join" first.'));return}let n=f().filter(t=>t.id!==o.id),i=s("active"),l=m(o.id);console.log(e.cyan(`
11
11
  ${e.bold(o.id)}`)),console.log(e.gray(` Project: ${o.project}`)),console.log(e.gray(` Role: ${o.role}`)),console.log(e.gray(` PID: ${o.pid}`)),console.log(e.gray(` Started: ${o.startedAt}`)),o.statusBlurb&&console.log(e.white(` Status: ${o.statusBlurb}`)),console.log(`
12
- ${e.white(`${n.length} linked peer${n.length!==1?"s":""}`)} \u2014 ${e.white(`${i.length} active thread${i.length!==1?"s":""}`)} \u2014 ${e.white(`${l.length} unread`)}`);}async function ie(s){g();let o=f(),{loadPeers:r}=await import('./symphony-peers-ISJPKX7W.js'),n=r(),i=[];for(let t of n)if(!t.revoked)for(let a of t.agents||[])i.push({...a,peerId:t.id});let l=o.length+i.length;if(s.json){console.log(JSON.stringify({local:o,remote:i},null,2));return}if(l===0){console.log(e.yellow('No agents joined. Run "paradigm symphony join" in each terminal.'));return}console.log(e.cyan(`
12
+ ${e.white(`${n.length} linked peer${n.length!==1?"s":""}`)} \u2014 ${e.white(`${i.length} active thread${i.length!==1?"s":""}`)} \u2014 ${e.white(`${l.length} unread`)}`);}async function ie(s){g();let o=f(),{loadPeers:r}=await import('./symphony-peers-X5NGWXFP.js'),n=r(),i=[];for(let t of n)if(!t.revoked)for(let a of t.agents||[])i.push({...a,peerId:t.id});let l=o.length+i.length;if(s.json){console.log(JSON.stringify({local:o,remote:i},null,2));return}if(l===0){console.log(e.yellow('No agents joined. Run "paradigm symphony join" in each terminal.'));return}console.log(e.cyan(`
13
13
  Symphony Agents (${l})
14
14
  `)),console.log(e.gray(` ${"AGENT ID".padEnd(30)} ${"PROJECT".padEnd(15)} ${"ROLE".padEnd(10)} STATUS`)),console.log(e.gray(` ${"\u2500".repeat(30)} ${"\u2500".repeat(15)} ${"\u2500".repeat(10)} ${"\u2500".repeat(8)}`));for(let t of o){let a=j(t)?e.yellow("asleep"):e.green("awake");console.log(` ${e.white(t.id.padEnd(30))} ${t.project.padEnd(15)} ${t.role.padEnd(10)} ${a}`),t.statusBlurb&&console.log(` ${e.gray(` \u2514 ${t.statusBlurb}`)}`);}if(i.length>0){console.log(e.gray(`
15
15
  ${"\u2500".repeat(65)}`)),console.log(e.cyan(` Remote Agents (${i.length})
@@ -26,9 +26,9 @@ import {d,k,j,h,c,e as e$1,f,s,m,g,q as q$1,v,w,i,r,o,p as p$1,u,t,z,x,C,y,A,B}f
26
26
  Thread: ${o.topic}`)),console.log(e.gray(` ID: ${o.id} | Status: ${o.status} | Notes: ${o.messageCount}`)),console.log(e.gray(` Participants: ${o.participants.map(n=>n.name).join(", ")}`)),o.decision&&console.log(e.green(` Decision: ${o.decision}`)),console.log(e.gray(`
27
27
  ${"\u2500".repeat(60)}
28
28
  `));for(let n of r$1){let i=new Date(n.timestamp).toLocaleString(void 0,{month:"short",day:"numeric",hour:"numeric",minute:"2-digit"});console.log(` ${e.cyan(n.sender.name)} ${e.gray(`[${n.intent}]`)} ${e.gray(i)}`);let l=n.content.text.split(`
29
- `);for(let t of l)console.log(` ${t}`);n.symbols.length>0&&console.log(` ${e.gray(`Symbols: ${n.symbols.join(", ")}`)}`),n.content.decision&&console.log(` ${e.green(`Decision: ${n.content.decision}`)}`),console.log();}}async function de(s,o){let r$1=r(s);if(!r$1){console.log(e.red(`Thread not found: ${s}`));return}t(s,o.decision)?(console.log(e.green(`\u2713 Thread resolved: ${r$1.topic}`)),o.decision&&console.log(e.gray(` Decision: ${o.decision}`)),console.log(e.gray(` Tip: Record this as lore with "paradigm lore record --title 'Thread: ${r$1.topic}'"`))):console.log(e.red("Failed to resolve thread."));}async function ye(s$1){g();let o=process.cwd(),r=h(o),n=f(),i=s("active"),l=z("pending"),t=r?m(r.id):[],{loadPeers:a}=await import('./symphony-peers-ISJPKX7W.js'),g$1=a().filter(d=>!d.revoked);if(s$1.json){console.log(JSON.stringify({identity:r?{id:r.id,project:r.project,role:r.role}:null,agents:n.map(d=>({id:d.id,status:j(d)?"asleep":"awake",statusBlurb:d.statusBlurb})),peers:g$1.map(d=>({id:d.id,address:d.address,agents:d.agents?.length??0,lastSeen:d.lastSeen})),activeThreads:i.length,unreadMessages:t.length,pendingFileRequests:l.length},null,2));return}console.log(e.cyan(`
29
+ `);for(let t of l)console.log(` ${t}`);n.symbols.length>0&&console.log(` ${e.gray(`Symbols: ${n.symbols.join(", ")}`)}`),n.content.decision&&console.log(` ${e.green(`Decision: ${n.content.decision}`)}`),console.log();}}async function de(s,o){let r$1=r(s);if(!r$1){console.log(e.red(`Thread not found: ${s}`));return}t(s,o.decision)?(console.log(e.green(`\u2713 Thread resolved: ${r$1.topic}`)),o.decision&&console.log(e.gray(` Decision: ${o.decision}`)),console.log(e.gray(` Tip: Record this as lore with "paradigm lore record --title 'Thread: ${r$1.topic}'"`))):console.log(e.red("Failed to resolve thread."));}async function ye(s$1){g();let o=process.cwd(),r=h(o),n=f(),i=s("active"),l=z("pending"),t=r?m(r.id):[],{loadPeers:a}=await import('./symphony-peers-X5NGWXFP.js'),g$1=a().filter(d=>!d.revoked);if(s$1.json){console.log(JSON.stringify({identity:r?{id:r.id,project:r.project,role:r.role}:null,agents:n.map(d=>({id:d.id,status:j(d)?"asleep":"awake",statusBlurb:d.statusBlurb})),peers:g$1.map(d=>({id:d.id,address:d.address,agents:d.agents?.length??0,lastSeen:d.lastSeen})),activeThreads:i.length,unreadMessages:t.length,pendingFileRequests:l.length},null,2));return}console.log(e.cyan(`
30
30
  Symphony Status
31
- `)),console.log(r?` ${e.white("Identity:")} ${r.id}`:` ${e.yellow("Not joined.")} Run "paradigm symphony join" to join.`);let y=n.filter(d=>!j(d)).length;console.log(` ${e.white("Agents:")} ${n.length} joined (${y} awake)`);for(let d of n){let h=j(d)?e.yellow("asleep"):e.green("awake"),u=d.statusBlurb?e.gray(` \u2014 ${d.statusBlurb}`):"";console.log(` ${e.white(d.id)} [${h}]${u}`);}if(g$1.length>0){let d=g$1.reduce((h,u)=>h+(u.agents?.length??0),0);console.log(` ${e.white("Peers:")} ${g$1.length} connected (${d} remote agents)`);for(let h of g$1){let u=h.agents?.length??0;console.log(` ${e.white(h.id)} at ${h.address} (${u} agent${u!==1?"s":""})`);}}else console.log(` ${e.white("Peers:")} ${e.gray('none (run "paradigm symphony serve" to accept connections)')}`);console.log(` ${e.white("Threads:")} ${i.length} active`),console.log(` ${e.white("Unread:")} ${t.length} note${t.length!==1?"s":""}`),console.log(` ${e.white("File Requests:")} ${l.length} pending`),console.log();}async function pe(s){let o=parseInt(s.port||"3939",10),r=process.cwd(),{SymphonyRelay:n}=await import('./symphony-relay-L3BY6RGM.js'),i=h(r);i||(i=d(r)),console.log(e.cyan(`
31
+ `)),console.log(r?` ${e.white("Identity:")} ${r.id}`:` ${e.yellow("Not joined.")} Run "paradigm symphony join" to join.`);let y=n.filter(d=>!j(d)).length;console.log(` ${e.white("Agents:")} ${n.length} joined (${y} awake)`);for(let d of n){let h=j(d)?e.yellow("asleep"):e.green("awake"),u=d.statusBlurb?e.gray(` \u2014 ${d.statusBlurb}`):"";console.log(` ${e.white(d.id)} [${h}]${u}`);}if(g$1.length>0){let d=g$1.reduce((h,u)=>h+(u.agents?.length??0),0);console.log(` ${e.white("Peers:")} ${g$1.length} connected (${d} remote agents)`);for(let h of g$1){let u=h.agents?.length??0;console.log(` ${e.white(h.id)} at ${h.address} (${u} agent${u!==1?"s":""})`);}}else console.log(` ${e.white("Peers:")} ${e.gray('none (run "paradigm symphony serve" to accept connections)')}`);console.log(` ${e.white("Threads:")} ${i.length} active`),console.log(` ${e.white("Unread:")} ${t.length} note${t.length!==1?"s":""}`),console.log(` ${e.white("File Requests:")} ${l.length} pending`),console.log();}async function pe(s){let o=parseInt(s.port||"3939",10),r=process.cwd(),{SymphonyRelay:n}=await import('./symphony-relay-2RHG25Z4.js'),i=h(r);i||(i=d(r)),console.log(e.cyan(`
32
32
  Starting Symphony relay server...
33
33
  `));let l=new n({mode:"server",peerId:i.id,port:o,events:{onPeerConnected:(t,a)=>{console.log(e.green(` \u2713 Peer connected: ${e.bold(a)} (${t})`));let c=l.getRemoteAgents();c.length>0&&console.log(e.gray(` Remote agents: ${c.map(g=>g.id).join(", ")}`));},onPeerDisconnected:t=>{console.log(e.yellow(` Peer disconnected: ${t}`));},onPeerAuthFailed:(t,a)=>{console.log(e.red(` Auth failed from ${t}: ${a}`));},onMessageRelayed:(t,a,c)=>{console.log(e.gray(` \u2194 Relayed ${t.slice(0,8)} from ${a} to ${c}`));},onError:t=>{console.log(e.red(` Error: ${t.message}`));}}});try{let t=await l.startServer(),a=Q();if(console.log(e.green(` \u2713 Symphony relay listening on port ${o}`)),console.log(),console.log(e.white(" Pairing Code:")),console.log(),console.log(e.bold.cyan(` ${t.code.slice(0,3)} ${t.code.slice(3)}`)),console.log(),console.log(e.gray(" Share this code with the person connecting.")),console.log(e.gray(` Code rotates every 5 minutes.
34
34
  `)),console.log(e.white(" LAN connect:")),console.log(e.gray(` paradigm symphony join --remote ${a}:${o}`)),s.public){let g=`${a}:${o}#${t.code}`;console.log(),console.log(e.white(" Internet connect (connection string):")),console.log(e.cyan(` paradigm symphony join --remote ${g}`)),console.log(e.gray(" (Requires port 3939 reachable: port forward, VPN, or SSH tunnel)"));}console.log(e.gray(`
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import {g,f,k,j,h,s,r,u,t,c,q,v,w,m,D,z,B,A}from'./chunk-JIF7OSGH.js';import'./chunk-7SWEOPWF.js';import'./chunk-DSYEGRQ2.js';import'./chunk-XHJ27CER.js';import {Router}from'express';function G(u$1,p){let d=Router();return d.get("/agents",(i,s)=>{try{g();let e=f(),n=k(),a=new Set(e.map(t=>t.id));for(let t of n)a.has(t.id)||e.push(t);let r=e.map(t=>({id:t.id,name:t.name,project:t.project,role:t.role,status:j(t)?"asleep":"awake",lastPoll:t.lastPoll,startedAt:t.startedAt,statusBlurb:t.statusBlurb}));s.json({agents:r});}catch(e){s.status(500).json({error:"Failed to list agents",detail:String(e)});}}),d.get("/agents/me",(i,s)=>{try{let e=h(u$1);s.json({identity:e||null});}catch(e){s.status(500).json({error:"Failed to get identity",detail:String(e)});}}),d.get("/peers",async(i,s)=>{try{let{loadPeers:e}=await import('./symphony-peers-ISJPKX7W.js'),a=e().map(r=>({id:r.id,displayName:r.displayName,address:r.address,connectedAt:r.connectedAt,lastSeen:r.lastSeen,revoked:r.revoked,agents:r.agents||[]}));s.json({peers:a});}catch(e){s.status(500).json({error:"Failed to list peers",detail:String(e)});}}),d.get("/threads",(i,s$1)=>{try{let e=i.query.status,n;(e==="active"||e==="resolved")&&(n=e);let r=s(n).map(t=>({id:t.id,topic:t.topic,status:t.status,participants:t.participants.map(o=>({id:o.id,name:o.name,type:o.type})),messageCount:t.messageCount,lastActivity:t.lastActivity,decision:t.decision}));s$1.json({threads:r});}catch(e){s$1.status(500).json({error:"Failed to list threads",detail:String(e)});}}),d.get("/threads/:threadId",(i,s)=>{try{let{threadId:e}=i.params,n=r(e);if(!n){s.status(404).json({error:`Thread not found: ${e}`});return}let a=u(e),r$1=new Set;for(let t of a)for(let o of t.symbols)r$1.add(o);s.json({thread:{id:n.id,topic:n.topic,status:n.status,participants:n.participants.map(t=>({id:t.id,name:t.name,type:t.type})),messageCount:n.messageCount,lastActivity:n.lastActivity,decision:n.decision},messages:a.map(t=>({id:t.id,sender:{id:t.sender.id,name:t.sender.name,type:t.sender.type},intent:t.intent,text:t.content.text,timestamp:t.timestamp,symbols:t.symbols,diff:t.content.diff,decision:t.content.decision,recipients:t.recipients?.map(o=>({id:o.id,name:o.name}))})),symbolsDiscussed:[...r$1]});}catch(e){s.status(500).json({error:"Failed to load thread",detail:String(e)});}}),d.post("/threads/:threadId/resolve",(i,s)=>{try{let{threadId:e}=i.params,{decision:n}=i.body;if(!t(e,n)){s.status(404).json({error:`Thread not found: ${e}`});return}p&&p({type:"symphony:thread_resolved",threadId:e,decision:n}),s.json({resolved:!0,threadId:e,decision:n});}catch(e){s.status(500).json({error:"Failed to resolve thread",detail:String(e)});}}),d.post("/messages",(i,s)=>{try{let{intent:e,text:n,threadRoot:a,recipients:r,symbols:t,diff:o,decision:f$1}=i.body;if(!e||!n){s.status(400).json({error:"intent and text are required"});return}let l={id:`human/${c(u$1)}`,name:"Human (Platform UI)",type:"human"},g=a,b=!1;if(!a){let q$1=n.length>60?n.slice(0,60)+"...":n;g=q(q$1,l).id,b=!0;}let x;if(r&&r.length>0){let q=f();x=r.map(y=>{let R=q.find(H=>H.id===y);return R?{id:R.id,name:R.name,type:"agent"}:{id:y,name:y,type:"agent"}});}let c$1=v({sender:l,recipients:x,intent:e,text:n,threadRoot:g,symbols:t,diff:o,decision:f$1}),N=w(c$1);p&&p({type:"symphony:message",message:{id:c$1.id,sender:{id:l.id,name:l.name,type:l.type},intent:c$1.intent,text:c$1.content.text,timestamp:c$1.timestamp,symbols:c$1.symbols,diff:c$1.content.diff,decision:c$1.content.decision},threadId:g}),s.json({sent:!0,messageId:c$1.id,threadId:g,threadCreated:b,deliveredTo:N});}catch(e){s.status(500).json({error:"Failed to send message",detail:String(e)});}}),d.get("/inbox",(i,s)=>{try{let e=c(u$1),n=m(e);s.json({agentId:e,messages:n.map(a=>({id:a.id,sender:{id:a.sender.id,name:a.sender.name,type:a.sender.type},intent:a.intent,text:a.content.text,timestamp:a.timestamp,threadRoot:a.threadRoot,symbols:a.symbols}))});}catch(e){s.status(500).json({error:"Failed to read inbox",detail:String(e)});}}),d.get("/file-requests",(i,s)=>{try{D();let e=i.query.status,n;(e==="pending"||e==="approved"||e==="denied"||e==="expired")&&(n=e);let r=z(n).map(t=>({requestId:t.request.requestId,filePath:t.request.filePath,reason:t.request.reason,requester:{id:t.request.requester.id,name:t.request.requester.name},urgency:t.request.urgency,snippet:t.request.snippet,status:t.status,createdAt:t.createdAt,resolvedAt:t.resolvedAt,denyReason:t.denyReason}));s.json({fileRequests:r});}catch(e){s.status(500).json({error:"Failed to list file requests",detail:String(e)});}}),d.post("/file-requests/:requestId/action",(i,s)=>{try{let{requestId:e}=i.params,{action:n,reason:a}=i.body;if(!n){s.status(400).json({error:"action is required"});return}if(n==="deny"){let o=B(e,a);s.json({success:o,requestId:e,action:"denied",reason:a});return}let r=n==="approve-redacted",t=A(e,u$1,r);if(!t.success){s.status(400).json({success:!1,requestId:e,error:t.error});return}s.json({success:!0,requestId:e,action:r?"approved-redacted":"approved",filePath:t.delivery?.filePath,size:t.delivery?.size});}catch(e){s.status(500).json({error:"Failed to handle file request",detail:String(e)});}}),d.get("/status",(i,s$1)=>{try{g();let e=f(),n=e.filter(f=>!j(f)).length,a=s("active"),r=c(u$1),t=m(r),o=z("pending");s$1.json({agentCount:e.length,awakeCount:n,asleepCount:e.length-n,activeThreadCount:a.length,unreadCount:t.length,pendingFileRequests:o.length});}catch(e){s$1.status(500).json({error:"Failed to get status",detail:String(e)});}}),d}export{G as createSymphonyRouter};
2
+ import {g,f,k,j,h,s,r,u,t,c,q,v,w,m,D,z,B,A}from'./chunk-CVPKQ3JH.js';import'./chunk-7SWEOPWF.js';import'./chunk-MBPLJKE5.js';import'./chunk-5TAVYPOV.js';import {Router}from'express';function G(u$1,p){let d=Router();return d.get("/agents",(i,s)=>{try{g();let e=f(),n=k(),a=new Set(e.map(t=>t.id));for(let t of n)a.has(t.id)||e.push(t);let r=e.map(t=>({id:t.id,name:t.name,project:t.project,role:t.role,status:j(t)?"asleep":"awake",lastPoll:t.lastPoll,startedAt:t.startedAt,statusBlurb:t.statusBlurb}));s.json({agents:r});}catch(e){s.status(500).json({error:"Failed to list agents",detail:String(e)});}}),d.get("/agents/me",(i,s)=>{try{let e=h(u$1);s.json({identity:e||null});}catch(e){s.status(500).json({error:"Failed to get identity",detail:String(e)});}}),d.get("/peers",async(i,s)=>{try{let{loadPeers:e}=await import('./symphony-peers-X5NGWXFP.js'),a=e().map(r=>({id:r.id,displayName:r.displayName,address:r.address,connectedAt:r.connectedAt,lastSeen:r.lastSeen,revoked:r.revoked,agents:r.agents||[]}));s.json({peers:a});}catch(e){s.status(500).json({error:"Failed to list peers",detail:String(e)});}}),d.get("/threads",(i,s$1)=>{try{let e=i.query.status,n;(e==="active"||e==="resolved")&&(n=e);let r=s(n).map(t=>({id:t.id,topic:t.topic,status:t.status,participants:t.participants.map(o=>({id:o.id,name:o.name,type:o.type})),messageCount:t.messageCount,lastActivity:t.lastActivity,decision:t.decision}));s$1.json({threads:r});}catch(e){s$1.status(500).json({error:"Failed to list threads",detail:String(e)});}}),d.get("/threads/:threadId",(i,s)=>{try{let{threadId:e}=i.params,n=r(e);if(!n){s.status(404).json({error:`Thread not found: ${e}`});return}let a=u(e),r$1=new Set;for(let t of a)for(let o of t.symbols)r$1.add(o);s.json({thread:{id:n.id,topic:n.topic,status:n.status,participants:n.participants.map(t=>({id:t.id,name:t.name,type:t.type})),messageCount:n.messageCount,lastActivity:n.lastActivity,decision:n.decision},messages:a.map(t=>({id:t.id,sender:{id:t.sender.id,name:t.sender.name,type:t.sender.type},intent:t.intent,text:t.content.text,timestamp:t.timestamp,symbols:t.symbols,diff:t.content.diff,decision:t.content.decision,recipients:t.recipients?.map(o=>({id:o.id,name:o.name}))})),symbolsDiscussed:[...r$1]});}catch(e){s.status(500).json({error:"Failed to load thread",detail:String(e)});}}),d.post("/threads/:threadId/resolve",(i,s)=>{try{let{threadId:e}=i.params,{decision:n}=i.body;if(!t(e,n)){s.status(404).json({error:`Thread not found: ${e}`});return}p&&p({type:"symphony:thread_resolved",threadId:e,decision:n}),s.json({resolved:!0,threadId:e,decision:n});}catch(e){s.status(500).json({error:"Failed to resolve thread",detail:String(e)});}}),d.post("/messages",(i,s)=>{try{let{intent:e,text:n,threadRoot:a,recipients:r,symbols:t,diff:o,decision:f$1}=i.body;if(!e||!n){s.status(400).json({error:"intent and text are required"});return}let l={id:`human/${c(u$1)}`,name:"Human (Platform UI)",type:"human"},g=a,b=!1;if(!a){let q$1=n.length>60?n.slice(0,60)+"...":n;g=q(q$1,l).id,b=!0;}let x;if(r&&r.length>0){let q=f();x=r.map(y=>{let R=q.find(H=>H.id===y);return R?{id:R.id,name:R.name,type:"agent"}:{id:y,name:y,type:"agent"}});}let c$1=v({sender:l,recipients:x,intent:e,text:n,threadRoot:g,symbols:t,diff:o,decision:f$1}),N=w(c$1);p&&p({type:"symphony:message",message:{id:c$1.id,sender:{id:l.id,name:l.name,type:l.type},intent:c$1.intent,text:c$1.content.text,timestamp:c$1.timestamp,symbols:c$1.symbols,diff:c$1.content.diff,decision:c$1.content.decision},threadId:g}),s.json({sent:!0,messageId:c$1.id,threadId:g,threadCreated:b,deliveredTo:N});}catch(e){s.status(500).json({error:"Failed to send message",detail:String(e)});}}),d.get("/inbox",(i,s)=>{try{let e=c(u$1),n=m(e);s.json({agentId:e,messages:n.map(a=>({id:a.id,sender:{id:a.sender.id,name:a.sender.name,type:a.sender.type},intent:a.intent,text:a.content.text,timestamp:a.timestamp,threadRoot:a.threadRoot,symbols:a.symbols}))});}catch(e){s.status(500).json({error:"Failed to read inbox",detail:String(e)});}}),d.get("/file-requests",(i,s)=>{try{D();let e=i.query.status,n;(e==="pending"||e==="approved"||e==="denied"||e==="expired")&&(n=e);let r=z(n).map(t=>({requestId:t.request.requestId,filePath:t.request.filePath,reason:t.request.reason,requester:{id:t.request.requester.id,name:t.request.requester.name},urgency:t.request.urgency,snippet:t.request.snippet,status:t.status,createdAt:t.createdAt,resolvedAt:t.resolvedAt,denyReason:t.denyReason}));s.json({fileRequests:r});}catch(e){s.status(500).json({error:"Failed to list file requests",detail:String(e)});}}),d.post("/file-requests/:requestId/action",(i,s)=>{try{let{requestId:e}=i.params,{action:n,reason:a}=i.body;if(!n){s.status(400).json({error:"action is required"});return}if(n==="deny"){let o=B(e,a);s.json({success:o,requestId:e,action:"denied",reason:a});return}let r=n==="approve-redacted",t=A(e,u$1,r);if(!t.success){s.status(400).json({success:!1,requestId:e,error:t.error});return}s.json({success:!0,requestId:e,action:r?"approved-redacted":"approved",filePath:t.delivery?.filePath,size:t.delivery?.size});}catch(e){s.status(500).json({error:"Failed to handle file request",detail:String(e)});}}),d.get("/status",(i,s$1)=>{try{g();let e=f(),n=e.filter(f=>!j(f)).length,a=s("active"),r=c(u$1),t=m(r),o=z("pending");s$1.json({agentCount:e.length,awakeCount:n,asleepCount:e.length-n,activeThreadCount:a.length,unreadCount:t.length,pendingFileRequests:o.length});}catch(e){s$1.status(500).json({error:"Failed to get status",detail:String(e)});}}),d}export{G as createSymphonyRouter};
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- export{c as SCORE_DIR,z as acknowledgeMessages,h as appendJsonlLine,u as appendToInbox,w as appendToOutbox,O as approveFileRequest,I as buildMessage,m as cleanStaleAgents,L as createFileRequest,C as createThread,P as denyFileRequest,r as discoverClaudeCodeSessions,e as ensureMailDirs,d as ensureScoreDirs,S as expireOldRequests,B as garbageCollect,f as getAgentDir,n as getMyIdentity,H as getThreadMessages,q as isAgentAsleep,R as isPathAutoApproved,Q as isPathDenied,a as isRing1Content,l as listAgents,N as listFileRequests,E as listThreads,M as loadFileRequest,D as loadThread,K as loadTrustConfig,o as markAgentPollTime,s as peekInbox,A as readAck,v as readInbox,g as readJsonlFile,y as readOutbox,x as readOutboxRaw,t as recordAckSize,b as recordRing1Interception,j as registerAgent,i as resolveAgentIdentity,G as resolveThread,J as routeMessage,k as unregisterAgent,p as updateAgentStatus,F as updateThread}from'./chunk-IW5K3RNR.js';import'./chunk-EMMMBAID.js';import'./chunk-F5BSUC2L.js';import'./chunk-XHJ27CER.js';
2
+ export{c as SCORE_DIR,z as acknowledgeMessages,h as appendJsonlLine,u as appendToInbox,w as appendToOutbox,O as approveFileRequest,I as buildMessage,m as cleanStaleAgents,L as createFileRequest,C as createThread,P as denyFileRequest,r as discoverClaudeCodeSessions,e as ensureMailDirs,d as ensureScoreDirs,S as expireOldRequests,B as garbageCollect,f as getAgentDir,n as getMyIdentity,H as getThreadMessages,q as isAgentAsleep,R as isPathAutoApproved,Q as isPathDenied,a as isRing1Content,l as listAgents,N as listFileRequests,E as listThreads,M as loadFileRequest,D as loadThread,K as loadTrustConfig,o as markAgentPollTime,s as peekInbox,A as readAck,v as readInbox,g as readJsonlFile,y as readOutbox,x as readOutboxRaw,t as recordAckSize,b as recordRing1Interception,j as registerAgent,i as resolveAgentIdentity,G as resolveThread,J as routeMessage,k as unregisterAgent,p as updateAgentStatus,F as updateThread}from'./chunk-ZUAUFZRJ.js';import'./chunk-3KVVC4WV.js';import'./chunk-EK4ZRIFJ.js';import'./chunk-5TAVYPOV.js';
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import'./chunk-XHJ27CER.js';import*as n from'fs';import*as f from'path';import*as p from'os';import*as s from'crypto';var d=f.join(p.homedir(),".paradigm","score"),a=f.join(d,"peers.json"),g=300*1e3;function i(){try{if(!n.existsSync(a))return [];let r=n.readFileSync(a,"utf-8"),e=JSON.parse(r);return Array.isArray(e)?e:[]}catch{return []}}function c(r){n.existsSync(d)||n.mkdirSync(d,{recursive:true}),n.writeFileSync(a,JSON.stringify(r,null,2),{mode:384});}function S(r){return i().find(t=>t.id===r)??null}function l(r){let e=i(),t=e.findIndex(o=>o.id===r.id);t>=0?e[t]=r:e.push(r),c(e);}function m(r){let e=i(),t=e.find(o=>o.id===r);return t?(t.revoked=true,c(e),true):false}function x(){let e=i().length;return n.existsSync(a)&&n.unlinkSync(a),e}function y(r){let e=i(),t=e.find(o=>o.id===r);t&&(t.lastSeen=new Date().toISOString(),c(e));}function P(r,e){let t=i(),o=t.find(u=>u.id===r);o&&(o.agents=e,c(t));}function A(){let r=s.randomBytes(32).toString("hex"),e=(parseInt(s.randomBytes(3).toString("hex"),16)%1e6).toString().padStart(6,"0"),t=s.createHash("sha256").update(e).digest("hex");return {code:e,codeHash:t,sharedSecret:r,createdAt:Date.now()}}function v(r,e){return Date.now()-r.createdAt>g?false:s.createHash("sha256").update(e).digest("hex")===r.codeHash}function h(r,e){return s.createHmac("sha256",e).update(r).digest("hex")}function R(r,e,t){let o=h(r,e);if(o.length!==t.length)return false;try{return s.timingSafeEqual(Buffer.from(o,"hex"),Buffer.from(t,"hex"))}catch{return false}}export{g as PAIRING_TTL_MS,a as PEERS_FILE,l as addPeer,h as computeHmacProof,S as findPeer,x as forgetAllPeers,A as generatePairing,i as loadPeers,m as revokePeer,c as savePeers,P as updatePeerAgents,y as updatePeerLastSeen,R as verifyHmacProof,v as verifyPairingCode};
2
+ import'./chunk-5TAVYPOV.js';import*as n from'fs';import*as f from'path';import*as p from'os';import*as s from'crypto';var d=f.join(p.homedir(),".paradigm","score"),a=f.join(d,"peers.json"),g=300*1e3;function i(){try{if(!n.existsSync(a))return [];let r=n.readFileSync(a,"utf-8"),e=JSON.parse(r);return Array.isArray(e)?e:[]}catch{return []}}function c(r){n.existsSync(d)||n.mkdirSync(d,{recursive:true}),n.writeFileSync(a,JSON.stringify(r,null,2),{mode:384});}function S(r){return i().find(t=>t.id===r)??null}function l(r){let e=i(),t=e.findIndex(o=>o.id===r.id);t>=0?e[t]=r:e.push(r),c(e);}function m(r){let e=i(),t=e.find(o=>o.id===r);return t?(t.revoked=true,c(e),true):false}function x(){let e=i().length;return n.existsSync(a)&&n.unlinkSync(a),e}function y(r){let e=i(),t=e.find(o=>o.id===r);t&&(t.lastSeen=new Date().toISOString(),c(e));}function P(r,e){let t=i(),o=t.find(u=>u.id===r);o&&(o.agents=e,c(t));}function A(){let r=s.randomBytes(32).toString("hex"),e=(parseInt(s.randomBytes(3).toString("hex"),16)%1e6).toString().padStart(6,"0"),t=s.createHash("sha256").update(e).digest("hex");return {code:e,codeHash:t,sharedSecret:r,createdAt:Date.now()}}function v(r,e){return Date.now()-r.createdAt>g?false:s.createHash("sha256").update(e).digest("hex")===r.codeHash}function h(r,e){return s.createHmac("sha256",e).update(r).digest("hex")}function R(r,e,t){let o=h(r,e);if(o.length!==t.length)return false;try{return s.timingSafeEqual(Buffer.from(o,"hex"),Buffer.from(t,"hex"))}catch{return false}}export{g as PAIRING_TTL_MS,a as PEERS_FILE,l as addPeer,h as computeHmacProof,S as findPeer,x as forgetAllPeers,A as generatePairing,i as loadPeers,m as revokePeer,c as savePeers,P as updatePeerAgents,y as updatePeerLastSeen,R as verifyHmacProof,v as verifyPairingCode};
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- export{b as PAIRING_TTL_MS,a as PEERS_FILE,f as addPeer,m as computeHmacProof,e as findPeer,h as forgetAllPeers,k as generatePairing,c as loadPeers,g as revokePeer,d as savePeers,j as updatePeerAgents,i as updatePeerLastSeen,n as verifyHmacProof,l as verifyPairingCode}from'./chunk-J32OPJEX.js';import'./chunk-XHJ27CER.js';
2
+ export{b as PAIRING_TTL_MS,a as PEERS_FILE,f as addPeer,m as computeHmacProof,e as findPeer,h as forgetAllPeers,k as generatePairing,c as loadPeers,g as revokePeer,d as savePeers,j as updatePeerAgents,i as updatePeerLastSeen,n as verifyHmacProof,l as verifyPairingCode}from'./chunk-J32OPJEX.js';import'./chunk-5TAVYPOV.js';
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
- import {k,l,n,f as f$1,m as m$1,c as c$1,j,i}from'./chunk-J32OPJEX.js';import {a,b,f as f$2,l as l$1,n as n$1,j as j$1}from'./chunk-JIF7OSGH.js';import'./chunk-7SWEOPWF.js';import'./chunk-DSYEGRQ2.js';import'./chunk-XHJ27CER.js';import*as v from'fs';import*as m from'path';import*as A from'os';import*as f from'crypto';import {WebSocketServer,WebSocket}from'ws';var J=m.join(A.homedir(),".paradigm","score"),D=2e3,N=3e4,L=1e4,H=3,U=6e4,R=1e3,K=3e4;function c(p,e){p.readyState===WebSocket.OPEN&&p.send(JSON.stringify(e));}function C(p){try{let e=typeof p=="string"?p:String(p);return JSON.parse(e)}catch{return null}}var F=class p{wss=null;wsClient=null;mode;pairingState=null;connectedPeers=new Map;seenMessageIds=new Set;outboxWatchInterval=null;keepaliveInterval=null;reconnectTimer=null;reconnectDelay=R;outboxPositions=new Map;events;myPeerId;port;stopped=false;failedAuthAttempts=new Map;pongTimers=new Map;serverAddress=null;serverCode=null;static MAX_SEEN_IDS=1e4;constructor(e){this.mode=e.mode,this.myPeerId=e.peerId,this.port=e.port??3939,this.events=e.events??{};}async startServer(){if(this.mode!=="server")throw new Error('startServer() requires mode "server"');return this.pairingState=k(),this.wss=new WebSocketServer({port:this.port}),this.wss.on("connection",(e,t)=>{let n=t.socket.remoteAddress??"unknown";if(this.isRateLimited(n)){c(e,{type:"auth_fail",reason:"Too many failed attempts \u2014 try again later"}),e.close();return}let s=f.randomBytes(32).toString("hex");c(e,{type:"hello",version:"1.0",peerId:this.myPeerId,challenge:s});let i=false;e.on("message",r=>{let o=C(r);if(o){if(!i){this.handleServerAuth(e,o,s,n).then(a=>{a&&(i=true,this.registerPeerConnection(a,e));}).catch(a=>{this.events.onError?.(a instanceof Error?a:new Error(String(a)));});return}this.handleAuthenticatedFrame(e,o);}}),e.on("close",()=>{i&&this.handlePeerDisconnect(e);}),e.on("error",r=>{this.events.onError?.(r);});}),this.wss.on("error",e=>{this.events.onError?.(e);}),await new Promise((e,t)=>{this.wss.on("listening",e),this.wss.on("error",t);}),this.startOutboxWatcher(),this.startKeepalive(),this.pairingState}async handleServerAuth(e,t,n$1,s){if(t.type!=="auth")return c(e,{type:"auth_fail",reason:"Expected auth frame"}),e.close(),null;if(!this.pairingState||!l(this.pairingState,t.code)){this.recordFailedAuth(s);let a="Invalid or expired pairing code";return c(e,{type:"auth_fail",reason:a}),this.events.onPeerAuthFailed?.(s,a),e.close(),null}let i=this.pairingState.codeHash;if(!n(n$1,i,t.proof)){this.recordFailedAuth(s);let a="HMAC proof verification failed";return c(e,{type:"auth_fail",reason:a}),this.events.onPeerAuthFailed?.(s,a),e.close(),null}let r=this.getLocalAgentSummaries(),o=this.myPeerId;return c(e,{type:"auth_ok",peerId:this.myPeerId,displayName:o,agents:r}),f$1({id:t.peerId,displayName:t.peerId,address:s,sharedSecret:this.pairingState.sharedSecret,connectedAt:new Date().toISOString(),lastSeen:new Date().toISOString(),revoked:false,agents:[]}),t.peerId}async connectToServer(e,t){if(this.mode!=="client")throw new Error('connectToServer() requires mode "client"');this.serverAddress=e,this.serverCode=t,await this.attemptConnection(e,t);}attemptConnection(e,t){return new Promise((n,s)=>{if(this.stopped){s(new Error("Relay has been stopped"));return}let i=e.includes("://")?e:`ws://${e}`,r=new WebSocket(i),o=false;r.on("open",()=>{this.wsClient=r;}),r.on("message",a=>{let d=C(a);if(d)switch(d.type){case "hello":{let x=f.createHash("sha256").update(t).digest("hex"),O=m$1(d.challenge,x);c(r,{type:"auth",peerId:this.myPeerId,code:t,proof:O});break}case "auth_ok":{f$1({id:d.peerId,displayName:d.displayName,address:e,sharedSecret:t,connectedAt:new Date().toISOString(),lastSeen:new Date().toISOString(),revoked:false,agents:d.agents}),c(r,{type:"agents_sync",agents:this.getLocalAgentSummaries()}),this.registerPeerConnection(d.peerId,r),this.startOutboxWatcher(),this.startKeepalive(),this.reconnectDelay=R,o||(o=true,n());break}case "auth_fail":{o||(o=true,s(new Error(`Auth failed: ${d.reason}`))),r.close();break}default:this.handleAuthenticatedFrame(r,d);break}}),r.on("close",()=>{this.handlePeerDisconnect(r),o?this.stopped||this.scheduleReconnect():(o=true,s(new Error("Connection closed before auth completed")));}),r.on("error",a=>{this.events.onError?.(a),o||(o=true,s(a));});})}handleAuthenticatedFrame(e,t){switch(t.type){case "message":this.handleIncomingMessage(e,t.message,t.origin);break;case "message_ack":break;case "nomination_forward":this.handleNominationForward(e,t.nomination,t.origin);break;case "agents_sync":this.handleAgentsSync(e,t.agents);break;case "agent_joined":{let n=this.peerIdForSocket(e);if(n){let i=c$1().find(r=>r.id===n);if(i){let r=[...i.agents||[],t.agent];j(n,r);}}break}case "agent_left":{let n=this.peerIdForSocket(e);if(n){let i=c$1().find(r=>r.id===n);if(i){let r=(i.agents||[]).filter(o=>o.id!==t.agentId);j(n,r);}}break}case "peer_leaving":this.handlePeerDisconnect(e),e.close();break;case "ping":c(e,{type:"pong"});break;case "pong":this.handlePong(e);break;}}handleIncomingMessage(e,t,n){if(a(t)){b(t.sender.id,t,"cross-project-transfer"),c(e,{type:"message_ack",messageId:t.id});return}if(this.seenMessageIds.has(t.id)){c(e,{type:"message_ack",messageId:t.id});return}this.addToSeenIds(t.id);let s=f$2();if(t.recipients&&t.recipients.length>0)for(let i of t.recipients){let r=s.find(o=>o.id===i.id);r&&(l$1(r.id,t),this.events.onMessageRelayed?.(t.id,n,r.id));}else for(let i of s)l$1(i.id,t),this.events.onMessageRelayed?.(t.id,n,i.id);if(this.mode==="server"){let i=this.peerIdForSocket(e);for(let[r,o]of this.connectedPeers)r!==i&&r!==n&&c(o,{type:"message",message:t,origin:n});}c(e,{type:"message_ack",messageId:t.id});}handleNominationForward(e,t,n){if(!t?.id)return;let s={...t,remote_origin:n,forwarded_at:new Date().toISOString()};try{let i=m.join(A.homedir(),".paradigm","events");v.mkdirSync(i,{recursive:!0});let r=m.join(i,"nominations.jsonl");v.appendFileSync(r,JSON.stringify(s)+`
2
+ import {k,l,n,f as f$1,m as m$1,c as c$1,j,i}from'./chunk-J32OPJEX.js';import {a,b,f as f$2,l as l$1,n as n$1,j as j$1}from'./chunk-CVPKQ3JH.js';import'./chunk-7SWEOPWF.js';import'./chunk-MBPLJKE5.js';import'./chunk-5TAVYPOV.js';import*as v from'fs';import*as m from'path';import*as A from'os';import*as f from'crypto';import {WebSocketServer,WebSocket}from'ws';var J=m.join(A.homedir(),".paradigm","score"),D=2e3,N=3e4,L=1e4,H=3,U=6e4,R=1e3,K=3e4;function c(p,e){p.readyState===WebSocket.OPEN&&p.send(JSON.stringify(e));}function C(p){try{let e=typeof p=="string"?p:String(p);return JSON.parse(e)}catch{return null}}var F=class p{wss=null;wsClient=null;mode;pairingState=null;connectedPeers=new Map;seenMessageIds=new Set;outboxWatchInterval=null;keepaliveInterval=null;reconnectTimer=null;reconnectDelay=R;outboxPositions=new Map;events;myPeerId;port;stopped=false;failedAuthAttempts=new Map;pongTimers=new Map;serverAddress=null;serverCode=null;static MAX_SEEN_IDS=1e4;constructor(e){this.mode=e.mode,this.myPeerId=e.peerId,this.port=e.port??3939,this.events=e.events??{};}async startServer(){if(this.mode!=="server")throw new Error('startServer() requires mode "server"');return this.pairingState=k(),this.wss=new WebSocketServer({port:this.port}),this.wss.on("connection",(e,t)=>{let n=t.socket.remoteAddress??"unknown";if(this.isRateLimited(n)){c(e,{type:"auth_fail",reason:"Too many failed attempts \u2014 try again later"}),e.close();return}let s=f.randomBytes(32).toString("hex");c(e,{type:"hello",version:"1.0",peerId:this.myPeerId,challenge:s});let i=false;e.on("message",r=>{let o=C(r);if(o){if(!i){this.handleServerAuth(e,o,s,n).then(a=>{a&&(i=true,this.registerPeerConnection(a,e));}).catch(a=>{this.events.onError?.(a instanceof Error?a:new Error(String(a)));});return}this.handleAuthenticatedFrame(e,o);}}),e.on("close",()=>{i&&this.handlePeerDisconnect(e);}),e.on("error",r=>{this.events.onError?.(r);});}),this.wss.on("error",e=>{this.events.onError?.(e);}),await new Promise((e,t)=>{this.wss.on("listening",e),this.wss.on("error",t);}),this.startOutboxWatcher(),this.startKeepalive(),this.pairingState}async handleServerAuth(e,t,n$1,s){if(t.type!=="auth")return c(e,{type:"auth_fail",reason:"Expected auth frame"}),e.close(),null;if(!this.pairingState||!l(this.pairingState,t.code)){this.recordFailedAuth(s);let a="Invalid or expired pairing code";return c(e,{type:"auth_fail",reason:a}),this.events.onPeerAuthFailed?.(s,a),e.close(),null}let i=this.pairingState.codeHash;if(!n(n$1,i,t.proof)){this.recordFailedAuth(s);let a="HMAC proof verification failed";return c(e,{type:"auth_fail",reason:a}),this.events.onPeerAuthFailed?.(s,a),e.close(),null}let r=this.getLocalAgentSummaries(),o=this.myPeerId;return c(e,{type:"auth_ok",peerId:this.myPeerId,displayName:o,agents:r}),f$1({id:t.peerId,displayName:t.peerId,address:s,sharedSecret:this.pairingState.sharedSecret,connectedAt:new Date().toISOString(),lastSeen:new Date().toISOString(),revoked:false,agents:[]}),t.peerId}async connectToServer(e,t){if(this.mode!=="client")throw new Error('connectToServer() requires mode "client"');this.serverAddress=e,this.serverCode=t,await this.attemptConnection(e,t);}attemptConnection(e,t){return new Promise((n,s)=>{if(this.stopped){s(new Error("Relay has been stopped"));return}let i=e.includes("://")?e:`ws://${e}`,r=new WebSocket(i),o=false;r.on("open",()=>{this.wsClient=r;}),r.on("message",a=>{let d=C(a);if(d)switch(d.type){case "hello":{let x=f.createHash("sha256").update(t).digest("hex"),O=m$1(d.challenge,x);c(r,{type:"auth",peerId:this.myPeerId,code:t,proof:O});break}case "auth_ok":{f$1({id:d.peerId,displayName:d.displayName,address:e,sharedSecret:t,connectedAt:new Date().toISOString(),lastSeen:new Date().toISOString(),revoked:false,agents:d.agents}),c(r,{type:"agents_sync",agents:this.getLocalAgentSummaries()}),this.registerPeerConnection(d.peerId,r),this.startOutboxWatcher(),this.startKeepalive(),this.reconnectDelay=R,o||(o=true,n());break}case "auth_fail":{o||(o=true,s(new Error(`Auth failed: ${d.reason}`))),r.close();break}default:this.handleAuthenticatedFrame(r,d);break}}),r.on("close",()=>{this.handlePeerDisconnect(r),o?this.stopped||this.scheduleReconnect():(o=true,s(new Error("Connection closed before auth completed")));}),r.on("error",a=>{this.events.onError?.(a),o||(o=true,s(a));});})}handleAuthenticatedFrame(e,t){switch(t.type){case "message":this.handleIncomingMessage(e,t.message,t.origin);break;case "message_ack":break;case "nomination_forward":this.handleNominationForward(e,t.nomination,t.origin);break;case "agents_sync":this.handleAgentsSync(e,t.agents);break;case "agent_joined":{let n=this.peerIdForSocket(e);if(n){let i=c$1().find(r=>r.id===n);if(i){let r=[...i.agents||[],t.agent];j(n,r);}}break}case "agent_left":{let n=this.peerIdForSocket(e);if(n){let i=c$1().find(r=>r.id===n);if(i){let r=(i.agents||[]).filter(o=>o.id!==t.agentId);j(n,r);}}break}case "peer_leaving":this.handlePeerDisconnect(e),e.close();break;case "ping":c(e,{type:"pong"});break;case "pong":this.handlePong(e);break;}}handleIncomingMessage(e,t,n){if(a(t)){b(t.sender.id,t,"cross-project-transfer"),c(e,{type:"message_ack",messageId:t.id});return}if(this.seenMessageIds.has(t.id)){c(e,{type:"message_ack",messageId:t.id});return}this.addToSeenIds(t.id);let s=f$2();if(t.recipients&&t.recipients.length>0)for(let i of t.recipients){let r=s.find(o=>o.id===i.id);r&&(l$1(r.id,t),this.events.onMessageRelayed?.(t.id,n,r.id));}else for(let i of s)l$1(i.id,t),this.events.onMessageRelayed?.(t.id,n,i.id);if(this.mode==="server"){let i=this.peerIdForSocket(e);for(let[r,o]of this.connectedPeers)r!==i&&r!==n&&c(o,{type:"message",message:t,origin:n});}c(e,{type:"message_ack",messageId:t.id});}handleNominationForward(e,t,n){if(!t?.id)return;let s={...t,remote_origin:n,forwarded_at:new Date().toISOString()};try{let i=m.join(A.homedir(),".paradigm","events");v.mkdirSync(i,{recursive:!0});let r=m.join(i,"nominations.jsonl");v.appendFileSync(r,JSON.stringify(s)+`
3
3
  `,"utf8");}catch{}if(this.mode==="server")for(let[i,r]of this.connectedPeers)r!==e&&r.readyState===WebSocket.OPEN&&c(r,{type:"nomination_forward",nomination:s,origin:n});c(e,{type:"nomination_ack",nominationId:t.id});}handleAgentsSync(e,t){let n=this.peerIdForSocket(e);n&&(j(n,t),i(n));}startOutboxWatcher(){this.outboxWatchInterval||(this.outboxWatchInterval=setInterval(()=>{if(this.connectedPeers.size!==0)try{let e=f$2();for(let t of e){let n=n$1(t.id),s=this.outboxPositions.get(t.id)??0;if(n.length<=s){this.outboxPositions.set(t.id,n.length);continue}this.outboxPositions.set(t.id,n.length);let i=n.slice(s);for(let r of i){if(a(r)||this.seenMessageIds.has(r.id))continue;this.addToSeenIds(r.id);let o={type:"message",message:r,origin:this.myPeerId};for(let[a,d]of this.connectedPeers)c(d,o);}}}catch(e){this.events.onError?.(e instanceof Error?e:new Error(String(e)));}},D));}stopOutboxWatcher(){this.outboxWatchInterval&&(clearInterval(this.outboxWatchInterval),this.outboxWatchInterval=null);}startKeepalive(){this.keepaliveInterval||(this.keepaliveInterval=setInterval(()=>{for(let[e,t]of this.connectedPeers){c(t,{type:"ping"});let n=setTimeout(()=>{this.handlePeerDisconnect(t),t.terminate();},L);this.pongTimers.set(e,n);}},N));}stopKeepalive(){this.keepaliveInterval&&(clearInterval(this.keepaliveInterval),this.keepaliveInterval=null);for(let e of this.pongTimers.values())clearTimeout(e);this.pongTimers.clear();}handlePong(e){let t=this.peerIdForSocket(e);if(t){let n=this.pongTimers.get(t);n&&(clearTimeout(n),this.pongTimers.delete(t)),i(t);}}registerPeerConnection(e,t){let n=this.connectedPeers.get(e);n&&n!==t&&n.close(),this.connectedPeers.set(e,t),i(e),this.events.onPeerConnected?.(e,e);}handlePeerDisconnect(e){let t=this.peerIdForSocket(e);if(!t)return;this.connectedPeers.delete(t);let n=this.pongTimers.get(t);n&&(clearTimeout(n),this.pongTimers.delete(t)),this.events.onPeerDisconnected?.(t);}peerIdForSocket(e){for(let[t,n]of this.connectedPeers)if(n===e)return t;return null}scheduleReconnect(){if(this.stopped||this.mode!=="client"||!this.serverAddress||!this.serverCode)return;this.stopOutboxWatcher(),this.stopKeepalive(),this.wsClient=null;let e=this.reconnectDelay;this.reconnectDelay=Math.min(this.reconnectDelay*2,K),this.reconnectTimer=setTimeout(()=>{this.stopped||this.attemptConnection(this.serverAddress,this.serverCode).catch(t=>{this.events.onError?.(t instanceof Error?t:new Error(String(t)));});},e);}isRateLimited(e){let t=this.failedAuthAttempts.get(e);return t?Date.now()<t.cooldownUntil?true:t.count>=H?(t.cooldownUntil=Date.now()+U,true):false:false}recordFailedAuth(e){let t=this.failedAuthAttempts.get(e);t?t.count++:this.failedAuthAttempts.set(e,{count:1,cooldownUntil:0});}addToSeenIds(e){if(this.seenMessageIds.add(e),this.seenMessageIds.size>p.MAX_SEEN_IDS){let t=Array.from(this.seenMessageIds),n=Math.floor(t.length/2);this.seenMessageIds=new Set(t.slice(n));}}getLocalAgentSummaries(){return f$2().map(e=>({id:e.id,project:e.project,role:e.role,status:j$1(e)?"asleep":"awake"}))}stop(){this.stopped=true;for(let[e,t]of this.connectedPeers)c(t,{type:"peer_leaving"}),t.close();this.connectedPeers.clear(),this.wsClient&&(this.wsClient.close(),this.wsClient=null),this.stopOutboxWatcher(),this.stopKeepalive(),this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null),this.wss&&(this.wss.close(),this.wss=null);}getConnectedPeers(){return Array.from(this.connectedPeers.keys())}getRemoteAgents(){let e=[],t=c$1();for(let n of this.connectedPeers.keys()){let s=t.find(i=>i.id===n);if(s?.agents)for(let i of s.agents)e.push({...i,peerId:n});}return e}rotatePairingCode(){if(this.mode!=="server")throw new Error('rotatePairingCode() requires mode "server"');return this.pairingState=k(),this.pairingState}};export{J as SCORE_DIR,F as SymphonyRelay};
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- export{a as syncCommand}from'./chunk-3XGNXXCT.js';import'./chunk-DOCDDDTD.js';import'./chunk-JQKKVAAN.js';import'./chunk-LKAT7IAK.js';import'./chunk-XHJ27CER.js';
2
+ export{a as syncCommand}from'./chunk-3XGNXXCT.js';import'./chunk-DOCDDDTD.js';import'./chunk-JQKKVAAN.js';import'./chunk-LKAT7IAK.js';import'./chunk-5TAVYPOV.js';
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import {d}from'./chunk-DOCDDDTD.js';import'./chunk-JQKKVAAN.js';import {a as a$1}from'./chunk-LKAT7IAK.js';import'./chunk-XHJ27CER.js';import*as a from'fs';import*as c from'path';import*as j from'js-yaml';import p from'chalk';import $ from'ora';async function x(y){let r=process.cwd(),e=$();console.log(p.blue(`
2
+ import {d}from'./chunk-DOCDDDTD.js';import'./chunk-JQKKVAAN.js';import {a as a$1}from'./chunk-LKAT7IAK.js';import'./chunk-5TAVYPOV.js';import*as a from'fs';import*as c from'path';import*as j from'js-yaml';import p from'chalk';import $ from'ora';async function x(y){let r=process.cwd(),e=$();console.log(p.blue(`
3
3
  Paradigm Sync LLMs
4
4
  `)),e.start("Loading .paradigm/ configuration...");let i=d(r);i||(e.fail("No .paradigm/ directory found"),console.log(p.gray("\nRun `paradigm init` to initialize Paradigm in this project.\n")),a$1.command("sync-llms").error("Missing .paradigm/ directory"),process.exit(1)),e.succeed(`Loaded configuration for ${p.cyan(i.projectName)}`),a$1.command("sync-llms").debug("Configuration loaded",{projectName:i.projectName}),e.start("Reading navigator.yaml...");let g=null,h=c.join(r,".paradigm","navigator.yaml");if(a.existsSync(h))try{let n=a.readFileSync(h,"utf8");g=j.load(n),e.succeed("Loaded navigator.yaml");}catch{e.warn("Could not parse navigator.yaml, skipping key files section"),a$1.command("sync-llms").warn("Failed to parse navigator.yaml");}else e.info("No navigator.yaml found, skipping key files section");let o=null,f=c.join(r,".paradigm","flows.yaml");if(a.existsSync(f))try{let n=a.readFileSync(f,"utf8");o=j.load(n);}catch{a$1.command("sync-llms").warn("Failed to parse flows.yaml");}let d$1=null,m=c.join(r,"portal.yaml");if(a.existsSync(m))try{let n=a.readFileSync(m,"utf8");d$1=j.load(n);}catch{a$1.command("sync-llms").warn("Failed to parse portal.yaml");}e.start("Generating llms.txt...");let w=b(i,g,o,d$1),t=y.output?c.resolve(r,y.output):c.join(r,"llms.txt");try{a.writeFileSync(t,w,"utf8"),e.succeed(p.green("Generated llms.txt")),console.log(p.gray(`
5
5
  Path: ${c.relative(r,t)}`)),console.log(""),a$1.command("sync-llms").success("llms.txt generated",{path:t});}catch(n){e.fail(p.red("Failed to write llms.txt")),a$1.command("sync-llms").error("Write failed",{error:n.message}),process.exit(1);}}function b(y,r,e,i){let{config:g,projectName:h}=y,o=[];o.push(`# ${g.project||h}`);let f=g["agent-guidelines"]?.overview?.trim();f&&o.push(`> ${f.replace(/\n/g,`
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- export{e as completeTask,c as createTask,b as loadTask,a as loadTasks,g as rebuildTaskIndex,f as shelveTask,d as updateTask}from'./chunk-DVZWCXB6.js';import'./chunk-XHJ27CER.js';
2
+ export{e as completeTask,c as createTask,b as loadTask,a as loadTasks,g as rebuildTaskIndex,f as shelveTask,d as updateTask}from'./chunk-DVZWCXB6.js';import'./chunk-5TAVYPOV.js';
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- export{e as teamAcceptCommand,f as teamCheckCommand,d as teamHandoffCommand,g as teamHistoryCommand,b as teamInitCommand,a as teamModelsCommand,h as teamResetCommand,c as teamStatusCommand}from'./chunk-JUOOVKK6.js';import'./chunk-7PB7AXQE.js';import'./chunk-TYWB5IQJ.js';import'./chunk-5YHR77AL.js';import'./chunk-RN35IVA2.js';import'./chunk-AO7ZSRME.js';import'./chunk-FYDRENK7.js';import'./chunk-Y4XFVDZC.js';import'./chunk-EKZDFEJW.js';import'./chunk-SHD27BQX.js';import'./chunk-T6IDXUUA.js';import'./chunk-JIXHEBGK.js';import'./chunk-QT2LKB3P.js';import'./chunk-XHJ27CER.js';
2
+ export{e as teamAcceptCommand,f as teamCheckCommand,d as teamHandoffCommand,g as teamHistoryCommand,b as teamInitCommand,a as teamModelsCommand,h as teamResetCommand,c as teamStatusCommand}from'./chunk-KFNHCQ4R.js';import'./chunk-J6KWGCHN.js';import'./chunk-TYWB5IQJ.js';import'./chunk-ORDKEGII.js';import'./chunk-BV5PRPLB.js';import'./chunk-AO7ZSRME.js';import'./chunk-FYDRENK7.js';import'./chunk-Y4XFVDZC.js';import'./chunk-EKZDFEJW.js';import'./chunk-SHD27BQX.js';import'./chunk-T6IDXUUA.js';import'./chunk-JIXHEBGK.js';import'./chunk-QT2LKB3P.js';import'./chunk-5TAVYPOV.js';
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import {a}from'./chunk-QT2LKB3P.js';import'./chunk-XHJ27CER.js';import*as y from'path';import*as h from'fs';import p from'chalk';var R=null;function G(e){R=e;}function k(){return R}async function O(e,s,t){let n=t||k();if(!n)return {passed:false,results:[],errors:["No gate client configured"]};let o=[],r=[];for(let i of s)try{let c=await n.check(e,i.entity),u=c.passed===i.expected;if(i.expectedPrizes&&c.passed){let a=c.triggeredPrizes.map(l=>l.id),f=i.expectedPrizes.filter(l=>!a.includes(l));f.length>0&&r.push(`Test "${i.name}": Expected prizes not triggered: ${f.join(", ")}`);}o.push({testCase:i,result:c,passed:u}),u||r.push(`Test "${i.name}": Expected ${i.expected?"pass":"fail"}, got ${c.passed?"pass":"fail"}`);}catch(c){r.push(`Test "${i.name}": ${c.message}`),o.push({testCase:i,result:{gate:{id:e,locks:[],prizes:[]},passed:false,lockResults:[],triggeredPrizes:[],timestamp:Date.now()},passed:false});}return {passed:r.length===0,results:o,errors:r}}async function T(e,s={}){let{outputDir:t="tests/gates",framework:n="jest",includeFlows:o=true}=s,r=await a(e),i=[],c=y.resolve(t);h.existsSync(c)||h.mkdirSync(c,{recursive:true});for(let u of r.gates){let a=N(u,n),f=`${u.id.replace(/[^a-z0-9]/gi,"-")}.test.ts`,l=y.join(c,f);h.writeFileSync(l,a,"utf8"),i.push(l);}if(o&&r.flows.length>0){let u=y.join(c,"..","flows");h.existsSync(u)||h.mkdirSync(u,{recursive:true});for(let a of r.flows){let f=z(a,r.gates,n),l=`${a.id.replace(/[^a-z0-9]/gi,"-")}.test.ts`,d=y.join(u,l);h.writeFileSync(d,f,"utf8"),i.push(d);}}return i}function N(e,s){let t=s==="mocha"||s==="vitest"?"it":"test",n=e.id,o=e.description||n,r=e.locks.map(i=>{let c=i.keys.map((u,a)=>` ${t}('should check key: ${u.description||`Key ${a+1}`}', async () => {
2
+ import {a}from'./chunk-QT2LKB3P.js';import'./chunk-5TAVYPOV.js';import*as y from'path';import*as h from'fs';import p from'chalk';var R=null;function G(e){R=e;}function k(){return R}async function O(e,s,t){let n=t||k();if(!n)return {passed:false,results:[],errors:["No gate client configured"]};let o=[],r=[];for(let i of s)try{let c=await n.check(e,i.entity),u=c.passed===i.expected;if(i.expectedPrizes&&c.passed){let a=c.triggeredPrizes.map(l=>l.id),f=i.expectedPrizes.filter(l=>!a.includes(l));f.length>0&&r.push(`Test "${i.name}": Expected prizes not triggered: ${f.join(", ")}`);}o.push({testCase:i,result:c,passed:u}),u||r.push(`Test "${i.name}": Expected ${i.expected?"pass":"fail"}, got ${c.passed?"pass":"fail"}`);}catch(c){r.push(`Test "${i.name}": ${c.message}`),o.push({testCase:i,result:{gate:{id:e,locks:[],prizes:[]},passed:false,lockResults:[],triggeredPrizes:[],timestamp:Date.now()},passed:false});}return {passed:r.length===0,results:o,errors:r}}async function T(e,s={}){let{outputDir:t="tests/gates",framework:n="jest",includeFlows:o=true}=s,r=await a(e),i=[],c=y.resolve(t);h.existsSync(c)||h.mkdirSync(c,{recursive:true});for(let u of r.gates){let a=N(u,n),f=`${u.id.replace(/[^a-z0-9]/gi,"-")}.test.ts`,l=y.join(c,f);h.writeFileSync(l,a,"utf8"),i.push(l);}if(o&&r.flows.length>0){let u=y.join(c,"..","flows");h.existsSync(u)||h.mkdirSync(u,{recursive:true});for(let a of r.flows){let f=z(a,r.gates,n),l=`${a.id.replace(/[^a-z0-9]/gi,"-")}.test.ts`,d=y.join(u,l);h.writeFileSync(d,f,"utf8"),i.push(d);}}return i}function N(e,s){let t=s==="mocha"||s==="vitest"?"it":"test",n=e.id,o=e.description||n,r=e.locks.map(i=>{let c=i.keys.map((u,a)=>` ${t}('should check key: ${u.description||`Key ${a+1}`}', async () => {
3
3
  const entity = {
4
4
  // TODO: Add entity properties needed for this key
5
5
  // Key expression: ${u.expression}
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import'./chunk-XHJ27CER.js';import*as o from'fs';import*as f from'path';import c from'chalk';import*as p from'js-yaml';var b=`# Thread - Session Continuity
2
+ import'./chunk-5TAVYPOV.js';import*as o from'fs';import*as f from'path';import c from'chalk';import*as p from'js-yaml';var b=`# Thread - Session Continuity
3
3
 
4
4
  > Pass context between AI agent sessions. Updated by \`paradigm thread save\`.
5
5
 
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import {d}from'./chunk-7YTAA6XA.js';import'./chunk-XHJ27CER.js';import n from'chalk';async function w(c){let y=process.cwd(),h=parseInt(c.limit||"20",10),i=await d(y,{limit:h});if(i.length===0){c.json?console.log(JSON.stringify({entries:[],byDate:{},hotSymbols:[],authors:[]},null,2)):console.log(n.gray(`
2
+ import {d}from'./chunk-WS2N27RX.js';import'./chunk-5TAVYPOV.js';import n from'chalk';async function w(c){let y=process.cwd(),h=parseInt(c.limit||"20",10),i=await d(y,{limit:h});if(i.length===0){c.json?console.log(JSON.stringify({entries:[],byDate:{},hotSymbols:[],authors:[]},null,2)):console.log(n.gray(`
3
3
  No lore entries found.
4
4
  `));return}let r=new Map;for(let o of i){let t=o.timestamp.slice(0,10);r.has(t)||r.set(t,[]),r.get(t).push(o);}let a=new Map;for(let o of i)for(let t of o.symbols_touched||[])a.set(t,(a.get(t)||0)+1);let g=Array.from(a.entries()).sort(([,o],[,t])=>t-o).slice(0,10).map(([o,t])=>({symbol:o,count:t})),l=new Map;for(let o of i){let t=o.author,e=l.get(t);e?(e.count++,o.agent&&(e.hasAgent=true),o.timestamp>e.lastActive&&(e.lastActive=o.timestamp)):l.set(t,{count:1,hasAgent:o.agent!=null,lastActive:o.timestamp});}if(c.json){let o={};for(let[t,e]of r)o[t]=e.map(s=>({id:s.id,type:s.type||"note",title:s.title,author:s.author,symbols:s.symbols_touched||[]}));console.log(JSON.stringify({total:i.length,byDate:o,hotSymbols:g,authors:Array.from(l.entries()).map(([t,e])=>({id:t,hasAgent:e.hasAgent,entries:e.count,lastActive:e.lastActive}))},null,2));return}let f={"agent-session":n.hex("#818cf8"),"human-note":n.hex("#34d399"),decision:n.hex("#fbbf24"),review:n.hex("#c084fc"),incident:n.hex("#f87171"),milestone:n.hex("#60a5fa")};console.log(n.magenta(`
5
5
  Lore Timeline (${i.length} entries)
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export{h as registerTools}from'./chunk-CMCQHU46.js';import'./chunk-4UJ4NIEQ.js';import'./chunk-4Q7XYPL4.js';import'./chunk-KLBH26PA.js';import'./chunk-JNSJVCTU.js';import'./chunk-Q2J542ST.js';import'./chunk-XROULIQN.js';import'./chunk-ZUAUFZRJ.js';import'./chunk-3KVVC4WV.js';import'./chunk-FILLU77P.js';import'./chunk-M4UMM6DC.js';import'./chunk-ODVKPZZ4.js';import'./chunk-74SGKSRQ.js';import'./chunk-UPFCBVXY.js';import'./chunk-EK4ZRIFJ.js';import'./chunk-4SCKMGTB.js';import'./chunk-DVZWCXB6.js';import'./chunk-QGZRM6ZB.js';import'./chunk-VG7FN2TU.js';import'./chunk-5TAVYPOV.js';
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import {f,p,o,r,i,s}from'./chunk-4QADCWPU.js';import {a}from'./chunk-NKYNHSA5.js';import'./chunk-XHJ27CER.js';import t from'chalk';import S from'ora';import*as h from'fs';function I(){return `
2
+ import {f,p,o,r,i,s}from'./chunk-4QADCWPU.js';import {a}from'./chunk-NKYNHSA5.js';import'./chunk-5TAVYPOV.js';import t from'chalk';import S from'ora';import*as h from'fs';function I(){return `
3
3
  ${t.cyan("\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557")}
4
4
  ${t.cyan("\u2551")} ${t.bold.white("PARADIGM SENTINEL TRIAGE")} ${t.cyan("\u2551")}
5
5
  ${t.cyan("\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D")}
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import'./chunk-XHJ27CER.js';import*as c from'path';import*as i from'fs';import*as d from'js-yaml';import o from'chalk';import {execSync}from'child_process';var f=".paradigm/tutorial/state.json",h=".paradigm/tutorial/curriculum.yaml";function p(n){let e=c.join(n,f);if(i.existsSync(e))try{return JSON.parse(i.readFileSync(e,"utf8"))}catch{}return {currentStep:null,completedSteps:[],fixedBugs:[]}}function g(n,e){let s=c.join(n,f),t=c.dirname(s);i.existsSync(t)||i.mkdirSync(t,{recursive:true}),i.writeFileSync(s,JSON.stringify(e,null,2),"utf8");}function y(n){let e=c.join(n,".paradigm/tutorial");i.existsSync(e)||i.mkdirSync(e,{recursive:true});let s={title:"Paradigm Tutorial - ShopFlow Example",description:"Learn Paradigm by exploring the ShopFlow e-commerce example",steps:[{id:"step-1-explore-structure",title:"Explore Project Structure",description:"Understand how Paradigm organizes project knowledge",file:"step-1-explore-structure.md",checkpoints:[{type:"file-exists",path:".purpose"},{type:"file-exists",path:"portal.yaml"},{type:"file-exists",path:".paradigm/config.yaml"}]},{id:"step-2-understand-purpose",title:"Understanding Purpose Files",description:"Learn how Purpose files define features and components",file:"step-2-understand-purpose.md",checkpoints:[{type:"file-exists",path:".purpose"}]},{id:"step-3-understand-gates",title:"Understanding Gates",description:"Learn how Gates define authorization and access control",file:"step-3-understand-gates.md",checkpoints:[{type:"file-exists",path:"portal.yaml"}]},{id:"step-4-explore-symbols",title:"Exploring Symbols",description:"Understand Paradigm's symbol system and how they connect",file:"step-4-explore-symbols.md",checkpoints:[{type:"command-success",command:"paradigm status"}]},{id:"step-5-visualize",title:"Visualize in Dreamscape",description:"See your project knowledge visualized in the Dreamscape",file:"step-5-visualize.md",checkpoints:[{type:"command-success",command:"paradigm dream aggregate"}]}],bugs:[]},t=c.join(e,"curriculum.yaml");i.writeFileSync(t,d.dump(s),"utf8");let r=[{file:"step-1-explore-structure.md",content:`# Step 1: Explore Project Structure
2
+ import'./chunk-5TAVYPOV.js';import*as c from'path';import*as i from'fs';import*as d from'js-yaml';import o from'chalk';import {execSync}from'child_process';var f=".paradigm/tutorial/state.json",h=".paradigm/tutorial/curriculum.yaml";function p(n){let e=c.join(n,f);if(i.existsSync(e))try{return JSON.parse(i.readFileSync(e,"utf8"))}catch{}return {currentStep:null,completedSteps:[],fixedBugs:[]}}function g(n,e){let s=c.join(n,f),t=c.dirname(s);i.existsSync(t)||i.mkdirSync(t,{recursive:true}),i.writeFileSync(s,JSON.stringify(e,null,2),"utf8");}function y(n){let e=c.join(n,".paradigm/tutorial");i.existsSync(e)||i.mkdirSync(e,{recursive:true});let s={title:"Paradigm Tutorial - ShopFlow Example",description:"Learn Paradigm by exploring the ShopFlow e-commerce example",steps:[{id:"step-1-explore-structure",title:"Explore Project Structure",description:"Understand how Paradigm organizes project knowledge",file:"step-1-explore-structure.md",checkpoints:[{type:"file-exists",path:".purpose"},{type:"file-exists",path:"portal.yaml"},{type:"file-exists",path:".paradigm/config.yaml"}]},{id:"step-2-understand-purpose",title:"Understanding Purpose Files",description:"Learn how Purpose files define features and components",file:"step-2-understand-purpose.md",checkpoints:[{type:"file-exists",path:".purpose"}]},{id:"step-3-understand-gates",title:"Understanding Gates",description:"Learn how Gates define authorization and access control",file:"step-3-understand-gates.md",checkpoints:[{type:"file-exists",path:"portal.yaml"}]},{id:"step-4-explore-symbols",title:"Exploring Symbols",description:"Understand Paradigm's symbol system and how they connect",file:"step-4-explore-symbols.md",checkpoints:[{type:"command-success",command:"paradigm status"}]},{id:"step-5-visualize",title:"Visualize in Dreamscape",description:"See your project knowledge visualized in the Dreamscape",file:"step-5-visualize.md",checkpoints:[{type:"command-success",command:"paradigm dream aggregate"}]}],bugs:[]},t=c.join(e,"curriculum.yaml");i.writeFileSync(t,d.dump(s),"utf8");let r=[{file:"step-1-explore-structure.md",content:`# Step 1: Explore Project Structure
3
3
 
4
4
  Welcome to the Paradigm tutorial! In this step, you'll explore how Paradigm organizes project knowledge.
5
5
 
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import'./chunk-XHJ27CER.js';import {Router}from'express';import*as n from'fs';import*as o from'path';function m(p){let i=Router(),u=o.join(__dirname,"..","..","university-content");return i.get("/courses",(a,e)=>{try{let s=o.join(u,"courses");if(!n.existsSync(s))return e.json({courses:[]});let l=n.readdirSync(s).filter(r=>r.endsWith(".json")).map(r=>{let t=JSON.parse(n.readFileSync(o.join(s,r),"utf-8"));return {id:t.id,title:t.title,description:t.description,lessonCount:t.lessons?.length||0,quizCount:t.quizzes?.length||0,lessons:(t.lessons||[]).map(d=>({id:d.id,title:d.title}))}});return l.sort((r,t)=>r.id.localeCompare(t.id)),e.json({courses:l})}catch(s){e.status(500).json({error:"Failed to list courses",detail:String(s)});}}),i.get("/courses/:id",(a,e)=>{try{let s=o.join(u,"courses",`${a.params.id}.json`);if(!n.existsSync(s))return e.status(404).json({error:`Course '${a.params.id}' not found`});let c=JSON.parse(n.readFileSync(s,"utf-8"));return e.json(c)}catch(s){e.status(500).json({error:"Failed to load course",detail:String(s)});}}),i.get("/plsat",(a,e)=>{try{let s=o.join(u,"plsat");if(!n.existsSync(s))return e.json({versions:[]});let l=n.readdirSync(s).filter(r=>r.endsWith(".json")).map(r=>{let t=JSON.parse(n.readFileSync(o.join(s,r),"utf-8"));return {version:t.version||r.replace(".json",""),frameworkVersion:t.frameworkVersion,questionCount:t.questions?.length||0,timeLimit:t.timeLimit,passThreshold:t.passThreshold}});return e.json({versions:l})}catch(s){e.status(500).json({error:"Failed to list PLSAT versions",detail:String(s)});}}),i.get("/diplomas",(a,e)=>{try{let s=o.join(p,".paradigm","university","diplomas");if(!n.existsSync(s))return e.json({diplomas:[]});let l=n.readdirSync(s).filter(r=>r.endsWith(".json")||r.endsWith(".yaml")).map(r=>{let t=n.readFileSync(o.join(s,r),"utf-8");return r.endsWith(".json")?JSON.parse(t):t}).filter(Boolean);return e.json({diplomas:l})}catch(s){e.status(500).json({error:"Failed to load diplomas",detail:String(s)});}}),i.get("/reference",(a,e)=>{try{let s=o.join(u,"reference.json");if(!n.existsSync(s))return e.json({});let c=JSON.parse(n.readFileSync(s,"utf-8"));return e.json(c)}catch(s){e.status(500).json({error:"Failed to load reference",detail:String(s)});}}),i}export{m as createUniversityRouter};
2
+ import'./chunk-5TAVYPOV.js';import {Router}from'express';import*as n from'fs';import*as o from'path';function m(p){let i=Router(),u=o.join(__dirname,"..","..","university-content");return i.get("/courses",(a,e)=>{try{let s=o.join(u,"courses");if(!n.existsSync(s))return e.json({courses:[]});let l=n.readdirSync(s).filter(r=>r.endsWith(".json")).map(r=>{let t=JSON.parse(n.readFileSync(o.join(s,r),"utf-8"));return {id:t.id,title:t.title,description:t.description,lessonCount:t.lessons?.length||0,quizCount:t.quizzes?.length||0,lessons:(t.lessons||[]).map(d=>({id:d.id,title:d.title}))}});return l.sort((r,t)=>r.id.localeCompare(t.id)),e.json({courses:l})}catch(s){e.status(500).json({error:"Failed to list courses",detail:String(s)});}}),i.get("/courses/:id",(a,e)=>{try{let s=o.join(u,"courses",`${a.params.id}.json`);if(!n.existsSync(s))return e.status(404).json({error:`Course '${a.params.id}' not found`});let c=JSON.parse(n.readFileSync(s,"utf-8"));return e.json(c)}catch(s){e.status(500).json({error:"Failed to load course",detail:String(s)});}}),i.get("/plsat",(a,e)=>{try{let s=o.join(u,"plsat");if(!n.existsSync(s))return e.json({versions:[]});let l=n.readdirSync(s).filter(r=>r.endsWith(".json")).map(r=>{let t=JSON.parse(n.readFileSync(o.join(s,r),"utf-8"));return {version:t.version||r.replace(".json",""),frameworkVersion:t.frameworkVersion,questionCount:t.questions?.length||0,timeLimit:t.timeLimit,passThreshold:t.passThreshold}});return e.json({versions:l})}catch(s){e.status(500).json({error:"Failed to list PLSAT versions",detail:String(s)});}}),i.get("/diplomas",(a,e)=>{try{let s=o.join(p,".paradigm","university","diplomas");if(!n.existsSync(s))return e.json({diplomas:[]});let l=n.readdirSync(s).filter(r=>r.endsWith(".json")||r.endsWith(".yaml")).map(r=>{let t=n.readFileSync(o.join(s,r),"utf-8");return r.endsWith(".json")?JSON.parse(t):t}).filter(Boolean);return e.json({diplomas:l})}catch(s){e.status(500).json({error:"Failed to load diplomas",detail:String(s)});}}),i.get("/reference",(a,e)=>{try{let s=o.join(u,"reference.json");if(!n.existsSync(s))return e.json({});let c=JSON.parse(n.readFileSync(s,"utf-8"));return e.json(c)}catch(s){e.status(500).json({error:"Failed to load reference",detail:String(s)});}}),i}export{m as createUniversityRouter};
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import {d,c,e as e$1}from'./chunk-DOCDDDTD.js';import {e as e$2,d as d$1}from'./chunk-JQKKVAAN.js';import'./chunk-XHJ27CER.js';import*as e from'fs';import*as t from'path';import {fileURLToPath}from'url';import a from'chalk';import z from'ora';var A=["scan","logger","migrate"];function j(){let l=fileURLToPath(import.meta.url),n=t.dirname(l),s=[t.join(n,"..","..","templates","paradigm"),t.join(n,"..","templates","paradigm")];for(let o of s)if(e.existsSync(o))return o;return t.join(n,"..","templates","paradigm")}async function W(l,n){let s=l?t.resolve(l):process.cwd(),o=t.basename(s),c$1=z();if(console.log(a.yellow("\n `paradigm upgrade` is deprecated. Use `paradigm migrate` instead.\n")),console.log(a.blue(`
2
+ import {d,c,e as e$1}from'./chunk-DOCDDDTD.js';import {e as e$2,d as d$1}from'./chunk-JQKKVAAN.js';import'./chunk-5TAVYPOV.js';import*as e from'fs';import*as t from'path';import {fileURLToPath}from'url';import a from'chalk';import z from'ora';var A=["scan","logger","migrate"];function j(){let l=fileURLToPath(import.meta.url),n=t.dirname(l),s=[t.join(n,"..","..","templates","paradigm"),t.join(n,"..","templates","paradigm")];for(let o of s)if(e.existsSync(o))return o;return t.join(n,"..","templates","paradigm")}async function W(l,n){let s=l?t.resolve(l):process.cwd(),o=t.basename(s),c$1=z();if(console.log(a.yellow("\n `paradigm upgrade` is deprecated. Use `paradigm migrate` instead.\n")),console.log(a.blue(`
3
3
  \u{1F504} Paradigm Upgrade
4
4
  `)),n.fromHorizon){let r=await M(s,o,n,c$1);console.log(a.blue(`
5
5
  \u{1F4CB} Migration Summary
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import {a,c,d}from'./chunk-D34YFK4M.js';import'./chunk-XHJ27CER.js';import s from'chalk';import*as g from'fs';import*as u from'path';async function x(i){let l=process.cwd(),c$1=a(l);if(!c$1||c$1.totalContent===0){console.log(s.yellow(`
2
+ import {a,c,d}from'./chunk-D34YFK4M.js';import'./chunk-5TAVYPOV.js';import s from'chalk';import*as g from'fs';import*as u from'path';async function x(i){let l=process.cwd(),c$1=a(l);if(!c$1||c$1.totalContent===0){console.log(s.yellow(`
3
3
  No university content to validate.
4
4
  `));return}let n=[],r=c$1.entries;i.id&&(r=r.filter(e=>e.id===i.id),r.length===0&&(console.error(s.red(`
5
5
  Content "${i.id}" not found
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import {f,o,p}from'./chunk-JIXHEBGK.js';import'./chunk-XHJ27CER.js';import*as l from'path';import e from'chalk';import P from'ora';async function E(u){let i=process.cwd(),h=l.resolve(i,u);console.log(e.blue(`
2
+ import {f,o,p}from'./chunk-JIXHEBGK.js';import'./chunk-5TAVYPOV.js';import*as l from'path';import e from'chalk';import P from'ora';async function E(u){let i=process.cwd(),h=l.resolve(i,u);console.log(e.blue(`
3
3
  \u{1F50D} Validating Purpose Files...
4
4
  `));let a=P("Finding purpose files...").start();try{let s=await f(h);a.succeed(`Found ${s.length} purpose file(s)`);let c=!1,r=0,p$1=0;for(let{filePath:m,data:w}of s){let t=l.relative(i,m),o$1=o(w,t),$=o$1.issues.filter(n=>n.type==="error").length,v=o$1.issues.filter(n=>n.type==="warning").length;p$1+=$,r+=v,o$1.valid||(c=!0),o$1.issues.length>0?(console.log(e.white(`
5
5
  ${t}`)),console.log(p(o$1))):console.log(e.green(` \u2713 ${t}`));}console.log(e.white(`
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import {a,f,g}from'./chunk-QT2LKB3P.js';import'./chunk-XHJ27CER.js';import*as i from'path';import t from'chalk';import d from'ora';async function h(a$1){let c=process.cwd(),g$1=i.resolve(c,a$1);console.log(t.blue(`
2
+ import {a,f,g}from'./chunk-QT2LKB3P.js';import'./chunk-5TAVYPOV.js';import*as i from'path';import t from'chalk';import d from'ora';async function h(a$1){let c=process.cwd(),g$1=i.resolve(c,a$1);console.log(t.blue(`
3
3
  \u{1F50D} Validating Gate Configuration...
4
4
  `));let e=d(`Parsing ${a$1}...`).start();try{let o=await a(g$1);e.succeed("Parsed portal.yaml");let s=f(o);console.log(t.white(`
5
5
  Gates: ${o.gates.length}`)),console.log(t.white(`Flows: ${o.flows.length}`)),console.log(g(s)),s.valid||process.exit(1),console.log("");}catch(o){e.fail("Validation failed"),console.log(t.red(`Error: ${o.message}
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import'./chunk-XHJ27CER.js';import*as d from'path';import*as f from'fs';import*as y from'js-yaml';import o from'chalk';import h from'ora';import v from'open';async function x(m,r={}){let w=m?d.resolve(m):process.cwd(),c=parseInt(r.port||"42196",10),s=parseInt(r.uiPort||"42195",10),i=r.config||d.join(w,"portal.yaml");console.log(o.magenta(`
2
+ import'./chunk-5TAVYPOV.js';import*as d from'path';import*as f from'fs';import*as y from'js-yaml';import o from'chalk';import h from'ora';import v from'open';async function x(m,r={}){let w=m?d.resolve(m):process.cwd(),c=parseInt(r.port||"42196",10),s=parseInt(r.uiPort||"42195",10),i=r.config||d.join(w,"portal.yaml");console.log(o.magenta(`
3
3
  \u{1F6AA} Portal Viewer
4
4
  `));let a=h("Starting Portal Viewer...").start();try{f.existsSync(i)||(a.warn(`No portal.yaml found at ${o.gray(i)}`),console.log(o.gray(` The viewer will start but won't have any predefined gates.
5
5
  `)));let t;try{t=(await import('@a-company/portal-viewer')).ViewerServer;}catch{a.fail("Portal Viewer package not found"),console.log(""),console.log(o.yellow("To use the Portal Viewer, install the package:")),console.log(o.cyan(" npm install @a-company/portal-viewer")),console.log(""),console.log(o.gray("Or build from source in the monorepo:")),console.log(o.gray(" cd packages/portal/viewer && npm run build")),process.exit(1);}await new t({port:c,uiPort:s,configPath:i}).start(),a.succeed("Portal Viewer started"),console.log(""),console.log(o.blue(" \u{1F310} UI: ")+o.cyan.bold(`http://localhost:${s}`)),console.log(o.blue(" \u{1F50C} WebSocket: ")+o.cyan(`ws://localhost:${c}`)),console.log(o.blue(" \u{1F4CB} Config: ")+o.gray(i)),console.log(""),console.log(o.gray(" Connect your app's Portal SDK to the WebSocket URL above.")),console.log(o.gray(" Press Ctrl+C to stop.")),console.log(""),r.open!==!1&&await v(`http://localhost:${s}`),await new Promise(()=>{});}catch(t){a.fail("Failed to start Portal Viewer"),console.error(o.red(t.message)),process.exit(1);}}async function $(m,r={}){m||(console.log(o.red("Error: Session path required")),console.log(""),console.log("Usage: paradigm portal report <session.json> [options]"),console.log(""),console.log("Options:"),console.log(" --format <format> Output format: json, markdown, slack, discord"),console.log(" --output <path> Output file path"),process.exit(1));let w=r.format||"markdown",c=r.output;console.log(o.magenta(`
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import {f as f$1,a,d,e}from'./chunk-WR6D3SC6.js';import {c,d as d$1,e as e$1}from'./chunk-DOCDDDTD.js';import'./chunk-JQKKVAAN.js';import'./chunk-XHJ27CER.js';import*as t from'fs';import*as f from'path';import c$1 from'chalk';async function P(){let r=process.cwd();f$1("\u{1F440} Paradigm Watch"),a("");let e$2=f.join(r,".paradigm");(!t.existsSync(e$2)||!t.statSync(e$2).isDirectory())&&(d("No .paradigm/ directory found."),e(" Run `paradigm init` first.\n"),process.exit(1));let o=c(r).detected||"cursor";e(`Watching for changes...
2
+ import {f as f$1,a,d,e}from'./chunk-WR6D3SC6.js';import {c,d as d$1,e as e$1}from'./chunk-DOCDDDTD.js';import'./chunk-JQKKVAAN.js';import'./chunk-5TAVYPOV.js';import*as t from'fs';import*as f from'path';import c$1 from'chalk';async function P(){let r=process.cwd();f$1("\u{1F440} Paradigm Watch"),a("");let e$2=f.join(r,".paradigm");(!t.existsSync(e$2)||!t.statSync(e$2).isDirectory())&&(d("No .paradigm/ directory found."),e(" Run `paradigm init` first.\n"),process.exit(1));let o=c(r).detected||"cursor";e(`Watching for changes...
3
3
  `),e(" [config] .paradigm/config.yaml"),e(" [specs] .paradigm/specs/*.md"),e(` [target] ${o}
4
4
  `),e(`Press Ctrl+C to stop.
5
5
  `);let n={lastConfigMtime:0,lastSpecsMtime:0},s=f.join(e$2,"config.yaml"),g=f.join(e$2,"specs");t.existsSync(s)&&(n.lastConfigMtime=t.statSync(s).mtime.getTime()),t.existsSync(g)&&(n.lastSpecsMtime=y(g));let D=setInterval(()=>{let p=false,l="";if(t.existsSync(s)){let i=t.statSync(s).mtime.getTime();i>n.lastConfigMtime&&(n.lastConfigMtime=i,p=true,l="config");}if(t.existsSync(g)){let i=y(g);i>n.lastSpecsMtime&&(n.lastSpecsMtime=i,p=true,l=l?"config+specs":"specs");}if(p){let i=new Date().toLocaleTimeString("en-US",{hour12:false});a(c$1.cyan(`${i}`)+c$1.gray(` [${l}]`)+" Changed \u2192 syncing...");let u=d$1(r);if(u){let d=e$1(r,o,u,true);d.success?a(c$1.green(`${i}`)+c$1.gray(" [sync]")+` ${d.outputPath} updated`):a(c$1.red(`${i}`)+c$1.gray(" [sync]")+` Failed: ${d.message}`);}else a(c$1.red(`${i}`)+c$1.gray(" [error]")+" Failed to load .paradigm/ files");}},1e3);process.on("SIGINT",()=>{clearInterval(D),e(`
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import'./chunk-XHJ27CER.js';import*as t from'fs';import*as c from'path';import e from'chalk';import*as p from'js-yaml';var f=".paradigm/wisdom";async function j(o,g={}){let i=process.cwd(),r=c.join(i,f);if(!t.existsSync(r)){console.log(e.yellow("No wisdom directory found.")),console.log(e.gray("Run `paradigm wisdom init` to create .paradigm/wisdom/"));return}let a=x(c.join(r,"preferences.yaml")),s=x(c.join(r,"antipatterns.yaml")),d=x(c.join(r,"expertise.yaml")),m=S(r);if(g.json){console.log(JSON.stringify({preferences:a,antipatterns:s?.antipatterns||[],expertise:d?.experts||[],decisions:m},null,2));return}if(console.log(e.magenta(`
2
+ import'./chunk-5TAVYPOV.js';import*as t from'fs';import*as c from'path';import e from'chalk';import*as p from'js-yaml';var f=".paradigm/wisdom";async function j(o,g={}){let i=process.cwd(),r=c.join(i,f);if(!t.existsSync(r)){console.log(e.yellow("No wisdom directory found.")),console.log(e.gray("Run `paradigm wisdom init` to create .paradigm/wisdom/"));return}let a=x(c.join(r,"preferences.yaml")),s=x(c.join(r,"antipatterns.yaml")),d=x(c.join(r,"expertise.yaml")),m=S(r);if(g.json){console.log(JSON.stringify({preferences:a,antipatterns:s?.antipatterns||[],expertise:d?.experts||[],decisions:m},null,2));return}if(console.log(e.magenta(`
3
3
  Wisdom
4
4
  `)),o){console.log(e.cyan(` Symbol: ${o}
5
5
  `));let n=a?.by_symbol?.[o];n&&(console.log(e.white(" Preferences:")),n.patterns&&n.patterns.forEach(l=>console.log(e.gray(` - ${l}`))),n.testing&&console.log(e.gray(` Testing: ${n.testing}`)),console.log());let y=(s?.antipatterns||[]).filter(l=>l.symbols.includes(o));y.length>0&&(console.log(e.red(" Antipatterns:")),y.forEach(l=>{console.log(e.gray(` [${l.id}] ${l.description}`)),console.log(e.gray(` Reason: ${l.reason}`)),console.log(e.green(` Alternative: ${l.alternative}`)),console.log();}));let w=m.filter(l=>l.symbols.includes(o));w.length>0&&(console.log(e.blue(" Decisions:")),w.forEach(l=>{console.log(e.gray(` [${l.id}] ${l.title} (${l.status})`));}),console.log());let $=(d?.experts||[]).filter(l=>l.symbols?.includes(o));$.length>0&&(console.log(e.yellow(" Experts:")),$.forEach(l=>{console.log(e.gray(` - ${l.name}${l.contact?` (${l.contact})`:""}`));}));return}if(console.log(e.white(" Global Preferences:")),a?.global){let n=a.global;n.code_style?.length&&(console.log(e.gray(" Code Style:")),n.code_style.forEach(y=>console.log(e.gray(` - ${y}`)))),n.testing?.length&&(console.log(e.gray(" Testing:")),n.testing.forEach(y=>console.log(e.gray(` - ${y}`))));}else console.log(e.gray(" No global preferences defined"));console.log();let h=Object.keys(a?.by_symbol||{});h.length>0&&(console.log(e.white(` Symbol Preferences: ${h.length}`)),h.slice(0,5).forEach(n=>console.log(e.gray(` - ${n}`))),h.length>5&&console.log(e.gray(` ... and ${h.length-5} more`)),console.log());let u=s?.antipatterns||[];u.length>0&&(console.log(e.red(` Antipatterns: ${u.length}`)),u.slice(0,3).forEach(n=>{console.log(e.gray(` [${n.id}] ${n.description.slice(0,60)}...`));}),u.length>3&&console.log(e.gray(` ... and ${u.length-3} more`)),console.log()),m.length>0&&(console.log(e.blue(` Decisions: ${m.length}`)),m.slice(0,3).forEach(n=>{console.log(e.gray(` [${n.id}] ${n.title} (${n.status})`));}),m.length>3&&console.log(e.gray(` ... and ${m.length-3} more`)),console.log());let b=d?.experts||[];b.length>0&&(console.log(e.yellow(` Experts: ${b.length}`)),b.slice(0,3).forEach(n=>{console.log(e.gray(` - ${n.name}: ${n.areas?.join(", ")||n.symbols?.join(", ")}`));}),console.log());}async function D(o={}){let g=process.cwd(),i=c.join(g,f);if(t.existsSync(i)&&!o.force){console.log(e.yellow("Wisdom directory already exists.")),console.log(e.gray("Use --force to reinitialize"));return}t.mkdirSync(i,{recursive:true}),t.mkdirSync(c.join(i,"decisions"),{recursive:true});let r={version:"1.0",updated:new Date().toISOString(),by_symbol:{"@example":{patterns:["Use optimistic UI updates","Show skeleton loaders"],testing:"Require e2e tests for happy path"}},global:{code_style:["Prefer early returns","Named exports only"],testing:["Unit for pure functions","E2E for critical flows"]}},a={version:"1.0",antipatterns:[{id:"example-001",symbols:["@example"],description:"Example antipattern - do NOT do this",reason:"Explain why this is bad",alternative:"Do this instead",added:new Date().toISOString()}]},s={version:"1.0",experts:[{name:"your-name",symbols:["@feature"],areas:["domain-area"],contact:"email or slack"}]};t.writeFileSync(c.join(i,"preferences.yaml"),p.dump(r,{lineWidth:-1})),t.writeFileSync(c.join(i,"antipatterns.yaml"),p.dump(a,{lineWidth:-1})),t.writeFileSync(c.join(i,"expertise.yaml"),p.dump(s,{lineWidth:-1})),console.log(e.green("Wisdom directory initialized!")),console.log(e.gray(` ${i}/`)),console.log(e.gray(" preferences.yaml")),console.log(e.gray(" antipatterns.yaml")),console.log(e.gray(" expertise.yaml")),console.log(e.gray(" decisions/"));}async function P(o){let g=process.cwd(),i=c.join(g,f,"antipatterns.yaml"),r={version:"1.0",antipatterns:[]};if(t.existsSync(i)){let s=t.readFileSync(i,"utf8");r=p.load(s);}else t.mkdirSync(c.join(g,f),{recursive:true});let a={id:o.id,symbols:o.symbols.split(",").map(s=>s.trim()),description:o.description,reason:o.reason,alternative:o.alternative,added:new Date().toISOString()};r.antipatterns.push(a),t.writeFileSync(i,p.dump(r,{lineWidth:-1})),console.log(e.green(`Antipattern ${o.id} added!`));}async function W(o){let g=process.cwd(),i=c.join(g,f,"decisions");t.mkdirSync(i,{recursive:true});let r={id:o.id,title:o.title,status:o.status||"proposed",date:new Date().toISOString().split("T")[0],symbols:o.symbols.split(",").map(d=>d.trim()),context:o.context,decision:o.decision,rationale:{factors:[],conclusion:""},consequences:{positive:[],negative:[]}},a=`${r.id}-${v(r.title)}.yaml`,s=c.join(i,a);t.writeFileSync(s,p.dump(r,{lineWidth:-1})),console.log(e.green(`Decision ${r.id} created!`)),console.log(e.gray(` ${s}`)),console.log(e.gray(" Edit the file to add rationale and consequences"));}async function _(o,g={}){let i=process.cwd(),r=c.join(i,f,"expertise.yaml");if(!t.existsSync(r)){console.log(e.yellow("No expertise file found."));return}let s=x(r)?.experts||[];if(o&&(s=s.filter(d=>d.symbols?.some(m=>m.includes(o))||d.areas?.some(m=>m.toLowerCase().includes(o.toLowerCase())))),g.json){console.log(JSON.stringify({experts:s},null,2));return}if(s.length===0){console.log(e.yellow("No experts found"));return}console.log(e.magenta(`
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- export{d as getWorkLogSummary,b as loadWorkLogEntries,c as loadWorkLogEntry,a as recordWorkLog}from'./chunk-JNSJVCTU.js';import'./chunk-XHJ27CER.js';
2
+ export{d as getWorkLogSummary,b as loadWorkLogEntries,c as loadWorkLogEntry,a as recordWorkLog}from'./chunk-JNSJVCTU.js';import'./chunk-5TAVYPOV.js';
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export{d as detectProjectRole,a as workspaceInitCommand,c as workspaceReindexCommand,b as workspaceStatusCommand}from'./chunk-SUU6M4JH.js';import'./chunk-LBQBWIEX.js';import'./chunk-4TXOVRWD.js';import'./chunk-VCKKJDLP.js';import'./chunk-WR6D3SC6.js';import'./chunk-T6IDXUUA.js';import'./chunk-JIXHEBGK.js';import'./chunk-QT2LKB3P.js';import'./chunk-LKAT7IAK.js';import'./chunk-5TAVYPOV.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@a-company/paradigm",
3
- "version": "5.37.0",
3
+ "version": "5.37.1",
4
4
  "description": "Unified CLI for Paradigm developer tools",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- import {b as b$1,d,f}from'./chunk-XHJ27CER.js';import*as c from'fs';import*as l from'path';import*as y from'js-yaml';var g,R=b$1(()=>{g={enabled:true,thresholds:{minComplianceRate:90,minEvents:20,timeWindowDays:30,minConsecutiveSessions:5,recencyDays:7},demotion:{failureThreshold:3,failureWindowDays:7,cooldownDays:14},neverGraduate:["explore-before-implement","ripple-before-modify","check-fragility","wisdom-before-implement","confidence-on-decisions","university-onboarded","university-content-valid"]};});var M={};d(M,{getAllStates:()=>ie,getConfig:()=>te,getState:()=>G,incrementFailure:()=>se,invalidateGraduationCache:()=>ae,isGraduated:()=>oe,loadGraduation:()=>p,markNeverGraduate:()=>ne,saveGraduation:()=>H,setTier:()=>re});function A(e){return l.join(e,".paradigm","graduation.yaml")}function p(e){let t=l.resolve(e);if(m&&b===t&&Date.now()-v<ee)return m;let o=A(t),i;if(c.existsSync(o))try{let r=c.readFileSync(o,"utf8");i=y.load(r);}catch{i={version:"1.0",config:{},states:{}};}else i={version:"1.0",config:{},states:{}};return i.version||(i.version="1.0"),i.config||(i.config={}),i.states||(i.states={}),m=i,b=t,v=Date.now(),i}function H(e,t){let o=l.resolve(e),i=A(o),r=l.dirname(i);c.existsSync(r)||c.mkdirSync(r,{recursive:true});let n=y.dump(t,{lineWidth:120,noRefs:true,sortKeys:true});c.writeFileSync(i,n,"utf8"),m=t,b=o,v=Date.now();}function te(e){let t=p(e);return {...g,...t.config,thresholds:{...g.thresholds,...t.config?.thresholds},demotion:{...g.demotion,...t.config?.demotion},neverGraduate:t.config?.neverGraduate??g.neverGraduate}}function w(e){return {habitId:e,tier:"habit",previousTier:null,graduatedAt:null,demotedAt:null,complianceAtGraduation:0,hookScript:null,failureCount:0,cooldownUntil:null,neverGraduate:false}}function G(e,t){let i=p(e).states[t];return i?{...w(t),...i,habitId:t}:w(t)}function ie(e){let t=p(e),o={};for(let[i,r]of Object.entries(t.states))o[i]={...w(i),...r,habitId:i};return o}function oe(e,t){return G(e,t).tier==="hook"}function re(e,t,o,i){let r=p(e),n=r.states[t]||{};r.states[t]={...n,tier:o,previousTier:n.tier||"habit",...o==="hook"?{graduatedAt:new Date().toISOString(),failureCount:0}:{},...o==="habit"&&n.tier==="hook"?{demotedAt:new Date().toISOString()}:{},...i},H(e,r);}function ne(e,t){let o=p(e);o.states[t]||(o.states[t]={}),o.states[t].neverGraduate=true,o.states[t].tier="habit",H(e,o);}function se(e,t){let o=p(e);o.states[t]||(o.states[t]={});let i=(o.states[t].failureCount||0)+1;return o.states[t].failureCount=i,H(e,o),i}function ae(){m=null,b=null,v=0;}var m,b,v,ee,j=b$1(()=>{R();m=null,b=null,v=0,ee=3e4;});var E=[{id:"explore-before-implement",name:"Explore Before Implementing",description:"Call ripple/navigate/search before modifying existing symbols to understand impact",category:"discovery",trigger:"preflight",severity:"advisory",check:{type:"tool-called",params:{tools:["paradigm_ripple","paradigm_navigate","paradigm_search","paradigm_related"]}},enabled:true},{id:"ripple-before-modify",name:"Ripple Before Modifying",description:"Run ripple analysis before modifying symbols with dependents",category:"discovery",trigger:"preflight",severity:"advisory",check:{type:"tool-called",params:{tools:["paradigm_ripple"]}},enabled:true},{id:"check-fragility",name:"Check Fragility",description:"Check history fragility for symbols before modifying frequently-broken code",category:"discovery",trigger:"preflight",severity:"advisory",check:{type:"tool-called",params:{tools:["paradigm_history_fragility"]}},enabled:true},{id:"wisdom-before-implement",name:"Check Team Wisdom",description:"Check team wisdom (preferences, antipatterns, decisions) before implementing",category:"collaboration",trigger:"preflight",severity:"advisory",check:{type:"tool-called",params:{tools:["paradigm_wisdom_context","paradigm_wisdom_expert"]}},enabled:true},{id:"verify-before-done",name:"Verify Before Done",description:"Run postflight compliance checks before finishing a session",category:"verification",trigger:"on-stop",severity:"warn",check:{type:"tool-called",params:{tools:["paradigm_pm_postflight"]}},enabled:true},{id:"postflight-compliance",name:"Postflight Compliance",description:"Ensure postflight checks pass without errors before finishing",category:"verification",trigger:"on-stop",severity:"advisory",check:{type:"tool-called",params:{tools:["paradigm_pm_postflight","paradigm_reindex"]}},enabled:true},{id:"test-new-components",name:"Test New Components",description:"New components should have associated tests or test plan documented",category:"testing",trigger:"postflight",severity:"advisory",check:{type:"tests-exist",params:{patterns:["**/*.test.*","**/*.spec.*","**/tests/**"]}},enabled:true},{id:"purpose-coverage",name:"Purpose File Coverage",description:"All modified source directories should have .purpose file coverage",category:"documentation",trigger:"postflight",severity:"warn",check:{type:"file-exists",params:{patterns:["**/.purpose"]}},enabled:true},{id:"record-lore-for-significant",name:"Record Lore for Significant Changes",description:"Sessions modifying 3+ files should record a lore entry",category:"documentation",trigger:"on-stop",severity:"warn",check:{type:"lore-recorded",params:{}},enabled:true},{id:"gates-for-routes",name:"Gates for Routes",description:"API routes should have corresponding gate declarations in portal.yaml",category:"security",trigger:"postflight",severity:"warn",check:{type:"gates-declared",params:{requireRoutes:true}},enabled:true},{id:"commit-message-symbols",name:"Commit Message Format",description:"Commit messages should follow type(#symbol): format and include a Symbols: trailer",category:"documentation",trigger:"on-commit",severity:"advisory",check:{type:"commit-message-format",params:{messagePatterns:["^(feat|fix|refactor|chore|docs|test|style|perf|ci|build)\\(","Symbols:"]}},enabled:true},{id:"flow-coverage-for-multi-component",name:"Flow Coverage",description:"Changes spanning 3+ components should have a documented $flow",category:"documentation",trigger:"postflight",severity:"advisory",check:{type:"flow-coverage",params:{minSteps:3}},enabled:true},{id:"context-session-awareness",name:"Context Awareness",description:"Use session recovery or context check tools for session continuity",category:"discovery",trigger:"preflight",severity:"advisory",check:{type:"context-checked",params:{contextTools:["paradigm_session_health","paradigm_session_recover","paradigm_session_checkpoint"]}},enabled:true},{id:"aspect-anchors-valid",name:"Aspect Anchors Valid",description:"Aspects touched during the session should have their code anchors validated",category:"verification",trigger:"postflight",severity:"advisory",check:{type:"aspect-anchored",params:{checkAnchors:true}},enabled:true}];var V=E,Y=30*1e3;function K(e){try{let t=l.join(e,".paradigm","config.yaml");if(c.existsSync(t)){let o=c.readFileSync(t,"utf8"),r=y.load(o)?.limits;if(r?.habitsCacheTtlMs&&typeof r.habitsCacheTtlMs=="number")return r.habitsCacheTtlMs}}catch{}return Y}var k=new Map;function z(e){let t=l.resolve(e),o=k.get(t),i=K(t);if(o&&Date.now()-o.loadedAt<i)return o.habits;let r=Q(t);return k.set(t,{habits:r,loadedAt:Date.now()}),r}function Q(e){let t=new Map;for(let s of V)t.set(s.id,{...s});let o=process.env.HOME||process.env.USERPROFILE||"~",i=S(l.join(o,".paradigm","habits.yaml"));i&&D(t,i);let r=T(l.join(o,".paradigm","habits"));for(let s of r)t.set(s.id,s);let n=S(l.join(e,".paradigm","habits.yaml"));n&&D(t,n);let u=T(l.join(e,".paradigm","habits"));for(let s of u)t.set(s.id,s);return Array.from(t.values())}function T(e){if(!c.existsSync(e))return [];try{let t=c.readdirSync(e).filter(i=>i.endsWith(".habit")).sort(),o=[];for(let i of t)try{let r=c.readFileSync(l.join(e,i),"utf8"),n=y.load(r);n?.id&&n?.name&&o.push(n);}catch{}return o}catch{return []}}function S(e){if(!c.existsSync(e))return null;try{let t=c.readFileSync(e,"utf8");return y.load(t)}catch{return null}}function D(e,t){if(t.habits)for(let o of t.habits)e.set(o.id,{...o});if(t.overrides)for(let[o,i]of Object.entries(t.overrides)){let r=e.get(o);r&&J(r,i);}}function J(e,t){t.severity!==void 0&&(e.severity=t.severity),t.enabled!==void 0&&(e.enabled=t.enabled);}function X(e){return e.filter(t=>t.enabled)}function Z(e){let t=l.resolve(e);k.delete(t);}var le=[{id:"explore-before-implement",name:"Explore Before Implementing",description:"Call ripple/navigate/search before modifying existing symbols to understand impact",category:"discovery",trigger:"preflight",severity:"advisory",check:{type:"tool-called",params:{tools:["paradigm_ripple","paradigm_navigate","paradigm_search","paradigm_related"]}},enabled:true},{id:"ripple-before-modify",name:"Ripple Before Modifying",description:"Run ripple analysis before modifying symbols with dependents",category:"discovery",trigger:"preflight",severity:"advisory",check:{type:"tool-called",params:{tools:["paradigm_ripple"]}},enabled:true},{id:"check-fragility",name:"Check Fragility",description:"Check history fragility for symbols before modifying frequently-broken code",category:"discovery",trigger:"preflight",severity:"advisory",check:{type:"tool-called",params:{tools:["paradigm_history_fragility"]}},enabled:true},{id:"wisdom-before-implement",name:"Check Team Wisdom",description:"Check team wisdom (preferences, antipatterns, decisions) before implementing",category:"collaboration",trigger:"preflight",severity:"advisory",check:{type:"tool-called",params:{tools:["paradigm_wisdom_context","paradigm_wisdom_expert"]}},enabled:true},{id:"verify-before-done",name:"Verify Before Done",description:"Run postflight compliance checks before finishing a session",category:"verification",trigger:"on-stop",severity:"warn",check:{type:"tool-called",params:{tools:["paradigm_pm_postflight"]}},enabled:true},{id:"postflight-compliance",name:"Postflight Compliance",description:"Ensure postflight checks pass without errors before finishing",category:"verification",trigger:"on-stop",severity:"advisory",check:{type:"tool-called",params:{tools:["paradigm_pm_postflight","paradigm_reindex"]}},enabled:true},{id:"test-new-components",name:"Test New Components",description:"New components should have associated tests or test plan documented",category:"testing",trigger:"postflight",severity:"advisory",check:{type:"tests-exist",params:{patterns:["**/*.test.*","**/*.spec.*","**/tests/**"]}},enabled:true},{id:"purpose-coverage",name:"Purpose File Coverage",description:"All modified source directories should have .purpose file coverage",category:"documentation",trigger:"postflight",severity:"warn",check:{type:"file-exists",params:{patterns:["**/.purpose"]}},enabled:true},{id:"record-lore-for-significant",name:"Record Lore for Significant Changes",description:"Sessions modifying 3+ files should record a lore entry",category:"documentation",trigger:"on-stop",severity:"warn",check:{type:"lore-recorded",params:{}},enabled:true},{id:"confidence-on-decisions",name:"Confidence on Decisions",description:"When recording lore, include a confidence score (0.0-1.0) to enable calibration tracking over time",category:"documentation",trigger:"on-stop",severity:"advisory",check:{type:"tool-called",params:{tools:["paradigm_lore_record"]}},enabled:true},{id:"gates-for-routes",name:"Gates for Routes",description:"API routes should have corresponding gate declarations in portal.yaml",category:"security",trigger:"postflight",severity:"warn",check:{type:"gates-declared",params:{requireRoutes:true}},enabled:true},{id:"university-content-valid",name:"University Content Valid",description:"Validate university content integrity when files in symbol-covered areas change",category:"quality",trigger:"on-stop",severity:"advisory",check:{type:"tool-called",params:{tools:["paradigm_university_validate"]}},enabled:true},{id:"university-onboarded",name:"University Onboarding",description:"Call paradigm_university_onboard at session start for project-specific learning content",category:"discovery",trigger:"preflight",severity:"advisory",check:{type:"tool-called",params:{tools:["paradigm_university_onboard"]}},enabled:false},{id:"orchestration-required",name:"Orchestrate Complex Tasks",description:"Tasks affecting 3+ files or touching security symbols should use paradigm_orchestrate_inline to determine which agents are needed. Ensures security review, test coverage, and documentation.",category:"collaboration",trigger:"preflight",severity:"warn",check:{type:"tool-called",params:{tools:["paradigm_orchestrate_inline"]}},enabled:true},{id:"agent-coverage-validated",name:"Validate Agent Involvement",description:"After completing work, verify that agents with relevant expertise were consulted. Check nominations that were surfaced but not acted on.",category:"collaboration",trigger:"postflight",severity:"advisory",check:{type:"tool-called",params:{tools:["paradigm_ambient_nominations","paradigm_agent_list"]}},enabled:true},{id:"hot-mode-incident",name:"Incident Response Acknowledgment",description:"During incident response, orchestration enforcement is waived. But a post-incident lore entry is required and a postflight review should be scheduled.",category:"collaboration",trigger:"on-stop",severity:"advisory",check:{type:"lore-recorded"},enabled:true}];function ce(e,t){return e.filter(o=>o.enabled&&o.trigger===t)}new Set(le.map(e=>e.id));function F(e,t,o,i,r){let n=ce(e,t);i&&(n=n.filter(a=>!a.platforms||a.platforms.includes(i)));let u=0;if(r)try{let{isGraduated:a}=(j(),f(M)),O=n.length;n=n.filter(q=>!a(r,q.id)),u=O-n.length;}catch{}let s=n.map(a=>ue(a,o)),W=s.filter(a=>a.result==="followed").length,I=s.filter(a=>a.result==="skipped").length,N=s.filter(a=>a.result==="partial").length,_=s.filter(a=>a.result==="skipped"&&a.habit.severity==="block").length;return {trigger:t,evaluations:s,summary:{total:s.length,followed:W,skipped:I,partial:N,blockingViolations:_},blocksCompletion:_>0}}function $(e){return {toolsCalled:e.toolsCalled||[],filesModified:e.filesModified||[],symbolsTouched:e.symbolsTouched||[],loreRecorded:e.loreRecorded||false,hasPortalRoutes:e.hasPortalRoutes||false,taskAddsRoutes:e.taskAddsRoutes||false,taskDescription:e.taskDescription,gitClean:e.gitClean}}function ue(e,t){switch(e.check.type){case "tool-called":return fe(e,t);case "file-exists":return pe(e,t);case "file-modified":return be(e,t);case "lore-recorded":return ge(e,t);case "symbols-registered":return me(e,t);case "gates-declared":return he(e,t);case "tests-exist":return ye(e,t);case "git-clean":return ve(e,t);case "commit-message-format":return Ce(e,t);case "flow-coverage":return He(e,t);case "context-checked":return ke(e,t);case "aspect-anchored":return we(e,t);default:return {habit:e,result:"partial",reason:`Unknown check: ${e.check.type}`}}}function fe(e,t){let o=e.check.params.tools||[];if(o.length===0)return {habit:e,result:"followed",reason:"No tools required"};let i=o.filter(r=>t.toolsCalled.includes(r));return i.length>0?{habit:e,result:"followed",reason:`Called: ${i.join(", ")}`,evidence:i}:t.filesModified.length===0&&t.symbolsTouched.length===0?{habit:e,result:"followed",reason:"No modifications, habit not applicable"}:{habit:e,result:"skipped",reason:`None of [${o.join(", ")}] were called before modifying code`}}function pe(e,t){if(t.filesModified.length===0)return {habit:e,result:"followed",reason:"No files modified"};if(t.filesModified.some(r=>r.endsWith(".purpose")||r.includes(".paradigm/")))return {habit:e,result:"followed",reason:"Purpose files updated"};let i=t.filesModified.filter(r=>!r.endsWith(".md")&&!r.endsWith(".json")&&!r.endsWith(".yaml")&&!r.endsWith(".yml")&&!r.endsWith(".lock")&&!r.endsWith(".purpose")&&!r.includes(".paradigm/"));return i.length===0?{habit:e,result:"followed",reason:"Only non-source files modified"}:{habit:e,result:"skipped",reason:`${i.length} source file(s) without .purpose updates`,evidence:i.slice(0,5)}}function ge(e,t){let o=t.filesModified.filter(i=>!i.endsWith(".md")&&!i.endsWith(".json")&&!i.endsWith(".yaml")&&!i.endsWith(".yml")&&!i.endsWith(".lock")&&!i.endsWith(".purpose")&&!i.includes(".paradigm/"));return o.length<3?{habit:e,result:"followed",reason:"Session not significant (< 3 source files)"}:t.loreRecorded||t.toolsCalled.includes("paradigm_lore_record")?{habit:e,result:"followed",reason:"Lore recorded"}:{habit:e,result:"skipped",reason:`${o.length} source files modified, no lore entry`,evidence:o.slice(0,5)}}function me(e,t){if(t.symbolsTouched.length===0)return {habit:e,result:"followed",reason:"No symbols touched"};let i=["paradigm_purpose_add_component","paradigm_purpose_add_signal","paradigm_purpose_add_flow","paradigm_purpose_add_gate","paradigm_purpose_add_aspect","paradigm_purpose_init"].filter(r=>t.toolsCalled.includes(r));return i.length>0?{habit:e,result:"followed",reason:`Purpose tools called: ${i.join(", ")}`,evidence:i}:{habit:e,result:"partial",reason:`${t.symbolsTouched.length} symbol(s) touched, no purpose registration`}}function he(e,t){if(!t.taskAddsRoutes)return {habit:e,result:"followed",reason:"No routes added"};if(t.hasPortalRoutes)return {habit:e,result:"followed",reason:"Portal.yaml has routes"};let i=["paradigm_gates_for_route","paradigm_portal_add_route","paradigm_portal_add_gate"].filter(r=>t.toolsCalled.includes(r));return i.length>0?{habit:e,result:"followed",reason:`Gate tools called: ${i.join(", ")}`,evidence:i}:{habit:e,result:"skipped",reason:"Routes added without gate declarations"}}function ye(e,t){if(t.filesModified.length===0)return {habit:e,result:"followed",reason:"No files modified"};let o=t.filesModified.filter(r=>r.includes(".test.")||r.includes(".spec.")||r.includes("/tests/")||r.includes("/test/")||r.includes("__tests__"));if(o.length>0)return {habit:e,result:"followed",reason:`Test files: ${o.length}`,evidence:o.slice(0,5)};let i=t.filesModified.filter(r=>!r.endsWith(".md")&&!r.endsWith(".json")&&!r.endsWith(".yaml")&&!r.endsWith(".lock")&&!r.endsWith(".purpose")&&!r.includes(".paradigm/")&&!r.includes("node_modules/"));return i.length===0?{habit:e,result:"followed",reason:"No source files to test"}:{habit:e,result:"partial",reason:`${i.length} source file(s), no test files updated`,evidence:i.slice(0,5)}}function be(e,t){if(t.filesModified.length===0)return {habit:e,result:"followed",reason:"No files modified"};let o=e.check.params.patterns||[];if(o.length===0)return {habit:e,result:"followed",reason:"No patterns specified"};if(e.trigger==="on-stop"&&e.severity==="block"){let r=t.filesModified.filter(n=>o.some(u=>n.includes(u)||l.basename(n)===u));return r.length>0?{habit:e,result:"followed",reason:`Matching files: ${r.join(", ")}`,evidence:r}:{habit:e,result:"partial",reason:`None of [${o.join(", ")}] in git diff yet (may not be committed). Use on-commit trigger for reliable check.`}}let i=t.filesModified.filter(r=>o.some(n=>r.includes(n)||l.basename(r)===n));return i.length>0?{habit:e,result:"followed",reason:`Matching files: ${i.join(", ")}`,evidence:i}:{habit:e,result:"skipped",reason:`None of [${o.join(", ")}] found in modified files`}}function ve(e,t){return t.filesModified.length===0?{habit:e,result:"followed",reason:"No files modified"}:e.trigger==="on-stop"?{habit:e,result:"followed",reason:"git-clean skipped on-stop (uncommitted changes expected before commit)"}:t.gitClean===void 0?{habit:e,result:"partial",reason:"Git status not available"}:t.gitClean?{habit:e,result:"followed",reason:"Working tree is clean \u2014 changes committed"}:{habit:e,result:"skipped",reason:"Uncommitted changes in working tree"}}function Ce(e,t){if(!t.commitMessage)return {habit:e,result:"followed",reason:"No commit message to check (not a commit trigger)"};let o=e.check.params.messagePatterns||["^(feat|fix|refactor|chore|docs|test|style|perf|ci|build)\\(","Symbols:"],i=o.filter(r=>new RegExp(r,"m").test(t.commitMessage));if(i.length===o.length)return {habit:e,result:"followed",reason:"Commit message matches all required patterns",evidence:i};if(i.length>0){let r=o.filter(n=>!new RegExp(n,"m").test(t.commitMessage));return {habit:e,result:"partial",reason:`Matches ${i.length}/${o.length} patterns. Missing: ${r.join(", ")}`}}return {habit:e,result:"skipped",reason:"Commit message does not match required format patterns"}}function He(e,t){let o=t.symbolsTouched.filter(n=>n.startsWith("#"));if(o.length<3)return {habit:e,result:"followed",reason:"Fewer than 3 components touched \u2014 flow not required"};if(t.hasFlowCoverage)return {habit:e,result:"followed",reason:"Flow coverage exists for multi-component changes"};let r=["paradigm_flow_check","paradigm_flows_affected","paradigm_purpose_add_flow"].filter(n=>t.toolsCalled.includes(n));return r.length>0?{habit:e,result:"followed",reason:`Flow tools called: ${r.join(", ")}`,evidence:r}:{habit:e,result:"skipped",reason:`${o.length} components touched without flow coverage`,evidence:o.slice(0,5)}}function ke(e,t){let i=(e.check.params.contextTools||["paradigm_session_health","paradigm_session_recover","paradigm_session_checkpoint"]).filter(r=>t.toolsCalled.includes(r));return i.length>0?{habit:e,result:"followed",reason:`Context tools called: ${i.join(", ")}`,evidence:i}:t.filesModified.length===0&&t.symbolsTouched.length===0?{habit:e,result:"followed",reason:"No modifications, context check not applicable"}:{habit:e,result:"skipped",reason:"No context/session tools called during session"}}function we(e,t){let o=t.symbolsTouched.filter(i=>i.startsWith("~"));return o.length===0?{habit:e,result:"followed",reason:"No aspects touched"}:t.aspectAnchorsValid===true?{habit:e,result:"followed",reason:"Aspect anchors validated and valid"}:t.toolsCalled.includes("paradigm_aspect_check")?{habit:e,result:"followed",reason:"paradigm_aspect_check was called to validate anchors"}:{habit:e,result:"skipped",reason:`${o.length} aspect(s) touched without anchor validation`,evidence:o.slice(0,5)}}export{z as a,X as b,Z as c,F as d,$ as e};
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env node
2
- import {c,a,e}from'./chunk-XHJ27CER.js';var y=c((q,d)=>{var l=Object.defineProperty,S=Object.getOwnPropertyDescriptor,L=Object.getOwnPropertyNames,$=Object.prototype.hasOwnProperty,P=(t,r)=>{for(var e in r)l(t,e,{get:r[e],enumerable:true});},D=(t,r,e,o)=>{if(r&&typeof r=="object"||typeof r=="function")for(let s of L(r))!$.call(t,s)&&s!==e&&l(t,s,{get:()=>r[s],enumerable:!(o=S(r,s))||o.enumerable});return t},T=t=>D(l({},"__esModule",{value:true}),t),h={};P(h,{ParadigmLogger:()=>g,createCorrelationId:()=>A,log:()=>U,withCorrelation:()=>M});d.exports=T(h);var x={debug:"\x1B[90m",info:"\x1B[36m",warn:"\x1B[33m",error:"\x1B[31m"},E="\x1B[1m",c="\x1B[0m";function I(){let t=new Date,r=String(t.getHours()).padStart(2,"0"),e=String(t.getMinutes()).padStart(2,"0"),o=String(t.getSeconds()).padStart(2,"0"),s=String(t.getMilliseconds()).padStart(3,"0");return `${r}:${e}:${o}.${s}`}function j(t){return !t||Object.keys(t).length===0?"":" "+JSON.stringify(t)}function C(t,r,e,o,s,i){let n=x[t],a=t.toUpperCase().padEnd(5),b=I(),w=j(i?{correlationId:i,...s}:s);return `${n}${b}${c} ${E}${r}${c} ${n}${a}${c} ${o}${w}`}function F(t,r,e,o,s,i){let n={timestamp:new Date().toISOString(),level:t,symbol:r,symbolType:e,message:o,...s};return i&&(n.correlationId=i),JSON.stringify(n)}var B=a("async_hooks"),N=a("crypto"),f=new B.AsyncLocalStorage;function A(){return (0, N.randomUUID)()}function M(t,r){return f.run(t,r)}function R(){return f.getStore()}var u={debug:0,info:1,warn:2,error:3};function V(){let t=typeof process<"u"?process.env:{},r=t.LOG_LEVEL;return r&&u[r]!==void 0?r:t.NODE_ENV==="production"?"info":"debug"}function k(){let t=typeof process<"u"?process.env:{};return t.PARADIGM_LOG_FORMAT==="json"||t.NODE_ENV==="production"?"json":"pretty"}function G(){let r=(typeof process<"u"?process.env:{}).PARADIGM_SYMBOLS;return r?r.split(",").map(e=>e.trim()).filter(Boolean):null}var J=class{constructor(t){this.emit=t,this.startTime=Date.now();}startTime;success(t,r){this.end("info",t,r);}error(t,r){this.end("error",t,r);}end(t,r,e){let o=Date.now()-this.startTime;this.emit(t,r,{...e,duration:`${o}ms`});}},m=class{constructor(t,r,e,o,s,i,n=[]){this.symbol=t,this.symbolType=r,this.minLevel=e,this.symbolFilter=o,this.format=s,this.output=i,this.transports=n;}debug(t,r){this.emit("debug",t,r);}info(t,r){this.emit("info",t,r);}warn(t,r){this.emit("warn",t,r);}error(t,r){this.emit("error",t,r);}start(t,r){return this.emit("info",t,r),new J((e,o,s)=>this.emit(e,o,s))}emit(t,r,e){if(u[t]<u[this.minLevel])return;if(this.symbolFilter){let n=this.symbol.charAt(0);if(!this.symbolFilter.includes(n))return}let o=R(),i=(this.format==="json"?F:C)(t,this.symbol,this.symbolType,r,e,o);if(this.output(i),this.transports.length>0){let n={level:t,symbol:this.symbol,symbolType:this.symbolType,message:r,data:e,correlationId:o,timestamp:new Date().toISOString()};for(let a of this.transports)a.send(n);}}},g=class{level;symbolFilter;format;output;transports;constructor(t){this.level=t?.level??V(),this.symbolFilter=t?.symbols??G(),this.format=t?.format??k(),this.output=t?.output??(r=>console.log(r)),this.transports=t?.transports??[];}addTransport(t){this.transports.push(t);}removeTransport(t){let r=this.transports.indexOf(t);r!==-1&&this.transports.splice(r,1);}component(t){return this.create(t,"component","#")}gate(t){return this.create(t,"gate","^")}signal(t){return this.create(t,"signal","!")}flow(t){return this.create(t,"flow","$")}aspect(t){return this.create(t,"aspect","~")}raw(t){return new m(t,"raw",this.level,this.symbolFilter,this.format,this.output,this.transports)}create(t,r,e){let o=t.startsWith(e)?t:`${e}${t}`;return new m(o,r,this.level,this.symbolFilter,this.format,this.output,this.transports)}},U=new g;});var v=e(y(),1),W=new v.ParadigmLogger({output:t=>process.stderr.write(t+`
3
- `)});export{W as a};
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env node
2
- import {c,a,b,e}from'./chunk-XHJ27CER.js';var y=c((z,d)=>{var l=Object.defineProperty,L=Object.getOwnPropertyDescriptor,$=Object.getOwnPropertyNames,P=Object.prototype.hasOwnProperty,D=(t,r)=>{for(var e in r)l(t,e,{get:r[e],enumerable:true});},T=(t,r,e,o)=>{if(r&&typeof r=="object"||typeof r=="function")for(let s of $(r))!P.call(t,s)&&s!==e&&l(t,s,{get:()=>r[s],enumerable:!(o=L(r,s))||o.enumerable});return t},x=t=>T(l({},"__esModule",{value:true}),t),h={};D(h,{ParadigmLogger:()=>g,createCorrelationId:()=>M,log:()=>q,withCorrelation:()=>R});d.exports=x(h);var E={debug:"\x1B[90m",info:"\x1B[36m",warn:"\x1B[33m",error:"\x1B[31m"},I="\x1B[1m",c="\x1B[0m";function j(){let t=new Date,r=String(t.getHours()).padStart(2,"0"),e=String(t.getMinutes()).padStart(2,"0"),o=String(t.getSeconds()).padStart(2,"0"),s=String(t.getMilliseconds()).padStart(3,"0");return `${r}:${e}:${o}.${s}`}function C(t){return !t||Object.keys(t).length===0?"":" "+JSON.stringify(t)}function F(t,r,e,o,s,i){let n=E[t],a=t.toUpperCase().padEnd(5),b=j(),w=C(i?{correlationId:i,...s}:s);return `${n}${b}${c} ${I}${r}${c} ${n}${a}${c} ${o}${w}`}function B(t,r,e,o,s,i){let n={timestamp:new Date().toISOString(),level:t,symbol:r,symbolType:e,message:o,...s};return i&&(n.correlationId=i),JSON.stringify(n)}var N=a("async_hooks"),A=a("crypto"),f=new N.AsyncLocalStorage;function M(){return (0, A.randomUUID)()}function R(t,r){return f.run(t,r)}function V(){return f.getStore()}var u={debug:0,info:1,warn:2,error:3};function k(){let t=typeof process<"u"?process.env:{},r=t.LOG_LEVEL;return r&&u[r]!==void 0?r:t.NODE_ENV==="production"?"info":"debug"}function G(){let t=typeof process<"u"?process.env:{};return t.PARADIGM_LOG_FORMAT==="json"||t.NODE_ENV==="production"?"json":"pretty"}function J(){let r=(typeof process<"u"?process.env:{}).PARADIGM_SYMBOLS;return r?r.split(",").map(e=>e.trim()).filter(Boolean):null}var U=class{constructor(t){this.emit=t,this.startTime=Date.now();}startTime;success(t,r){this.end("info",t,r);}error(t,r){this.end("error",t,r);}end(t,r,e){let o=Date.now()-this.startTime;this.emit(t,r,{...e,duration:`${o}ms`});}},m=class{constructor(t,r,e,o,s,i,n=[]){this.symbol=t,this.symbolType=r,this.minLevel=e,this.symbolFilter=o,this.format=s,this.output=i,this.transports=n;}debug(t,r){this.emit("debug",t,r);}info(t,r){this.emit("info",t,r);}warn(t,r){this.emit("warn",t,r);}error(t,r){this.emit("error",t,r);}start(t,r){return this.emit("info",t,r),new U((e,o,s)=>this.emit(e,o,s))}emit(t,r,e){if(u[t]<u[this.minLevel])return;if(this.symbolFilter){let n=this.symbol.charAt(0);if(!this.symbolFilter.includes(n))return}let o=V(),i=(this.format==="json"?B:F)(t,this.symbol,this.symbolType,r,e,o);if(this.output(i),this.transports.length>0){let n={level:t,symbol:this.symbol,symbolType:this.symbolType,message:r,data:e,correlationId:o,timestamp:new Date().toISOString()};for(let a of this.transports)a.send(n);}}},g=class{level;symbolFilter;format;output;transports;constructor(t){this.level=t?.level??k(),this.symbolFilter=t?.symbols??J(),this.format=t?.format??G(),this.output=t?.output??(r=>console.log(r)),this.transports=t?.transports??[];}addTransport(t){this.transports.push(t);}removeTransport(t){let r=this.transports.indexOf(t);r!==-1&&this.transports.splice(r,1);}component(t){return this.create(t,"component","#")}gate(t){return this.create(t,"gate","^")}signal(t){return this.create(t,"signal","!")}flow(t){return this.create(t,"flow","$")}aspect(t){return this.create(t,"aspect","~")}raw(t){return new m(t,"raw",this.level,this.symbolFilter,this.format,this.output,this.transports)}create(t,r,e){let o=t.startsWith(e)?t:`${e}${t}`;return new m(o,r,this.level,this.symbolFilter,this.format,this.output,this.transports)}},q=new g;});var v,Q,Y=b(()=>{v=e(y(),1),Q=new v.ParadigmLogger({output:t=>process.stderr.write(t+`
3
- `)});});export{Q as a,Y as b};
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env node
2
- import {b as b$1,a as a$1}from'./chunk-F5BSUC2L.js';import {n,m}from'./chunk-3OMJI5TT.js';import {f as f$1}from'./chunk-XHJ27CER.js';import*as r from'fs';import*as a from'path';import*as x from'os';import*as T from'crypto';import*as h from'js-yaml';function w(){let n=a.join(x.homedir(),".paradigm");return r.existsSync(n)||r.mkdirSync(n,{recursive:true}),n}function M(n){let s=a.resolve(n);return T.createHash("sha256").update(s).digest("hex").slice(0,12)}function f(n){let s=M(n),e=a.join(w(),"sessions",s);r.existsSync(e)||r.mkdirSync(e,{recursive:true});let t=a.join(e,"pending-handoffs");return r.existsSync(t)||r.mkdirSync(t,{recursive:true}),e}function S(n){let s=f(n),e=a.join(s,"_project-meta.json"),o={name:a.basename(a.resolve(n)),path:a.resolve(n),lastSeen:new Date().toISOString()};r.writeFileSync(e,JSON.stringify(o,null,2));}function O(n,s){let e=f(n),t=a.join(e,"pending-handoffs",`${s.id}.json`);r.writeFileSync(t,JSON.stringify(s,null,2));}function A(n){let s=f(n),e=a.join(s,"pending-handoffs");if(!r.existsSync(e))return [];let t=[];try{let o=r.readdirSync(e);for(let l of o)if(l.endsWith(".json"))try{let u=r.readFileSync(a.join(e,l),"utf8"),m=JSON.parse(u);m.status==="pending"&&t.push(m);}catch{}}catch{}return t.sort((o,l)=>new Date(o.timestamp).getTime()-new Date(l.timestamp).getTime()),t}function W(n,s){let e=f(n),t=a.join(e,"pending-handoffs",`${s}.json`);if(r.existsSync(t))try{let o=r.readFileSync(t,"utf8"),l=JSON.parse(o);l.status="delivered",r.writeFileSync(t,JSON.stringify(l,null,2));}catch{}}function y(){let n=a.join(w(),"wisdom");return r.existsSync(n)||r.mkdirSync(n,{recursive:true}),n}function H(){let n=a.join(y(),"antipatterns.yaml");if(!r.existsSync(n))return [];try{let s=r.readFileSync(n,"utf8");return h.load(s)?.antipatterns||[]}catch{return []}}function L(){let n=a.join(y(),"decisions");if(!r.existsSync(n))return [];let s=[];try{let e=r.readdirSync(n);for(let t of e)if(!(!t.endsWith(".yaml")&&!t.endsWith(".yml")))try{let o=r.readFileSync(a.join(n,t),"utf8"),l=h.load(o);s.push(l);}catch{}}catch{}return s.sort((e,t)=>e.id.localeCompare(t.id)),s}function _(){let n=a.join(y(),"preferences.yaml");if(!r.existsSync(n))return null;try{let s=r.readFileSync(n,"utf8");return h.load(s)}catch{return null}}function J(n){let s=a.join(y(),"antipatterns.yaml"),e={version:"1.0",antipatterns:[]};if(r.existsSync(s))try{let t=r.readFileSync(s,"utf8");e=h.load(t),e.antipatterns||(e.antipatterns=[]);}catch{}e.antipatterns.push({...n,added:new Date().toISOString()}),r.writeFileSync(s,h.dump(e,{lineWidth:-1}));}function U(n){let s=a.join(y(),"decisions");r.existsSync(s)||r.mkdirSync(s,{recursive:true});let e=n.title.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,""),t=`${n.id}-${e}.yaml`,o=a.join(s,t);r.writeFileSync(o,h.dump(n,{lineWidth:-1}));}b$1();var k={"claude-opus-4":{input:15,output:75,name:"Claude Opus 4"},"claude-sonnet-4":{input:3,output:15,name:"Claude Sonnet 4"},"claude-haiku-3.5":{input:.8,output:4,name:"Claude Haiku 3.5"}},j=50,P=".paradigm/session-breadcrumbs.json",I=".paradigm/session-checkpoint.json",E=10080*60*1e3,C=class{session;rootDir=null;_recovered=false;lastLoreEntryId=null;constructor(){this.session=this.createNewSession();}setRootDir(s){this.rootDir=s;try{let{clearSessionWorkLog:e}=(n(),f$1(m));e(s);}catch{}}createNewSession(){return {sessionId:`s${Date.now().toString(36)}`,startTime:Date.now(),lastActivity:Date.now(),model:"claude-sonnet-4",resourceReads:[],toolCalls:[],breadcrumbs:[],totals:{resourceReadCount:0,toolCallCount:0,totalBytes:0,totalTokens:0,estimatedCostUsd:0}}}addBreadcrumb(s,e,t={}){this.session.breadcrumbs.push({timestamp:Date.now(),action:s,tool:t.tool,symbol:t.symbol,summary:e}),this.session.breadcrumbs.length>j&&(this.session.breadcrumbs=this.session.breadcrumbs.slice(-j)),this.persistBreadcrumbs();}getBreadcrumbs(s=20){return this.session.breadcrumbs.slice(-s)}persistBreadcrumbs(){if(!this.rootDir)return;let s={sessionId:this.session.sessionId,startTime:this.session.startTime,lastActivity:this.session.lastActivity,breadcrumbs:this.session.breadcrumbs,symbolsModified:this.extractSymbolsFromBreadcrumbs(),filesExplored:this.extractFilesFromBreadcrumbs()},e;try{e=JSON.stringify(s,null,2);}catch(t){a$1.component("#session-tracker").error("persistBreadcrumbs: JSON.stringify failed",{error:t.message});return}try{let t=a.join(this.rootDir,P),o=a.dirname(t);r.existsSync(o)||r.mkdirSync(o,{recursive:!0}),r.writeFileSync(t,e);}catch(t){a$1.component("#session-tracker").error("persistBreadcrumbs: local write failed",{error:t.message});}try{let t=f(this.rootDir);r.writeFileSync(a.join(t,"breadcrumbs.json"),e),S(this.rootDir);}catch(t){a$1.component("#session-tracker").error("persistBreadcrumbs: global write failed",{error:t.message});}}loadPreviousSession(){if(!this.rootDir)return null;try{let s=f(this.rootDir),e=a.join(s,"breadcrumbs.json");if(r.existsSync(e)){let t=r.readFileSync(e,"utf8");return JSON.parse(t)}}catch{}try{let s=a.join(this.rootDir,P);if(!r.existsSync(s))return null;let e=r.readFileSync(s,"utf8");return JSON.parse(e)}catch{return null}}saveCheckpoint(s){let e={phase:s.phase,context:s.context,timestamp:Date.now(),sessionId:this.session.sessionId,externalId:s.externalId,plan:s.plan,modifiedFiles:s.modifiedFiles,symbolsTouched:s.symbolsTouched,decisions:s.decisions,recentBreadcrumbs:this.session.breadcrumbs.slice(-10)},t=this.persistCheckpoint(e);return {checkpoint:e,persisted:t}}loadCheckpoint(){if(!this.rootDir)return null;let s=null;try{let e=f(this.rootDir),t=a.join(e,"checkpoint.json");if(r.existsSync(t)){let o=r.readFileSync(t,"utf8");s=JSON.parse(o);}}catch{}if(!s)try{let e=a.join(this.rootDir,I);if(r.existsSync(e)){let t=r.readFileSync(e,"utf8");s=JSON.parse(t);}}catch{}if(s&&Date.now()-s.timestamp>E)return null;if(s)for(let e of ["modifiedFiles","symbolsTouched","decisions"]){let t=s[e];if(typeof t=="string")try{s[e]=JSON.parse(t);}catch{s[e]=[];}}return s}persistCheckpoint(s){let e={local:false,global:false};if(!this.rootDir)return a$1.component("#session-tracker").warn("persistCheckpoint: rootDir not set, skipping write"),e;let t;try{t=JSON.stringify(s,null,2);}catch(o){return a$1.component("#session-tracker").error("persistCheckpoint: JSON.stringify failed",{error:o.message}),e}try{let o=a.join(this.rootDir,I),l=a.dirname(o);r.existsSync(l)||r.mkdirSync(l,{recursive:!0}),r.writeFileSync(o,t),e.local=!0;}catch(o){a$1.component("#session-tracker").error("persistCheckpoint: local write failed",{error:o.message});}try{let o=f(this.rootDir);r.writeFileSync(a.join(o,"checkpoint.json"),t),S(this.rootDir),e.global=!0;}catch(o){a$1.component("#session-tracker").error("persistCheckpoint: global write failed",{error:o.message});}return e}setLastLoreEntryId(s){this.lastLoreEntryId=s;}getLastLoreEntryId(){return this.lastLoreEntryId}hasRecoveredThisSession(){return this._recovered}markRecovered(){this._recovered=true;}extractSymbolsFromBreadcrumbs(){let s=new Set;for(let e of this.session.breadcrumbs)e.symbol&&s.add(e.symbol);return Array.from(s)}extractFilesFromBreadcrumbs(){let s=new Set;for(let e of this.session.breadcrumbs){let t=e.summary.match(/\b[\w./]+\.(ts|js|tsx|jsx|py|go|rs|yaml|json|md)\b/g);if(t)for(let o of t)s.add(o);}return Array.from(s)}estimateTokens(s){let e=typeof s=="number"?s:s.length;return Math.ceil(e/3.5)}calculateCost(s,e=true){let t=k[this.session.model],o=e?t.output:t.input;return s/1e6*o}setModel(s){this.session.model=s,this.recalculateTotals();}getModel(){return this.session.model}trackResourceRead(s,e){let t=this.extractResourceType(s),o=this.estimateTokens(e);this.session.resourceReads.push({timestamp:Date.now(),resourceType:t,uri:s,bytes:e,tokens:o}),this.session.lastActivity=Date.now(),this.updateTotals(e,o);}trackToolCall(s,e){let t=this.estimateTokens(e);this.session.toolCalls.push({timestamp:Date.now(),toolName:s,responseBytes:e,responseTokens:t}),this.session.lastActivity=Date.now(),this.updateTotals(e,t);}updateTotals(s,e){this.session.totals.resourceReadCount=this.session.resourceReads.length,this.session.totals.toolCallCount=this.session.toolCalls.length,this.session.totals.totalBytes+=s,this.session.totals.totalTokens+=e,this.session.totals.estimatedCostUsd=this.calculateCost(this.session.totals.totalTokens);}recalculateTotals(){this.session.totals.estimatedCostUsd=this.calculateCost(this.session.totals.totalTokens);}extractResourceType(s){return s.replace("paradigm://","").split("/")[0]||"unknown"}getStats(){return {...this.session}}getCostBreakdown(){let s={},e=0,t=0;for(let i of this.session.resourceReads)s[i.resourceType]||(s[i.resourceType]={count:0,bytes:0,tokens:0}),s[i.resourceType].count++,s[i.resourceType].bytes+=i.bytes,s[i.resourceType].tokens+=i.tokens,e+=i.bytes,t+=i.tokens;let o={},l=0,u=0;for(let i of this.session.toolCalls)o[i.toolName]||(o[i.toolName]={count:0,bytes:0,tokens:0}),o[i.toolName].count++,o[i.toolName].bytes+=i.responseBytes,o[i.toolName].tokens+=i.responseTokens,l+=i.responseBytes,u+=i.responseTokens;let m=t+u,g=this.calculateCost(m);return {model:k[this.session.model].name,modelId:this.session.model,pricing:k[this.session.model],resources:{count:this.session.resourceReads.length,bytes:e,tokens:t,costUsd:this.calculateCost(t),byType:s},tools:{count:this.session.toolCalls.length,bytes:l,tokens:u,costUsd:this.calculateCost(u),byName:o},total:{tokens:m,costUsd:g}}}getHandoffRecommendation(s=2e5,e){let t=this.session.totals.totalTokens,o=t*4,l=e||t+o,u=Math.round(l/s*100),m,g;u>=85?(m="handoff-urgent",g="Context is nearly full. Initiate handoff immediately to preserve session continuity."):u>=70?(m="handoff-recommended",g="Context usage is high. Consider initiating handoff soon to ensure smooth transition."):u>=50?(m="consider-handoff",g="Context usage is moderate. Plan a good stopping point for potential handoff."):(m="continue",g="Context usage is healthy. Continue working.");let i=[],v=Math.round((Date.now()-this.session.startTime)/6e4),D=this.session.toolCalls.length+this.session.resourceReads.length;return D>50&&i.push(`High number of MCP interactions (${D})`),v>30&&i.push(`Session duration >30 min (${v} min)`),this.session.totals.totalBytes>5e5&&i.push(`Large data volume (${Math.round(this.session.totals.totalBytes/1024)}KB)`),{recommendation:m,message:g,usagePercent:u,signals:i}}getDurationMinutes(){return Math.round((Date.now()-this.session.startTime)/6e4)}reset(){this.session=this.createNewSession(),this._recovered=false,this.lastLoreEntryId=null;}},b=null;function X(){return b||(b=new C),b}function q(){b&&b.reset();}
3
- export{O as a,A as b,W as c,H as d,L as e,_ as f,J as g,U as h,k as i,X as j,q as k};
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- import {d,b as b$1}from'./chunk-XHJ27CER.js';import*as s from'fs';import*as c from'path';import*as g from'js-yaml';var b={};d(b,{getJournalStats:()=>S,loadAllJournalEntries:()=>E,loadJournalEntries:()=>f,loadJournalEntry:()=>J,recordJournalEntry:()=>h});function m(e){let r=process.env.HOME||process.env.USERPROFILE||"";return c.join(r,".paradigm","agents",e,"journal")}function y(){let e=new Date,r=e.toISOString().slice(0,10),i=e.toISOString().slice(11,19).replace(/:/g,""),o=String(Math.floor(Math.random()*999)+1).padStart(3,"0");return `LJ-${r}-${i}-${o}`}function h(e,r){let i=new Date,o=y(),a={id:o,agent:e,timestamp:i.toISOString(),...r},t=m(e);s.mkdirSync(t,{recursive:true});let n=c.join(t,`${o}.yaml`);return s.writeFileSync(n,g.dump(a,{lineWidth:120,noRefs:true}),"utf8"),a}function f(e,r){let i=m(e);if(!s.existsSync(i))return [];let o=[],a=s.readdirSync(i).filter(n=>n.endsWith(".yaml"));for(let n of a)try{let l=s.readFileSync(c.join(i,n),"utf8"),u=g.load(l);u&&u.id&&o.push(u);}catch{}let t=o;return r?.trigger&&(t=t.filter(n=>n.trigger===r.trigger)),r?.project&&(t=t.filter(n=>n.project===r.project)),r?.transferable!==void 0&&(t=t.filter(n=>n.transferable===r.transferable)),r?.tag&&(t=t.filter(n=>n.tags?.some(l=>l.startsWith(r.tag)))),r?.dateFrom&&(t=t.filter(n=>n.timestamp>=r.dateFrom)),r?.dateTo&&(t=t.filter(n=>n.timestamp<=r.dateTo)),t.sort((n,l)=>l.timestamp.localeCompare(n.timestamp)),r?.limit&&(t=t.slice(0,r.limit)),t}function J(e,r){let i=m(e),o=c.join(i,`${r}.yaml`);if(!s.existsSync(o))return null;let a=s.readFileSync(o,"utf8");return g.load(a)}function E(e){let r=process.env.HOME||process.env.USERPROFILE||"",i=c.join(r,".paradigm","agents");if(!s.existsSync(i))return [];let o=[],a=s.readdirSync(i,{withFileTypes:true}).filter(t=>t.isDirectory());for(let t of a){if(e?.agent&&t.name!==e.agent)continue;let n=f(t.name,e);o.push(...n);}return o.sort((t,n)=>n.timestamp.localeCompare(t.timestamp)),e?.limit?o.slice(0,e.limit):o}function S(e){let r=f(e),i={},o={},a=0;for(let t of r)i[t.trigger]=(i[t.trigger]||0)+1,o[t.project]=(o[t.project]||0)+1,t.transferable&&a++;return {total:r.length,byTrigger:i,byProject:o,transferableCount:a,recentInsights:r.slice(0,5).map(t=>({id:t.id,trigger:t.trigger,insight:t.insight.slice(0,200),timestamp:t.timestamp}))}}var j=b$1(()=>{});export{h as a,f as b,J as c,E as d,S as e,b as f,j as g};
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- var h=Object.create;var e=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var j=Object.getOwnPropertyNames;var k=Object.getPrototypeOf,l=Object.prototype.hasOwnProperty;var m=(a=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(a,{get:(b,c)=>(typeof require<"u"?require:b)[c]}):a)(function(a){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+a+'" is not supported')});var n=(a,b)=>()=>(a&&(b=a(a=0)),b);var o=(a,b)=>()=>(b||a((b={exports:{}}).exports,b),b.exports),p=(a,b)=>{for(var c in b)e(a,c,{get:b[c],enumerable:true});},g=(a,b,c,f)=>{if(b&&typeof b=="object"||typeof b=="function")for(let d of j(b))!l.call(a,d)&&d!==c&&e(a,d,{get:()=>b[d],enumerable:!(f=i(b,d))||f.enumerable});return a};var q=(a,b,c)=>(c=a!=null?h(k(a)):{},g(b||!a||!a.__esModule?e(c,"default",{value:a,enumerable:true}):c,a)),r=a=>g(e({},"__esModule",{value:true}),a);export{m as a,n as b,o as c,p as d,q as e,r as f};
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- export{a as doctorCommand}from'./chunk-BCOPNVPY.js';import'./chunk-DOCDDDTD.js';import'./chunk-JQKKVAAN.js';import'./chunk-LKAT7IAK.js';import'./chunk-XHJ27CER.js';
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- export{b as cliBuildGraphState,a as graphCommand,c as graphGenerateCommand}from'./chunk-6QKCUEEY.js';import'./chunk-WR6D3SC6.js';import'./chunk-XHJ27CER.js';
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- export{a as initCommand}from'./chunk-RLJ5K3J5.js';import'./chunk-77WX6HGV.js';import'./chunk-4TXOVRWD.js';import'./chunk-6QKCUEEY.js';import'./chunk-WR6D3SC6.js';import'./chunk-UIKLE3WD.js';import'./chunk-T6IDXUUA.js';import'./chunk-JIXHEBGK.js';import'./chunk-QT2LKB3P.js';import'./chunk-DOCDDDTD.js';import'./chunk-JQKKVAAN.js';import'./chunk-LKAT7IAK.js';import'./chunk-XHJ27CER.js';
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- import {g}from'./chunk-OVDYPOHR.js';export{e as getJournalStats,d as loadAllJournalEntries,b as loadJournalEntries,c as loadJournalEntry,a as recordJournalEntry}from'./chunk-OVDYPOHR.js';import'./chunk-XHJ27CER.js';g();
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- import {j}from'./chunk-W6WVJLHO.js';export{h as addLoreAssessment,e as addLoreReview,i as deleteLoreEntry,a as loadLoreEntries,b as loadLoreEntry,c as loadLoreTimeline,f as rebuildTimeline,d as recordLoreEntry,g as updateLoreEntry}from'./chunk-W6WVJLHO.js';import'./chunk-XHJ27CER.js';j();
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- import {g}from'./chunk-4W5TBL3O.js';export{c as addNotebookEntry,e as incrementApplied,a as loadNotebookEntries,d as promoteFromLore,b as searchNotebooks}from'./chunk-4W5TBL3O.js';import'./chunk-XHJ27CER.js';g();
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- export{ka as getReindexToolsList,la as handleReindexTool,ma as rebuildStaticFiles}from'./chunk-X54WXWCX.js';import'./chunk-M4UMM6DC.js';import'./chunk-W6WVJLHO.js';import'./chunk-NFQLONFY.js';import'./chunk-F5BSUC2L.js';import'./chunk-3OMJI5TT.js';import'./chunk-XHJ27CER.js';
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- export{i as MODEL_PRICING,j as getSessionTracker,k as resetSessionTracker}from'./chunk-NFQLONFY.js';import'./chunk-F5BSUC2L.js';import'./chunk-3OMJI5TT.js';import'./chunk-XHJ27CER.js';