panopticon-cli 0.6.5 → 0.6.6

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 (311) hide show
  1. package/README.md +2 -2
  2. package/dist/{agents-DfYify9s.js → agents-CfFDs52G.js} +14 -14
  3. package/dist/{agents-DfYify9s.js.map → agents-CfFDs52G.js.map} +1 -1
  4. package/dist/{agents-BKsVoIc9.js → agents-D_2oRFVf.js} +1 -1
  5. package/dist/{archive-planning-BJrZ3tmN.js → archive-planning-D97ziGec.js} +3 -3
  6. package/dist/{archive-planning-BJrZ3tmN.js.map → archive-planning-D97ziGec.js.map} +1 -1
  7. package/dist/{archive-planning-C3m3hfa5.js → archive-planning-DK90wn9Q.js} +1 -1
  8. package/dist/{browser-Cvdznzc0.js → browser-CX7jXfXX.js} +1 -1
  9. package/dist/{browser-Cvdznzc0.js.map → browser-CX7jXfXX.js.map} +1 -1
  10. package/dist/{clean-planning-DvhZAUv4.js → clean-planning-D_lz4aQq.js} +2 -2
  11. package/dist/{clean-planning-DvhZAUv4.js.map → clean-planning-D_lz4aQq.js.map} +1 -1
  12. package/dist/clean-planning-x1S-JdmO.js +2 -0
  13. package/dist/cli/index.js +291 -760
  14. package/dist/cli/index.js.map +1 -1
  15. package/dist/{close-issue-Dr7yZmrr.js → close-issue-CaFE0stN.js} +11 -7
  16. package/dist/close-issue-CaFE0stN.js.map +1 -0
  17. package/dist/close-issue-CjcfZI9s.js +2 -0
  18. package/dist/compact-beads-B0_qE1w3.js +2 -0
  19. package/dist/{compact-beads-BCOtIIRl.js → compact-beads-CjFkteSU.js} +2 -2
  20. package/dist/{compact-beads-BCOtIIRl.js.map → compact-beads-CjFkteSU.js.map} +1 -1
  21. package/dist/{config-CRzMQRgA.js → config-BQNKsi9G.js} +2 -2
  22. package/dist/{config-CRzMQRgA.js.map → config-BQNKsi9G.js.map} +1 -1
  23. package/dist/{config-BYgUzQ21.js → config-agyKgF5C.js} +1 -1
  24. package/dist/{config-yaml-BgOACZAB.js → config-yaml-DGbLSMCa.js} +1 -1
  25. package/dist/{config-yaml-BgOACZAB.js.map → config-yaml-DGbLSMCa.js.map} +1 -1
  26. package/dist/{config-yaml-fdyvyL0S.js → config-yaml-Dqt4FWQH.js} +1 -1
  27. package/dist/dashboard/{acceptance-criteria-e5iiHlRx.js → acceptance-criteria-Dk9hhiYj.js} +1 -1
  28. package/dist/dashboard/{acceptance-criteria-e5iiHlRx.js.map → acceptance-criteria-Dk9hhiYj.js.map} +1 -1
  29. package/dist/dashboard/{agent-enrichment-C67LJBgD.js → agent-enrichment-DdO7ZqjI.js} +11 -7
  30. package/dist/dashboard/agent-enrichment-DdO7ZqjI.js.map +1 -0
  31. package/dist/dashboard/{agent-enrichment-Cq0P1cNZ.js → agent-enrichment-dLeGE1fX.js} +1 -1
  32. package/dist/dashboard/{agents-YyO6t5Xa.js → agents-DCpQQ_W5.js} +14 -14
  33. package/dist/dashboard/{agents-YyO6t5Xa.js.map → agents-DCpQQ_W5.js.map} +1 -1
  34. package/dist/dashboard/{agents-BVBVCyat.js → agents-Dgh2TjSp.js} +1 -1
  35. package/dist/dashboard/{archive-planning-h-hAjk0P.js → archive-planning-BmW9UDTr.js} +3 -3
  36. package/dist/dashboard/{archive-planning-h-hAjk0P.js.map → archive-planning-BmW9UDTr.js.map} +1 -1
  37. package/dist/dashboard/{archive-planning-CScs1MOC.js → archive-planning-C3Ebf9yC.js} +1 -1
  38. package/dist/dashboard/{beads-qNB0yAHV.js → beads-Bv-AdX7G.js} +3 -3
  39. package/dist/dashboard/{beads-qNB0yAHV.js.map → beads-Bv-AdX7G.js.map} +1 -1
  40. package/dist/dashboard/{beads-D_FRedEJ.js → beads-By6-X07V.js} +1 -1
  41. package/dist/dashboard/clean-planning-D60L8rPY.js +2 -0
  42. package/dist/dashboard/{clean-planning-qafw99vY.js → clean-planning-VEJu5suh.js} +2 -2
  43. package/dist/dashboard/{clean-planning-qafw99vY.js.map → clean-planning-VEJu5suh.js.map} +1 -1
  44. package/dist/dashboard/close-issue-C2KeSKKJ.js +2 -0
  45. package/dist/dashboard/{close-issue-DfIggeZD.js → close-issue-DtKdsSTm.js} +11 -7
  46. package/dist/dashboard/close-issue-DtKdsSTm.js.map +1 -0
  47. package/dist/dashboard/compact-beads-C7BN5N11.js +2 -0
  48. package/dist/dashboard/{compact-beads-Dt0qTqsC.js → compact-beads-D8Vt3qyv.js} +2 -2
  49. package/dist/dashboard/{compact-beads-Dt0qTqsC.js.map → compact-beads-D8Vt3qyv.js.map} +1 -1
  50. package/dist/dashboard/{config-CUREjHP7.js → config-CDkGjnwy.js} +2 -2
  51. package/dist/dashboard/{config-CUREjHP7.js.map → config-CDkGjnwy.js.map} +1 -1
  52. package/dist/dashboard/{config-BeI3uy-8.js → config-CTXkBATQ.js} +1 -1
  53. package/dist/dashboard/{database-CozA13Wy.js → database-DhqASALP.js} +1 -1
  54. package/dist/dashboard/{database-C0y0hXBx.js → database-cxmQryoh.js} +2 -2
  55. package/dist/dashboard/{database-C0y0hXBx.js.map → database-cxmQryoh.js.map} +1 -1
  56. package/dist/dashboard/{dist-src-oG2iHzgI.js → dist-src-DTm11oQr.js} +1 -1
  57. package/dist/dashboard/{dist-src-oG2iHzgI.js.map → dist-src-DTm11oQr.js.map} +1 -1
  58. package/dist/dashboard/{event-store-D7kLBd07.js → event-store-VWWUmOfn.js} +1 -1
  59. package/dist/dashboard/{event-store-O9q0Gweh.js → event-store-vSmAA3Zp.js} +9 -4
  60. package/dist/dashboard/event-store-vSmAA3Zp.js.map +1 -0
  61. package/dist/dashboard/{factory-BnLdiQW-.js → factory-C8nhLGHB.js} +3 -3
  62. package/dist/dashboard/{factory-BnLdiQW-.js.map → factory-C8nhLGHB.js.map} +1 -1
  63. package/dist/dashboard/{feedback-writer-DyovUANg.js → feedback-writer-CudSe1WK.js} +2 -2
  64. package/dist/dashboard/{feedback-writer-DyovUANg.js.map → feedback-writer-CudSe1WK.js.map} +1 -1
  65. package/dist/dashboard/{feedback-writer-gSUv_W0h.js → feedback-writer-Wgv1cd1r.js} +1 -1
  66. package/dist/dashboard/{git-utils-BJRioREj.js → git-utils-C1m4SwAe.js} +1 -1
  67. package/dist/dashboard/{git-utils-BJRioREj.js.map → git-utils-C1m4SwAe.js.map} +1 -1
  68. package/dist/dashboard/{git-utils-BtCRddq3.js → git-utils-DQI8EYoj.js} +1 -1
  69. package/dist/dashboard/{github-app-XO-LBUGk.js → github-app-DClWjjHr.js} +1 -1
  70. package/dist/dashboard/{github-app-XO-LBUGk.js.map → github-app-DClWjjHr.js.map} +1 -1
  71. package/dist/dashboard/{health-events-db-584nYgJB.js → health-events-db-BMXQfInV.js} +1 -1
  72. package/dist/dashboard/{health-events-db-B3ChzN65.js → health-events-db-Do4NrOhC.js} +2 -2
  73. package/dist/dashboard/{health-events-db-B3ChzN65.js.map → health-events-db-Do4NrOhC.js.map} +1 -1
  74. package/dist/dashboard/{hooks-CKhs3N68.js → hooks-CB4T47NC.js} +1 -1
  75. package/dist/dashboard/{hooks-CErbP8Oq.js → hooks-CjqXOlNb.js} +2 -2
  76. package/dist/dashboard/{hooks-CErbP8Oq.js.map → hooks-CjqXOlNb.js.map} +1 -1
  77. package/dist/dashboard/hume-CA2pftu_.js +3 -0
  78. package/dist/dashboard/{hume-CX_U3Qha.js → hume-JsAlMOJC.js} +2 -2
  79. package/dist/dashboard/{hume-CX_U3Qha.js.map → hume-JsAlMOJC.js.map} +1 -1
  80. package/dist/dashboard/{inspect-agent-B57kGDUV.js → inspect-agent-7eour7EA.js} +3 -3
  81. package/dist/dashboard/{inspect-agent-B57kGDUV.js.map → inspect-agent-7eour7EA.js.map} +1 -1
  82. package/dist/dashboard/{io-yGovuG4U.js → io-CWlFW78i.js} +1 -1
  83. package/dist/dashboard/{io-AJg-mzFi.js → io-DKS6359z.js} +1 -1
  84. package/dist/dashboard/{io-AJg-mzFi.js.map → io-DKS6359z.js.map} +1 -1
  85. package/dist/dashboard/issue-id-vwYJdsf8.js +62 -0
  86. package/dist/dashboard/issue-id-vwYJdsf8.js.map +1 -0
  87. package/dist/dashboard/{issue-service-singleton-DQK42EqH.js → issue-service-singleton-Co__-6kL.js} +1 -1
  88. package/dist/dashboard/{issue-service-singleton-sb2HkB9f.js → issue-service-singleton-Wv4xBm3y.js} +7 -7
  89. package/dist/dashboard/{issue-service-singleton-sb2HkB9f.js.map → issue-service-singleton-Wv4xBm3y.js.map} +1 -1
  90. package/dist/dashboard/{label-cleanup-CZEsbtq9.js → label-cleanup-nVKTmIIW.js} +7 -4
  91. package/dist/dashboard/label-cleanup-nVKTmIIW.js.map +1 -0
  92. package/dist/dashboard/lifecycle-BcUmtkR4.js +7 -0
  93. package/dist/dashboard/{merge-agent-GLtMEsTu.js → merge-agent-CGN3TT0a.js} +1 -1
  94. package/dist/dashboard/{merge-agent-twroFuAh.js → merge-agent-yudQOPZc.js} +148 -46
  95. package/dist/dashboard/merge-agent-yudQOPZc.js.map +1 -0
  96. package/dist/dashboard/{paths-COdEvoXR.js → paths-BDyJ7BiV.js} +19 -2
  97. package/dist/dashboard/{paths-COdEvoXR.js.map → paths-BDyJ7BiV.js.map} +1 -1
  98. package/dist/dashboard/{pipeline-notifier-DM5AHG5Q.js → pipeline-notifier-CCSN-jar.js} +1 -1
  99. package/dist/dashboard/{pipeline-notifier-DM5AHG5Q.js.map → pipeline-notifier-CCSN-jar.js.map} +1 -1
  100. package/dist/dashboard/{plan-utils-BkCIhn3B.js → plan-utils-Bkcsqr_s.js} +3 -3
  101. package/dist/dashboard/{plan-utils-BkCIhn3B.js.map → plan-utils-Bkcsqr_s.js.map} +1 -1
  102. package/dist/dashboard/{prd-draft-D09Afalc.js → prd-draft-BD8oMkZ1.js} +2 -2
  103. package/dist/dashboard/{prd-draft-D09Afalc.js.map → prd-draft-BD8oMkZ1.js.map} +1 -1
  104. package/dist/dashboard/{projection-cache-DQ9zegkK.js → projection-cache-C0EL8s8h.js} +1 -1
  105. package/dist/dashboard/{projection-cache-DQ9zegkK.js.map → projection-cache-C0EL8s8h.js.map} +1 -1
  106. package/dist/dashboard/{projects-DyT3vSy-.js → projects-C5ozxjwP.js} +1 -1
  107. package/dist/dashboard/{projects-Cq3TWdPS.js → projects-CFVl4oHn.js} +25 -13
  108. package/dist/dashboard/projects-CFVl4oHn.js.map +1 -0
  109. package/dist/dashboard/{providers-Ck2sQd_F.js → providers-B5Y4H2Mg.js} +4 -4
  110. package/dist/dashboard/providers-B5Y4H2Mg.js.map +1 -0
  111. package/dist/dashboard/{providers-DVQnDekG.js → providers-csVZVPkE.js} +1 -1
  112. package/dist/dashboard/public/assets/{dist-CCJbQrSB.js → dist-BaQPC-c6.js} +1 -1
  113. package/dist/dashboard/public/assets/index-ByLmYGhW.js +212 -0
  114. package/dist/dashboard/public/assets/index-OEEbThNN.css +1 -0
  115. package/dist/dashboard/public/index.html +2 -2
  116. package/dist/dashboard/rally-6McpKKRa.js +3 -0
  117. package/dist/dashboard/{rally-Cwuae-4C.js → rally-YjFRxIiC.js} +2 -2
  118. package/dist/dashboard/{rally-Cwuae-4C.js.map → rally-YjFRxIiC.js.map} +1 -1
  119. package/dist/dashboard/{rally-api-DSUxm7EO.js → rally-api-C0WqCSkT.js} +1 -1
  120. package/dist/dashboard/{rally-api-DSUxm7EO.js.map → rally-api-C0WqCSkT.js.map} +1 -1
  121. package/dist/dashboard/{rally-api-CEH5KZi4.js → rally-api-DNttdCW4.js} +1 -1
  122. package/dist/dashboard/{remote-BHTTMpJJ.js → remote-Cigqjj3f.js} +2 -2
  123. package/dist/dashboard/{remote-BXo_iIku.js → remote-ObpNZ7hF.js} +2 -2
  124. package/dist/dashboard/{remote-BXo_iIku.js.map → remote-ObpNZ7hF.js.map} +1 -1
  125. package/dist/dashboard/{remote-agents-CTKVhFFY.js → remote-agents-Bf3GuM7t.js} +1 -1
  126. package/dist/dashboard/{remote-agents-C0_0LLNd.js → remote-agents-DFyjT1Le.js} +1 -1
  127. package/dist/dashboard/{remote-agents-C0_0LLNd.js.map → remote-agents-DFyjT1Le.js.map} +1 -1
  128. package/dist/dashboard/{review-status-CK3eBGyb.js → review-status-BtXqWBhS.js} +1 -1
  129. package/dist/dashboard/{review-status-CV55Tl-n.js → review-status-Bymwzh2i.js} +44 -4
  130. package/dist/dashboard/{review-status-CV55Tl-n.js.map → review-status-Bymwzh2i.js.map} +1 -1
  131. package/dist/dashboard/server.js +559 -253
  132. package/dist/dashboard/server.js.map +1 -1
  133. package/dist/dashboard/{settings-CuHV-wcv.js → settings-BHlDG7TK.js} +2 -2
  134. package/dist/dashboard/settings-BHlDG7TK.js.map +1 -0
  135. package/dist/dashboard/settings-XWvDcj-D.js +2 -0
  136. package/dist/dashboard/{shadow-engineering-BUeZunaE.js → shadow-engineering-lIn1W_95.js} +1 -1
  137. package/dist/dashboard/{shadow-engineering-BUeZunaE.js.map → shadow-engineering-lIn1W_95.js.map} +1 -1
  138. package/dist/dashboard/{shadow-state-DHQ-kASN.js → shadow-state-BIexcxkv.js} +1 -1
  139. package/dist/dashboard/{shadow-state-DHQ-kASN.js.map → shadow-state-BIexcxkv.js.map} +1 -1
  140. package/dist/dashboard/{spawn-planning-session-8FFAqLdK.js → spawn-planning-session-33Jf-d5T.js} +6 -6
  141. package/dist/dashboard/{spawn-planning-session-8FFAqLdK.js.map → spawn-planning-session-33Jf-d5T.js.map} +1 -1
  142. package/dist/dashboard/{spawn-planning-session-U0Lqpjen.js → spawn-planning-session-D5hrVdWM.js} +1 -1
  143. package/dist/dashboard/{specialist-context-ColzlmGE.js → specialist-context-DGukHSn8.js} +6 -6
  144. package/dist/dashboard/{specialist-context-ColzlmGE.js.map → specialist-context-DGukHSn8.js.map} +1 -1
  145. package/dist/dashboard/{specialist-logs-BhmDpFIq.js → specialist-logs-CIw4qfTy.js} +1 -1
  146. package/dist/dashboard/{specialists-C6s3U6tX.js → specialists-B_zrayaP.js} +37 -36
  147. package/dist/dashboard/specialists-B_zrayaP.js.map +1 -0
  148. package/dist/dashboard/{specialists-Cny632-T.js → specialists-Cp-PgspS.js} +1 -1
  149. package/dist/dashboard/{test-agent-queue-tqI4VDsu.js → test-agent-queue-ypF_ecHo.js} +4 -4
  150. package/dist/dashboard/{test-agent-queue-tqI4VDsu.js.map → test-agent-queue-ypF_ecHo.js.map} +1 -1
  151. package/dist/dashboard/{tldr-daemon-BNFyS7W_.js → tldr-daemon-B_oLRD8z.js} +2 -2
  152. package/dist/dashboard/{tldr-daemon-BNFyS7W_.js.map → tldr-daemon-B_oLRD8z.js.map} +1 -1
  153. package/dist/dashboard/{tldr-daemon-A6JqC59u.js → tldr-daemon-Cfs0bXTi.js} +1 -1
  154. package/dist/dashboard/{tmux-DYGAVJfb.js → tmux-BzxdKItf.js} +1 -1
  155. package/dist/dashboard/{tmux-IlN1Slv-.js → tmux-LwG0tHhU.js} +2 -2
  156. package/dist/dashboard/{tmux-IlN1Slv-.js.map → tmux-LwG0tHhU.js.map} +1 -1
  157. package/dist/dashboard/{tracker-config-BzNLnmcE.js → tracker-config-BP59uH4V.js} +1 -1
  158. package/dist/dashboard/{tracker-config-CNM_5rEf.js → tracker-config-e7ph1QqT.js} +2 -2
  159. package/dist/dashboard/{tracker-config-CNM_5rEf.js.map → tracker-config-e7ph1QqT.js.map} +1 -1
  160. package/dist/dashboard/{tunnel-D2BkwU7k.js → tunnel-0RzzuXPf.js} +1 -1
  161. package/dist/dashboard/{tunnel-Dub2hiAA.js → tunnel-DldbBPWL.js} +2 -2
  162. package/dist/dashboard/{tunnel-Dub2hiAA.js.map → tunnel-DldbBPWL.js.map} +1 -1
  163. package/dist/dashboard/{types-CWA-o4UN.js → types-RKZjGE5N.js} +1 -1
  164. package/dist/dashboard/{types-CWA-o4UN.js.map → types-RKZjGE5N.js.map} +1 -1
  165. package/dist/dashboard/{vtt-parser-BAXygRf0.js → vtt-parser-99vFekRQ.js} +1 -1
  166. package/dist/dashboard/{vtt-parser-BAXygRf0.js.map → vtt-parser-99vFekRQ.js.map} +1 -1
  167. package/dist/dashboard/{work-agent-prompt-JYq_OugP.js → work-agent-prompt-fCg67nyo.js} +65 -10
  168. package/dist/dashboard/{work-agent-prompt-JYq_OugP.js.map → work-agent-prompt-fCg67nyo.js.map} +1 -1
  169. package/dist/dashboard/{work-type-router-Cxp8_ur2.js → work-type-router-CWVW2Wk_.js} +1 -1
  170. package/dist/dashboard/{work-type-router-Cxp8_ur2.js.map → work-type-router-CWVW2Wk_.js.map} +1 -1
  171. package/dist/dashboard/{work-type-router-Com2amST.js → work-type-router-Di5gCQwh.js} +1 -1
  172. package/dist/dashboard/{workflows-N1UTipYl.js → workflows-BSMipN07.js} +35 -17
  173. package/dist/dashboard/workflows-BSMipN07.js.map +1 -0
  174. package/dist/dashboard/workflows-DaYWQIS2.js +2 -0
  175. package/dist/dashboard/{workspace-config-cmp5_ipD.js → workspace-config-DVDR-Ukh.js} +1 -1
  176. package/dist/dashboard/workspace-config-DVDR-Ukh.js.map +1 -0
  177. package/dist/dashboard/{workspace-manager-CjpWPgzL.js → workspace-manager-BYfzs_t2.js} +1 -1
  178. package/dist/dashboard/{workspace-manager-D_y9ZmW_.js → workspace-manager-C7OfT62A.js} +44 -24
  179. package/dist/dashboard/workspace-manager-C7OfT62A.js.map +1 -0
  180. package/dist/{dns-BKzHm-2q.js → dns-D_aKQJjb.js} +1 -1
  181. package/dist/{dns-DZwOWvVO.js → dns-Yxq4NNS7.js} +1 -1
  182. package/dist/{dns-DZwOWvVO.js.map → dns-Yxq4NNS7.js.map} +1 -1
  183. package/dist/{factory-DFu3IT4r.js → factory-BRBGw6OB.js} +1 -1
  184. package/dist/{factory-DfzczxN1.js → factory-DzsOiZVc.js} +3 -3
  185. package/dist/{factory-DfzczxN1.js.map → factory-DzsOiZVc.js.map} +1 -1
  186. package/dist/{feedback-writer-CwdnOkPO.js → feedback-writer-ygXN5F9N.js} +2 -2
  187. package/dist/{feedback-writer-CwdnOkPO.js.map → feedback-writer-ygXN5F9N.js.map} +1 -1
  188. package/dist/{github-app-CHKwxOeQ.js → github-app-DykduJ0X.js} +1 -1
  189. package/dist/{github-app-CHKwxOeQ.js.map → github-app-DykduJ0X.js.map} +1 -1
  190. package/dist/hume-9nv1VmMV.js +3 -0
  191. package/dist/{hume-DnV-tDsh.js → hume-DoCbph2h.js} +2 -2
  192. package/dist/{hume-DnV-tDsh.js.map → hume-DoCbph2h.js.map} +1 -1
  193. package/dist/index.d.ts +17 -2
  194. package/dist/index.d.ts.map +1 -1
  195. package/dist/index.js +8 -7
  196. package/dist/issue-id-CAcekoIw.js +62 -0
  197. package/dist/issue-id-CAcekoIw.js.map +1 -0
  198. package/dist/{label-cleanup-31ElPqqv.js → label-cleanup-C8R9Rspn.js} +7 -4
  199. package/dist/label-cleanup-C8R9Rspn.js.map +1 -0
  200. package/dist/{manifest-DL0oDbpv.js → manifest-B4ghOD-V.js} +1 -1
  201. package/dist/{manifest-DL0oDbpv.js.map → manifest-B4ghOD-V.js.map} +1 -1
  202. package/dist/{merge-agent-VQH9z9t8.js → merge-agent-DlUiUanN.js} +86 -33
  203. package/dist/merge-agent-DlUiUanN.js.map +1 -0
  204. package/dist/{paths-lMaxrYtT.js → paths-CDJ_HsbN.js} +19 -2
  205. package/dist/{paths-lMaxrYtT.js.map → paths-CDJ_HsbN.js.map} +1 -1
  206. package/dist/{pipeline-notifier-OJ-d3Y60.js → pipeline-notifier-XgDdCdvT.js} +1 -1
  207. package/dist/{pipeline-notifier-OJ-d3Y60.js.map → pipeline-notifier-XgDdCdvT.js.map} +1 -1
  208. package/dist/{projects-CvLepaxC.js → projects-Bk-5QhFQ.js} +25 -13
  209. package/dist/projects-Bk-5QhFQ.js.map +1 -0
  210. package/dist/{projects-DMWmPeIU.js → projects-DhU7rAVN.js} +1 -1
  211. package/dist/{providers-DcCPZ5K4.js → providers-DSU1vfQF.js} +4 -4
  212. package/dist/providers-DSU1vfQF.js.map +1 -0
  213. package/dist/rally-DdPvGa-w.js +3 -0
  214. package/dist/{rally-uUUZXp1h.js → rally-Dy00NElU.js} +1 -1
  215. package/dist/{rally-uUUZXp1h.js.map → rally-Dy00NElU.js.map} +1 -1
  216. package/dist/{remote-CkLBqLJc.js → remote-CYiOJg0q.js} +2 -2
  217. package/dist/{remote-CkLBqLJc.js.map → remote-CYiOJg0q.js.map} +1 -1
  218. package/dist/{remote-agents-C5Bd2fgt.js → remote-agents-CZXrUF4f.js} +1 -1
  219. package/dist/{remote-agents-C5Bd2fgt.js.map → remote-agents-CZXrUF4f.js.map} +1 -1
  220. package/dist/{remote-agents-BTzD-wMQ.js → remote-agents-ycHHVsgf.js} +1 -1
  221. package/dist/{remote-workspace-Dxghqiti.js → remote-workspace-CA33UuVI.js} +4 -4
  222. package/dist/{remote-workspace-Dxghqiti.js.map → remote-workspace-CA33UuVI.js.map} +1 -1
  223. package/dist/{review-status-2TdtHNcs.js → review-status-D6H2WOw8.js} +1 -1
  224. package/dist/{review-status-Bm1bWNEa.js → review-status-DEDvCKMP.js} +44 -4
  225. package/dist/{review-status-Bm1bWNEa.js.map → review-status-DEDvCKMP.js.map} +1 -1
  226. package/dist/{tracker-C_62ukEq.js → settings-BcWPTrua.js} +7 -199
  227. package/dist/settings-BcWPTrua.js.map +1 -0
  228. package/dist/shadow-state-BZzxfEGw.js +2 -0
  229. package/dist/{shadow-state-CFFHf05M.js → shadow-state-CE3dQfll.js} +1 -1
  230. package/dist/{shadow-state-CFFHf05M.js.map → shadow-state-CE3dQfll.js.map} +1 -1
  231. package/dist/{specialist-context-BdNFsfMG.js → specialist-context-BAUWL1Fl.js} +6 -6
  232. package/dist/{specialist-context-BdNFsfMG.js.map → specialist-context-BAUWL1Fl.js.map} +1 -1
  233. package/dist/{specialist-logs-CLztE_bE.js → specialist-logs-DQKKQV9B.js} +1 -1
  234. package/dist/{specialists-aUoUVWsN.js → specialists-Bfb9ATzw.js} +1 -1
  235. package/dist/{specialists-DEKqgkxp.js → specialists-D7Kj5o6s.js} +35 -34
  236. package/dist/specialists-D7Kj5o6s.js.map +1 -0
  237. package/dist/sync-DMfgd389.js +693 -0
  238. package/dist/sync-DMfgd389.js.map +1 -0
  239. package/dist/sync-TL6y-8K6.js +2 -0
  240. package/dist/{tldr-daemon-BCEFPItr.js → tldr-daemon-CFx4LXAl.js} +2 -2
  241. package/dist/{tldr-daemon-BCEFPItr.js.map → tldr-daemon-CFx4LXAl.js.map} +1 -1
  242. package/dist/{tldr-daemon-xBAx4cBE.js → tldr-daemon-D_EooADG.js} +1 -1
  243. package/dist/{tmux-DN6H886Y.js → tmux-CBtui_Cl.js} +1 -1
  244. package/dist/{tmux-CKdNxxJx.js → tmux-D6Ah4I8z.js} +2 -2
  245. package/dist/{tmux-CKdNxxJx.js.map → tmux-D6Ah4I8z.js.map} +1 -1
  246. package/dist/tracker-BhYYvU3p.js +198 -0
  247. package/dist/tracker-BhYYvU3p.js.map +1 -0
  248. package/dist/{tracker-utils-CVU2W1sX.js → tracker-utils-ChQyut8w.js} +34 -12
  249. package/dist/tracker-utils-ChQyut8w.js.map +1 -0
  250. package/dist/{traefik-DHgBoWXX.js → traefik-C80EbDu_.js} +4 -4
  251. package/dist/{traefik-DHgBoWXX.js.map → traefik-C80EbDu_.js.map} +1 -1
  252. package/dist/{traefik-BR-edbZv.js → traefik-CgHl7Bge.js} +1 -1
  253. package/dist/{tunnel-BZO9Q5oe.js → tunnel-DXOJ1wMM.js} +1 -1
  254. package/dist/{tunnel-Bl1qNSyQ.js → tunnel-DzXEPwIc.js} +2 -2
  255. package/dist/{tunnel-Bl1qNSyQ.js.map → tunnel-DzXEPwIc.js.map} +1 -1
  256. package/dist/{types-DewGdaIP.js → types-BhJj1SP1.js} +1 -1
  257. package/dist/{types-DewGdaIP.js.map → types-BhJj1SP1.js.map} +1 -1
  258. package/dist/{work-type-router-CS2BB1vS.js → work-type-router-CHjciPyS.js} +3 -3
  259. package/dist/{work-type-router-CS2BB1vS.js.map → work-type-router-CHjciPyS.js.map} +1 -1
  260. package/dist/{workspace-config-CNXOpKuj.js → workspace-config-fUafvYMp.js} +1 -1
  261. package/dist/workspace-config-fUafvYMp.js.map +1 -0
  262. package/dist/workspace-manager-B9jS4Dsq.js +3 -0
  263. package/dist/{workspace-manager-CncdZkIy.js → workspace-manager-DuLhnzJV.js} +112 -27
  264. package/dist/workspace-manager-DuLhnzJV.js.map +1 -0
  265. package/package.json +2 -1
  266. package/scripts/post-merge-deploy.sh +25 -5
  267. package/scripts/record-cost-event.js +57 -7
  268. package/scripts/record-cost-event.js.map +1 -1
  269. package/skills/pan-help/SKILL.md +1 -1
  270. package/skills/pan-sync/SKILL.md +6 -6
  271. package/skills/workspace-add-repo/skill.md +46 -0
  272. package/templates/claude-md/sections/warnings.md +15 -2
  273. package/dist/clean-planning-sZXvy3Y5.js +0 -2
  274. package/dist/close-issue-Dml437qV.js +0 -2
  275. package/dist/close-issue-Dr7yZmrr.js.map +0 -1
  276. package/dist/compact-beads-iu218JcO.js +0 -2
  277. package/dist/dashboard/agent-enrichment-C67LJBgD.js.map +0 -1
  278. package/dist/dashboard/clean-planning-DCu3cOTu.js +0 -2
  279. package/dist/dashboard/close-issue-DfIggeZD.js.map +0 -1
  280. package/dist/dashboard/close-issue-DwdwYtar.js +0 -2
  281. package/dist/dashboard/compact-beads-DXY2fK2s.js +0 -2
  282. package/dist/dashboard/event-store-O9q0Gweh.js.map +0 -1
  283. package/dist/dashboard/hume-MZndNDVU.js +0 -3
  284. package/dist/dashboard/label-cleanup-CZEsbtq9.js.map +0 -1
  285. package/dist/dashboard/lifecycle-ZTYdrr2O.js +0 -7
  286. package/dist/dashboard/merge-agent-twroFuAh.js.map +0 -1
  287. package/dist/dashboard/projects-Cq3TWdPS.js.map +0 -1
  288. package/dist/dashboard/providers-Ck2sQd_F.js.map +0 -1
  289. package/dist/dashboard/public/assets/index-CpSmB2ts.css +0 -1
  290. package/dist/dashboard/public/assets/index-yarWhi0M.js +0 -214
  291. package/dist/dashboard/rally-CQ1OBJrJ.js +0 -3
  292. package/dist/dashboard/settings-CuHV-wcv.js.map +0 -1
  293. package/dist/dashboard/settings-DMeGBRsk.js +0 -2
  294. package/dist/dashboard/specialists-C6s3U6tX.js.map +0 -1
  295. package/dist/dashboard/workflows-B2ARUpOa.js +0 -2
  296. package/dist/dashboard/workflows-N1UTipYl.js.map +0 -1
  297. package/dist/dashboard/workspace-config-cmp5_ipD.js.map +0 -1
  298. package/dist/dashboard/workspace-manager-D_y9ZmW_.js.map +0 -1
  299. package/dist/hume-BjmwmJ9E.js +0 -3
  300. package/dist/label-cleanup-31ElPqqv.js.map +0 -1
  301. package/dist/merge-agent-VQH9z9t8.js.map +0 -1
  302. package/dist/projects-CvLepaxC.js.map +0 -1
  303. package/dist/providers-DcCPZ5K4.js.map +0 -1
  304. package/dist/rally-DR9x8--6.js +0 -3
  305. package/dist/shadow-state-p3jpGRPJ.js +0 -2
  306. package/dist/specialists-DEKqgkxp.js.map +0 -1
  307. package/dist/tracker-C_62ukEq.js.map +0 -1
  308. package/dist/tracker-utils-CVU2W1sX.js.map +0 -1
  309. package/dist/workspace-config-CNXOpKuj.js.map +0 -1
  310. package/dist/workspace-manager-CncdZkIy.js.map +0 -1
  311. package/dist/workspace-manager-Cx0r2Jnv.js +0 -3
@@ -1 +1 @@
1
- {"version":3,"file":"prd-draft-D09Afalc.js","names":[],"sources":["../../src/lib/prd-draft.ts"],"sourcesContent":["/**\n * Pre-workspace PRD Management\n *\n * Allows PRDs to be created and managed before a workspace exists.\n * PRDs are stored in ~/.panopticon/docs/prds/drafts/ and can be\n * promoted to workspace .planning/PRD.md when implementation begins.\n */\n\nimport { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync, renameSync, statSync } from 'fs';\nimport { join, basename } from 'path';\nimport { PRD_DRAFTS_DIR } from './paths.js';\n\n/**\n * Get the file path for a pre-workspace PRD draft\n */\nexport function getPRDDraftPath(issueId: string): string {\n return join(PRD_DRAFTS_DIR, `${issueId.toUpperCase()}.md`);\n}\n\n/**\n * Check if a pre-workspace PRD draft exists\n */\nexport function hasPRDDraft(issueId: string): boolean {\n return existsSync(getPRDDraftPath(issueId));\n}\n\n/**\n * Read a pre-workspace PRD draft\n * Returns null if not found\n */\nexport function readPRDDraft(issueId: string): string | null {\n const path = getPRDDraftPath(issueId);\n if (!existsSync(path)) {\n return null;\n }\n return readFileSync(path, 'utf-8');\n}\n\n/**\n * Create or update a pre-workspace PRD draft\n */\nexport function writePRDDraft(issueId: string, content: string): string {\n // Ensure drafts directory exists\n if (!existsSync(PRD_DRAFTS_DIR)) {\n mkdirSync(PRD_DRAFTS_DIR, { recursive: true });\n }\n\n const path = getPRDDraftPath(issueId);\n writeFileSync(path, content, 'utf-8');\n return path;\n}\n\n/**\n * List all PRD drafts\n * Returns array of issue IDs (filenames without .md extension)\n */\nexport function listPRDDrafts(): string[] {\n if (!existsSync(PRD_DRAFTS_DIR)) {\n return [];\n }\n\n return readdirSync(PRD_DRAFTS_DIR)\n .filter((f) => f.endsWith('.md'))\n .map((f) => basename(f, '.md'));\n}\n\n/**\n * Delete a PRD draft\n */\nexport function deletePRDDraft(issueId: string): boolean {\n const path = getPRDDraftPath(issueId);\n if (!existsSync(path)) {\n return false;\n }\n\n try {\n // Move to a deleted folder for safety\n const deletedDir = join(PRD_DRAFTS_DIR, 'deleted');\n if (!existsSync(deletedDir)) {\n mkdirSync(deletedDir, { recursive: true });\n }\n const deletedPath = join(deletedDir, `${issueId.toUpperCase()}-${Date.now()}.md`);\n renameSync(path, deletedPath);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get metadata about a PRD draft\n */\nexport function getPRDDraftInfo(issueId: string): {\n exists: boolean;\n path?: string;\n size?: number;\n modified?: Date;\n} {\n const path = getPRDDraftPath(issueId);\n\n if (!existsSync(path)) {\n return { exists: false };\n }\n\n const stats = statSync(path);\n return {\n exists: true,\n path,\n size: stats.size,\n modified: stats.mtime,\n };\n}\n"],"mappings":";;;;;;;;;;;YAU4C;;;;AAK5C,SAAgB,gBAAgB,SAAyB;AACvD,QAAO,KAAK,gBAAgB,GAAG,QAAQ,aAAa,CAAC,KAAK;;;;;AAM5D,SAAgB,YAAY,SAA0B;AACpD,QAAO,WAAW,gBAAgB,QAAQ,CAAC"}
1
+ {"version":3,"file":"prd-draft-BD8oMkZ1.js","names":[],"sources":["../../src/lib/prd-draft.ts"],"sourcesContent":["/**\n * Pre-workspace PRD Management\n *\n * Allows PRDs to be created and managed before a workspace exists.\n * PRDs are stored in ~/.panopticon/docs/prds/drafts/ and can be\n * promoted to workspace .planning/PRD.md when implementation begins.\n */\n\nimport { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync, renameSync, statSync } from 'fs';\nimport { join, basename } from 'path';\nimport { PRD_DRAFTS_DIR } from './paths.js';\n\n/**\n * Get the file path for a pre-workspace PRD draft\n */\nexport function getPRDDraftPath(issueId: string): string {\n return join(PRD_DRAFTS_DIR, `${issueId.toUpperCase()}.md`);\n}\n\n/**\n * Check if a pre-workspace PRD draft exists\n */\nexport function hasPRDDraft(issueId: string): boolean {\n return existsSync(getPRDDraftPath(issueId));\n}\n\n/**\n * Read a pre-workspace PRD draft\n * Returns null if not found\n */\nexport function readPRDDraft(issueId: string): string | null {\n const path = getPRDDraftPath(issueId);\n if (!existsSync(path)) {\n return null;\n }\n return readFileSync(path, 'utf-8');\n}\n\n/**\n * Create or update a pre-workspace PRD draft\n */\nexport function writePRDDraft(issueId: string, content: string): string {\n // Ensure drafts directory exists\n if (!existsSync(PRD_DRAFTS_DIR)) {\n mkdirSync(PRD_DRAFTS_DIR, { recursive: true });\n }\n\n const path = getPRDDraftPath(issueId);\n writeFileSync(path, content, 'utf-8');\n return path;\n}\n\n/**\n * List all PRD drafts\n * Returns array of issue IDs (filenames without .md extension)\n */\nexport function listPRDDrafts(): string[] {\n if (!existsSync(PRD_DRAFTS_DIR)) {\n return [];\n }\n\n return readdirSync(PRD_DRAFTS_DIR)\n .filter((f) => f.endsWith('.md'))\n .map((f) => basename(f, '.md'));\n}\n\n/**\n * Delete a PRD draft\n */\nexport function deletePRDDraft(issueId: string): boolean {\n const path = getPRDDraftPath(issueId);\n if (!existsSync(path)) {\n return false;\n }\n\n try {\n // Move to a deleted folder for safety\n const deletedDir = join(PRD_DRAFTS_DIR, 'deleted');\n if (!existsSync(deletedDir)) {\n mkdirSync(deletedDir, { recursive: true });\n }\n const deletedPath = join(deletedDir, `${issueId.toUpperCase()}-${Date.now()}.md`);\n renameSync(path, deletedPath);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get metadata about a PRD draft\n */\nexport function getPRDDraftInfo(issueId: string): {\n exists: boolean;\n path?: string;\n size?: number;\n modified?: Date;\n} {\n const path = getPRDDraftPath(issueId);\n\n if (!existsSync(path)) {\n return { exists: false };\n }\n\n const stats = statSync(path);\n return {\n exists: true,\n path,\n size: stats.size,\n modified: stats.mtime,\n };\n}\n"],"mappings":";;;;;;;;;;;YAU4C;;;;AAK5C,SAAgB,gBAAgB,SAAyB;AACvD,QAAO,KAAK,gBAAgB,GAAG,QAAQ,aAAa,CAAC,KAAK;;;;;AAM5D,SAAgB,YAAY,SAA0B;AACpD,QAAO,WAAW,gBAAgB,QAAQ,CAAC"}
@@ -68,4 +68,4 @@ function getProjectionCache() {
68
68
  //#endregion
69
69
  export { createProjectionCache, getProjectionCache, initProjectionCache };
70
70
 
71
- //# sourceMappingURL=projection-cache-DQ9zegkK.js.map
71
+ //# sourceMappingURL=projection-cache-C0EL8s8h.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"projection-cache-DQ9zegkK.js","names":[],"sources":["../../src/dashboard/server/services/projection-cache.ts"],"sourcesContent":["/**\n * Projection Cache Service (PAN-437)\n *\n * Persists the full DashboardSnapshot to SQLite so the server can serve\n * data instantly on startup without waiting for API fetches.\n *\n * Uses the same DB connection as the event store (shared DbAdapter).\n * Writes are debounced at 100ms to avoid thrashing during event bursts.\n */\n\nimport type { DbAdapter } from '../event-store.js';\nimport type { DashboardSnapshot } from '@panopticon/contracts';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\ninterface CacheRow {\n key: string;\n data: string;\n sequence: number;\n updated_at: string;\n}\n\nexport interface ProjectionCache {\n /** Load the cached DashboardSnapshot. Returns null if not found or corrupt. */\n load(): DashboardSnapshot | null;\n /** Persist the snapshot (debounced at 100ms). */\n save(snapshot: DashboardSnapshot): void;\n}\n\n// ─── Implementation ───────────────────────────────────────────────────────────\n\nconst CACHE_KEY = 'dashboard';\n\nexport function createProjectionCache(db: DbAdapter): ProjectionCache {\n const loadStmt = db.prepare<CacheRow>(\n `SELECT key, data, sequence, updated_at FROM projection_cache WHERE key = ?`,\n );\n const upsertStmt = db.prepare<void>(\n `INSERT INTO projection_cache (key, data, sequence, updated_at)\n VALUES (?, ?, ?, ?)\n ON CONFLICT(key) DO UPDATE SET\n data = excluded.data,\n sequence = excluded.sequence,\n updated_at = excluded.updated_at`,\n );\n\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n let pendingSnapshot: DashboardSnapshot | null = null;\n\n function load(): DashboardSnapshot | null {\n try {\n const row = loadStmt.get([CACHE_KEY]);\n if (!row) return null;\n const parsed = JSON.parse(row.data) as DashboardSnapshot;\n console.log(\n `[projection-cache] Loaded snapshot: seq=${row.sequence}, ` +\n `updated=${row.updated_at}, agents=${(parsed.agents ?? []).length}, ` +\n `issues=${(parsed.issues ?? []).length}`,\n );\n return parsed;\n } catch (err) {\n console.warn('[projection-cache] Failed to load cached snapshot:', err);\n return null;\n }\n }\n\n function flush(): void {\n if (!pendingSnapshot) return;\n const snapshot = pendingSnapshot;\n pendingSnapshot = null;\n debounceTimer = null;\n try {\n upsertStmt.run([\n CACHE_KEY,\n JSON.stringify(snapshot),\n snapshot.sequence,\n new Date().toISOString(),\n ]);\n } catch (err) {\n console.warn('[projection-cache] Failed to save snapshot:', err);\n }\n }\n\n function save(snapshot: DashboardSnapshot): void {\n pendingSnapshot = snapshot;\n if (debounceTimer !== null) return; // Already scheduled\n debounceTimer = setTimeout(flush, 100);\n }\n\n return { load, save };\n}\n\n// ─── Module-level singleton ───────────────────────────────────────────────────\n\nlet _cache: ProjectionCache | null = null;\n\n/**\n * Initialize the ProjectionCache with the shared DbAdapter.\n * Called from initEventStore() after the DB is opened.\n */\nexport function initProjectionCache(db: DbAdapter): ProjectionCache {\n if (_cache) return _cache;\n _cache = createProjectionCache(db);\n return _cache;\n}\n\n/**\n * Return the singleton ProjectionCache. Throws if not yet initialized.\n */\nexport function getProjectionCache(): ProjectionCache {\n if (!_cache) {\n throw new Error('[projection-cache] getProjectionCache() called before initProjectionCache().');\n }\n return _cache;\n}\n"],"mappings":";AA+BA,MAAM,YAAY;AAElB,SAAgB,sBAAsB,IAAgC;CACpE,MAAM,WAAW,GAAG,QAClB,6EACD;CACD,MAAM,aAAa,GAAG,QACpB;;;;;yCAMD;CAED,IAAI,gBAAsD;CAC1D,IAAI,kBAA4C;CAEhD,SAAS,OAAiC;AACxC,MAAI;GACF,MAAM,MAAM,SAAS,IAAI,CAAC,UAAU,CAAC;AACrC,OAAI,CAAC,IAAK,QAAO;GACjB,MAAM,SAAS,KAAK,MAAM,IAAI,KAAK;AACnC,WAAQ,IACN,2CAA2C,IAAI,SAAS,YAC7C,IAAI,WAAW,YAAY,OAAO,UAAU,EAAE,EAAE,OAAO,YACvD,OAAO,UAAU,EAAE,EAAE,SACjC;AACD,UAAO;WACA,KAAK;AACZ,WAAQ,KAAK,sDAAsD,IAAI;AACvE,UAAO;;;CAIX,SAAS,QAAc;AACrB,MAAI,CAAC,gBAAiB;EACtB,MAAM,WAAW;AACjB,oBAAkB;AAClB,kBAAgB;AAChB,MAAI;AACF,cAAW,IAAI;IACb;IACA,KAAK,UAAU,SAAS;IACxB,SAAS;qBACT,IAAI,MAAM,EAAC,aAAa;IACzB,CAAC;WACK,KAAK;AACZ,WAAQ,KAAK,+CAA+C,IAAI;;;CAIpE,SAAS,KAAK,UAAmC;AAC/C,oBAAkB;AAClB,MAAI,kBAAkB,KAAM;AAC5B,kBAAgB,WAAW,OAAO,IAAI;;AAGxC,QAAO;EAAE;EAAM;EAAM;;AAKvB,IAAI,SAAiC;;;;;AAMrC,SAAgB,oBAAoB,IAAgC;AAClE,KAAI,OAAQ,QAAO;AACnB,UAAS,sBAAsB,GAAG;AAClC,QAAO;;;;;AAMT,SAAgB,qBAAsC;AACpD,KAAI,CAAC,OACH,OAAM,IAAI,MAAM,+EAA+E;AAEjG,QAAO"}
1
+ {"version":3,"file":"projection-cache-C0EL8s8h.js","names":[],"sources":["../../src/dashboard/server/services/projection-cache.ts"],"sourcesContent":["/**\n * Projection Cache Service (PAN-437)\n *\n * Persists the full DashboardSnapshot to SQLite so the server can serve\n * data instantly on startup without waiting for API fetches.\n *\n * Uses the same DB connection as the event store (shared DbAdapter).\n * Writes are debounced at 100ms to avoid thrashing during event bursts.\n */\n\nimport type { DbAdapter } from '../event-store.js';\nimport type { DashboardSnapshot } from '@panopticon/contracts';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\ninterface CacheRow {\n key: string;\n data: string;\n sequence: number;\n updated_at: string;\n}\n\nexport interface ProjectionCache {\n /** Load the cached DashboardSnapshot. Returns null if not found or corrupt. */\n load(): DashboardSnapshot | null;\n /** Persist the snapshot (debounced at 100ms). */\n save(snapshot: DashboardSnapshot): void;\n}\n\n// ─── Implementation ───────────────────────────────────────────────────────────\n\nconst CACHE_KEY = 'dashboard';\n\nexport function createProjectionCache(db: DbAdapter): ProjectionCache {\n const loadStmt = db.prepare<CacheRow>(\n `SELECT key, data, sequence, updated_at FROM projection_cache WHERE key = ?`,\n );\n const upsertStmt = db.prepare<void>(\n `INSERT INTO projection_cache (key, data, sequence, updated_at)\n VALUES (?, ?, ?, ?)\n ON CONFLICT(key) DO UPDATE SET\n data = excluded.data,\n sequence = excluded.sequence,\n updated_at = excluded.updated_at`,\n );\n\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n let pendingSnapshot: DashboardSnapshot | null = null;\n\n function load(): DashboardSnapshot | null {\n try {\n const row = loadStmt.get([CACHE_KEY]);\n if (!row) return null;\n const parsed = JSON.parse(row.data) as DashboardSnapshot;\n console.log(\n `[projection-cache] Loaded snapshot: seq=${row.sequence}, ` +\n `updated=${row.updated_at}, agents=${(parsed.agents ?? []).length}, ` +\n `issues=${(parsed.issues ?? []).length}`,\n );\n return parsed;\n } catch (err) {\n console.warn('[projection-cache] Failed to load cached snapshot:', err);\n return null;\n }\n }\n\n function flush(): void {\n if (!pendingSnapshot) return;\n const snapshot = pendingSnapshot;\n pendingSnapshot = null;\n debounceTimer = null;\n try {\n upsertStmt.run([\n CACHE_KEY,\n JSON.stringify(snapshot),\n snapshot.sequence,\n new Date().toISOString(),\n ]);\n } catch (err) {\n console.warn('[projection-cache] Failed to save snapshot:', err);\n }\n }\n\n function save(snapshot: DashboardSnapshot): void {\n pendingSnapshot = snapshot;\n if (debounceTimer !== null) return; // Already scheduled\n debounceTimer = setTimeout(flush, 100);\n }\n\n return { load, save };\n}\n\n// ─── Module-level singleton ───────────────────────────────────────────────────\n\nlet _cache: ProjectionCache | null = null;\n\n/**\n * Initialize the ProjectionCache with the shared DbAdapter.\n * Called from initEventStore() after the DB is opened.\n */\nexport function initProjectionCache(db: DbAdapter): ProjectionCache {\n if (_cache) return _cache;\n _cache = createProjectionCache(db);\n return _cache;\n}\n\n/**\n * Return the singleton ProjectionCache. Throws if not yet initialized.\n */\nexport function getProjectionCache(): ProjectionCache {\n if (!_cache) {\n throw new Error('[projection-cache] getProjectionCache() called before initProjectionCache().');\n }\n return _cache;\n}\n"],"mappings":";AA+BA,MAAM,YAAY;AAElB,SAAgB,sBAAsB,IAAgC;CACpE,MAAM,WAAW,GAAG,QAClB,6EACD;CACD,MAAM,aAAa,GAAG,QACpB;;;;;yCAMD;CAED,IAAI,gBAAsD;CAC1D,IAAI,kBAA4C;CAEhD,SAAS,OAAiC;AACxC,MAAI;GACF,MAAM,MAAM,SAAS,IAAI,CAAC,UAAU,CAAC;AACrC,OAAI,CAAC,IAAK,QAAO;GACjB,MAAM,SAAS,KAAK,MAAM,IAAI,KAAK;AACnC,WAAQ,IACN,2CAA2C,IAAI,SAAS,YAC7C,IAAI,WAAW,YAAY,OAAO,UAAU,EAAE,EAAE,OAAO,YACvD,OAAO,UAAU,EAAE,EAAE,SACjC;AACD,UAAO;WACA,KAAK;AACZ,WAAQ,KAAK,sDAAsD,IAAI;AACvE,UAAO;;;CAIX,SAAS,QAAc;AACrB,MAAI,CAAC,gBAAiB;EACtB,MAAM,WAAW;AACjB,oBAAkB;AAClB,kBAAgB;AAChB,MAAI;AACF,cAAW,IAAI;IACb;IACA,KAAK,UAAU,SAAS;IACxB,SAAS;qBACT,IAAI,MAAM,EAAC,aAAa;IACzB,CAAC;WACK,KAAK;AACZ,WAAQ,KAAK,+CAA+C,IAAI;;;CAIpE,SAAS,KAAK,UAAmC;AAC/C,oBAAkB;AAClB,MAAI,kBAAkB,KAAM;AAC5B,kBAAgB,WAAW,OAAO,IAAI;;AAGxC,QAAO;EAAE;EAAM;EAAM;;AAKvB,IAAI,SAAiC;;;;;AAMrC,SAAgB,oBAAoB,IAAgC;AAClE,KAAI,OAAQ,QAAO;AACnB,UAAS,sBAAsB,GAAG;AAClC,QAAO;;;;;AAMT,SAAgB,qBAAsC;AACpD,KAAI,CAAC,OACH,OAAM,IAAI,MAAM,+EAA+E;AAEjG,QAAO"}
@@ -1,3 +1,3 @@
1
- import { S as unregisterProject, a as findProjectByTeam, b as resolveProjectPath, c as getProject, d as getSpecialistRetention, f as hasProjects, g as loadProjectsConfig, h as listProjects, i as findProjectByPath, l as getSpecialistConfig, m as initializeProjectsConfig, n as createDefaultProjectsConfig, o as findProjectsByRallyProject, p as init_projects, r as extractTeamPrefix, s as getIssuePrefix, t as PROJECTS_CONFIG_FILE, u as getSpecialistPromptOverride, v as registerProject, x as saveProjectsConfig, y as resolveProjectFromIssue } from "./projects-Cq3TWdPS.js";
1
+ import { S as unregisterProject, a as findProjectByTeam, b as resolveProjectPath, c as getProject, d as getSpecialistRetention, f as hasProjects, g as loadProjectsConfig, h as listProjects, i as findProjectByPath, l as getSpecialistConfig, m as initializeProjectsConfig, n as createDefaultProjectsConfig, o as findProjectsByRallyProject, p as init_projects, r as extractTeamPrefix, s as getIssuePrefix, t as PROJECTS_CONFIG_FILE, u as getSpecialistPromptOverride, v as registerProject, x as saveProjectsConfig, y as resolveProjectFromIssue } from "./projects-CFVl4oHn.js";
2
2
  init_projects();
3
3
  export { PROJECTS_CONFIG_FILE, createDefaultProjectsConfig, extractTeamPrefix, findProjectByPath, findProjectByTeam, findProjectsByRallyProject, getIssuePrefix, getProject, getSpecialistConfig, getSpecialistPromptOverride, getSpecialistRetention, hasProjects, initializeProjectsConfig, listProjects, loadProjectsConfig, registerProject, resolveProjectFromIssue, resolveProjectPath, saveProjectsConfig, unregisterProject };
@@ -1,6 +1,7 @@
1
1
  import { n as __esmMin, o as __toESM, r as __exportAll } from "./chunk-DORXReHP.js";
2
- import { g as init_paths, s as PANOPTICON_HOME } from "./paths-COdEvoXR.js";
2
+ import { _ as init_paths, s as PANOPTICON_HOME } from "./paths-BDyJ7BiV.js";
3
3
  import { t as require_dist } from "./dist-C667LLmq.js";
4
+ import { i as parseIssueId, n as extractPrefix, r as init_issue_id } from "./issue-id-vwYJdsf8.js";
4
5
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
5
6
  import { join, resolve } from "path";
6
7
  //#region ../../lib/projects.ts
@@ -86,12 +87,12 @@ function unregisterProject(key) {
86
87
  return false;
87
88
  }
88
89
  /**
89
- * Extract Linear team prefix from an issue ID
90
- * E.g., "MIN-123" -> "MIN", "PAN-456" -> "PAN"
90
+ * Extract Linear team prefix from an issue ID.
91
+ * Supports standard (MIN-123), Rally (F29698), and custom formats.
92
+ * @deprecated Use extractPrefix from issue-id.ts for unified parsing
91
93
  */
92
94
  function extractTeamPrefix(issueId) {
93
- const match = issueId.match(/^([A-Z]+)-\d+$/i);
94
- return match ? match[1].toUpperCase() : null;
95
+ return extractPrefix(issueId);
95
96
  }
96
97
  /**
97
98
  * Find project by Linear team prefix
@@ -134,26 +135,36 @@ function resolveProjectPath(project, labels = []) {
134
135
  /**
135
136
  * Resolve project from an issue ID (and optional labels)
136
137
  *
137
- * @param issueId - Linear issue ID (e.g., "MIN-123")
138
+ * @param issueId - Issue ID in any supported format (e.g., "MIN-123", "F29698")
138
139
  * @param labels - Optional array of label names
139
140
  * @returns Resolved project info or null if not found
140
141
  */
141
142
  function resolveProjectFromIssue(issueId, labels = []) {
142
- const teamPrefix = extractTeamPrefix(issueId);
143
- if (!teamPrefix) return null;
143
+ const parsed = parseIssueId(issueId);
144
+ if (!parsed) return null;
144
145
  const config = loadProjectsConfig();
145
146
  for (const [key, projectConfig] of Object.entries(config.projects)) {
146
- if (getIssuePrefix(projectConfig)?.toUpperCase() === teamPrefix) {
147
+ const singlePrefix = getIssuePrefix(projectConfig);
148
+ if (singlePrefix?.toUpperCase() === parsed.prefix) {
147
149
  const resolvedPath = resolveProjectPath(projectConfig, labels);
148
150
  return {
149
151
  projectKey: key,
150
152
  projectName: projectConfig.name,
151
153
  projectPath: resolvedPath,
152
- linearTeam: getIssuePrefix(projectConfig)
154
+ linearTeam: singlePrefix
153
155
  };
154
156
  }
155
- if (!getIssuePrefix(projectConfig) && (projectConfig.github_repo || projectConfig.rally_project)) {
156
- if (key.toUpperCase().replace(/-/g, "") === teamPrefix) {
157
+ if (projectConfig.issue_prefixes?.some((p) => p.toUpperCase() === parsed.prefix)) {
158
+ const resolvedPath = resolveProjectPath(projectConfig, labels);
159
+ return {
160
+ projectKey: key,
161
+ projectName: projectConfig.name,
162
+ projectPath: resolvedPath,
163
+ linearTeam: projectConfig.issue_prefixes?.find((p) => p.toUpperCase() === parsed.prefix)
164
+ };
165
+ }
166
+ if (!singlePrefix && !projectConfig.issue_prefixes) {
167
+ if (key.toUpperCase().replace(/-/g, "") === parsed.prefix) {
157
168
  const resolvedPath = resolveProjectPath(projectConfig, labels);
158
169
  return {
159
170
  projectKey: key,
@@ -285,6 +296,7 @@ var import_dist, PROJECTS_CONFIG_FILE, DEFAULT_SPECIALIST_CONFIG;
285
296
  var init_projects = __esmMin((() => {
286
297
  import_dist = /* @__PURE__ */ __toESM(require_dist(), 1);
287
298
  init_paths();
299
+ init_issue_id();
288
300
  PROJECTS_CONFIG_FILE = join(PANOPTICON_HOME, "projects.yaml");
289
301
  DEFAULT_SPECIALIST_CONFIG = {
290
302
  context_runs: 5,
@@ -299,4 +311,4 @@ var init_projects = __esmMin((() => {
299
311
  //#endregion
300
312
  export { unregisterProject as S, projects_exports as _, findProjectByTeam as a, resolveProjectPath as b, getProject as c, getSpecialistRetention as d, hasProjects as f, loadProjectsConfig as g, listProjects as h, findProjectByPath as i, getSpecialistConfig as l, initializeProjectsConfig as m, createDefaultProjectsConfig as n, findProjectsByRallyProject as o, init_projects as p, extractTeamPrefix as r, getIssuePrefix as s, PROJECTS_CONFIG_FILE as t, getSpecialistPromptOverride as u, registerProject as v, saveProjectsConfig as x, resolveProjectFromIssue as y };
301
313
 
302
- //# sourceMappingURL=projects-Cq3TWdPS.js.map
314
+ //# sourceMappingURL=projects-CFVl4oHn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects-CFVl4oHn.js","names":[],"sources":["../../src/lib/projects.ts"],"sourcesContent":["/**\n * Project Registry - Multi-project support for Panopticon\n *\n * Maps Linear team prefixes and labels to project paths for workspace creation.\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { join, resolve } from 'path';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport { PANOPTICON_HOME } from './paths.js';\nimport { extractPrefix, parseIssueId } from './issue-id.js';\nimport type { QualityGateConfig } from './workspace-config.js';\n\nexport const PROJECTS_CONFIG_FILE = join(PANOPTICON_HOME, 'projects.yaml');\n\n/**\n * Issue routing rule - routes issues with certain labels to specific paths\n */\nexport interface IssueRoutingRule {\n labels?: string[];\n default?: boolean;\n path: string;\n}\n\n/**\n * Workspace configuration (imported from workspace-config.ts for full details)\n */\nexport interface WorkspaceConfig {\n type?: 'polyrepo' | 'monorepo';\n workspaces_dir?: string;\n repos?: Array<{ name: string; path: string; branch_prefix?: string }>;\n dns?: { domain: string; entries: string[]; sync_method?: 'wsl2hosts' | 'hosts_file' | 'dnsmasq' };\n ports?: Record<string, { range: [number, number] }>;\n docker?: { traefik?: string; compose_template?: string };\n database?: { seed_file?: string; container_name?: string; [key: string]: any };\n agent?: { template_dir: string; templates?: Array<{ source: string; target: string }>; copy_dirs?: string[]; symlinks?: string[] };\n env?: { template?: string; secrets_file?: string };\n services?: Array<{ name: string; path: string; start_command: string; docker_command?: string; health_url?: string; port?: number }>;\n}\n\n/**\n * Test configuration\n */\nexport interface TestConfig {\n type: string;\n path: string;\n command: string;\n container?: boolean;\n container_name?: string;\n env?: Record<string, string>;\n}\n\n/**\n * Specialist configuration for per-project specialists\n */\nexport interface SpecialistConfig {\n /** Number of recent runs to include in context digest (default: 5) */\n context_runs?: number;\n /** Model to use for generating context digests (null = same as specialist) */\n digest_model?: string | null;\n /** Log retention policy */\n retention?: {\n /** Maximum days to keep logs */\n max_days: number;\n /** Maximum number of runs to keep (whichever is more permissive) */\n max_runs: number;\n };\n /** Per-specialist prompt overrides */\n prompts?: {\n 'review-agent'?: string;\n 'test-agent'?: string;\n 'merge-agent'?: string;\n };\n}\n\n/**\n * Project configuration\n */\nexport interface ProjectConfig {\n name: string;\n path: string;\n /** Issue prefix for identifier construction (e.g., \"PAN\" → PAN-123) */\n issue_prefix?: string;\n github_repo?: string; // e.g. \"owner/repo\"\n gitlab_repo?: string; // e.g. \"group/repo\"\n /** Tracker type for this project. Affects ID parsing and state management. */\n tracker?: 'linear' | 'github' | 'gitlab' | 'rally';\n /**\n * Custom regex pattern for issue ID parsing. Must have two capture groups:\n * group 1 = prefix, group 2 = number. Example: \"^(PROJ)-(\\\\d+)$\"\n */\n issue_pattern?: string;\n /**\n * Multiple prefixes that map to this project.\n * For Rally: ['F', 'US', 'DE', 'TA'] — all artifact types route here.\n * For standard trackers: usually just one prefix via issue_prefix.\n */\n issue_prefixes?: string[];\n issue_routing?: IssueRoutingRule[];\n /** Workspace configuration */\n workspace?: WorkspaceConfig;\n /** Test configuration by name */\n tests?: Record<string, TestConfig>;\n /** Custom command to create workspaces (e.g., infra/new-feature for MYN) */\n workspace_command?: string;\n /** Custom command to remove workspaces */\n workspace_remove_command?: string;\n /** Rally project OID (e.g., \"/project/822404704163\") for per-project Rally scoping */\n rally_project?: string;\n /** Specialist agent configuration */\n specialists?: SpecialistConfig;\n /** Quality gates run by merge-agent before pushing (lint, typecheck, prod build, etc.) */\n quality_gates?: Record<string, QualityGateConfig>;\n /** Package manager for dependency installation in workspaces (bun, npm, pnpm) */\n package_manager?: 'bun' | 'npm' | 'pnpm';\n /** Local workspace packages that need building before quality gates (e.g., @panopticon/contracts) */\n workspace_packages?: Array<{ path: string; build_command: string }>;\n /**\n * Path to the repo where per-project cost WAL files live.\n * Defaults to `path` (the project repo itself).\n * For polyrepo setups, point this at the docs/shared repo.\n */\n events_repo?: string;\n /**\n * Subdirectory within events_repo where cost JSONL files are stored.\n * Defaults to \".pan/events\".\n */\n events_path?: string;\n}\n\n/** Resolve the issue prefix for a project. */\nexport function getIssuePrefix(config: ProjectConfig): string | undefined {\n return config.issue_prefix;\n}\n\n/**\n * Full projects configuration file\n */\nexport interface ProjectsConfig {\n projects: Record<string, ProjectConfig>;\n}\n\n/**\n * Resolved project info for workspace creation\n */\nexport interface ResolvedProject {\n projectKey: string;\n projectName: string;\n projectPath: string;\n linearTeam?: string;\n}\n\n/**\n * Load projects configuration from ~/.panopticon/projects.yaml\n */\nexport function loadProjectsConfig(): ProjectsConfig {\n if (!existsSync(PROJECTS_CONFIG_FILE)) {\n return { projects: {} };\n }\n\n try {\n const content = readFileSync(PROJECTS_CONFIG_FILE, 'utf-8');\n const config = parseYaml(content) as ProjectsConfig;\n return config || { projects: {} };\n } catch (error: any) {\n console.error(`Failed to parse projects.yaml: ${error.message}`);\n return { projects: {} };\n }\n}\n\n/**\n * Save projects configuration\n */\nexport function saveProjectsConfig(config: ProjectsConfig): void {\n const dir = PANOPTICON_HOME;\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n const yaml = stringifyYaml(config, { indent: 2 });\n writeFileSync(PROJECTS_CONFIG_FILE, yaml, 'utf-8');\n}\n\n/**\n * Get a list of all registered projects\n */\nexport function listProjects(): Array<{ key: string; config: ProjectConfig }> {\n const config = loadProjectsConfig();\n return Object.entries(config.projects).map(([key, projectConfig]) => ({\n key,\n config: projectConfig,\n }));\n}\n\n/**\n * Add or update a project in the registry\n */\nexport function registerProject(key: string, projectConfig: ProjectConfig): void {\n const config = loadProjectsConfig();\n config.projects[key] = projectConfig;\n saveProjectsConfig(config);\n}\n\n/**\n * Remove a project from the registry\n */\nexport function unregisterProject(key: string): boolean {\n const config = loadProjectsConfig();\n if (config.projects[key]) {\n delete config.projects[key];\n saveProjectsConfig(config);\n return true;\n }\n return false;\n}\n\n/**\n * Extract Linear team prefix from an issue ID.\n * Supports standard (MIN-123), Rally (F29698), and custom formats.\n * @deprecated Use extractPrefix from issue-id.ts for unified parsing\n */\nexport function extractTeamPrefix(issueId: string): string | null {\n return extractPrefix(issueId);\n}\n\n/**\n * Find project by Linear team prefix\n */\nexport function findProjectByTeam(teamPrefix: string): ProjectConfig | null {\n const config = loadProjectsConfig();\n\n for (const [, projectConfig] of Object.entries(config.projects)) {\n if (getIssuePrefix(projectConfig)?.toUpperCase() === teamPrefix.toUpperCase()) {\n return projectConfig;\n }\n }\n\n return null;\n}\n\n/**\n * Find project by workspace path.\n * Matches any project whose root path is an ancestor of the given path.\n * Used to resolve the tracker (GitHub/GitLab) from a workspace directory.\n */\nexport function findProjectByPath(workspacePath: string): ProjectConfig | null {\n const config = loadProjectsConfig();\n const normalizedTarget = resolve(workspacePath);\n\n for (const [, projectConfig] of Object.entries(config.projects)) {\n const normalizedProject = resolve(projectConfig.path);\n if (normalizedTarget === normalizedProject || normalizedTarget.startsWith(normalizedProject + '/')) {\n return projectConfig;\n }\n }\n\n return null;\n}\n\n\n/**\n * Resolve the correct project path for an issue based on labels\n *\n * @param project - The project config\n * @param labels - Array of label names from the Linear issue\n * @returns The resolved path (may differ from project.path based on routing rules)\n */\nexport function resolveProjectPath(project: ProjectConfig, labels: string[] = []): string {\n if (!project.issue_routing || project.issue_routing.length === 0) {\n return project.path;\n }\n\n // Normalize labels to lowercase for comparison\n const normalizedLabels = labels.map(l => l.toLowerCase());\n\n // First, check label-based routing rules\n for (const rule of project.issue_routing) {\n if (rule.labels && rule.labels.length > 0) {\n const ruleLabels = rule.labels.map(l => l.toLowerCase());\n const hasMatch = ruleLabels.some(label => normalizedLabels.includes(label));\n if (hasMatch) {\n return rule.path;\n }\n }\n }\n\n // Then, find default rule\n for (const rule of project.issue_routing) {\n if (rule.default) {\n return rule.path;\n }\n }\n\n // Fall back to project path\n return project.path;\n}\n\n/**\n * Resolve project from an issue ID (and optional labels)\n *\n * @param issueId - Issue ID in any supported format (e.g., \"MIN-123\", \"F29698\")\n * @param labels - Optional array of label names\n * @returns Resolved project info or null if not found\n */\nexport function resolveProjectFromIssue(\n issueId: string,\n labels: string[] = []\n): ResolvedProject | null {\n const parsed = parseIssueId(issueId);\n if (!parsed) {\n return null;\n }\n\n const config = loadProjectsConfig();\n\n for (const [key, projectConfig] of Object.entries(config.projects)) {\n // Check single issue_prefix (existing behavior)\n const singlePrefix = getIssuePrefix(projectConfig);\n if (singlePrefix?.toUpperCase() === parsed.prefix) {\n const resolvedPath = resolveProjectPath(projectConfig, labels);\n return {\n projectKey: key,\n projectName: projectConfig.name,\n projectPath: resolvedPath,\n linearTeam: singlePrefix,\n };\n }\n\n // Check issue_prefixes array (new: multiple prefixes per project)\n if (projectConfig.issue_prefixes?.some(p => p.toUpperCase() === parsed.prefix)) {\n const resolvedPath = resolveProjectPath(projectConfig, labels);\n return {\n projectKey: key,\n projectName: projectConfig.name,\n projectPath: resolvedPath,\n linearTeam: projectConfig.issue_prefixes?.find(p => p.toUpperCase() === parsed.prefix),\n };\n }\n\n // Fallback: derive prefix from project key for projects without explicit prefixes\n if (!singlePrefix && !projectConfig.issue_prefixes) {\n const derivedPrefix = key.toUpperCase().replace(/-/g, '');\n if (derivedPrefix === parsed.prefix) {\n const resolvedPath = resolveProjectPath(projectConfig, labels);\n return {\n projectKey: key,\n projectName: projectConfig.name,\n projectPath: resolvedPath,\n linearTeam: undefined,\n };\n }\n }\n }\n\n return null;\n}\n\n/**\n * Get a project by key\n */\nexport function getProject(key: string): ProjectConfig | null {\n const config = loadProjectsConfig();\n return config.projects[key] || null;\n}\n\n/**\n * Check if projects.yaml exists and has any projects\n */\nexport function hasProjects(): boolean {\n const config = loadProjectsConfig();\n return Object.keys(config.projects).length > 0;\n}\n\n/**\n * Create a default projects.yaml with example structure\n */\nexport function createDefaultProjectsConfig(): ProjectsConfig {\n const defaultConfig: ProjectsConfig = {\n projects: {\n // Example project - commented out in actual file\n },\n };\n\n return defaultConfig;\n}\n\n/**\n * Initialize projects.yaml with example configuration\n */\nexport function initializeProjectsConfig(): void {\n if (existsSync(PROJECTS_CONFIG_FILE)) {\n console.log(`Projects config already exists at ${PROJECTS_CONFIG_FILE}`);\n return;\n }\n\n const exampleYaml = `# Panopticon Project Registry\n# Maps Linear teams to project paths for workspace creation\n\nprojects:\n # Example: Mind Your Now project\n # myn:\n # name: \"Mind Your Now\"\n # path: /home/user/projects/myn\n # linear_team: MIN\n # issue_routing:\n # # Route docs/marketing issues to docs repo\n # - labels: [docs, marketing, seo, landing-pages]\n # path: /home/user/projects/myn/docs\n # # Default: main repo\n # - default: true\n # path: /home/user/projects/myn\n # specialists:\n # context_runs: 5\n # digest_model: null # Use same model as specialist\n # retention:\n # max_days: 30\n # max_runs: 50\n # prompts:\n # review-agent: |\n # Pay special attention to:\n # - Database migration safety\n # - API backward compatibility\n\n # Example: Panopticon itself\n # panopticon:\n # name: \"Panopticon\"\n # path: /home/user/projects/panopticon\n # linear_team: PAN\n`;\n\n const dir = PANOPTICON_HOME;\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n writeFileSync(PROJECTS_CONFIG_FILE, exampleYaml, 'utf-8');\n console.log(`Created example projects config at ${PROJECTS_CONFIG_FILE}`);\n}\n\n/**\n * Default specialist configuration values\n */\nconst DEFAULT_SPECIALIST_CONFIG: Required<SpecialistConfig> = {\n context_runs: 5,\n digest_model: null,\n retention: {\n max_days: 30,\n max_runs: 50,\n },\n prompts: {},\n};\n\n/**\n * Get specialist configuration for a project with defaults\n *\n * @param projectKey - Project key\n * @returns Specialist config with defaults applied\n */\nexport function getSpecialistConfig(projectKey: string): Required<SpecialistConfig> {\n const project = getProject(projectKey);\n\n if (!project || !project.specialists) {\n return DEFAULT_SPECIALIST_CONFIG;\n }\n\n return {\n context_runs: project.specialists.context_runs ?? DEFAULT_SPECIALIST_CONFIG.context_runs,\n digest_model: project.specialists.digest_model ?? DEFAULT_SPECIALIST_CONFIG.digest_model,\n retention: {\n max_days: project.specialists.retention?.max_days ?? DEFAULT_SPECIALIST_CONFIG.retention.max_days,\n max_runs: project.specialists.retention?.max_runs ?? DEFAULT_SPECIALIST_CONFIG.retention.max_runs,\n },\n prompts: project.specialists.prompts ?? DEFAULT_SPECIALIST_CONFIG.prompts,\n };\n}\n\n/**\n * Get retention policy for a project's specialists\n *\n * @param projectKey - Project key\n * @returns Retention policy\n */\nexport function getSpecialistRetention(projectKey: string): { max_days: number; max_runs: number } {\n const config = getSpecialistConfig(projectKey);\n return config.retention;\n}\n\n/**\n * Find all projects that have a rally_project configured.\n * Returns array of { key, config } for projects with Rally project OIDs.\n */\nexport function findProjectsByRallyProject(): Array<{ key: string; config: ProjectConfig }> {\n const config = loadProjectsConfig();\n return Object.entries(config.projects)\n .filter(([, projectConfig]) => !!projectConfig.rally_project)\n .map(([key, projectConfig]) => ({ key, config: projectConfig }));\n}\n\n/**\n * Get custom prompt override for a specialist (if configured)\n *\n * @param projectKey - Project key\n * @param specialistType - Specialist type\n * @returns Custom prompt or null if not configured\n */\nexport function getSpecialistPromptOverride(\n projectKey: string,\n specialistType: string\n): string | null {\n const config = getSpecialistConfig(projectKey);\n return (config.prompts as Record<string, string | undefined>)[specialistType] || null;\n}\n"],"mappings":"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"}
@@ -27,7 +27,7 @@ function getProviderForModel(modelId) {
27
27
  "gpt-4o-mini"
28
28
  ].includes(modelId)) return PROVIDERS.openai;
29
29
  if (["gemini-3-pro-preview", "gemini-3-flash-preview"].includes(modelId)) return PROVIDERS.google;
30
- if (["glm-4.7", "glm-4.7-flash"].includes(modelId)) return PROVIDERS.zai;
30
+ if (["glm-4.7-flash"].includes(modelId)) return PROVIDERS.zai;
31
31
  if (["kimi-k2", "kimi-k2.5"].includes(modelId)) return PROVIDERS.kimi;
32
32
  if (["minimax-m2.7", "minimax-m2.7-highspeed"].includes(modelId)) return PROVIDERS.minimax;
33
33
  return PROVIDERS.anthropic;
@@ -121,9 +121,9 @@ var init_providers = __esmMin((() => {
121
121
  displayName: "Z.AI (GLM)",
122
122
  compatibility: "direct",
123
123
  baseUrl: "https://api.z.ai/api/anthropic",
124
- models: ["glm-4.7", "glm-4.7-flash"],
124
+ models: ["glm-4.7-flash"],
125
125
  tested: true,
126
- description: "Anthropic-compatible API, tested 2026-01-28"
126
+ description: "Anthropic-compatible API, GLM-4.7 Flash (31B, fast and affordable)"
127
127
  },
128
128
  openai: {
129
129
  name: "openai",
@@ -169,4 +169,4 @@ var init_providers = __esmMin((() => {
169
169
  //#endregion
170
170
  export { init_providers as a, getProviderForModel as i, clearCredentialFileAuth as n, setupCredentialFileAuth as o, getProviderEnv as r, PROVIDERS as t };
171
171
 
172
- //# sourceMappingURL=providers-Ck2sQd_F.js.map
172
+ //# sourceMappingURL=providers-B5Y4H2Mg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers-B5Y4H2Mg.js","names":[],"sources":["../../src/lib/providers.ts"],"sourcesContent":["/**\r\n * Provider Configuration and Compatibility\r\n *\r\n * Defines which LLM providers are compatible with Claude Code's API format.\r\n * - Direct providers: Implement Anthropic-compatible API (no router needed)\r\n * - Router providers: Require claude-code-router for API translation\r\n */\r\n\r\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';\r\nimport { join } from 'path';\r\nimport type { ModelId, AnthropicModel, OpenAIModel, GoogleModel, ZAIModel, MiniMaxModel } from './settings.js';\r\n\r\nexport type ProviderName = 'anthropic' | 'kimi' | 'openai' | 'google' | 'zai' | 'minimax' | 'openrouter';\r\n\r\n/**\r\n * Provider compatibility types\r\n * - direct: Anthropic-compatible API, use ANTHROPIC_BASE_URL directly\r\n * - router: Incompatible API, requires claude-code-router for translation\r\n */\r\nexport type ProviderCompatibility = 'direct' | 'router';\r\n\r\n/**\r\n * Provider configuration\r\n */\r\n/**\r\n * Auth type for direct providers:\r\n * - static: Use a long-lived API key passed via ANTHROPIC_AUTH_TOKEN (default)\r\n * - credential-file: Use apiKeyHelper to read a fresh token from a credential file.\r\n * Used for providers like Kimi Code Plan whose JWT tokens expire every ~15 minutes.\r\n */\r\nexport type ProviderAuthType = 'static' | 'credential-file';\r\n\r\nexport interface ProviderConfig {\r\n name: ProviderName;\r\n displayName: string;\r\n compatibility: ProviderCompatibility;\r\n baseUrl?: string; // For direct providers\r\n authType?: ProviderAuthType; // Defaults to 'static'\r\n credentialFile?: string; // Path to credential file (for 'credential-file' auth)\r\n credentialHelper?: string; // Script that reads credential file and prints token\r\n models: ModelId[];\r\n tested: boolean; // Whether compatibility has been verified\r\n description: string;\r\n}\r\n\r\n/**\r\n * All provider configurations\r\n */\r\nexport const PROVIDERS: Record<ProviderName, ProviderConfig> = {\r\n anthropic: {\r\n name: 'anthropic',\r\n displayName: 'Anthropic',\r\n compatibility: 'direct',\r\n models: ['claude-opus-4-6', 'claude-sonnet-4-6', 'claude-sonnet-4-5', 'claude-haiku-4-5'],\r\n tested: true,\r\n description: 'Native Claude API',\r\n },\r\n\r\n kimi: {\r\n name: 'kimi',\r\n displayName: 'Kimi (Moonshot AI)',\r\n compatibility: 'direct',\r\n baseUrl: 'https://api.kimi.com/coding/',\r\n authType: 'credential-file',\r\n credentialFile: '~/.kimi/credentials/kimi-code.json',\r\n credentialHelper: '~/.panopticon/bin/kimi-token-helper.sh',\r\n models: [], // Kimi uses same model names as Anthropic\r\n tested: true,\r\n description: 'Anthropic-compatible API via Kimi Code Plan (OAuth token refresh)',\r\n },\r\n\r\n zai: {\r\n name: 'zai',\r\n displayName: 'Z.AI (GLM)',\r\n compatibility: 'direct',\r\n baseUrl: 'https://api.z.ai/api/anthropic',\r\n models: ['glm-4.7-flash'],\r\n tested: true,\r\n description: 'Anthropic-compatible API, GLM-4.7 Flash (31B, fast and affordable)',\r\n },\r\n\r\n openai: {\r\n name: 'openai',\r\n displayName: 'OpenAI',\r\n compatibility: 'router',\r\n models: ['gpt-5.2-codex', 'o3-deep-research', 'gpt-4o', 'gpt-4o-mini'],\r\n tested: false,\r\n description: 'Requires claude-code-router for API translation',\r\n },\r\n\r\n google: {\r\n name: 'google',\r\n displayName: 'Google (Gemini)',\r\n compatibility: 'router',\r\n models: ['gemini-3-pro-preview', 'gemini-3-flash-preview'],\r\n tested: false,\r\n description: 'Requires claude-code-router for API translation',\r\n },\r\n\r\n minimax: {\r\n name: 'minimax',\r\n displayName: 'MiniMax',\r\n compatibility: 'direct',\r\n baseUrl: 'https://api.minimax.io/anthropic',\r\n models: ['minimax-m2.7', 'minimax-m2.7-highspeed'],\r\n tested: true,\r\n description: 'Anthropic-compatible API, 10B active params, 100 tps highspeed variant',\r\n },\r\n\r\n openrouter: {\r\n name: 'openrouter',\r\n displayName: 'OpenRouter',\r\n compatibility: 'direct',\r\n baseUrl: 'https://openrouter.ai/api',\r\n models: [], // Dynamic models fetched from OpenRouter API; IDs contain '/'\r\n tested: true,\r\n description: 'Anthropic-compatible API aggregator. Model IDs contain \\'/\\' (e.g. qwen/qwen3.6-plus:free)',\r\n },\r\n};\r\n\r\n/**\r\n * Get provider for a given model ID\r\n */\r\nexport function getProviderForModel(modelId: ModelId | string): ProviderConfig {\r\n // OpenRouter model IDs always contain '/' (e.g. 'qwen/qwen3.6-plus:free')\r\n if (modelId.includes('/')) {\r\n return PROVIDERS.openrouter;\r\n }\r\n\r\n // Check Anthropic models\r\n if (['claude-opus-4-6', 'claude-sonnet-4-6', 'claude-sonnet-4-5', 'claude-haiku-4-5'].includes(modelId)) {\r\n return PROVIDERS.anthropic;\r\n }\r\n\r\n // Check OpenAI models\r\n if (['gpt-5.2-codex', 'o3-deep-research', 'gpt-4o', 'gpt-4o-mini'].includes(modelId)) {\r\n return PROVIDERS.openai;\r\n }\r\n\r\n // Check Google models\r\n if (['gemini-3-pro-preview', 'gemini-3-flash-preview'].includes(modelId)) {\r\n return PROVIDERS.google;\r\n }\r\n\r\n // Check Z.AI models\r\n if (['glm-4.7-flash'].includes(modelId)) {\r\n return PROVIDERS.zai;\r\n }\r\n\r\n // Check Kimi models\r\n if (['kimi-k2', 'kimi-k2.5'].includes(modelId)) {\r\n return PROVIDERS.kimi;\r\n }\r\n\r\n // Check MiniMax models\r\n if (['minimax-m2.7', 'minimax-m2.7-highspeed'].includes(modelId)) {\r\n return PROVIDERS.minimax;\r\n }\r\n\r\n // Default to Anthropic if unknown\r\n return PROVIDERS.anthropic;\r\n}\r\n\r\n/**\r\n * Check if a provider requires claude-code-router\r\n */\r\nexport function requiresRouter(provider: ProviderName): boolean {\r\n return PROVIDERS[provider].compatibility === 'router';\r\n}\r\n\r\n/**\r\n * Get all providers that require router (have router compatibility)\r\n */\r\nexport function getRouterProviders(): ProviderConfig[] {\r\n return Object.values(PROVIDERS).filter(p => p.compatibility === 'router');\r\n}\r\n\r\n/**\r\n * Get all direct-compatible providers\r\n */\r\nexport function getDirectProviders(): ProviderConfig[] {\r\n return Object.values(PROVIDERS).filter(p => p.compatibility === 'direct');\r\n}\r\n\r\n/**\r\n * Check if any configured providers require router\r\n * Used to determine if router installation is needed\r\n */\r\nexport function needsRouter(apiKeys: { openai?: string; google?: string; zai?: string }): boolean {\r\n return !!(apiKeys.openai || apiKeys.google);\r\n}\r\n\r\n/**\r\n * Get environment variables for spawning agent with specific provider\r\n */\r\nexport function getProviderEnv(\r\n provider: ProviderConfig,\r\n apiKey: string\r\n): Record<string, string> {\r\n if (provider.compatibility === 'direct') {\r\n // Direct providers use ANTHROPIC_BASE_URL\r\n const env: Record<string, string> = {};\r\n\r\n if (provider.baseUrl) {\r\n env.ANTHROPIC_BASE_URL = provider.baseUrl;\r\n }\r\n\r\n if (provider.name !== 'anthropic') {\r\n if (provider.authType === 'credential-file') {\r\n // Credential-file providers use apiKeyHelper for dynamic token refresh.\r\n // We still need an initial ANTHROPIC_AUTH_TOKEN for the first request,\r\n // but apiKeyHelper (configured via setupCredentialFileAuth) will keep it fresh.\r\n env.ANTHROPIC_AUTH_TOKEN = apiKey;\r\n // Refresh token every 60 seconds (kimi-cli refreshes credential file automatically)\r\n env.CLAUDE_CODE_API_KEY_HELPER_TTL_MS = '60000';\r\n } else {\r\n // Static providers use a long-lived API key\r\n env.ANTHROPIC_AUTH_TOKEN = apiKey;\r\n }\r\n }\r\n\r\n // Z.AI recommends longer timeout\r\n if (provider.name === 'zai') {\r\n env.API_TIMEOUT_MS = '300000';\r\n }\r\n\r\n return env;\r\n } else {\r\n // Router providers use local router proxy\r\n return {\r\n ANTHROPIC_BASE_URL: 'http://localhost:3456',\r\n ANTHROPIC_AUTH_TOKEN: 'router-managed',\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * For credential-file providers (e.g. Kimi Code Plan), configure Claude Code's\r\n * apiKeyHelper in the workspace settings so tokens are refreshed dynamically.\r\n *\r\n * This writes to .claude/settings.local.json in the workspace directory.\r\n * Must be called before spawning the agent.\r\n */\r\nexport function setupCredentialFileAuth(provider: ProviderConfig, workspacePath: string): void {\r\n if (provider.authType !== 'credential-file' || !provider.credentialHelper) return;\r\n\r\n const helperPath = provider.credentialHelper.replace('~', process.env.HOME || '');\r\n const claudeDir = join(workspacePath, '.claude');\r\n const settingsPath = join(claudeDir, 'settings.local.json');\r\n\r\n if (!existsSync(claudeDir)) {\r\n mkdirSync(claudeDir, { recursive: true });\r\n }\r\n\r\n // Read existing settings or start fresh\r\n let settings: Record<string, unknown> = {};\r\n if (existsSync(settingsPath)) {\r\n try {\r\n settings = JSON.parse(readFileSync(settingsPath, 'utf-8'));\r\n } catch { /* start fresh */ }\r\n }\r\n\r\n // Set the apiKeyHelper to our token reader script\r\n settings.apiKeyHelper = helperPath;\r\n\r\n writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\\n');\r\n}\r\n\r\n/**\r\n * Clear credential-file auth from workspace settings.\r\n *\r\n * When switching from a credential-file provider (e.g. Kimi) to a static/plan-based\r\n * provider (e.g. Anthropic), the apiKeyHelper must be removed from\r\n * .claude/settings.local.json. Otherwise Claude Code will keep using the stale\r\n * token helper and fail with \"Invalid API key\".\r\n */\r\nexport function clearCredentialFileAuth(workspacePath: string): void {\r\n const settingsPath = join(workspacePath, '.claude', 'settings.local.json');\r\n if (!existsSync(settingsPath)) return;\r\n\r\n try {\r\n const settings = JSON.parse(readFileSync(settingsPath, 'utf-8'));\r\n if (!settings.apiKeyHelper) return; // Nothing to clear\r\n\r\n delete settings.apiKeyHelper;\r\n writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\\n');\r\n } catch { /* non-fatal */ }\r\n}\r\n"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- import { a as init_providers, i as getProviderForModel, r as getProviderEnv } from "./providers-Ck2sQd_F.js";
1
+ import { a as init_providers, i as getProviderForModel, r as getProviderEnv } from "./providers-B5Y4H2Mg.js";
2
2
  init_providers();
3
3
  export { getProviderEnv, getProviderForModel };
@@ -1,5 +1,5 @@
1
1
  const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/angular-html-Bp1-8yw7.js","assets/chunk-BEqpzyXh.js","assets/html-Dv3DVnHr.js","assets/css-BuARR_Qb.js","assets/javascript-DBCnrPrR.js","assets/angular-ts-Dc47XLpQ.js","assets/scss-Dl8-fX0q.js","assets/apl-BCQk3spK.js","assets/json-CdZYVWSM.js","assets/xml-C-aQor-e.js","assets/java-2Xsuzsw1.js","assets/astro-BPbMyfm1.js","assets/postcss-cZXfRCsF.js","assets/tsx-CwF67eOq.js","assets/typescript-BB21Zsih.js","assets/blade-Bij-_yC5.js","assets/html-derivative-tSjEs4-0.js","assets/sql-DZn-UGGv.js","assets/bsl-BODK--Fo.js","assets/sdbl-DOe8Nral.js","assets/c-oKNVj2rl.js","assets/cairo-BwpHIzLA.js","assets/python-BLpCXkJ6.js","assets/cobol-Dg5kg7hv.js","assets/coffee-3hfizWZM.js","assets/cpp-ULE387nU.js","assets/glsl-QoOzy-_r.js","assets/regexp-BloNfp_x.js","assets/crystal-Re5Pqbq7.js","assets/shellscript-CO-naGHU.js","assets/edge-CVs6JuhO.js","assets/elixir-vVBUmtB0.js","assets/elm-CJ1l6IcG.js","assets/erb-BhwFSwKc.js","assets/ruby-D9aJDC0S.js","assets/graphql-kqsYmXmx.js","assets/jsx-Dp3qsTLF.js","assets/haml-BQPi0z1w.js","assets/lua-BK1ZG2EC.js","assets/yaml-DkgEEdrA.js","assets/erlang-CjZU-VwD.js","assets/markdown-BFgBvytj.js","assets/fortran-fixed-form-CLgNuKMV.js","assets/fortran-free-form-CHQXX5JB.js","assets/fsharp-kVgJ9XJy.js","assets/gdresource-DDsMuL8p.js","assets/gdscript-DBkVGsC6.js","assets/gdshader-CWQhZP7Q.js","assets/git-commit-BKhxSJdF.js","assets/diff-G5H-0DNT.js","assets/git-rebase-f38O1g3a.js","assets/glimmer-js-ZD1Yvd1q.js","assets/glimmer-ts-bAi6wGX7.js","assets/hack-BgMu5Ipy.js","assets/handlebars-DPV5gbtW.js","assets/http-C4ysT5sQ.js","assets/hurl-DFMpPkw5.js","assets/csv-DPc9UZFt.js","assets/hxml-YehGxZ3T.js","assets/haxe-md5t_Y_E.js","assets/jinja-D5k2aV6r.js","assets/jison-DxRKYMci.js","assets/julia-C71yEfU9.js","assets/r-Oz8OzNPF.js","assets/just-CFLnnO7_.js","assets/perl-DhyBeoYG.js","assets/latex-vlM3VFwL.js","assets/tex-s1kBmY2H.js","assets/liquid-BfMw2dPx.js","assets/marko-C-FzIztO.js","assets/less-DwUMKQAG.js","assets/mdc-CpYiOYsD.js","assets/nextflow-C2lnptGp.js","assets/nextflow-groovy-DXLl8k8E.js","assets/nginx-C_FN4HXw.js","assets/nim-BsyQONjY.js","assets/php-CX--GDqC.js","assets/pug-BD4sRivj.js","assets/qml-CF1x2Id3.js","assets/razor-CIpRog1G.js","assets/csharp-BLhQzhUA.js","assets/rst-DEqAwrfS.js","assets/cmake-BmC4o4J9.js","assets/sas-D4Fr9SDG.js","assets/shaderlab-CCgEvKkt.js","assets/hlsl-CFf5czm3.js","assets/shellsession-Bh4VveDi.js","assets/soy-Cu-kYJAO.js","assets/sparql-DH0hFmAi.js","assets/turtle-BKcRDROw.js","assets/stata-BZdocy0T.js","assets/surrealql-D3TMbWym.js","assets/svelte-CD-ilbSU.js","assets/templ-DH5iy6rc.js","assets/go-DC_Zm44P.js","assets/ts-tags-CEZNZHfQ.js","assets/twig-D57SzOSi.js","assets/vue-B6oogzWX.js","assets/vue-html-v0GYjc-r.js","assets/vue-vine-CeA42ICb.js","assets/stylus-D69is74S.js","assets/xsl-C0dvDCZw.js"])))=>i.map(i=>d[i]);
2
- import{a as e,c as t,i as n,n as r,o as i,r as a,s as o,t as s}from"./index-yarWhi0M.js";var c={}.hasOwnProperty;function l(e,t){let n=t||{};function r(t,...n){let i=r.invalid,a=r.handlers;if(t&&c.call(t,e)){let n=String(t[e]);i=c.call(a,n)?a[n]:r.unknown}if(i)return i.call(this,t,...n)}return r.handlers=n.handlers||{},r.invalid=n.invalid,r.unknown=n.unknown,r}var u=[`area`,`base`,`basefont`,`bgsound`,`br`,`col`,`command`,`embed`,`frame`,`hr`,`image`,`img`,`input`,`keygen`,`link`,`meta`,`param`,`source`,`track`,`wbr`],d=/["&'<>`]/g,f=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,p=/[\x01-\t\v\f\x0E-\x1F\x7F\x81\x8D\x8F\x90\x9D\xA0-\uFFFF]/g,m=/[|\\{}()[\]^$+*?.]/g,h=new WeakMap;function g(e,t){if(e=e.replace(t.subset?_(t.subset):d,r),t.subset||t.escapeOnly)return e;return e.replace(f,n).replace(p,r);function n(e,n,r){return t.format((e.charCodeAt(0)-55296)*1024+e.charCodeAt(1)-56320+65536,r.charCodeAt(n+2),t)}function r(e,n,r){return t.format(e.charCodeAt(0),r.charCodeAt(n+1),t)}}function _(e){let t=h.get(e);return t||(t=ee(e),h.set(e,t)),t}function ee(e){let t=[],n=-1;for(;++n<e.length;)t.push(e[n].replace(m,`\\$&`));return RegExp(`(?:`+t.join(`|`)+`)`,`g`)}var te=/[\dA-Fa-f]/;function ne(e,t,n){let r=`&#x`+e.toString(16).toUpperCase();return n&&t&&!te.test(String.fromCharCode(t))?r:r+`;`}var re=/\d/;function ie(e,t,n){let r=`&#`+String(e);return n&&t&&!re.test(String.fromCharCode(t))?r:r+`;`}var ae=`AElig.AMP.Aacute.Acirc.Agrave.Aring.Atilde.Auml.COPY.Ccedil.ETH.Eacute.Ecirc.Egrave.Euml.GT.Iacute.Icirc.Igrave.Iuml.LT.Ntilde.Oacute.Ocirc.Ograve.Oslash.Otilde.Ouml.QUOT.REG.THORN.Uacute.Ucirc.Ugrave.Uuml.Yacute.aacute.acirc.acute.aelig.agrave.amp.aring.atilde.auml.brvbar.ccedil.cedil.cent.copy.curren.deg.divide.eacute.ecirc.egrave.eth.euml.frac12.frac14.frac34.gt.iacute.icirc.iexcl.igrave.iquest.iuml.laquo.lt.macr.micro.middot.nbsp.not.ntilde.oacute.ocirc.ograve.ordf.ordm.oslash.otilde.ouml.para.plusmn.pound.quot.raquo.reg.sect.shy.sup1.sup2.sup3.szlig.thorn.times.uacute.ucirc.ugrave.uml.uuml.yacute.yen.yuml`.split(`.`),oe={nbsp:`\xA0`,iexcl:`¡`,cent:`¢`,pound:`£`,curren:`¤`,yen:`¥`,brvbar:`¦`,sect:`§`,uml:`¨`,copy:`©`,ordf:`ª`,laquo:`«`,not:`¬`,shy:`­`,reg:`®`,macr:`¯`,deg:`°`,plusmn:`±`,sup2:`²`,sup3:`³`,acute:`´`,micro:`µ`,para:`¶`,middot:`·`,cedil:`¸`,sup1:`¹`,ordm:`º`,raquo:`»`,frac14:`¼`,frac12:`½`,frac34:`¾`,iquest:`¿`,Agrave:`À`,Aacute:`Á`,Acirc:`Â`,Atilde:`Ã`,Auml:`Ä`,Aring:`Å`,AElig:`Æ`,Ccedil:`Ç`,Egrave:`È`,Eacute:`É`,Ecirc:`Ê`,Euml:`Ë`,Igrave:`Ì`,Iacute:`Í`,Icirc:`Î`,Iuml:`Ï`,ETH:`Ð`,Ntilde:`Ñ`,Ograve:`Ò`,Oacute:`Ó`,Ocirc:`Ô`,Otilde:`Õ`,Ouml:`Ö`,times:`×`,Oslash:`Ø`,Ugrave:`Ù`,Uacute:`Ú`,Ucirc:`Û`,Uuml:`Ü`,Yacute:`Ý`,THORN:`Þ`,szlig:`ß`,agrave:`à`,aacute:`á`,acirc:`â`,atilde:`ã`,auml:`ä`,aring:`å`,aelig:`æ`,ccedil:`ç`,egrave:`è`,eacute:`é`,ecirc:`ê`,euml:`ë`,igrave:`ì`,iacute:`í`,icirc:`î`,iuml:`ï`,eth:`ð`,ntilde:`ñ`,ograve:`ò`,oacute:`ó`,ocirc:`ô`,otilde:`õ`,ouml:`ö`,divide:`÷`,oslash:`ø`,ugrave:`ù`,uacute:`ú`,ucirc:`û`,uuml:`ü`,yacute:`ý`,thorn:`þ`,yuml:`ÿ`,fnof:`ƒ`,Alpha:`Α`,Beta:`Β`,Gamma:`Γ`,Delta:`Δ`,Epsilon:`Ε`,Zeta:`Ζ`,Eta:`Η`,Theta:`Θ`,Iota:`Ι`,Kappa:`Κ`,Lambda:`Λ`,Mu:`Μ`,Nu:`Ν`,Xi:`Ξ`,Omicron:`Ο`,Pi:`Π`,Rho:`Ρ`,Sigma:`Σ`,Tau:`Τ`,Upsilon:`Υ`,Phi:`Φ`,Chi:`Χ`,Psi:`Ψ`,Omega:`Ω`,alpha:`α`,beta:`β`,gamma:`γ`,delta:`δ`,epsilon:`ε`,zeta:`ζ`,eta:`η`,theta:`θ`,iota:`ι`,kappa:`κ`,lambda:`λ`,mu:`μ`,nu:`ν`,xi:`ξ`,omicron:`ο`,pi:`π`,rho:`ρ`,sigmaf:`ς`,sigma:`σ`,tau:`τ`,upsilon:`υ`,phi:`φ`,chi:`χ`,psi:`ψ`,omega:`ω`,thetasym:`ϑ`,upsih:`ϒ`,piv:`ϖ`,bull:`•`,hellip:`…`,prime:`′`,Prime:`″`,oline:`‾`,frasl:`⁄`,weierp:`℘`,image:`ℑ`,real:`ℜ`,trade:`™`,alefsym:`ℵ`,larr:`←`,uarr:`↑`,rarr:`→`,darr:`↓`,harr:`↔`,crarr:`↵`,lArr:`⇐`,uArr:`⇑`,rArr:`⇒`,dArr:`⇓`,hArr:`⇔`,forall:`∀`,part:`∂`,exist:`∃`,empty:`∅`,nabla:`∇`,isin:`∈`,notin:`∉`,ni:`∋`,prod:`∏`,sum:`∑`,minus:`−`,lowast:`∗`,radic:`√`,prop:`∝`,infin:`∞`,ang:`∠`,and:`∧`,or:`∨`,cap:`∩`,cup:`∪`,int:`∫`,there4:`∴`,sim:`∼`,cong:`≅`,asymp:`≈`,ne:`≠`,equiv:`≡`,le:`≤`,ge:`≥`,sub:`⊂`,sup:`⊃`,nsub:`⊄`,sube:`⊆`,supe:`⊇`,oplus:`⊕`,otimes:`⊗`,perp:`⊥`,sdot:`⋅`,lceil:`⌈`,rceil:`⌉`,lfloor:`⌊`,rfloor:`⌋`,lang:`〈`,rang:`〉`,loz:`◊`,spades:`♠`,clubs:`♣`,hearts:`♥`,diams:`♦`,quot:`"`,amp:`&`,lt:`<`,gt:`>`,OElig:`Œ`,oelig:`œ`,Scaron:`Š`,scaron:`š`,Yuml:`Ÿ`,circ:`ˆ`,tilde:`˜`,ensp:` `,emsp:` `,thinsp:` `,zwnj:`‌`,zwj:`‍`,lrm:`‎`,rlm:`‏`,ndash:`–`,mdash:`—`,lsquo:`‘`,rsquo:`’`,sbquo:`‚`,ldquo:`“`,rdquo:`”`,bdquo:`„`,dagger:`†`,Dagger:`‡`,permil:`‰`,lsaquo:`‹`,rsaquo:`›`,euro:`€`},se=[`cent`,`copy`,`divide`,`gt`,`lt`,`not`,`para`,`times`],ce={}.hasOwnProperty,le={},ue;for(ue in oe)ce.call(oe,ue)&&(le[oe[ue]]=ue);var de=/[^\dA-Za-z]/;function fe(e,t,n,r){let i=String.fromCharCode(e);if(ce.call(le,i)){let e=le[i],a=`&`+e;return n&&ae.includes(e)&&!se.includes(e)&&(!r||t&&t!==61&&de.test(String.fromCharCode(t)))?a:a+`;`}return``}function pe(e,t,n){let r=ne(e,t,n.omitOptionalSemicolons),i;if((n.useNamedReferences||n.useShortestReferences)&&(i=fe(e,t,n.omitOptionalSemicolons,n.attribute)),(n.useShortestReferences||!i)&&n.useShortestReferences){let i=ie(e,t,n.omitOptionalSemicolons);i.length<r.length&&(r=i)}return i&&(!n.useShortestReferences||i.length<r.length)?i:r}function v(e,t){return g(e,Object.assign({format:pe},t))}var me=/^>|^->|<!--|-->|--!>|<!-$/g,he=[`>`],ge=[`<`,`>`];function _e(e,t,n,r){return r.settings.bogusComments?`<?`+v(e.value,Object.assign({},r.settings.characterReferences,{subset:he}))+`>`:`<!--`+e.value.replace(me,i)+`-->`;function i(e){return v(e,Object.assign({},r.settings.characterReferences,{subset:ge}))}}function ve(e,t,n,r){return`<!`+(r.settings.upperDoctype?`DOCTYPE`:`doctype`)+(r.settings.tightDoctype?``:` `)+`html>`}var y=xe(1),ye=xe(-1),be=[];function xe(e){return t;function t(t,n,r){let i=t?t.children:be,a=(n||0)+e,s=i[a];if(!r)for(;s&&o(s);)a+=e,s=i[a];return s}}var Se={}.hasOwnProperty;function Ce(e){return t;function t(t,n,r){return Se.call(e,t.tagName)&&e[t.tagName](t,n,r)}}var we=Ce({body:De,caption:Te,colgroup:Te,dd:je,dt:Ae,head:Te,html:Ee,li:ke,optgroup:Ne,option:Pe,p:Oe,rp:Me,rt:Me,tbody:Ie,td:ze,tfoot:Le,th:ze,thead:Fe,tr:Re});function Te(e,t,n){let r=y(n,t,!0);return!r||r.type!==`comment`&&!(r.type===`text`&&o(r.value.charAt(0)))}function Ee(e,t,n){let r=y(n,t);return!r||r.type!==`comment`}function De(e,t,n){let r=y(n,t);return!r||r.type!==`comment`}function Oe(e,t,n){let r=y(n,t);return r?r.type===`element`&&(r.tagName===`address`||r.tagName===`article`||r.tagName===`aside`||r.tagName===`blockquote`||r.tagName===`details`||r.tagName===`div`||r.tagName===`dl`||r.tagName===`fieldset`||r.tagName===`figcaption`||r.tagName===`figure`||r.tagName===`footer`||r.tagName===`form`||r.tagName===`h1`||r.tagName===`h2`||r.tagName===`h3`||r.tagName===`h4`||r.tagName===`h5`||r.tagName===`h6`||r.tagName===`header`||r.tagName===`hgroup`||r.tagName===`hr`||r.tagName===`main`||r.tagName===`menu`||r.tagName===`nav`||r.tagName===`ol`||r.tagName===`p`||r.tagName===`pre`||r.tagName===`section`||r.tagName===`table`||r.tagName===`ul`):!n||!(n.type===`element`&&(n.tagName===`a`||n.tagName===`audio`||n.tagName===`del`||n.tagName===`ins`||n.tagName===`map`||n.tagName===`noscript`||n.tagName===`video`))}function ke(e,t,n){let r=y(n,t);return!r||r.type===`element`&&r.tagName===`li`}function Ae(e,t,n){let r=y(n,t);return!!(r&&r.type===`element`&&(r.tagName===`dt`||r.tagName===`dd`))}function je(e,t,n){let r=y(n,t);return!r||r.type===`element`&&(r.tagName===`dt`||r.tagName===`dd`)}function Me(e,t,n){let r=y(n,t);return!r||r.type===`element`&&(r.tagName===`rp`||r.tagName===`rt`)}function Ne(e,t,n){let r=y(n,t);return!r||r.type===`element`&&r.tagName===`optgroup`}function Pe(e,t,n){let r=y(n,t);return!r||r.type===`element`&&(r.tagName===`option`||r.tagName===`optgroup`)}function Fe(e,t,n){let r=y(n,t);return!!(r&&r.type===`element`&&(r.tagName===`tbody`||r.tagName===`tfoot`))}function Ie(e,t,n){let r=y(n,t);return!r||r.type===`element`&&(r.tagName===`tbody`||r.tagName===`tfoot`)}function Le(e,t,n){return!y(n,t)}function Re(e,t,n){let r=y(n,t);return!r||r.type===`element`&&r.tagName===`tr`}function ze(e,t,n){let r=y(n,t);return!r||r.type===`element`&&(r.tagName===`td`||r.tagName===`th`)}var Be=Ce({body:Ue,colgroup:We,head:He,html:Ve,tbody:Ge});function Ve(e){let t=y(e,-1);return!t||t.type!==`comment`}function He(e){let t=new Set;for(let n of e.children)if(n.type===`element`&&(n.tagName===`base`||n.tagName===`title`)){if(t.has(n.tagName))return!1;t.add(n.tagName)}let n=e.children[0];return!n||n.type===`element`}function Ue(e){let t=y(e,-1,!0);return!t||t.type!==`comment`&&!(t.type===`text`&&o(t.value.charAt(0)))&&!(t.type===`element`&&(t.tagName===`meta`||t.tagName===`link`||t.tagName===`script`||t.tagName===`style`||t.tagName===`template`))}function We(e,t,n){let r=ye(n,t),i=y(e,-1,!0);return n&&r&&r.type===`element`&&r.tagName===`colgroup`&&we(r,n.children.indexOf(r),n)?!1:!!(i&&i.type===`element`&&i.tagName===`col`)}function Ge(e,t,n){let r=ye(n,t),i=y(e,-1);return n&&r&&r.type===`element`&&(r.tagName===`thead`||r.tagName===`tbody`)&&we(r,n.children.indexOf(r),n)?!1:!!(i&&i.type===`element`&&i.tagName===`tr`)}var Ke={name:[[`
2
+ import{a as e,c as t,i as n,n as r,o as i,r as a,s as o,t as s}from"./index-ByLmYGhW.js";var c={}.hasOwnProperty;function l(e,t){let n=t||{};function r(t,...n){let i=r.invalid,a=r.handlers;if(t&&c.call(t,e)){let n=String(t[e]);i=c.call(a,n)?a[n]:r.unknown}if(i)return i.call(this,t,...n)}return r.handlers=n.handlers||{},r.invalid=n.invalid,r.unknown=n.unknown,r}var u=[`area`,`base`,`basefont`,`bgsound`,`br`,`col`,`command`,`embed`,`frame`,`hr`,`image`,`img`,`input`,`keygen`,`link`,`meta`,`param`,`source`,`track`,`wbr`],d=/["&'<>`]/g,f=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,p=/[\x01-\t\v\f\x0E-\x1F\x7F\x81\x8D\x8F\x90\x9D\xA0-\uFFFF]/g,m=/[|\\{}()[\]^$+*?.]/g,h=new WeakMap;function g(e,t){if(e=e.replace(t.subset?_(t.subset):d,r),t.subset||t.escapeOnly)return e;return e.replace(f,n).replace(p,r);function n(e,n,r){return t.format((e.charCodeAt(0)-55296)*1024+e.charCodeAt(1)-56320+65536,r.charCodeAt(n+2),t)}function r(e,n,r){return t.format(e.charCodeAt(0),r.charCodeAt(n+1),t)}}function _(e){let t=h.get(e);return t||(t=ee(e),h.set(e,t)),t}function ee(e){let t=[],n=-1;for(;++n<e.length;)t.push(e[n].replace(m,`\\$&`));return RegExp(`(?:`+t.join(`|`)+`)`,`g`)}var te=/[\dA-Fa-f]/;function ne(e,t,n){let r=`&#x`+e.toString(16).toUpperCase();return n&&t&&!te.test(String.fromCharCode(t))?r:r+`;`}var re=/\d/;function ie(e,t,n){let r=`&#`+String(e);return n&&t&&!re.test(String.fromCharCode(t))?r:r+`;`}var ae=`AElig.AMP.Aacute.Acirc.Agrave.Aring.Atilde.Auml.COPY.Ccedil.ETH.Eacute.Ecirc.Egrave.Euml.GT.Iacute.Icirc.Igrave.Iuml.LT.Ntilde.Oacute.Ocirc.Ograve.Oslash.Otilde.Ouml.QUOT.REG.THORN.Uacute.Ucirc.Ugrave.Uuml.Yacute.aacute.acirc.acute.aelig.agrave.amp.aring.atilde.auml.brvbar.ccedil.cedil.cent.copy.curren.deg.divide.eacute.ecirc.egrave.eth.euml.frac12.frac14.frac34.gt.iacute.icirc.iexcl.igrave.iquest.iuml.laquo.lt.macr.micro.middot.nbsp.not.ntilde.oacute.ocirc.ograve.ordf.ordm.oslash.otilde.ouml.para.plusmn.pound.quot.raquo.reg.sect.shy.sup1.sup2.sup3.szlig.thorn.times.uacute.ucirc.ugrave.uml.uuml.yacute.yen.yuml`.split(`.`),oe={nbsp:`\xA0`,iexcl:`¡`,cent:`¢`,pound:`£`,curren:`¤`,yen:`¥`,brvbar:`¦`,sect:`§`,uml:`¨`,copy:`©`,ordf:`ª`,laquo:`«`,not:`¬`,shy:`­`,reg:`®`,macr:`¯`,deg:`°`,plusmn:`±`,sup2:`²`,sup3:`³`,acute:`´`,micro:`µ`,para:`¶`,middot:`·`,cedil:`¸`,sup1:`¹`,ordm:`º`,raquo:`»`,frac14:`¼`,frac12:`½`,frac34:`¾`,iquest:`¿`,Agrave:`À`,Aacute:`Á`,Acirc:`Â`,Atilde:`Ã`,Auml:`Ä`,Aring:`Å`,AElig:`Æ`,Ccedil:`Ç`,Egrave:`È`,Eacute:`É`,Ecirc:`Ê`,Euml:`Ë`,Igrave:`Ì`,Iacute:`Í`,Icirc:`Î`,Iuml:`Ï`,ETH:`Ð`,Ntilde:`Ñ`,Ograve:`Ò`,Oacute:`Ó`,Ocirc:`Ô`,Otilde:`Õ`,Ouml:`Ö`,times:`×`,Oslash:`Ø`,Ugrave:`Ù`,Uacute:`Ú`,Ucirc:`Û`,Uuml:`Ü`,Yacute:`Ý`,THORN:`Þ`,szlig:`ß`,agrave:`à`,aacute:`á`,acirc:`â`,atilde:`ã`,auml:`ä`,aring:`å`,aelig:`æ`,ccedil:`ç`,egrave:`è`,eacute:`é`,ecirc:`ê`,euml:`ë`,igrave:`ì`,iacute:`í`,icirc:`î`,iuml:`ï`,eth:`ð`,ntilde:`ñ`,ograve:`ò`,oacute:`ó`,ocirc:`ô`,otilde:`õ`,ouml:`ö`,divide:`÷`,oslash:`ø`,ugrave:`ù`,uacute:`ú`,ucirc:`û`,uuml:`ü`,yacute:`ý`,thorn:`þ`,yuml:`ÿ`,fnof:`ƒ`,Alpha:`Α`,Beta:`Β`,Gamma:`Γ`,Delta:`Δ`,Epsilon:`Ε`,Zeta:`Ζ`,Eta:`Η`,Theta:`Θ`,Iota:`Ι`,Kappa:`Κ`,Lambda:`Λ`,Mu:`Μ`,Nu:`Ν`,Xi:`Ξ`,Omicron:`Ο`,Pi:`Π`,Rho:`Ρ`,Sigma:`Σ`,Tau:`Τ`,Upsilon:`Υ`,Phi:`Φ`,Chi:`Χ`,Psi:`Ψ`,Omega:`Ω`,alpha:`α`,beta:`β`,gamma:`γ`,delta:`δ`,epsilon:`ε`,zeta:`ζ`,eta:`η`,theta:`θ`,iota:`ι`,kappa:`κ`,lambda:`λ`,mu:`μ`,nu:`ν`,xi:`ξ`,omicron:`ο`,pi:`π`,rho:`ρ`,sigmaf:`ς`,sigma:`σ`,tau:`τ`,upsilon:`υ`,phi:`φ`,chi:`χ`,psi:`ψ`,omega:`ω`,thetasym:`ϑ`,upsih:`ϒ`,piv:`ϖ`,bull:`•`,hellip:`…`,prime:`′`,Prime:`″`,oline:`‾`,frasl:`⁄`,weierp:`℘`,image:`ℑ`,real:`ℜ`,trade:`™`,alefsym:`ℵ`,larr:`←`,uarr:`↑`,rarr:`→`,darr:`↓`,harr:`↔`,crarr:`↵`,lArr:`⇐`,uArr:`⇑`,rArr:`⇒`,dArr:`⇓`,hArr:`⇔`,forall:`∀`,part:`∂`,exist:`∃`,empty:`∅`,nabla:`∇`,isin:`∈`,notin:`∉`,ni:`∋`,prod:`∏`,sum:`∑`,minus:`−`,lowast:`∗`,radic:`√`,prop:`∝`,infin:`∞`,ang:`∠`,and:`∧`,or:`∨`,cap:`∩`,cup:`∪`,int:`∫`,there4:`∴`,sim:`∼`,cong:`≅`,asymp:`≈`,ne:`≠`,equiv:`≡`,le:`≤`,ge:`≥`,sub:`⊂`,sup:`⊃`,nsub:`⊄`,sube:`⊆`,supe:`⊇`,oplus:`⊕`,otimes:`⊗`,perp:`⊥`,sdot:`⋅`,lceil:`⌈`,rceil:`⌉`,lfloor:`⌊`,rfloor:`⌋`,lang:`〈`,rang:`〉`,loz:`◊`,spades:`♠`,clubs:`♣`,hearts:`♥`,diams:`♦`,quot:`"`,amp:`&`,lt:`<`,gt:`>`,OElig:`Œ`,oelig:`œ`,Scaron:`Š`,scaron:`š`,Yuml:`Ÿ`,circ:`ˆ`,tilde:`˜`,ensp:` `,emsp:` `,thinsp:` `,zwnj:`‌`,zwj:`‍`,lrm:`‎`,rlm:`‏`,ndash:`–`,mdash:`—`,lsquo:`‘`,rsquo:`’`,sbquo:`‚`,ldquo:`“`,rdquo:`”`,bdquo:`„`,dagger:`†`,Dagger:`‡`,permil:`‰`,lsaquo:`‹`,rsaquo:`›`,euro:`€`},se=[`cent`,`copy`,`divide`,`gt`,`lt`,`not`,`para`,`times`],ce={}.hasOwnProperty,le={},ue;for(ue in oe)ce.call(oe,ue)&&(le[oe[ue]]=ue);var de=/[^\dA-Za-z]/;function fe(e,t,n,r){let i=String.fromCharCode(e);if(ce.call(le,i)){let e=le[i],a=`&`+e;return n&&ae.includes(e)&&!se.includes(e)&&(!r||t&&t!==61&&de.test(String.fromCharCode(t)))?a:a+`;`}return``}function pe(e,t,n){let r=ne(e,t,n.omitOptionalSemicolons),i;if((n.useNamedReferences||n.useShortestReferences)&&(i=fe(e,t,n.omitOptionalSemicolons,n.attribute)),(n.useShortestReferences||!i)&&n.useShortestReferences){let i=ie(e,t,n.omitOptionalSemicolons);i.length<r.length&&(r=i)}return i&&(!n.useShortestReferences||i.length<r.length)?i:r}function v(e,t){return g(e,Object.assign({format:pe},t))}var me=/^>|^->|<!--|-->|--!>|<!-$/g,he=[`>`],ge=[`<`,`>`];function _e(e,t,n,r){return r.settings.bogusComments?`<?`+v(e.value,Object.assign({},r.settings.characterReferences,{subset:he}))+`>`:`<!--`+e.value.replace(me,i)+`-->`;function i(e){return v(e,Object.assign({},r.settings.characterReferences,{subset:ge}))}}function ve(e,t,n,r){return`<!`+(r.settings.upperDoctype?`DOCTYPE`:`doctype`)+(r.settings.tightDoctype?``:` `)+`html>`}var y=xe(1),ye=xe(-1),be=[];function xe(e){return t;function t(t,n,r){let i=t?t.children:be,a=(n||0)+e,s=i[a];if(!r)for(;s&&o(s);)a+=e,s=i[a];return s}}var Se={}.hasOwnProperty;function Ce(e){return t;function t(t,n,r){return Se.call(e,t.tagName)&&e[t.tagName](t,n,r)}}var we=Ce({body:De,caption:Te,colgroup:Te,dd:je,dt:Ae,head:Te,html:Ee,li:ke,optgroup:Ne,option:Pe,p:Oe,rp:Me,rt:Me,tbody:Ie,td:ze,tfoot:Le,th:ze,thead:Fe,tr:Re});function Te(e,t,n){let r=y(n,t,!0);return!r||r.type!==`comment`&&!(r.type===`text`&&o(r.value.charAt(0)))}function Ee(e,t,n){let r=y(n,t);return!r||r.type!==`comment`}function De(e,t,n){let r=y(n,t);return!r||r.type!==`comment`}function Oe(e,t,n){let r=y(n,t);return r?r.type===`element`&&(r.tagName===`address`||r.tagName===`article`||r.tagName===`aside`||r.tagName===`blockquote`||r.tagName===`details`||r.tagName===`div`||r.tagName===`dl`||r.tagName===`fieldset`||r.tagName===`figcaption`||r.tagName===`figure`||r.tagName===`footer`||r.tagName===`form`||r.tagName===`h1`||r.tagName===`h2`||r.tagName===`h3`||r.tagName===`h4`||r.tagName===`h5`||r.tagName===`h6`||r.tagName===`header`||r.tagName===`hgroup`||r.tagName===`hr`||r.tagName===`main`||r.tagName===`menu`||r.tagName===`nav`||r.tagName===`ol`||r.tagName===`p`||r.tagName===`pre`||r.tagName===`section`||r.tagName===`table`||r.tagName===`ul`):!n||!(n.type===`element`&&(n.tagName===`a`||n.tagName===`audio`||n.tagName===`del`||n.tagName===`ins`||n.tagName===`map`||n.tagName===`noscript`||n.tagName===`video`))}function ke(e,t,n){let r=y(n,t);return!r||r.type===`element`&&r.tagName===`li`}function Ae(e,t,n){let r=y(n,t);return!!(r&&r.type===`element`&&(r.tagName===`dt`||r.tagName===`dd`))}function je(e,t,n){let r=y(n,t);return!r||r.type===`element`&&(r.tagName===`dt`||r.tagName===`dd`)}function Me(e,t,n){let r=y(n,t);return!r||r.type===`element`&&(r.tagName===`rp`||r.tagName===`rt`)}function Ne(e,t,n){let r=y(n,t);return!r||r.type===`element`&&r.tagName===`optgroup`}function Pe(e,t,n){let r=y(n,t);return!r||r.type===`element`&&(r.tagName===`option`||r.tagName===`optgroup`)}function Fe(e,t,n){let r=y(n,t);return!!(r&&r.type===`element`&&(r.tagName===`tbody`||r.tagName===`tfoot`))}function Ie(e,t,n){let r=y(n,t);return!r||r.type===`element`&&(r.tagName===`tbody`||r.tagName===`tfoot`)}function Le(e,t,n){return!y(n,t)}function Re(e,t,n){let r=y(n,t);return!r||r.type===`element`&&r.tagName===`tr`}function ze(e,t,n){let r=y(n,t);return!r||r.type===`element`&&(r.tagName===`td`||r.tagName===`th`)}var Be=Ce({body:Ue,colgroup:We,head:He,html:Ve,tbody:Ge});function Ve(e){let t=y(e,-1);return!t||t.type!==`comment`}function He(e){let t=new Set;for(let n of e.children)if(n.type===`element`&&(n.tagName===`base`||n.tagName===`title`)){if(t.has(n.tagName))return!1;t.add(n.tagName)}let n=e.children[0];return!n||n.type===`element`}function Ue(e){let t=y(e,-1,!0);return!t||t.type!==`comment`&&!(t.type===`text`&&o(t.value.charAt(0)))&&!(t.type===`element`&&(t.tagName===`meta`||t.tagName===`link`||t.tagName===`script`||t.tagName===`style`||t.tagName===`template`))}function We(e,t,n){let r=ye(n,t),i=y(e,-1,!0);return n&&r&&r.type===`element`&&r.tagName===`colgroup`&&we(r,n.children.indexOf(r),n)?!1:!!(i&&i.type===`element`&&i.tagName===`col`)}function Ge(e,t,n){let r=ye(n,t),i=y(e,-1);return n&&r&&r.type===`element`&&(r.tagName===`thead`||r.tagName===`tbody`)&&we(r,n.children.indexOf(r),n)?!1:!!(i&&i.type===`element`&&i.tagName===`tr`)}var Ke={name:[[`
3
3
  \f\r &/=>`.split(``),`
4
4
  \f\r "&'/=>\``.split(``)],[`\0
5
5
  \f\r "&'/<=>`.split(``),`\0