agentix-cli 0.130.0 → 0.132.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (211) hide show
  1. package/dist/{App-DWSHIDN6.js → App-VPYWOTTH.js} +2 -2
  2. package/dist/{ChatApp-CROSI7JM.js → ChatApp-SNED4KJB.js} +2 -2
  3. package/dist/absorb-eval-WGO4JWTO.js +2 -0
  4. package/dist/{agent-4AQOFPRD.js → agent-HXQYYLWZ.js} +2 -2
  5. package/dist/article-sync-4NOPOQU7.js +2 -0
  6. package/dist/{board-dashboard-54A3XTV5.js → board-dashboard-44JPXA7J.js} +330 -235
  7. package/dist/board-dashboard-44JPXA7J.js.map +1 -0
  8. package/dist/{builtin-W6KNX7RS.js → builtin-YD7MC572.js} +2 -2
  9. package/dist/chunk-2ZDV3DCT.js +52 -0
  10. package/dist/chunk-2ZDV3DCT.js.map +1 -0
  11. package/dist/{chunk-QXZLYCEZ.js → chunk-3K35L73A.js} +3 -3
  12. package/dist/chunk-3K35L73A.js.map +1 -0
  13. package/dist/chunk-3UOTLMXD.js +4 -0
  14. package/dist/chunk-3UOTLMXD.js.map +1 -0
  15. package/dist/{chunk-LJWEJ6UZ.js → chunk-3WYLK3SX.js} +2 -2
  16. package/dist/chunk-5BI2T3WD.js +3 -0
  17. package/dist/chunk-5BI2T3WD.js.map +1 -0
  18. package/dist/{chunk-UBA2QJCY.js → chunk-62NXS7PT.js} +272 -247
  19. package/dist/chunk-62NXS7PT.js.map +1 -0
  20. package/dist/chunk-6TURWSMN.js +3 -0
  21. package/dist/{chunk-VD7IO653.js.map → chunk-6TURWSMN.js.map} +1 -1
  22. package/dist/{chunk-I4GT27UO.js → chunk-724IBN5Y.js} +2 -2
  23. package/dist/{chunk-NR7WLMNI.js → chunk-74LPAKQY.js} +2 -2
  24. package/dist/chunk-7D3RJSN4.js +156 -0
  25. package/dist/chunk-7D3RJSN4.js.map +1 -0
  26. package/dist/{chunk-BGG3ZSMW.js → chunk-7LN4VKDU.js} +14 -16
  27. package/dist/chunk-7LN4VKDU.js.map +1 -0
  28. package/dist/chunk-7VLLZQ3N.js +2 -0
  29. package/dist/chunk-7VLLZQ3N.js.map +1 -0
  30. package/dist/{chunk-LLLBH2HH.js → chunk-A6QJ4VFT.js} +2 -2
  31. package/dist/{chunk-SCJ5ZXEN.js → chunk-B2QYMUTD.js} +2 -2
  32. package/dist/{chunk-SCJ5ZXEN.js.map → chunk-B2QYMUTD.js.map} +1 -1
  33. package/dist/chunk-BIJHMWXK.js +21 -0
  34. package/dist/chunk-BIJHMWXK.js.map +1 -0
  35. package/dist/{chunk-4VDA4UM7.js → chunk-BKHIR2YJ.js} +2 -2
  36. package/dist/{chunk-5VKFIBXY.js → chunk-CM74OUXW.js} +2 -2
  37. package/dist/chunk-EQ33PFXP.js +55 -0
  38. package/dist/chunk-EQ33PFXP.js.map +1 -0
  39. package/dist/chunk-HF5EF335.js +8 -0
  40. package/dist/chunk-HF5EF335.js.map +1 -0
  41. package/dist/chunk-IMLAPB7G.js +4 -0
  42. package/dist/chunk-IMLAPB7G.js.map +1 -0
  43. package/dist/{chunk-U2EHJZAZ.js → chunk-JNKATLF7.js} +2 -2
  44. package/dist/{chunk-3PGPN323.js → chunk-JP5OAMWQ.js} +1 -1
  45. package/dist/chunk-JP5OAMWQ.js.map +1 -0
  46. package/dist/chunk-JRVJXAVC.js +861 -0
  47. package/dist/chunk-JRVJXAVC.js.map +1 -0
  48. package/dist/{chunk-J4I5ZJ2V.js → chunk-KDQI5S7F.js} +2 -2
  49. package/dist/chunk-KFIJDLQ5.js +3 -0
  50. package/dist/chunk-KFIJDLQ5.js.map +1 -0
  51. package/dist/{chunk-MZJY26FW.js → chunk-KKQPV6SO.js} +2 -2
  52. package/dist/{chunk-WX67I2KN.js → chunk-KQH4LPYC.js} +2 -2
  53. package/dist/chunk-MCBTVNPX.js +152 -0
  54. package/dist/chunk-MCBTVNPX.js.map +1 -0
  55. package/dist/{chunk-YHCPBMRH.js → chunk-MDGYSHO5.js} +2 -2
  56. package/dist/chunk-MRIVENBY.js +2 -0
  57. package/dist/{article-sync-TLZTHRZB.js.map → chunk-MRIVENBY.js.map} +1 -1
  58. package/dist/{chunk-242MPMJX.js → chunk-QNKSRROH.js} +2 -2
  59. package/dist/{chunk-GLQLCBJS.js → chunk-QSKG754X.js} +6 -3
  60. package/dist/chunk-QSKG754X.js.map +1 -0
  61. package/dist/{chunk-HF4OXA5L.js → chunk-RH3J4LCP.js} +3 -3
  62. package/dist/{chunk-QPYN2UTV.js → chunk-RYGVTAP4.js} +2 -2
  63. package/dist/chunk-S2RRPTS3.js +54 -0
  64. package/dist/chunk-S2RRPTS3.js.map +1 -0
  65. package/dist/{chunk-5KKXJZZ4.js → chunk-UDMI4TYM.js} +2 -2
  66. package/dist/{chunk-TJDNS5G6.js → chunk-VCQVF44A.js} +2 -2
  67. package/dist/{chunk-TN5A7PLU.js → chunk-WWNZL7XB.js} +2 -2
  68. package/dist/{chunk-Q5FEWCS5.js → chunk-XWVBLISN.js} +2 -2
  69. package/dist/{chunk-AD4QZZVN.js → chunk-YXFTUOZR.js} +2 -2
  70. package/dist/{chunk-RKB7FQJF.js → chunk-Z7RJ3K3J.js} +2 -2
  71. package/dist/{chunk-N2YSVZML.js → chunk-ZG4G6BFP.js} +2 -2
  72. package/dist/cli.js +1 -1
  73. package/dist/{client-KGWYROLX.js → client-TXZF32NO.js} +2 -2
  74. package/dist/config-ZIXIH23X.js +2 -0
  75. package/dist/{config-mutate-7BLOYRZF.js → config-mutate-KDBXIN7R.js} +2 -2
  76. package/dist/config-mutator-HKFGPJMG.js +2 -0
  77. package/dist/{contributions-DLUQEAGL.js → contributions-FBVULRR4.js} +2 -2
  78. package/dist/{contributions-DLUQEAGL.js.map → contributions-FBVULRR4.js.map} +1 -1
  79. package/dist/{doctor-32YP26SJ.js → doctor-NBWYG743.js} +2 -2
  80. package/dist/enrich-NH3WHKD6.js +16 -0
  81. package/dist/enrich-NH3WHKD6.js.map +1 -0
  82. package/dist/{failure-candidates-JNGUVBDG.js → failure-candidates-XZSZP4HT.js} +2 -2
  83. package/dist/{follow-up-tool-AQ7NYZZR.js → follow-up-tool-E5XKSPKA.js} +2 -2
  84. package/dist/graph-EXDH7EPZ.js +2 -0
  85. package/dist/hub-3QTJ7E3O.js +2 -0
  86. package/dist/index.d.ts +577 -3
  87. package/dist/index.js +1 -1
  88. package/dist/index.js.map +1 -1
  89. package/dist/load-5DNMGHFW.js +2 -0
  90. package/dist/model-call-BGTDPWZD.js +2 -0
  91. package/dist/notes-WJJEJ4CJ.js +2 -0
  92. package/dist/processes-M3N3S7V5.js +2 -0
  93. package/dist/program-SA5O6IQ3.js +776 -0
  94. package/dist/program-SA5O6IQ3.js.map +1 -0
  95. package/dist/{promote-R7FKN5SY.js → promote-4XHYWHLA.js} +2 -2
  96. package/dist/query-ZGD32CE2.js +2 -0
  97. package/dist/query-settings-BSDXFS3V.js +3 -0
  98. package/dist/query-settings-BSDXFS3V.js.map +1 -0
  99. package/dist/registry-LM35AE2P.js +2 -0
  100. package/dist/{request-planner-LEUMSI2K.js → request-planner-4BAAOUBH.js} +2 -2
  101. package/dist/{review-candidates-MOSGA4IS.js → review-candidates-TM53WR7G.js} +2 -2
  102. package/dist/roster-IRXP32XF.js +2 -0
  103. package/dist/{rotation-memo-7VLREGS6.js → rotation-memo-2G6N3VF3.js} +2 -2
  104. package/dist/{routing-FSJ42RZH.js → routing-QLS6UMLM.js} +2 -2
  105. package/dist/schedule-tool-TTCWBAQ4.js +2 -0
  106. package/dist/{scheduler-6AQDHQI4.js → scheduler-PVXLF2VJ.js} +2 -2
  107. package/dist/scheduler-PVXLF2VJ.js.map +1 -0
  108. package/dist/{seat-O37EQRHE.js → seat-OUUN3F45.js} +2 -2
  109. package/dist/seat-OUUN3F45.js.map +1 -0
  110. package/dist/{select-XO2STSQN.js → select-D7UUSODY.js} +2 -2
  111. package/dist/{set-enabled-ZNEPEFGF.js → set-enabled-FDNS6KW6.js} +2 -2
  112. package/dist/summaries-BIRSNWGH.js +2 -0
  113. package/dist/summaries-BIRSNWGH.js.map +1 -0
  114. package/dist/{tool-PH45YCO5.js → tool-J5FM3OPM.js} +2 -2
  115. package/dist/{tool-6KMEAY4U.js → tool-SCBQYDI3.js} +2 -2
  116. package/dist/wiki-IGRRQL6H.js +2 -0
  117. package/dist/wiki-IGRRQL6H.js.map +1 -0
  118. package/dist/workspace-env-ROH45HXN.js +2 -0
  119. package/dist/workspace-env-ROH45HXN.js.map +1 -0
  120. package/package.json +1 -1
  121. package/dist/absorb-eval-MNGQ752C.js +0 -2
  122. package/dist/article-sync-TLZTHRZB.js +0 -2
  123. package/dist/board-dashboard-54A3XTV5.js.map +0 -1
  124. package/dist/chunk-3PGPN323.js.map +0 -1
  125. package/dist/chunk-76Z4VHDX.js +0 -8
  126. package/dist/chunk-76Z4VHDX.js.map +0 -1
  127. package/dist/chunk-AERIU4AH.js +0 -892
  128. package/dist/chunk-AERIU4AH.js.map +0 -1
  129. package/dist/chunk-BGG3ZSMW.js.map +0 -1
  130. package/dist/chunk-EO4DEEXL.js +0 -2
  131. package/dist/chunk-EO4DEEXL.js.map +0 -1
  132. package/dist/chunk-GLQLCBJS.js.map +0 -1
  133. package/dist/chunk-I4OQQRY2.js +0 -55
  134. package/dist/chunk-I4OQQRY2.js.map +0 -1
  135. package/dist/chunk-JE5EJGGD.js +0 -4
  136. package/dist/chunk-JE5EJGGD.js.map +0 -1
  137. package/dist/chunk-QX2B4TJU.js +0 -3
  138. package/dist/chunk-QX2B4TJU.js.map +0 -1
  139. package/dist/chunk-QXZLYCEZ.js.map +0 -1
  140. package/dist/chunk-UBA2QJCY.js.map +0 -1
  141. package/dist/chunk-UUFJQMHE.js +0 -54
  142. package/dist/chunk-UUFJQMHE.js.map +0 -1
  143. package/dist/chunk-VD7IO653.js +0 -3
  144. package/dist/chunk-W2HEJKJR.js +0 -156
  145. package/dist/chunk-W2HEJKJR.js.map +0 -1
  146. package/dist/config-FNTLKUGA.js +0 -2
  147. package/dist/config-mutator-NCLHYPJ3.js +0 -2
  148. package/dist/graph-5ZJ7YACP.js +0 -2
  149. package/dist/hub-Q3I4ALQ2.js +0 -2
  150. package/dist/load-NK3MIYXP.js +0 -2
  151. package/dist/notes-TMAGEDUS.js +0 -2
  152. package/dist/processes-5MP32QZT.js +0 -2
  153. package/dist/program-FESSM5TY.js +0 -766
  154. package/dist/program-FESSM5TY.js.map +0 -1
  155. package/dist/query-YTKTNXCQ.js +0 -2
  156. package/dist/registry-7L4RUATA.js +0 -2
  157. package/dist/schedule-tool-4T2VZIDW.js +0 -2
  158. package/dist/wiki-4HD4FZ4W.js +0 -2
  159. /package/dist/{App-DWSHIDN6.js.map → App-VPYWOTTH.js.map} +0 -0
  160. /package/dist/{ChatApp-CROSI7JM.js.map → ChatApp-SNED4KJB.js.map} +0 -0
  161. /package/dist/{absorb-eval-MNGQ752C.js.map → absorb-eval-WGO4JWTO.js.map} +0 -0
  162. /package/dist/{agent-4AQOFPRD.js.map → agent-HXQYYLWZ.js.map} +0 -0
  163. /package/dist/{builtin-W6KNX7RS.js.map → article-sync-4NOPOQU7.js.map} +0 -0
  164. /package/dist/{client-KGWYROLX.js.map → builtin-YD7MC572.js.map} +0 -0
  165. /package/dist/{chunk-LJWEJ6UZ.js.map → chunk-3WYLK3SX.js.map} +0 -0
  166. /package/dist/{chunk-I4GT27UO.js.map → chunk-724IBN5Y.js.map} +0 -0
  167. /package/dist/{chunk-NR7WLMNI.js.map → chunk-74LPAKQY.js.map} +0 -0
  168. /package/dist/{chunk-LLLBH2HH.js.map → chunk-A6QJ4VFT.js.map} +0 -0
  169. /package/dist/{chunk-4VDA4UM7.js.map → chunk-BKHIR2YJ.js.map} +0 -0
  170. /package/dist/{chunk-5VKFIBXY.js.map → chunk-CM74OUXW.js.map} +0 -0
  171. /package/dist/{chunk-U2EHJZAZ.js.map → chunk-JNKATLF7.js.map} +0 -0
  172. /package/dist/{chunk-J4I5ZJ2V.js.map → chunk-KDQI5S7F.js.map} +0 -0
  173. /package/dist/{chunk-MZJY26FW.js.map → chunk-KKQPV6SO.js.map} +0 -0
  174. /package/dist/{chunk-WX67I2KN.js.map → chunk-KQH4LPYC.js.map} +0 -0
  175. /package/dist/{chunk-YHCPBMRH.js.map → chunk-MDGYSHO5.js.map} +0 -0
  176. /package/dist/{chunk-242MPMJX.js.map → chunk-QNKSRROH.js.map} +0 -0
  177. /package/dist/{chunk-HF4OXA5L.js.map → chunk-RH3J4LCP.js.map} +0 -0
  178. /package/dist/{chunk-QPYN2UTV.js.map → chunk-RYGVTAP4.js.map} +0 -0
  179. /package/dist/{chunk-5KKXJZZ4.js.map → chunk-UDMI4TYM.js.map} +0 -0
  180. /package/dist/{chunk-TJDNS5G6.js.map → chunk-VCQVF44A.js.map} +0 -0
  181. /package/dist/{chunk-TN5A7PLU.js.map → chunk-WWNZL7XB.js.map} +0 -0
  182. /package/dist/{chunk-Q5FEWCS5.js.map → chunk-XWVBLISN.js.map} +0 -0
  183. /package/dist/{chunk-AD4QZZVN.js.map → chunk-YXFTUOZR.js.map} +0 -0
  184. /package/dist/{chunk-RKB7FQJF.js.map → chunk-Z7RJ3K3J.js.map} +0 -0
  185. /package/dist/{chunk-N2YSVZML.js.map → chunk-ZG4G6BFP.js.map} +0 -0
  186. /package/dist/{config-FNTLKUGA.js.map → client-TXZF32NO.js.map} +0 -0
  187. /package/dist/{config-mutate-7BLOYRZF.js.map → config-ZIXIH23X.js.map} +0 -0
  188. /package/dist/{config-mutator-NCLHYPJ3.js.map → config-mutate-KDBXIN7R.js.map} +0 -0
  189. /package/dist/{doctor-32YP26SJ.js.map → config-mutator-HKFGPJMG.js.map} +0 -0
  190. /package/dist/{failure-candidates-JNGUVBDG.js.map → doctor-NBWYG743.js.map} +0 -0
  191. /package/dist/{graph-5ZJ7YACP.js.map → failure-candidates-XZSZP4HT.js.map} +0 -0
  192. /package/dist/{follow-up-tool-AQ7NYZZR.js.map → follow-up-tool-E5XKSPKA.js.map} +0 -0
  193. /package/dist/{hub-Q3I4ALQ2.js.map → graph-EXDH7EPZ.js.map} +0 -0
  194. /package/dist/{load-NK3MIYXP.js.map → hub-3QTJ7E3O.js.map} +0 -0
  195. /package/dist/{notes-TMAGEDUS.js.map → load-5DNMGHFW.js.map} +0 -0
  196. /package/dist/{processes-5MP32QZT.js.map → model-call-BGTDPWZD.js.map} +0 -0
  197. /package/dist/{promote-R7FKN5SY.js.map → notes-WJJEJ4CJ.js.map} +0 -0
  198. /package/dist/{query-YTKTNXCQ.js.map → processes-M3N3S7V5.js.map} +0 -0
  199. /package/dist/{registry-7L4RUATA.js.map → promote-4XHYWHLA.js.map} +0 -0
  200. /package/dist/{routing-FSJ42RZH.js.map → query-ZGD32CE2.js.map} +0 -0
  201. /package/dist/{schedule-tool-4T2VZIDW.js.map → registry-LM35AE2P.js.map} +0 -0
  202. /package/dist/{request-planner-LEUMSI2K.js.map → request-planner-4BAAOUBH.js.map} +0 -0
  203. /package/dist/{review-candidates-MOSGA4IS.js.map → review-candidates-TM53WR7G.js.map} +0 -0
  204. /package/dist/{scheduler-6AQDHQI4.js.map → roster-IRXP32XF.js.map} +0 -0
  205. /package/dist/{rotation-memo-7VLREGS6.js.map → rotation-memo-2G6N3VF3.js.map} +0 -0
  206. /package/dist/{seat-O37EQRHE.js.map → routing-QLS6UMLM.js.map} +0 -0
  207. /package/dist/{wiki-4HD4FZ4W.js.map → schedule-tool-TTCWBAQ4.js.map} +0 -0
  208. /package/dist/{select-XO2STSQN.js.map → select-D7UUSODY.js.map} +0 -0
  209. /package/dist/{set-enabled-ZNEPEFGF.js.map → set-enabled-FDNS6KW6.js.map} +0 -0
  210. /package/dist/{tool-PH45YCO5.js.map → tool-J5FM3OPM.js.map} +0 -0
  211. /package/dist/{tool-6KMEAY4U.js.map → tool-SCBQYDI3.js.map} +0 -0
@@ -0,0 +1,3 @@
1
+ import{existsSync as U,readFileSync as v,statSync as _}from"fs";import{resolve as b}from"path";var A=new Map;function N(t){if(!A.has(t))try{A.set(t,new RegExp(t,"i"))}catch{A.set(t,null)}return A.get(t)??null}function R(t,a,s){let i=new Set(s.types.map(r=>r.id));if(t.class&&i.has(t.class))return t.class;let n=a.split("/").slice(0,-1).map(r=>r.toLowerCase()),e=new Set((t.tags??[]).map(r=>r.toLowerCase()));for(let r of s.classify){if(!i.has(r.type))continue;let c=0;if(!(r.legacy&&(c++,!t.type||!r.legacy.includes(t.type)))&&!(r.path&&(c++,!r.path.some(m=>n.includes(m.toLowerCase()))))&&!(r.tags&&(c++,!r.tags.some(m=>e.has(m.toLowerCase()))))){if(r.title){c++;let m=N(r.title);if(!m||!m.test(t.title))continue}if(c>0)return r.type}}return i.has(s.fallback_type)?s.fallback_type:s.types[0].id}function u(t){return t.normalize("NFKD").replace(/[̀-ͯ]/g,"").toLowerCase().replace(/\.md$/,"").replace(/[^\p{L}\p{N}]+/gu," ").trim()}function E(t){return u(t).replace(/ /g,"-").slice(0,80)||"page"}var O=/\[\[([^\]|#]+)(?:[|#][^\]]*)?\]\]/g;function G(t){if(t.meta.date)return t.meta.date;let s=(t.path.split("/").pop()??"").match(/^(\d{4}-\d{2}-\d{2})/);if(s)return s[1];let i=t.meta.title.match(/(\d{4}-\d{2}-\d{2})/);return i?i[1]:(t.meta.created||t.meta.lastUpdated||"").slice(0,10)}function $(t,a,s){if(a.size===0||!s.types.some(e=>e.id==="agent"))return;let i=s.types.find(e=>e.id==="agent").pillar,n=new Set;for(let e of t.values()){let r=u(e.title).split(" ");e.type==="person"&&r.length>1&&n.add(r[0])}for(let e of t.values()){if(e.type!=="person"&&e.type!==s.fallback_type||e.pages.some(c=>c.article.meta.class))continue;let r=M(a,[e.title]);if(!r){let c=M(a,e.pages.flatMap(m=>m.article.meta.aliases??[]));c&&(e.review??=`an alias matches agent ${c}; set class on the page to decide`);continue}if(e.type==="person"&&n.has(u(e.title))){e.review=`shares a name with agent ${r} and with a person; set class on the page to decide`;continue}e.type="agent",e.pillar=i}}function L(t,a,s=new Map){let i=new Map(a.types.map(o=>[o.id,o])),n=new Map,e=new Map,r=new Set;for(let o of t){let p=[o.article.meta.title,...o.article.meta.aliases??[]].map(u).filter(Boolean);if(p.length===0)continue;let l=p.map(d=>n.get(d)).find(Boolean);if(!l){l=E(o.article.meta.title);for(let d=2;r.has(l);d++)l=`${E(o.article.meta.title)}-${d}`;r.add(l),e.set(l,[])}e.get(l).push(o);for(let d of p)n.has(d)||n.set(d,l);let f=u(o.article.path);n.has(f)||n.set(f,l)}let c=new Map;for(let[o,p]of e){let l=new Map;for(let g of p){let w=R(g.article.meta,g.article.path,a),P=g.article.meta.class===w?1e3:w===a.fallback_type?.5:1;l.set(w,(l.get(w)??0)+P)}let f=[...l.entries()].sort((g,w)=>w[1]-g[1])[0][0],d=p[0].article,I=p.map(g=>G(g.article)).filter(Boolean).sort(),W=p.map(g=>g.article.meta.importance).find(Boolean)??a.importance.default;c.set(o,{id:o,type:f,pillar:i.get(f)?.pillar??"topics",title:d.meta.title,pages:p,statements:[],date:I[0]??"",updated:p.map(g=>g.article.meta.lastUpdated||"").sort().pop()??"",importance:p.some(g=>g.article.meta.importance==="major")?"major":W,rolledUpInto:p.map(g=>g.article.meta.rolledUpInto).find(Boolean),sources:[...new Set(p.flatMap(g=>g.article.meta.sources??[]))]})}$(c,s,a);let m=o=>n.get(u(o)),y=new Map,h=new Map,x=o=>{if(o.from===o.to)return;let p=y.get(o.from)??[];if(o.property==="related"&&p.some(f=>f.to===o.to))return;p.push(o),y.set(o.from,p);let l=h.get(o.to)??[];l.push(o),h.set(o.to,l)};for(let o of c.values())for(let p of o.pages)for(let l of p.article.meta.statements??[]){let f={...l,page:p,target:m(l.value)};o.statements.push(f),f.target&&x({from:o.id,to:f.target,property:l.property,statement:f})}for(let o of c.values())for(let p of o.pages){let l=new Set(p.article.meta.related??[]);for(let f of p.article.content.matchAll(O))l.add(f[1].trim());for(let f of l){let d=m(f);d&&x({from:o.id,to:d,property:"related"})}}for(let o of c.values())o.rolledUpInto&&(o.rolledUpInto=m(o.rolledUpInto));return{ontology:a,entities:c,outgoing:y,incoming:h,names:n}}var S=class{last=null;get(a,s,i=new Map){let n=[];for(let y of a.listAgents([]))for(let h of a.getAgentWiki(y).listAllArticles())n.push({agentId:y,article:h});let e=n.map(y=>y.article),r=[...i].join(`
2
+ `),c=this.last;if(c&&c.ontology===s&&c.roster===r&&c.refs.length===e.length&&c.refs.every((y,h)=>y===e[h]))return c.graph;let m=L(n,s,i);return this.last={refs:e,ontology:s,roster:r,graph:m},m}};function j(t,a=[]){let s=new Map,i=(n,e)=>{let r=n?u(n):"";r&&!s.has(r)&&s.set(r,e)};for(let n of t)(!n.name||u(n.name)!==`${u(n.id)} agent`)&&i(n.id,n.id),i(n.name,n.id),i(n.persona,n.id);for(let n of a)i(n,n);return s}function M(t,a){for(let s of a){let i=u(s),n=t.get(i)??t.get(i.replace(/ (agent|bot)$/,""));if(n)return n;if(/ (agent|bot)( |$)/.test(i)){for(let[e,r]of t)if(i.startsWith(`${e} `))return r}}}var B=["IDENTITY.md","persona.md","PERSONA.md"];function C(t){let s=t.match(/\*\*Name:\*\*[ \t]*([^\n(.,;—–]+)/)?.[1]?.replace(/[*_`]/g,"").trim();return s&&s.length<=40?s:void 0}function K(t){if(t)for(let a of B){let s=b(t,a);try{if(U(s)){let i=C(v(s,"utf-8"));if(i)return i}}catch{}}}var k=null;function D(t){let a=b(t,"..","..","agentx.json"),s;try{s=_(a).mtimeMs}catch{return[]}if(k&&k.file===a&&k.mtimeMs===s)return k.agents;let i=[];try{let n=JSON.parse(v(a,"utf-8"));i=Object.entries(n.agents??{}).map(([e,r])=>({id:e,name:typeof r?.name=="string"?r.name:void 0,persona:K(typeof r?.workspace=="string"?r.workspace:void 0)}))}catch{i=[]}return k={file:a,mtimeMs:s,agents:i},i}function Q(t,a,s=[]){let i=D(t),n=new Set(i.map(e=>e.id));return j([...i,...a.filter(e=>!n.has(e)).map(e=>({id:e}))],s)}export{j as a,M as b,C as c,D as d,Q as e,u as f,E as g,L as h,S as i};
3
+ //# sourceMappingURL=chunk-KFIJDLQ5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/wiki/ontology/roster.ts","../src/wiki/ontology/classify.ts","../src/wiki/ontology/graph.ts"],"sourcesContent":["// --- Names the fleet's agents go by, so their pages are not people (#819) ---\n//\n// Old pages about an agent often carry `type: person` and a title that is\n// just the agent's name (\"Helper\", or a persona name). The classify rules\n// only catch titles with \"agent\" or \"bot\" in them. The roster lists every\n// name an agent answers to: its id, its configured name, the persona name\n// in its workspace, and any extra names the owner lists under\n// `agent_names` in ontology.yaml (agents on another node, for example).\n// Deterministic: no model call.\n\nimport { existsSync, readFileSync, statSync } from \"fs\"\nimport { resolve } from \"path\"\nimport { normName } from \"./graph\"\n\n/** Normalised name → agent id. */\nexport type AgentRoster = Map<string, string>\n\nexport interface RosterAgent {\n id: string\n name?: string\n /** Persona name read from the agent's workspace. */\n persona?: string\n}\n\nexport function buildRoster(agents: RosterAgent[], extraNames: string[] = []): AgentRoster {\n const roster: AgentRoster = new Map()\n const add = (name: string | undefined, id: string): void => {\n const key = name ? normName(name) : \"\"\n if (key && !roster.has(key)) roster.set(key, id)\n }\n for (const a of agents) {\n // An agent named \"<id> Agent\" is named after a person: the bare id\n // is that person's name, so only the full name points at the agent.\n if (!a.name || normName(a.name) !== `${normName(a.id)} agent`) add(a.id, a.id)\n add(a.name, a.id)\n add(a.persona, a.id)\n }\n for (const n of extraNames) add(n, n)\n return roster\n}\n\n/** The agent a title or alias names, if any. \"<name> agent\" counts too. */\nexport function rosterMatch(roster: AgentRoster, names: string[]): string | undefined {\n for (const n of names) {\n const key = normName(n)\n const hit = roster.get(key) ?? roster.get(key.replace(/ (agent|bot)$/, \"\"))\n if (hit) return hit\n // \"Release Helper (release_helper_bot)\": an agent name, then its handle.\n if (/ (agent|bot)( |$)/.test(key)) {\n for (const [name, id] of roster) if (key.startsWith(`${name} `)) return id\n }\n }\n return undefined\n}\n\nconst PERSONA_FILES = [\"IDENTITY.md\", \"persona.md\", \"PERSONA.md\"]\n\n/** `**Name:** Nova (…)` → \"Nova\". Only a short single name counts. */\nexport function personaName(text: string): string | undefined {\n const m = text.match(/\\*\\*Name:\\*\\*[ \\t]*([^\\n(.,;—–]+)/)\n const name = m?.[1]?.replace(/[*_`]/g, \"\").trim()\n return name && name.length <= 40 ? name : undefined\n}\n\nfunction readPersona(workspace: string | undefined): string | undefined {\n if (!workspace) return undefined\n for (const f of PERSONA_FILES) {\n const file = resolve(workspace, f)\n try {\n if (existsSync(file)) {\n const name = personaName(readFileSync(file, \"utf-8\"))\n if (name) return name\n }\n } catch {\n // An unreadable workspace file just means no persona name.\n }\n }\n return undefined\n}\n\nlet cached: { file: string; mtimeMs: number; agents: RosterAgent[] } | null = null\n\n/** Agents configured in the `agentx.json` next to the wiki (`<root>/.agentx/wiki`). */\nexport function configuredAgents(wikiDir: string): RosterAgent[] {\n const file = resolve(wikiDir, \"..\", \"..\", \"agentx.json\")\n let mtimeMs: number\n try { mtimeMs = statSync(file).mtimeMs } catch { return [] }\n if (cached && cached.file === file && cached.mtimeMs === mtimeMs) return cached.agents\n let agents: RosterAgent[] = []\n try {\n const raw = JSON.parse(readFileSync(file, \"utf-8\")) as { agents?: Record<string, { name?: unknown; workspace?: unknown }> }\n agents = Object.entries(raw.agents ?? {}).map(([id, a]) => ({\n id,\n name: typeof a?.name === \"string\" ? a.name : undefined,\n persona: readPersona(typeof a?.workspace === \"string\" ? a.workspace : undefined),\n }))\n } catch {\n agents = [] // a config being rewritten; the next request reads it again\n }\n cached = { file, mtimeMs, agents }\n return agents\n}\n\n/** Roster for a wiki: its agent folders, the node's config, and `agent_names`. */\nexport function loadRoster(wikiDir: string, agentIds: string[], extraNames: string[] = []): AgentRoster {\n const configured = configuredAgents(wikiDir)\n const known = new Set(configured.map(a => a.id))\n return buildRoster([...configured, ...agentIds.filter(id => !known.has(id)).map(id => ({ id }))], extraNames)\n}\n","// --- Give a wiki page its ontology type (#811) ---\n\nimport type { WikiArticleMeta } from \"../types\"\nimport type { Ontology } from \"./types\"\n\nconst patternCache = new Map<string, RegExp | null>()\n\nfunction titlePattern(src: string): RegExp | null {\n if (!patternCache.has(src)) {\n try {\n patternCache.set(src, new RegExp(src, \"i\"))\n } catch {\n patternCache.set(src, null) // reported by checkOntology; the rule never matches\n }\n }\n return patternCache.get(src) ?? null\n}\n\n/**\n * The page's own `class` when the ontology knows it, else the first\n * classify rule whose every condition matches, else the fallback type.\n * `path` is relative to the agent's wiki, e.g. `clients/example.md`.\n */\nexport function classifyPage(meta: WikiArticleMeta, path: string, o: Ontology): string {\n const known = new Set(o.types.map(t => t.id))\n if (meta.class && known.has(meta.class)) return meta.class\n\n const folders = path.split(\"/\").slice(0, -1).map(f => f.toLowerCase())\n const tags = new Set((meta.tags ?? []).map(t => t.toLowerCase()))\n for (const rule of o.classify) {\n if (!known.has(rule.type)) continue\n let conditions = 0\n if (rule.legacy) {\n conditions++\n if (!meta.type || !rule.legacy.includes(meta.type)) continue\n }\n if (rule.path) {\n conditions++\n if (!rule.path.some(p => folders.includes(p.toLowerCase()))) continue\n }\n if (rule.tags) {\n conditions++\n if (!rule.tags.some(t => tags.has(t.toLowerCase()))) continue\n }\n if (rule.title) {\n conditions++\n const re = titlePattern(rule.title)\n if (!re || !re.test(meta.title)) continue\n }\n if (conditions > 0) return rule.type\n }\n return known.has(o.fallback_type) ? o.fallback_type : o.types[0].id\n}\n","// --- One entity per real thing, across every agent's wiki (#811) ---\n//\n// Agents each keep their own pages, so the same person or server can\n// have several. The graph merges pages that share a name (title or\n// alias) into one entity, gives it a type from the ontology, and turns\n// statements and plain links into edges both ways. It is rebuilt only\n// when a page or the ontology changed.\n\nimport type { WikiArticle } from \"../types\"\nimport type { WikiHub } from \"../hub\"\nimport { classifyPage } from \"./classify\"\nimport { rosterMatch, type AgentRoster } from \"./roster\"\nimport type { Importance, Ontology, WikiStatement } from \"./types\"\n\nexport interface GraphPage {\n agentId: string\n article: WikiArticle\n}\n\nexport interface EntityStatement extends WikiStatement {\n /** Entity id of the value when it names a page. */\n target?: string\n page: GraphPage\n}\n\nexport interface Entity {\n id: string\n type: string\n pillar: string\n title: string\n pages: GraphPage[]\n statements: EntityStatement[]\n /** YYYY-MM-DD: the event date, else the first page's creation date. */\n date: string\n updated: string\n importance: Importance\n rolledUpInto?: string\n /** Raw entry ids the pages were written from. */\n sources: string[]\n /** Why the type needs a person to check it (#819). */\n review?: string\n}\n\nexport interface Edge {\n from: string\n to: string\n property: string\n statement?: EntityStatement\n}\n\nexport interface WikiGraph {\n ontology: Ontology\n entities: Map<string, Entity>\n outgoing: Map<string, Edge[]>\n incoming: Map<string, Edge[]>\n /** Normalised name or path → entity id, for links. */\n names: Map<string, string>\n}\n\nexport function normName(s: string): string {\n return s.normalize(\"NFKD\").replace(/[̀-ͯ]/g, \"\").toLowerCase().replace(/\\.md$/, \"\").replace(/[^\\p{L}\\p{N}]+/gu, \" \").trim()\n}\n\nexport function slugify(s: string): string {\n return normName(s).replace(/ /g, \"-\").slice(0, 80) || \"page\"\n}\n\nconst WIKILINK = /\\[\\[([^\\]|#]+)(?:[|#][^\\]]*)?\\]\\]/g\n\nfunction eventDate(a: WikiArticle): string {\n if (a.meta.date) return a.meta.date\n const base = a.path.split(\"/\").pop() ?? \"\"\n const fromPath = base.match(/^(\\d{4}-\\d{2}-\\d{2})/)\n if (fromPath) return fromPath[1]\n const fromTitle = a.meta.title.match(/(\\d{4}-\\d{2}-\\d{2})/)\n if (fromTitle) return fromTitle[1]\n return (a.meta.created || a.meta.lastUpdated || \"\").slice(0, 10)\n}\n\n/**\n * Pages named after one of the fleet's agents are agents, not people\n * (#819). A page's own `class` still wins. When the name is also the\n * first name of a person page (\"Sam\" next to \"Sam Lee\"), the page keeps\n * its type and is flagged instead of guessed.\n */\nfunction applyRoster(entities: Map<string, Entity>, roster: AgentRoster, o: Ontology): void {\n if (roster.size === 0 || !o.types.some(t => t.id === \"agent\")) return\n const agentPillar = o.types.find(t => t.id === \"agent\")!.pillar\n const firstNames = new Set<string>()\n for (const e of entities.values()) {\n const words = normName(e.title).split(\" \")\n if (e.type === \"person\" && words.length > 1) firstNames.add(words[0])\n }\n for (const e of entities.values()) {\n // Only people and untyped pages: a project or client can share an agent's name.\n if ((e.type !== \"person\" && e.type !== o.fallback_type) || e.pages.some(p => p.article.meta.class)) continue\n const agent = rosterMatch(roster, [e.title])\n if (!agent) {\n // An alias is weaker evidence: a person can have a nickname that is\n // also an agent's name. Flag it, never retype it.\n const byAlias = rosterMatch(roster, e.pages.flatMap(p => p.article.meta.aliases ?? []))\n if (byAlias) e.review ??= `an alias matches agent ${byAlias}; set class on the page to decide`\n continue\n }\n if (e.type === \"person\" && firstNames.has(normName(e.title))) {\n e.review = `shares a name with agent ${agent} and with a person; set class on the page to decide`\n continue\n }\n e.type = \"agent\"\n e.pillar = agentPillar\n }\n}\n\n/** Build the graph from pages. Pure: tests call it directly. */\nexport function buildGraph(pages: GraphPage[], o: Ontology, roster: AgentRoster = new Map()): WikiGraph {\n const typeDef = new Map(o.types.map(t => [t.id, t]))\n const names = new Map<string, string>()\n const groups = new Map<string, GraphPage[]>()\n const usedIds = new Set<string>()\n\n for (const page of pages) {\n const keys = [page.article.meta.title, ...(page.article.meta.aliases ?? [])].map(normName).filter(Boolean)\n if (keys.length === 0) continue\n let id = keys.map(k => names.get(k)).find(Boolean)\n if (!id) {\n id = slugify(page.article.meta.title)\n for (let n = 2; usedIds.has(id); n++) id = `${slugify(page.article.meta.title)}-${n}`\n usedIds.add(id)\n groups.set(id, [])\n }\n groups.get(id)!.push(page)\n for (const k of keys) if (!names.has(k)) names.set(k, id)\n const pathKey = normName(page.article.path)\n if (!names.has(pathKey)) names.set(pathKey, id)\n }\n\n const entities = new Map<string, Entity>()\n for (const [id, group] of groups) {\n const votes = new Map<string, number>()\n for (const p of group) {\n const t = classifyPage(p.article.meta, p.article.path, o)\n // An explicit class outvotes any number of inferred ones.\n const weight = p.article.meta.class === t ? 1000 : t === o.fallback_type ? 0.5 : 1\n votes.set(t, (votes.get(t) ?? 0) + weight)\n }\n const type = [...votes.entries()].sort((a, b) => b[1] - a[1])[0][0]\n const first = group[0].article\n const dated = group.map(p => eventDate(p.article)).filter(Boolean).sort()\n const importance = group.map(p => p.article.meta.importance).find(Boolean) ?? o.importance.default\n entities.set(id, {\n id,\n type,\n pillar: typeDef.get(type)?.pillar ?? \"topics\",\n title: first.meta.title,\n pages: group,\n statements: [],\n date: dated[0] ?? \"\",\n updated: group.map(p => p.article.meta.lastUpdated || \"\").sort().pop() ?? \"\",\n importance: group.some(p => p.article.meta.importance === \"major\") ? \"major\" : importance,\n rolledUpInto: group.map(p => p.article.meta.rolledUpInto).find(Boolean),\n sources: [...new Set(group.flatMap(p => p.article.meta.sources ?? []))],\n })\n }\n applyRoster(entities, roster, o)\n\n const resolveName = (s: string): string | undefined => names.get(normName(s))\n const outgoing = new Map<string, Edge[]>()\n const incoming = new Map<string, Edge[]>()\n const addEdge = (e: Edge): void => {\n if (e.from === e.to) return\n const out = outgoing.get(e.from) ?? []\n if (e.property === \"related\" && out.some(x => x.to === e.to)) return\n out.push(e)\n outgoing.set(e.from, out)\n const inc = incoming.get(e.to) ?? []\n inc.push(e)\n incoming.set(e.to, inc)\n }\n\n for (const entity of entities.values()) {\n for (const page of entity.pages) {\n for (const s of page.article.meta.statements ?? []) {\n const st: EntityStatement = { ...s, page, target: resolveName(s.value) }\n entity.statements.push(st)\n if (st.target) addEdge({ from: entity.id, to: st.target, property: s.property, statement: st })\n }\n }\n }\n // Plain links after typed ones, so a typed edge wins over \"related\".\n for (const entity of entities.values()) {\n for (const page of entity.pages) {\n const linked = new Set(page.article.meta.related ?? [])\n for (const m of page.article.content.matchAll(WIKILINK)) linked.add(m[1].trim())\n for (const name of linked) {\n const to = resolveName(name)\n if (to) addEdge({ from: entity.id, to, property: \"related\" })\n }\n }\n }\n for (const e of entities.values()) {\n if (e.rolledUpInto) e.rolledUpInto = resolveName(e.rolledUpInto)\n }\n return { ontology: o, entities, outgoing, incoming, names }\n}\n\n/** Builds from a hub, reusing the last graph while no page changed. */\nexport class GraphCache {\n private last: { refs: WikiArticle[]; ontology: Ontology; roster: string; graph: WikiGraph } | null = null\n\n get(hub: WikiHub, o: Ontology, roster: AgentRoster = new Map()): WikiGraph {\n const pages: GraphPage[] = []\n for (const agentId of hub.listAgents([])) {\n for (const article of hub.getAgentWiki(agentId).listAllArticles()) pages.push({ agentId, article })\n }\n // The store hands back the same objects while files are unchanged.\n const refs = pages.map(p => p.article)\n const rosterKey = [...roster].join(\"\\n\")\n const last = this.last\n if (last && last.ontology === o && last.roster === rosterKey && last.refs.length === refs.length && last.refs.every((r, i) => r === refs[i])) {\n return last.graph\n }\n const graph = buildGraph(pages, o, roster)\n this.last = { refs, ontology: o, roster: rosterKey, graph }\n return graph\n }\n}\n"],"mappings":"AAUA,OAAS,cAAAA,EAAY,gBAAAC,EAAc,YAAAC,MAAgB,KACnD,OAAS,WAAAC,MAAe,OCNxB,IAAMC,EAAe,IAAI,IAEzB,SAASC,EAAaC,EAA4B,CAChD,GAAI,CAACF,EAAa,IAAIE,CAAG,EACvB,GAAI,CACFF,EAAa,IAAIE,EAAK,IAAI,OAAOA,EAAK,GAAG,CAAC,CAC5C,MAAE,CACAF,EAAa,IAAIE,EAAK,IAAI,CAC5B,CAEF,OAAOF,EAAa,IAAIE,CAAG,GAAK,IAClC,CAOO,SAASC,EAAaC,EAAuBC,EAAcC,EAAqB,CACrF,IAAMC,EAAQ,IAAI,IAAID,EAAE,MAAM,IAAIE,GAAKA,EAAE,EAAE,CAAC,EAC5C,GAAIJ,EAAK,OAASG,EAAM,IAAIH,EAAK,KAAK,EAAG,OAAOA,EAAK,MAErD,IAAMK,EAAUJ,EAAK,MAAM,GAAG,EAAE,MAAM,EAAG,EAAE,EAAE,IAAIK,GAAKA,EAAE,YAAY,CAAC,EAC/DC,EAAO,IAAI,KAAKP,EAAK,MAAQ,CAAC,GAAG,IAAII,GAAKA,EAAE,YAAY,CAAC,CAAC,EAChE,QAAWI,KAAQN,EAAE,SAAU,CAC7B,GAAI,CAACC,EAAM,IAAIK,EAAK,IAAI,EAAG,SAC3B,IAAIC,EAAa,EACjB,GAAI,EAAAD,EAAK,SACPC,IACI,CAACT,EAAK,MAAQ,CAACQ,EAAK,OAAO,SAASR,EAAK,IAAI,KAE/C,EAAAQ,EAAK,OACPC,IACI,CAACD,EAAK,KAAK,KAAKE,GAAKL,EAAQ,SAASK,EAAE,YAAY,CAAC,CAAC,KAExD,EAAAF,EAAK,OACPC,IACI,CAACD,EAAK,KAAK,KAAKJ,GAAKG,EAAK,IAAIH,EAAE,YAAY,CAAC,CAAC,IAEpD,IAAII,EAAK,MAAO,CACdC,IACA,IAAME,EAAKd,EAAaW,EAAK,KAAK,EAClC,GAAI,CAACG,GAAM,CAACA,EAAG,KAAKX,EAAK,KAAK,EAAG,SAEnC,GAAIS,EAAa,EAAG,OAAOD,EAAK,MAElC,OAAOL,EAAM,IAAID,EAAE,aAAa,EAAIA,EAAE,cAAgBA,EAAE,MAAM,CAAC,EAAE,EACnE,CCOO,SAASU,EAASC,EAAmB,CAC1C,OAAOA,EAAE,UAAU,MAAM,EAAE,QAAQ,SAAU,EAAE,EAAE,YAAY,EAAE,QAAQ,QAAS,EAAE,EAAE,QAAQ,mBAAoB,GAAG,EAAE,KAAK,CAC5H,CAEO,SAASC,EAAQD,EAAmB,CACzC,OAAOD,EAASC,CAAC,EAAE,QAAQ,KAAM,GAAG,EAAE,MAAM,EAAG,EAAE,GAAK,MACxD,CAEA,IAAME,EAAW,qCAEjB,SAASC,EAAUC,EAAwB,CACzC,GAAIA,EAAE,KAAK,KAAM,OAAOA,EAAE,KAAK,KAE/B,IAAMC,GADOD,EAAE,KAAK,MAAM,GAAG,EAAE,IAAI,GAAK,IAClB,MAAM,sBAAsB,EAClD,GAAIC,EAAU,OAAOA,EAAS,CAAC,EAC/B,IAAMC,EAAYF,EAAE,KAAK,MAAM,MAAM,qBAAqB,EAC1D,OAAIE,EAAkBA,EAAU,CAAC,GACzBF,EAAE,KAAK,SAAWA,EAAE,KAAK,aAAe,IAAI,MAAM,EAAG,EAAE,CACjE,CAQA,SAASG,EAAYC,EAA+BC,EAAqBC,EAAmB,CAC1F,GAAID,EAAO,OAAS,GAAK,CAACC,EAAE,MAAM,KAAKC,GAAKA,EAAE,KAAO,OAAO,EAAG,OAC/D,IAAMC,EAAcF,EAAE,MAAM,KAAKC,GAAKA,EAAE,KAAO,OAAO,EAAG,OACnDE,EAAa,IAAI,IACvB,QAAW,KAAKL,EAAS,OAAO,EAAG,CACjC,IAAMM,EAAQf,EAAS,EAAE,KAAK,EAAE,MAAM,GAAG,EACrC,EAAE,OAAS,UAAYe,EAAM,OAAS,GAAGD,EAAW,IAAIC,EAAM,CAAC,CAAC,EAEtE,QAAW,KAAKN,EAAS,OAAO,EAAG,CAEjC,GAAK,EAAE,OAAS,UAAY,EAAE,OAASE,EAAE,eAAkB,EAAE,MAAM,KAAKK,GAAKA,EAAE,QAAQ,KAAK,KAAK,EAAG,SACpG,IAAMC,EAAQC,EAAYR,EAAQ,CAAC,EAAE,KAAK,CAAC,EAC3C,GAAI,CAACO,EAAO,CAGV,IAAME,EAAUD,EAAYR,EAAQ,EAAE,MAAM,QAAQM,GAAKA,EAAE,QAAQ,KAAK,SAAW,CAAC,CAAC,CAAC,EAClFG,IAAS,EAAE,SAAW,0BAA0BA,sCACpD,SAEF,GAAI,EAAE,OAAS,UAAYL,EAAW,IAAId,EAAS,EAAE,KAAK,CAAC,EAAG,CAC5D,EAAE,OAAS,4BAA4BiB,uDACvC,SAEF,EAAE,KAAO,QACT,EAAE,OAASJ,EAEf,CAGO,SAASO,EAAWC,EAAoBV,EAAaD,EAAsB,IAAI,IAAkB,CACtG,IAAMY,EAAU,IAAI,IAAIX,EAAE,MAAM,IAAIC,GAAK,CAACA,EAAE,GAAIA,CAAC,CAAC,CAAC,EAC7CW,EAAQ,IAAI,IACZC,EAAS,IAAI,IACbC,EAAU,IAAI,IAEpB,QAAWC,KAAQL,EAAO,CACxB,IAAMM,EAAO,CAACD,EAAK,QAAQ,KAAK,MAAO,GAAIA,EAAK,QAAQ,KAAK,SAAW,CAAC,CAAE,EAAE,IAAI1B,CAAQ,EAAE,OAAO,OAAO,EACzG,GAAI2B,EAAK,SAAW,EAAG,SACvB,IAAIC,EAAKD,EAAK,IAAIE,GAAKN,EAAM,IAAIM,CAAC,CAAC,EAAE,KAAK,OAAO,EACjD,GAAI,CAACD,EAAI,CACPA,EAAK1B,EAAQwB,EAAK,QAAQ,KAAK,KAAK,EACpC,QAASI,EAAI,EAAGL,EAAQ,IAAIG,CAAE,EAAGE,IAAKF,EAAK,GAAG1B,EAAQwB,EAAK,QAAQ,KAAK,KAAK,KAAKI,IAClFL,EAAQ,IAAIG,CAAE,EACdJ,EAAO,IAAII,EAAI,CAAC,CAAC,EAEnBJ,EAAO,IAAII,CAAE,EAAG,KAAKF,CAAI,EACzB,QAAWG,KAAKF,EAAWJ,EAAM,IAAIM,CAAC,GAAGN,EAAM,IAAIM,EAAGD,CAAE,EACxD,IAAMG,EAAU/B,EAAS0B,EAAK,QAAQ,IAAI,EACrCH,EAAM,IAAIQ,CAAO,GAAGR,EAAM,IAAIQ,EAASH,CAAE,EAGhD,IAAMnB,EAAW,IAAI,IACrB,OAAW,CAACmB,EAAII,CAAK,IAAKR,EAAQ,CAChC,IAAMS,EAAQ,IAAI,IAClB,QAAWjB,KAAKgB,EAAO,CACrB,IAAMpB,EAAIsB,EAAalB,EAAE,QAAQ,KAAMA,EAAE,QAAQ,KAAML,CAAC,EAElDwB,EAASnB,EAAE,QAAQ,KAAK,QAAUJ,EAAI,IAAOA,IAAMD,EAAE,cAAgB,GAAM,EACjFsB,EAAM,IAAIrB,GAAIqB,EAAM,IAAIrB,CAAC,GAAK,GAAKuB,CAAM,EAE3C,IAAMC,EAAO,CAAC,GAAGH,EAAM,QAAQ,CAAC,EAAE,KAAK,CAAC5B,EAAGgC,IAAMA,EAAE,CAAC,EAAIhC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAC5DiC,EAAQN,EAAM,CAAC,EAAE,QACjBO,EAAQP,EAAM,IAAIhB,GAAKZ,EAAUY,EAAE,OAAO,CAAC,EAAE,OAAO,OAAO,EAAE,KAAK,EAClEwB,EAAaR,EAAM,IAAIhB,GAAKA,EAAE,QAAQ,KAAK,UAAU,EAAE,KAAK,OAAO,GAAKL,EAAE,WAAW,QAC3FF,EAAS,IAAImB,EAAI,CACf,GAAAA,EACA,KAAAQ,EACA,OAAQd,EAAQ,IAAIc,CAAI,GAAG,QAAU,SACrC,MAAOE,EAAM,KAAK,MAClB,MAAON,EACP,WAAY,CAAC,EACb,KAAMO,EAAM,CAAC,GAAK,GAClB,QAASP,EAAM,IAAIhB,GAAKA,EAAE,QAAQ,KAAK,aAAe,EAAE,EAAE,KAAK,EAAE,IAAI,GAAK,GAC1E,WAAYgB,EAAM,KAAKhB,GAAKA,EAAE,QAAQ,KAAK,aAAe,OAAO,EAAI,QAAUwB,EAC/E,aAAcR,EAAM,IAAIhB,GAAKA,EAAE,QAAQ,KAAK,YAAY,EAAE,KAAK,OAAO,EACtE,QAAS,CAAC,GAAG,IAAI,IAAIgB,EAAM,QAAQhB,GAAKA,EAAE,QAAQ,KAAK,SAAW,CAAC,CAAC,CAAC,CAAC,CACxE,CAAC,EAEHR,EAAYC,EAAUC,EAAQC,CAAC,EAE/B,IAAM8B,EAAexC,GAAkCsB,EAAM,IAAIvB,EAASC,CAAC,CAAC,EACtEyC,EAAW,IAAI,IACfC,EAAW,IAAI,IACfC,EAAWC,GAAkB,CACjC,GAAIA,EAAE,OAASA,EAAE,GAAI,OACrB,IAAMC,EAAMJ,EAAS,IAAIG,EAAE,IAAI,GAAK,CAAC,EACrC,GAAIA,EAAE,WAAa,WAAaC,EAAI,KAAKC,GAAKA,EAAE,KAAOF,EAAE,EAAE,EAAG,OAC9DC,EAAI,KAAKD,CAAC,EACVH,EAAS,IAAIG,EAAE,KAAMC,CAAG,EACxB,IAAME,EAAML,EAAS,IAAIE,EAAE,EAAE,GAAK,CAAC,EACnCG,EAAI,KAAKH,CAAC,EACVF,EAAS,IAAIE,EAAE,GAAIG,CAAG,CACxB,EAEA,QAAWC,KAAUxC,EAAS,OAAO,EACnC,QAAWiB,KAAQuB,EAAO,MACxB,QAAWhD,KAAKyB,EAAK,QAAQ,KAAK,YAAc,CAAC,EAAG,CAClD,IAAMwB,EAAsB,CAAE,GAAGjD,EAAG,KAAAyB,EAAM,OAAQe,EAAYxC,EAAE,KAAK,CAAE,EACvEgD,EAAO,WAAW,KAAKC,CAAE,EACrBA,EAAG,QAAQN,EAAQ,CAAE,KAAMK,EAAO,GAAI,GAAIC,EAAG,OAAQ,SAAUjD,EAAE,SAAU,UAAWiD,CAAG,CAAC,EAKpG,QAAWD,KAAUxC,EAAS,OAAO,EACnC,QAAWiB,KAAQuB,EAAO,MAAO,CAC/B,IAAME,EAAS,IAAI,IAAIzB,EAAK,QAAQ,KAAK,SAAW,CAAC,CAAC,EACtD,QAAW0B,KAAK1B,EAAK,QAAQ,QAAQ,SAASvB,CAAQ,EAAGgD,EAAO,IAAIC,EAAE,CAAC,EAAE,KAAK,CAAC,EAC/E,QAAWC,KAAQF,EAAQ,CACzB,IAAMG,EAAKb,EAAYY,CAAI,EACvBC,GAAIV,EAAQ,CAAE,KAAMK,EAAO,GAAI,GAAAK,EAAI,SAAU,SAAU,CAAC,GAIlE,QAAWT,KAAKpC,EAAS,OAAO,EAC1BoC,EAAE,eAAcA,EAAE,aAAeJ,EAAYI,EAAE,YAAY,GAEjE,MAAO,CAAE,SAAUlC,EAAG,SAAAF,EAAU,SAAAiC,EAAU,SAAAC,EAAU,MAAApB,CAAM,CAC5D,CAGO,IAAMgC,EAAN,KAAiB,CACd,KAA6F,KAErG,IAAIC,EAAc7C,EAAaD,EAAsB,IAAI,IAAkB,CACzE,IAAMW,EAAqB,CAAC,EAC5B,QAAWoC,KAAWD,EAAI,WAAW,CAAC,CAAC,EACrC,QAAWE,KAAWF,EAAI,aAAaC,CAAO,EAAE,gBAAgB,EAAGpC,EAAM,KAAK,CAAE,QAAAoC,EAAS,QAAAC,CAAQ,CAAC,EAGpG,IAAMC,EAAOtC,EAAM,IAAIL,GAAKA,EAAE,OAAO,EAC/B4C,EAAY,CAAC,GAAGlD,CAAM,EAAE,KAAK;AAAA,CAAI,EACjCmD,EAAO,KAAK,KAClB,GAAIA,GAAQA,EAAK,WAAalD,GAAKkD,EAAK,SAAWD,GAAaC,EAAK,KAAK,SAAWF,EAAK,QAAUE,EAAK,KAAK,MAAM,CAACC,EAAGC,IAAMD,IAAMH,EAAKI,CAAC,CAAC,EACzI,OAAOF,EAAK,MAEd,IAAMG,EAAQ5C,EAAWC,EAAOV,EAAGD,CAAM,EACzC,YAAK,KAAO,CAAE,KAAAiD,EAAM,SAAUhD,EAAG,OAAQiD,EAAW,MAAAI,CAAM,EACnDA,CACT,CACF,EFzMO,SAASC,EAAYC,EAAuBC,EAAuB,CAAC,EAAgB,CACzF,IAAMC,EAAsB,IAAI,IAC1BC,EAAM,CAACC,EAA0BC,IAAqB,CAC1D,IAAMC,EAAMF,EAAOG,EAASH,CAAI,EAAI,GAChCE,GAAO,CAACJ,EAAO,IAAII,CAAG,GAAGJ,EAAO,IAAII,EAAKD,CAAE,CACjD,EACA,QAAWG,KAAKR,GAGV,CAACQ,EAAE,MAAQD,EAASC,EAAE,IAAI,IAAM,GAAGD,EAASC,EAAE,EAAE,YAAWL,EAAIK,EAAE,GAAIA,EAAE,EAAE,EAC7EL,EAAIK,EAAE,KAAMA,EAAE,EAAE,EAChBL,EAAIK,EAAE,QAASA,EAAE,EAAE,EAErB,QAAW,KAAKP,EAAYE,EAAI,EAAG,CAAC,EACpC,OAAOD,CACT,CAGO,SAASO,EAAYP,EAAqBQ,EAAqC,CACpF,QAAWC,KAAKD,EAAO,CACrB,IAAMJ,EAAMC,EAASI,CAAC,EAChBC,EAAMV,EAAO,IAAII,CAAG,GAAKJ,EAAO,IAAII,EAAI,QAAQ,gBAAiB,EAAE,CAAC,EAC1E,GAAIM,EAAK,OAAOA,EAEhB,GAAI,oBAAoB,KAAKN,CAAG,GAC9B,OAAW,CAACF,EAAMC,CAAE,IAAKH,EAAQ,GAAII,EAAI,WAAW,GAAGF,IAAO,EAAG,OAAOC,GAI9E,CAEA,IAAMQ,EAAgB,CAAC,cAAe,aAAc,YAAY,EAGzD,SAASC,EAAYC,EAAkC,CAE5D,IAAMX,EADIW,EAAK,MAAM,mCAAmC,IACvC,CAAC,GAAG,QAAQ,SAAU,EAAE,EAAE,KAAK,EAChD,OAAOX,GAAQA,EAAK,QAAU,GAAKA,EAAO,MAC5C,CAEA,SAASY,EAAYC,EAAmD,CACtE,GAAKA,EACL,QAAWC,KAAKL,EAAe,CAC7B,IAAMM,EAAOC,EAAQH,EAAWC,CAAC,EACjC,GAAI,CACF,GAAIG,EAAWF,CAAI,EAAG,CACpB,IAAMf,EAAOU,EAAYQ,EAAaH,EAAM,OAAO,CAAC,EACpD,GAAIf,EAAM,OAAOA,EAErB,MAAE,CAEF,EAGJ,CAEA,IAAImB,EAA0E,KAGvE,SAASC,EAAiBC,EAAgC,CAC/D,IAAMN,EAAOC,EAAQK,EAAS,KAAM,KAAM,aAAa,EACnDC,EACJ,GAAI,CAAEA,EAAUC,EAASR,CAAI,EAAE,OAAQ,MAAE,CAAQ,MAAO,CAAC,CAAE,CAC3D,GAAII,GAAUA,EAAO,OAASJ,GAAQI,EAAO,UAAYG,EAAS,OAAOH,EAAO,OAChF,IAAIvB,EAAwB,CAAC,EAC7B,GAAI,CACF,IAAM4B,EAAM,KAAK,MAAMN,EAAaH,EAAM,OAAO,CAAC,EAClDnB,EAAS,OAAO,QAAQ4B,EAAI,QAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAACvB,EAAIG,CAAC,KAAO,CAC1D,GAAAH,EACA,KAAM,OAAOG,GAAG,MAAS,SAAWA,EAAE,KAAO,OAC7C,QAASQ,EAAY,OAAOR,GAAG,WAAc,SAAWA,EAAE,UAAY,MAAS,CACjF,EAAE,CACJ,MAAE,CACAR,EAAS,CAAC,CACZ,CACA,OAAAuB,EAAS,CAAE,KAAAJ,EAAM,QAAAO,EAAS,OAAA1B,CAAO,EAC1BA,CACT,CAGO,SAAS6B,EAAWJ,EAAiBK,EAAoB7B,EAAuB,CAAC,EAAgB,CACtG,IAAM8B,EAAaP,EAAiBC,CAAO,EACrCO,EAAQ,IAAI,IAAID,EAAW,IAAIvB,GAAKA,EAAE,EAAE,CAAC,EAC/C,OAAOT,EAAY,CAAC,GAAGgC,EAAY,GAAGD,EAAS,OAAOzB,GAAM,CAAC2B,EAAM,IAAI3B,CAAE,CAAC,EAAE,IAAIA,IAAO,CAAE,GAAAA,CAAG,EAAE,CAAC,EAAGJ,CAAU,CAC9G","names":["existsSync","readFileSync","statSync","resolve","patternCache","titlePattern","src","classifyPage","meta","path","o","known","t","folders","f","tags","rule","conditions","p","re","normName","s","slugify","WIKILINK","eventDate","a","fromPath","fromTitle","applyRoster","entities","roster","o","t","agentPillar","firstNames","words","p","agent","rosterMatch","byAlias","buildGraph","pages","typeDef","names","groups","usedIds","page","keys","id","k","n","pathKey","group","votes","classifyPage","weight","type","b","first","dated","importance","resolveName","outgoing","incoming","addEdge","e","out","x","inc","entity","st","linked","m","name","to","GraphCache","hub","agentId","article","refs","rosterKey","last","r","i","graph","buildRoster","agents","extraNames","roster","add","name","id","key","normName","a","rosterMatch","names","n","hit","PERSONA_FILES","personaName","text","readPersona","workspace","f","file","resolve","existsSync","readFileSync","cached","configuredAgents","wikiDir","mtimeMs","statSync","raw","loadRoster","agentIds","configured","known"]}
@@ -1,4 +1,4 @@
1
- import{oa as l,ua as m}from"./chunk-UUFJQMHE.js";m();import{existsSync as g,readFileSync as u,writeFileSync as a,copyFileSync as y}from"fs";import{resolve as p}from"path";function P(e,n={}){let t=n.configPath||p(process.cwd(),"agentx.json");if(!g(t))throw new Error(`agentx.json not found at ${t}`);let i=JSON.parse(u(t,"utf-8")),o=e(i),s=typeof o=="string"?{summary:o}:o,c=JSON.stringify(i,null,2)+`
1
+ import{oa as l,wa as m}from"./chunk-S2RRPTS3.js";m();import{existsSync as g,readFileSync as u,writeFileSync as a,copyFileSync as y}from"fs";import{resolve as p}from"path";function P(e,n={}){let t=n.configPath||p(process.cwd(),"agentx.json");if(!g(t))throw new Error(`agentx.json not found at ${t}`);let i=JSON.parse(u(t,"utf-8")),o=e(i),s=typeof o=="string"?{summary:o}:o,c=JSON.stringify(i,null,2)+`
2
2
  `,f=t+".tmp";a(f,c,"utf-8");try{JSON.parse(u(f,"utf-8"))}catch(d){throw new Error(`config did not round-trip cleanly: ${d.message}`)}let r;return n.skipBackup||(r=`${t}.bak.${Date.now()}`,y(t,r)),a(t,c,"utf-8"),n.skipReload||h().catch(()=>{}),{summary:s.summary,payload:s.payload,backupPath:r}}function S(e,n={}){let t=n.configPath||p(process.cwd(),"agentx.json");if(g(t)&&!n.overwrite)throw new Error(`agentx.json already exists at ${t}. Pass overwrite=true to replace it.`);return a(t,JSON.stringify(e,null,2)+`
3
3
  `,"utf-8"),{file:t}}async function h(){try{let n=l().dashboard.daemonUrl?.replace(/\/+$/,"")||"http://127.0.0.1:18800";await fetch(`${n}/reload`,{method:"POST"}).catch(()=>null)}catch{}}export{P as a,S as b};
4
- //# sourceMappingURL=chunk-MZJY26FW.js.map
4
+ //# sourceMappingURL=chunk-KKQPV6SO.js.map
@@ -1,2 +1,2 @@
1
- import{y as l,z as T}from"./chunk-I4GT27UO.js";import{a,f as w}from"./chunk-72SZI2UW.js";T();w();var d="task-tier";function u(e){return{task:b(e.message,2e3),agent:e.agent,channel:e.channel??null,continuesExistingSession:e.isFollowUp??!1,...e.toolsAvailable?{toolsAvailable:e.toolsAvailable}:{}}}var c={needsFlagship:a("This task needs the strongest available model to be done correctly.",{true:"Doing it well takes real reasoning: writing or reviewing code, diagnosing a failure, planning work across several steps, weighing a judgement, handling money, touching production or anything irreversible, following a long or ambiguous instruction, or work where being subtly wrong would not be noticed. Anything where a weaker model would produce something that LOOKS right belongs here.",false:"It is mechanical and its result is obvious on sight: acknowledging or confirming a message, restating or formatting something already written, a greeting, a status echo, reading one file and reporting what it says, a lookup with one right answer, a scheduled heartbeat with nothing to decide."})};function g(e){return e.needsFlagship.noul}function b(e,n){return e.length>n?`${e.slice(0,n)}\u2026`:e}var h=.2;function p(e){return e==="voice"||e==="desktop"||e==="opencode"}var f=60*60*1e3;function M(e,n){if(e==="claude-code"){let t=n?.cheapModels?.[e]??n?.cheapModel;return t&&/^(claude-|haiku$|sonnet$|opus$)/.test(t)?t:void 0}if(e==="codex-cli"){let t=n?.cheapModels?.[e];return t&&/^(gpt-|o\d)/.test(t)?t:void 0}}async function v(e){let n=(s,r=null)=>({downgraded:!1,needsFlagship:r,reason:s});if(p(e.channel))return n(`${e.channel} requests retain the configured model`);if(!e.cheapModel)return n("no cheaper model configured");if(e.isFollowUp){let s=e.sessionIdleMs??0,r=e.cacheTtlMs??f;if(s<r)return n(`follow-up on a warm cache (idle ${Math.round(s/1e3)}s) \u2014 swapping would cost more than it saves`)}let t;try{t=await l(d,u(e),c,{incumbent:{needsFlagship:1},features:{agent:e.agent,channel:e.channel??"unknown"},timeoutMs:1500})}catch{return n("routing seat threw \u2014 keeping the flagship")}if(!t)return n("routing seat unavailable \u2014 keeping the flagship");let o=g(t.answers);if(t.mode!=="active")return n(`shadow \u2014 would ${o<(e.threshold??h)?"downgrade":"keep"} (${o.toFixed(2)})`,o);let i=e.threshold??h;return o>=i?n(`needs the flagship (${o.toFixed(2)})`,o):{model:e.cheapModel,downgraded:!0,needsFlagship:o,reason:`mechanical task (${o.toFixed(2)} below ${i}) \u2192 ${e.cheapModel}`}}var A=["labeled","unlabeled","closed"];function y(e){let n=r=>({downgraded:!1,needsFlagship:null,reason:r});if(p(e.channel))return n(`${e.channel} requests retain the configured model`);let t=e.eventActions??[];if(!t.length)return n("not started by a platform event");let o=e.triage?.actions??A,i=t.find(r=>!o.includes(r));if(i)return n(`"${i}" is not a triage action`);let s=M(e.tier,{cheapModels:e.triage?.models});if(!s)return n(`no triage model set for ${e.tier}`);if(e.isFollowUp){let r=e.sessionIdleMs??0,m=e.cacheTtlMs??f;if(r<m)return n(`follow-up on a warm cache (idle ${Math.round(r/1e3)}s) \u2014 keeping the session's model`)}return{model:s,downgraded:!0,needsFlagship:null,reason:`triage event (${t.join(", ")}) \u2192 ${s}`}}export{h as a,p as b,M as c,v as d,A as e,y as f};
2
- //# sourceMappingURL=chunk-WX67I2KN.js.map
1
+ import{y as l,z as T}from"./chunk-724IBN5Y.js";import{a,f as w}from"./chunk-72SZI2UW.js";T();w();var d="task-tier";function u(e){return{task:b(e.message,2e3),agent:e.agent,channel:e.channel??null,continuesExistingSession:e.isFollowUp??!1,...e.toolsAvailable?{toolsAvailable:e.toolsAvailable}:{}}}var c={needsFlagship:a("This task needs the strongest available model to be done correctly.",{true:"Doing it well takes real reasoning: writing or reviewing code, diagnosing a failure, planning work across several steps, weighing a judgement, handling money, touching production or anything irreversible, following a long or ambiguous instruction, or work where being subtly wrong would not be noticed. Anything where a weaker model would produce something that LOOKS right belongs here.",false:"It is mechanical and its result is obvious on sight: acknowledging or confirming a message, restating or formatting something already written, a greeting, a status echo, reading one file and reporting what it says, a lookup with one right answer, a scheduled heartbeat with nothing to decide."})};function g(e){return e.needsFlagship.noul}function b(e,n){return e.length>n?`${e.slice(0,n)}\u2026`:e}var h=.2;function p(e){return e==="voice"||e==="desktop"||e==="opencode"}var f=60*60*1e3;function M(e,n){if(e==="claude-code"){let t=n?.cheapModels?.[e]??n?.cheapModel;return t&&/^(claude-|haiku$|sonnet$|opus$)/.test(t)?t:void 0}if(e==="codex-cli"){let t=n?.cheapModels?.[e];return t&&/^(gpt-|o\d)/.test(t)?t:void 0}}async function v(e){let n=(s,r=null)=>({downgraded:!1,needsFlagship:r,reason:s});if(p(e.channel))return n(`${e.channel} requests retain the configured model`);if(!e.cheapModel)return n("no cheaper model configured");if(e.isFollowUp){let s=e.sessionIdleMs??0,r=e.cacheTtlMs??f;if(s<r)return n(`follow-up on a warm cache (idle ${Math.round(s/1e3)}s) \u2014 swapping would cost more than it saves`)}let t;try{t=await l(d,u(e),c,{incumbent:{needsFlagship:1},features:{agent:e.agent,channel:e.channel??"unknown"},timeoutMs:1500})}catch{return n("routing seat threw \u2014 keeping the flagship")}if(!t)return n("routing seat unavailable \u2014 keeping the flagship");let o=g(t.answers);if(t.mode!=="active")return n(`shadow \u2014 would ${o<(e.threshold??h)?"downgrade":"keep"} (${o.toFixed(2)})`,o);let i=e.threshold??h;return o>=i?n(`needs the flagship (${o.toFixed(2)})`,o):{model:e.cheapModel,downgraded:!0,needsFlagship:o,reason:`mechanical task (${o.toFixed(2)} below ${i}) \u2192 ${e.cheapModel}`}}var A=["labeled","unlabeled","closed"];function y(e){let n=r=>({downgraded:!1,needsFlagship:null,reason:r});if(p(e.channel))return n(`${e.channel} requests retain the configured model`);let t=e.eventActions??[];if(!t.length)return n("not started by a platform event");let o=e.triage?.actions??A,i=t.find(r=>!o.includes(r));if(i)return n(`"${i}" is not a triage action`);let s=M(e.tier,{cheapModels:e.triage?.models});if(!s)return n(`no triage model set for ${e.tier}`);if(e.isFollowUp){let r=e.sessionIdleMs??0,m=e.cacheTtlMs??f;if(r<m)return n(`follow-up on a warm cache (idle ${Math.round(r/1e3)}s) \u2014 keeping the session's model`)}return{model:s,downgraded:!0,needsFlagship:null,reason:`triage event (${t.join(", ")}) \u2192 ${s}`}}export{h as a,p as b,M as c,v as d,A as e,y as f};
2
+ //# sourceMappingURL=chunk-KQH4LPYC.js.map
@@ -0,0 +1,152 @@
1
+ import{f as h}from"./chunk-KFIJDLQ5.js";import{f as j,g}from"./chunk-5BI2T3WD.js";import{a as z}from"./chunk-IMLAPB7G.js";function E(o,t){return o.ontology.types.find(e=>e.id===t)?.lens??[{panel:"notes",source:"notes",show:1}]}function v(o,t,e){let a=o.ontology.properties.find(n=>n.id===t);return a?e?a.inverse??a.label:a.label:t.replace(/_/g," ")}function G(o,t){let e=o.until??o.date??o.since??"",a=t.until??t.date??t.since??"";return e!==a?a.localeCompare(e):o.label.localeCompare(t.label)}function R(o,t,e,a,n){let r=a?n:e.target?o.entities.get(e.target):void 0,i=[v(o,e.property,a)];return e.role&&i.unshift(e.role.length>40?`${e.role.slice(0,39)}\u2026`:e.role),{label:r?.title??e.value,entityId:r?.id,type:r?.type,chips:i,since:e.since,until:e.until,status:e.status,private:e.access==="private",statement:a?void 0:t.statements.indexOf(e),sub:e.note}}function H(o,t,e){let a=new Set(j(e)),n=e.types?new Set(e.types):null,r=[],i=new Set,s=x=>!n||!!x&&n.has(x.type);for(let x of t.statements){if(!a.has(x.property))continue;let d=x.target?o.entities.get(x.target):void 0;s(d)&&(r.push(R(o,t,x,!1)),d&&i.add(d.id))}for(let x of o.incoming.get(t.id)??[]){if(!a.has(x.property))continue;let d=o.entities.get(x.from);!d||!s(d)||(x.statement?r.push(R(o,t,x.statement,!0,d)):i.has(d.id)||r.push({label:d.title,entityId:d.id,type:d.type,chips:[v(o,"related",!0)],date:d.updated}),i.add(d.id))}if(a.has("related"))for(let x of o.outgoing.get(t.id)??[]){if(x.property!=="related"||i.has(x.to))continue;let d=o.entities.get(x.to);!d||!s(d)||(r.push({label:d.title,entityId:d.id,type:d.type,chips:[v(o,"related",!1)],date:d.updated}),i.add(d.id))}let c=r.filter(x=>!x.chips.includes(v(o,"related",!1))),p=r.filter(x=>x.chips.includes(v(o,"related",!1)));return[...c.sort(G),...p.sort(G)]}function I(o,t,e){let a=new Set;for(let r of o.outgoing.get(t.id)??[])a.add(r.to);for(let r of o.incoming.get(t.id)??[])a.add(r.from);let n=[];for(let r of a){let i=o.entities.get(r);i&&(!e||e.has(i.type))&&n.push(i)}return n.sort((r,i)=>(i.date||i.updated).localeCompare(r.date||r.updated))}function M(o){return{label:o.title,entityId:o.id,type:o.type,chips:[],date:o.date,importance:o.importance}}function T(o,t,e){let a=I(o,t,new Set(["event"])).map(M),n=new Set(e.importance??["major","normal","minor"]),r=a.filter(p=>n.has(p.importance??o.ontology.importance.default)),i=e.fold?a.filter(p=>p.importance===e.fold):[],s=[],c=e.rollup??o.ontology.importance.rollup;if(i.length>=c.min&&i[0].date){let p=Date.parse(i[0].date),x=i.filter(d=>d.date&&p-Date.parse(d.date)<=c.days*864e5);x.length>=c.min&&s.push(`${x.length} minor events in ${c.days} days up to ${i[0].date}`)}return{shown:r,folded:i,rollups:s}}function V(o,t){let e=o.statements.map((r,i)=>({st:r,i})).filter(({st:r})=>r.property==="reading"||!!r.metric).sort((r,i)=>(i.st.at??"").localeCompare(r.st.at??"")),a=new Set,n=[];for(let{st:r,i}of e){let s=r.metric??"reading";t&&a.has(s)||(a.add(s),n.push({label:`${s.replace(/_/g," ")}: ${r.value}`,chips:[],date:r.at,statement:i,private:r.access==="private"}))}return n}function B(o,t){return t(o.sources).sort((e,a)=>a.date.localeCompare(e.date)).map(e=>{let a=e.content.split(`
2
+ `).map(n=>n.trim()).find(Boolean)??"";return{label:a.length>120?`${a.slice(0,117)}\u2026`:a,chips:[],date:e.date,sub:`${e.date} \xB7 ${e.agentId} \xB7 ${e.source}`}})}function P(o,t,e,a){let n=g(e),r=[],i=[],s=[];if(n==="statements")r=H(o,t,e);else if(n==="linked")r=I(o,t,e.types?new Set(e.types):null).map(M);else if(n==="readings")r=V(t,!a.full&&e.latest!==!1);else if(n==="discussed")r=B(t,a.readEntries);else if(n==="history"){let p=T(o,t,e);r=a.full?I(o,t,new Set(["event"])).map(M):p.shown,i=a.full?[]:p.folded,s=p.rollups}let c=r.length;if(a.full){let p=a.pageSize??50,x=Math.max(1,a.page??1);r=r.slice((x-1)*p,x*p)}else r=r.slice(0,e.show??5);return{def:e,title:e.title??e.panel.replace(/_/g," "),items:r,total:c,folded:i,rollups:s,ownerOnly:e.access==="owner"}}function l(o){return String(o??"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}var O={home:'<rect x="3" y="3" width="7" height="7" rx="1"/><rect x="14" y="3" width="7" height="7" rx="1"/><rect x="3" y="14" width="7" height="7" rx="1"/><rect x="14" y="14" width="7" height="7" rx="1"/>',person:'<circle cx="12" cy="8" r="4"/><path d="M4 21c0-4 4-6 8-6s8 2 8 6"/>',org:'<rect x="4" y="3" width="16" height="18" rx="2"/><path d="M9 7h2M13 7h2M9 11h2M13 11h2M9 15h2M13 15h2"/>',pin:'<path d="M12 21s-7-6.2-7-11a7 7 0 0 1 14 0c0 4.8-7 11-7 11z"/><circle cx="12" cy="10" r="2.5"/>',server:'<rect x="3" y="4" width="18" height="7" rx="2"/><rect x="3" y="13" width="18" height="7" rx="2"/><path d="M7 7.5h.01M7 16.5h.01"/>',device:'<rect x="4" y="5" width="16" height="11" rx="1.5"/><path d="M2 19h20"/>',app:'<rect x="4" y="4" width="16" height="16" rx="3"/><path d="M9 12h6M12 9v6"/>',globe:'<circle cx="12" cy="12" r="9"/><path d="M3 12h18M12 3c3 3.5 3 14.5 0 18M12 3c-3 3.5-3 14.5 0 18"/>',key:'<circle cx="8" cy="15" r="4"/><path d="M11 12l9-9M17 6l3 3"/>',agent:'<rect x="5" y="8" width="14" height="11" rx="3"/><path d="M12 4v4M9 13h.01M15 13h.01"/>',project:'<path d="M12 3l8 4.5v9L12 21l-8-4.5v-9z"/><path d="M4 7.5l8 4.5 8-4.5M12 12v9"/>',contract:'<path d="M7 3h7l5 5v13H7z"/><path d="M14 3v5h5M10 13h6M10 17h4"/>',law:'<path d="M12 3v18M5 21h14M6 7h12M6 7l-3 7a3 3 0 0 0 6 0zM18 7l-3 7a3 3 0 0 0 6 0z"/>',calendar:'<rect x="3" y="5" width="18" height="16" rx="2"/><path d="M3 10h18M8 3v4M16 3v4"/>',decision:'<path d="M12 3v18M12 8H6l-2 2 2 2h6M12 12h6l2 2-2 2h-6"/>',steps:'<path d="M9 6h11M9 12h11M9 18h11M4 6l1 1 2-2M4 12l1 1 2-2M4 18l1 1 2-2"/>',topic:'<path d="M4 7h16M4 12h10M4 17h7"/>',chat:'<path d="M4 5h16v11H9l-5 4z"/>',lock:'<rect x="5" y="11" width="14" height="10" rx="2"/><path d="M8 11V8a4 4 0 0 1 8 0v3"/>',arrow:'<path d="M5 12h14M13 6l6 6-6 6"/>',search:'<circle cx="11" cy="11" r="7"/><path d="M21 21l-4.3-4.3"/>',merge:'<circle cx="6" cy="6" r="2"/><circle cx="6" cy="18" r="2"/><circle cx="18" cy="12" r="2"/><path d="M6 8v8M8 6c6 0 8 2 8 6"/>'};function m(o){return`<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">${O[o??""]??O.topic}</svg>`}function u(o,t){return m(o.types.find(e=>e.id===t)?.icon)}function b(o,t){return o.types.find(e=>e.id===t)?.label??t??""}function f(o){return`/e/${encodeURIComponent(o)}`}function L(o){return`<nav class="ox-crumbs" aria-label="Breadcrumb">${[{label:"Wiki",href:"/"},...o].map((e,a,n)=>a===n.length-1||!e.href?`<b>${l(e.label)}</b>`:`<a href="${e.href}">${l(e.label)}</a>`).join('<span aria-hidden="true">/</span>')}</nav>`}function y(o){let t=["","Pillar","Overview","Panel","Statement"];return`<div class="ox-zoom" title="Zoom level">${[1,2,3,4].map(a=>`<span class="${a===o?"on":""}">Z${a}${a===o?` ${t[a]}`:""}</span>`).join("")}</div>`}function w(o,t){let e=o.ontology,a=`<a class="ox-nav${t.home?" on":""}" href="/">${m("home")}<span>Home</span></a>`,n=e.sidebar.pins.slice(0,e.sidebar.pins_max);if(n.length){a+='<div class="ox-side-h">Pinned</div>';for(let r of n){let i=o.names.get(h(r)),s=i?o.entities.get(i):void 0;s&&(a+=`<a class="ox-nav pin${t.entity===s.id?" on":""}" href="${f(s.id)}">${u(e,s.type)}<span>${l(s.title)}</span></a>`)}}a+='<div class="ox-side-h">Pillars</div>';for(let r of e.pillars)r.sidebar!==!1&&(a+=`<a class="ox-nav${t.pillar===r.id?" on":""}" href="/p/${encodeURIComponent(r.id)}">${m(r.icon)}<span>${l(r.label)}</span></a>`);return a+='<div class="ox-side-foot">Types, topics and agent wikis are one level down, on Home and the pillar pages.</div>',a}function $(o,t,e,a="",n=""){return`<!DOCTYPE html>
3
+ <html lang="en">
4
+ <head>
5
+ <meta charset="utf-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1">
7
+ <title>${l(o)} \u2014 Wiki</title>
8
+ <style>${Z}</style>
9
+ <script>(function(){try{var t=localStorage.getItem('wiki-theme');if(t)document.documentElement.setAttribute('data-theme',t)}catch(e){}})();</script>
10
+ </head>
11
+ <body>
12
+ <div class="ox-app">
13
+ <header class="ox-top">
14
+ <a class="ox-logo" href="/"><span class="mark"><i></i></span>Wiki</a>
15
+ <form class="ox-search" action="/find" method="get" role="search">${m("search")}<input type="search" name="q" value="${l(n)}" placeholder="Jump to any page" aria-label="Search the wiki" autocomplete="off"><kbd>\u2318K</kbd></form>
16
+ <span class="ox-spacer"></span>
17
+ <a class="ox-btn" href="/agents">Agent wikis</a>
18
+ <button class="ox-btn" id="ox-theme" type="button" aria-label="Toggle theme">Theme</button>
19
+ </header>
20
+ <div class="ox-layout${a?" rail":""}">
21
+ <nav class="ox-side" aria-label="Wiki">${t}</nav>
22
+ <main class="ox-main">${e}</main>
23
+ ${a?`<aside class="ox-rail">${a}</aside>`:""}
24
+ </div>
25
+ </div>
26
+ <script>
27
+ (function(){
28
+ var b=document.getElementById('ox-theme');
29
+ if(b)b.addEventListener('click',function(){var d=document.documentElement.getAttribute('data-theme')==='dark'?'':'dark';if(d)document.documentElement.setAttribute('data-theme','dark');else document.documentElement.removeAttribute('data-theme');try{localStorage.setItem('wiki-theme',d)}catch(e){}});
30
+ document.addEventListener('keydown',function(e){if((e.metaKey||e.ctrlKey)&&e.key.toLowerCase()==='k'){e.preventDefault();var i=document.querySelector('.ox-search input');if(i)i.focus();}});
31
+ })();
32
+ </script>
33
+ </body>
34
+ </html>`}var Z=`
35
+ :root{--paper:#fafaf9;--card:#fff;--soft:#f4f4f2;--edge:#e7e7e3;--ink:#121614;--muted:#4f5755;--subtle:#7d8684;
36
+ --accent:#1e40af;--accent-soft:#eef3ff;--accent-edge:#c7d6fb;--ok:#0f766e;--ok-soft:#effcf9;--ok-edge:#a7eadf;
37
+ --warn:#92400e;--warn-soft:#fffbeb;--warn-edge:#fde68a;--bad:#b91c1c;--bad-soft:#fef2f2;--bad-edge:#fecaca;
38
+ --mono:ui-monospace,SFMono-Regular,Menlo,monospace;--sans:system-ui,-apple-system,"Segoe UI",sans-serif}
39
+ [data-theme=dark]{--paper:#111413;--card:#181c1b;--soft:#1f2422;--edge:#2c3331;--ink:#e9eeec;--muted:#b3bcba;--subtle:#87918f;
40
+ --accent:#9db7ff;--accent-soft:#1c2540;--accent-edge:#33406a;--ok:#5eead4;--ok-soft:#10302b;--ok-edge:#1d5249;
41
+ --warn:#fcd34d;--warn-soft:#33290f;--warn-edge:#5c4a17;--bad:#fca5a5;--bad-soft:#3a1717;--bad-edge:#5e2525}
42
+ *{box-sizing:border-box}
43
+ body{margin:0;background:var(--paper);color:var(--ink);font:14px/1.45 var(--sans);-webkit-font-smoothing:antialiased}
44
+ a{color:var(--accent);text-decoration:none}a:hover{text-decoration:underline}
45
+ .ox-top{display:flex;align-items:center;gap:16px;padding:10px 18px;border-bottom:1px solid var(--edge);background:var(--card);position:sticky;top:0;z-index:5}
46
+ body>a[href="/admin"]+.ox-app .ox-top{padding-right:130px}
47
+ .ox-logo{display:flex;align-items:center;gap:9px;font-weight:600;color:var(--ink);width:200px}
48
+ .ox-logo .mark{width:24px;height:24px;border-radius:7px;background:var(--ink);display:flex;align-items:center;justify-content:center}
49
+ .ox-logo .mark i{width:8px;height:8px;border-radius:50%;background:#14b8a6}
50
+ .ox-search{flex:0 1 440px;display:flex;align-items:center;gap:8px;border:1px solid var(--edge);border-radius:999px;padding:6px 12px;background:var(--paper)}
51
+ .ox-search svg{width:15px;height:15px;color:var(--subtle)}
52
+ .ox-search input{flex:1;border:0;background:transparent;color:var(--ink);font:13px var(--sans);outline:none}
53
+ .ox-search kbd{font:11px var(--mono);color:var(--subtle)}
54
+ .ox-spacer{flex:1}
55
+ .ox-btn{font:12.5px var(--sans);border:1px solid var(--edge);background:var(--card);color:var(--ink);border-radius:999px;padding:5px 12px;cursor:pointer;display:inline-flex;gap:6px;align-items:center}
56
+ .ox-layout{display:grid;grid-template-columns:230px minmax(0,1fr)}
57
+ .ox-layout.rail{grid-template-columns:230px minmax(0,1fr) 290px}
58
+ .ox-side{border-right:1px solid var(--edge);padding:14px 12px;min-height:calc(100vh - 50px)}
59
+ .ox-nav{display:flex;align-items:center;gap:10px;padding:7px 10px;border-radius:10px;color:var(--ink)}
60
+ .ox-nav:hover{background:var(--soft);text-decoration:none}
61
+ .ox-nav svg{width:16px;height:16px;color:var(--muted);flex:none}
62
+ .ox-nav span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
63
+ .ox-nav.on{background:var(--accent-soft);color:var(--accent);font-weight:500}.ox-nav.on svg{color:var(--accent)}
64
+ .ox-side-h{font:10.5px var(--mono);letter-spacing:.08em;text-transform:uppercase;color:var(--subtle);padding:16px 10px 6px}
65
+ .ox-side-foot{margin-top:18px;border-top:1px solid var(--edge);padding:12px 10px 0;font:10.5px/1.6 var(--mono);color:var(--subtle)}
66
+ .ox-main{padding:20px 28px 48px;min-width:0}
67
+ .ox-rail{border-left:1px solid var(--edge);padding:20px 18px}
68
+ .ox-bar{display:flex;align-items:center;justify-content:space-between;gap:12px}
69
+ .ox-crumbs{font:11.5px var(--mono);color:var(--subtle);display:flex;gap:8px;flex-wrap:wrap}
70
+ .ox-crumbs b{color:var(--ink);font-weight:500}
71
+ .ox-zoom{display:inline-flex;border:1px solid var(--edge);border-radius:999px;padding:3px;background:var(--card);gap:2px}
72
+ .ox-zoom span{font:10.5px var(--mono);letter-spacing:.05em;text-transform:uppercase;padding:4px 9px;border-radius:999px;color:var(--subtle)}
73
+ .ox-zoom span.on{background:var(--ink);color:var(--paper)}
74
+ .ox-head{display:flex;gap:16px;align-items:flex-start;margin:16px 0 18px}
75
+ .ox-avatar{width:54px;height:54px;border-radius:14px;background:var(--accent-soft);border:1px solid var(--accent-edge);display:flex;align-items:center;justify-content:center;color:var(--accent);flex:none}
76
+ .ox-avatar svg{width:26px;height:26px}
77
+ .ox-head h1{font-size:30px;margin:2px 0 8px;letter-spacing:-.02em;font-weight:600;line-height:1.15}
78
+ .ox-head p{margin:0;color:var(--muted)}
79
+ .ox-chips{display:flex;gap:6px;flex-wrap:wrap;align-items:center}
80
+ .ox-chip{font-size:12px;border:1px solid var(--edge);background:var(--card);border-radius:999px;padding:2px 10px;color:var(--muted);display:inline-flex;gap:6px;align-items:center;white-space:nowrap}
81
+ .ox-chip svg{width:12px;height:12px}
82
+ .ox-chip.type{background:var(--accent-soft);border-color:var(--accent-edge);color:var(--accent)}
83
+ .ox-chip.mono{font:11px var(--mono)}
84
+ .ox-st{font:10px var(--mono);letter-spacing:.07em;text-transform:uppercase;border-radius:999px;padding:3px 8px;border:1px solid;white-space:nowrap}
85
+ .ox-st.ok,.ox-st.confirmed{color:var(--ok);background:var(--ok-soft);border-color:var(--ok-edge)}
86
+ .ox-st.proposed{color:var(--accent);background:var(--accent-soft);border-color:var(--accent-edge)}
87
+ .ox-st.warn,.ox-st.due{color:var(--warn);background:var(--warn-soft);border-color:var(--warn-edge)}
88
+ .ox-st.bad,.ox-st.late{color:var(--bad);background:var(--bad-soft);border-color:var(--bad-edge)}
89
+ .ox-st.major{color:var(--paper);background:var(--ink);border-color:var(--ink)}
90
+ .ox-st.normal{color:var(--muted);background:var(--soft);border-color:var(--edge)}
91
+ .ox-st.minor{color:var(--subtle);background:var(--card);border-color:var(--edge)}
92
+ .ox-card{background:var(--card);border:1px solid var(--edge);border-radius:16px;padding:16px 18px;min-width:0}
93
+ .ox-card-h{display:flex;align-items:baseline;gap:10px;margin-bottom:10px}
94
+ .ox-card-h h2,.ox-card-h h3{font-size:15px;margin:0;font-weight:600;white-space:nowrap}
95
+ .ox-card-h .note{font:11px var(--mono);color:var(--subtle);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
96
+ .ox-card-h .zin{margin-left:auto;font:11px var(--mono);white-space:nowrap}
97
+ .ox-grid2{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:16px;margin-top:16px}
98
+ .ox-grid2>.wide{grid-column:1/-1}
99
+ .ox-grid3{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:14px;margin-top:16px}
100
+ .ox-row{display:flex;align-items:center;gap:10px;padding:8px 0;border-top:1px solid var(--edge);font-size:13.5px;min-width:0}
101
+ .ox-row:first-of-type{border-top:0}
102
+ .ox-row .t{min-width:35%;overflow:hidden;flex:1 1 auto}
103
+ .ox-row .t a,.ox-row .t span.l{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
104
+ .ox-row .r{margin-left:auto;display:flex;gap:6px;align-items:center;flex:0 1 auto;min-width:0;flex-wrap:wrap;justify-content:flex-end}
105
+ .ox-row .r .ox-chip{max-width:240px;overflow:hidden;text-overflow:ellipsis}
106
+ .ox-ic{width:28px;height:28px;border-radius:8px;background:var(--soft);border:1px solid var(--edge);display:flex;align-items:center;justify-content:center;flex:none;color:var(--muted)}
107
+ .ox-ic svg{width:14px;height:14px}
108
+ .ox-card-h .note svg,.ox-row .l svg{width:12px;height:12px;vertical-align:-2px}
109
+ .ox-sub{font:11px var(--mono);color:var(--subtle);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
110
+ .ox-summary{font-size:15px;line-height:1.55;margin:0 0 10px}
111
+ .ox-meta{display:flex;gap:16px;flex-wrap:wrap;font:11px var(--mono);color:var(--subtle)}
112
+ .ox-lbl{font:10.5px var(--mono);letter-spacing:.08em;text-transform:uppercase;color:var(--subtle);display:block;margin:4px 0 10px}
113
+ .ox-annot{border:1px dashed var(--subtle);border-radius:14px;padding:12px 14px;font-size:12.5px;color:var(--muted);line-height:1.5}
114
+ .ox-annot ol{margin:6px 0;padding-left:18px}
115
+ .ox-annot .ox-sub{white-space:normal;overflow-wrap:anywhere}
116
+ .ox-rail .ox-row{font-size:13px}
117
+ .ox-tabs{display:flex;gap:4px;border-bottom:1px solid var(--edge);margin:4px 0 0;flex-wrap:wrap}
118
+ .ox-tabs a{padding:8px 12px;color:var(--muted);border-bottom:2px solid transparent;font-size:13.5px}
119
+ .ox-tabs a.on{color:var(--ink);border-color:var(--ink);font-weight:500}
120
+ .ox-tabs a small{font:11px var(--mono);color:var(--subtle);margin-left:4px}
121
+ .ox-ev{display:grid;grid-template-columns:86px 70px minmax(0,1fr);gap:10px;align-items:center;padding:8px 0;border-top:1px solid var(--edge);font-size:13.5px}
122
+ .ox-ev:first-of-type{border-top:0}
123
+ .ox-ev .d{font:11px var(--mono);color:var(--subtle)}
124
+ .ox-ev a{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block}
125
+ .ox-fold{border:1px solid var(--edge);background:var(--soft);border-radius:12px;padding:8px 12px;margin-top:8px;font-size:13px;color:var(--muted)}
126
+ .ox-fold summary{cursor:pointer}
127
+ .ox-tl-axis,.ox-tl-row{display:grid;grid-template-columns:170px minmax(0,1fr);gap:8px}
128
+ .ox-tl-axis{font:10.5px var(--mono);color:var(--subtle);margin-bottom:4px}
129
+ .ox-tl-axis .yrs{display:flex;justify-content:space-between}
130
+ .ox-tl-row{align-items:center;padding:6px 0;border-top:1px solid var(--edge)}
131
+ .ox-tl-row .who{font-size:12.5px;line-height:1.3;min-width:0;overflow:hidden}
132
+ .ox-tl-row .who small{display:block;font:10.5px var(--mono);color:var(--subtle)}
133
+ .ox-track{position:relative;height:20px;background:var(--soft);border-radius:999px}
134
+ .ox-track i{position:absolute;top:2px;height:16px;border-radius:999px;background:var(--accent);color:#fff;font:10px/16px var(--mono);padding:0 7px;white-space:nowrap;overflow:hidden;font-style:normal}
135
+ .ox-track i.past{background:var(--subtle)}
136
+ .ox-kv{display:grid;grid-template-columns:150px minmax(0,1fr);gap:10px;padding:8px 0;border-top:1px solid var(--edge);font-size:13.5px}
137
+ .ox-kv:first-of-type{border-top:0}
138
+ .ox-kv .k{color:var(--muted)}
139
+ .ox-mask{letter-spacing:.15em;color:var(--muted)}
140
+ .ox-prose{line-height:1.6;font-size:14.5px}
141
+ .ox-prose h1,.ox-prose h2,.ox-prose h3{font-size:16px;margin:18px 0 6px}
142
+ .ox-prose pre{background:var(--soft);padding:10px;border-radius:8px;overflow:auto}
143
+ .ox-prose table{border-collapse:collapse}.ox-prose td,.ox-prose th{border:1px solid var(--edge);padding:4px 8px}
144
+ .ox-pager{display:flex;gap:10px;margin-top:12px;font:12px var(--mono)}
145
+ .ox-empty{color:var(--subtle);font-size:13px;padding:6px 0}
146
+ .ox-err{border:1px solid var(--bad-edge);background:var(--bad-soft);color:var(--bad);border-radius:12px;padding:10px 14px;margin:12px 0;font-size:13px}
147
+ @media (max-width:1100px){.ox-layout.rail{grid-template-columns:230px minmax(0,1fr)}.ox-rail{grid-column:2;border-left:0;border-top:1px solid var(--edge)}}
148
+ @media (max-width:760px){.ox-layout,.ox-layout.rail{grid-template-columns:1fr}.ox-side{min-height:0;border-right:0;border-bottom:1px solid var(--edge)}.ox-rail{grid-column:1}.ox-grid2{grid-template-columns:1fr}.ox-logo{width:auto}.ox-tl-axis,.ox-tl-row{grid-template-columns:110px minmax(0,1fr)}}
149
+ `;var F=()=>new Date().toISOString().slice(0,10);function q(o){return o?`<span class="ox-st ${l(o)}">${l(o)}</span>`:""}function K(o){return o.private?`<span class="l"><span class="ox-mask">\u2022\u2022\u2022\u2022</span> ${m("lock")}</span>`:o.entityId?`<a href="${f(o.entityId)}">${l(o.label)}</a>`:`<span class="l">${l(o.label)}</span>`}function J(o,t){if(t.sub)return t.sub;let e=[];return t.type&&e.push(b(o.ontology,t.type).toLowerCase()),t.since||t.until?e.push(`${t.since??"\u2026"} \u2192 ${t.until??"now"}`):t.date&&e.push(t.date),e.join(" \xB7 ")}function Y(o,t,e){let a=J(o,e),n=e.chips.map(i=>`<span class="ox-chip">${l(i)}</span>`).join(""),r=e.statement!==void 0&&e.statement>=0?`<a class="ox-sub" href="${f(t.id)}/s/${e.statement}" title="Where this comes from (Z4)">Z4</a>`:"";return`<div class="ox-row"><span class="ox-ic">${e.type?u(o.ontology,e.type):m(e.private?"lock":"topic")}</span><div class="t">${K(e)}${a?`<div class="ox-sub">${l(a)}</div>`:""}</div><div class="r">${n}${q(e.status)}${r}</div></div>`}function U(o){let t=o.importance??"normal";return`<div class="ox-ev"><span class="d">${l(o.date??"")}</span><span class="ox-st ${t}">${t}</span><span>${o.entityId?`<a href="${f(o.entityId)}">${l(o.label)}</a>`:l(o.label)}</span></div>`}function Q(o){let t=o.flatMap(s=>[s.since,s.until]).filter(s=>!!s).map(s=>Number(s.slice(0,4))).filter(Boolean),e=Number(F().slice(0,4)),a=Math.min(...t,e-1),n=Math.max(1,e+1-a),r=(s,c)=>{if(!s)return c?100:0;let[p,x]=[Number(s.slice(0,4)),Number(s.slice(5,7))||(c?12:1)];return Math.min(100,Math.max(0,(p-a+(x-1)/12)/n*100))},i=`<div class="ox-tl-axis"><span></span><span class="yrs"><span>${a}</span><span>${e}</span></span></div>`;for(let s of o){let c=r(s.since,!1),p=r(s.until,!0),x=`${s.since??"\u2026"} \u2192 ${s.until??"now"}`;i+=`<div class="ox-tl-row"><div class="who">${s.chips.map(l).join(", ")}<small>${s.entityId?`<a href="${f(s.entityId)}">${l(s.label)}</a>`:l(s.label)}</small></div><div class="ox-track"><i class="${s.until?"past":""}" style="left:${c.toFixed(1)}%;width:${Math.max(4,p-c).toFixed(1)}%" title="${l(x)}">${l(x)}</i></div></div>`}return i}function S(o,t,e,a,n=""){let r=!a&&(e.total>e.items.length||e.def.source==="notes"||e.folded.length)?`<a class="zin" href="${f(t.id)}/${encodeURIComponent(e.def.panel)}">all ${e.total||""} (Z3) \u2192</a>`:"",s=e.def.source==="notes"||e.def.panel==="notes"?`${t.pages.length} page${t.pages.length===1?"":"s"}`:`${e.total} ${e.total===1?"item":"items"}`,c=`<span class="note">${e.ownerOnly?`${m("lock")} private to the owner \xB7 `:""}${s}</span>`,p="";e.def.source==="notes"||e.def.panel==="notes"?p=n||'<div class="ox-empty">No notes.</div>':e.items.length===0?p='<div class="ox-empty">Nothing recorded yet.</div>':e.def.display==="timeline"&&e.items.some(d=>d.since)?p=Q(e.items):e.def.source==="history"||e.items.every(d=>d.type==="event")?p=e.items.map(U).join(""):p=e.items.map(d=>Y(o,t,d)).join("");for(let d of e.rollups)p+=`<div class="ox-fold">\u21BB Recurring: ${l(d)}</div>`;return e.folded.length&&(p+=`<details class="ox-fold"><summary>+ ${e.folded.length} minor event${e.folded.length===1?"":"s"}</summary>${e.folded.slice(0,20).map(U).join("")}</details>`),`<section class="ox-card${e.def.display==="timeline"||e.def.source==="notes"||e.def.panel==="notes"?" wide":""}"><div class="ox-card-h"><h2>${l(e.title)}</h2>${c}${r}</div>${p}</section>`}function C(o,t){return z(t.replace(/<!--\s*tags?:[^>]*-->\s*\n?/gi,"").replace(/<!-- \/overview -->\s*\n?/g,""),{wikilink:(e,a)=>{let n=o.names.get(h(e));return n?`<a href="${f(n)}" class="wikilink">${a}</a>`:`<a href="/find?q=${encodeURIComponent(e)}" class="wikilink broken" title="No page yet">${a}</a>`}})}function k(o){return o.replace(/^---\n[\s\S]*?\n---\n?/,"").trim()}var X=/^##[ \t]+Overview[ \t]*$/im,N="<!-- /overview -->";function D(o){let t=X.exec(o);if(!t)return;let e=t.index+t[0].length,a=o.slice(e),n=a.indexOf(N),r=a.search(/^#{1,2}[ \t]/m),i=[n,r].filter(p=>p>=0),s=e+(i.length?Math.min(...i):a.length),c=n>=0&&e+n===s?s+N.length:s;return{start:t.index,textStart:e,end:s,after:c}}function ee(o){let t=k(o),e=D(t);return(e?t.slice(e.textStart,e.end).trim():"")||void 0}function te(o){let t=[...o.pages].sort((e,a)=>(a.article.meta.lastUpdated||"").localeCompare(e.article.meta.lastUpdated||""));for(let e of t){let a=ee(e.article.content);if(a)return a}}function oe(o,t){if(o.length<=t)return o;let e=o.slice(0,t),a=Math.max(...[". ","! ","? ","\u061F ","\u3002"].map(n=>e.lastIndexOf(n)));return a>t/3?e.slice(0,a+1):`${e.replace(/\s+\S*$/,"")}\u2026`}function ne(o,t=360){let n=(k(o.pages[0]?.article.content??"").split(/\n\s*\n/).map(r=>r.trim()).find(r=>r&&!r.startsWith("#")&&!r.startsWith("|")&&!r.startsWith("```"))??"").replace(/\[\[([^\]|]+)(?:\|([^\]]+))?\]\]/g,(r,i,s)=>s??i).replace(/\[([^\]]+)\]\([^)]*\)/g,"$1").replace(/^[-*]\s+/gm,"").replace(/[*_`]/g,"").replace(/\s+/g," ").trim();return oe(n,t)}function ae(o,t){return o.ontology.pillars.find(e=>e.id===t.pillar)}function W(o,t,e=[]){let a=ae(o,t);return L([{label:a?.label??t.pillar,href:`/p/${encodeURIComponent(t.pillar)}`},{label:b(o.ontology,t.type),href:`/p/${encodeURIComponent(t.pillar)}?kind=${encodeURIComponent(t.type)}`},{label:t.title,href:e.length?f(t.id):void 0},...e])}function _(o,t,e){if(!e){let a=t.pages[0];if(!a)return"";let n=k(a.article.content),r=D(n),i=(r?n.slice(0,r.start)+n.slice(r.after):n).trim(),s=i.length>1600?`${i.slice(0,1600).replace(/\n[^\n]*$/,"")}
150
+
151
+ \u2026`:i;return`<div class="ox-prose">${C(o,s)}</div>`}return t.pages.map(a=>`<div class="ox-sub">from ${l(a.agentId)} \xB7 ${l(a.article.path)} \xB7 updated ${l(a.article.meta.lastUpdated||"\u2014")}</div><div class="ox-prose">${C(o,k(a.article.content))}</div>`).join('<hr style="border:0;border-top:1px solid var(--edge);margin:16px 0">')}function re(o,t,e){let a=o.ontology.types.find(i=>i.id===t.type),n=`<span class="ox-lbl">Lens for this type</span><div class="ox-annot"><b>${l(a?.label??t.type)}</b> opens with:<ol>`;n+=e.map(i=>`<li>${l(i.title??i.panel)}</li>`).join(""),n+=`</ol><span class="ox-sub">from ontology.yaml \xB7 types.${l(t.type)}.lens</span></div>`,n+='<span class="ox-lbl" style="margin-top:20px">Zoom in</span>';for(let i of e)n+=`<div class="ox-row"><span class="ox-ic">${m(g(i)==="history"?"calendar":g(i)==="discussed"?"chat":"arrow")}</span><div class="t"><a href="${f(t.id)}/${encodeURIComponent(i.panel)}">${l(i.title??i.panel)}</a><div class="ox-sub">Z3 \xB7 in full</div></div></div>`;n+='<span class="ox-lbl" style="margin-top:20px">Provenance</span>';let r=new Map;for(let i of t.pages)r.set(i.agentId,(r.get(i.agentId)??0)+1);for(let[i,s]of r){let c=t.pages.find(p=>p.agentId===i);n+=`<div class="ox-row"><span class="ox-ic">${m("agent")}</span><div class="t"><a href="/agent/${encodeURIComponent(i)}/article/${encodeURIComponent(c.article.path)}">${l(i)}</a><div class="ox-sub">${s} page${s===1?"":"s"} \xB7 ${t.statements.filter(p=>p.page.agentId===i).length} statements</div></div></div>`}return t.pages.length>1&&(n+=`<div class="ox-row"><span class="ox-ic">${m("merge")}</span><div class="t"><span class="l">${t.pages.length} pages merged</span><div class="ox-sub">same name, one entity</div></div></div>`),n}function ve(o,t){let{g:e}=o,a=E(e,t.type),n=e.ontology.types.find(p=>p.id===t.type),r=e.ontology.sidebar.pins.some(p=>e.names.get(h(p))===t.id),i=`<div class="ox-bar">${W(e,t)}${y(2)}</div>`;i+=`<div class="ox-head"><div class="ox-avatar">${u(e.ontology,t.type)}</div><div><h1>${l(t.title)}</h1><div class="ox-chips">`,i+=`<span class="ox-chip type">${u(e.ontology,t.type)}${l(n?.label??t.type)}</span>`,n?.schema&&(i+=`<span class="ox-chip mono">${l(n.schema.includes(" ")||n.schema.includes(":")?n.schema:`schema.org/${n.schema}`)}</span>`),t.type==="event"&&(i+=`<span class="ox-st ${t.importance}">${t.importance}</span>`),r&&(i+='<span class="ox-chip">pinned</span>'),t.pages.length>1&&(i+=`<span class="ox-chip">${m("merge")}merged from ${t.pages.length} pages</span>`),i+="</div></div></div>",t.review&&(i+=`<div class="ox-card ox-sub" style="border-color:var(--warn,#d97706)">Check the type: ${l(t.review)}</div>`);let s=te(t),c=s?"":ne(t);if((s||c)&&a[0]?.panel!=="notes"){let p=s?`<div class="ox-summary ox-prose">${C(e,s)}</div>`:`<p class="ox-summary">${l(c)}</p>`;i+=`<section class="ox-card">${p}<div class="ox-meta"><span>updated ${l(t.updated||"\u2014")}</span><span>sources: ${t.sources.length}</span><span>${t.statements.length} statements</span></div></section>`}i+='<div class="ox-grid2">';for(let p of a){let x=P(e,t,p,{full:!1,readEntries:o.readEntries}),d=g(p)==="notes";i+=S(e,t,x,!1,d?_(e,t,!1):"")}return i+="</div>",$(t.title,w(e,{pillar:t.pillar,entity:t.id}),i,re(e,t,a))}function be(o,t,e,a){let{g:n}=o,r=E(n,t.type).find(d=>d.panel===e);if(!r)return null;let i=P(n,t,r,{full:!0,page:a,pageSize:50,readEntries:o.readEntries}),s=r.title??r.panel,c=`<div class="ox-bar">${W(n,t,[{label:s}])}${y(3)}</div>`;c+=`<div class="ox-head"><div class="ox-avatar">${u(n.ontology,t.type)}</div><div><h1>${l(s)}</h1><p>${l(t.title)} \xB7 ${i.total} item${i.total===1?"":"s"}</p></div></div>`;let p=g(r)==="notes";c+=S(n,t,i,!0,p?_(n,t,!0):"");let x=Math.ceil(i.total/50);if(x>1){let d=`${f(t.id)}/${encodeURIComponent(e)}`;c+=`<div class="ox-pager">${a>1?`<a href="${d}?page=${a-1}">\u2190 newer</a>`:""}<span>page ${a} of ${x}</span>${a<x?`<a href="${d}?page=${a+1}">older \u2192</a>`:""}</div>`}return $(`${s} \xB7 ${t.title}`,w(n,{pillar:t.pillar,entity:t.id}),c)}function ye(o,t,e){let{g:a}=o,n=t.statements[e];if(!n)return null;let r=a.ontology.properties.find(d=>d.id===n.property),i=n.target?a.entities.get(n.target):void 0,s=n.page.article.meta,c=[["Subject",`<a href="${f(t.id)}">${l(t.title)}</a>`],["Property",`${l(r?.label??n.property)}${r?.wikidata?` <span class="ox-sub">wikidata ${l(r.wikidata)}</span>`:""}`],["Value",i?`<a href="${f(i.id)}">${l(i.title)}</a>`:l(n.value)]];n.role&&c.push(["Role",l(n.role)]),n.metric&&c.push(["Metric",l(n.metric)]),(n.since||n.until)&&c.push(["True",`${l(n.since??"\u2026")} \u2192 ${l(n.until??"now")}`]),n.at&&c.push(["Measured",l(n.at)]),c.push(["Recorded",l(s.lastUpdated||s.created||"\u2014")]),c.push(["Source",l(n.source??(s.sources.length?`${s.sources.length} conversation entries`:"not given"))]),c.push(["Written by",`${l(n.page.agentId)} \xB7 <a href="/agent/${encodeURIComponent(n.page.agentId)}/article/${encodeURIComponent(n.page.article.path)}">${l(n.page.article.path)}</a>`]),c.push(["Status",n.status?`<span class="ox-st ${l(n.status)}">${l(n.status)}</span>`:"not set"]),n.confirmed_by&&c.push(["Confirmed by",l(n.confirmed_by)]),n.checked_at&&c.push(["Checked",l(n.checked_at)]),c.push(["Access",l(n.access??s.access)]),n.note&&c.push(["Note",l(n.note)]);let p=o.versions(n.page.agentId,n.page.article.path);c.push(["Past versions",p.length?p.slice(0,8).map(d=>l(d.timestamp)).join("<br>"):"none saved"]);let x=`<div class="ox-bar">${W(a,t,[{label:r?.label??n.property}])}${y(4)}</div>`;return x+=`<div class="ox-head"><div class="ox-avatar">${m("key")}</div><div><h1>${l(r?.label??n.property)}</h1><p>${l(t.title)} \u2192 ${l(i?.title??n.value)}</p></div></div>`,x+=`<section class="ox-card">${c.map(([d,A])=>`<div class="ox-kv"><span class="k">${d}</span><span>${A}</span></div>`).join("")}</section>`,$(`${r?.label??n.property} \xB7 ${t.title}`,w(a,{pillar:t.pillar,entity:t.id}),x)}export{I as a,l as b,m as c,u as d,b as e,f,L as g,y as h,w as i,$ as j,k,N as l,D as m,ne as n,ve as o,be as p,ye as q};
152
+ //# sourceMappingURL=chunk-MCBTVNPX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/wiki/ontology/lens.ts","../src/wiki/ontology/view-layout.ts","../src/wiki/ontology/view-panels.ts","../src/wiki/ontology/view-entity.ts"],"sourcesContent":["// --- Panel contents for an entity, per its type's lens (#811) ---\n//\n// A lens lists panels; each panel reads one side of the entity from the\n// graph. At Z2 a panel shows its first few items, at Z3 all of them.\n// This file only selects and orders; the view decides how it looks.\n\nimport type { WikiEntry } from \"../types\"\nimport type { Entity, EntityStatement, WikiGraph } from \"./graph\"\nimport { panelFrom, panelSource } from \"./load\"\nimport type { Importance, LensPanel, TypeDef } from \"./types\"\n\nexport interface PanelItem {\n label: string\n /** Entity id when the item is a page. */\n entityId?: string\n /** Type of the other end, for its icon and sub-line. */\n type?: string\n /** Relation labels: property, role. */\n chips: string[]\n sub?: string\n since?: string\n until?: string\n date?: string\n importance?: Importance\n status?: string\n /** Masked at Z2 and Z3; the value shows at Z4 only. */\n private?: boolean\n /** Index in entity.statements, for the Z4 link. */\n statement?: number\n}\n\nexport interface PanelData {\n def: LensPanel\n title: string\n items: PanelItem[]\n /** Items before paging. */\n total: number\n /** History: minor events folded under the shown ones. */\n folded: PanelItem[]\n /** History: one line per recurring burst of minor events. */\n rollups: string[]\n ownerOnly: boolean\n}\n\nexport function lensFor(g: WikiGraph, type: string): LensPanel[] {\n return g.ontology.types.find((t: TypeDef) => t.id === type)?.lens ?? [{ panel: \"notes\", source: \"notes\", show: 1 }]\n}\n\nfunction propLabel(g: WikiGraph, id: string, inverse: boolean): string {\n const p = g.ontology.properties.find(x => x.id === id)\n if (!p) return id.replace(/_/g, \" \")\n return inverse ? (p.inverse ?? p.label) : p.label\n}\n\nfunction byRecent(a: PanelItem, b: PanelItem): number {\n const da = a.until ?? a.date ?? a.since ?? \"\"\n const db = b.until ?? b.date ?? b.since ?? \"\"\n if (da !== db) return db.localeCompare(da)\n return a.label.localeCompare(b.label)\n}\n\nfunction statementItem(g: WikiGraph, e: Entity, st: EntityStatement, inverse: boolean, from?: Entity): PanelItem {\n const other = inverse ? from : (st.target ? g.entities.get(st.target) : undefined)\n const chips = [propLabel(g, st.property, inverse)]\n // A long role would squeeze the name out of the row.\n if (st.role) chips.unshift(st.role.length > 40 ? `${st.role.slice(0, 39)}…` : st.role)\n return {\n label: other?.title ?? st.value,\n entityId: other?.id,\n type: other?.type,\n chips,\n since: st.since,\n until: st.until,\n status: st.status,\n private: st.access === \"private\",\n statement: inverse ? undefined : e.statements.indexOf(st),\n sub: st.note,\n }\n}\n\nfunction statementsPanel(g: WikiGraph, e: Entity, def: LensPanel): PanelItem[] {\n const from = new Set(panelFrom(def))\n const types = def.types ? new Set(def.types) : null\n const items: PanelItem[] = []\n const seen = new Set<string>()\n const keep = (other?: Entity): boolean => !types || (!!other && types.has(other.type))\n\n for (const st of e.statements) {\n if (!from.has(st.property)) continue\n const other = st.target ? g.entities.get(st.target) : undefined\n if (!keep(other)) continue\n items.push(statementItem(g, e, st, false))\n if (other) seen.add(other.id)\n }\n for (const edge of g.incoming.get(e.id) ?? []) {\n if (!from.has(edge.property)) continue\n const other = g.entities.get(edge.from)\n if (!other || !keep(other)) continue\n if (edge.statement) items.push(statementItem(g, e, edge.statement, true, other))\n else if (!seen.has(other.id)) items.push({ label: other.title, entityId: other.id, type: other.type, chips: [propLabel(g, \"related\", true)], date: other.updated })\n seen.add(other.id)\n }\n if (from.has(\"related\")) {\n for (const edge of g.outgoing.get(e.id) ?? []) {\n if (edge.property !== \"related\" || seen.has(edge.to)) continue\n const other = g.entities.get(edge.to)\n if (!other || !keep(other)) continue\n items.push({ label: other.title, entityId: other.id, type: other.type, chips: [propLabel(g, \"related\", false)], date: other.updated })\n seen.add(other.id)\n }\n }\n // Typed relations first, then plain links; each part newest first.\n const typed = items.filter(i => !i.chips.includes(propLabel(g, \"related\", false)))\n const plain = items.filter(i => i.chips.includes(propLabel(g, \"related\", false)))\n return [...typed.sort(byRecent), ...plain.sort(byRecent)]\n}\n\n/** Entities linked to `e` either way, of the given types. */\nexport function linkedEntities(g: WikiGraph, e: Entity, types: Set<string> | null): Entity[] {\n const ids = new Set<string>()\n for (const edge of g.outgoing.get(e.id) ?? []) ids.add(edge.to)\n for (const edge of g.incoming.get(e.id) ?? []) ids.add(edge.from)\n const out: Entity[] = []\n for (const id of ids) {\n const other = g.entities.get(id)\n if (other && (!types || types.has(other.type))) out.push(other)\n }\n return out.sort((a, b) => (b.date || b.updated).localeCompare(a.date || a.updated))\n}\n\nfunction entityItem(other: Entity): PanelItem {\n return { label: other.title, entityId: other.id, type: other.type, chips: [], date: other.date, importance: other.importance }\n}\n\nfunction historyPanel(g: WikiGraph, e: Entity, def: LensPanel): { shown: PanelItem[]; folded: PanelItem[]; rollups: string[] } {\n const events = linkedEntities(g, e, new Set([\"event\"])).map(entityItem)\n const shownLevels = new Set<Importance>(def.importance ?? [\"major\", \"normal\", \"minor\"])\n const shown = events.filter(i => shownLevels.has(i.importance ?? g.ontology.importance.default))\n const folded = def.fold ? events.filter(i => i.importance === def.fold) : []\n const rollups: string[] = []\n const rule = def.rollup ?? g.ontology.importance.rollup\n if (folded.length >= rule.min && folded[0].date) {\n const newest = Date.parse(folded[0].date)\n const recent = folded.filter(i => i.date && newest - Date.parse(i.date) <= rule.days * 86_400_000)\n if (recent.length >= rule.min) rollups.push(`${recent.length} minor events in ${rule.days} days up to ${folded[0].date}`)\n }\n return { shown, folded, rollups }\n}\n\nfunction readingsPanel(e: Entity, latestOnly: boolean): PanelItem[] {\n const readings = e.statements\n .map((st, i) => ({ st, i }))\n .filter(({ st }) => st.property === \"reading\" || !!st.metric)\n .sort((a, b) => (b.st.at ?? \"\").localeCompare(a.st.at ?? \"\"))\n const seen = new Set<string>()\n const out: PanelItem[] = []\n for (const { st, i } of readings) {\n const metric = st.metric ?? \"reading\"\n if (latestOnly && seen.has(metric)) continue\n seen.add(metric)\n out.push({ label: `${metric.replace(/_/g, \" \")}: ${st.value}`, chips: [], date: st.at, statement: i, private: st.access === \"private\" })\n }\n return out\n}\n\nfunction discussedPanel(e: Entity, readEntries: (ids: string[]) => WikiEntry[]): PanelItem[] {\n return readEntries(e.sources)\n .sort((a, b) => b.date.localeCompare(a.date))\n .map(en => {\n const line = en.content.split(\"\\n\").map(l => l.trim()).find(Boolean) ?? \"\"\n return {\n label: line.length > 120 ? `${line.slice(0, 117)}…` : line,\n chips: [],\n date: en.date,\n // The panel is owner-only as a whole; its rows are not masked.\n sub: `${en.date} · ${en.agentId} · ${en.source}`,\n }\n })\n}\n\nexport interface PanelOpts {\n full: boolean\n page?: number\n pageSize?: number\n readEntries: (ids: string[]) => WikiEntry[]\n}\n\nexport function panelData(g: WikiGraph, e: Entity, def: LensPanel, opts: PanelOpts): PanelData {\n const source = panelSource(def)\n let items: PanelItem[] = []\n let folded: PanelItem[] = []\n let rollups: string[] = []\n if (source === \"statements\") items = statementsPanel(g, e, def)\n else if (source === \"linked\") items = linkedEntities(g, e, def.types ? new Set(def.types) : null).map(entityItem)\n else if (source === \"readings\") items = readingsPanel(e, !opts.full && def.latest !== false)\n else if (source === \"discussed\") items = discussedPanel(e, opts.readEntries)\n else if (source === \"history\") {\n const h = historyPanel(g, e, def)\n // Z3 shows every level, minor ones unfolded.\n items = opts.full ? linkedEntities(g, e, new Set([\"event\"])).map(entityItem) : h.shown\n folded = opts.full ? [] : h.folded\n rollups = h.rollups\n }\n const total = items.length\n if (opts.full) {\n const size = opts.pageSize ?? 50\n const page = Math.max(1, opts.page ?? 1)\n items = items.slice((page - 1) * size, page * size)\n } else {\n items = items.slice(0, def.show ?? 5)\n }\n return {\n def,\n title: def.title ?? def.panel.replace(/_/g, \" \"),\n items,\n total,\n folded,\n rollups,\n ownerOnly: def.access === \"owner\",\n }\n}\n","// --- Wiki knowledge-graph view: page frame, sidebar, icons (#811) ---\n//\n// Server-rendered HTML with no client build, like the rest of the wiki.\n// The sidebar is the widest zoom level (Z0): Home, the owner's pins and\n// the pillars, nothing deeper.\n\nimport { normName, type WikiGraph } from \"./graph\"\nimport type { Ontology } from \"./types\"\n\nexport function esc(s: string): string {\n return String(s ?? \"\").replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\").replace(/\"/g, \"&quot;\")\n}\n\nconst PATHS: Record<string, string> = {\n home: '<rect x=\"3\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\"/><rect x=\"14\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\"/><rect x=\"3\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\"/><rect x=\"14\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\"/>',\n person: '<circle cx=\"12\" cy=\"8\" r=\"4\"/><path d=\"M4 21c0-4 4-6 8-6s8 2 8 6\"/>',\n org: '<rect x=\"4\" y=\"3\" width=\"16\" height=\"18\" rx=\"2\"/><path d=\"M9 7h2M13 7h2M9 11h2M13 11h2M9 15h2M13 15h2\"/>',\n pin: '<path d=\"M12 21s-7-6.2-7-11a7 7 0 0 1 14 0c0 4.8-7 11-7 11z\"/><circle cx=\"12\" cy=\"10\" r=\"2.5\"/>',\n server: '<rect x=\"3\" y=\"4\" width=\"18\" height=\"7\" rx=\"2\"/><rect x=\"3\" y=\"13\" width=\"18\" height=\"7\" rx=\"2\"/><path d=\"M7 7.5h.01M7 16.5h.01\"/>',\n device: '<rect x=\"4\" y=\"5\" width=\"16\" height=\"11\" rx=\"1.5\"/><path d=\"M2 19h20\"/>',\n app: '<rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"3\"/><path d=\"M9 12h6M12 9v6\"/>',\n globe: '<circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M3 12h18M12 3c3 3.5 3 14.5 0 18M12 3c-3 3.5-3 14.5 0 18\"/>',\n key: '<circle cx=\"8\" cy=\"15\" r=\"4\"/><path d=\"M11 12l9-9M17 6l3 3\"/>',\n agent: '<rect x=\"5\" y=\"8\" width=\"14\" height=\"11\" rx=\"3\"/><path d=\"M12 4v4M9 13h.01M15 13h.01\"/>',\n project: '<path d=\"M12 3l8 4.5v9L12 21l-8-4.5v-9z\"/><path d=\"M4 7.5l8 4.5 8-4.5M12 12v9\"/>',\n contract: '<path d=\"M7 3h7l5 5v13H7z\"/><path d=\"M14 3v5h5M10 13h6M10 17h4\"/>',\n law: '<path d=\"M12 3v18M5 21h14M6 7h12M6 7l-3 7a3 3 0 0 0 6 0zM18 7l-3 7a3 3 0 0 0 6 0z\"/>',\n calendar: '<rect x=\"3\" y=\"5\" width=\"18\" height=\"16\" rx=\"2\"/><path d=\"M3 10h18M8 3v4M16 3v4\"/>',\n decision: '<path d=\"M12 3v18M12 8H6l-2 2 2 2h6M12 12h6l2 2-2 2h-6\"/>',\n steps: '<path d=\"M9 6h11M9 12h11M9 18h11M4 6l1 1 2-2M4 12l1 1 2-2M4 18l1 1 2-2\"/>',\n topic: '<path d=\"M4 7h16M4 12h10M4 17h7\"/>',\n chat: '<path d=\"M4 5h16v11H9l-5 4z\"/>',\n lock: '<rect x=\"5\" y=\"11\" width=\"14\" height=\"10\" rx=\"2\"/><path d=\"M8 11V8a4 4 0 0 1 8 0v3\"/>',\n arrow: '<path d=\"M5 12h14M13 6l6 6-6 6\"/>',\n search: '<circle cx=\"11\" cy=\"11\" r=\"7\"/><path d=\"M21 21l-4.3-4.3\"/>',\n merge: '<circle cx=\"6\" cy=\"6\" r=\"2\"/><circle cx=\"6\" cy=\"18\" r=\"2\"/><circle cx=\"18\" cy=\"12\" r=\"2\"/><path d=\"M6 8v8M8 6c6 0 8 2 8 6\"/>',\n}\n\nexport function icon(name: string | undefined): string {\n const d = PATHS[name ?? \"\"] ?? PATHS.topic\n return `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">${d}</svg>`\n}\n\nexport function typeIcon(o: Ontology, type: string | undefined): string {\n return icon(o.types.find(t => t.id === type)?.icon)\n}\n\nexport function typeLabel(o: Ontology, type: string | undefined): string {\n return o.types.find(t => t.id === type)?.label ?? type ?? \"\"\n}\n\nexport function entityHref(id: string): string {\n return `/e/${encodeURIComponent(id)}`\n}\n\nexport interface Crumb { label: string; href?: string }\n\n/** Wiki / Pillar / Kind / Page / Panel, following the zoom. */\nexport function crumbs(list: Crumb[]): string {\n const parts = [{ label: \"Wiki\", href: \"/\" }, ...list].map((c, i, all) =>\n i === all.length - 1 || !c.href ? `<b>${esc(c.label)}</b>` : `<a href=\"${c.href}\">${esc(c.label)}</a>`)\n return `<nav class=\"ox-crumbs\" aria-label=\"Breadcrumb\">${parts.join('<span aria-hidden=\"true\">/</span>')}</nav>`\n}\n\n/** The Z0–Z4 indicator. `at` is the current level. */\nexport function zoomBar(at: 1 | 2 | 3 | 4): string {\n const names = [\"\", \"Pillar\", \"Overview\", \"Panel\", \"Statement\"]\n const cells = [1, 2, 3, 4].map(z => `<span class=\"${z === at ? \"on\" : \"\"}\">Z${z}${z === at ? ` ${names[z]}` : \"\"}</span>`)\n return `<div class=\"ox-zoom\" title=\"Zoom level\">${cells.join(\"\")}</div>`\n}\n\nexport function sidebar(g: WikiGraph, active: { pillar?: string; entity?: string; home?: boolean }): string {\n const o = g.ontology\n let html = `<a class=\"ox-nav${active.home ? \" on\" : \"\"}\" href=\"/\">${icon(\"home\")}<span>Home</span></a>`\n const pins = o.sidebar.pins.slice(0, o.sidebar.pins_max)\n if (pins.length) {\n html += `<div class=\"ox-side-h\">Pinned</div>`\n for (const title of pins) {\n const id = g.names.get(normName(title))\n const e = id ? g.entities.get(id) : undefined\n if (!e) continue\n html += `<a class=\"ox-nav pin${active.entity === e.id ? \" on\" : \"\"}\" href=\"${entityHref(e.id)}\">${typeIcon(o, e.type)}<span>${esc(e.title)}</span></a>`\n }\n }\n html += `<div class=\"ox-side-h\">Pillars</div>`\n for (const p of o.pillars) {\n if (p.sidebar === false) continue\n html += `<a class=\"ox-nav${active.pillar === p.id ? \" on\" : \"\"}\" href=\"/p/${encodeURIComponent(p.id)}\">${icon(p.icon)}<span>${esc(p.label)}</span></a>`\n }\n html += `<div class=\"ox-side-foot\">Types, topics and agent wikis are one level down, on Home and the pillar pages.</div>`\n return html\n}\n\nexport function layout(title: string, side: string, main: string, rail = \"\", q = \"\"): string {\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>${esc(title)} — Wiki</title>\n<style>${CSS}</style>\n<script>(function(){try{var t=localStorage.getItem('wiki-theme');if(t)document.documentElement.setAttribute('data-theme',t)}catch(e){}})();</script>\n</head>\n<body>\n<div class=\"ox-app\">\n <header class=\"ox-top\">\n <a class=\"ox-logo\" href=\"/\"><span class=\"mark\"><i></i></span>Wiki</a>\n <form class=\"ox-search\" action=\"/find\" method=\"get\" role=\"search\">${icon(\"search\")}<input type=\"search\" name=\"q\" value=\"${esc(q)}\" placeholder=\"Jump to any page\" aria-label=\"Search the wiki\" autocomplete=\"off\"><kbd>⌘K</kbd></form>\n <span class=\"ox-spacer\"></span>\n <a class=\"ox-btn\" href=\"/agents\">Agent wikis</a>\n <button class=\"ox-btn\" id=\"ox-theme\" type=\"button\" aria-label=\"Toggle theme\">Theme</button>\n </header>\n <div class=\"ox-layout${rail ? \" rail\" : \"\"}\">\n <nav class=\"ox-side\" aria-label=\"Wiki\">${side}</nav>\n <main class=\"ox-main\">${main}</main>\n ${rail ? `<aside class=\"ox-rail\">${rail}</aside>` : \"\"}\n </div>\n</div>\n<script>\n(function(){\n var b=document.getElementById('ox-theme');\n if(b)b.addEventListener('click',function(){var d=document.documentElement.getAttribute('data-theme')==='dark'?'':'dark';if(d)document.documentElement.setAttribute('data-theme','dark');else document.documentElement.removeAttribute('data-theme');try{localStorage.setItem('wiki-theme',d)}catch(e){}});\n document.addEventListener('keydown',function(e){if((e.metaKey||e.ctrlKey)&&e.key.toLowerCase()==='k'){e.preventDefault();var i=document.querySelector('.ox-search input');if(i)i.focus();}});\n})();\n</script>\n</body>\n</html>`\n}\n\nconst CSS = `\n:root{--paper:#fafaf9;--card:#fff;--soft:#f4f4f2;--edge:#e7e7e3;--ink:#121614;--muted:#4f5755;--subtle:#7d8684;\n--accent:#1e40af;--accent-soft:#eef3ff;--accent-edge:#c7d6fb;--ok:#0f766e;--ok-soft:#effcf9;--ok-edge:#a7eadf;\n--warn:#92400e;--warn-soft:#fffbeb;--warn-edge:#fde68a;--bad:#b91c1c;--bad-soft:#fef2f2;--bad-edge:#fecaca;\n--mono:ui-monospace,SFMono-Regular,Menlo,monospace;--sans:system-ui,-apple-system,\"Segoe UI\",sans-serif}\n[data-theme=dark]{--paper:#111413;--card:#181c1b;--soft:#1f2422;--edge:#2c3331;--ink:#e9eeec;--muted:#b3bcba;--subtle:#87918f;\n--accent:#9db7ff;--accent-soft:#1c2540;--accent-edge:#33406a;--ok:#5eead4;--ok-soft:#10302b;--ok-edge:#1d5249;\n--warn:#fcd34d;--warn-soft:#33290f;--warn-edge:#5c4a17;--bad:#fca5a5;--bad-soft:#3a1717;--bad-edge:#5e2525}\n*{box-sizing:border-box}\nbody{margin:0;background:var(--paper);color:var(--ink);font:14px/1.45 var(--sans);-webkit-font-smoothing:antialiased}\na{color:var(--accent);text-decoration:none}a:hover{text-decoration:underline}\n.ox-top{display:flex;align-items:center;gap:16px;padding:10px 18px;border-bottom:1px solid var(--edge);background:var(--card);position:sticky;top:0;z-index:5}\nbody>a[href=\"/admin\"]+.ox-app .ox-top{padding-right:130px}\n.ox-logo{display:flex;align-items:center;gap:9px;font-weight:600;color:var(--ink);width:200px}\n.ox-logo .mark{width:24px;height:24px;border-radius:7px;background:var(--ink);display:flex;align-items:center;justify-content:center}\n.ox-logo .mark i{width:8px;height:8px;border-radius:50%;background:#14b8a6}\n.ox-search{flex:0 1 440px;display:flex;align-items:center;gap:8px;border:1px solid var(--edge);border-radius:999px;padding:6px 12px;background:var(--paper)}\n.ox-search svg{width:15px;height:15px;color:var(--subtle)}\n.ox-search input{flex:1;border:0;background:transparent;color:var(--ink);font:13px var(--sans);outline:none}\n.ox-search kbd{font:11px var(--mono);color:var(--subtle)}\n.ox-spacer{flex:1}\n.ox-btn{font:12.5px var(--sans);border:1px solid var(--edge);background:var(--card);color:var(--ink);border-radius:999px;padding:5px 12px;cursor:pointer;display:inline-flex;gap:6px;align-items:center}\n.ox-layout{display:grid;grid-template-columns:230px minmax(0,1fr)}\n.ox-layout.rail{grid-template-columns:230px minmax(0,1fr) 290px}\n.ox-side{border-right:1px solid var(--edge);padding:14px 12px;min-height:calc(100vh - 50px)}\n.ox-nav{display:flex;align-items:center;gap:10px;padding:7px 10px;border-radius:10px;color:var(--ink)}\n.ox-nav:hover{background:var(--soft);text-decoration:none}\n.ox-nav svg{width:16px;height:16px;color:var(--muted);flex:none}\n.ox-nav span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.ox-nav.on{background:var(--accent-soft);color:var(--accent);font-weight:500}.ox-nav.on svg{color:var(--accent)}\n.ox-side-h{font:10.5px var(--mono);letter-spacing:.08em;text-transform:uppercase;color:var(--subtle);padding:16px 10px 6px}\n.ox-side-foot{margin-top:18px;border-top:1px solid var(--edge);padding:12px 10px 0;font:10.5px/1.6 var(--mono);color:var(--subtle)}\n.ox-main{padding:20px 28px 48px;min-width:0}\n.ox-rail{border-left:1px solid var(--edge);padding:20px 18px}\n.ox-bar{display:flex;align-items:center;justify-content:space-between;gap:12px}\n.ox-crumbs{font:11.5px var(--mono);color:var(--subtle);display:flex;gap:8px;flex-wrap:wrap}\n.ox-crumbs b{color:var(--ink);font-weight:500}\n.ox-zoom{display:inline-flex;border:1px solid var(--edge);border-radius:999px;padding:3px;background:var(--card);gap:2px}\n.ox-zoom span{font:10.5px var(--mono);letter-spacing:.05em;text-transform:uppercase;padding:4px 9px;border-radius:999px;color:var(--subtle)}\n.ox-zoom span.on{background:var(--ink);color:var(--paper)}\n.ox-head{display:flex;gap:16px;align-items:flex-start;margin:16px 0 18px}\n.ox-avatar{width:54px;height:54px;border-radius:14px;background:var(--accent-soft);border:1px solid var(--accent-edge);display:flex;align-items:center;justify-content:center;color:var(--accent);flex:none}\n.ox-avatar svg{width:26px;height:26px}\n.ox-head h1{font-size:30px;margin:2px 0 8px;letter-spacing:-.02em;font-weight:600;line-height:1.15}\n.ox-head p{margin:0;color:var(--muted)}\n.ox-chips{display:flex;gap:6px;flex-wrap:wrap;align-items:center}\n.ox-chip{font-size:12px;border:1px solid var(--edge);background:var(--card);border-radius:999px;padding:2px 10px;color:var(--muted);display:inline-flex;gap:6px;align-items:center;white-space:nowrap}\n.ox-chip svg{width:12px;height:12px}\n.ox-chip.type{background:var(--accent-soft);border-color:var(--accent-edge);color:var(--accent)}\n.ox-chip.mono{font:11px var(--mono)}\n.ox-st{font:10px var(--mono);letter-spacing:.07em;text-transform:uppercase;border-radius:999px;padding:3px 8px;border:1px solid;white-space:nowrap}\n.ox-st.ok,.ox-st.confirmed{color:var(--ok);background:var(--ok-soft);border-color:var(--ok-edge)}\n.ox-st.proposed{color:var(--accent);background:var(--accent-soft);border-color:var(--accent-edge)}\n.ox-st.warn,.ox-st.due{color:var(--warn);background:var(--warn-soft);border-color:var(--warn-edge)}\n.ox-st.bad,.ox-st.late{color:var(--bad);background:var(--bad-soft);border-color:var(--bad-edge)}\n.ox-st.major{color:var(--paper);background:var(--ink);border-color:var(--ink)}\n.ox-st.normal{color:var(--muted);background:var(--soft);border-color:var(--edge)}\n.ox-st.minor{color:var(--subtle);background:var(--card);border-color:var(--edge)}\n.ox-card{background:var(--card);border:1px solid var(--edge);border-radius:16px;padding:16px 18px;min-width:0}\n.ox-card-h{display:flex;align-items:baseline;gap:10px;margin-bottom:10px}\n.ox-card-h h2,.ox-card-h h3{font-size:15px;margin:0;font-weight:600;white-space:nowrap}\n.ox-card-h .note{font:11px var(--mono);color:var(--subtle);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}\n.ox-card-h .zin{margin-left:auto;font:11px var(--mono);white-space:nowrap}\n.ox-grid2{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:16px;margin-top:16px}\n.ox-grid2>.wide{grid-column:1/-1}\n.ox-grid3{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:14px;margin-top:16px}\n.ox-row{display:flex;align-items:center;gap:10px;padding:8px 0;border-top:1px solid var(--edge);font-size:13.5px;min-width:0}\n.ox-row:first-of-type{border-top:0}\n.ox-row .t{min-width:35%;overflow:hidden;flex:1 1 auto}\n.ox-row .t a,.ox-row .t span.l{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.ox-row .r{margin-left:auto;display:flex;gap:6px;align-items:center;flex:0 1 auto;min-width:0;flex-wrap:wrap;justify-content:flex-end}\n.ox-row .r .ox-chip{max-width:240px;overflow:hidden;text-overflow:ellipsis}\n.ox-ic{width:28px;height:28px;border-radius:8px;background:var(--soft);border:1px solid var(--edge);display:flex;align-items:center;justify-content:center;flex:none;color:var(--muted)}\n.ox-ic svg{width:14px;height:14px}\n.ox-card-h .note svg,.ox-row .l svg{width:12px;height:12px;vertical-align:-2px}\n.ox-sub{font:11px var(--mono);color:var(--subtle);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.ox-summary{font-size:15px;line-height:1.55;margin:0 0 10px}\n.ox-meta{display:flex;gap:16px;flex-wrap:wrap;font:11px var(--mono);color:var(--subtle)}\n.ox-lbl{font:10.5px var(--mono);letter-spacing:.08em;text-transform:uppercase;color:var(--subtle);display:block;margin:4px 0 10px}\n.ox-annot{border:1px dashed var(--subtle);border-radius:14px;padding:12px 14px;font-size:12.5px;color:var(--muted);line-height:1.5}\n.ox-annot ol{margin:6px 0;padding-left:18px}\n.ox-annot .ox-sub{white-space:normal;overflow-wrap:anywhere}\n.ox-rail .ox-row{font-size:13px}\n.ox-tabs{display:flex;gap:4px;border-bottom:1px solid var(--edge);margin:4px 0 0;flex-wrap:wrap}\n.ox-tabs a{padding:8px 12px;color:var(--muted);border-bottom:2px solid transparent;font-size:13.5px}\n.ox-tabs a.on{color:var(--ink);border-color:var(--ink);font-weight:500}\n.ox-tabs a small{font:11px var(--mono);color:var(--subtle);margin-left:4px}\n.ox-ev{display:grid;grid-template-columns:86px 70px minmax(0,1fr);gap:10px;align-items:center;padding:8px 0;border-top:1px solid var(--edge);font-size:13.5px}\n.ox-ev:first-of-type{border-top:0}\n.ox-ev .d{font:11px var(--mono);color:var(--subtle)}\n.ox-ev a{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block}\n.ox-fold{border:1px solid var(--edge);background:var(--soft);border-radius:12px;padding:8px 12px;margin-top:8px;font-size:13px;color:var(--muted)}\n.ox-fold summary{cursor:pointer}\n.ox-tl-axis,.ox-tl-row{display:grid;grid-template-columns:170px minmax(0,1fr);gap:8px}\n.ox-tl-axis{font:10.5px var(--mono);color:var(--subtle);margin-bottom:4px}\n.ox-tl-axis .yrs{display:flex;justify-content:space-between}\n.ox-tl-row{align-items:center;padding:6px 0;border-top:1px solid var(--edge)}\n.ox-tl-row .who{font-size:12.5px;line-height:1.3;min-width:0;overflow:hidden}\n.ox-tl-row .who small{display:block;font:10.5px var(--mono);color:var(--subtle)}\n.ox-track{position:relative;height:20px;background:var(--soft);border-radius:999px}\n.ox-track i{position:absolute;top:2px;height:16px;border-radius:999px;background:var(--accent);color:#fff;font:10px/16px var(--mono);padding:0 7px;white-space:nowrap;overflow:hidden;font-style:normal}\n.ox-track i.past{background:var(--subtle)}\n.ox-kv{display:grid;grid-template-columns:150px minmax(0,1fr);gap:10px;padding:8px 0;border-top:1px solid var(--edge);font-size:13.5px}\n.ox-kv:first-of-type{border-top:0}\n.ox-kv .k{color:var(--muted)}\n.ox-mask{letter-spacing:.15em;color:var(--muted)}\n.ox-prose{line-height:1.6;font-size:14.5px}\n.ox-prose h1,.ox-prose h2,.ox-prose h3{font-size:16px;margin:18px 0 6px}\n.ox-prose pre{background:var(--soft);padding:10px;border-radius:8px;overflow:auto}\n.ox-prose table{border-collapse:collapse}.ox-prose td,.ox-prose th{border:1px solid var(--edge);padding:4px 8px}\n.ox-pager{display:flex;gap:10px;margin-top:12px;font:12px var(--mono)}\n.ox-empty{color:var(--subtle);font-size:13px;padding:6px 0}\n.ox-err{border:1px solid var(--bad-edge);background:var(--bad-soft);color:var(--bad);border-radius:12px;padding:10px 14px;margin:12px 0;font-size:13px}\n@media (max-width:1100px){.ox-layout.rail{grid-template-columns:230px minmax(0,1fr)}.ox-rail{grid-column:2;border-left:0;border-top:1px solid var(--edge)}}\n@media (max-width:760px){.ox-layout,.ox-layout.rail{grid-template-columns:1fr}.ox-side{min-height:0;border-right:0;border-bottom:1px solid var(--edge)}.ox-rail{grid-column:1}.ox-grid2{grid-template-columns:1fr}.ox-logo{width:auto}.ox-tl-axis,.ox-tl-row{grid-template-columns:110px minmax(0,1fr)}}\n`\n","// --- Rendering one lens panel (#811) ---\n\nimport type { Entity, WikiGraph } from \"./graph\"\nimport type { PanelData, PanelItem } from \"./lens\"\nimport { entityHref, esc, icon, typeIcon, typeLabel } from \"./view-layout\"\n\nconst today = (): string => new Date().toISOString().slice(0, 10)\n\nfunction statusChip(s?: string): string {\n return s ? `<span class=\"ox-st ${esc(s)}\">${esc(s)}</span>` : \"\"\n}\n\nfunction itemTitle(it: PanelItem): string {\n if (it.private) return `<span class=\"l\"><span class=\"ox-mask\">••••</span> ${icon(\"lock\")}</span>`\n return it.entityId ? `<a href=\"${entityHref(it.entityId)}\">${esc(it.label)}</a>` : `<span class=\"l\">${esc(it.label)}</span>`\n}\n\nfunction itemSub(g: WikiGraph, it: PanelItem): string {\n if (it.sub) return it.sub\n const parts: string[] = []\n if (it.type) parts.push(typeLabel(g.ontology, it.type).toLowerCase())\n if (it.since || it.until) parts.push(`${it.since ?? \"…\"} → ${it.until ?? \"now\"}`)\n else if (it.date) parts.push(it.date)\n return parts.join(\" · \")\n}\n\nfunction rowHtml(g: WikiGraph, e: Entity, it: PanelItem): string {\n const sub = itemSub(g, it)\n const chips = it.chips.map(c => `<span class=\"ox-chip\">${esc(c)}</span>`).join(\"\")\n const z4 = it.statement !== undefined && it.statement >= 0\n ? `<a class=\"ox-sub\" href=\"${entityHref(e.id)}/s/${it.statement}\" title=\"Where this comes from (Z4)\">Z4</a>` : \"\"\n return `<div class=\"ox-row\"><span class=\"ox-ic\">${it.type ? typeIcon(g.ontology, it.type) : icon(it.private ? \"lock\" : \"topic\")}</span>`\n + `<div class=\"t\">${itemTitle(it)}${sub ? `<div class=\"ox-sub\">${esc(sub)}</div>` : \"\"}</div>`\n + `<div class=\"r\">${chips}${statusChip(it.status)}${z4}</div></div>`\n}\n\nfunction eventRow(it: PanelItem): string {\n const level = it.importance ?? \"normal\"\n return `<div class=\"ox-ev\"><span class=\"d\">${esc(it.date ?? \"\")}</span><span class=\"ox-st ${level}\">${level}</span>`\n + `<span>${it.entityId ? `<a href=\"${entityHref(it.entityId)}\">${esc(it.label)}</a>` : esc(it.label)}</span></div>`\n}\n\nfunction timeline(items: PanelItem[]): string {\n const years = items.flatMap(i => [i.since, i.until]).filter((d): d is string => !!d).map(d => Number(d.slice(0, 4))).filter(Boolean)\n const now = Number(today().slice(0, 4))\n const min = Math.min(...years, now - 1)\n const span = Math.max(1, now + 1 - min)\n const pos = (d: string | undefined, end: boolean): number => {\n if (!d) return end ? 100 : 0\n const [y, m] = [Number(d.slice(0, 4)), Number(d.slice(5, 7)) || (end ? 12 : 1)]\n return Math.min(100, Math.max(0, ((y - min) + (m - 1) / 12) / span * 100))\n }\n let html = `<div class=\"ox-tl-axis\"><span></span><span class=\"yrs\"><span>${min}</span><span>${now}</span></span></div>`\n for (const it of items) {\n const left = pos(it.since, false)\n const right = pos(it.until, true)\n const label = `${it.since ?? \"…\"} → ${it.until ?? \"now\"}`\n html += `<div class=\"ox-tl-row\"><div class=\"who\">${it.chips.map(esc).join(\", \")}<small>${it.entityId ? `<a href=\"${entityHref(it.entityId)}\">${esc(it.label)}</a>` : esc(it.label)}</small></div>`\n + `<div class=\"ox-track\"><i class=\"${it.until ? \"past\" : \"\"}\" style=\"left:${left.toFixed(1)}%;width:${Math.max(4, right - left).toFixed(1)}%\" title=\"${esc(label)}\">${esc(label)}</i></div></div>`\n }\n return html\n}\n\n/** A panel card. `full` is the Z3 view: no zoom link, minor events unfolded. */\nexport function panelCard(g: WikiGraph, e: Entity, p: PanelData, full: boolean, notesHtml = \"\"): string {\n const zin = !full && (p.total > p.items.length || p.def.source === \"notes\" || p.folded.length)\n ? `<a class=\"zin\" href=\"${entityHref(e.id)}/${encodeURIComponent(p.def.panel)}\">all ${p.total || \"\"} (Z3) →</a>` : \"\"\n const isNotes = p.def.source === \"notes\" || p.def.panel === \"notes\"\n const count = isNotes ? `${e.pages.length} page${e.pages.length === 1 ? \"\" : \"s\"}` : `${p.total} ${p.total === 1 ? \"item\" : \"items\"}`\n const note = `<span class=\"note\">${p.ownerOnly ? `${icon(\"lock\")} private to the owner · ` : \"\"}${count}</span>`\n let body = \"\"\n if (p.def.source === \"notes\" || p.def.panel === \"notes\") {\n body = notesHtml || `<div class=\"ox-empty\">No notes.</div>`\n } else if (p.items.length === 0) {\n body = `<div class=\"ox-empty\">Nothing recorded yet.</div>`\n } else if (p.def.display === \"timeline\" && p.items.some(i => i.since)) {\n body = timeline(p.items)\n } else if (p.def.source === \"history\" || p.items.every(i => i.type === \"event\")) {\n body = p.items.map(eventRow).join(\"\")\n } else {\n body = p.items.map(it => rowHtml(g, e, it)).join(\"\")\n }\n for (const r of p.rollups) body += `<div class=\"ox-fold\">↻ Recurring: ${esc(r)}</div>`\n if (p.folded.length) {\n body += `<details class=\"ox-fold\"><summary>+ ${p.folded.length} minor event${p.folded.length === 1 ? \"\" : \"s\"}</summary>${p.folded.slice(0, 20).map(eventRow).join(\"\")}</details>`\n }\n const wide = p.def.display === \"timeline\" || p.def.source === \"notes\" || p.def.panel === \"notes\" ? \" wide\" : \"\"\n return `<section class=\"ox-card${wide}\"><div class=\"ox-card-h\"><h2>${esc(p.title)}</h2>${note}${zin}</div>${body}</section>`\n}\n","// --- Entity pages: overview (Z2), one panel (Z3), one statement (Z4) ---\n\nimport { markdownToHtml } from \"@/utils/markdown-html\"\nimport type { WikiEntry } from \"../types\"\nimport { normName, type Entity, type WikiGraph } from \"./graph\"\nimport { lensFor, panelData } from \"./lens\"\nimport { panelSource } from \"./load\"\nimport type { LensPanel } from \"./types\"\nimport { panelCard } from \"./view-panels\"\nimport { crumbs, entityHref, esc, icon, layout, sidebar, typeIcon, typeLabel, zoomBar } from \"./view-layout\"\n\nexport interface EntityViewCtx {\n g: WikiGraph\n readEntries: (ids: string[]) => WikiEntry[]\n /** Saved earlier versions of one agent's page, newest first. */\n versions: (agentId: string, path: string) => Array<{ timestamp: string }>\n}\n\n/** Article markdown with [[links]] pointing at entity pages. */\nexport function wikiMd(g: WikiGraph, text: string): string {\n return markdownToHtml(text.replace(/<!--\\s*tags?:[^>]*-->\\s*\\n?/gi, \"\").replace(/<!-- \\/overview -->\\s*\\n?/g, \"\"), {\n wikilink: (target, display) => {\n const id = g.names.get(normName(target))\n return id\n ? `<a href=\"${entityHref(id)}\" class=\"wikilink\">${display}</a>`\n : `<a href=\"/find?q=${encodeURIComponent(target)}\" class=\"wikilink broken\" title=\"No page yet\">${display}</a>`\n },\n })\n}\n\n/** Page body without a second frontmatter block some older pages carry. */\nexport function bodyOf(content: string): string {\n return content.replace(/^---\\n[\\s\\S]*?\\n---\\n?/, \"\").trim()\n}\n\nconst OVERVIEW_HEADING = /^##[ \\t]+Overview[ \\t]*$/im\n/** Closes an Overview section on pages whose other text has no headings. */\nexport const OVERVIEW_END = \"<!-- /overview -->\"\n\n/** Where the Overview section starts and ends in a body, if it has one. */\nexport function overviewSpan(body: string): { start: number; textStart: number; end: number; after: number } | undefined {\n const m = OVERVIEW_HEADING.exec(body)\n if (!m) return undefined\n const textStart = m.index + m[0].length\n const rest = body.slice(textStart)\n const marker = rest.indexOf(OVERVIEW_END)\n const heading = rest.search(/^#{1,2}[ \\t]/m)\n const cut = [marker, heading].filter(i => i >= 0)\n const end = textStart + (cut.length ? Math.min(...cut) : rest.length)\n const after = marker >= 0 && textStart + marker === end ? end + OVERVIEW_END.length : end\n return { start: m.index, textStart, end, after }\n}\n\n/** The `## Overview` section of a page body, without its heading. */\nexport function overviewSection(content: string): string | undefined {\n const body = bodyOf(content)\n const span = overviewSpan(body)\n const text = span ? body.slice(span.textStart, span.end).trim() : \"\"\n return text || undefined\n}\n\n/** The newest `## Overview` any of the entity's pages has (#820). */\nexport function overviewOf(e: Entity): string | undefined {\n const pages = [...e.pages].sort((a, b) => (b.article.meta.lastUpdated || \"\").localeCompare(a.article.meta.lastUpdated || \"\"))\n for (const p of pages) {\n const text = overviewSection(p.article.content)\n if (text) return text\n }\n return undefined\n}\n\n/** Cut at the last sentence end that fits, else at a word. */\nexport function cutAtSentence(text: string, max: number): string {\n if (text.length <= max) return text\n const head = text.slice(0, max)\n const end = Math.max(...[\". \", \"! \", \"? \", \"؟ \", \"。\"].map(s => head.lastIndexOf(s)))\n if (end > max / 3) return head.slice(0, end + 1)\n return `${head.replace(/\\s+\\S*$/, \"\")}…`\n}\n\n/** First paragraph of the first page, as plain text. */\nexport function summaryOf(e: Entity, max = 360): string {\n const body = bodyOf(e.pages[0]?.article.content ?? \"\")\n const para = body.split(/\\n\\s*\\n/).map(p => p.trim()).find(p => p && !p.startsWith(\"#\") && !p.startsWith(\"|\") && !p.startsWith(\"```\")) ?? \"\"\n const plain = para\n .replace(/\\[\\[([^\\]|]+)(?:\\|([^\\]]+))?\\]\\]/g, (_m, t, d) => d ?? t)\n .replace(/\\[([^\\]]+)\\]\\([^)]*\\)/g, \"$1\")\n .replace(/^[-*]\\s+/gm, \"\")\n .replace(/[*_`]/g, \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n return cutAtSentence(plain, max)\n}\n\nfunction pillarOf(g: WikiGraph, e: Entity) {\n return g.ontology.pillars.find(p => p.id === e.pillar)\n}\n\nfunction entityCrumbs(g: WikiGraph, e: Entity, tail: Array<{ label: string; href?: string }> = []): string {\n const p = pillarOf(g, e)\n return crumbs([\n { label: p?.label ?? e.pillar, href: `/p/${encodeURIComponent(e.pillar)}` },\n { label: typeLabel(g.ontology, e.type), href: `/p/${encodeURIComponent(e.pillar)}?kind=${encodeURIComponent(e.type)}` },\n { label: e.title, href: tail.length ? entityHref(e.id) : undefined },\n ...tail,\n ])\n}\n\nfunction notesHtml(g: WikiGraph, e: Entity, full: boolean): string {\n if (!full) {\n const first = e.pages[0]\n if (!first) return \"\"\n // The overview card above already shows the Overview section.\n const body = bodyOf(first.article.content)\n const span = overviewSpan(body)\n const text = (span ? body.slice(0, span.start) + body.slice(span.after) : body).trim()\n const short = text.length > 1600 ? `${text.slice(0, 1600).replace(/\\n[^\\n]*$/, \"\")}\\n\\n…` : text\n return `<div class=\"ox-prose\">${wikiMd(g, short)}</div>`\n }\n return e.pages.map(p => `<div class=\"ox-sub\">from ${esc(p.agentId)} · ${esc(p.article.path)} · updated ${esc(p.article.meta.lastUpdated || \"—\")}</div>`\n + `<div class=\"ox-prose\">${wikiMd(g, bodyOf(p.article.content))}</div>`).join(`<hr style=\"border:0;border-top:1px solid var(--edge);margin:16px 0\">`)\n}\n\nfunction rail(g: WikiGraph, e: Entity, lens: LensPanel[]): string {\n const t = g.ontology.types.find(x => x.id === e.type)\n let html = `<span class=\"ox-lbl\">Lens for this type</span><div class=\"ox-annot\"><b>${esc(t?.label ?? e.type)}</b> opens with:<ol>`\n html += lens.map(p => `<li>${esc(p.title ?? p.panel)}</li>`).join(\"\")\n html += `</ol><span class=\"ox-sub\">from ontology.yaml · types.${esc(e.type)}.lens</span></div>`\n html += `<span class=\"ox-lbl\" style=\"margin-top:20px\">Zoom in</span>`\n for (const p of lens) {\n html += `<div class=\"ox-row\"><span class=\"ox-ic\">${icon(panelSource(p) === \"history\" ? \"calendar\" : panelSource(p) === \"discussed\" ? \"chat\" : \"arrow\")}</span><div class=\"t\"><a href=\"${entityHref(e.id)}/${encodeURIComponent(p.panel)}\">${esc(p.title ?? p.panel)}</a><div class=\"ox-sub\">Z3 · in full</div></div></div>`\n }\n html += `<span class=\"ox-lbl\" style=\"margin-top:20px\">Provenance</span>`\n const byAgent = new Map<string, number>()\n for (const p of e.pages) byAgent.set(p.agentId, (byAgent.get(p.agentId) ?? 0) + 1)\n for (const [agent, n] of byAgent) {\n const page = e.pages.find(p => p.agentId === agent)!\n html += `<div class=\"ox-row\"><span class=\"ox-ic\">${icon(\"agent\")}</span><div class=\"t\"><a href=\"/agent/${encodeURIComponent(agent)}/article/${encodeURIComponent(page.article.path)}\">${esc(agent)}</a><div class=\"ox-sub\">${n} page${n === 1 ? \"\" : \"s\"} · ${e.statements.filter(s => s.page.agentId === agent).length} statements</div></div></div>`\n }\n if (e.pages.length > 1) html += `<div class=\"ox-row\"><span class=\"ox-ic\">${icon(\"merge\")}</span><div class=\"t\"><span class=\"l\">${e.pages.length} pages merged</span><div class=\"ox-sub\">same name, one entity</div></div></div>`\n return html\n}\n\n/** Z2: one thing, through the lens of its type. */\nexport function entityPage(ctx: EntityViewCtx, e: Entity): string {\n const { g } = ctx\n const lens = lensFor(g, e.type)\n const t = g.ontology.types.find(x => x.id === e.type)\n const pinned = g.ontology.sidebar.pins.some(p => g.names.get(normName(p)) === e.id)\n let main = `<div class=\"ox-bar\">${entityCrumbs(g, e)}${zoomBar(2)}</div>`\n main += `<div class=\"ox-head\"><div class=\"ox-avatar\">${typeIcon(g.ontology, e.type)}</div><div><h1>${esc(e.title)}</h1><div class=\"ox-chips\">`\n main += `<span class=\"ox-chip type\">${typeIcon(g.ontology, e.type)}${esc(t?.label ?? e.type)}</span>`\n if (t?.schema) main += `<span class=\"ox-chip mono\">${esc(t.schema.includes(\" \") || t.schema.includes(\":\") ? t.schema : `schema.org/${t.schema}`)}</span>`\n if (e.type === \"event\") main += `<span class=\"ox-st ${e.importance}\">${e.importance}</span>`\n if (pinned) main += `<span class=\"ox-chip\">pinned</span>`\n if (e.pages.length > 1) main += `<span class=\"ox-chip\">${icon(\"merge\")}merged from ${e.pages.length} pages</span>`\n main += `</div></div></div>`\n\n if (e.review) main += `<div class=\"ox-card ox-sub\" style=\"border-color:var(--warn,#d97706)\">Check the type: ${esc(e.review)}</div>`\n const overview = overviewOf(e)\n const summary = overview ? \"\" : summaryOf(e)\n if ((overview || summary) && lens[0]?.panel !== \"notes\") {\n const lead = overview ? `<div class=\"ox-summary ox-prose\">${wikiMd(g, overview)}</div>` : `<p class=\"ox-summary\">${esc(summary)}</p>`\n main += `<section class=\"ox-card\">${lead}<div class=\"ox-meta\"><span>updated ${esc(e.updated || \"—\")}</span><span>sources: ${e.sources.length}</span><span>${e.statements.length} statements</span></div></section>`\n }\n main += `<div class=\"ox-grid2\">`\n for (const def of lens) {\n const data = panelData(g, e, def, { full: false, readEntries: ctx.readEntries })\n const isNotes = panelSource(def) === \"notes\"\n main += panelCard(g, e, data, false, isNotes ? notesHtml(g, e, false) : \"\")\n }\n main += `</div>`\n return layout(e.title, sidebar(g, { pillar: e.pillar, entity: e.id }), main, rail(g, e, lens))\n}\n\n/** Z3: one panel in full, paginated. */\nexport function panelPage(ctx: EntityViewCtx, e: Entity, panelId: string, page: number): string | null {\n const { g } = ctx\n const def = lensFor(g, e.type).find(p => p.panel === panelId)\n if (!def) return null\n const data = panelData(g, e, def, { full: true, page, pageSize: 50, readEntries: ctx.readEntries })\n const title = def.title ?? def.panel\n let main = `<div class=\"ox-bar\">${entityCrumbs(g, e, [{ label: title }])}${zoomBar(3)}</div>`\n main += `<div class=\"ox-head\"><div class=\"ox-avatar\">${typeIcon(g.ontology, e.type)}</div><div><h1>${esc(title)}</h1><p>${esc(e.title)} · ${data.total} item${data.total === 1 ? \"\" : \"s\"}</p></div></div>`\n const isNotes = panelSource(def) === \"notes\"\n main += panelCard(g, e, data, true, isNotes ? notesHtml(g, e, true) : \"\")\n const pages = Math.ceil(data.total / 50)\n if (pages > 1) {\n const base = `${entityHref(e.id)}/${encodeURIComponent(panelId)}`\n main += `<div class=\"ox-pager\">${page > 1 ? `<a href=\"${base}?page=${page - 1}\">← newer</a>` : \"\"}<span>page ${page} of ${pages}</span>${page < pages ? `<a href=\"${base}?page=${page + 1}\">older →</a>` : \"\"}</div>`\n }\n return layout(`${title} · ${e.title}`, sidebar(g, { pillar: e.pillar, entity: e.id }), main)\n}\n\n/** Z4: one statement with where it comes from. */\nexport function statementPage(ctx: EntityViewCtx, e: Entity, index: number): string | null {\n const { g } = ctx\n const st = e.statements[index]\n if (!st) return null\n const prop = g.ontology.properties.find(p => p.id === st.property)\n const target = st.target ? g.entities.get(st.target) : undefined\n const meta = st.page.article.meta\n const rows: Array<[string, string]> = [\n [\"Subject\", `<a href=\"${entityHref(e.id)}\">${esc(e.title)}</a>`],\n [\"Property\", `${esc(prop?.label ?? st.property)}${prop?.wikidata ? ` <span class=\"ox-sub\">wikidata ${esc(prop.wikidata)}</span>` : \"\"}`],\n [\"Value\", target ? `<a href=\"${entityHref(target.id)}\">${esc(target.title)}</a>` : esc(st.value)],\n ]\n if (st.role) rows.push([\"Role\", esc(st.role)])\n if (st.metric) rows.push([\"Metric\", esc(st.metric)])\n if (st.since || st.until) rows.push([\"True\", `${esc(st.since ?? \"…\")} → ${esc(st.until ?? \"now\")}`])\n if (st.at) rows.push([\"Measured\", esc(st.at)])\n rows.push([\"Recorded\", esc(meta.lastUpdated || meta.created || \"—\")])\n rows.push([\"Source\", esc(st.source ?? (meta.sources.length ? `${meta.sources.length} conversation entries` : \"not given\"))])\n rows.push([\"Written by\", `${esc(st.page.agentId)} · <a href=\"/agent/${encodeURIComponent(st.page.agentId)}/article/${encodeURIComponent(st.page.article.path)}\">${esc(st.page.article.path)}</a>`])\n rows.push([\"Status\", st.status ? `<span class=\"ox-st ${esc(st.status)}\">${esc(st.status)}</span>` : \"not set\"])\n if (st.confirmed_by) rows.push([\"Confirmed by\", esc(st.confirmed_by)])\n if (st.checked_at) rows.push([\"Checked\", esc(st.checked_at)])\n rows.push([\"Access\", esc(st.access ?? meta.access)])\n if (st.note) rows.push([\"Note\", esc(st.note)])\n const versions = ctx.versions(st.page.agentId, st.page.article.path)\n rows.push([\"Past versions\", versions.length ? versions.slice(0, 8).map(v => esc(v.timestamp)).join(\"<br>\") : \"none saved\"])\n\n let main = `<div class=\"ox-bar\">${entityCrumbs(g, e, [{ label: prop?.label ?? st.property }])}${zoomBar(4)}</div>`\n main += `<div class=\"ox-head\"><div class=\"ox-avatar\">${icon(\"key\")}</div><div><h1>${esc(prop?.label ?? st.property)}</h1><p>${esc(e.title)} → ${esc(target?.title ?? st.value)}</p></div></div>`\n main += `<section class=\"ox-card\">${rows.map(([k, v]) => `<div class=\"ox-kv\"><span class=\"k\">${k}</span><span>${v}</span></div>`).join(\"\")}</section>`\n return layout(`${prop?.label ?? st.property} · ${e.title}`, sidebar(g, { pillar: e.pillar, entity: e.id }), main)\n}\n"],"mappings":"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","names":["lensFor","g","type","t","propLabel","id","inverse","p","x","byRecent","a","b","da","db","statementItem","e","st","from","other","chips","statementsPanel","def","panelFrom","types","items","seen","keep","edge","typed","i","plain","linkedEntities","ids","out","entityItem","historyPanel","events","shownLevels","shown","folded","rollups","rule","newest","recent","readingsPanel","latestOnly","readings","metric","discussedPanel","readEntries","en","line","l","panelData","opts","source","panelSource","h","total","size","page","esc","s","PATHS","icon","name","typeIcon","type","t","typeLabel","entityHref","id","crumbs","list","c","i","all","zoomBar","at","names","z","sidebar","g","active","o","html","pins","title","normName","e","p","layout","side","main","rail","q","CSS","today","statusChip","s","esc","itemTitle","it","icon","entityHref","itemSub","g","parts","typeLabel","rowHtml","e","sub","chips","c","z4","typeIcon","eventRow","level","timeline","items","years","i","d","now","min","span","pos","end","y","m","html","left","right","label","panelCard","p","full","notesHtml","zin","count","note","body","r","wikiMd","g","text","markdownToHtml","target","display","id","normName","entityHref","bodyOf","content","OVERVIEW_HEADING","OVERVIEW_END","overviewSpan","body","m","textStart","rest","marker","heading","cut","i","end","after","overviewSection","span","overviewOf","e","pages","a","b","p","cutAtSentence","max","head","s","summaryOf","plain","_m","t","d","pillarOf","entityCrumbs","tail","crumbs","typeLabel","notesHtml","full","first","short","esc","rail","lens","x","html","icon","panelSource","byAgent","agent","n","page","entityPage","ctx","lensFor","pinned","main","zoomBar","typeIcon","overview","summary","lead","def","data","panelData","isNotes","panelCard","layout","sidebar","panelPage","panelId","title","base","statementPage","index","st","prop","meta","rows","versions","v","k"]}
@@ -1,4 +1,4 @@
1
- import{b as S,c as O}from"./chunk-J4I5ZJ2V.js";import{g as B,i as J}from"./chunk-JE5EJGGD.js";import{a as I,b as P}from"./chunk-FCPTN6NF.js";import{a as X,b as ue}from"./chunk-7I7IEX4S.js";import{d as F}from"./chunk-QIJLFPWE.js";import{execFile as Ae}from"child_process";import{writeFileSync as ie,mkdirSync as x,existsSync as b,readFileSync as ke}from"fs";import{resolve as v}from"path";var le=["off","shadow","authoritative"],ge={telegram:"INTENT_LEDGER_MODE_TELEGRAM",slack:"INTENT_LEDGER_MODE_SLACK",whatsapp:"INTENT_LEDGER_MODE_WHATSAPP",discord:"INTENT_LEDGER_MODE_DISCORD",gitlab:"INTENT_LEDGER_MODE_GITLAB",github:"INTENT_LEDGER_MODE_GITHUB",workflow:"INTENT_LEDGER_MODE_WORKFLOW",cron:"INTENT_LEDGER_MODE_CRON",mesh:"INTENT_LEDGER_MODE_MESH"},me="INTENT_LEDGER_MODE";function G(i,e=process.env){let t=U(e[ge[i]]);if(t)return t;let n=U(e[me]);return n||"off"}function U(i){if(typeof i!="string")return null;let e=i.trim().toLowerCase();return le.includes(e)?e:null}P();import he from"better-sqlite3";import{existsSync as Ue,mkdirSync as fe}from"fs";import{dirname as pe,resolve as Ee}from"path";var T=class{db;path;constructor(e={}){this.path=Ee(process.cwd(),e.path??".agentx/intent/ledger.sqlite"),fe(pe(this.path),{recursive:!0}),this.db=new he(this.path),this.db.pragma("journal_mode = WAL"),this.db.pragma("synchronous = NORMAL"),this.db.pragma("foreign_keys = ON"),ye(this.db)}close(){this.db.close()}schemaVersion(){return this.db.prepare("SELECT MAX(v) AS v FROM schema_version").get().v??0}recordEvent(e){if(e.sourceEventId!==null){let n=this.findEventBySourceId(e.source,e.sourceEventId);if(n)return n}let t={id:e.id??I(e.ts),ts:e.ts,source:e.source,sourceEventId:e.sourceEventId,project:e.project,subject:e.subject,intent:e.intent,rawJson:e.rawJson};return this.db.prepare(`INSERT INTO intent_events (id, ts, source, source_event_id, project, subject, intent, raw_json)
1
+ import{b as S,c as O}from"./chunk-KDQI5S7F.js";import{h as B,j as J}from"./chunk-3UOTLMXD.js";import{a as I,b as P}from"./chunk-FCPTN6NF.js";import{a as X,b as ue}from"./chunk-7I7IEX4S.js";import{d as F}from"./chunk-QIJLFPWE.js";import{execFile as Ae}from"child_process";import{writeFileSync as ie,mkdirSync as x,existsSync as b,readFileSync as ke}from"fs";import{resolve as v}from"path";var le=["off","shadow","authoritative"],ge={telegram:"INTENT_LEDGER_MODE_TELEGRAM",slack:"INTENT_LEDGER_MODE_SLACK",whatsapp:"INTENT_LEDGER_MODE_WHATSAPP",discord:"INTENT_LEDGER_MODE_DISCORD",gitlab:"INTENT_LEDGER_MODE_GITLAB",github:"INTENT_LEDGER_MODE_GITHUB",workflow:"INTENT_LEDGER_MODE_WORKFLOW",cron:"INTENT_LEDGER_MODE_CRON",mesh:"INTENT_LEDGER_MODE_MESH"},me="INTENT_LEDGER_MODE";function G(i,e=process.env){let t=U(e[ge[i]]);if(t)return t;let n=U(e[me]);return n||"off"}function U(i){if(typeof i!="string")return null;let e=i.trim().toLowerCase();return le.includes(e)?e:null}P();import he from"better-sqlite3";import{existsSync as Ue,mkdirSync as fe}from"fs";import{dirname as pe,resolve as Ee}from"path";var T=class{db;path;constructor(e={}){this.path=Ee(process.cwd(),e.path??".agentx/intent/ledger.sqlite"),fe(pe(this.path),{recursive:!0}),this.db=new he(this.path),this.db.pragma("journal_mode = WAL"),this.db.pragma("synchronous = NORMAL"),this.db.pragma("foreign_keys = ON"),ye(this.db)}close(){this.db.close()}schemaVersion(){return this.db.prepare("SELECT MAX(v) AS v FROM schema_version").get().v??0}recordEvent(e){if(e.sourceEventId!==null){let n=this.findEventBySourceId(e.source,e.sourceEventId);if(n)return n}let t={id:e.id??I(e.ts),ts:e.ts,source:e.source,sourceEventId:e.sourceEventId,project:e.project,subject:e.subject,intent:e.intent,rawJson:e.rawJson};return this.db.prepare(`INSERT INTO intent_events (id, ts, source, source_event_id, project, subject, intent, raw_json)
2
2
  VALUES (?, ?, ?, ?, ?, ?, ?, ?)`).run(t.id,t.ts,t.source,t.sourceEventId,t.project,t.subject,t.intent,t.rawJson),t}findEventBySourceId(e,t){let n=this.db.prepare(`SELECT id, ts, source, source_event_id, project, subject, intent, raw_json
3
3
  FROM intent_events WHERE source = ? AND source_event_id = ?`).get(e,t);return n?Y(n):null}getEventById(e){let t=this.db.prepare(`SELECT id, ts, source, source_event_id, project, subject, intent, raw_json
4
4
  FROM intent_events WHERE id = ?`).get(e);return t?Y(t):null}recordDecision(e){this.db.prepare(`INSERT INTO intent_decisions (event_id, decided_at, decided_by, agent_id, outcome, reason)
@@ -125,4 +125,4 @@ ${se(o.block,r.prompt)}`,r.maxOutputTokens),agentId:r.agent,autonomy:r.autonomy,
125
125
  `);return t.length<=e?t.join(`
126
126
  `):t.slice(-e).join(`
127
127
  `)}function Xe(i,e,t){return new Promise((n,r)=>{Ae("/bin/sh",["-c",i],{timeout:e,maxBuffer:8*1024*1024,...t?{env:t}:{}},(s,a,o)=>{if(s&&s.killed){r(new Error(`command timed out after ${Math.round(e/1e3)}s`));return}n({stdout:String(a??""),stderr:String(o??""),code:s?typeof s.code=="number"?s.code:1:0})})})}export{T as a,V as b,ot as c,we as d,at as e,ct as f,$ as g,ee as h,G as i,We as j,z as k,Q as l,lt as m,Ce as n,oe as o,ae as p,ce as q,C as r,M as s};
128
- //# sourceMappingURL=chunk-YHCPBMRH.js.map
128
+ //# sourceMappingURL=chunk-MDGYSHO5.js.map
@@ -0,0 +1,2 @@
1
+ import{existsSync as P,unlinkSync as W}from"fs";import{isAbsolute as b,relative as x,resolve as g}from"path";async function I(i,t,n){let s=await fetch(`${i.url.replace(/\/$/,"")}${t}`,{headers:i.token?{Authorization:`Bearer ${i.token}`}:{},signal:AbortSignal.timeout(n)});if(!s.ok)throw new Error(`HTTP ${s.status} for ${t}`);return s.json()}var R=/^[A-Za-z0-9][A-Za-z0-9_.-]*$/;function S(i,t){if(typeof t!="string"||!t.endsWith(".md")||b(t)||t.includes("\\")||t.startsWith("_")||t.startsWith("raw/")||t.split("/").some(s=>s===".."||s==="."||s===""))return!1;let n=x(i,g(i,t));return!!n&&!n.startsWith("..")&&!b(n)}async function v(i){let{hub:t,peer:n,localAgents:s,dryRun:u=!1}=i,p=i.fetchJson??I,f=await p(n,"/wiki/agents",12e4),h=String(f?.nodeId||"unknown"),m=[];for(let y of f?.agents??[]){let o=String(y?.agentId??"");if(!(y?.totalArticles>0))continue;let r={agentId:o,copied:0,unchanged:0,removed:0,rejected:0};if(m.push(r),!R.test(o)){r.skipped="bad-id";continue}if(s.has(o)){r.skipped="local";continue}try{let l=await p(n,`/wiki/articles?agent=${encodeURIComponent(o)}`,3e4);if(!Array.isArray(l?.articles))throw new Error("article list missing from the peer's answer");let d=l.articles,k=g(t.getBaseDir(),"agents",o,t.getMode());if(u&&!P(k)){r.copied=d.filter(e=>S(k,e.path)).length,r.rejected=d.length-r.copied;continue}let c=t.getAgentWiki(o);for(let e of d){if(!S(c.baseDir,e.path)){r.rejected++;continue}let a=c.readArticle(e.path);if(a&&e.lastUpdated&&a.meta.lastUpdated===e.lastUpdated){r.unchanged++;continue}if(u){r.copied++;continue}let w=await p(n,`/wiki/article?agent=${encodeURIComponent(o)}&path=${encodeURIComponent(e.path)}`,15e3),A=e.owner||o;c.writeArticle(e.path,{title:e.title,type:e.type,related:e.related,tags:e.tags??[],owner:A,access:e.access??"private",sharedWith:e.sharedWith,created:String(w?.created??""),lastUpdated:e.lastUpdated??"",sources:e.sources??[],graphPath:e.graphPath},String(w?.content??""),a?.meta.owner??A)?r.copied++:r.rejected++}if(!u){let e=new Set(d.map(a=>a.path));for(let a of c.rebuildIndex().articles)e.has(a.path)||(W(g(c.baseDir,a.path)),r.removed++);c.rebuildIndex(),t.markSynced(o,{node:h,peerUrl:n.url,at:new Date().toISOString()})}}catch(l){r.error=l.message}}return{node:h,agents:m}}export{I as a,S as b,v as c};
2
+ //# sourceMappingURL=chunk-MRIVENBY.js.map