@haseebuchiha/silvr 2026.3.15 → 2026.3.19

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 (132) hide show
  1. package/dist/{agent-Chu8M4xO.js → agent-BBNM4JBh.js} +7 -7
  2. package/dist/{audio-preflight-OxgvEIbv.js → audio-preflight-DPCEOBUK.js} +1 -1
  3. package/dist/{auth-profiles.runtime-CEpyU4to.js → auth-profiles.runtime-ic8RpA6C.js} +1 -1
  4. package/dist/build-info.json +3 -3
  5. package/dist/bundled/boot-md/handler.js +2 -2
  6. package/dist/bundled/session-memory/handler.js +1 -1
  7. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  8. package/dist/{compact.runtime-BcMs0y1E.js → compact.runtime-0wbfpMot.js} +1 -1
  9. package/dist/control-ui/apple-touch-icon.png +0 -0
  10. package/dist/control-ui/assets/{agents-D4lD7vnT.js → agents-Djb8y8X5.js} +2 -2
  11. package/dist/control-ui/assets/{agents-D4lD7vnT.js.map → agents-Djb8y8X5.js.map} +1 -1
  12. package/dist/control-ui/assets/{channels-BYUr_oWn.js → channels-CeIv4xL7.js} +2 -2
  13. package/dist/control-ui/assets/{channels-BYUr_oWn.js.map → channels-CeIv4xL7.js.map} +1 -1
  14. package/dist/control-ui/assets/{cron-DRoH_18P.js → cron-vpUiL-aC.js} +2 -2
  15. package/dist/control-ui/assets/{cron-DRoH_18P.js.map → cron-vpUiL-aC.js.map} +1 -1
  16. package/dist/control-ui/assets/{debug-DbB1hzet.js → debug-DpMY3vmW.js} +2 -2
  17. package/dist/control-ui/assets/{debug-DbB1hzet.js.map → debug-DpMY3vmW.js.map} +1 -1
  18. package/dist/control-ui/assets/{index-BuRzKVZo.js → index-C4WQH4rc.js} +78 -96
  19. package/dist/control-ui/assets/index-C4WQH4rc.js.map +1 -0
  20. package/dist/control-ui/assets/{instances-Deb1b-xb.js → instances-CI0TAwKd.js} +2 -2
  21. package/dist/control-ui/assets/{instances-Deb1b-xb.js.map → instances-CI0TAwKd.js.map} +1 -1
  22. package/dist/control-ui/assets/{sessions-DBd1dRtm.js → sessions-DH9UNOOk.js} +2 -2
  23. package/dist/control-ui/assets/{sessions-DBd1dRtm.js.map → sessions-DH9UNOOk.js.map} +1 -1
  24. package/dist/control-ui/favicon-32.png +0 -0
  25. package/dist/control-ui/favicon.ico +0 -0
  26. package/dist/control-ui/favicon.svg +2 -20
  27. package/dist/control-ui/index.html +1 -1
  28. package/dist/{deliver-runtime-DzLhITOe.js → deliver-runtime-DwbmLh83.js} +1 -1
  29. package/dist/{image-runtime-BQ165Pku.js → image-runtime-DYH_GCEJ.js} +1 -1
  30. package/dist/llm-slug-generator.js +1 -1
  31. package/dist/{login-QNMXS5uL.js → login-BnOf2_OR.js} +2 -2
  32. package/dist/{login-qr-sI6iu_fE.js → login-qr-vNJffpmD.js} +2 -2
  33. package/dist/{manager-runtime-CyYraN0P.js → manager-runtime-DKaouQbZ.js} +1 -1
  34. package/dist/{manager.runtime-CieUm8Ii.js → manager.runtime-DoWiXSEi.js} +2 -2
  35. package/dist/{model-selection-lqb-eBNl.js → model-selection-CT3B1Am0.js} +43 -43
  36. package/dist/{pi-model-discovery-runtime-Ig186vI1.js → pi-model-discovery-runtime-BIrOETqQ.js} +1 -1
  37. package/dist/{pi-tools.before-tool-call.runtime-wVArZzH3.js → pi-tools.before-tool-call.runtime-CWe_sQ7A.js} +1 -1
  38. package/dist/plugin-sdk/{audio-preflight-DPmw1p6X.js → audio-preflight-4MdpOYT8.js} +12 -12
  39. package/dist/plugin-sdk/{audit-membership-runtime-DHo6vLy0.js → audit-membership-runtime-D1VvFm38.js} +5 -5
  40. package/dist/plugin-sdk/{auth-profiles.runtime-DWX_OU3d.js → auth-profiles.runtime-B_e4KXry.js} +12 -12
  41. package/dist/plugin-sdk/{bluebubbles-BPDNQxEz.js → bluebubbles-B_tcmPhi.js} +1 -1
  42. package/dist/plugin-sdk/bluebubbles.js +15 -15
  43. package/dist/plugin-sdk/{channel-access-configure-CR_peHiz.js → channel-access-configure-MWzMGRmg.js} +1 -1
  44. package/dist/plugin-sdk/{channel-access-DsAI06W1.js → channel-access-x4F67APW.js} +1 -1
  45. package/dist/plugin-sdk/{channel-config-helpers-CFkTEzkz.js → channel-config-helpers-CX9AfjCJ.js} +3 -3
  46. package/dist/plugin-sdk/{compact.runtime-BBoUa5c7.js → compact.runtime-By20RyWg.js} +12 -12
  47. package/dist/plugin-sdk/compat.js +28 -28
  48. package/dist/plugin-sdk/core.js +14 -14
  49. package/dist/plugin-sdk/{deliver-runtime-DcqbN2EW.js → deliver-runtime-B3czxRTS.js} +12 -12
  50. package/dist/plugin-sdk/device-pair.js +5 -5
  51. package/dist/plugin-sdk/diagnostics-otel.js +2 -2
  52. package/dist/plugin-sdk/{discord-CFdrFYfc.js → discord-Dj8Mb_wn.js} +4 -4
  53. package/dist/plugin-sdk/discord.js +16 -16
  54. package/dist/plugin-sdk/{exec-BvTkR9oI.js → exec-88qB5pUO.js} +2 -2
  55. package/dist/plugin-sdk/feishu.js +14 -14
  56. package/dist/plugin-sdk/{fetch-yk-axchG.js → fetch-Cqwcg-Kq.js} +2 -2
  57. package/dist/plugin-sdk/{fetch-guard-Cwx1pJhf.js → fetch-guard-DEyOIg88.js} +1 -1
  58. package/dist/plugin-sdk/google-gemini-cli-auth.js +4 -4
  59. package/dist/plugin-sdk/googlechat.js +14 -14
  60. package/dist/plugin-sdk/{helpers-x_l9piB-.js → helpers-CfIIkFSu.js} +1 -1
  61. package/dist/plugin-sdk/{http-registry-DyBqqyPO.js → http-registry-CR-l0QpT.js} +2 -2
  62. package/dist/plugin-sdk/{image-runtime-CvjYlyKN.js → image-runtime-DbwFg8bX.js} +12 -12
  63. package/dist/plugin-sdk/{imessage-CkpWB9uc.js → imessage-DWv_YFoG.js} +3 -3
  64. package/dist/plugin-sdk/imessage.js +14 -14
  65. package/dist/plugin-sdk/{inbound-reply-dispatch-Bwv_eu-G.js → inbound-reply-dispatch-BI9YMvYv.js} +1 -1
  66. package/dist/plugin-sdk/index.js +28 -28
  67. package/dist/plugin-sdk/irc.js +15 -15
  68. package/dist/plugin-sdk/{logger-C9fkmDdb.js → logger-D-go2oXy.js} +2 -2
  69. package/dist/plugin-sdk/{logger-DXnvMlr-.js → logger-Jt8cCPPV.js} +2 -2
  70. package/dist/plugin-sdk/{login-CyKlpU9E.js → login-Cy1IQLfg.js} +5 -5
  71. package/dist/plugin-sdk/{login-qr-z59Dj0on.js → login-qr-LgAfrI1p.js} +13 -13
  72. package/dist/plugin-sdk/{manager-runtime-VM2qg5g4.js → manager-runtime-DLV0ve6h.js} +12 -12
  73. package/dist/plugin-sdk/{manager.runtime-Cb08bDVy.js → manager.runtime-BEIriNTO.js} +18 -18
  74. package/dist/plugin-sdk/matrix.js +16 -16
  75. package/dist/plugin-sdk/mattermost.js +14 -14
  76. package/dist/plugin-sdk/msteams.js +16 -16
  77. package/dist/plugin-sdk/nextcloud-talk.js +15 -15
  78. package/dist/plugin-sdk/nostr.js +4 -4
  79. package/dist/plugin-sdk/{outbound-media-DYbNhQ_E.js → outbound-media-8bhEY42D.js} +1 -1
  80. package/dist/plugin-sdk/{persistent-dedupe-DS3m5WG6.js → persistent-dedupe-CP6PuqL4.js} +1 -1
  81. package/dist/plugin-sdk/{pi-model-discovery-runtime-DDJGcEIx.js → pi-model-discovery-runtime-Dc57E_n-.js} +12 -12
  82. package/dist/plugin-sdk/{pi-tools.before-tool-call.runtime-DCouxalp.js → pi-tools.before-tool-call.runtime-CF7b4jSF.js} +12 -12
  83. package/dist/plugin-sdk/{pw-ai-CAo9arf1.js → pw-ai-Cu3NfgZw.js} +12 -12
  84. package/dist/plugin-sdk/{qmd-manager-Bwn33HK3.js → qmd-manager-CryYgEwP.js} +7 -7
  85. package/dist/plugin-sdk/{query-expansion-DINIGp5S.js → query-expansion-dBUsAz2h.js} +5 -5
  86. package/dist/plugin-sdk/{redact-DTcVTGFU.js → redact-CqHkGWow.js} +1 -1
  87. package/dist/plugin-sdk/{run-command-qzkvaQG1.js → run-command-nYfMDZC3.js} +1 -1
  88. package/dist/plugin-sdk/runtime-whatsapp-login.runtime-CEmiEXMT.js +24 -0
  89. package/dist/plugin-sdk/runtime-whatsapp-outbound.runtime-Dpkzb5jv.js +23 -0
  90. package/dist/plugin-sdk/{send-DDbji5k6.js → send-CsNw3q-L.js} +5 -5
  91. package/dist/plugin-sdk/{session-B2yjBpwg.js → session-B-1_5oYO.js} +5 -5
  92. package/dist/plugin-sdk/{signal-3aSvai9I.js → signal-BwW43W5i.js} +6 -6
  93. package/dist/plugin-sdk/signal.js +14 -14
  94. package/dist/plugin-sdk/{slack-BjYBuTcM.js → slack-DKfYGlSt.js} +3 -3
  95. package/dist/plugin-sdk/slack.js +16 -16
  96. package/dist/plugin-sdk/{slash-commands.runtime-CHY090q0.js → slash-commands.runtime-BJP-Vjou.js} +12 -12
  97. package/dist/plugin-sdk/{slash-dispatch.runtime-Ba_5OWX5.js → slash-dispatch.runtime-BLtK9-GQ.js} +12 -12
  98. package/dist/plugin-sdk/{slash-skill-commands.runtime-CskHLGjb.js → slash-skill-commands.runtime-CgyS_sqD.js} +12 -12
  99. package/dist/plugin-sdk/{subagent-registry-runtime-B0ePd1LR.js → subagent-registry-runtime-CS66kg75.js} +12 -12
  100. package/dist/plugin-sdk/{subsystem-DXcqLSNd.js → subsystem-DOh66yR6.js} +1 -1
  101. package/dist/plugin-sdk/synology-chat.js +4 -4
  102. package/dist/plugin-sdk/{telegram-PQnshN8a.js → telegram-DdYAdPNS.js} +4 -4
  103. package/dist/plugin-sdk/telegram.js +14 -14
  104. package/dist/plugin-sdk/{text-chunking-DR7Ynf1H.js → text-chunking-BZD0indn.js} +1 -1
  105. package/dist/plugin-sdk/{thread-bindings-CKc8lBUK.js → thread-bindings-s08Q6gLk.js} +48 -48
  106. package/dist/plugin-sdk/tlon.js +13 -13
  107. package/dist/plugin-sdk/twitch.js +14 -14
  108. package/dist/plugin-sdk/{utils-BQpbGej3.js → utils-BhiRkVxe.js} +1 -1
  109. package/dist/plugin-sdk/{vllm-setup-aGNAuqY6.js → vllm-setup-BD7VBM6I.js} +2 -2
  110. package/dist/plugin-sdk/voice-call.js +12 -12
  111. package/dist/plugin-sdk/{web-OBr8Vh-d.js → web-Q92lxrJ-.js} +16 -16
  112. package/dist/plugin-sdk/{webhook-targets-yTQuv0k1.js → webhook-targets-t3fxeJQf.js} +1 -1
  113. package/dist/plugin-sdk/{whatsapp-actions-C5NiCm9m.js → whatsapp-actions-BlHegGMG.js} +13 -13
  114. package/dist/plugin-sdk/{whatsapp-heartbeat-JrbyW5rW.js → whatsapp-heartbeat-CJfQseWN.js} +3 -3
  115. package/dist/plugin-sdk/whatsapp.js +13 -13
  116. package/dist/plugin-sdk/zalo.js +15 -15
  117. package/dist/plugin-sdk/zalouser.js +16 -16
  118. package/dist/{pw-ai-CCaHNl69.js → pw-ai-4ZUo1wKO.js} +1 -1
  119. package/dist/{runtime-whatsapp-login.runtime-DpI9pkPy.js → runtime-whatsapp-login.runtime-C8c64_Bg.js} +3 -3
  120. package/dist/{runtime-whatsapp-outbound.runtime-DRxneC1r.js → runtime-whatsapp-outbound.runtime-CGXy2oG1.js} +2 -2
  121. package/dist/{send-CwLwqyXr.js → send-DUkDUKM4.js} +1 -1
  122. package/dist/{session-w6ourRUd.js → session-D-TVYl1e.js} +1 -1
  123. package/dist/{slash-commands.runtime-DVQ-xr4E.js → slash-commands.runtime-CUjtFg_Z.js} +1 -1
  124. package/dist/{slash-dispatch.runtime-CdfaH7Qq.js → slash-dispatch.runtime-BZRL5Q4F.js} +1 -1
  125. package/dist/{slash-skill-commands.runtime-BbJjODG0.js → slash-skill-commands.runtime-BixOFj5F.js} +1 -1
  126. package/dist/{subagent-registry-runtime-C4b1JtIF.js → subagent-registry-runtime-La36Eh0-.js} +1 -1
  127. package/dist/{web-CpWavF-V.js → web-cGpqCiIx.js} +4 -4
  128. package/dist/{whatsapp-actions-zNzE9G_p.js → whatsapp-actions-myIVajIE.js} +2 -2
  129. package/package.json +1 -1
  130. package/dist/control-ui/assets/index-BuRzKVZo.js.map +0 -1
  131. package/dist/plugin-sdk/runtime-whatsapp-login.runtime-CG8nF31M.js +0 -24
  132. package/dist/plugin-sdk/runtime-whatsapp-outbound.runtime-BWgqnjHv.js +0 -23
@@ -1,4 +1,4 @@
1
- import{i as e,n as t}from"./lit-BZwq2xLD.js";import{O as n,o as r}from"./index-BuRzKVZo.js";var i=!1;function a(r){let a=!i;return e`
1
+ import{i as e,n as t}from"./lit-BZwq2xLD.js";import{O as n,o as r}from"./index-C4WQH4rc.js";var i=!1;function a(r){let a=!i;return e`
2
2
  <section class="card">
3
3
  <div class="row" style="justify-content: space-between;">
4
4
  <div>
@@ -59,4 +59,4 @@ import{i as e,n as t}from"./lit-BZwq2xLD.js";import{O as n,o as r}from"./index-B
59
59
  </div>
60
60
  </div>
61
61
  `}export{a as renderInstances};
62
- //# sourceMappingURL=instances-Deb1b-xb.js.map
62
+ //# sourceMappingURL=instances-CI0TAwKd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"instances-Deb1b-xb.js","names":[],"sources":["../../../ui/src/ui/views/instances.ts"],"sourcesContent":["import { html, nothing } from \"lit\";\nimport { icons } from \"../icons.ts\";\nimport { formatPresenceAge } from \"../presenter.ts\";\nimport type { PresenceEntry } from \"../types.ts\";\n\nexport type InstancesProps = {\n loading: boolean;\n entries: PresenceEntry[];\n lastError: string | null;\n statusMessage: string | null;\n onRefresh: () => void;\n};\n\nlet hostsRevealed = false;\n\nexport function renderInstances(props: InstancesProps) {\n const masked = !hostsRevealed;\n\n return html`\n <section class=\"card\">\n <div class=\"row\" style=\"justify-content: space-between;\">\n <div>\n <div class=\"card-title\">Connected Instances</div>\n <div class=\"card-sub\">Presence beacons from the gateway and clients.</div>\n </div>\n <div class=\"row\" style=\"gap: 8px;\">\n <button\n class=\"btn btn--icon ${masked ? \"\" : \"active\"}\"\n @click=${() => {\n hostsRevealed = !hostsRevealed;\n props.onRefresh();\n }}\n title=${masked ? \"Show hosts and IPs\" : \"Hide hosts and IPs\"}\n aria-label=\"Toggle host visibility\"\n aria-pressed=${!masked}\n style=\"width: 36px; height: 36px;\"\n >\n ${masked ? icons.eyeOff : icons.eye}\n </button>\n <button class=\"btn\" ?disabled=${props.loading} @click=${props.onRefresh}>\n ${props.loading ? \"Loading…\" : \"Refresh\"}\n </button>\n </div>\n </div>\n ${\n props.lastError\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">\n ${props.lastError}\n </div>`\n : nothing\n }\n ${\n props.statusMessage\n ? html`<div class=\"callout\" style=\"margin-top: 12px;\">\n ${props.statusMessage}\n </div>`\n : nothing\n }\n <div class=\"list\" style=\"margin-top: 16px;\">\n ${\n props.entries.length === 0\n ? html`\n <div class=\"muted\">No instances reported yet.</div>\n `\n : props.entries.map((entry) => renderEntry(entry, masked))\n }\n </div>\n </section>\n `;\n}\n\nfunction renderEntry(entry: PresenceEntry, masked: boolean) {\n const lastInput = entry.lastInputSeconds != null ? `${entry.lastInputSeconds}s ago` : \"n/a\";\n const mode = entry.mode ?? \"unknown\";\n const host = entry.host ?? \"unknown host\";\n const ip = entry.ip ?? null;\n const roles = Array.isArray(entry.roles) ? entry.roles.filter(Boolean) : [];\n const scopes = Array.isArray(entry.scopes) ? entry.scopes.filter(Boolean) : [];\n const scopesLabel =\n scopes.length > 0\n ? scopes.length > 3\n ? `${scopes.length} scopes`\n : `scopes: ${scopes.join(\", \")}`\n : null;\n return html`\n <div class=\"list-item\">\n <div class=\"list-main\">\n <div class=\"list-title\">\n <span class=\"${masked ? \"redacted\" : \"\"}\">${host}</span>\n </div>\n <div class=\"list-sub\">\n ${ip ? html`<span class=\"${masked ? \"redacted\" : \"\"}\">${ip}</span> ` : nothing}${mode} ${entry.version ?? \"\"}\n </div>\n <div class=\"chip-row\">\n <span class=\"chip\">${mode}</span>\n ${roles.map((role) => html`<span class=\"chip\">${role}</span>`)}\n ${scopesLabel ? html`<span class=\"chip\">${scopesLabel}</span>` : nothing}\n ${entry.platform ? html`<span class=\"chip\">${entry.platform}</span>` : nothing}\n ${entry.deviceFamily ? html`<span class=\"chip\">${entry.deviceFamily}</span>` : nothing}\n ${\n entry.modelIdentifier\n ? html`<span class=\"chip\">${entry.modelIdentifier}</span>`\n : nothing\n }\n ${entry.version ? html`<span class=\"chip\">${entry.version}</span>` : nothing}\n </div>\n </div>\n <div class=\"list-meta\">\n <div>${formatPresenceAge(entry)}</div>\n <div class=\"muted\">Last input ${lastInput}</div>\n <div class=\"muted\">Reason ${entry.reason ?? \"\"}</div>\n </div>\n </div>\n `;\n}\n"],"mappings":"4FAaA,IAAI,EAAgB,GAEpB,SAAgB,EAAgB,EAAuB,CACrD,IAAM,EAAS,CAAC,EAEhB,MAAO,EAAI;;;;;;;;;mCASsB,EAAS,GAAK,SAAS;yBAC/B,CACb,EAAgB,CAAC,EACjB,EAAM,WAAW,EACjB;oBACM,EAAS,qBAAuB,qBAAqB;;2BAE9C,CAAC,EAAO;;;cAGrB,EAAS,EAAM,OAAS,EAAM,IAAI;;0CAEN,EAAM,QAAQ,UAAU,EAAM,UAAU;cACpE,EAAM,QAAU,WAAa,UAAU;;;;QAK7C,EAAM,UACF,CAAI;cACF,EAAM,UAAU;kBAElB,EACL;QAEC,EAAM,cACF,CAAI;cACF,EAAM,cAAc;kBAEtB,EACL;;UAGG,EAAM,QAAQ,SAAW,EACrB,CAAI;;gBAGJ,EAAM,QAAQ,IAAK,GAAU,EAAY,EAAO,EAAO,CAAC,CAC7D;;;IAMT,SAAS,EAAY,EAAsB,EAAiB,CAC1D,IAAM,EAAY,EAAM,kBAAoB,KAA0C,MAAnC,GAAG,EAAM,iBAAiB,OACvE,EAAO,EAAM,MAAQ,UACrB,EAAO,EAAM,MAAQ,eACrB,EAAK,EAAM,IAAM,KACjB,EAAQ,MAAM,QAAQ,EAAM,MAAM,CAAG,EAAM,MAAM,OAAO,QAAQ,CAAG,EAAE,CACrE,EAAS,MAAM,QAAQ,EAAM,OAAO,CAAG,EAAM,OAAO,OAAO,QAAQ,CAAG,EAAE,CACxE,EACJ,EAAO,OAAS,EACZ,EAAO,OAAS,EACd,GAAG,EAAO,OAAO,SACjB,WAAW,EAAO,KAAK,KAAK,GAC9B,KACN,MAAO,EAAI;;;;yBAIY,EAAS,WAAa,GAAG,IAAI,EAAK;;;YAG/C,EAAK,CAAI,gBAAgB,EAAS,WAAa,GAAG,IAAI,EAAG,UAAY,IAAU,EAAK,GAAG,EAAM,SAAW,GAAG;;;+BAGxF,EAAK;YACxB,EAAM,IAAK,GAAS,CAAI,sBAAsB,EAAK,SAAS,CAAC;YAC7D,EAAc,CAAI,sBAAsB,EAAY,SAAW,EAAQ;YACvE,EAAM,SAAW,CAAI,sBAAsB,EAAM,SAAS,SAAW,EAAQ;YAC7E,EAAM,aAAe,CAAI,sBAAsB,EAAM,aAAa,SAAW,EAAQ;YAErF,EAAM,gBACF,CAAI,sBAAsB,EAAM,gBAAgB,SAChD,EACL;YACC,EAAM,QAAU,CAAI,sBAAsB,EAAM,QAAQ,SAAW,EAAQ;;;;eAIxE,EAAkB,EAAM,CAAC;wCACA,EAAU;oCACd,EAAM,QAAU,GAAG"}
1
+ {"version":3,"file":"instances-CI0TAwKd.js","names":[],"sources":["../../../ui/src/ui/views/instances.ts"],"sourcesContent":["import { html, nothing } from \"lit\";\nimport { icons } from \"../icons.ts\";\nimport { formatPresenceAge } from \"../presenter.ts\";\nimport type { PresenceEntry } from \"../types.ts\";\n\nexport type InstancesProps = {\n loading: boolean;\n entries: PresenceEntry[];\n lastError: string | null;\n statusMessage: string | null;\n onRefresh: () => void;\n};\n\nlet hostsRevealed = false;\n\nexport function renderInstances(props: InstancesProps) {\n const masked = !hostsRevealed;\n\n return html`\n <section class=\"card\">\n <div class=\"row\" style=\"justify-content: space-between;\">\n <div>\n <div class=\"card-title\">Connected Instances</div>\n <div class=\"card-sub\">Presence beacons from the gateway and clients.</div>\n </div>\n <div class=\"row\" style=\"gap: 8px;\">\n <button\n class=\"btn btn--icon ${masked ? \"\" : \"active\"}\"\n @click=${() => {\n hostsRevealed = !hostsRevealed;\n props.onRefresh();\n }}\n title=${masked ? \"Show hosts and IPs\" : \"Hide hosts and IPs\"}\n aria-label=\"Toggle host visibility\"\n aria-pressed=${!masked}\n style=\"width: 36px; height: 36px;\"\n >\n ${masked ? icons.eyeOff : icons.eye}\n </button>\n <button class=\"btn\" ?disabled=${props.loading} @click=${props.onRefresh}>\n ${props.loading ? \"Loading…\" : \"Refresh\"}\n </button>\n </div>\n </div>\n ${\n props.lastError\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">\n ${props.lastError}\n </div>`\n : nothing\n }\n ${\n props.statusMessage\n ? html`<div class=\"callout\" style=\"margin-top: 12px;\">\n ${props.statusMessage}\n </div>`\n : nothing\n }\n <div class=\"list\" style=\"margin-top: 16px;\">\n ${\n props.entries.length === 0\n ? html`\n <div class=\"muted\">No instances reported yet.</div>\n `\n : props.entries.map((entry) => renderEntry(entry, masked))\n }\n </div>\n </section>\n `;\n}\n\nfunction renderEntry(entry: PresenceEntry, masked: boolean) {\n const lastInput = entry.lastInputSeconds != null ? `${entry.lastInputSeconds}s ago` : \"n/a\";\n const mode = entry.mode ?? \"unknown\";\n const host = entry.host ?? \"unknown host\";\n const ip = entry.ip ?? null;\n const roles = Array.isArray(entry.roles) ? entry.roles.filter(Boolean) : [];\n const scopes = Array.isArray(entry.scopes) ? entry.scopes.filter(Boolean) : [];\n const scopesLabel =\n scopes.length > 0\n ? scopes.length > 3\n ? `${scopes.length} scopes`\n : `scopes: ${scopes.join(\", \")}`\n : null;\n return html`\n <div class=\"list-item\">\n <div class=\"list-main\">\n <div class=\"list-title\">\n <span class=\"${masked ? \"redacted\" : \"\"}\">${host}</span>\n </div>\n <div class=\"list-sub\">\n ${ip ? html`<span class=\"${masked ? \"redacted\" : \"\"}\">${ip}</span> ` : nothing}${mode} ${entry.version ?? \"\"}\n </div>\n <div class=\"chip-row\">\n <span class=\"chip\">${mode}</span>\n ${roles.map((role) => html`<span class=\"chip\">${role}</span>`)}\n ${scopesLabel ? html`<span class=\"chip\">${scopesLabel}</span>` : nothing}\n ${entry.platform ? html`<span class=\"chip\">${entry.platform}</span>` : nothing}\n ${entry.deviceFamily ? html`<span class=\"chip\">${entry.deviceFamily}</span>` : nothing}\n ${\n entry.modelIdentifier\n ? html`<span class=\"chip\">${entry.modelIdentifier}</span>`\n : nothing\n }\n ${entry.version ? html`<span class=\"chip\">${entry.version}</span>` : nothing}\n </div>\n </div>\n <div class=\"list-meta\">\n <div>${formatPresenceAge(entry)}</div>\n <div class=\"muted\">Last input ${lastInput}</div>\n <div class=\"muted\">Reason ${entry.reason ?? \"\"}</div>\n </div>\n </div>\n `;\n}\n"],"mappings":"4FAaA,IAAI,EAAgB,GAEpB,SAAgB,EAAgB,EAAuB,CACrD,IAAM,EAAS,CAAC,EAEhB,MAAO,EAAI;;;;;;;;;mCASsB,EAAS,GAAK,SAAS;yBAC/B,CACb,EAAgB,CAAC,EACjB,EAAM,WAAW,EACjB;oBACM,EAAS,qBAAuB,qBAAqB;;2BAE9C,CAAC,EAAO;;;cAGrB,EAAS,EAAM,OAAS,EAAM,IAAI;;0CAEN,EAAM,QAAQ,UAAU,EAAM,UAAU;cACpE,EAAM,QAAU,WAAa,UAAU;;;;QAK7C,EAAM,UACF,CAAI;cACF,EAAM,UAAU;kBAElB,EACL;QAEC,EAAM,cACF,CAAI;cACF,EAAM,cAAc;kBAEtB,EACL;;UAGG,EAAM,QAAQ,SAAW,EACrB,CAAI;;gBAGJ,EAAM,QAAQ,IAAK,GAAU,EAAY,EAAO,EAAO,CAAC,CAC7D;;;IAMT,SAAS,EAAY,EAAsB,EAAiB,CAC1D,IAAM,EAAY,EAAM,kBAAoB,KAA0C,MAAnC,GAAG,EAAM,iBAAiB,OACvE,EAAO,EAAM,MAAQ,UACrB,EAAO,EAAM,MAAQ,eACrB,EAAK,EAAM,IAAM,KACjB,EAAQ,MAAM,QAAQ,EAAM,MAAM,CAAG,EAAM,MAAM,OAAO,QAAQ,CAAG,EAAE,CACrE,EAAS,MAAM,QAAQ,EAAM,OAAO,CAAG,EAAM,OAAO,OAAO,QAAQ,CAAG,EAAE,CACxE,EACJ,EAAO,OAAS,EACZ,EAAO,OAAS,EACd,GAAG,EAAO,OAAO,SACjB,WAAW,EAAO,KAAK,KAAK,GAC9B,KACN,MAAO,EAAI;;;;yBAIY,EAAS,WAAa,GAAG,IAAI,EAAK;;;YAG/C,EAAK,CAAI,gBAAgB,EAAS,WAAa,GAAG,IAAI,EAAG,UAAY,IAAU,EAAK,GAAG,EAAM,SAAW,GAAG;;;+BAGxF,EAAK;YACxB,EAAM,IAAK,GAAS,CAAI,sBAAsB,EAAK,SAAS,CAAC;YAC7D,EAAc,CAAI,sBAAsB,EAAY,SAAW,EAAQ;YACvE,EAAM,SAAW,CAAI,sBAAsB,EAAM,SAAS,SAAW,EAAQ;YAC7E,EAAM,aAAe,CAAI,sBAAsB,EAAM,aAAa,SAAW,EAAQ;YAErF,EAAM,gBACF,CAAI,sBAAsB,EAAM,gBAAgB,SAChD,EACL;YACC,EAAM,QAAU,CAAI,sBAAsB,EAAM,QAAQ,SAAW,EAAQ;;;;eAIxE,EAAkB,EAAM,CAAC;wCACA,EAAU;oCACd,EAAM,QAAU,GAAG"}
@@ -1,4 +1,4 @@
1
- import{i as e,n as t}from"./lit-BZwq2xLD.js";import{l as n}from"./format-DeRVtGzv.js";import{A as r,O as i,s as a}from"./index-BuRzKVZo.js";var o=[``,`off`,`minimal`,`low`,`medium`,`high`,`xhigh`],s=[``,`off`,`on`],c=[{value:``,label:`inherit`},{value:`off`,label:`off (explicit)`},{value:`on`,label:`on`},{value:`full`,label:`full`}],l=[{value:``,label:`inherit`},{value:`on`,label:`on`},{value:`off`,label:`off`}],u=[``,`off`,`on`,`stream`],d=[10,25,50,100];function f(e){if(!e)return``;let t=e.trim().toLowerCase();return t===`z.ai`||t===`z-ai`?`zai`:t}function p(e){return f(e)===`zai`}function m(e){return p(e)?s:o}function h(e,t){return!t||e.includes(t)?[...e]:[...e,t]}function g(e,t){return!t||e.some(e=>e.value===t)?[...e]:[...e,{value:t,label:`${t} (custom)`}]}function _(e,t){return!t||!e||e===`off`?e:`on`}function v(e,t){return e?t&&e===`on`?`low`:e:null}function y(e,t){let n=t.trim().toLowerCase();return n?e.filter(e=>{let t=(e.key??``).toLowerCase(),r=(e.label??``).toLowerCase(),i=(e.kind??``).toLowerCase(),a=(e.displayName??``).toLowerCase();return t.includes(n)||r.includes(n)||i.includes(n)||a.includes(n)}):e}function b(e,t,n){let r=n===`asc`?1:-1;return[...e].toSorted((e,n)=>{let i=0;switch(t){case`key`:i=(e.key??``).localeCompare(n.key??``);break;case`kind`:i=(e.kind??``).localeCompare(n.kind??``);break;case`updated`:i=(e.updatedAt??0)-(n.updatedAt??0);break;case`tokens`:i=(e.totalTokens??e.inputTokens??e.outputTokens??0)-(n.totalTokens??n.inputTokens??n.outputTokens??0);break}return i*r})}function x(e,t,n){let r=t*n;return e.slice(r,r+n)}function S(n){let r=b(y(n.result?.sessions??[],n.searchQuery),n.sortColumn,n.sortDir),a=r.length,o=Math.max(1,Math.ceil(a/n.pageSize)),s=Math.min(n.page,o-1),c=x(r,s,n.pageSize),l=(t,r)=>{let a=n.sortColumn===t,o=a&&n.sortDir===`asc`?`desc`:`asc`;return e`
1
+ import{i as e,n as t}from"./lit-BZwq2xLD.js";import{l as n}from"./format-DeRVtGzv.js";import{A as r,O as i,s as a}from"./index-C4WQH4rc.js";var o=[``,`off`,`minimal`,`low`,`medium`,`high`,`xhigh`],s=[``,`off`,`on`],c=[{value:``,label:`inherit`},{value:`off`,label:`off (explicit)`},{value:`on`,label:`on`},{value:`full`,label:`full`}],l=[{value:``,label:`inherit`},{value:`on`,label:`on`},{value:`off`,label:`off`}],u=[``,`off`,`on`,`stream`],d=[10,25,50,100];function f(e){if(!e)return``;let t=e.trim().toLowerCase();return t===`z.ai`||t===`z-ai`?`zai`:t}function p(e){return f(e)===`zai`}function m(e){return p(e)?s:o}function h(e,t){return!t||e.includes(t)?[...e]:[...e,t]}function g(e,t){return!t||e.some(e=>e.value===t)?[...e]:[...e,{value:t,label:`${t} (custom)`}]}function _(e,t){return!t||!e||e===`off`?e:`on`}function v(e,t){return e?t&&e===`on`?`low`:e:null}function y(e,t){let n=t.trim().toLowerCase();return n?e.filter(e=>{let t=(e.key??``).toLowerCase(),r=(e.label??``).toLowerCase(),i=(e.kind??``).toLowerCase(),a=(e.displayName??``).toLowerCase();return t.includes(n)||r.includes(n)||i.includes(n)||a.includes(n)}):e}function b(e,t,n){let r=n===`asc`?1:-1;return[...e].toSorted((e,n)=>{let i=0;switch(t){case`key`:i=(e.key??``).localeCompare(n.key??``);break;case`kind`:i=(e.kind??``).localeCompare(n.kind??``);break;case`updated`:i=(e.updatedAt??0)-(n.updatedAt??0);break;case`tokens`:i=(e.totalTokens??e.inputTokens??e.outputTokens??0)-(n.totalTokens??n.inputTokens??n.outputTokens??0);break}return i*r})}function x(e,t,n){let r=t*n;return e.slice(r,r+n)}function S(n){let r=b(y(n.result?.sessions??[],n.searchQuery),n.sortColumn,n.sortDir),a=r.length,o=Math.max(1,Math.ceil(a/n.pageSize)),s=Math.min(n.page,o-1),c=x(r,s,n.pageSize),l=(t,r)=>{let a=n.sortColumn===t,o=a&&n.sortDir===`asc`?`desc`:`asc`;return e`
2
2
  <th
3
3
  data-sortable
4
4
  data-sort-dir=${a?n.sortDir:``}
@@ -235,4 +235,4 @@ import{i as e,n as t}from"./lit-BZwq2xLD.js";import{l as n}from"./format-DeRVtGz
235
235
  </td>
236
236
  </tr>
237
237
  `}export{S as renderSessions};
238
- //# sourceMappingURL=sessions-DBd1dRtm.js.map
238
+ //# sourceMappingURL=sessions-DH9UNOOk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sessions-DBd1dRtm.js","names":[],"sources":["../../../ui/src/ui/views/sessions.ts"],"sourcesContent":["import { html, nothing } from \"lit\";\nimport { formatRelativeTimestamp } from \"../format.ts\";\nimport { icons } from \"../icons.ts\";\nimport { pathForTab } from \"../navigation.ts\";\nimport { formatSessionTokens } from \"../presenter.ts\";\nimport type { GatewaySessionRow, SessionsListResult } from \"../types.ts\";\n\nexport type SessionsProps = {\n loading: boolean;\n result: SessionsListResult | null;\n error: string | null;\n activeMinutes: string;\n limit: string;\n includeGlobal: boolean;\n includeUnknown: boolean;\n basePath: string;\n searchQuery: string;\n sortColumn: \"key\" | \"kind\" | \"updated\" | \"tokens\";\n sortDir: \"asc\" | \"desc\";\n page: number;\n pageSize: number;\n actionsOpenKey: string | null;\n onFiltersChange: (next: {\n activeMinutes: string;\n limit: string;\n includeGlobal: boolean;\n includeUnknown: boolean;\n }) => void;\n onSearchChange: (query: string) => void;\n onSortChange: (column: \"key\" | \"kind\" | \"updated\" | \"tokens\", dir: \"asc\" | \"desc\") => void;\n onPageChange: (page: number) => void;\n onPageSizeChange: (size: number) => void;\n onActionsOpenChange: (key: string | null) => void;\n onRefresh: () => void;\n onPatch: (\n key: string,\n patch: {\n label?: string | null;\n thinkingLevel?: string | null;\n fastMode?: boolean | null;\n verboseLevel?: string | null;\n reasoningLevel?: string | null;\n },\n ) => void;\n onDelete: (key: string) => void;\n};\n\nconst THINK_LEVELS = [\"\", \"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\"] as const;\nconst BINARY_THINK_LEVELS = [\"\", \"off\", \"on\"] as const;\nconst VERBOSE_LEVELS = [\n { value: \"\", label: \"inherit\" },\n { value: \"off\", label: \"off (explicit)\" },\n { value: \"on\", label: \"on\" },\n { value: \"full\", label: \"full\" },\n] as const;\nconst FAST_LEVELS = [\n { value: \"\", label: \"inherit\" },\n { value: \"on\", label: \"on\" },\n { value: \"off\", label: \"off\" },\n] as const;\nconst REASONING_LEVELS = [\"\", \"off\", \"on\", \"stream\"] as const;\nconst PAGE_SIZES = [10, 25, 50, 100] as const;\n\nfunction normalizeProviderId(provider?: string | null): string {\n if (!provider) {\n return \"\";\n }\n const normalized = provider.trim().toLowerCase();\n if (normalized === \"z.ai\" || normalized === \"z-ai\") {\n return \"zai\";\n }\n return normalized;\n}\n\nfunction isBinaryThinkingProvider(provider?: string | null): boolean {\n return normalizeProviderId(provider) === \"zai\";\n}\n\nfunction resolveThinkLevelOptions(provider?: string | null): readonly string[] {\n return isBinaryThinkingProvider(provider) ? BINARY_THINK_LEVELS : THINK_LEVELS;\n}\n\nfunction withCurrentOption(options: readonly string[], current: string): string[] {\n if (!current) {\n return [...options];\n }\n if (options.includes(current)) {\n return [...options];\n }\n return [...options, current];\n}\n\nfunction withCurrentLabeledOption(\n options: readonly { value: string; label: string }[],\n current: string,\n): Array<{ value: string; label: string }> {\n if (!current) {\n return [...options];\n }\n if (options.some((option) => option.value === current)) {\n return [...options];\n }\n return [...options, { value: current, label: `${current} (custom)` }];\n}\n\nfunction resolveThinkLevelDisplay(value: string, isBinary: boolean): string {\n if (!isBinary) {\n return value;\n }\n if (!value || value === \"off\") {\n return value;\n }\n return \"on\";\n}\n\nfunction resolveThinkLevelPatchValue(value: string, isBinary: boolean): string | null {\n if (!value) {\n return null;\n }\n if (!isBinary) {\n return value;\n }\n if (value === \"on\") {\n return \"low\";\n }\n return value;\n}\n\nfunction filterRows(rows: GatewaySessionRow[], query: string): GatewaySessionRow[] {\n const q = query.trim().toLowerCase();\n if (!q) {\n return rows;\n }\n return rows.filter((row) => {\n const key = (row.key ?? \"\").toLowerCase();\n const label = (row.label ?? \"\").toLowerCase();\n const kind = (row.kind ?? \"\").toLowerCase();\n const displayName = (row.displayName ?? \"\").toLowerCase();\n return key.includes(q) || label.includes(q) || kind.includes(q) || displayName.includes(q);\n });\n}\n\nfunction sortRows(\n rows: GatewaySessionRow[],\n column: \"key\" | \"kind\" | \"updated\" | \"tokens\",\n dir: \"asc\" | \"desc\",\n): GatewaySessionRow[] {\n const cmp = dir === \"asc\" ? 1 : -1;\n return [...rows].toSorted((a, b) => {\n let diff = 0;\n switch (column) {\n case \"key\":\n diff = (a.key ?? \"\").localeCompare(b.key ?? \"\");\n break;\n case \"kind\":\n diff = (a.kind ?? \"\").localeCompare(b.kind ?? \"\");\n break;\n case \"updated\": {\n const au = a.updatedAt ?? 0;\n const bu = b.updatedAt ?? 0;\n diff = au - bu;\n break;\n }\n case \"tokens\": {\n const at = a.totalTokens ?? a.inputTokens ?? a.outputTokens ?? 0;\n const bt = b.totalTokens ?? b.inputTokens ?? b.outputTokens ?? 0;\n diff = at - bt;\n break;\n }\n }\n return diff * cmp;\n });\n}\n\nfunction paginateRows<T>(rows: T[], page: number, pageSize: number): T[] {\n const start = page * pageSize;\n return rows.slice(start, start + pageSize);\n}\n\nexport function renderSessions(props: SessionsProps) {\n const rawRows = props.result?.sessions ?? [];\n const filtered = filterRows(rawRows, props.searchQuery);\n const sorted = sortRows(filtered, props.sortColumn, props.sortDir);\n const totalRows = sorted.length;\n const totalPages = Math.max(1, Math.ceil(totalRows / props.pageSize));\n const page = Math.min(props.page, totalPages - 1);\n const paginated = paginateRows(sorted, page, props.pageSize);\n\n const sortHeader = (col: \"key\" | \"kind\" | \"updated\" | \"tokens\", label: string) => {\n const isActive = props.sortColumn === col;\n const nextDir = isActive && props.sortDir === \"asc\" ? (\"desc\" as const) : (\"asc\" as const);\n return html`\n <th\n data-sortable\n data-sort-dir=${isActive ? props.sortDir : \"\"}\n @click=${() => props.onSortChange(col, isActive ? nextDir : \"desc\")}\n >\n ${label}\n <span class=\"data-table-sort-icon\">${icons.arrowUpDown}</span>\n </th>\n `;\n };\n\n return html`\n ${\n props.actionsOpenKey\n ? html`\n <div\n class=\"data-table-overlay\"\n @click=${() => props.onActionsOpenChange(null)}\n aria-hidden=\"true\"\n ></div>\n `\n : nothing\n }\n <section class=\"card\" style=${props.actionsOpenKey ? \"position: relative; z-index: 41;\" : \"\"}>\n <div class=\"row\" style=\"justify-content: space-between; margin-bottom: 12px;\">\n <div>\n <div class=\"card-title\">Sessions</div>\n <div class=\"card-sub\">${props.result ? `Store: ${props.result.path}` : \"Active session keys and per-session overrides.\"}</div>\n </div>\n <button class=\"btn\" ?disabled=${props.loading} @click=${props.onRefresh}>\n ${props.loading ? \"Loading…\" : \"Refresh\"}\n </button>\n </div>\n\n <div class=\"filters\" style=\"margin-bottom: 12px;\">\n <label class=\"field-inline\">\n <span>Active</span>\n <input\n style=\"width: 72px;\"\n placeholder=\"min\"\n .value=${props.activeMinutes}\n @input=${(e: Event) =>\n props.onFiltersChange({\n activeMinutes: (e.target as HTMLInputElement).value,\n limit: props.limit,\n includeGlobal: props.includeGlobal,\n includeUnknown: props.includeUnknown,\n })}\n />\n </label>\n <label class=\"field-inline\">\n <span>Limit</span>\n <input\n style=\"width: 64px;\"\n .value=${props.limit}\n @input=${(e: Event) =>\n props.onFiltersChange({\n activeMinutes: props.activeMinutes,\n limit: (e.target as HTMLInputElement).value,\n includeGlobal: props.includeGlobal,\n includeUnknown: props.includeUnknown,\n })}\n />\n </label>\n <label class=\"field-inline checkbox\">\n <input\n type=\"checkbox\"\n .checked=${props.includeGlobal}\n @change=${(e: Event) =>\n props.onFiltersChange({\n activeMinutes: props.activeMinutes,\n limit: props.limit,\n includeGlobal: (e.target as HTMLInputElement).checked,\n includeUnknown: props.includeUnknown,\n })}\n />\n <span>Global</span>\n </label>\n <label class=\"field-inline checkbox\">\n <input\n type=\"checkbox\"\n .checked=${props.includeUnknown}\n @change=${(e: Event) =>\n props.onFiltersChange({\n activeMinutes: props.activeMinutes,\n limit: props.limit,\n includeGlobal: props.includeGlobal,\n includeUnknown: (e.target as HTMLInputElement).checked,\n })}\n />\n <span>Unknown</span>\n </label>\n </div>\n\n ${\n props.error\n ? html`<div class=\"callout danger\" style=\"margin-bottom: 12px;\">${props.error}</div>`\n : nothing\n }\n\n <div class=\"data-table-wrapper\">\n <div class=\"data-table-toolbar\">\n <div class=\"data-table-search\">\n <input\n type=\"text\"\n placeholder=\"Filter by key, label, kind…\"\n .value=${props.searchQuery}\n @input=${(e: Event) => props.onSearchChange((e.target as HTMLInputElement).value)}\n />\n </div>\n </div>\n\n <div class=\"data-table-container\">\n <table class=\"data-table\">\n <thead>\n <tr>\n ${sortHeader(\"key\", \"Key\")}\n <th>Label</th>\n ${sortHeader(\"kind\", \"Kind\")}\n ${sortHeader(\"updated\", \"Updated\")}\n ${sortHeader(\"tokens\", \"Tokens\")}\n <th>Thinking</th>\n <th>Fast</th>\n <th>Verbose</th>\n <th>Reasoning</th>\n <th style=\"width: 60px;\"></th>\n </tr>\n </thead>\n <tbody>\n ${\n paginated.length === 0\n ? html`\n <tr>\n <td colspan=\"10\" style=\"text-align: center; padding: 48px 16px; color: var(--muted)\">\n No sessions found.\n </td>\n </tr>\n `\n : paginated.map((row) =>\n renderRow(\n row,\n props.basePath,\n props.onPatch,\n props.onDelete,\n props.onActionsOpenChange,\n props.actionsOpenKey,\n props.loading,\n ),\n )\n }\n </tbody>\n </table>\n </div>\n\n ${\n totalRows > 0\n ? html`\n <div class=\"data-table-pagination\">\n <div class=\"data-table-pagination__info\">\n ${page * props.pageSize + 1}-${Math.min((page + 1) * props.pageSize, totalRows)}\n of ${totalRows} row${totalRows === 1 ? \"\" : \"s\"}\n </div>\n <div class=\"data-table-pagination__controls\">\n <select\n style=\"height: 32px; padding: 0 8px; font-size: 13px; border-radius: var(--radius-md); border: 1px solid var(--border); background: var(--card);\"\n .value=${String(props.pageSize)}\n @change=${(e: Event) =>\n props.onPageSizeChange(Number((e.target as HTMLSelectElement).value))}\n >\n ${PAGE_SIZES.map((s) => html`<option value=${s}>${s} per page</option>`)}\n </select>\n <button\n ?disabled=${page <= 0}\n @click=${() => props.onPageChange(page - 1)}\n >\n Previous\n </button>\n <button\n ?disabled=${page >= totalPages - 1}\n @click=${() => props.onPageChange(page + 1)}\n >\n Next\n </button>\n </div>\n </div>\n `\n : nothing\n }\n </div>\n </section>\n `;\n}\n\nfunction renderRow(\n row: GatewaySessionRow,\n basePath: string,\n onPatch: SessionsProps[\"onPatch\"],\n onDelete: SessionsProps[\"onDelete\"],\n onActionsOpenChange: (key: string | null) => void,\n actionsOpenKey: string | null,\n disabled: boolean,\n) {\n const updated = row.updatedAt ? formatRelativeTimestamp(row.updatedAt) : \"n/a\";\n const rawThinking = row.thinkingLevel ?? \"\";\n const isBinaryThinking = isBinaryThinkingProvider(row.modelProvider);\n const thinking = resolveThinkLevelDisplay(rawThinking, isBinaryThinking);\n const thinkLevels = withCurrentOption(resolveThinkLevelOptions(row.modelProvider), thinking);\n const fastMode = row.fastMode === true ? \"on\" : row.fastMode === false ? \"off\" : \"\";\n const fastLevels = withCurrentLabeledOption(FAST_LEVELS, fastMode);\n const verbose = row.verboseLevel ?? \"\";\n const verboseLevels = withCurrentLabeledOption(VERBOSE_LEVELS, verbose);\n const reasoning = row.reasoningLevel ?? \"\";\n const reasoningLevels = withCurrentOption(REASONING_LEVELS, reasoning);\n const displayName =\n typeof row.displayName === \"string\" && row.displayName.trim().length > 0\n ? row.displayName.trim()\n : null;\n const showDisplayName = Boolean(\n displayName &&\n displayName !== row.key &&\n displayName !== (typeof row.label === \"string\" ? row.label.trim() : \"\"),\n );\n const canLink = row.kind !== \"global\";\n const chatUrl = canLink\n ? `${pathForTab(\"chat\", basePath)}?session=${encodeURIComponent(row.key)}`\n : null;\n const isMenuOpen = actionsOpenKey === row.key;\n const badgeClass =\n row.kind === \"direct\"\n ? \"data-table-badge--direct\"\n : row.kind === \"group\"\n ? \"data-table-badge--group\"\n : row.kind === \"global\"\n ? \"data-table-badge--global\"\n : \"data-table-badge--unknown\";\n\n return html`\n <tr>\n <td>\n <div class=\"mono session-key-cell\">\n ${canLink ? html`<a href=${chatUrl} class=\"session-link\">${row.key}</a>` : row.key}\n ${\n showDisplayName\n ? html`<span class=\"muted session-key-display-name\">${displayName}</span>`\n : nothing\n }\n </div>\n </td>\n <td>\n <input\n .value=${row.label ?? \"\"}\n ?disabled=${disabled}\n placeholder=\"(optional)\"\n style=\"width: 100%; max-width: 140px; padding: 6px 10px; font-size: 13px; border: 1px solid var(--border); border-radius: var(--radius-sm);\"\n @change=${(e: Event) => {\n const value = (e.target as HTMLInputElement).value.trim();\n onPatch(row.key, { label: value || null });\n }}\n />\n </td>\n <td>\n <span class=\"data-table-badge ${badgeClass}\">${row.kind}</span>\n </td>\n <td>${updated}</td>\n <td>${formatSessionTokens(row)}</td>\n <td>\n <select\n ?disabled=${disabled}\n style=\"padding: 6px 10px; font-size: 13px; border: 1px solid var(--border); border-radius: var(--radius-sm); min-width: 90px;\"\n @change=${(e: Event) => {\n const value = (e.target as HTMLSelectElement).value;\n onPatch(row.key, {\n thinkingLevel: resolveThinkLevelPatchValue(value, isBinaryThinking),\n });\n }}\n >\n ${thinkLevels.map(\n (level) =>\n html`<option value=${level} ?selected=${thinking === level}>\n ${level || \"inherit\"}\n </option>`,\n )}\n </select>\n </td>\n <td>\n <select\n ?disabled=${disabled}\n style=\"padding: 6px 10px; font-size: 13px; border: 1px solid var(--border); border-radius: var(--radius-sm); min-width: 90px;\"\n @change=${(e: Event) => {\n const value = (e.target as HTMLSelectElement).value;\n onPatch(row.key, { fastMode: value === \"\" ? null : value === \"on\" });\n }}\n >\n ${fastLevels.map(\n (level) =>\n html`<option value=${level.value} ?selected=${fastMode === level.value}>\n ${level.label}\n </option>`,\n )}\n </select>\n </td>\n <td>\n <select\n ?disabled=${disabled}\n style=\"padding: 6px 10px; font-size: 13px; border: 1px solid var(--border); border-radius: var(--radius-sm); min-width: 90px;\"\n @change=${(e: Event) => {\n const value = (e.target as HTMLSelectElement).value;\n onPatch(row.key, { verboseLevel: value || null });\n }}\n >\n ${verboseLevels.map(\n (level) =>\n html`<option value=${level.value} ?selected=${verbose === level.value}>\n ${level.label}\n </option>`,\n )}\n </select>\n </td>\n <td>\n <select\n ?disabled=${disabled}\n style=\"padding: 6px 10px; font-size: 13px; border: 1px solid var(--border); border-radius: var(--radius-sm); min-width: 90px;\"\n @change=${(e: Event) => {\n const value = (e.target as HTMLSelectElement).value;\n onPatch(row.key, { reasoningLevel: value || null });\n }}\n >\n ${reasoningLevels.map(\n (level) =>\n html`<option value=${level} ?selected=${reasoning === level}>\n ${level || \"inherit\"}\n </option>`,\n )}\n </select>\n </td>\n <td>\n <div class=\"data-table-row-actions\">\n <button\n type=\"button\"\n class=\"data-table-row-actions__trigger\"\n aria-label=\"Open menu\"\n @click=${(e: Event) => {\n e.stopPropagation();\n onActionsOpenChange(isMenuOpen ? null : row.key);\n }}\n >\n ${icons.moreHorizontal}\n </button>\n ${\n isMenuOpen\n ? html`\n <div class=\"data-table-row-actions__menu\">\n ${\n canLink\n ? html`\n <a\n href=${chatUrl}\n style=\"display: block; padding: 8px 12px; font-size: 13px; text-decoration: none; color: var(--text); border-radius: var(--radius-sm);\"\n @click=${() => onActionsOpenChange(null)}\n >\n Open in Chat\n </a>\n `\n : nothing\n }\n <button\n type=\"button\"\n class=\"danger\"\n @click=${() => {\n onActionsOpenChange(null);\n onDelete(row.key);\n }}\n >\n Delete\n </button>\n </div>\n `\n : nothing\n }\n </div>\n </td>\n </tr>\n `;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"sessions-DH9UNOOk.js","names":[],"sources":["../../../ui/src/ui/views/sessions.ts"],"sourcesContent":["import { html, nothing } from \"lit\";\nimport { formatRelativeTimestamp } from \"../format.ts\";\nimport { icons } from \"../icons.ts\";\nimport { pathForTab } from \"../navigation.ts\";\nimport { formatSessionTokens } from \"../presenter.ts\";\nimport type { GatewaySessionRow, SessionsListResult } from \"../types.ts\";\n\nexport type SessionsProps = {\n loading: boolean;\n result: SessionsListResult | null;\n error: string | null;\n activeMinutes: string;\n limit: string;\n includeGlobal: boolean;\n includeUnknown: boolean;\n basePath: string;\n searchQuery: string;\n sortColumn: \"key\" | \"kind\" | \"updated\" | \"tokens\";\n sortDir: \"asc\" | \"desc\";\n page: number;\n pageSize: number;\n actionsOpenKey: string | null;\n onFiltersChange: (next: {\n activeMinutes: string;\n limit: string;\n includeGlobal: boolean;\n includeUnknown: boolean;\n }) => void;\n onSearchChange: (query: string) => void;\n onSortChange: (column: \"key\" | \"kind\" | \"updated\" | \"tokens\", dir: \"asc\" | \"desc\") => void;\n onPageChange: (page: number) => void;\n onPageSizeChange: (size: number) => void;\n onActionsOpenChange: (key: string | null) => void;\n onRefresh: () => void;\n onPatch: (\n key: string,\n patch: {\n label?: string | null;\n thinkingLevel?: string | null;\n fastMode?: boolean | null;\n verboseLevel?: string | null;\n reasoningLevel?: string | null;\n },\n ) => void;\n onDelete: (key: string) => void;\n};\n\nconst THINK_LEVELS = [\"\", \"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\"] as const;\nconst BINARY_THINK_LEVELS = [\"\", \"off\", \"on\"] as const;\nconst VERBOSE_LEVELS = [\n { value: \"\", label: \"inherit\" },\n { value: \"off\", label: \"off (explicit)\" },\n { value: \"on\", label: \"on\" },\n { value: \"full\", label: \"full\" },\n] as const;\nconst FAST_LEVELS = [\n { value: \"\", label: \"inherit\" },\n { value: \"on\", label: \"on\" },\n { value: \"off\", label: \"off\" },\n] as const;\nconst REASONING_LEVELS = [\"\", \"off\", \"on\", \"stream\"] as const;\nconst PAGE_SIZES = [10, 25, 50, 100] as const;\n\nfunction normalizeProviderId(provider?: string | null): string {\n if (!provider) {\n return \"\";\n }\n const normalized = provider.trim().toLowerCase();\n if (normalized === \"z.ai\" || normalized === \"z-ai\") {\n return \"zai\";\n }\n return normalized;\n}\n\nfunction isBinaryThinkingProvider(provider?: string | null): boolean {\n return normalizeProviderId(provider) === \"zai\";\n}\n\nfunction resolveThinkLevelOptions(provider?: string | null): readonly string[] {\n return isBinaryThinkingProvider(provider) ? BINARY_THINK_LEVELS : THINK_LEVELS;\n}\n\nfunction withCurrentOption(options: readonly string[], current: string): string[] {\n if (!current) {\n return [...options];\n }\n if (options.includes(current)) {\n return [...options];\n }\n return [...options, current];\n}\n\nfunction withCurrentLabeledOption(\n options: readonly { value: string; label: string }[],\n current: string,\n): Array<{ value: string; label: string }> {\n if (!current) {\n return [...options];\n }\n if (options.some((option) => option.value === current)) {\n return [...options];\n }\n return [...options, { value: current, label: `${current} (custom)` }];\n}\n\nfunction resolveThinkLevelDisplay(value: string, isBinary: boolean): string {\n if (!isBinary) {\n return value;\n }\n if (!value || value === \"off\") {\n return value;\n }\n return \"on\";\n}\n\nfunction resolveThinkLevelPatchValue(value: string, isBinary: boolean): string | null {\n if (!value) {\n return null;\n }\n if (!isBinary) {\n return value;\n }\n if (value === \"on\") {\n return \"low\";\n }\n return value;\n}\n\nfunction filterRows(rows: GatewaySessionRow[], query: string): GatewaySessionRow[] {\n const q = query.trim().toLowerCase();\n if (!q) {\n return rows;\n }\n return rows.filter((row) => {\n const key = (row.key ?? \"\").toLowerCase();\n const label = (row.label ?? \"\").toLowerCase();\n const kind = (row.kind ?? \"\").toLowerCase();\n const displayName = (row.displayName ?? \"\").toLowerCase();\n return key.includes(q) || label.includes(q) || kind.includes(q) || displayName.includes(q);\n });\n}\n\nfunction sortRows(\n rows: GatewaySessionRow[],\n column: \"key\" | \"kind\" | \"updated\" | \"tokens\",\n dir: \"asc\" | \"desc\",\n): GatewaySessionRow[] {\n const cmp = dir === \"asc\" ? 1 : -1;\n return [...rows].toSorted((a, b) => {\n let diff = 0;\n switch (column) {\n case \"key\":\n diff = (a.key ?? \"\").localeCompare(b.key ?? \"\");\n break;\n case \"kind\":\n diff = (a.kind ?? \"\").localeCompare(b.kind ?? \"\");\n break;\n case \"updated\": {\n const au = a.updatedAt ?? 0;\n const bu = b.updatedAt ?? 0;\n diff = au - bu;\n break;\n }\n case \"tokens\": {\n const at = a.totalTokens ?? a.inputTokens ?? a.outputTokens ?? 0;\n const bt = b.totalTokens ?? b.inputTokens ?? b.outputTokens ?? 0;\n diff = at - bt;\n break;\n }\n }\n return diff * cmp;\n });\n}\n\nfunction paginateRows<T>(rows: T[], page: number, pageSize: number): T[] {\n const start = page * pageSize;\n return rows.slice(start, start + pageSize);\n}\n\nexport function renderSessions(props: SessionsProps) {\n const rawRows = props.result?.sessions ?? [];\n const filtered = filterRows(rawRows, props.searchQuery);\n const sorted = sortRows(filtered, props.sortColumn, props.sortDir);\n const totalRows = sorted.length;\n const totalPages = Math.max(1, Math.ceil(totalRows / props.pageSize));\n const page = Math.min(props.page, totalPages - 1);\n const paginated = paginateRows(sorted, page, props.pageSize);\n\n const sortHeader = (col: \"key\" | \"kind\" | \"updated\" | \"tokens\", label: string) => {\n const isActive = props.sortColumn === col;\n const nextDir = isActive && props.sortDir === \"asc\" ? (\"desc\" as const) : (\"asc\" as const);\n return html`\n <th\n data-sortable\n data-sort-dir=${isActive ? props.sortDir : \"\"}\n @click=${() => props.onSortChange(col, isActive ? nextDir : \"desc\")}\n >\n ${label}\n <span class=\"data-table-sort-icon\">${icons.arrowUpDown}</span>\n </th>\n `;\n };\n\n return html`\n ${\n props.actionsOpenKey\n ? html`\n <div\n class=\"data-table-overlay\"\n @click=${() => props.onActionsOpenChange(null)}\n aria-hidden=\"true\"\n ></div>\n `\n : nothing\n }\n <section class=\"card\" style=${props.actionsOpenKey ? \"position: relative; z-index: 41;\" : \"\"}>\n <div class=\"row\" style=\"justify-content: space-between; margin-bottom: 12px;\">\n <div>\n <div class=\"card-title\">Sessions</div>\n <div class=\"card-sub\">${props.result ? `Store: ${props.result.path}` : \"Active session keys and per-session overrides.\"}</div>\n </div>\n <button class=\"btn\" ?disabled=${props.loading} @click=${props.onRefresh}>\n ${props.loading ? \"Loading…\" : \"Refresh\"}\n </button>\n </div>\n\n <div class=\"filters\" style=\"margin-bottom: 12px;\">\n <label class=\"field-inline\">\n <span>Active</span>\n <input\n style=\"width: 72px;\"\n placeholder=\"min\"\n .value=${props.activeMinutes}\n @input=${(e: Event) =>\n props.onFiltersChange({\n activeMinutes: (e.target as HTMLInputElement).value,\n limit: props.limit,\n includeGlobal: props.includeGlobal,\n includeUnknown: props.includeUnknown,\n })}\n />\n </label>\n <label class=\"field-inline\">\n <span>Limit</span>\n <input\n style=\"width: 64px;\"\n .value=${props.limit}\n @input=${(e: Event) =>\n props.onFiltersChange({\n activeMinutes: props.activeMinutes,\n limit: (e.target as HTMLInputElement).value,\n includeGlobal: props.includeGlobal,\n includeUnknown: props.includeUnknown,\n })}\n />\n </label>\n <label class=\"field-inline checkbox\">\n <input\n type=\"checkbox\"\n .checked=${props.includeGlobal}\n @change=${(e: Event) =>\n props.onFiltersChange({\n activeMinutes: props.activeMinutes,\n limit: props.limit,\n includeGlobal: (e.target as HTMLInputElement).checked,\n includeUnknown: props.includeUnknown,\n })}\n />\n <span>Global</span>\n </label>\n <label class=\"field-inline checkbox\">\n <input\n type=\"checkbox\"\n .checked=${props.includeUnknown}\n @change=${(e: Event) =>\n props.onFiltersChange({\n activeMinutes: props.activeMinutes,\n limit: props.limit,\n includeGlobal: props.includeGlobal,\n includeUnknown: (e.target as HTMLInputElement).checked,\n })}\n />\n <span>Unknown</span>\n </label>\n </div>\n\n ${\n props.error\n ? html`<div class=\"callout danger\" style=\"margin-bottom: 12px;\">${props.error}</div>`\n : nothing\n }\n\n <div class=\"data-table-wrapper\">\n <div class=\"data-table-toolbar\">\n <div class=\"data-table-search\">\n <input\n type=\"text\"\n placeholder=\"Filter by key, label, kind…\"\n .value=${props.searchQuery}\n @input=${(e: Event) => props.onSearchChange((e.target as HTMLInputElement).value)}\n />\n </div>\n </div>\n\n <div class=\"data-table-container\">\n <table class=\"data-table\">\n <thead>\n <tr>\n ${sortHeader(\"key\", \"Key\")}\n <th>Label</th>\n ${sortHeader(\"kind\", \"Kind\")}\n ${sortHeader(\"updated\", \"Updated\")}\n ${sortHeader(\"tokens\", \"Tokens\")}\n <th>Thinking</th>\n <th>Fast</th>\n <th>Verbose</th>\n <th>Reasoning</th>\n <th style=\"width: 60px;\"></th>\n </tr>\n </thead>\n <tbody>\n ${\n paginated.length === 0\n ? html`\n <tr>\n <td colspan=\"10\" style=\"text-align: center; padding: 48px 16px; color: var(--muted)\">\n No sessions found.\n </td>\n </tr>\n `\n : paginated.map((row) =>\n renderRow(\n row,\n props.basePath,\n props.onPatch,\n props.onDelete,\n props.onActionsOpenChange,\n props.actionsOpenKey,\n props.loading,\n ),\n )\n }\n </tbody>\n </table>\n </div>\n\n ${\n totalRows > 0\n ? html`\n <div class=\"data-table-pagination\">\n <div class=\"data-table-pagination__info\">\n ${page * props.pageSize + 1}-${Math.min((page + 1) * props.pageSize, totalRows)}\n of ${totalRows} row${totalRows === 1 ? \"\" : \"s\"}\n </div>\n <div class=\"data-table-pagination__controls\">\n <select\n style=\"height: 32px; padding: 0 8px; font-size: 13px; border-radius: var(--radius-md); border: 1px solid var(--border); background: var(--card);\"\n .value=${String(props.pageSize)}\n @change=${(e: Event) =>\n props.onPageSizeChange(Number((e.target as HTMLSelectElement).value))}\n >\n ${PAGE_SIZES.map((s) => html`<option value=${s}>${s} per page</option>`)}\n </select>\n <button\n ?disabled=${page <= 0}\n @click=${() => props.onPageChange(page - 1)}\n >\n Previous\n </button>\n <button\n ?disabled=${page >= totalPages - 1}\n @click=${() => props.onPageChange(page + 1)}\n >\n Next\n </button>\n </div>\n </div>\n `\n : nothing\n }\n </div>\n </section>\n `;\n}\n\nfunction renderRow(\n row: GatewaySessionRow,\n basePath: string,\n onPatch: SessionsProps[\"onPatch\"],\n onDelete: SessionsProps[\"onDelete\"],\n onActionsOpenChange: (key: string | null) => void,\n actionsOpenKey: string | null,\n disabled: boolean,\n) {\n const updated = row.updatedAt ? formatRelativeTimestamp(row.updatedAt) : \"n/a\";\n const rawThinking = row.thinkingLevel ?? \"\";\n const isBinaryThinking = isBinaryThinkingProvider(row.modelProvider);\n const thinking = resolveThinkLevelDisplay(rawThinking, isBinaryThinking);\n const thinkLevels = withCurrentOption(resolveThinkLevelOptions(row.modelProvider), thinking);\n const fastMode = row.fastMode === true ? \"on\" : row.fastMode === false ? \"off\" : \"\";\n const fastLevels = withCurrentLabeledOption(FAST_LEVELS, fastMode);\n const verbose = row.verboseLevel ?? \"\";\n const verboseLevels = withCurrentLabeledOption(VERBOSE_LEVELS, verbose);\n const reasoning = row.reasoningLevel ?? \"\";\n const reasoningLevels = withCurrentOption(REASONING_LEVELS, reasoning);\n const displayName =\n typeof row.displayName === \"string\" && row.displayName.trim().length > 0\n ? row.displayName.trim()\n : null;\n const showDisplayName = Boolean(\n displayName &&\n displayName !== row.key &&\n displayName !== (typeof row.label === \"string\" ? row.label.trim() : \"\"),\n );\n const canLink = row.kind !== \"global\";\n const chatUrl = canLink\n ? `${pathForTab(\"chat\", basePath)}?session=${encodeURIComponent(row.key)}`\n : null;\n const isMenuOpen = actionsOpenKey === row.key;\n const badgeClass =\n row.kind === \"direct\"\n ? \"data-table-badge--direct\"\n : row.kind === \"group\"\n ? \"data-table-badge--group\"\n : row.kind === \"global\"\n ? \"data-table-badge--global\"\n : \"data-table-badge--unknown\";\n\n return html`\n <tr>\n <td>\n <div class=\"mono session-key-cell\">\n ${canLink ? html`<a href=${chatUrl} class=\"session-link\">${row.key}</a>` : row.key}\n ${\n showDisplayName\n ? html`<span class=\"muted session-key-display-name\">${displayName}</span>`\n : nothing\n }\n </div>\n </td>\n <td>\n <input\n .value=${row.label ?? \"\"}\n ?disabled=${disabled}\n placeholder=\"(optional)\"\n style=\"width: 100%; max-width: 140px; padding: 6px 10px; font-size: 13px; border: 1px solid var(--border); border-radius: var(--radius-sm);\"\n @change=${(e: Event) => {\n const value = (e.target as HTMLInputElement).value.trim();\n onPatch(row.key, { label: value || null });\n }}\n />\n </td>\n <td>\n <span class=\"data-table-badge ${badgeClass}\">${row.kind}</span>\n </td>\n <td>${updated}</td>\n <td>${formatSessionTokens(row)}</td>\n <td>\n <select\n ?disabled=${disabled}\n style=\"padding: 6px 10px; font-size: 13px; border: 1px solid var(--border); border-radius: var(--radius-sm); min-width: 90px;\"\n @change=${(e: Event) => {\n const value = (e.target as HTMLSelectElement).value;\n onPatch(row.key, {\n thinkingLevel: resolveThinkLevelPatchValue(value, isBinaryThinking),\n });\n }}\n >\n ${thinkLevels.map(\n (level) =>\n html`<option value=${level} ?selected=${thinking === level}>\n ${level || \"inherit\"}\n </option>`,\n )}\n </select>\n </td>\n <td>\n <select\n ?disabled=${disabled}\n style=\"padding: 6px 10px; font-size: 13px; border: 1px solid var(--border); border-radius: var(--radius-sm); min-width: 90px;\"\n @change=${(e: Event) => {\n const value = (e.target as HTMLSelectElement).value;\n onPatch(row.key, { fastMode: value === \"\" ? null : value === \"on\" });\n }}\n >\n ${fastLevels.map(\n (level) =>\n html`<option value=${level.value} ?selected=${fastMode === level.value}>\n ${level.label}\n </option>`,\n )}\n </select>\n </td>\n <td>\n <select\n ?disabled=${disabled}\n style=\"padding: 6px 10px; font-size: 13px; border: 1px solid var(--border); border-radius: var(--radius-sm); min-width: 90px;\"\n @change=${(e: Event) => {\n const value = (e.target as HTMLSelectElement).value;\n onPatch(row.key, { verboseLevel: value || null });\n }}\n >\n ${verboseLevels.map(\n (level) =>\n html`<option value=${level.value} ?selected=${verbose === level.value}>\n ${level.label}\n </option>`,\n )}\n </select>\n </td>\n <td>\n <select\n ?disabled=${disabled}\n style=\"padding: 6px 10px; font-size: 13px; border: 1px solid var(--border); border-radius: var(--radius-sm); min-width: 90px;\"\n @change=${(e: Event) => {\n const value = (e.target as HTMLSelectElement).value;\n onPatch(row.key, { reasoningLevel: value || null });\n }}\n >\n ${reasoningLevels.map(\n (level) =>\n html`<option value=${level} ?selected=${reasoning === level}>\n ${level || \"inherit\"}\n </option>`,\n )}\n </select>\n </td>\n <td>\n <div class=\"data-table-row-actions\">\n <button\n type=\"button\"\n class=\"data-table-row-actions__trigger\"\n aria-label=\"Open menu\"\n @click=${(e: Event) => {\n e.stopPropagation();\n onActionsOpenChange(isMenuOpen ? null : row.key);\n }}\n >\n ${icons.moreHorizontal}\n </button>\n ${\n isMenuOpen\n ? html`\n <div class=\"data-table-row-actions__menu\">\n ${\n canLink\n ? html`\n <a\n href=${chatUrl}\n style=\"display: block; padding: 8px 12px; font-size: 13px; text-decoration: none; color: var(--text); border-radius: var(--radius-sm);\"\n @click=${() => onActionsOpenChange(null)}\n >\n Open in Chat\n </a>\n `\n : nothing\n }\n <button\n type=\"button\"\n class=\"danger\"\n @click=${() => {\n onActionsOpenChange(null);\n onDelete(row.key);\n }}\n >\n Delete\n </button>\n </div>\n `\n : nothing\n }\n </div>\n </td>\n </tr>\n `;\n}\n"],"mappings":"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"}
Binary file
Binary file
@@ -1,22 +1,4 @@
1
1
  <svg viewBox="0 0 120 120" fill="none" xmlns="http://www.w3.org/2000/svg">
2
- <defs>
3
- <linearGradient id="lobster-gradient" x1="0%" y1="0%" x2="100%" y2="100%">
4
- <stop offset="0%" stop-color="#ff4d4d"/>
5
- <stop offset="100%" stop-color="#991b1b"/>
6
- </linearGradient>
7
- </defs>
8
- <!-- Body -->
9
- <path d="M60 10 C30 10 15 35 15 55 C15 75 30 95 45 100 L45 110 L55 110 L55 100 C55 100 60 102 65 100 L65 110 L75 110 L75 100 C90 95 105 75 105 55 C105 35 90 10 60 10Z" fill="url(#lobster-gradient)"/>
10
- <!-- Left Claw -->
11
- <path d="M20 45 C5 40 0 50 5 60 C10 70 20 65 25 55 C28 48 25 45 20 45Z" fill="url(#lobster-gradient)"/>
12
- <!-- Right Claw -->
13
- <path d="M100 45 C115 40 120 50 115 60 C110 70 100 65 95 55 C92 48 95 45 100 45Z" fill="url(#lobster-gradient)"/>
14
- <!-- Antenna -->
15
- <path d="M45 15 Q35 5 30 8" stroke="#ff4d4d" stroke-width="3" stroke-linecap="round"/>
16
- <path d="M75 15 Q85 5 90 8" stroke="#ff4d4d" stroke-width="3" stroke-linecap="round"/>
17
- <!-- Eyes -->
18
- <circle cx="45" cy="35" r="6" fill="#050810"/>
19
- <circle cx="75" cy="35" r="6" fill="#050810"/>
20
- <circle cx="46" cy="34" r="2.5" fill="#00e5cc"/>
21
- <circle cx="76" cy="34" r="2.5" fill="#00e5cc"/>
2
+ <circle cx="60" cy="60" r="60" fill="#000000"/>
3
+ <path d="M60.5 24C49.2 24 40 30.8 40 40.5c0 8.2 6.5 13.5 17 16.5l7 2c7.5 2.2 10.5 5 10.5 9.5 0 5.8-5.5 10-13.5 10-8.5 0-14.5-4.5-15.5-11.5H36c1 11 10 18 24.5 18C72.8 95 82 87.8 82 78c0-8.5-6.5-14-17.5-17l-7-2C50.5 57 48 54.5 48 50c0-5.5 5-9.5 12.5-9.5 7 0 12 4 13 10h9.5C82 39.2 73 24 60.5 24z" fill="#ffffff"/>
22
4
  </svg>
@@ -11,7 +11,7 @@
11
11
  <link rel="preconnect" href="https://fonts.googleapis.com" />
12
12
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
13
13
  <link href="https://fonts.googleapis.com/css2?family=DM+Sans:ital,opsz,wght@0,9..40,100..1000;1,9..40,100..1000&family=DM+Serif+Display&family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet" />
14
- <script type="module" crossorigin src="./assets/index-BuRzKVZo.js"></script>
14
+ <script type="module" crossorigin src="./assets/index-C4WQH4rc.js"></script>
15
15
  <link rel="modulepreload" crossorigin href="./assets/lit-BZwq2xLD.js">
16
16
  <link rel="modulepreload" crossorigin href="./assets/format-DeRVtGzv.js">
17
17
  <link rel="stylesheet" crossorigin href="./assets/index-C10civSh.css">
@@ -3,7 +3,7 @@ import "./paths-CNIc83Pn.js";
3
3
  import "./subsystem-Cr1MiLhx.js";
4
4
  import "./workspace-NUzlQide.js";
5
5
  import "./logger-DCBlX1uz.js";
6
- import { Pt as deliverOutboundPayloads } from "./model-selection-lqb-eBNl.js";
6
+ import { Pt as deliverOutboundPayloads } from "./model-selection-CT3B1Am0.js";
7
7
  import "./github-copilot-token-BeFx3MLn.js";
8
8
  import "./boolean-C7Ct_klp.js";
9
9
  import "./fetch-BdTTF2z-.js";
@@ -3,7 +3,7 @@ import "./paths-CNIc83Pn.js";
3
3
  import "./subsystem-Cr1MiLhx.js";
4
4
  import "./workspace-NUzlQide.js";
5
5
  import "./logger-DCBlX1uz.js";
6
- import { qn as describeImageWithModel } from "./model-selection-lqb-eBNl.js";
6
+ import { qn as describeImageWithModel } from "./model-selection-CT3B1Am0.js";
7
7
  import "./github-copilot-token-BeFx3MLn.js";
8
8
  import "./boolean-C7Ct_klp.js";
9
9
  import "./fetch-BdTTF2z-.js";
@@ -3,7 +3,7 @@ import "./paths-CNIc83Pn.js";
3
3
  import { t as createSubsystemLogger } from "./subsystem-Cr1MiLhx.js";
4
4
  import "./workspace-NUzlQide.js";
5
5
  import "./logger-DCBlX1uz.js";
6
- import { J as runEmbeddedPiAgent, ji as DEFAULT_PROVIDER, o as parseModelRef } from "./model-selection-lqb-eBNl.js";
6
+ import { J as runEmbeddedPiAgent, ji as DEFAULT_PROVIDER, o as parseModelRef } from "./model-selection-CT3B1Am0.js";
7
7
  import "./github-copilot-token-BeFx3MLn.js";
8
8
  import "./boolean-C7Ct_klp.js";
9
9
  import "./fetch-BdTTF2z-.js";
@@ -1,7 +1,7 @@
1
1
  import { a as defaultRuntime, h as success, l as danger, u as info } from "./subsystem-Cr1MiLhx.js";
2
2
  import { r as logInfo } from "./logger-DCBlX1uz.js";
3
- import { Ci as formatCliCommand, vi as loadConfig, wr as logoutWeb, yr as resolveWhatsAppAccount } from "./model-selection-lqb-eBNl.js";
4
- import { i as waitForWaConnection, n as formatError, t as createWaSocket } from "./session-w6ourRUd.js";
3
+ import { Ci as formatCliCommand, vi as loadConfig, wr as logoutWeb, yr as resolveWhatsAppAccount } from "./model-selection-CT3B1Am0.js";
4
+ import { i as waitForWaConnection, n as formatError, t as createWaSocket } from "./session-D-TVYl1e.js";
5
5
  import { DisconnectReason } from "@whiskeysockets/baileys";
6
6
  //#region extensions/whatsapp/src/login.ts
7
7
  async function loginWeb(verbose, waitForConnection, runtime = defaultRuntime, accountId) {
@@ -3,12 +3,12 @@ import "./paths-CNIc83Pn.js";
3
3
  import { a as defaultRuntime, h as success, l as danger, u as info } from "./subsystem-Cr1MiLhx.js";
4
4
  import "./workspace-NUzlQide.js";
5
5
  import { r as logInfo } from "./logger-DCBlX1uz.js";
6
- import { Mr as webAuthExists, Or as readWebSelfId, vi as loadConfig, wr as logoutWeb, yr as resolveWhatsAppAccount } from "./model-selection-lqb-eBNl.js";
6
+ import { Mr as webAuthExists, Or as readWebSelfId, vi as loadConfig, wr as logoutWeb, yr as resolveWhatsAppAccount } from "./model-selection-CT3B1Am0.js";
7
7
  import "./github-copilot-token-BeFx3MLn.js";
8
8
  import "./boolean-C7Ct_klp.js";
9
9
  import "./fetch-BdTTF2z-.js";
10
10
  import "./frontmatter-DZlWsaUx.js";
11
- import { i as waitForWaConnection, n as formatError, r as getStatusCode, t as createWaSocket } from "./session-w6ourRUd.js";
11
+ import { i as waitForWaConnection, n as formatError, r as getStatusCode, t as createWaSocket } from "./session-D-TVYl1e.js";
12
12
  import { randomUUID } from "node:crypto";
13
13
  import { DisconnectReason } from "@whiskeysockets/baileys";
14
14
  import QRCodeModule from "qrcode-terminal/vendor/QRCode/index.js";
@@ -3,7 +3,7 @@ import "./paths-CNIc83Pn.js";
3
3
  import "./subsystem-Cr1MiLhx.js";
4
4
  import "./workspace-NUzlQide.js";
5
5
  import "./logger-DCBlX1uz.js";
6
- import { Xt as MemoryIndexManager, Zt as closeAllMemoryIndexManagers } from "./model-selection-lqb-eBNl.js";
6
+ import { Xt as MemoryIndexManager, Zt as closeAllMemoryIndexManagers } from "./model-selection-CT3B1Am0.js";
7
7
  import "./github-copilot-token-BeFx3MLn.js";
8
8
  import "./boolean-C7Ct_klp.js";
9
9
  import "./fetch-BdTTF2z-.js";
@@ -3,12 +3,12 @@ import "./paths-CNIc83Pn.js";
3
3
  import { E as resolvePreferredOpenClawTmpDir, d as logVerbose, m as shouldLogVerbose, t as createSubsystemLogger } from "./subsystem-Cr1MiLhx.js";
4
4
  import "./workspace-NUzlQide.js";
5
5
  import "./logger-DCBlX1uz.js";
6
- import { Fn as textToSpeech, Hn as buildProviderRegistry, In as parseTtsDirectives, Kn as runCapability, Pn as resolveTtsConfig, T as isDangerousNameMatchingEnabled, Tn as formatDiscordUserTag, Un as createMediaAttachmentCache, Wn as normalizeMediaAttachments, bn as formatMention, hi as formatErrorMessage, hn as resolveAgentRoute, wn as resolveDiscordOwnerAccess } from "./model-selection-lqb-eBNl.js";
6
+ import { Fn as textToSpeech, Hn as buildProviderRegistry, In as parseTtsDirectives, Kn as runCapability, Pn as resolveTtsConfig, T as isDangerousNameMatchingEnabled, Tn as formatDiscordUserTag, Un as createMediaAttachmentCache, Wn as normalizeMediaAttachments, bn as formatMention, hi as formatErrorMessage, hn as resolveAgentRoute, wn as resolveDiscordOwnerAccess } from "./model-selection-CT3B1Am0.js";
7
7
  import "./github-copilot-token-BeFx3MLn.js";
8
8
  import "./boolean-C7Ct_klp.js";
9
9
  import "./fetch-BdTTF2z-.js";
10
10
  import "./frontmatter-DZlWsaUx.js";
11
- import { n as agentCommandFromIngress } from "./agent-Chu8M4xO.js";
11
+ import { n as agentCommandFromIngress } from "./agent-BBNM4JBh.js";
12
12
  import { createRequire } from "node:module";
13
13
  import fs from "node:fs/promises";
14
14
  import path from "node:path";