sliccy 6.94.1 → 6.96.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/dist/node-server/_shared/tray-sync-protocol.d.ts +11 -0
  2. package/dist/node-server/_shared/tray-sync-protocol.d.ts.map +1 -1
  3. package/dist/node-server/_shared/tray-sync-protocol.js.map +1 -1
  4. package/dist/ui/.vite/manifest.json +206 -198
  5. package/dist/ui/assets/CLAUDE-CYnFKAQa.js +1 -0
  6. package/dist/ui/assets/{MEMORY-6FXnIBfJ.js → MEMORY-CJ-KH_KB.js} +3 -1
  7. package/dist/ui/assets/{account-store-DX5RSOsS.js → account-store-A0FEce7b.js} +1 -1
  8. package/dist/ui/assets/{account-store-DPoyiqT_.js → account-store-DVhMCA9p.js} +1 -1
  9. package/dist/ui/assets/{adobe-Cs_MHopl.js → adobe-DUjccP-7.js} +1 -1
  10. package/dist/ui/assets/{adobe-BhmDZ2ut.js → adobe-Pj8kjFyN.js} +1 -1
  11. package/dist/ui/assets/{apply-layout-C_xK5oFy.js → apply-layout-B2OE_AVT.js} +1 -1
  12. package/dist/ui/assets/{apps-BqX9-un2.js → apps-BZjRhetz.js} +1 -1
  13. package/dist/ui/assets/auto-mount-table-B5XJxoBU.js +1 -0
  14. package/dist/ui/assets/{azure-openai-BmpVt-Bj.js → azure-openai-BJYQxTri.js} +1 -1
  15. package/dist/ui/assets/{azure-openai-DGagieN8.js → azure-openai-wM6pjmpZ.js} +1 -1
  16. package/dist/ui/assets/boot-stall-overlay-Pxp4nHfq.js +1 -0
  17. package/dist/ui/assets/{cerebras-BJJ3Ufg7.js → cerebras-DEljNQJH.js} +1 -1
  18. package/dist/ui/assets/{cerebras-Dyzn_zcN.js → cerebras-Du2bEZJ9.js} +1 -1
  19. package/dist/ui/assets/{connect-surface-Bxm_D9El.js → connect-surface-LxdIQJSo.js} +1 -1
  20. package/dist/ui/assets/{dip-BAhP6UaU.js → dip-rCM_6Bc6.js} +3 -3
  21. package/dist/ui/assets/fs-5vJy5IQB.js +1 -0
  22. package/dist/ui/assets/fs-C58jPYKt.js +2 -0
  23. package/dist/ui/assets/{github-BRb0e9_Y.js → github-BCK0ogca.js} +1 -1
  24. package/dist/ui/assets/{github-BnUdQf7-.js → github-CnZAQcYf.js} +2 -2
  25. package/dist/ui/assets/{github-copilot-yGXQuqX4.js → github-copilot-A0h5ULDb.js} +1 -1
  26. package/dist/ui/assets/{github-copilot-DNN6vRnx.js → github-copilot-CNY6xA9M.js} +1 -1
  27. package/dist/ui/assets/{github-install-CT2V9YXG.js → github-install-Dvd5NYhp.js} +1 -1
  28. package/dist/ui/assets/{github-zip-Doz9d_kn.js → github-zip-BulNtgAD.js} +1 -1
  29. package/dist/ui/assets/{js-realm-worker-B7_5BxXy.js → js-realm-worker-DroZKLXp.js} +1 -1
  30. package/dist/ui/assets/{kernel-worker-b0a6VEgR.js → kernel-worker-Cq6nV36n.js} +618 -617
  31. package/dist/ui/assets/{local-llm-ClMP-vbp.js → local-llm-CIDDcfLX.js} +1 -1
  32. package/dist/ui/assets/{local-llm-CNBQkrq6.js → local-llm-ClDtz2MN.js} +1 -1
  33. package/dist/ui/assets/{main-BfyJdxkI.js → main-BB4JLnQc.js} +3 -3
  34. package/dist/ui/assets/{mount-CjYrt47R.js → mount-D6rZgnah.js} +1 -1
  35. package/dist/ui/assets/{mount-Cucrlklw.js → mount-J31-JCa7.js} +2 -2
  36. package/dist/ui/assets/mount-index-CD1UKs2l.js +1 -0
  37. package/dist/ui/assets/mount-recovery-DY3IAu8U.js +2 -0
  38. package/dist/ui/assets/{new-session-Dmr1XJjA.js → new-session-CWOsjw9n.js} +2 -2
  39. package/dist/ui/assets/{oauth-bootstrap-CgkfiiDf.js → oauth-bootstrap-IRcFGKe4.js} +2 -2
  40. package/dist/ui/assets/{openai-codex-pziWwSxJ.js → openai-codex-6-g9ciT3.js} +1 -1
  41. package/dist/ui/assets/{openai-codex-COjNX4qP.js → openai-codex-81yHy97e.js} +1 -1
  42. package/dist/ui/assets/{openrouter-Ca2WooAs.js → openrouter-8Y2oytiG.js} +1 -1
  43. package/dist/ui/assets/{openrouter-BxEz-Tmt.js → openrouter-BDsIbH3L.js} +1 -1
  44. package/dist/ui/assets/{openrouter-oauth-wta2NMNd.js → openrouter-oauth-D3haBpEm.js} +1 -1
  45. package/dist/ui/assets/{openrouter-oauth-DUm79p5F.js → openrouter-oauth-DBk_tVF9.js} +1 -1
  46. package/dist/ui/assets/{panel-rpc-handlers-RbrFADRj.js → panel-rpc-handlers-CajeQFUT.js} +2 -2
  47. package/dist/ui/assets/{panelize-shell-DOvb-sxJ.js → panelize-shell-C2n0OG-k.js} +1 -1
  48. package/dist/ui/assets/process-manager-BkhAohXT.js +1 -0
  49. package/dist/ui/assets/{provider-DcCEmkmc.js → provider-ZPIpCQkE.js} +1 -1
  50. package/dist/ui/assets/{provider-B3zSBzMJ.js → provider-bUNCmvb6.js} +2 -2
  51. package/dist/ui/assets/{provider-settings-CyGBFRnK.js → provider-settings-CMxxnGom.js} +1 -1
  52. package/dist/ui/assets/{provider-settings-DU2FTw1l.js → provider-settings-OAxGq_Z7.js} +1 -1
  53. package/dist/ui/assets/provider-store-access-CA1L4e73.js +1 -0
  54. package/dist/ui/assets/{provider-store-access-DdpLqrpa.js → provider-store-access-RJd9RtyK.js} +2 -2
  55. package/dist/ui/assets/{providers-DtCgwiqY.js → providers-BKN9lLsz.js} +1 -1
  56. package/dist/ui/assets/{providers-DTOmtX1T.js → providers-Gkrm8AED.js} +2 -2
  57. package/dist/ui/assets/{quick-llm-DK8AEQp1.js → quick-llm-CJNPn8Zb.js} +1 -1
  58. package/dist/ui/assets/{recovery-screen-DsV2l4cC.js → recovery-screen-OXssSJOU.js} +1 -1
  59. package/dist/ui/assets/{redirect-uri-0rKGzcQU.js → redirect-uri-Bd1tnVvz.js} +1 -1
  60. package/dist/ui/assets/{remote-terminal-view-DSUnPeXp.js → remote-terminal-view-BNWZWMBC.js} +1 -1
  61. package/dist/ui/assets/{serial-port-registry-B3LG5UIy.js → serial-port-registry-CCqklAEr.js} +1 -1
  62. package/dist/ui/assets/{session-freezer-CUf0-nNg.js → session-freezer-42-NF361.js} +12 -10
  63. package/dist/ui/assets/{setup-feature-flags-remote-dmOoqhn9.js → setup-feature-flags-remote-i2zyUcsS.js} +1 -1
  64. package/dist/ui/assets/{setup-standalone-prelude-5tWEnNAc.js → setup-standalone-prelude-C6hv59Am.js} +1 -1
  65. package/dist/ui/assets/{setup-sudo-Cmvdok4C.js → setup-sudo-Cxr4tHkv.js} +2 -2
  66. package/dist/ui/assets/sidecar-repair-431vRT2V.js +1 -0
  67. package/dist/ui/assets/sidecar-repair-CIHuOk7H.js +1 -0
  68. package/dist/ui/assets/{skills-DnsuqpdU.js → skills-B5BKJ4RN.js} +1 -1
  69. package/dist/ui/assets/slicc-version-BSIqo3Cc.js +1 -0
  70. package/dist/ui/assets/{sprinkle-bridge-NSQIQ-9p.js → sprinkle-bridge-C4qw-DTw.js} +1 -1
  71. package/dist/ui/assets/{sprinkle-manager-BHw7Y1A8.js → sprinkle-manager-B5T2quSt.js} +1 -1
  72. package/dist/ui/assets/{src-Ci8SZIla.js → src-Bw7lN3n5.js} +424 -293
  73. package/dist/ui/assets/{store-Cr871ZOU.js → store-B_gtJ4nm.js} +1 -1
  74. package/dist/ui/assets/{store-B7MPXuFS.js → store-Cv1gmgAN.js} +1 -1
  75. package/dist/ui/assets/{sudo-C-t_3cqC.js → sudo-CbS1q1Rs.js} +1 -1
  76. package/dist/ui/assets/{upgrade-detection-ovYfbQjU.js → upgrade-detection-BwSl4ALY.js} +1 -1
  77. package/dist/ui/assets/usb-operations-BBXJ4GF8.js +1 -0
  78. package/dist/ui/assets/{wc-attach-C09OlJqx.js → wc-attach-CtIH1DsM.js} +2 -2
  79. package/dist/ui/assets/{wc-extension-DuZrlXUt.js → wc-extension-D1K78QrG.js} +2 -2
  80. package/dist/ui/assets/{wc-float-label-CoIx3npc.js → wc-float-label-Bj-0-MZA.js} +1 -1
  81. package/dist/ui/assets/{wc-floatbar-online-CGAdYrCH.js → wc-floatbar-online-Do-_H9l4.js} +1 -1
  82. package/dist/ui/assets/wc-follower-C6oAhGOW.js +17 -0
  83. package/dist/ui/assets/wc-follower-oauth-Dw0qOLsI.js +5 -0
  84. package/dist/ui/assets/wc-live-t888Aicz.js +8 -0
  85. package/dist/ui/assets/{wc-nav-C7VI6DDW.js → wc-nav-9NaWOn0Z.js} +2 -2
  86. package/dist/ui/assets/{wc-onboarding-iEzwn6F-.js → wc-onboarding-C9lJoj0p.js} +2 -2
  87. package/dist/ui/assets/{wc-permissions-Oq3nX_59.js → wc-permissions-CEmFmdBe.js} +2 -2
  88. package/dist/ui/assets/{wc-permissions-providers-BwYf17R6.js → wc-permissions-providers-I39VzaSN.js} +2 -2
  89. package/dist/ui/assets/{wc-placeholder-D_F9dGc6.js → wc-placeholder-CSaQKlWG.js} +2 -2
  90. package/dist/ui/assets/{wc-settings-ByE68kt5.js → wc-settings-CTsWcSxo.js} +2 -2
  91. package/dist/ui/assets/{wc-shell-BdJU70BL.js → wc-shell-D6sH-4BU.js} +3 -3
  92. package/dist/ui/assets/{wc-sprinkles-cyTCdFNe.js → wc-sprinkles-BsEUT4dc.js} +2 -2
  93. package/dist/ui/assets/wc-tray-BYmJ2LEt.js +2 -0
  94. package/dist/ui/assets/wc-unit-context-oCIU0KAf.js +1 -0
  95. package/dist/ui/assets/{xai-grok-DvXvz9Lt.js → xai-grok-BM6XkmdI.js} +1 -1
  96. package/dist/ui/assets/{xai-grok-Bq9-LuhA.js → xai-grok-Cwvo9Aos.js} +1 -1
  97. package/dist/ui/index.html +6 -6
  98. package/dist/ui/packages/webapp/index.html +6 -6
  99. package/package.json +1 -1
  100. package/dist/ui/assets/CLAUDE-4LHXSyPA.js +0 -1
  101. package/dist/ui/assets/auto-mount-table-CdyPAwVL.js +0 -1
  102. package/dist/ui/assets/fs-BD_cJfSO.js +0 -1
  103. package/dist/ui/assets/fs-jzQ_loQW.js +0 -2
  104. package/dist/ui/assets/mount-recovery-Cg-WjYXs.js +0 -2
  105. package/dist/ui/assets/process-manager-unCzdHp3.js +0 -1
  106. package/dist/ui/assets/provider-store-access-Cl3AAWaJ.js +0 -1
  107. package/dist/ui/assets/sidecar-repair-B1MVRrrn.js +0 -1
  108. package/dist/ui/assets/sidecar-repair-DVAMAYc7.js +0 -1
  109. package/dist/ui/assets/slicc-version-CNrMCkb0.js +0 -1
  110. package/dist/ui/assets/usb-operations-Cgk-otz-.js +0 -1
  111. package/dist/ui/assets/wc-follower-12OvcPzc.js +0 -17
  112. package/dist/ui/assets/wc-live-ecCvzizd.js +0 -8
  113. package/dist/ui/assets/wc-tray-C8zodjUi.js +0 -2
  114. package/dist/ui/assets/wc-tray-scoops-DKAux__l.js +0 -5
  115. package/dist/ui/assets/wc-unit-context-DvrjSIee.js +0 -1
@@ -1,5 +1,5 @@
1
1
  const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/readline-BOCWRKSR.js","assets/rolldown-runtime-Dd_uD5pT.js","assets/xterm-BmfB5bmM.css"])))=>i.map(i=>d[i]);
2
- import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./preload-helper-Czpn1I53.js";import"./tool-ui-DfXu6quJ.js";import{t as n}from"./permissions-surface-registry-CilCRwhh.js";import"./picker-approval-D89YhXsA.js";import{a as r}from"./mount-picker-popup-Bc3ca2Vl.js";import{r as i,t as a}from"./hid-device-registry-B2R-0rNt.js";import"./browser-DdY1FBRp.js";import{a as o,n as s}from"./serial-port-registry-B3LG5UIy.js";import"./serial-picker-NxC1kxYI.js";import"./hid-picker-JPu5knyb.js";import{i as c,t as l}from"./usb-device-registry-CRsCisej.js";import"./usb-picker-KMes4Lyb.js";import{t as u}from"./terminal-session-client-ADzaWGFd.js";function d(e,t){let n=[],r=new Map,i=new Set;for(let a=0;a<e.length;a++){let o=e[a];o.startsWith(`-`)?t.has(o)?r.set(o,e[++a]??``):i.add(o):n.push(o)}return{positionals:n,flags:r,bools:i}}new TextDecoder(`utf-8`,{fatal:!1}),new TextEncoder;var f=new Set([`--vid`,`--pid`,`--baud`,`--data-bits`,`--stop-bits`,`--parity`,`--flow-control`,`--buffer-size`,`--bytes`,`--until`,`--timeout-ms`,`--dtr`,`--rts`,`--break`,`--__resolved`]);function p(e){return d(e,f)}function m(e,t){let n=/^0x/i.test(e)?parseInt(e,16):parseInt(e,10);if(!Number.isFinite(n)||Number.isNaN(n))throw Error(`invalid ${t}: '${e}'`);return n}function h(e){let t={};return e.has(`--vid`)&&(t.usbVendorId=m(e.get(`--vid`),`vid`)),e.has(`--pid`)&&(t.usbProductId=m(e.get(`--pid`),`pid`)),Object.keys(t).length>0?[t]:[]}`${s}${s}`;var g=new Set([`--port`,`--baud`,`--vid`,`--pid`]),_=115200;function v(e){return d(e,g)}`${_}`;var y=new Set([`--vid`,`--pid`,`--usage-page`,`--usage`,`--__resolved`,`--timeout`]);function b(e){return d(e,y)}function x(e,t){let n=/^0x/i.test(e)?parseInt(e,16):parseInt(e,10);if(!Number.isFinite(n)||Number.isNaN(n))throw Error(`invalid ${t}: '${e}'`);return n}function S(e){let t={};return e.has(`--vid`)&&(t.vendorId=x(e.get(`--vid`),`vid`)),e.has(`--pid`)&&(t.productId=x(e.get(`--pid`),`pid`)),e.has(`--usage-page`)&&(t.usagePage=x(e.get(`--usage-page`),`usage-page`)),e.has(`--usage`)&&(t.usage=x(e.get(`--usage`),`usage`)),Object.keys(t).length>0?[t]:[]}`${a}`;var C=new Set([`--vid`,`--pid`,`--class`,`--subclass`,`--protocol`,`--serial`,`--request-type`,`--recipient`,`--request`,`--value`,`--index`,`--__resolved`]);function w(e){return d(e,C)}function T(e,t){let n=/^0x/i.test(e)?parseInt(e,16):parseInt(e,10);if(!Number.isFinite(n)||Number.isNaN(n))throw Error(`invalid ${t}: '${e}'`);return n}function E(e){let t={};return e.has(`--vid`)&&(t.vendorId=T(e.get(`--vid`),`vid`)),e.has(`--pid`)&&(t.productId=T(e.get(`--pid`),`pid`)),e.has(`--class`)&&(t.classCode=T(e.get(`--class`),`class`)),e.has(`--subclass`)&&(t.subclassCode=T(e.get(`--subclass`),`subclass`)),e.has(`--protocol`)&&(t.protocolCode=T(e.get(`--protocol`),`protocol`)),e.has(`--serial`)&&(t.serialNumber=e.get(`--serial`)),Object.keys(t).length>0?[t]:[]}`${l}`;var D={background:`#141414`,foreground:`#f2f2f2`,cursor:`#3562ff`,cursorAccent:`#141414`,selectionBackground:`#3562ff40`,selectionForeground:`#ffffff`,black:`#1a1a1a`,red:`#e34850`,green:`#2d9d78`,yellow:`#e68619`,blue:`#3562ff`,magenta:`#a962e8`,cyan:`#2db9be`,white:`#f2f2f2`,brightBlack:`#5a5a5a`,brightRed:`#e34850`,brightGreen:`#2d9d78`,brightYellow:`#e68619`,brightBlue:`#4a75ff`,brightMagenta:`#a962e8`,brightCyan:`#2db9be`,brightWhite:`#ffffff`},O={background:`#f0f0f0`,foreground:`#1a1a1a`,cursor:`#2b54db`,cursorAccent:`#f0f0f0`,selectionBackground:`#2b54db30`,selectionForeground:`#000000`,black:`#1a1a1a`,red:`#d73220`,green:`#268e6c`,yellow:`#d17a00`,blue:`#2b54db`,magenta:`#8839ef`,cyan:`#1a9088`,white:`#e8e8e8`,brightBlack:`#6e6e6e`,brightRed:`#d73220`,brightGreen:`#268e6c`,brightYellow:`#d17a00`,brightBlue:`#1e44c4`,brightMagenta:`#8839ef`,brightCyan:`#1a9088`,brightWhite:`#ffffff`},k=`\x1B[34m/\x1B[0m \x1B[90m$\x1B[0m `,A=class{options;client;terminal=null;fitAddon=null;terminalHost=null;previewHost=null;previewUrls=[];hasPreview=!1;previewStateListener=null;resizeObserver=null;themeObserver=null;readline=null;disposed=!1;abortPromptLoop=null;programmaticResolve=null;isExecuting=!1;suppressOutput=!1;tabBusy=!1;constructor(e){this.options=e;let t=e.sid??`panel-terminal-${Date.now()}`;this.client=new u({client:e.client,sid:t,onEvent:e=>this.handleEvent(e)})}async mount(n){let{Terminal:r}=await t(async()=>{let{Terminal:e}=await import(`./xterm-BSL5rRqA.js`);return{Terminal:e}},[]),{FitAddon:i}=await t(async()=>{let{FitAddon:e}=await import(`./addon-fit-DIOBYJe3.js`);return{FitAddon:e}},[]),{Readline:a}=await t(async()=>{let{Readline:t}=await import(`./readline-BOCWRKSR.js`).then(t=>e(t.default,1));return{Readline:t}},__vite__mapDeps([0,1]));await t(()=>Promise.resolve({}),__vite__mapDeps([2]));let o=!document.documentElement.classList.contains(`theme-light`);this.terminal=new r({cursorBlink:!0,fontSize:11,fontFamily:`'Source Code Pro', 'JetBrains Mono', 'Fira Code', 'Cascadia Code', monospace`,theme:o?D:O,convertEol:!0}),this.themeObserver=new MutationObserver(()=>{if(!this.terminal)return;let e=document.documentElement.classList.contains(`theme-light`);this.terminal.options.theme=e?O:D}),this.themeObserver.observe(document.documentElement,{attributes:!0,attributeFilter:[`class`]}),this.fitAddon=new i,this.terminal.loadAddon(this.fitAddon),n.replaceChildren(),this.terminalHost=document.createElement(`div`),this.terminalHost.className=`terminal-panel__terminal-host`,n.appendChild(this.terminalHost),this.previewHost=document.createElement(`div`),this.previewHost.className=`terminal-panel__preview`,n.appendChild(this.previewHost),this.terminal.open(this.terminalHost),this.fitAddon.fit(),this.resizeObserver=new ResizeObserver(()=>this.refit()),this.resizeObserver.observe(this.terminalHost),this.readline=new a,this.neutralizeReadlineHistoryPersistence(),this.terminal.loadAddon(this.readline),this.readline.setCtrlCHandler(()=>this.signalInterruptDuringExec()),this.setupInput(),this.terminal.writeln(`\x1B[1mslicc\x1B[0m \x1B[90mshell (kernel)\x1B[0m`),this.terminal.writeln(`\x1B[90mType "help" for available commands.\x1B[0m
2
+ import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./preload-helper-Czpn1I53.js";import"./tool-ui-DfXu6quJ.js";import{t as n}from"./permissions-surface-registry-CilCRwhh.js";import"./picker-approval-D89YhXsA.js";import{a as r}from"./mount-picker-popup-Bc3ca2Vl.js";import{r as i,t as a}from"./hid-device-registry-B2R-0rNt.js";import"./browser-DdY1FBRp.js";import{a as o,n as s}from"./serial-port-registry-CCqklAEr.js";import"./serial-picker-NxC1kxYI.js";import"./hid-picker-JPu5knyb.js";import{i as c,t as l}from"./usb-device-registry-CRsCisej.js";import"./usb-picker-KMes4Lyb.js";import{t as u}from"./terminal-session-client-ADzaWGFd.js";function d(e,t){let n=[],r=new Map,i=new Set;for(let a=0;a<e.length;a++){let o=e[a];o.startsWith(`-`)?t.has(o)?r.set(o,e[++a]??``):i.add(o):n.push(o)}return{positionals:n,flags:r,bools:i}}new TextDecoder(`utf-8`,{fatal:!1}),new TextEncoder;var f=new Set([`--vid`,`--pid`,`--baud`,`--data-bits`,`--stop-bits`,`--parity`,`--flow-control`,`--buffer-size`,`--bytes`,`--until`,`--timeout-ms`,`--dtr`,`--rts`,`--break`,`--__resolved`]);function p(e){return d(e,f)}function m(e,t){let n=/^0x/i.test(e)?parseInt(e,16):parseInt(e,10);if(!Number.isFinite(n)||Number.isNaN(n))throw Error(`invalid ${t}: '${e}'`);return n}function h(e){let t={};return e.has(`--vid`)&&(t.usbVendorId=m(e.get(`--vid`),`vid`)),e.has(`--pid`)&&(t.usbProductId=m(e.get(`--pid`),`pid`)),Object.keys(t).length>0?[t]:[]}`${s}${s}`;var g=new Set([`--port`,`--baud`,`--vid`,`--pid`]),_=115200;function v(e){return d(e,g)}`${_}`;var y=new Set([`--vid`,`--pid`,`--usage-page`,`--usage`,`--__resolved`,`--timeout`]);function b(e){return d(e,y)}function x(e,t){let n=/^0x/i.test(e)?parseInt(e,16):parseInt(e,10);if(!Number.isFinite(n)||Number.isNaN(n))throw Error(`invalid ${t}: '${e}'`);return n}function S(e){let t={};return e.has(`--vid`)&&(t.vendorId=x(e.get(`--vid`),`vid`)),e.has(`--pid`)&&(t.productId=x(e.get(`--pid`),`pid`)),e.has(`--usage-page`)&&(t.usagePage=x(e.get(`--usage-page`),`usage-page`)),e.has(`--usage`)&&(t.usage=x(e.get(`--usage`),`usage`)),Object.keys(t).length>0?[t]:[]}`${a}`;var C=new Set([`--vid`,`--pid`,`--class`,`--subclass`,`--protocol`,`--serial`,`--request-type`,`--recipient`,`--request`,`--value`,`--index`,`--__resolved`]);function w(e){return d(e,C)}function T(e,t){let n=/^0x/i.test(e)?parseInt(e,16):parseInt(e,10);if(!Number.isFinite(n)||Number.isNaN(n))throw Error(`invalid ${t}: '${e}'`);return n}function E(e){let t={};return e.has(`--vid`)&&(t.vendorId=T(e.get(`--vid`),`vid`)),e.has(`--pid`)&&(t.productId=T(e.get(`--pid`),`pid`)),e.has(`--class`)&&(t.classCode=T(e.get(`--class`),`class`)),e.has(`--subclass`)&&(t.subclassCode=T(e.get(`--subclass`),`subclass`)),e.has(`--protocol`)&&(t.protocolCode=T(e.get(`--protocol`),`protocol`)),e.has(`--serial`)&&(t.serialNumber=e.get(`--serial`)),Object.keys(t).length>0?[t]:[]}`${l}`;var D={background:`#141414`,foreground:`#f2f2f2`,cursor:`#3562ff`,cursorAccent:`#141414`,selectionBackground:`#3562ff40`,selectionForeground:`#ffffff`,black:`#1a1a1a`,red:`#e34850`,green:`#2d9d78`,yellow:`#e68619`,blue:`#3562ff`,magenta:`#a962e8`,cyan:`#2db9be`,white:`#f2f2f2`,brightBlack:`#5a5a5a`,brightRed:`#e34850`,brightGreen:`#2d9d78`,brightYellow:`#e68619`,brightBlue:`#4a75ff`,brightMagenta:`#a962e8`,brightCyan:`#2db9be`,brightWhite:`#ffffff`},O={background:`#f0f0f0`,foreground:`#1a1a1a`,cursor:`#2b54db`,cursorAccent:`#f0f0f0`,selectionBackground:`#2b54db30`,selectionForeground:`#000000`,black:`#1a1a1a`,red:`#d73220`,green:`#268e6c`,yellow:`#d17a00`,blue:`#2b54db`,magenta:`#8839ef`,cyan:`#1a9088`,white:`#e8e8e8`,brightBlack:`#6e6e6e`,brightRed:`#d73220`,brightGreen:`#268e6c`,brightYellow:`#d17a00`,brightBlue:`#1e44c4`,brightMagenta:`#8839ef`,brightCyan:`#1a9088`,brightWhite:`#ffffff`},k=`\x1B[34m/\x1B[0m \x1B[90m$\x1B[0m `,A=class{options;client;terminal=null;fitAddon=null;terminalHost=null;previewHost=null;previewUrls=[];hasPreview=!1;previewStateListener=null;resizeObserver=null;themeObserver=null;readline=null;disposed=!1;abortPromptLoop=null;programmaticResolve=null;isExecuting=!1;suppressOutput=!1;tabBusy=!1;constructor(e){this.options=e;let t=e.sid??`panel-terminal-${Date.now()}`;this.client=new u({client:e.client,sid:t,onEvent:e=>this.handleEvent(e)})}async mount(n){let{Terminal:r}=await t(async()=>{let{Terminal:e}=await import(`./xterm-BSL5rRqA.js`);return{Terminal:e}},[]),{FitAddon:i}=await t(async()=>{let{FitAddon:e}=await import(`./addon-fit-DIOBYJe3.js`);return{FitAddon:e}},[]),{Readline:a}=await t(async()=>{let{Readline:t}=await import(`./readline-BOCWRKSR.js`).then(t=>e(t.default,1));return{Readline:t}},__vite__mapDeps([0,1]));await t(()=>Promise.resolve({}),__vite__mapDeps([2]));let o=!document.documentElement.classList.contains(`theme-light`);this.terminal=new r({cursorBlink:!0,fontSize:11,fontFamily:`'Source Code Pro', 'JetBrains Mono', 'Fira Code', 'Cascadia Code', monospace`,theme:o?D:O,convertEol:!0}),this.themeObserver=new MutationObserver(()=>{if(!this.terminal)return;let e=document.documentElement.classList.contains(`theme-light`);this.terminal.options.theme=e?O:D}),this.themeObserver.observe(document.documentElement,{attributes:!0,attributeFilter:[`class`]}),this.fitAddon=new i,this.terminal.loadAddon(this.fitAddon),n.replaceChildren(),this.terminalHost=document.createElement(`div`),this.terminalHost.className=`terminal-panel__terminal-host`,n.appendChild(this.terminalHost),this.previewHost=document.createElement(`div`),this.previewHost.className=`terminal-panel__preview`,n.appendChild(this.previewHost),this.terminal.open(this.terminalHost),this.fitAddon.fit(),this.resizeObserver=new ResizeObserver(()=>this.refit()),this.resizeObserver.observe(this.terminalHost),this.readline=new a,this.neutralizeReadlineHistoryPersistence(),this.terminal.loadAddon(this.readline),this.readline.setCtrlCHandler(()=>this.signalInterruptDuringExec()),this.setupInput(),this.terminal.writeln(`\x1B[1mslicc\x1B[0m \x1B[90mshell (kernel)\x1B[0m`),this.terminal.writeln(`\x1B[90mType "help" for available commands.\x1B[0m
3
3
  `),await this.client.open({cwd:this.options.cwd,env:this.options.env}),this.runPromptLoop()}refit(){this.fitAddon?.fit()}clearTerminal(){this.terminal?.clear()}async executeCommandInTerminal(e){let t=e.trim();if(!t)return{stdout:``,stderr:``,exitCode:0};if(!this.terminal||!this.readline)return this.client.exec(t);if(this.isExecuting||this.programmaticResolve||this.readline.getLine().length>0)return{stdout:``,stderr:`terminal is busy; finish current input first
4
4
  `,exitCode:1};let n=new Promise(e=>{this.programmaticResolve=e});return this.readline.updateLine(t),this.terminal.input(`\r`),n}setPreviewStateListener(e){this.previewStateListener=e,e?.(this.hasPreview)}dispose(){this.disposed=!0,this.abortPromptLoop?.(Error(`terminal disposed`)),this.abortPromptLoop=null,this.clearMediaPreview(),this.themeObserver?.disconnect(),this.themeObserver=null,this.resizeObserver?.disconnect(),this.resizeObserver=null,this.terminal?.dispose(),this.terminal=null,this.readline=null,this.fitAddon=null,this.terminalHost=null,this.previewHost=null,this.client.close(),this.client.dispose()}renderMediaPreview(e){if(!this.previewHost)return;let t=Uint8Array.from(atob(e.data),e=>e.charCodeAt(0)),n=URL.createObjectURL(new Blob([t],{type:e.mediaType}));this.previewUrls.push(n);let r=document.createElement(`div`);r.className=`terminal-panel__preview-item`;let i=document.createElement(`div`);i.className=`terminal-panel__preview-label`;let a=e.path.split(`/`).pop()??e.path;if(i.textContent=`${a} · ${e.mediaType}`,r.appendChild(i),e.mediaType.startsWith(`video/`)){let e=document.createElement(`video`);e.className=`terminal-panel__preview-media`,e.controls=!0,e.autoplay=!0,e.loop=!0,e.muted=!0,e.playsInline=!0,e.src=n,e.addEventListener(`loadedmetadata`,()=>this.refit(),{once:!0}),r.appendChild(e)}else{let e=document.createElement(`img`);e.className=`terminal-panel__preview-media`,e.alt=a,e.src=n,e.addEventListener(`load`,()=>this.refit(),{once:!0}),r.appendChild(e)}this.previewHost.appendChild(r),this.previewHost.classList.add(`terminal-panel__preview--visible`),this.hasPreview=!0,this.previewStateListener?.(!0)}clearMediaPreview(){for(let e of this.previewUrls)URL.revokeObjectURL(e);this.previewUrls=[],this.previewHost&&(this.previewHost.replaceChildren(),this.previewHost.classList.remove(`terminal-panel__preview--visible`)),this.hasPreview=!1,this.previewStateListener?.(!1)}async runPromptLoop(){for(;!this.disposed&&this.readline&&this.terminal;){let e;try{e=await this.readNextLine()}catch{break}finally{this.abortPromptLoop=null}let t=this.programmaticResolve!==null,n=await this.processLine(e,t);this.programmaticResolve&&=(this.programmaticResolve(n),null)}}readNextLine(){let e=this.terminal,t=this.readline;if(!e||!t)return Promise.reject(Error(`terminal not mounted`));let n=new Promise((e,t)=>{this.abortPromptLoop=t}),r=new Promise((n,r)=>{e.write(``,()=>{e.buffer.active.cursorX>0&&e.write(`\x1B[7m%\x1B[0m\r
5
5
  `),t.read(k).then(n,r)})});return Promise.race([r,n])}async processLine(e,t=!1){let n=e.trim();return!n||!t&&await this.tryRunPicker(n)?{stdout:``,stderr:``,exitCode:0}:this.runRemote(n)}async tryRunPicker(e){let t=j(e);if(t)return await this.runRemoteWithLocalPicker(e,t),!0;let n=N(e);if(n)return await this.runRemoteWithUsbPicker(n),!0;let r=P(e);if(r)return await this.runRemoteWithHidPicker(r),!0;let i=I(e);if(i)return await this.runRemoteWithSerialPicker(i),!0;let a=L(e);return a?(await this.runRemoteWithEsptoolPicker(e,a),!0):!1}setupInput(){this.terminal&&(this.terminal.onData(e=>{e===` `&&this.handleTab()}),this.terminal.attachCustomKeyEventHandler(e=>!(e.type===`keydown`&&e.key===`Enter`&&this.tabBusy)))}signalInterruptDuringExec(){this.isExecuting&&(this.terminal?.writeln(`^C`),this.client.signal(`SIGINT`))}neutralizeReadlineHistoryPersistence(){let e=this.readline.history;e&&(e.entries=[],e.cursor=-1,e.saveToLocalStorage=()=>void 0,e.restoreFromLocalStorage=()=>void 0)}reanchorReadline(){if(!this.terminal||!this.readline)return;let e=this.readline.state;e&&(e.getTty().anchorRow=this.terminal.buffer.active.cursorY,e.refresh())}async handleTab(){if(!(!this.terminal||!this.readline)&&!(this.isExecuting||this.tabBusy)){this.tabBusy=!0,this.isExecuting=!0;try{let{currentWord:e,isFirstWord:t,compgenCmd:n}=z(this.readline.getLine());this.suppressOutput=!0;let r=``;try{r=(await this.client.exec(n)).stdout}finally{this.suppressOutput=!1}let i=r.split(`
@@ -1 +1 @@
1
- import{n as e}from"./rolldown-runtime-Dd_uD5pT.js";var t=e({DEFAULT_SERIAL_READ_TIMEOUT_MS:()=>s,MAX_SERIAL_TRANSFER_BYTES:()=>o,SerialPortRegistry:()=>r,deviceToInfo:()=>c,getNavigatorSerial:()=>n,getSharedSerialRegistry:()=>a});function n(){return globalThis.navigator?.serial??null}var r=class{byHandle=new Map;counter=0;register(e){for(let[t,n]of this.byHandle)if(n.port===e)return t;let t=`serial${++this.counter}`;return this.byHandle.set(t,{port:e,opened:!1}),t}get(e){return this.byHandle.get(e)}remove(e){return this.byHandle.delete(e)}list(){return[...this.byHandle].map(([e,t])=>({handle:e,entry:t}))}},i=null;function a(){return i||=new r,i}var o=4194304,s=1e3;function c(e,t){let n=t.port.getInfo();return{handle:e,...n.usbVendorId===void 0?{}:{usbVendorId:n.usbVendorId},...n.usbProductId===void 0?{}:{usbProductId:n.usbProductId},opened:t.opened}}export{a,n as i,o as n,t as o,c as r,s as t};
1
+ import{n as e}from"./rolldown-runtime-Dd_uD5pT.js";var t=e({DEFAULT_SERIAL_READ_TIMEOUT_MS:()=>s,MAX_SERIAL_TRANSFER_BYTES:()=>o,SerialPortRegistry:()=>r,deviceToInfo:()=>c,getNavigatorSerial:()=>n,getSharedSerialRegistry:()=>a});function n(){return globalThis.navigator?.serial??null}var r=class{byHandle=new Map;counter=0;register(e){for(let[t,n]of this.byHandle)if(n.port===e)return t;let t=`serial${++this.counter}`;return this.byHandle.set(t,{port:e,opened:!1}),t}get(e){return this.byHandle.get(e)}remove(e){return this.byHandle.delete(e)}list(){return[...this.byHandle].map(([e,t])=>({handle:e,entry:t}))}retainOnly(e){let t=[];for(let[n,r]of[...this.byHandle])e.includes(r.port)||(this.byHandle.delete(n),t.push({handle:n,entry:r}));return t}},i=null;function a(){return i||=new r,i}var o=4194304,s=1e3;function c(e,t){let n=t.port.getInfo();return{handle:e,...n.usbVendorId===void 0?{}:{usbVendorId:n.usbVendorId},...n.usbProductId===void 0?{}:{usbProductId:n.usbProductId},opened:t.opened}}export{a,n as i,o as n,t as o,c as r,s as t};
@@ -1,5 +1,5 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/quick-llm-DK8AEQp1.js","assets/rolldown-runtime-Dd_uD5pT.js","assets/account-store-DPoyiqT_.js","assets/preload-helper-Czpn1I53.js","assets/claude-model-version-DoVrYsKi.js","assets/models-BSkXF4T6.js","assets/diagnostics-DN_idNHx.js","assets/provider-env-CTOcDKrQ.js","assets/__vite-browser-external-5eBdwsFd.js","assets/openrouter.models-gbjkpjE_.js","assets/libesm-BI4UHVqp.js","assets/logger-DDBAeTLF.js","assets/src-CAWTvdAa.js","assets/proxied-fetch-BGeNrvQ4.js","assets/base64-DpPqYZJF.js","assets/runtime-env-Dlaokqg1.js","assets/fetch-body-D2PwksUW.js","assets/api-endpoint-GRCyib6X.js","assets/float-topology-DiK91BlA.js","assets/runtime-env-E-i2SW1s.js","assets/secret-topology-0AWfFTh5.js","assets/secrets-bridge-client-DCQ44RyR.js","assets/port-bridge-client-BhmNRlRv.js","assets/image-markers-BXtVm4og.js","assets/tool-ui-DfXu6quJ.js","assets/providers-DTOmtX1T.js","assets/panel-rpc-B3MSVImO.js","assets/bedrock-camp-compat-CgBMwna8.js","assets/llm-session-id-bZQs6gBN.js","assets/icons-ZLR7gmJ4.js"])))=>i.map(i=>d[i]);
2
- import{n as e}from"./rolldown-runtime-Dd_uD5pT.js";import{Q as t,X as n,Z as r}from"./account-store-DPoyiqT_.js";import{t as i}from"./preload-helper-Czpn1I53.js";import{o as a}from"./claude-model-version-DoVrYsKi.js";import{t as o}from"./logger-DDBAeTLF.js";import{t as s}from"./attachments-CByeG2Ru.js";import{t as c}from"./types-idfTVsM8.js";import{t as l}from"./icons-ZLR7gmJ4.js";import{c as u,l as d,n as f,r as ee,t as p,u as te}from"./record-C0lt6kKE.js";import{a as ne}from"./dictation-priming-CNllGgNq.js";import"./agent-message-to-chat-_cvF5A5g.js";var re=`---
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/quick-llm-CJNPn8Zb.js","assets/rolldown-runtime-Dd_uD5pT.js","assets/account-store-DVhMCA9p.js","assets/preload-helper-Czpn1I53.js","assets/claude-model-version-DoVrYsKi.js","assets/models-BSkXF4T6.js","assets/diagnostics-DN_idNHx.js","assets/provider-env-CTOcDKrQ.js","assets/__vite-browser-external-5eBdwsFd.js","assets/openrouter.models-gbjkpjE_.js","assets/libesm-BI4UHVqp.js","assets/logger-DDBAeTLF.js","assets/src-CAWTvdAa.js","assets/proxied-fetch-BGeNrvQ4.js","assets/base64-DpPqYZJF.js","assets/runtime-env-Dlaokqg1.js","assets/fetch-body-D2PwksUW.js","assets/api-endpoint-GRCyib6X.js","assets/float-topology-DiK91BlA.js","assets/runtime-env-E-i2SW1s.js","assets/secret-topology-0AWfFTh5.js","assets/secrets-bridge-client-DCQ44RyR.js","assets/port-bridge-client-BhmNRlRv.js","assets/image-markers-BXtVm4og.js","assets/tool-ui-DfXu6quJ.js","assets/providers-Gkrm8AED.js","assets/panel-rpc-B3MSVImO.js","assets/bedrock-camp-compat-CgBMwna8.js","assets/llm-session-id-bZQs6gBN.js","assets/icons-ZLR7gmJ4.js"])))=>i.map(i=>d[i]);
2
+ import{n as e}from"./rolldown-runtime-Dd_uD5pT.js";import{Q as t,X as n,Z as r}from"./account-store-DVhMCA9p.js";import{t as i}from"./preload-helper-Czpn1I53.js";import{o as a}from"./claude-model-version-DoVrYsKi.js";import{t as o}from"./logger-DDBAeTLF.js";import{t as s}from"./attachments-CByeG2Ru.js";import{t as c}from"./types-idfTVsM8.js";import{t as l}from"./icons-ZLR7gmJ4.js";import{c as u,l as d,n as f,r as ee,t as p,u as te}from"./record-C0lt6kKE.js";import{a as ne}from"./dictation-priming-CNllGgNq.js";import"./agent-message-to-chat-_cvF5A5g.js";var re=`---
3
3
  writablePaths:
4
4
  - /workspace/CLAUDE.md
5
5
  visiblePaths:
@@ -38,7 +38,7 @@ thinkingLevel: medium
38
38
 
39
39
  Curate the durable memory for session {{SESSION_COUNT}}. Today's date is {{TODAY}}.
40
40
 
41
- **Work fast: a full pass should finish in well under 10 minutes.** The run is hard-stopped at 20 minutes, and a kill mid-write can corrupt the memory file or leave it over budget — so mine the three signals, rewrite the file, compact it in the same pass, and stop, rather than exploring the archive exhaustively.
41
+ **Work fast: a full pass should finish in well under 10 minutes.** The run is hard-stopped at 20 minutes, and your rewrite only lands if the pass completes — a killed run is discarded wholesale. So mine the three signals, rewrite the file, compact it in the same pass, and stop, rather than exploring the archive exhaustively.
42
42
 
43
43
  Read the entire current memory at {{MEMORY_PATH}} if it exists. Then mine the archived session at {{SESSION_ARCHIVE_PATH}} using the reading recipes below. Rewrite the entire {{MEMORY_PATH}} file with the durable information worth carrying into future sessions. Every part of the file is editable and counts toward the budget.
44
44
 
@@ -123,6 +123,8 @@ Rules:
123
123
  <!-- How to customize
124
124
  Add curator instructions here, for example: also update the knowledge base at /path following its WIKI.md. Extend visiblePaths or writablePaths above to grant access to extra stores, and adjust timeoutSeconds when needed.
125
125
 
126
+ {{MEMORY_PATH}} resolves to a staged per-archive draft under /sessions/.curation/, not the live memory file: the pass snapshots the live file when it spawns, the curator rewrites the draft, and on a successful exit the runtime three-way-merges the rewrite back onto the live file. Edits the cone or the user makes to the live memory while the curator runs survive; where both sides changed the same lines the curator's version wins. An entry in writablePaths naming the memory file is substituted with the draft automatically, so this file keeps working unchanged. A failed or killed run leaves the live memory untouched and its outcome recorded at /sessions/.curation/<archive>/status.json.
127
+
126
128
  writablePaths defaults to the memory file alone rather than /workspace/, because the curator can run upskill and a directory-wide grant would also let it install skills into /workspace/skills. Widen it only as far as a task genuinely needs; a single file is a valid entry, not just a directory.
127
129
 
128
130
  Scratch space needs no entry here. The curator spawns under a fixed per-cone name (memory-curator for the primary cone), so the bridge grants it {{SCRATCH_DIR}} — private to the run, writable without a prompt, and removed when the pass ends — and that is where the prompt sends drafts. /tmp/ is writable too, but it is shared with every other scoop and visible to the cone, so a full rewrite of durable memory does not belong there.
@@ -147,14 +149,14 @@ ${n}
147
149
  </auto-extracted>`,i={role:`user`,content:[{type:`text`,text:ve}],timestamp:Date.now()},o=await a(e.model,{systemPrompt:r,messages:[i]},{apiKey:e.apiKey,maxTokens:ge,headers:e.headers,signal:e.signal});if(o.stopReason===`error`)throw Error(`Restructure call failed: ${o.errorMessage||`Unknown error`}`);let s=o.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
148
150
  `).trim();if(!s)throw Error(`Restructure call returned empty content`);return`${t}${t.length===0||t.endsWith(`
149
151
  `)?``:`
150
- `}${s}\n`}async function xe(e){if(!e.model||!e.apiKey)return{restructured:!1,reason:`no-llm`};let t=e.memoryPath??me,n=``;try{let r=await e.vfs.readFile(t,{encoding:`utf-8`});n=typeof r==`string`?r:new TextDecoder().decode(r)}catch{return{restructured:!1,reason:`missing-file`}}let r=await b(e.vfs),i=y(r),a=i*pe;if(n.length<=a)return{restructured:!1,reason:`under-threshold`};v.info(`Cone memory over threshold — restructuring`,{size:n.length,budget:i,threshold:a,sessionCount:r});try{let r=await be({currentContent:n,budget:i,model:e.model,apiKey:e.apiKey,headers:e.headers,signal:e.signal});return await e.vfs.writeFile(t,r),v.info(`Cone memory restructured`,{before:n.length,after:r.length}),{restructured:!0}}catch(e){return v.warn(`Cone memory restructure failed — leaving appended content in place`,{error:e instanceof Error?e.message:String(e)}),{restructured:!1,reason:`error`}}}var x=o(`agentic-memory`),Se=`/shared/MEMORY.md`,Ce=1200,we=e=>[e.memoryPath],Te=e=>[`/sessions/`,`/shared/`,...oe(e)],Ee=`awk.cat.cp.cut.date.diff.du.echo.file.find.grep.head.jq.ls.mkdir.mount.mv.nl.od.printf.readlink.sed.sort.stat.tail.touch.tr.uniq.upskill.wc.xxd`.split(`.`),De=new Set([`writablePaths`,`visiblePaths`,`allowedCommands`]),Oe=new Set([`model`,`timeoutSeconds`,`thinkingLevel`]),ke=`medium`,S=3e4;function C(e){return e===`cone`?`memory-curator`:`memory-curator-${e}`}function w(e){let t=C(e);return Ae.test(t)?t:C(p)}var Ae=/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/;function T(e){return`/scoops/agent-${w(e)}`}var E=T(p);function je(e){return h({parentJid:null,folder:e?.folder??`cone`})}function D(e,t){if(t.root===g.root)return e;if(e===g.memoryPath)return t.memoryPath;if(e===`/workspace/skills`||e.startsWith(`/workspace/skills/`))return e;let n=`${g.root}/`;return e===g.root?t.root:e.startsWith(n)?`${t.root}/${e.slice(n.length)}`:e}function Me(e,t){let n=`${m}/`,r=e=>e.some(e=>n.startsWith(e.endsWith(`/`)?e:`${e}/`)),i=e.map(e=>D(e,t));return r(e)&&!r(i)&&i.push(n),i}async function Ne(e){try{if(e.signal?.aborted)return{ok:!1,reason:`aborted`,legacyFallbackSafe:!1};let t=je(e.cone),n=T(e.cone?.folder??`cone`),r=await Pe(e.vfs,t),i=He(r,Ue(We(r.promptTemplate,{MEMORY_PATH:t.memoryPath,SESSION_ARCHIVE_PATH:e.sessionArchivePath,SESSION_COUNT:String(e.sessionCount),BUDGET_CHARS:String(y(e.sessionCount)),SCRATCH_DIR:n,TODAY:e.today??new Date().toISOString().slice(0,10)}),n),e.sessionArchivePath,t,e.cone);e.signal&&(i.signal=e.signal);let a=await Ge(Promise.resolve().then(()=>e.spawn(i)),r.timeoutSeconds*1e3+S,e.signal);if(a.type===`timeout`)return x.warn(`Agentic memory wait timed out past the in-run bound + grace`,{timeoutSeconds:r.timeoutSeconds,graceMs:S}),{ok:!1,reason:`timeout`,legacyFallbackSafe:!1};if(a.type===`aborted`)return{ok:!1,reason:`aborted`,legacyFallbackSafe:!1};if(a.type===`error`)return{ok:!1,reason:N(a.error),legacyFallbackSafe:!0};if(a.result.exitCode!==0){let e=(a.result.finalText??``).startsWith(ue);return{ok:!1,reason:a.result.finalText||`exit-${a.result.exitCode}`,legacyFallbackSafe:!e}}return{ok:!0,report:a.result.finalText}}catch(e){return x.warn(`Agentic memory pass failed`,{error:N(e)}),{ok:!1,reason:N(e),legacyFallbackSafe:!1}}}async function Pe(e,t=g){try{let n=await e.readFile(Se,{encoding:`utf-8`});return O(typeof n==`string`?n:new TextDecoder().decode(n),t)}catch(e){return x.warn(`Could not load valid MEMORY.md; using built-in default`,{error:N(e)}),O(re,t)}}function O(e,t=g){let n=e.replace(/^\uFEFF/,``).replace(/\r\n?/g,`
152
+ `}${s}\n`}async function xe(e){if(!e.model||!e.apiKey)return{restructured:!1,reason:`no-llm`};let t=e.memoryPath??me,n=``;try{let r=await e.vfs.readFile(t,{encoding:`utf-8`});n=typeof r==`string`?r:new TextDecoder().decode(r)}catch{return{restructured:!1,reason:`missing-file`}}let r=await b(e.vfs),i=y(r),a=i*pe;if(n.length<=a)return{restructured:!1,reason:`under-threshold`};v.info(`Cone memory over threshold — restructuring`,{size:n.length,budget:i,threshold:a,sessionCount:r});try{let r=await be({currentContent:n,budget:i,model:e.model,apiKey:e.apiKey,headers:e.headers,signal:e.signal});return await e.vfs.writeFile(t,r),v.info(`Cone memory restructured`,{before:n.length,after:r.length}),{restructured:!0}}catch(e){return v.warn(`Cone memory restructure failed — leaving appended content in place`,{error:e instanceof Error?e.message:String(e)}),{restructured:!1,reason:`error`}}}var x=o(`agentic-memory`),Se=`/shared/MEMORY.md`,Ce=1200,we=e=>[e.memoryPath],Te=e=>[`/sessions/`,`/shared/`,...oe(e)],Ee=`awk.cat.cp.cut.date.diff.du.echo.file.find.grep.head.jq.ls.mkdir.mount.mv.nl.od.printf.readlink.sed.sort.stat.tail.touch.tr.uniq.upskill.wc.xxd`.split(`.`),De=new Set([`writablePaths`,`visiblePaths`,`allowedCommands`]),Oe=new Set([`model`,`timeoutSeconds`,`thinkingLevel`]),ke=`medium`,S=3e4;function C(e){return e===`cone`?`memory-curator`:`memory-curator-${e}`}function w(e){let t=C(e);return Ae.test(t)?t:C(p)}var Ae=/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/;function T(e){return`/scoops/agent-${w(e)}`}var E=T(p);function je(e){return h({parentJid:null,folder:e?.folder??`cone`})}function D(e,t){if(t.root===g.root)return e;if(e===g.memoryPath)return t.memoryPath;if(e===`/workspace/skills`||e.startsWith(`/workspace/skills/`))return e;let n=`${g.root}/`;return e===g.root?t.root:e.startsWith(n)?`${t.root}/${e.slice(n.length)}`:e}function Me(e,t){let n=`${m}/`,r=e=>e.some(e=>n.startsWith(e.endsWith(`/`)?e:`${e}/`)),i=e.map(e=>D(e,t));return r(e)&&!r(i)&&i.push(n),i}async function Ne(e){try{if(e.signal?.aborted)return{ok:!1,reason:`aborted`,legacyFallbackSafe:!1};let t=je(e.cone),n=T(e.cone?.folder??`cone`),r=await Pe(e.vfs,t),i=F(e.sessionArchivePath);try{await Ue(e.vfs,t.memoryPath,e.sessionArchivePath)}catch(e){return{ok:!1,reason:`snapshot: ${I(e)}`,legacyFallbackSafe:!0}}let a=Ge(r,Ke(qe(r.promptTemplate,{MEMORY_PATH:i,SESSION_ARCHIVE_PATH:e.sessionArchivePath,SESSION_COUNT:String(e.sessionCount),BUDGET_CHARS:String(y(e.sessionCount)),SCRATCH_DIR:n,TODAY:e.today??new Date().toISOString().slice(0,10)}),n),e.sessionArchivePath,t,e.cone);e.signal&&(a.signal=e.signal);let o=await Je(Promise.resolve().then(()=>e.spawn(a)),r.timeoutSeconds*1e3+S,e.signal);if(o.type===`timeout`)return x.warn(`Agentic memory wait timed out past the in-run bound + grace`,{timeoutSeconds:r.timeoutSeconds,graceMs:S}),{ok:!1,reason:`timeout`,legacyFallbackSafe:!1};if(o.type===`aborted`)return{ok:!1,reason:`aborted`,legacyFallbackSafe:!1};if(o.type===`error`)return{ok:!1,reason:I(o.error),legacyFallbackSafe:!0};if(o.result.exitCode!==0){let e=(o.result.finalText??``).startsWith(ue);return{ok:!1,reason:o.result.finalText||`exit-${o.result.exitCode}`,legacyFallbackSafe:!e}}return{ok:!0,report:o.result.finalText}}catch(e){return x.warn(`Agentic memory pass failed`,{error:I(e)}),{ok:!1,reason:I(e),legacyFallbackSafe:!1}}}async function Pe(e,t=g){try{let n=await e.readFile(Se,{encoding:`utf-8`});return O(typeof n==`string`?n:new TextDecoder().decode(n),t)}catch(e){return x.warn(`Could not load valid MEMORY.md; using built-in default`,{error:I(e)}),O(re,t)}}function O(e,t=g){let n=e.replace(/^\uFEFF/,``).replace(/\r\n?/g,`
151
153
  `).match(/^---\s*\n([\s\S]*?)\n---\s*\n([\s\S]*)$/);if(!n?.[2].trim())throw Error(`MEMORY.md requires frontmatter and a prompt`);let r=Ie(n[1]),i=A(r,`writablePaths`,we(t));if(i.length===0)throw Error(`writablePaths must not be empty`);j(i,`writablePaths`);let a=A(r,`visiblePaths`,Te(t));j(a,`visiblePaths`);let o=Ve(r.timeoutSeconds),s=Be(r.model,`model`);return{writablePaths:i.map(e=>D(e,t)),visiblePaths:Me(a,t),allowedCommands:[...new Set([...Ee,...A(r,`allowedCommands`,[])])],...s?{model:s}:{},thinkingLevel:Fe(r.thinkingLevel),timeoutSeconds:o,promptTemplate:n[2].trim()}}function Fe(e){if(e===void 0)return ke;if(typeof e!=`string`||!le(e))throw Error(`thinkingLevel must be one of ${_.join(`, `)}`);return e}function Ie(e){let t={},n=e.split(`
152
- `);for(let e=0;e<n.length;e+=1){let r=n[e];if(!r.trim()||r.trimStart().startsWith(`#`))continue;let i=r.match(/^([A-Za-z][A-Za-z0-9]*):\s*(.*)$/);if(!i)throw Error(`Invalid frontmatter line: ${r}`);let[,a,o]=i;if(De.has(a)){let r=Le(n,e,o);t[a]=r.value,e=r.lastIndex}else if(Oe.has(a)&&o.trim())t[a]=k(o);else throw Error(`Unsupported or empty frontmatter field: ${a}`)}return t}function Le(e,t,n){if(n.trim()){let e=n.trim();if(!e.startsWith(`[`)||!e.endsWith(`]`))throw Error(`Expected an array`);let r=e.slice(1,-1).trim();return{value:r?Re(r):[],lastIndex:t}}let r=[],i=t;for(let n=t+1;n<e.length;n+=1){let t=e[n].match(/^\s+-\s+(.+)$/);if(!t)break;r.push(k(ze(t[1]))),i=n}return{value:r,lastIndex:i}}function Re(e){let t=[],n=0,r;for(let i=0;i<e.length;i+=1){let a=e[i];a===`"`||a===`'`?r=r===a?void 0:r??a:a===`,`&&!r&&(t.push(k(e.slice(n,i))),n=i+1)}if(r)throw Error(`Unclosed quoted value`);return t.push(k(e.slice(n))),t}function ze(e){let t;for(let n=0;n<e.length;n+=1){let r=e[n];if(r===`"`||r===`'`)t=t===r?void 0:t??r;else if(r===`#`&&!t&&(n===0||/\s/.test(e[n-1])))return e.slice(0,n).trimEnd()}return e}function k(e){let t=e.trim();if(!t)throw Error(`Empty frontmatter value`);let n=t[0];if((n===`"`||n===`'`)&&t.at(-1)===n)return t.slice(1,-1);if(n===`"`||n===`'`)throw Error(`Unclosed quoted value`);return t}function A(e,t,n){let r=e[t];if(r===void 0)return[...n];if(!Array.isArray(r)||r.some(e=>!e))throw Error(`${t} is invalid`);return[...r]}function Be(e,t){if(e!==void 0){if(typeof e!=`string`||!e)throw Error(`${t} is invalid`);return e}}function Ve(e){if(e===void 0)return 600;if(typeof e!=`string`)throw Error(`timeoutSeconds is invalid`);let t=Number(e);if(!Number.isFinite(t)||t<=0)throw Error(`timeoutSeconds must be positive`);return Math.min(t,Ce)}function j(e,t){if(e.some(e=>!e.startsWith(`/`)||e.includes(`\0`)||t===`writablePaths`&&e===`/`))throw Error(`${t} must contain absolute VFS paths`)}function M(e){return`/sessions/.curated/${e.slice(e.lastIndexOf(`/`)+1)}`}function He(e,t,n,r,i){let a=e.model===`parent`||e.model===`cone`;return{cwd:r.root,writablePaths:e.writablePaths,visiblePaths:e.visiblePaths,allowedCommands:e.allowedCommands,prompt:t,thinkingLevel:e.thinkingLevel,persistSession:!0,name:w(i?.folder??`cone`),...i?.jid?{parentJid:i.jid}:{},notifyOnComplete:!0,successReceiptPath:M(n),maxWallClockMs:e.timeoutSeconds*1e3,...!a&&e.model?{modelId:e.model}:{}}}function Ue(e,t){return t===E?e:e.replaceAll(E,t)}function We(e,t){let n=e;for(let[e,r]of Object.entries(t))n=n.replaceAll(`{{${e}}}`,r);return n}function Ge(e,t,n){return new Promise(r=>{let i=!1,a=e=>{i||(i=!0,clearTimeout(s),n?.removeEventListener(`abort`,o),r(e))},o=()=>a({type:`aborted`}),s=setTimeout(()=>a({type:`timeout`}),t);n?.addEventListener(`abort`,o,{once:!0}),e.then(e=>a({type:`result`,result:e}),e=>a({type:`error`,error:e}))})}function N(e){return e instanceof Error?e.message:String(e)}var P=`/sessions`,F=`/sessions/index.json`;async function I(e){try{let t=await e.readFile(F,{encoding:`utf-8`}),n=typeof t==`string`?t:new TextDecoder().decode(t),r=JSON.parse(n);return Array.isArray(r)?r:[]}catch{return[]}}function L(e){return`${P}/${e.filename}`}function R(e){let t=e,n=`Untitled`,r={},i=t.match(/^---\n([\s\S]*?)\n---\n+/);if(i){t=t.slice(i[0].length);let e=B(i[1],`cost`),a=B(i[1],`models`);e&&(r.cost=e),a&&(r.models=a);let o=i[1].match(/^cone:\s*(.+?)\s*$/m)?.[1];o&&(r.cone=o);let s=i[1].match(/^coneLabel:\s*(.+?)\s*$/m)?.[1];s&&(r.coneLabel=z(s)),/^memorySkipped:\s*true\s*$/m.test(i[1])&&(r.memorySkipped=!0);let c=i[1].match(/^title:\s*(.+?)\s*$/m);c&&(n=z(c[1]))}let a=t.match(/<!-- slicc:session-data\n([\s\S]*?)\n-->\n*/);if(a){try{let e=a[1].replace(/-- >/g,`-->`),t=JSON.parse(e);if(Array.isArray(t))return{title:n,messages:t,...r}}catch{}t=t.replace(/<!-- slicc:session-data\n[\s\S]*?\n-->\n*/,``)}return t=t.replace(/^#\s+[^\n]*\n+/,``),{title:n,messages:Ke(t),...r}}function z(e){let t=e.trim();if(!t.startsWith(`"`))return t;try{let e=JSON.parse(t);if(typeof e==`string`)return e}catch{}return t.replace(/^"|"$/g,``)}function B(e,t){let n=RegExp(`^${t}:\\s*(.+?)\\s*$`,`m`).exec(e)?.[1];if(n)try{return JSON.parse(n)}catch{return}}function Ke(e){let t=[],n=/^## (User|Assistant)\s*\n/gm,r=[],i;for(;(i=n.exec(e))!==null;)r.push({role:i[1]===`User`?`user`:`assistant`,start:i.index,bodyStart:i.index+i[0].length});for(let n=0;n<r.length;n++){let i=n+1<r.length?r[n+1].start:e.length,a=e.slice(r[n].bodyStart,i).trim();t.push({id:`frozen-${n}`,role:r[n].role,content:a,timestamp:0})}return t}function V(e){let t=``;for(let n of e){let e=n.role===`user`?`User`:`Assistant`,r=n.role===`user`?ne(n.content):n.content;if(t+=`## ${e}\n${r}\n\n`,n.attachments?.length&&(t+=`Attachments:\n${n.attachments.map(e=>`- ${s(e)}`).join(`
153
- `)}\n\n`),n.toolCalls)for(let e of n.toolCalls)t+=`### Tool: ${e.name}\nInput: ${JSON.stringify(e.input,null,2)}\nResult: ${e.result??``}\n\n`}return t}var qe=e({PENDING_SESSION_ATTEMPT_LIMIT:()=>3,SESSIONS_INDEX_PATH:()=>F,curateFrozenSessionMemories:()=>K,enrichPendingSession:()=>Z,freezeConeSession:()=>G,listPendingEnrichments:()=>St,markSnapshotUnavailable:()=>$,processPendingSessions:()=>Ct,readSessionsIndex:()=>I}),H=o(`session-freezer`),Je=4,U=2048,W=40,Ye=`${P}/attachments`;async function G(e){let t=await ut(e.sessionStore,J(e));if(!t||t.messages.length<Je)return H.info(`Skipping freeze: session below threshold or missing`,{messageCount:t?.messages.length??0}),null;let n=Y(t.messages),r=e.mode??`full`,i=r===`full`&&!!(e.apiKey&&e.model);!e.agenticMemorySpawn&&e.memory!==`skip`&&await Ze(e,n,i);let a=await Qe(e,n,i)||gt(t.messages);return await $e(e,t,a,r,i?await Xe(e,a):void 0,!!e.agenticMemorySpawn&&e.memory!==`skip`)}async function K(e,t){let n=Y(t.archive.messages),r;try{r=await Ne({spawn:e.agenticMemorySpawn,vfs:e.vfs,sessionArchivePath:L(t),sessionCount:await b(e.vfs),...e.cone?{cone:e.cone}:{}})}catch(e){r={ok:!1,reason:e instanceof Error?e.message:String(e),legacyFallbackSafe:!1}}if(r.ok){let n=await Ft(e.vfs,t.filename);return await Et(e.vfs,t.filename),n?(delete t.memoryPending,H.info(`Agentic memory pass completed`,{filename:t.filename}),n):(H.info(`Agentic memory pass completed; index entry already gone`,{filename:t.filename}),null)}return r.legacyFallbackSafe?(H.warn(`Agentic memory pass failed after finishing — falling back to legacy extraction`,{filename:t.filename,reason:r.reason}),await Ze(e,n,!0),null):(H.warn(`Agentic memory pass unfinished — entry stays pending for boot catch-up`,{filename:t.filename,reason:r.reason,attemptLimit:3}),null)}async function Xe(e,t){try{return q(await(e.pickIcon??(await i(async()=>{let{pickLucideIcon:e}=await import(`./quick-llm-DK8AEQp1.js`).then(e=>e.n);return{pickLucideIcon:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29]))).pickLucideIcon)({subject:`"${t}" — an archived chat session`})??void 0)}catch(e){H.warn(`Icon pick failed (freeze still proceeds)`,{error:e instanceof Error?e.message:String(e)});return}}function q(e){if(e)return l(e)?e:void 0}async function Ze(e,r,i){if(!i){H.info(`LLM unavailable — skipping memory extraction; freezing anyway`);return}let a=``;try{a=await t({messages:r,instruction:n,model:e.model,apiKey:e.apiKey,maxTokens:U,headers:e.headers})}catch(e){H.warn(`Memory extraction call failed (freeze still proceeds)`,{error:e instanceof Error?e.message:String(e)});return}if(!a.trim()||a.trim()===`NONE`){H.info(`Memory extraction returned no durable memories`);return}try{await bt(e.vfs,lt(J(e)),a.trim(),`new-session`,{model:e.model,apiKey:e.apiKey,headers:e.headers}),H.info(`Memory extracted and appended on new-session`)}catch(e){H.warn(`Memory append failed`,{error:e instanceof Error?e.message:String(e)})}}async function Qe(e,n,i){if(!i)return``;try{return ht(await t({messages:n,instruction:r,model:e.model,apiKey:e.apiKey,maxTokens:W,headers:e.headers}))}catch(e){return H.warn(`Title generation call failed (using heuristic)`,{error:e instanceof Error?e.message:String(e)}),``}}async function $e(e,t,n,r,i,a=!1){let o=new Date().toISOString(),s=crypto.randomUUID(),c=r===`quick`?`pending-${vt()}.md`:`${o.replace(/[:.]/g,`-`)}-${_t(n)}.md`,l=et(t.messages),u=J(e),d={cone:u,...u!==`cone`&&e.cone?.label?{coneLabel:e.cone.label}:{}},f={filename:c,sessionId:s,title:n,frozenAt:o,messageCount:t.messages.length,...l??{},...d,...i?{icon:i}:{},...r===`quick`?{pendingEnrichment:!0}:{},...a?{memoryPending:!0}:{},...e.memory===`skip`?{memorySkipped:!0}:{}};try{await X(e.vfs,P);let r=await rt(e.vfs,t.messages,c.replace(/\.md$/,``)),i={id:t.id,title:n,frozenAt:o,createdAt:t.createdAt,updatedAt:t.updatedAt,messageCount:t.messages.length,messages:r,...l??{},...d,...e.memory===`skip`?{memorySkipped:!0}:{}},a=mt(i);return await e.vfs.writeFile(`${P}/${c}`,a),await xt(e.vfs,f),await e.vfs.flush(),H.info(`Cone session frozen`,{filename:c,title:n,cone:u,messageCount:t.messages.length}),{...f,archive:i}}catch(e){return H.warn(`Failed to write frozen session to VFS`,{error:e instanceof Error?e.message:String(e)}),null}}function et(e){let t={total:0,input:0,output:0,cacheRead:0,cacheWrite:0},n=new Map,r=!1;for(let i of e){if(i.role!==`assistant`)continue;let{model:e,usage:a}=i;if(!e||!a||!nt(a))return null;let o=a.cost;r=!0,t.total+=o.total,t.input+=o.input,t.output+=o.output,t.cacheRead+=o.cacheRead,t.cacheWrite+=o.cacheWrite;let s=n.get(e)??{model:e,cost:0,turns:0,tokens:0};s.cost+=o.total,s.turns+=1,s.tokens+=a.input+a.output+a.cacheRead+a.cacheWrite,n.set(e,s)}return r?{cost:t,models:[...n.values()].sort((e,t)=>t.cost-e.cost)}:null}function tt(e){return typeof e==`number`&&Number.isFinite(e)}function nt(e){let{cost:t}=e;return[e.input,e.output,e.cacheRead,e.cacheWrite].every(tt)&&[t.input,t.output,t.cacheRead,t.cacheWrite,t.total].every(tt)}async function rt(e,t,n){let r={vfs:e,archiveDir:`${Ye}/${n}`,copiedPaths:new Map,fileIndex:0},i=[];for(let e of t){if(!e.attachments?.some(ot)){i.push(e);continue}let t=[];for(let n of e.attachments)t.push(await it(r,n));i.push({...e,attachments:t})}return i}async function it(e,t){if(!ot(t))return t;let n=e.copiedPaths.get(t.path);if(n)return{...t,path:n};let r=await at(e.vfs,t.path);if(!r)return ct(t);let i=t.name.replace(/[^A-Za-z0-9._-]+/g,`_`)||`attachment`,a=`${e.archiveDir}/${e.fileIndex++}-${i}`;return await X(e.vfs,e.archiveDir),await e.vfs.writeFile(a,r),e.copiedPaths.set(t.path,a),{...t,path:a}}async function at(e,t){try{if(!await st(e,t))return null;let n=await e.readFile(t,{encoding:`binary`});if(!(n instanceof Uint8Array))throw Error(`Expected binary attachment content at ${t}`);return n}catch{return null}}function ot(e){return typeof e.path==`string`&&e.path.startsWith(`/tmp/`)&&e.data===void 0&&e.text===void 0}async function st(e,t){let n=t.split(`/`).slice(1);if(n.length<2||n[0]!==`tmp`||n.some(e=>!e||e===`.`||e===`..`))return!1;let r=`/`;for(let t=0;t<n.length;t+=1){let i=(await e.readDir(r)).find(e=>e.name===n[t]);if(!i)return!1;if(t===n.length-1)return i.type===`file`;if(i.type!==`directory`)return!1;r=r===`/`?`/${n[t]}`:`${r}/${n[t]}`}return!1}function ct(e){let{path:t,...n}=e;return{...n,error:e.error??`Archived attachment file is missing or unsafe to preserve.`}}function J(e){return e.cone?.folder||`cone`}function lt(e){return h({parentJid:null,folder:e}).memoryPath}async function ut(e,t){let n=f({folder:t});try{return await e.load(n)}catch(e){return H.warn(`Failed to load cone chat session`,{sessionId:n,error:e instanceof Error?e.message:String(e)}),null}}function Y(e){return e.map(e=>({role:e.role,content:[{type:`text`,text:e.content}],timestamp:e.timestamp}))}var dt=`<!-- slicc:session-data
154
- `,ft=`
155
- -->`;function pt(e){return e.map(e=>{let t={id:e.id,role:e.role,content:e.content,timestamp:e.timestamp};return e.attachments?.length&&(t.attachments=e.attachments),e.toolCalls?.length&&(t.toolCalls=e.toolCalls.map(e=>({id:e.id,name:e.name,input:e.input,...e.result===void 0?{}:{result:e.result},...e.isError?{isError:e.isError}:{}}))),e.source&&(t.source=e.source),e.channel&&(t.channel=e.channel),t})}function mt(e){let t=(e.cost?`cost: ${JSON.stringify(e.cost)}\n`:``)+(e.models?`models: ${JSON.stringify(e.models)}\n`:``),n=(e.cone?`cone: ${e.cone}\n`:``)+(e.coneLabel?`coneLabel: ${JSON.stringify(e.coneLabel)}\n`:``)+(e.memorySkipped?`memorySkipped: true
154
+ `);for(let e=0;e<n.length;e+=1){let r=n[e];if(!r.trim()||r.trimStart().startsWith(`#`))continue;let i=r.match(/^([A-Za-z][A-Za-z0-9]*):\s*(.*)$/);if(!i)throw Error(`Invalid frontmatter line: ${r}`);let[,a,o]=i;if(De.has(a)){let r=Le(n,e,o);t[a]=r.value,e=r.lastIndex}else if(Oe.has(a)&&o.trim())t[a]=k(o);else throw Error(`Unsupported or empty frontmatter field: ${a}`)}return t}function Le(e,t,n){if(n.trim()){let e=n.trim();if(!e.startsWith(`[`)||!e.endsWith(`]`))throw Error(`Expected an array`);let r=e.slice(1,-1).trim();return{value:r?Re(r):[],lastIndex:t}}let r=[],i=t;for(let n=t+1;n<e.length;n+=1){let t=e[n].match(/^\s+-\s+(.+)$/);if(!t)break;r.push(k(ze(t[1]))),i=n}return{value:r,lastIndex:i}}function Re(e){let t=[],n=0,r;for(let i=0;i<e.length;i+=1){let a=e[i];a===`"`||a===`'`?r=r===a?void 0:r??a:a===`,`&&!r&&(t.push(k(e.slice(n,i))),n=i+1)}if(r)throw Error(`Unclosed quoted value`);return t.push(k(e.slice(n))),t}function ze(e){let t;for(let n=0;n<e.length;n+=1){let r=e[n];if(r===`"`||r===`'`)t=t===r?void 0:t??r;else if(r===`#`&&!t&&(n===0||/\s/.test(e[n-1])))return e.slice(0,n).trimEnd()}return e}function k(e){let t=e.trim();if(!t)throw Error(`Empty frontmatter value`);let n=t[0];if((n===`"`||n===`'`)&&t.at(-1)===n)return t.slice(1,-1);if(n===`"`||n===`'`)throw Error(`Unclosed quoted value`);return t}function A(e,t,n){let r=e[t];if(r===void 0)return[...n];if(!Array.isArray(r)||r.some(e=>!e))throw Error(`${t} is invalid`);return[...r]}function Be(e,t){if(e!==void 0){if(typeof e!=`string`||!e)throw Error(`${t} is invalid`);return e}}function Ve(e){if(e===void 0)return 600;if(typeof e!=`string`)throw Error(`timeoutSeconds is invalid`);let t=Number(e);if(!Number.isFinite(t)||t<=0)throw Error(`timeoutSeconds must be positive`);return Math.min(t,Ce)}function j(e,t){if(e.some(e=>!e.startsWith(`/`)||e.includes(`\0`)||t===`writablePaths`&&e===`/`))throw Error(`${t} must contain absolute VFS paths`)}function M(e){return`/sessions/.curated/${e.slice(e.lastIndexOf(`/`)+1)}`}function N(e){return`/sessions/.curation/${e.slice(e.lastIndexOf(`/`)+1)}`}function P(e){return`${N(e)}/base.md`}function F(e){return`${N(e)}/draft.md`}function He(e){return`${N(e)}/status.json`}async function Ue(e,t,n){let r=``;try{let n=await e.readFile(t,{encoding:`utf-8`});r=typeof n==`string`?n:new TextDecoder().decode(n)}catch{}await e.mkdir(N(n),{recursive:!0}),await e.writeFile(P(n),r),await e.writeFile(F(n),r)}function We(e,t,n){let r=e.map(e=>e===t?n:e);return r.includes(n)?r:[...r,n]}function Ge(e,t,n,r,i){let a=e.model===`parent`||e.model===`cone`,o=P(n),s=F(n);return{cwd:r.root,writablePaths:We(e.writablePaths,r.memoryPath,s),visiblePaths:[...e.visiblePaths,`${N(n)}/`],allowedCommands:e.allowedCommands,prompt:t,thinkingLevel:e.thinkingLevel,persistSession:!0,name:w(i?.folder??`cone`),...i?.jid?{parentJid:i.jid}:{},notifyOnComplete:!0,successReceiptPath:M(n),mergeOnSuccess:{targetPath:r.memoryPath,basePath:o,draftPath:s},outcomeReceiptPath:He(n),maxWallClockMs:e.timeoutSeconds*1e3,...!a&&e.model?{modelId:e.model}:{}}}function Ke(e,t){return t===E?e:e.replaceAll(E,t)}function qe(e,t){let n=e;for(let[e,r]of Object.entries(t))n=n.replaceAll(`{{${e}}}`,r);return n}function Je(e,t,n){return new Promise(r=>{let i=!1,a=e=>{i||(i=!0,clearTimeout(s),n?.removeEventListener(`abort`,o),r(e))},o=()=>a({type:`aborted`}),s=setTimeout(()=>a({type:`timeout`}),t);n?.addEventListener(`abort`,o,{once:!0}),e.then(e=>a({type:`result`,result:e}),e=>a({type:`error`,error:e}))})}function I(e){return e instanceof Error?e.message:String(e)}var L=`/sessions`,R=`/sessions/index.json`;async function z(e){try{let t=await e.readFile(R,{encoding:`utf-8`}),n=typeof t==`string`?t:new TextDecoder().decode(t),r=JSON.parse(n);return Array.isArray(r)?r:[]}catch{return[]}}function B(e){return`${L}/${e.filename}`}function V(e){let t=e,n=`Untitled`,r={},i=t.match(/^---\n([\s\S]*?)\n---\n+/);if(i){t=t.slice(i[0].length);let e=U(i[1],`cost`),a=U(i[1],`models`);e&&(r.cost=e),a&&(r.models=a);let o=i[1].match(/^cone:\s*(.+?)\s*$/m)?.[1];o&&(r.cone=o);let s=i[1].match(/^coneLabel:\s*(.+?)\s*$/m)?.[1];s&&(r.coneLabel=H(s)),/^memorySkipped:\s*true\s*$/m.test(i[1])&&(r.memorySkipped=!0);let c=i[1].match(/^title:\s*(.+?)\s*$/m);c&&(n=H(c[1]))}let a=t.match(/<!-- slicc:session-data\n([\s\S]*?)\n-->\n*/);if(a){try{let e=a[1].replace(/-- >/g,`-->`),t=JSON.parse(e);if(Array.isArray(t))return{title:n,messages:t,...r}}catch{}t=t.replace(/<!-- slicc:session-data\n[\s\S]*?\n-->\n*/,``)}return t=t.replace(/^#\s+[^\n]*\n+/,``),{title:n,messages:Ye(t),...r}}function H(e){let t=e.trim();if(!t.startsWith(`"`))return t;try{let e=JSON.parse(t);if(typeof e==`string`)return e}catch{}return t.replace(/^"|"$/g,``)}function U(e,t){let n=RegExp(`^${t}:\\s*(.+?)\\s*$`,`m`).exec(e)?.[1];if(n)try{return JSON.parse(n)}catch{return}}function Ye(e){let t=[],n=/^## (User|Assistant)\s*\n/gm,r=[],i;for(;(i=n.exec(e))!==null;)r.push({role:i[1]===`User`?`user`:`assistant`,start:i.index,bodyStart:i.index+i[0].length});for(let n=0;n<r.length;n++){let i=n+1<r.length?r[n+1].start:e.length,a=e.slice(r[n].bodyStart,i).trim();t.push({id:`frozen-${n}`,role:r[n].role,content:a,timestamp:0})}return t}function W(e){let t=``;for(let n of e){let e=n.role===`user`?`User`:`Assistant`,r=n.role===`user`?ne(n.content):n.content;if(t+=`## ${e}\n${r}\n\n`,n.attachments?.length&&(t+=`Attachments:\n${n.attachments.map(e=>`- ${s(e)}`).join(`
155
+ `)}\n\n`),n.toolCalls)for(let e of n.toolCalls)t+=`### Tool: ${e.name}\nInput: ${JSON.stringify(e.input,null,2)}\nResult: ${e.result??``}\n\n`}return t}var Xe=e({PENDING_SESSION_ATTEMPT_LIMIT:()=>3,SESSIONS_INDEX_PATH:()=>R,curateFrozenSessionMemories:()=>et,enrichPendingSession:()=>Q,freezeConeSession:()=>$e,listPendingEnrichments:()=>Ot,markSnapshotUnavailable:()=>Kt,processPendingSessions:()=>kt,readSessionsIndex:()=>z}),G=o(`session-freezer`),Ze=4,K=2048,q=40,Qe=`${L}/attachments`;async function $e(e){let t=await gt(e.sessionStore,J(e));if(!t||t.messages.length<Ze)return G.info(`Skipping freeze: session below threshold or missing`,{messageCount:t?.messages.length??0}),null;let n=Y(t.messages),r=e.mode??`full`,i=r===`full`&&!!(e.apiKey&&e.model);!e.agenticMemorySpawn&&e.memory!==`skip`&&await rt(e,n,i);let a=await it(e,n,i)||St(t.messages);return await at(e,t,a,r,i?await tt(e,a):void 0,!!e.agenticMemorySpawn&&e.memory!==`skip`)}async function et(e,t){let n=Y(t.archive.messages),r;try{r=await Ne({spawn:e.agenticMemorySpawn,vfs:e.vfs,sessionArchivePath:B(t),sessionCount:await b(e.vfs),...e.cone?{cone:e.cone}:{}})}catch(e){r={ok:!1,reason:e instanceof Error?e.message:String(e),legacyFallbackSafe:!1}}if(r.ok){let n=await Vt(e.vfs,t.filename);return await Mt(e.vfs,t.filename),n?(delete t.memoryPending,G.info(`Agentic memory pass completed`,{filename:t.filename}),n):(G.info(`Agentic memory pass completed; index entry already gone`,{filename:t.filename}),null)}return await Ut(e.vfs,t.filename,r.reason),r.legacyFallbackSafe?(G.warn(`Agentic memory pass failed after finishing — falling back to legacy extraction`,{filename:t.filename,reason:r.reason}),await rt(e,n,!0),null):(G.warn(`Agentic memory pass unfinished — entry stays pending for boot catch-up`,{filename:t.filename,reason:r.reason,attemptLimit:3}),null)}async function tt(e,t){try{return nt(await(e.pickIcon??(await i(async()=>{let{pickLucideIcon:e}=await import(`./quick-llm-CJNPn8Zb.js`).then(e=>e.n);return{pickLucideIcon:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29]))).pickLucideIcon)({subject:`"${t}" — an archived chat session`})??void 0)}catch(e){G.warn(`Icon pick failed (freeze still proceeds)`,{error:e instanceof Error?e.message:String(e)});return}}function nt(e){if(e)return l(e)?e:void 0}async function rt(e,r,i){if(!i){G.info(`LLM unavailable — skipping memory extraction; freezing anyway`);return}let a=``;try{a=await t({messages:r,instruction:n,model:e.model,apiKey:e.apiKey,maxTokens:K,headers:e.headers})}catch(e){G.warn(`Memory extraction call failed (freeze still proceeds)`,{error:e instanceof Error?e.message:String(e)});return}if(!a.trim()||a.trim()===`NONE`){G.info(`Memory extraction returned no durable memories`);return}try{await Et(e.vfs,ht(J(e)),a.trim(),`new-session`,{model:e.model,apiKey:e.apiKey,headers:e.headers}),G.info(`Memory extracted and appended on new-session`)}catch(e){G.warn(`Memory append failed`,{error:e instanceof Error?e.message:String(e)})}}async function it(e,n,i){if(!i)return``;try{return xt(await t({messages:n,instruction:r,model:e.model,apiKey:e.apiKey,maxTokens:q,headers:e.headers}))}catch(e){return G.warn(`Title generation call failed (using heuristic)`,{error:e instanceof Error?e.message:String(e)}),``}}async function at(e,t,n,r,i,a=!1){let o=new Date().toISOString(),s=crypto.randomUUID(),c=r===`quick`?`pending-${wt()}.md`:`${o.replace(/[:.]/g,`-`)}-${Ct(n)}.md`,l=ot(t.messages),u=J(e),d={cone:u,...u!==`cone`&&e.cone?.label?{coneLabel:e.cone.label}:{}},f={filename:c,sessionId:s,title:n,frozenAt:o,messageCount:t.messages.length,...l??{},...d,...i?{icon:i}:{},...r===`quick`?{pendingEnrichment:!0}:{},...a?{memoryPending:!0}:{},...e.memory===`skip`?{memorySkipped:!0}:{}};try{await X(e.vfs,L);let r=await lt(e.vfs,t.messages,c.replace(/\.md$/,``)),i={id:t.id,title:n,frozenAt:o,createdAt:t.createdAt,updatedAt:t.updatedAt,messageCount:t.messages.length,messages:r,...l??{},...d,...e.memory===`skip`?{memorySkipped:!0}:{}},a=bt(i);return await e.vfs.writeFile(`${L}/${c}`,a),await Dt(e.vfs,f),await e.vfs.flush(),G.info(`Cone session frozen`,{filename:c,title:n,cone:u,messageCount:t.messages.length}),{...f,archive:i}}catch(e){return G.warn(`Failed to write frozen session to VFS`,{error:e instanceof Error?e.message:String(e)}),null}}function ot(e){let t={total:0,input:0,output:0,cacheRead:0,cacheWrite:0},n=new Map,r=!1;for(let i of e){if(i.role!==`assistant`)continue;let{model:e,usage:a}=i;if(!e||!a||!ct(a))return null;let o=a.cost;r=!0,t.total+=o.total,t.input+=o.input,t.output+=o.output,t.cacheRead+=o.cacheRead,t.cacheWrite+=o.cacheWrite;let s=n.get(e)??{model:e,cost:0,turns:0,tokens:0};s.cost+=o.total,s.turns+=1,s.tokens+=a.input+a.output+a.cacheRead+a.cacheWrite,n.set(e,s)}return r?{cost:t,models:[...n.values()].sort((e,t)=>t.cost-e.cost)}:null}function st(e){return typeof e==`number`&&Number.isFinite(e)}function ct(e){let{cost:t}=e;return[e.input,e.output,e.cacheRead,e.cacheWrite].every(st)&&[t.input,t.output,t.cacheRead,t.cacheWrite,t.total].every(st)}async function lt(e,t,n){let r={vfs:e,archiveDir:`${Qe}/${n}`,copiedPaths:new Map,fileIndex:0},i=[];for(let e of t){if(!e.attachments?.some(ft)){i.push(e);continue}let t=[];for(let n of e.attachments)t.push(await ut(r,n));i.push({...e,attachments:t})}return i}async function ut(e,t){if(!ft(t))return t;let n=e.copiedPaths.get(t.path);if(n)return{...t,path:n};let r=await dt(e.vfs,t.path);if(!r)return mt(t);let i=t.name.replace(/[^A-Za-z0-9._-]+/g,`_`)||`attachment`,a=`${e.archiveDir}/${e.fileIndex++}-${i}`;return await X(e.vfs,e.archiveDir),await e.vfs.writeFile(a,r),e.copiedPaths.set(t.path,a),{...t,path:a}}async function dt(e,t){try{if(!await pt(e,t))return null;let n=await e.readFile(t,{encoding:`binary`});if(!(n instanceof Uint8Array))throw Error(`Expected binary attachment content at ${t}`);return n}catch{return null}}function ft(e){return typeof e.path==`string`&&e.path.startsWith(`/tmp/`)&&e.data===void 0&&e.text===void 0}async function pt(e,t){let n=t.split(`/`).slice(1);if(n.length<2||n[0]!==`tmp`||n.some(e=>!e||e===`.`||e===`..`))return!1;let r=`/`;for(let t=0;t<n.length;t+=1){let i=(await e.readDir(r)).find(e=>e.name===n[t]);if(!i)return!1;if(t===n.length-1)return i.type===`file`;if(i.type!==`directory`)return!1;r=r===`/`?`/${n[t]}`:`${r}/${n[t]}`}return!1}function mt(e){let{path:t,...n}=e;return{...n,error:e.error??`Archived attachment file is missing or unsafe to preserve.`}}function J(e){return e.cone?.folder||`cone`}function ht(e){return h({parentJid:null,folder:e}).memoryPath}async function gt(e,t){let n=f({folder:t});try{return await e.load(n)}catch(e){return G.warn(`Failed to load cone chat session`,{sessionId:n,error:e instanceof Error?e.message:String(e)}),null}}function Y(e){return e.map(e=>({role:e.role,content:[{type:`text`,text:e.content}],timestamp:e.timestamp}))}var _t=`<!-- slicc:session-data
156
+ `,vt=`
157
+ -->`;function yt(e){return e.map(e=>{let t={id:e.id,role:e.role,content:e.content,timestamp:e.timestamp};return e.attachments?.length&&(t.attachments=e.attachments),e.toolCalls?.length&&(t.toolCalls=e.toolCalls.map(e=>({id:e.id,name:e.name,input:e.input,...e.result===void 0?{}:{result:e.result},...e.isError?{isError:e.isError}:{}}))),e.source&&(t.source=e.source),e.channel&&(t.channel=e.channel),t})}function bt(e){let t=(e.cost?`cost: ${JSON.stringify(e.cost)}\n`:``)+(e.models?`models: ${JSON.stringify(e.models)}\n`:``),n=(e.cone?`cone: ${e.cone}\n`:``)+(e.coneLabel?`coneLabel: ${JSON.stringify(e.coneLabel)}\n`:``)+(e.memorySkipped?`memorySkipped: true
156
158
  `:``),r=`---\nid: ${e.id}\ntitle: ${JSON.stringify(e.title)}\nfrozenAt: ${e.frozenAt}\ncreatedAt: ${e.createdAt}\nupdatedAt: ${e.updatedAt}\nmessageCount: ${e.messageCount}\n`+t+n+`---
157
159
 
158
- `,i=`${dt}${JSON.stringify(pt(e.messages)).replace(/-->/g,`-- >`)}${ft}\n\n`,a=`# ${e.title}\n\n`;return r+i+a+V(e.messages)}function ht(e){let t=e.trim();return t=t.replace(/^["'`]+|["'`]+$/g,``).trim(),t=t.replace(/\s+/g,` `),t.length>80&&(t=t.slice(0,80).trimEnd()),t}function gt(e){let t=e.find(e=>e.role===`user`);if(!t?.content)return`untitled-session`;let n=t.content.trim().replace(/\s+/g,` `);return n.length>60?`${n.slice(0,60)}…`:n||`untitled-session`}function _t(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-+|-+$/g,``).slice(0,48)||`session`}function vt(){return`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,6)}`}function yt(e){return e.startsWith(`pending-`)}async function X(e,t){try{await e.mkdir(t,{recursive:!0})}catch{}}async function bt(e,t,n,r,i){let a=t,o=``;try{let t=await e.readFile(a,{encoding:`utf-8`});o=typeof t==`string`?t:new TextDecoder().decode(t)}catch(t){if(!(t instanceof c)||t.code!==`ENOENT`)throw t;await X(e,a.slice(0,a.lastIndexOf(`/`)))}let s=`## Auto-extracted (${new Date().toISOString().slice(0,10)}, ${r})`,l=`${o.length===0||o.endsWith(`
160
+ `,i=`${_t}${JSON.stringify(yt(e.messages)).replace(/-->/g,`-- >`)}${vt}\n\n`,a=`# ${e.title}\n\n`;return r+i+a+W(e.messages)}function xt(e){let t=e.trim();return t=t.replace(/^["'`]+|["'`]+$/g,``).trim(),t=t.replace(/\s+/g,` `),t.length>80&&(t=t.slice(0,80).trimEnd()),t}function St(e){let t=e.find(e=>e.role===`user`);if(!t?.content)return`untitled-session`;let n=t.content.trim().replace(/\s+/g,` `);return n.length>60?`${n.slice(0,60)}…`:n||`untitled-session`}function Ct(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-+|-+$/g,``).slice(0,48)||`session`}function wt(){return`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,6)}`}function Tt(e){return e.startsWith(`pending-`)}async function X(e,t){try{await e.mkdir(t,{recursive:!0})}catch{}}async function Et(e,t,n,r,i){let a=t,o=``;try{let t=await e.readFile(a,{encoding:`utf-8`});o=typeof t==`string`?t:new TextDecoder().decode(t)}catch(t){if(!(t instanceof c)||t.code!==`ENOENT`)throw t;await X(e,a.slice(0,a.lastIndexOf(`/`)))}let s=`## Auto-extracted (${new Date().toISOString().slice(0,10)}, ${r})`,l=`${o.length===0||o.endsWith(`
159
161
  `)?``:`
160
- `}\n${s}\n\n${n}\n`;await e.writeFile(a,o+l);try{await xe({vfs:e,memoryPath:a,model:i?.model,apiKey:i?.apiKey,headers:i?.headers,signal:i?.signal})}catch(e){H.warn(`Cone memory budget step threw (append already committed)`,{error:e instanceof Error?e.message:String(e)})}}async function xt(e,t){let n=[];try{let t=await e.readFile(F,{encoding:`utf-8`}),r=typeof t==`string`?t:new TextDecoder().decode(t),i=JSON.parse(r);Array.isArray(i)&&(n=i)}catch(e){if(!(e instanceof c)||e.code!==`ENOENT`)throw e}let r=[t,...n.filter(e=>e.filename!==t.filename)];await e.writeFile(F,JSON.stringify(r,null,2))}async function St(e){return(await I(e)).filter(e=>(e.pendingEnrichment===!0||e.memoryPending===!0)&&wt(e)<3)}async function Ct(e){let t={attempted:0,completed:0};if(!e.model||!e.apiKey)return t;try{let n=await St(e.vfs);for(let r of n)try{let n=await It(e.vfs,r.filename);if(!n)continue;t.attempted+=1,await Z(e.vfs,n,{model:e.model,apiKey:e.apiKey,headers:e.headers})&&(t.completed+=1)}catch(e){H.warn(`Pending session catch-up attempt failed`,{filename:r.filename,error:e instanceof Error?e.message:String(e)})}}catch(e){H.warn(`Pending session catch-up failed`,{error:e instanceof Error?e.message:String(e)})}return t}function wt(e){let t=e.pendingAttemptCount;return typeof t==`number`&&Number.isInteger(t)&&t>0?t:0}async function Z(e,t,n){if(!t.pendingEnrichment&&!t.memoryPending)return null;let r=await Ot(e,t);if(r===null)return null;let i=kt(t,r);if(i===null)return null;let a=t.memoryPending===!0&&n.skipMemory!==!0&&await Tt(e,t),o=a||t.memorySkipped===!0?{...n,skipMemory:!0}:n,s=await At(t,i,o);if(s===null)return null;let c=await Dt(o,s.newTitle);await jt(e,t,s.bullets,o);let l=await Nt(e,t,r,s.newTitle,c,n.skipMemory===!0);return l&&a&&await Et(e,t.filename),l}async function Tt(e,t){try{return await e.stat(M(`/sessions/${t.filename}`)),!0}catch{return!1}}async function Et(e,t){try{await e.rm(M(`/sessions/${t}`))}catch{}}async function Dt(e,t){if(e.pickIcon)try{return await q(await e.pickIcon({subject:`"${t}" — an archived chat session`})??void 0)}catch(e){H.warn(`Enrichment icon pick failed (continuing without icon)`,{error:e instanceof Error?e.message:String(e)});return}}async function Ot(e,t){try{let n=await e.readFile(L(t),{encoding:`utf-8`});return typeof n==`string`?n:new TextDecoder().decode(n)}catch(e){return e?.code===`ENOENT`?H.info(`Pending archive missing — treating as already enriched`,{filename:t.filename}):H.warn(`Failed to read pending archive (entry stays pending)`,{filename:t.filename,error:e instanceof Error?e.message:String(e)}),null}}function kt(e,t){let n;try{n=R(t).messages}catch(t){return H.warn(`Failed to parse pending archive — leaving entry intact`,{filename:e.filename,error:t instanceof Error?t.message:String(t)}),null}return n.length===0?(H.info(`Pending archive has no messages — skipping enrichment`,{filename:e.filename}),null):Y(n)}async function At(e,i,a){let o=``;if(!a.skipMemory)try{o=await t({messages:i,instruction:n,model:a.model,apiKey:a.apiKey,maxTokens:U,headers:a.headers})}catch(t){return H.warn(`Enrichment memory call failed (entry stays pending)`,{filename:e.filename,error:t instanceof Error?t.message:String(t)}),null}let s=``;try{s=ht(await t({messages:i,instruction:r,model:a.model,apiKey:a.apiKey,maxTokens:W,headers:a.headers}))}catch(t){return H.warn(`Enrichment title call failed (entry stays pending)`,{filename:e.filename,error:t instanceof Error?t.message:String(t)}),null}return s?{bullets:o,newTitle:s}:(H.info(`Enrichment title call returned empty — entry stays pending`,{filename:e.filename}),null)}async function jt(e,t,n,r){let i=n.trim();if(!(!i||i===`NONE`))try{await bt(e,lt(t.cone||`cone`),i,`pending-enrichment`,{model:r.model,apiKey:r.apiKey,headers:r.headers})}catch(e){H.warn(`Enrichment memory append failed (continuing with title rewrite)`,{filename:t.filename,error:e instanceof Error?e.message:String(e)})}}function Mt(e,t,n,r,i){let a=r??e.icon;return{filename:t,title:n,frozenAt:e.frozenAt,messageCount:e.messageCount,...e.cost?{cost:e.cost}:{},...e.models?{models:e.models}:{},...e.cone?{cone:e.cone}:{},...e.coneLabel?{coneLabel:e.coneLabel}:{},...e.sessionId?{sessionId:e.sessionId}:{},...a?{icon:a}:{},...e.completeSnapshotUnavailable?{completeSnapshotUnavailable:!0}:{},...i&&e.memoryPending?{memoryPending:!0}:{},...e.memorySkipped?{memorySkipped:!0}:{}}}async function Nt(e,t,n,r,i,a=!1){let o=L(t),s=yt(t.filename),c=s?r:t.title,l=s?`${t.frozenAt.replace(/[:.]/g,`-`)}-${_t(r)}.md`:t.filename,u=`${P}/${l}`;if(s)try{await X(e,P),await e.writeFile(u,Pt(n,c))}catch(e){return H.warn(`Enrichment write failed (entry stays pending)`,{filename:t.filename,error:e instanceof Error?e.message:String(e)}),null}let d=Mt(t,l,c,i,a);try{await Lt(e,t.filename,d)}catch(e){return H.warn(`Enrichment index update failed (entry may stay pending)`,{filename:t.filename,error:e instanceof Error?e.message:String(e)}),null}if(u!==o)try{await e.rm(o)}catch(e){H.info(`Stale pending archive cleanup failed (harmless)`,{oldPath:o,error:e instanceof Error?e.message:String(e)})}try{await e.flush()}catch{}return H.info(`Pending session enriched`,{oldFilename:t.filename,newFilename:l,title:c}),d}function Pt(e,t){let n=e.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);if(!n)return e;let r=n[1].replace(/^title:\s*.+$/m,`title: ${JSON.stringify(t)}`),i=n[2];return i=i.replace(/^#\s+[^\n]*$/m,`# ${t}`),`---\n${r}\n---\n${i}`}var Q=Promise.resolve();async function Ft(e,t){let n=null,r=async()=>{let r=await I(e),i=r.findIndex(e=>e.filename===t);if(i===-1)return;let{memoryPending:a,pendingEnrichment:o,pendingAttemptCount:s,...c}=r[i],l=r.slice();l[i]=c,await e.writeFile(F,JSON.stringify(l,null,2)),await e.flush(),n=c},i=Q.then(r,r);Q=i.then(()=>void 0,()=>void 0);try{await i}catch(e){H.warn(`Failed to clear agentic memory pending marker`,{filename:t,error:e instanceof Error?e.message:String(e)})}return n}async function It(e,t){let n=null,r=async()=>{let r=await I(e),i=r.findIndex(e=>e.filename===t);if(i===-1)return;let a=r[i];if(!a.pendingEnrichment&&!a.memoryPending)return;let o=wt(a);if(o>=3)return;n={...a,pendingAttemptCount:o+1};let s=r.slice();s[i]=n,await e.writeFile(F,JSON.stringify(s,null,2)),await e.flush()},i=Q.then(r,r);return Q=i.then(()=>void 0,()=>void 0),await i,n}async function Lt(e,t,n){let r=async()=>{let r=[];try{let t=await e.readFile(F,{encoding:`utf-8`}),n=typeof t==`string`?t:new TextDecoder().decode(t),i=JSON.parse(n);Array.isArray(i)&&(r=i)}catch(e){if(!(e instanceof c)||e.code!==`ENOENT`)throw e}let i=r.findIndex(e=>e.filename===t),a;i===-1?a=[n,...r.filter(e=>e.filename!==n.filename)]:(a=r.slice(),a[i]=n,a=a.filter((e,t)=>t===i||e.filename!==n.filename)),await e.writeFile(F,JSON.stringify(a,null,2))},i=Q.then(r,r);return Q=i.then(()=>void 0,()=>void 0),i}async function $(e,t){let n=async()=>{let n=[];try{let t=await e.readFile(F,{encoding:`utf-8`}),r=typeof t==`string`?t:new TextDecoder().decode(t),i=JSON.parse(r);Array.isArray(i)&&(n=i)}catch(e){if(!(e instanceof c)||e.code!==`ENOENT`)throw e;return}if(!n.find(e=>e.filename===t))return;let r=n.map(e=>e.filename===t?{...e,completeSnapshotUnavailable:!0}:e);await e.writeFile(F,JSON.stringify(r,null,2))},r=Q.then(n,n);return Q=r.then(()=>void 0,()=>void 0),r}export{Ct as a,F as c,I as d,g as f,$ as i,L as l,Z as n,qe as o,ae as p,G as r,V as s,K as t,R as u};
162
+ `}\n${s}\n\n${n}\n`;await e.writeFile(a,o+l);try{await xe({vfs:e,memoryPath:a,model:i?.model,apiKey:i?.apiKey,headers:i?.headers,signal:i?.signal})}catch(e){G.warn(`Cone memory budget step threw (append already committed)`,{error:e instanceof Error?e.message:String(e)})}}async function Dt(e,t){let n=[];try{let t=await e.readFile(R,{encoding:`utf-8`}),r=typeof t==`string`?t:new TextDecoder().decode(t),i=JSON.parse(r);Array.isArray(i)&&(n=i)}catch(e){if(!(e instanceof c)||e.code!==`ENOENT`)throw e}let r=[t,...n.filter(e=>e.filename!==t.filename)];await e.writeFile(R,JSON.stringify(r,null,2))}async function Ot(e){return(await z(e)).filter(e=>(e.pendingEnrichment===!0||e.memoryPending===!0)&&Z(e)<3)}async function kt(e){let t={attempted:0,completed:0};if(!e.model||!e.apiKey)return t;try{for(let t of await z(e.vfs))t.memoryPending===!0&&t.memoryFailed===void 0&&Z(t)>=3&&await Ut(e.vfs,t.filename,`catch-up retries exhausted (3)`);let n=await Ot(e.vfs);for(let r of n)try{let n=await Ht(e.vfs,r.filename);if(!n)continue;t.attempted+=1,await Q(e.vfs,n,{model:e.model,apiKey:e.apiKey,headers:e.headers})&&(t.completed+=1)}catch(e){G.warn(`Pending session catch-up attempt failed`,{filename:r.filename,error:e instanceof Error?e.message:String(e)})}}catch(e){G.warn(`Pending session catch-up failed`,{error:e instanceof Error?e.message:String(e)})}return t}function Z(e){let t=e.pendingAttemptCount;return typeof t==`number`&&Number.isInteger(t)&&t>0?t:0}async function Q(e,t,n){if(!t.pendingEnrichment&&!t.memoryPending)return null;let r=await Pt(e,t);if(r===null)return null;let i=Ft(t,r);if(i===null)return null;let a=t.memoryPending===!0&&n.skipMemory!==!0&&await jt(e,t),o=a||t.memorySkipped===!0?{...n,skipMemory:!0}:n,s=await It(t,i,o);if(s===null)return null;let c=await Nt(o,s.newTitle);await Lt(e,t,s.bullets,o);let l=await zt(e,t,r,s.newTitle,c,n.skipMemory===!0);return l&&a&&(await Mt(e,t.filename),await Wt(e,l.filename),await At(e,t.filename)),l}async function At(e,t){for(let n of[P(`/sessions/${t}`),F(`/sessions/${t}`)])try{await e.rm(n)}catch{}}async function jt(e,t){try{return await e.stat(M(`/sessions/${t.filename}`)),!0}catch{return!1}}async function Mt(e,t){try{await e.rm(M(`/sessions/${t}`))}catch{}}async function Nt(e,t){if(e.pickIcon)try{return await nt(await e.pickIcon({subject:`"${t}" — an archived chat session`})??void 0)}catch(e){G.warn(`Enrichment icon pick failed (continuing without icon)`,{error:e instanceof Error?e.message:String(e)});return}}async function Pt(e,t){try{let n=await e.readFile(B(t),{encoding:`utf-8`});return typeof n==`string`?n:new TextDecoder().decode(n)}catch(e){return e?.code===`ENOENT`?G.info(`Pending archive missing — treating as already enriched`,{filename:t.filename}):G.warn(`Failed to read pending archive (entry stays pending)`,{filename:t.filename,error:e instanceof Error?e.message:String(e)}),null}}function Ft(e,t){let n;try{n=V(t).messages}catch(t){return G.warn(`Failed to parse pending archive — leaving entry intact`,{filename:e.filename,error:t instanceof Error?t.message:String(t)}),null}return n.length===0?(G.info(`Pending archive has no messages — skipping enrichment`,{filename:e.filename}),null):Y(n)}async function It(e,i,a){let o=``;if(!a.skipMemory)try{o=await t({messages:i,instruction:n,model:a.model,apiKey:a.apiKey,maxTokens:K,headers:a.headers})}catch(t){return G.warn(`Enrichment memory call failed (entry stays pending)`,{filename:e.filename,error:t instanceof Error?t.message:String(t)}),null}let s=``;try{s=xt(await t({messages:i,instruction:r,model:a.model,apiKey:a.apiKey,maxTokens:q,headers:a.headers}))}catch(t){return G.warn(`Enrichment title call failed (entry stays pending)`,{filename:e.filename,error:t instanceof Error?t.message:String(t)}),null}return s?{bullets:o,newTitle:s}:(G.info(`Enrichment title call returned empty — entry stays pending`,{filename:e.filename}),null)}async function Lt(e,t,n,r){let i=n.trim();if(!(!i||i===`NONE`))try{await Et(e,ht(t.cone||`cone`),i,`pending-enrichment`,{model:r.model,apiKey:r.apiKey,headers:r.headers})}catch(e){G.warn(`Enrichment memory append failed (continuing with title rewrite)`,{filename:t.filename,error:e instanceof Error?e.message:String(e)})}}function Rt(e,t,n,r,i){let a=r??e.icon;return{filename:t,title:n,frozenAt:e.frozenAt,messageCount:e.messageCount,...e.cost?{cost:e.cost}:{},...e.models?{models:e.models}:{},...e.cone?{cone:e.cone}:{},...e.coneLabel?{coneLabel:e.coneLabel}:{},...e.sessionId?{sessionId:e.sessionId}:{},...a?{icon:a}:{},...e.completeSnapshotUnavailable?{completeSnapshotUnavailable:!0}:{},...i&&e.memoryPending?{memoryPending:!0}:{},...e.memorySkipped?{memorySkipped:!0}:{}}}async function zt(e,t,n,r,i,a=!1){let o=B(t),s=Tt(t.filename),c=s?r:t.title,l=s?`${t.frozenAt.replace(/[:.]/g,`-`)}-${Ct(r)}.md`:t.filename,u=`${L}/${l}`;if(s)try{await X(e,L),await e.writeFile(u,Bt(n,c))}catch(e){return G.warn(`Enrichment write failed (entry stays pending)`,{filename:t.filename,error:e instanceof Error?e.message:String(e)}),null}let d=Rt(t,l,c,i,a);try{await Gt(e,t.filename,d)}catch(e){return G.warn(`Enrichment index update failed (entry may stay pending)`,{filename:t.filename,error:e instanceof Error?e.message:String(e)}),null}if(u!==o)try{await e.rm(o)}catch(e){G.info(`Stale pending archive cleanup failed (harmless)`,{oldPath:o,error:e instanceof Error?e.message:String(e)})}try{await e.flush()}catch{}return G.info(`Pending session enriched`,{oldFilename:t.filename,newFilename:l,title:c}),d}function Bt(e,t){let n=e.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);if(!n)return e;let r=n[1].replace(/^title:\s*.+$/m,`title: ${JSON.stringify(t)}`),i=n[2];return i=i.replace(/^#\s+[^\n]*$/m,`# ${t}`),`---\n${r}\n---\n${i}`}var $=Promise.resolve();async function Vt(e,t){let n=null,r=async()=>{let r=await z(e),i=r.findIndex(e=>e.filename===t);if(i===-1)return;let{memoryPending:a,pendingEnrichment:o,pendingAttemptCount:s,memoryFailed:c,...l}=r[i],u={...l,memoryCuratedAt:new Date().toISOString()},d=r.slice();d[i]=u,await e.writeFile(R,JSON.stringify(d,null,2)),await e.flush(),n=u},i=$.then(r,r);$=i.then(()=>void 0,()=>void 0);try{await i}catch(e){G.warn(`Failed to clear agentic memory pending marker`,{filename:t,error:e instanceof Error?e.message:String(e)})}return n}async function Ht(e,t){let n=null,r=async()=>{let r=await z(e),i=r.findIndex(e=>e.filename===t);if(i===-1)return;let a=r[i];if(!a.pendingEnrichment&&!a.memoryPending)return;let o=Z(a);if(o>=3)return;n={...a,pendingAttemptCount:o+1};let s=r.slice();s[i]=n,await e.writeFile(R,JSON.stringify(s,null,2)),await e.flush()},i=$.then(r,r);return $=i.then(()=>void 0,()=>void 0),await i,n}async function Ut(e,t,n){let r=async()=>{let r=await z(e),i=r.findIndex(e=>e.filename===t);if(i===-1)return;let a=r.slice();a[i]={...r[i],memoryFailed:n.slice(0,300)},await e.writeFile(R,JSON.stringify(a,null,2)),await e.flush()},i=$.then(r,r);$=i.then(()=>void 0,()=>void 0);try{await i}catch(e){G.warn(`Failed to record curator failure in sessions index`,{filename:t,error:e instanceof Error?e.message:String(e)})}}async function Wt(e,t){let n=async()=>{let n=await z(e),r=n.findIndex(e=>e.filename===t);if(r===-1)return;let{memoryFailed:i,...a}=n[r],o=n.slice();o[r]={...a,memoryCuratedAt:new Date().toISOString()},await e.writeFile(R,JSON.stringify(o,null,2)),await e.flush()},r=$.then(n,n);$=r.then(()=>void 0,()=>void 0);try{await r}catch(e){G.warn(`Failed to record curator completion in sessions index`,{filename:t,error:e instanceof Error?e.message:String(e)})}}async function Gt(e,t,n){let r=async()=>{let r=[];try{let t=await e.readFile(R,{encoding:`utf-8`}),n=typeof t==`string`?t:new TextDecoder().decode(t),i=JSON.parse(n);Array.isArray(i)&&(r=i)}catch(e){if(!(e instanceof c)||e.code!==`ENOENT`)throw e}let i=r.findIndex(e=>e.filename===t),a;i===-1?a=[n,...r.filter(e=>e.filename!==n.filename)]:(a=r.slice(),a[i]=n,a=a.filter((e,t)=>t===i||e.filename!==n.filename)),await e.writeFile(R,JSON.stringify(a,null,2))},i=$.then(r,r);return $=i.then(()=>void 0,()=>void 0),i}async function Kt(e,t){let n=async()=>{let n=[];try{let t=await e.readFile(R,{encoding:`utf-8`}),r=typeof t==`string`?t:new TextDecoder().decode(t),i=JSON.parse(r);Array.isArray(i)&&(n=i)}catch(e){if(!(e instanceof c)||e.code!==`ENOENT`)throw e;return}if(!n.find(e=>e.filename===t))return;let r=n.map(e=>e.filename===t?{...e,completeSnapshotUnavailable:!0}:e);await e.writeFile(R,JSON.stringify(r,null,2))},r=$.then(n,n);return $=r.then(()=>void 0,()=>void 0),r}export{kt as a,R as c,z as d,g as f,Kt as i,B as l,Q as n,Xe as o,ae as p,$e as r,W as s,et as t,V as u};
@@ -1 +1 @@
1
- import{n as e}from"./feature-flags-ByMXaIc4.js";import{h as t,n,t as r}from"./tray-runtime-config-D7cmCcHJ.js";import{n as i,r as a}from"./main-BfyJdxkI.js";var o=3e3;async function s(t,n){let r=i(n.storage);try{let i=new URL(`/api/flags`,`${n.workerBaseUrl.replace(/\/+$/,``)}/`);i.searchParams.set(`float`,t);let s=await c(i.toString(),n.fetchImpl??fetch,n.timeoutMs??o);if(!s)return;a(r,t,s),e(t,s)}catch{}}async function c(e,t,n){let r=new AbortController,i;try{let a=new Promise(e=>{i=setTimeout(()=>{r.abort(),e(null)},n)}),o=t(e,{cache:`no-store`,headers:{Accept:`application/json`},signal:r.signal}).then(async e=>e.ok?l(await e.json()):null).catch(()=>null);return await Promise.race([o,a])}catch{return null}finally{i!==void 0&&clearTimeout(i)}}function l(e){return!u(e)||!u(e.flags)||Object.values(e.flags).some(e=>typeof e!=`string`)?null:e.flags}function u(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function d(e,t){return s(e,{workerBaseUrl:f(t),storage:t.storage})}function f(e){let i=p(e.storage),a=t(e.envBaseUrl??null);if(i)return i;if(a)return a;if(!e.isDev)try{let t=new URL(e.locationHref);if(t.protocol===`http:`||t.protocol===`https:`)return t.origin}catch{}return e.isDev?n:r}function p(e){try{return t(e?.getItem(`slicc.trayWorkerBaseUrl`)??null)}catch{return null}}export{d as refreshFeatureFlagsForPage};
1
+ import{n as e}from"./feature-flags-ByMXaIc4.js";import{h as t,n,t as r}from"./tray-runtime-config-D7cmCcHJ.js";import{n as i,r as a}from"./main-BB4JLnQc.js";var o=3e3;async function s(t,n){let r=i(n.storage);try{let i=new URL(`/api/flags`,`${n.workerBaseUrl.replace(/\/+$/,``)}/`);i.searchParams.set(`float`,t);let s=await c(i.toString(),n.fetchImpl??fetch,n.timeoutMs??o);if(!s)return;a(r,t,s),e(t,s)}catch{}}async function c(e,t,n){let r=new AbortController,i;try{let a=new Promise(e=>{i=setTimeout(()=>{r.abort(),e(null)},n)}),o=t(e,{cache:`no-store`,headers:{Accept:`application/json`},signal:r.signal}).then(async e=>e.ok?l(await e.json()):null).catch(()=>null);return await Promise.race([o,a])}catch{return null}finally{i!==void 0&&clearTimeout(i)}}function l(e){return!u(e)||!u(e.flags)||Object.values(e.flags).some(e=>typeof e!=`string`)?null:e.flags}function u(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function d(e,t){return s(e,{workerBaseUrl:f(t),storage:t.storage})}function f(e){let i=p(e.storage),a=t(e.envBaseUrl??null);if(i)return i;if(a)return a;if(!e.isDev)try{let t=new URL(e.locationHref);if(t.protocol===`http:`||t.protocol===`https:`)return t.origin}catch{}return e.isDev?n:r}function p(e){try{return t(e?.getItem(`slicc.trayWorkerBaseUrl`)??null)}catch{return null}}export{d as refreshFeatureFlagsForPage};
@@ -1,2 +1,2 @@
1
1
  const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/extension-bridge-transport-D3PItLFo.js","assets/logger-DDBAeTLF.js","assets/pending-request-table-Dgn6qYdL.js","assets/lick-ws-bridge-yklVm5en.js","assets/logger-BoSvu4mW.js","assets/tray-leader-iVJTGwuf.js","assets/rolldown-runtime-Dd_uD5pT.js","assets/proxied-fetch-BGeNrvQ4.js","assets/preload-helper-Czpn1I53.js","assets/base64-DpPqYZJF.js","assets/src-CAWTvdAa.js","assets/runtime-env-Dlaokqg1.js","assets/fetch-body-D2PwksUW.js","assets/api-endpoint-GRCyib6X.js","assets/runtime-env-CgsZ7LTp.js","assets/runtime-env-E-i2SW1s.js","assets/tray-runtime-config-D7cmCcHJ.js","assets/messages-BD4p8GuF.js","assets/db-cKsBsMMN.js","assets/cdp-BAGGi_P9.js","assets/navigation-watcher-CcKsLKw9.js","assets/handoff-link-BM4ctkE8.js","assets/remote-cdp-transport-CgOXLjZ8.js","assets/tray-sync-protocol-BZ5yhJH9.js","assets/main-cherry-L2scWl6W.js","assets/synthetic-cdp-transport-Ds83IPjw.js"])))=>i.map(i=>d[i]);
2
- import{t as e}from"./preload-helper-Czpn1I53.js";import{t}from"./logger-DDBAeTLF.js";import{c as n,o as r,s as i}from"./src-CAWTvdAa.js";import"./proxied-fetch-BGeNrvQ4.js";import{t as a}from"./runtime-env-Dlaokqg1.js";import{a as o,o as s,s as c}from"./api-endpoint-GRCyib6X.js";import"./runtime-env-CgsZ7LTp.js";import"./messages-BD4p8GuF.js";import{d as l,s as u,t as d,u as f}from"./tray-runtime-config-D7cmCcHJ.js";import{t as p}from"./setup-sudo-Cmvdok4C.js";var m=`role`;function h(e){try{let t=new URL(e);return`${t.protocol===`wss:`?`https:`:`http:`}//${t.host}`}catch{return null}}function g(e){try{let t=new URL(e);return`${t.protocol}//${t.host}/licks-ws`}catch{return null}}function _(e){let t;try{t=new URLSearchParams(e)}catch{return null}let a=t.get(n),o=t.get(i);if(!a||!o||!/^wss?:\/\//.test(a))return null;let s=t.get(m),c=s===`leader`||s===`follower`?s:null;return{url:a,subprotocol:`${r}${o}`,token:o,apiBaseUrl:h(a),lickWsUrl:g(a),role:c}}function v(e,t,n){if(t){try{if(new URL(e).searchParams.has(`detached`))return`extension-detached`}catch{}return`extension`}try{let t=new URL(e);if(t.searchParams.get(`connect`)===`1`)return`connect`;if(t.searchParams.get(`runtime`)===`hosted-leader`)return`hosted-leader`;if(t.searchParams.get(`cherry`)===`1`)return`cherry`;let r=n===void 0?typeof window<`u`?window.localStorage:null:n;return f(e,r)?`follower`:b(t)?`electron-overlay`:`standalone`}catch{return`standalone`}}function y(e,t){return e===`electron-overlay`||e===`hosted-leader`||e===`standalone`&&t}function b(e){return e.pathname===`/electron`||e.pathname===`/electron/`||e.searchParams.get(`runtime`)===`electron-overlay`}t(`stale-asset`);var x=`slicc-stale-asset-reload`;function S(e,t){if(typeof BroadcastChannel!=`function`)return()=>{};let n=new BroadcastChannel(x),r=n=>{let r=n.data;r?.type===`stale-asset-reload`&&r.instanceId===e&&t(r.replayTurn===!0)};return n.addEventListener(`message`,r),()=>{n.removeEventListener(`message`,r),n.close()}}var C=`slicc:stale-asset-reloaded-at`,w=6e4,T=`slicc:stale-asset-replay`;function E(e=window.sessionStorage){try{e.setItem(T,`1`)}catch{}}function D(e=window.sessionStorage){try{return e.getItem(T)===`1`&&(e.removeItem(T),!0)}catch{return!1}}function O(){return{reload:()=>window.location.reload(),storage:window.sessionStorage,now:()=>Date.now(),windowMs:w,storageKey:C}}function k(e,t,n){return e===null||t-e>=n}function A(e=O()){let t;try{t=e.storage.getItem(e.storageKey)}catch{return!1}let n=t===null?null:Number(t),r=n!==null&&Number.isFinite(n)?n:null,i=e.now();if(!k(r,i,e.windowMs))return!1;try{e.storage.setItem(e.storageKey,String(i))}catch{return!1}return e.reload(),!0}var j=null,M=null;function N(e){j||(M={...O(),...e},j=e=>{A(M)&&e.preventDefault()},window.addEventListener(`vite:preloadError`,j))}var P=null;function F(e){return P||(P=S(e,e=>{e&&E(),A(M??void 0)}),P)}var I=`slicc-cdp-superseded-banner`;function L(e){if(e.getElementById(I))return;let t=e.createElement(`div`);t.id=I,t.setAttribute(`role`,`alert`),t.textContent=`Another SLICC tab or window has taken control of this browser instance. Only one tab can drive the browser per instance — close the other tabs, then reload this page to resume.`,t.style.cssText=[`position:fixed`,`top:0`,`left:0`,`right:0`,`z-index:2147483647`,`padding:10px 16px`,`background:#b3261e`,`color:#fff`,`font:13px/1.4 system-ui,sans-serif`,`text-align:center`,`box-shadow:0 1px 4px rgba(0,0,0,0.3)`].join(`;`),e.body.appendChild(t)}function R(){return typeof crypto<`u`&&typeof crypto.randomUUID==`function`?crypto.randomUUID():`slicc-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,10)}`}function z(e){let t;try{t=new URLSearchParams(e)}catch{return null}if(t.get(`slicc`)!==`leader`)return null;let n=t.get(`ext`);return n?{extensionId:n}:null}var B=[100,200,400,800,1600];async function V(e,t,n,r=B,i=e=>new Promise(t=>setTimeout(t,e))){let a=r.length+1,o=null;for(let s=0;s<a;s++)try{await e.connect(t),s>0&&n.info(`CDP bridge connect succeeded after retry`,{attempt:s+1});return}catch(e){o=e,s<r.length&&await i(r[s]??0)}n.warn(`Initial CDP connect failed after retries; worker-forwarded commands will retry on demand`,o instanceof Error?o.message:String(o))}async function H(t,n,r){let{ExtensionBridgeTransport:i}=await e(async()=>{let{ExtensionBridgeTransport:e}=await import(`./extension-bridge-transport-D3PItLFo.js`);return{ExtensionBridgeTransport:e}},__vite__mapDeps([0,1,2])),{mapDiscoveryPayloadToLickEvent:a,mapNavigatePayloadToLickEvent:o}=await e(async()=>{let{mapDiscoveryPayloadToLickEvent:e,mapNavigatePayloadToLickEvent:t}=await import(`./lick-ws-bridge-yklVm5en.js`);return{mapDiscoveryPayloadToLickEvent:e,mapNavigatePayloadToLickEvent:t}},__vite__mapDeps([3,1,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18])),s=null,c=[],l=!1,u=e=>{s=e;for(let t of c)e.sendForwardedLick(t);c.length=0},d=e=>{if(e){if(s){s.sendForwardedLick(e);return}c.length>=50&&(c.shift(),l||(l=!0,r.warn(`extension-bridge lick buffer overflow (cap 50); dropping oldest pending licks until the kernel client attaches`))),c.push(e)}},f=new t(new i({extensionId:n,onLick:e=>{d(o(e))},onDiscovery:e=>{d(a(e))},onOpenSettings:()=>{globalThis.dispatchEvent(new CustomEvent(`slicc:open-settings-from-panel`))}}));return await V(f,void 0,r),{browser:f,attachLickForwardingClient:u}}async function U(t){let{runtimeMode:n,envBaseUrl:r,window:i,log:f}=t,m=n===`electron-overlay`;f.info(`setting up standalone page runtime (BrowserAPI + CDP)`,{runtimeMode:n});let{BrowserAPI:h}=await e(async()=>{let{BrowserAPI:e}=await import(`./cdp-BAGGi_P9.js`);return{BrowserAPI:e}},__vite__mapDeps([19,1,2,4,20,21,10,22,23]));await p({log:f});let g,v,b,x=null,S=null,C=null,w=null,T,E=n===`cherry`?null:z(i.location.search),D=!!E&&a(),O=n===`cherry`||D?null:_(i.location.search);O?.apiBaseUrl&&(x=O.apiBaseUrl,c(O.apiBaseUrl),S=O.token,o(O.token)),O?.lickWsUrl&&(C=O.lickWsUrl);let k=n===`cherry`||D||O!==null,A=await u(),j=y(n,A!==null)?d:null;if(await l({locationHref:i.location.href,storage:i.localStorage,envBaseUrl:r,defaultWorkerBaseUrl:j,runtimeConfigFetcher:async()=>A}),n===`cherry`){let{setupCherryFollower:t}=await e(async()=>{let{setupCherryFollower:e}=await import(`./main-cherry-L2scWl6W.js`);return{setupCherryFollower:e}},__vite__mapDeps([24,1,10,2,19,4,20,21,22,23,25])),n=await t();g=n.browser,v=n.joinUrl,b=n.transport}else if(E&&a()){f.info(`Routing CDP through the extension bridge (leader tab)`);let e=await H(h,E.extensionId,f);g=e.browser,T=e.attachLickForwardingClient,w=E.extensionId,s(E.extensionId)}else{g=new h,O&&f.info(`Routing CDP through local standalone bridge`,{url:O.url,role:O.role??`(unset)`});let e=O?{url:O.url,protocols:O.subprotocol}:void 0;O?.role===`follower`?(f.info(`Skipping CDP connect for follower overlay tab`),g.primeConnectOptions(e)):(await V(g,e,f),g.setCdpSupersededHandler(()=>L(i.document)))}let M=g.getTransport();return globalThis.__slicc_browser=g,{browser:g,realCdpTransport:M,hasLocalCdpSurface:k,cherryJoinUrl:v,cherryTransport:b,instanceId:R(),isElectronOverlay:m,localApiBaseUrl:x,bridgeToken:S,localLickWsUrl:C,extensionDelegateId:w,attachLickForwardingClient:T}}export{F as a,_ as c,A as i,U as n,N as o,D as r,v as s,z as t};
2
+ import{t as e}from"./preload-helper-Czpn1I53.js";import{t}from"./logger-DDBAeTLF.js";import{c as n,o as r,s as i}from"./src-CAWTvdAa.js";import"./proxied-fetch-BGeNrvQ4.js";import{t as a}from"./runtime-env-Dlaokqg1.js";import{a as o,o as s,s as c}from"./api-endpoint-GRCyib6X.js";import"./runtime-env-CgsZ7LTp.js";import"./messages-BD4p8GuF.js";import{d as l,s as u,t as d,u as f}from"./tray-runtime-config-D7cmCcHJ.js";import{t as p}from"./setup-sudo-Cxr4tHkv.js";var m=`role`;function h(e){try{let t=new URL(e);return`${t.protocol===`wss:`?`https:`:`http:`}//${t.host}`}catch{return null}}function g(e){try{let t=new URL(e);return`${t.protocol}//${t.host}/licks-ws`}catch{return null}}function _(e){let t;try{t=new URLSearchParams(e)}catch{return null}let a=t.get(n),o=t.get(i);if(!a||!o||!/^wss?:\/\//.test(a))return null;let s=t.get(m),c=s===`leader`||s===`follower`?s:null;return{url:a,subprotocol:`${r}${o}`,token:o,apiBaseUrl:h(a),lickWsUrl:g(a),role:c}}function v(e,t,n){if(t){try{if(new URL(e).searchParams.has(`detached`))return`extension-detached`}catch{}return`extension`}try{let t=new URL(e);if(t.searchParams.get(`connect`)===`1`)return`connect`;if(t.searchParams.get(`runtime`)===`hosted-leader`)return`hosted-leader`;if(t.searchParams.get(`cherry`)===`1`)return`cherry`;let r=n===void 0?typeof window<`u`?window.localStorage:null:n;return f(e,r)?`follower`:b(t)?`electron-overlay`:`standalone`}catch{return`standalone`}}function y(e,t){return e===`electron-overlay`||e===`hosted-leader`||e===`standalone`&&t}function b(e){return e.pathname===`/electron`||e.pathname===`/electron/`||e.searchParams.get(`runtime`)===`electron-overlay`}t(`stale-asset`);var x=`slicc-stale-asset-reload`;function S(e,t){if(typeof BroadcastChannel!=`function`)return()=>{};let n=new BroadcastChannel(x),r=n=>{let r=n.data;r?.type===`stale-asset-reload`&&r.instanceId===e&&t(r.replayTurn===!0)};return n.addEventListener(`message`,r),()=>{n.removeEventListener(`message`,r),n.close()}}var C=`slicc:stale-asset-reloaded-at`,w=6e4,T=`slicc:stale-asset-replay`;function E(e=window.sessionStorage){try{e.setItem(T,`1`)}catch{}}function D(e=window.sessionStorage){try{return e.getItem(T)===`1`&&(e.removeItem(T),!0)}catch{return!1}}function O(){return{reload:()=>window.location.reload(),storage:window.sessionStorage,now:()=>Date.now(),windowMs:w,storageKey:C}}function k(e,t,n){return e===null||t-e>=n}function A(e=O()){let t;try{t=e.storage.getItem(e.storageKey)}catch{return!1}let n=t===null?null:Number(t),r=n!==null&&Number.isFinite(n)?n:null,i=e.now();if(!k(r,i,e.windowMs))return!1;try{e.storage.setItem(e.storageKey,String(i))}catch{return!1}return e.reload(),!0}var j=null,M=null;function N(e){j||(M={...O(),...e},j=e=>{A(M)&&e.preventDefault()},window.addEventListener(`vite:preloadError`,j))}var P=null;function F(e){return P||(P=S(e,e=>{e&&E(),A(M??void 0)}),P)}var I=`slicc-cdp-superseded-banner`;function L(e){if(e.getElementById(I))return;let t=e.createElement(`div`);t.id=I,t.setAttribute(`role`,`alert`),t.textContent=`Another SLICC tab or window has taken control of this browser instance. Only one tab can drive the browser per instance — close the other tabs, then reload this page to resume.`,t.style.cssText=[`position:fixed`,`top:0`,`left:0`,`right:0`,`z-index:2147483647`,`padding:10px 16px`,`background:#b3261e`,`color:#fff`,`font:13px/1.4 system-ui,sans-serif`,`text-align:center`,`box-shadow:0 1px 4px rgba(0,0,0,0.3)`].join(`;`),e.body.appendChild(t)}function R(){return typeof crypto<`u`&&typeof crypto.randomUUID==`function`?crypto.randomUUID():`slicc-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,10)}`}function z(e){let t;try{t=new URLSearchParams(e)}catch{return null}if(t.get(`slicc`)!==`leader`)return null;let n=t.get(`ext`);return n?{extensionId:n}:null}var B=[100,200,400,800,1600];async function V(e,t,n,r=B,i=e=>new Promise(t=>setTimeout(t,e))){let a=r.length+1,o=null;for(let s=0;s<a;s++)try{await e.connect(t),s>0&&n.info(`CDP bridge connect succeeded after retry`,{attempt:s+1});return}catch(e){o=e,s<r.length&&await i(r[s]??0)}n.warn(`Initial CDP connect failed after retries; worker-forwarded commands will retry on demand`,o instanceof Error?o.message:String(o))}async function H(t,n,r){let{ExtensionBridgeTransport:i}=await e(async()=>{let{ExtensionBridgeTransport:e}=await import(`./extension-bridge-transport-D3PItLFo.js`);return{ExtensionBridgeTransport:e}},__vite__mapDeps([0,1,2])),{mapDiscoveryPayloadToLickEvent:a,mapNavigatePayloadToLickEvent:o}=await e(async()=>{let{mapDiscoveryPayloadToLickEvent:e,mapNavigatePayloadToLickEvent:t}=await import(`./lick-ws-bridge-yklVm5en.js`);return{mapDiscoveryPayloadToLickEvent:e,mapNavigatePayloadToLickEvent:t}},__vite__mapDeps([3,1,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18])),s=null,c=[],l=!1,u=e=>{s=e;for(let t of c)e.sendForwardedLick(t);c.length=0},d=e=>{if(e){if(s){s.sendForwardedLick(e);return}c.length>=50&&(c.shift(),l||(l=!0,r.warn(`extension-bridge lick buffer overflow (cap 50); dropping oldest pending licks until the kernel client attaches`))),c.push(e)}},f=new t(new i({extensionId:n,onLick:e=>{d(o(e))},onDiscovery:e=>{d(a(e))},onOpenSettings:()=>{globalThis.dispatchEvent(new CustomEvent(`slicc:open-settings-from-panel`))}}));return await V(f,void 0,r),{browser:f,attachLickForwardingClient:u}}async function U(t){let{runtimeMode:n,envBaseUrl:r,window:i,log:f}=t,m=n===`electron-overlay`;f.info(`setting up standalone page runtime (BrowserAPI + CDP)`,{runtimeMode:n});let{BrowserAPI:h}=await e(async()=>{let{BrowserAPI:e}=await import(`./cdp-BAGGi_P9.js`);return{BrowserAPI:e}},__vite__mapDeps([19,1,2,4,20,21,10,22,23]));await p({log:f});let g,v,b,x=null,S=null,C=null,w=null,T,E=n===`cherry`?null:z(i.location.search),D=!!E&&a(),O=n===`cherry`||D?null:_(i.location.search);O?.apiBaseUrl&&(x=O.apiBaseUrl,c(O.apiBaseUrl),S=O.token,o(O.token)),O?.lickWsUrl&&(C=O.lickWsUrl);let k=n===`cherry`||D||O!==null,A=await u(),j=y(n,A!==null)?d:null;if(await l({locationHref:i.location.href,storage:i.localStorage,envBaseUrl:r,defaultWorkerBaseUrl:j,runtimeConfigFetcher:async()=>A}),n===`cherry`){let{setupCherryFollower:t}=await e(async()=>{let{setupCherryFollower:e}=await import(`./main-cherry-L2scWl6W.js`);return{setupCherryFollower:e}},__vite__mapDeps([24,1,10,2,19,4,20,21,22,23,25])),n=await t();g=n.browser,v=n.joinUrl,b=n.transport}else if(E&&a()){f.info(`Routing CDP through the extension bridge (leader tab)`);let e=await H(h,E.extensionId,f);g=e.browser,T=e.attachLickForwardingClient,w=E.extensionId,s(E.extensionId)}else{g=new h,O&&f.info(`Routing CDP through local standalone bridge`,{url:O.url,role:O.role??`(unset)`});let e=O?{url:O.url,protocols:O.subprotocol}:void 0;O?.role===`follower`?(f.info(`Skipping CDP connect for follower overlay tab`),g.primeConnectOptions(e)):(await V(g,e,f),g.setCdpSupersededHandler(()=>L(i.document)))}let M=g.getTransport();return globalThis.__slicc_browser=g,{browser:g,realCdpTransport:M,hasLocalCdpSurface:k,cherryJoinUrl:v,cherryTransport:b,instanceId:R(),isElectronOverlay:m,localApiBaseUrl:x,bridgeToken:S,localLickWsUrl:C,extensionDelegateId:w,attachLickForwardingClient:T}}export{F as a,_ as c,A as i,U as n,N as o,D as r,v as s,z as t};
@@ -1,2 +1,2 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/sudo-C-t_3cqC.js","assets/preload-helper-Czpn1I53.js","assets/logger-DDBAeTLF.js","assets/proxied-fetch-BGeNrvQ4.js","assets/rolldown-runtime-Dd_uD5pT.js","assets/base64-DpPqYZJF.js","assets/src-CAWTvdAa.js","assets/runtime-env-Dlaokqg1.js","assets/fetch-body-D2PwksUW.js","assets/api-endpoint-GRCyib6X.js","assets/runtime-env-CgsZ7LTp.js","assets/runtime-env-E-i2SW1s.js","assets/quick-llm-DK8AEQp1.js","assets/account-store-DPoyiqT_.js","assets/claude-model-version-DoVrYsKi.js","assets/models-BSkXF4T6.js","assets/diagnostics-DN_idNHx.js","assets/provider-env-CTOcDKrQ.js","assets/__vite-browser-external-5eBdwsFd.js","assets/openrouter.models-gbjkpjE_.js","assets/libesm-BI4UHVqp.js","assets/float-topology-DiK91BlA.js","assets/secret-topology-0AWfFTh5.js","assets/secrets-bridge-client-DCQ44RyR.js","assets/port-bridge-client-BhmNRlRv.js","assets/image-markers-BXtVm4og.js","assets/tool-ui-DfXu6quJ.js","assets/providers-DTOmtX1T.js","assets/panel-rpc-B3MSVImO.js","assets/bedrock-camp-compat-CgBMwna8.js","assets/llm-session-id-bZQs6gBN.js","assets/icons-ZLR7gmJ4.js","assets/page-approval-service-BsXoPdFJ.js"])))=>i.map(i=>d[i]);
2
- import{n as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./preload-helper-Czpn1I53.js";var n=e({setupSudoExtension:()=>i,setupSudoStandalone:()=>r});async function r(e){let{installSudoTestHook:n}=await t(async()=>{let{installSudoTestHook:e}=await import(`./sudo-C-t_3cqC.js`);return{installSudoTestHook:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32]));n()}async function i(e){let{installPanelSudoResponder:n}=await t(async()=>{let{installPanelSudoResponder:e}=await import(`./sudo-C-t_3cqC.js`);return{installPanelSudoResponder:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32]));n()}export{n,r as t};
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/sudo-CbS1q1Rs.js","assets/preload-helper-Czpn1I53.js","assets/logger-DDBAeTLF.js","assets/proxied-fetch-BGeNrvQ4.js","assets/rolldown-runtime-Dd_uD5pT.js","assets/base64-DpPqYZJF.js","assets/src-CAWTvdAa.js","assets/runtime-env-Dlaokqg1.js","assets/fetch-body-D2PwksUW.js","assets/api-endpoint-GRCyib6X.js","assets/runtime-env-CgsZ7LTp.js","assets/runtime-env-E-i2SW1s.js","assets/quick-llm-CJNPn8Zb.js","assets/account-store-DVhMCA9p.js","assets/claude-model-version-DoVrYsKi.js","assets/models-BSkXF4T6.js","assets/diagnostics-DN_idNHx.js","assets/provider-env-CTOcDKrQ.js","assets/__vite-browser-external-5eBdwsFd.js","assets/openrouter.models-gbjkpjE_.js","assets/libesm-BI4UHVqp.js","assets/float-topology-DiK91BlA.js","assets/secret-topology-0AWfFTh5.js","assets/secrets-bridge-client-DCQ44RyR.js","assets/port-bridge-client-BhmNRlRv.js","assets/image-markers-BXtVm4og.js","assets/tool-ui-DfXu6quJ.js","assets/providers-Gkrm8AED.js","assets/panel-rpc-B3MSVImO.js","assets/bedrock-camp-compat-CgBMwna8.js","assets/llm-session-id-bZQs6gBN.js","assets/icons-ZLR7gmJ4.js","assets/page-approval-service-BsXoPdFJ.js"])))=>i.map(i=>d[i]);
2
+ import{n as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./preload-helper-Czpn1I53.js";var n=e({setupSudoExtension:()=>i,setupSudoStandalone:()=>r});async function r(e){let{installSudoTestHook:n}=await t(async()=>{let{installSudoTestHook:e}=await import(`./sudo-CbS1q1Rs.js`);return{installSudoTestHook:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32]));n()}async function i(e){let{installPanelSudoResponder:n}=await t(async()=>{let{installPanelSudoResponder:e}=await import(`./sudo-CbS1q1Rs.js`);return{installPanelSudoResponder:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32]));n()}export{n,r as t};
@@ -0,0 +1 @@
1
+ import{n as e}from"./rolldown-runtime-Dd_uD5pT.js";function t(e,t){return e===t||e.startsWith(t===`/`?`/`:`${t}/`)}var n=`/.metadata.json`;function r(e){return e.entries&&delete e.entries[n],e}function i(e,n,i){let a=n.entries??{},o={...e.entries??{}};`/`in a&&(o[`/`]=a[`/`]);for(let e of i.paths)e in a?o[e]=a[e]:delete o[e];for(let e of i.prefixes){for(let n of Object.keys(o))t(n,e)&&delete o[n];for(let n of Object.keys(a))t(n,e)&&(o[n]=a[n])}let{entries:s,...c}=n;return r({...c,entries:o})}var a=e({makeOpfsProbe:()=>m,repairOpfsMetadataSidecar:()=>g,repairSidecarDocument:()=>u,resolveWithSidecarRepair:()=>h}),o=61440,s=16384,c=32768,l=40960;async function u(e,t,n){let r={kindFixed:[],sizesFixed:0,dropped:0,selfEntryDropped:!1,inosReassigned:0,nlinksFixed:0,changed:!1},i=e.entries??{};for(let[e,a]of Object.entries(i)){if(n?.(),e===`/`||typeof a!=`object`||!a)continue;if(e===`/.metadata.json`){delete i[e],r.selfEntryDropped=!0,r.changed=!0;continue}let s=a,c=(s.mode??0)&o;if(c===l){f(s,r);continue}let u=await t(e);if(u.kind===`missing`){delete i[e],r.dropped+=1,r.changed=!0;continue}f(s,r),p(e,s,c,u,r)}return d(i,r),r}function d(e,t){let n=0;for(let t of Object.values(e)){let e=t;typeof e?.ino==`number`&&(n=Math.max(n,e.ino)),typeof e?.data==`number`&&(n=Math.max(n,e.data))}let r=n+1,i=new Set;for(let[n,a]of Object.entries(e)){if(typeof a!=`object`||!a)continue;let e=a;if(n===`/`){typeof e.ino==`number`&&i.add(e.ino);continue}let o=e.ino;if(typeof o==`number`&&o!==0&&!i.has(o)){i.add(o);continue}e.ino=r,e.data=r+1,i.add(r),r+=2,t.inosReassigned+=1,t.changed=!0}}function f(e,t){e.nlink||(e.nlink=1,t.nlinksFixed+=1,t.changed=!0)}function p(e,t,n,r,i){if(n===c&&r.kind===`directory`){t.mode=((t.mode??0)&511||493)|s,i.kindFixed.push(`${e} file→dir`),i.changed=!0;return}if(n===s&&r.kind===`file`){t.mode=((t.mode??0)&511||420)|c,t.size=r.size,i.kindFixed.push(`${e} dir→file`),i.changed=!0;return}n===c&&r.kind===`file`&&typeof t.size==`number`&&t.size!==r.size&&(t.size=r.size,i.sizesFixed+=1,i.changed=!0)}function m(e){return async t=>{let n=t.split(`/`).filter(Boolean),r=e;for(let e=0;e<n.length-1;e+=1)try{r=await r.getDirectoryHandle(n[e])}catch{return{kind:`missing`}}let i=n[n.length-1];if(i===void 0)return{kind:`directory`};try{return{kind:`file`,size:(await(await r.getFileHandle(i)).getFile()).size}}catch{}try{return await r.getDirectoryHandle(i),{kind:`directory`}}catch{return{kind:`missing`}}}}async function h(e,t,n){try{return await e()}catch(r){let i=null;try{i=await t()}catch{}if(!i?.changed)throw r;return n(i),await e()}}async function g(e,t){let n;try{let t=await e.getFileHandle(`.metadata.json`),r=JSON.parse(await(await t.getFile()).text());if(!r||typeof r!=`object`||!r.entries)return null;n=r}catch{return null}let r=await u(n,m(e),t);if(!r.changed)return r;let i=await(await e.getFileHandle(`.metadata.json`,{create:!0})).createWritable();return await i.write(JSON.stringify(n)),await i.close(),r}export{r as i,a as n,i as r,m as t};
@@ -0,0 +1 @@
1
+ import{n as e}from"./rolldown-runtime-Dd_uD5pT.js";function t(e,t){return e===t||e.startsWith(t===`/`?`/`:`${t}/`)}function n(e){return e.entries&&delete e.entries[`/.metadata.json`],e}function r(e,r,i){let a=r.entries??{},o={...e.entries??{}};`/`in a&&(o[`/`]=a[`/`]);for(let e of i.paths)e in a?o[e]=a[e]:delete o[e];for(let e of i.prefixes){for(let n of Object.keys(o))t(n,e)&&delete o[n];for(let n of Object.keys(a))t(n,e)&&(o[n]=a[n])}let{entries:s,...c}=r;return n({...c,entries:o})}var i=e({makeOpfsProbe:()=>d,repairOpfsMetadataSidecar:()=>p,repairSidecarDocument:()=>s,resolveWithSidecarRepair:()=>f});const a=16384,o=32768;async function s(e,t,n){let r={kindFixed:[],sizesFixed:0,dropped:0,selfEntryDropped:!1,inosReassigned:0,nlinksFixed:0,changed:!1},i=e.entries??{};for(let[e,a]of Object.entries(i)){if(n?.(),e===`/`||typeof a!=`object`||!a)continue;if(e===`/.metadata.json`){delete i[e],r.selfEntryDropped=!0,r.changed=!0;continue}let o=a,s=(o.mode??0)&61440;if(s===40960){l(o,r);continue}let c=await t(e);if(c.kind===`missing`){delete i[e],r.dropped+=1,r.changed=!0;continue}l(o,r),u(e,o,s,c,r)}return c(i,r),r}function c(e,t){let n=0;for(let t of Object.values(e)){let e=t;typeof e?.ino==`number`&&(n=Math.max(n,e.ino)),typeof e?.data==`number`&&(n=Math.max(n,e.data))}let r=n+1,i=new Set;for(let[n,a]of Object.entries(e)){if(typeof a!=`object`||!a)continue;let e=a;if(n===`/`){typeof e.ino==`number`&&i.add(e.ino);continue}let o=e.ino;if(typeof o==`number`&&o!==0&&!i.has(o)){i.add(o);continue}e.ino=r,e.data=r+1,i.add(r),r+=2,t.inosReassigned+=1,t.changed=!0}}function l(e,t){e.nlink||(e.nlink=1,t.nlinksFixed+=1,t.changed=!0)}function u(e,t,n,r,i){if(n===o&&r.kind===`directory`){t.mode=((t.mode??0)&511||493)|a,i.kindFixed.push(`${e} file→dir`),i.changed=!0;return}if(n===a&&r.kind===`file`){t.mode=((t.mode??0)&511||420)|o,t.size=r.size,i.kindFixed.push(`${e} dir→file`),i.changed=!0;return}n===o&&r.kind===`file`&&typeof t.size==`number`&&t.size!==r.size&&(t.size=r.size,i.sizesFixed+=1,i.changed=!0)}function d(e){return async t=>{let n=t.split(`/`).filter(Boolean),r=e;for(let e=0;e<n.length-1;e+=1)try{r=await r.getDirectoryHandle(n[e])}catch{return{kind:`missing`}}let i=n[n.length-1];if(i===void 0)return{kind:`directory`};try{return{kind:`file`,size:(await(await r.getFileHandle(i)).getFile()).size}}catch{}try{return await r.getDirectoryHandle(i),{kind:`directory`}}catch{return{kind:`missing`}}}}async function f(e,t,n){try{return await e()}catch(r){let i=null;try{i=await t()}catch{}if(!i?.changed)throw r;return n(i),await e()}}async function p(e,t){let n;try{let t=await e.getFileHandle(`.metadata.json`),r=JSON.parse(await(await t.getFile()).text());if(!r||typeof r!=`object`||!r.entries)return null;n=r}catch{return null}let r=await s(n,d(e),t);if(!r.changed)return r;let i=await(await e.getFileHandle(`.metadata.json`,{create:!0})).createWritable();return await i.write(JSON.stringify(n)),await i.close(),r}export{n as i,i as n,r,d as t};
@@ -1,4 +1,4 @@
1
- import{n as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./logger-LESFN7Hj.js";import{n,r}from"./path-utils-DNJG-zQf.js";import{t as i}from"./types-idfTVsM8.js";import{i as a}from"./fs-BD_cJfSO.js";const o=t(`sudo:sudoers`),s=`/etc/sudoers`,c=`/etc/sudoers.d`,l=/^\/scoops\/[^/]+\/etc\/sudoers$/;function u(e){return`/scoops/${e}/etc/sudoers`}function d(e,t){return e===`no-match`?t===`require-approval`?`require-approval`:`no-match`:e}function f(){return{cmnd:[],read:[],write:[],export:[]}}function p(e){return`.+^$()[]|\\{}`.includes(e)?`\\${e}`:e}function m(e){let t=``,n=0;for(;n<e.length;){let r=e[n];r===`*`?(t+=`.*`,n+=e[n+1]===`*`?2:1):r===`?`?(t+=`.`,n+=1):(t+=p(r),n+=1)}return RegExp(`^${t}$`,`s`)}function h(e){return e.split(/\r?\n/,1)[0]?.trim()??``}const g=new Set([`Cmnd`,`Read`,`Write`,`Export`]);function _(e){switch(e){case`read`:return`Read`;case`write`:return`Write`;case`export`:return`Export`;default:return`Cmnd`}}function v(e){let t=e.trim(),n=!1,r=t.search(/\s/);(r===-1?t:t.slice(0,r))===`NOPASSWD`&&(n=!0,t=r===-1?``:t.slice(r).trimStart());let i=t.search(/\s/),a=i===-1?t:t.slice(0,i);if(!g.has(a))return null;let o=i===-1?``:t.slice(i).trim();return o?{directive:a,nopasswd:n,pattern:o}:null}function y(e){let t=f();try{if(typeof e!=`string`)return t;for(let n of e.split(`
1
+ import{n as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./logger-LESFN7Hj.js";import{n,r}from"./path-utils-DNJG-zQf.js";import{t as i}from"./types-idfTVsM8.js";import{i as a}from"./fs-5vJy5IQB.js";const o=t(`sudo:sudoers`),s=`/etc/sudoers`,c=`/etc/sudoers.d`,l=/^\/scoops\/[^/]+\/etc\/sudoers$/;function u(e){return`/scoops/${e}/etc/sudoers`}function d(e,t){return e===`no-match`?t===`require-approval`?`require-approval`:`no-match`:e}function f(){return{cmnd:[],read:[],write:[],export:[]}}function p(e){return`.+^$()[]|\\{}`.includes(e)?`\\${e}`:e}function m(e){let t=``,n=0;for(;n<e.length;){let r=e[n];r===`*`?(t+=`.*`,n+=e[n+1]===`*`?2:1):r===`?`?(t+=`.`,n+=1):(t+=p(r),n+=1)}return RegExp(`^${t}$`,`s`)}function h(e){return e.split(/\r?\n/,1)[0]?.trim()??``}const g=new Set([`Cmnd`,`Read`,`Write`,`Export`]);function _(e){switch(e){case`read`:return`Read`;case`write`:return`Write`;case`export`:return`Export`;default:return`Cmnd`}}function v(e){let t=e.trim(),n=!1,r=t.search(/\s/);(r===-1?t:t.slice(0,r))===`NOPASSWD`&&(n=!0,t=r===-1?``:t.slice(r).trimStart());let i=t.search(/\s/),a=i===-1?t:t.slice(0,i);if(!g.has(a))return null;let o=i===-1?``:t.slice(i).trim();return o?{directive:a,nopasswd:n,pattern:o}:null}function y(e){let t=f();try{if(typeof e!=`string`)return t;for(let n of e.split(`
2
2
  `)){let e=n.trim();if(!e||e.startsWith(`#`))continue;let i=v(e);if(!i){o.warn(`Skipping unrecognized sudoers line`,{line:e});continue}let a=i.directive===`Cmnd`||i.directive===`Export`?m:r,s={pattern:i.pattern,nopasswd:i.nopasswd,regex:a(i.pattern)};i.directive===`Cmnd`?t.cmnd.push(s):i.directive===`Read`?t.read.push(s):i.directive===`Export`?t.export.push(s):t.write.push(s)}return t}catch(e){return o.error(`Failed to parse sudoers; falling back to self-protection only`,{err:e}),f()}}const ee=[`NOPASSWD Read /tmp`,`NOPASSWD Read /tmp/**`,`NOPASSWD Write /tmp`,`NOPASSWD Write /tmp/**`].join(`
3
3
  `);let b=null;function te(){return b??=y(ee),b}function x(...e){let t=f();for(let n of e)n&&(t.cmnd.push(...n.cmnd),t.read.push(...n.read),t.write.push(...n.write),t.export.push(...n.export??[]));return t}function S(e,t){let n=!1;for(let r of e)if(r.regex.test(t)){if(r.nopasswd)return`nopasswd-allow`;n=!0}return n?`require-approval`:`no-match`}function ne(e,t){return S(e.export??[],t)===`nopasswd-allow`?`nopasswd-allow`:`require-approval`}function re(e,t){return S(e.cmnd,t.trim())}function ie(e){return e===`/etc/sudoers`||e===`/etc/sudoers.d`||e.startsWith(`/etc/sudoers.d/`)||l.test(e)||e===`/etc/slicc/layouts`||e.startsWith(`/etc/slicc/layouts/`)}function C(e,t,r,i){let o=n(r);if(t===`write`){if(ie(o))return`require-approval`;if(i?.isContentWrite&&a(o))return`nopasswd-allow`}return S(t===`read`?e.read:e.write,o)}const w=t(`sudo:timeout`),T={"user-timeout":`no response from the user within 5 minutes. This is a TIMEOUT, not a denial — the user was not there to answer. Do not retry this action; report that the approval request went unanswered and wait for the user before trying again.`,"cone-timeout":`no response from the cone agent within 5 minutes. This is a TIMEOUT, not a denial — no human was ever prompted, the cone simply never resolved the request. Do not retry this action; report that the escalation went unanswered and continue with work that does not need it.`};function E(e){return T[e]}function D(e=`user-timeout`){return{decision:`deny`,reason:e}}function O(e,t){let n=t.decision===`deny`?t.reason:void 0;return n?`${e}: approval request timed out — ${E(n)}`:`${e}: approval denied`}function ae(e,t={}){let n=t.timeoutMs??3e5;if(!Number.isFinite(n)||n<=0)return e;let r=t.setTimer??((e,t)=>setTimeout(e,t)),i=t.clearTimer??(e=>clearTimeout(e));return{requestApproval(t,a){return new Promise(o=>{let s=new AbortController,c=()=>s.abort();a?.signal?.addEventListener(`abort`,c,{once:!0});let l=!1,u=e=>{l=!0,a?.signal?.removeEventListener(`abort`,c),o(e)},d=r(()=>{l||(w.warn(`sudo approval timed out — failing closed`,{kind:t.kind,detail:t.detail,timeoutMs:n}),s.abort(),u(D(`user-timeout`)))},n),f=e=>{if(l){w.warn(`sudo decision arrived after timeout — discarded`,{kind:t.kind,detail:t.detail,decision:e.decision});return}i(d),u(e)};e.requestApproval(t,{signal:s.signal}).then(f,e=>{w.warn(`sudo broker threw — denying`,{error:e instanceof Error?e.message:String(e)}),f({decision:`deny`})})})}}}const oe=t(`sudo:fs`),k=Symbol.for(`slicc.fs.monkeypatchUnsafe`),A=`${c}/granted`;function j(e){return O(`sudo`,e)}const M=[`readFile`,`readTextFile`,`readDir`,`exists`,`stat`],N=[`writeFile`],P=[`mkdir`,`rm`];async function F(e,t,n,a){let o=h(a);if(!o)return;let s=t(),l={pattern:o,nopasswd:!0,regex:r(o)};(n===`read`?s.read:s.write).push(l);let u=`NOPASSWD ${n===`read`?`Read`:`Write`} ${o}\n`;try{await e.mkdir(c,{recursive:!0});let t=``;try{t=await e.readFile(A,{encoding:`utf-8`})}catch(e){if(!(e instanceof i&&e.code===`ENOENT`))throw e}let n=t.length>0&&!t.endsWith(`
4
4
  `)?`
@@ -0,0 +1 @@
1
+ function e(){return{version:`6.96.0`,releasedAt:`2026-08-24T19:44:27Z`,buildId:`6.96.0-mt7na9k1`}}let t=null;function n(e){t=e}function r(){return t}export{e as n,n as r,r as t};
@@ -1,2 +1,2 @@
1
- import{n as e,r as t}from"./hid-device-registry-B2R-0rNt.js";import{a as n,i as r}from"./serial-port-registry-B3LG5UIy.js";import{C as i,D as a,E as o,S as s,_ as c,a as l,g as u,h as d,k as f,l as p,m,n as h,o as g,s as _,w as v,x as y,y as b}from"./usb-operations-Cgk-otz-.js";import{i as x,r as S}from"./usb-device-registry-CRsCisej.js";import{n as C}from"./shared-6HJLEwgI.js";var w=`slicc-sprinkle-routes`;function T(){try{let e=localStorage.getItem(w);return e?JSON.parse(e):{}}catch{return{}}}function E(e){return T()[e]}var D=`SLICCJSH`;function O(e){return e.length===0?`''`:`'${e.replace(/'/g,`'\\''`)}'`}function k(e,t){return`var REQ=${JSON.stringify({op:e,args:t})};var P=${JSON.stringify(D)};function emit(o){process.stdout.write(P+JSON.stringify(o));}try{var op=REQ.op,a=REQ.args||[],out;if(op==='fetch'){var r=await fetch(a[0],a[1]||undefined);var h={};r.headers.forEach(function(v,k){h[k]=v;});var u=new Uint8Array(await r.arrayBuffer());var bin="",C=0x8000;for(var i=0;i<u.length;i+=C){bin+=String.fromCharCode.apply(null,u.subarray(i,i+C));}out={ok:r.ok,status:r.status,statusText:r.statusText,url:r.url,headers:h,bodyBase64:btoa(bin)};}else if(op==='http'){var c=http.client(a[0]||{});var res=await c[a[1]](a[2],Object.assign({},a[3]||{},{raw:true}));out={status:res.status,headers:res.headers,body:res.body};}else if(op==='browser'){var m=a[0];if(typeof browser[m]!=="function")throw new Error("browser."+m+" is not available over the sprinkle bridge");out=await browser[m].apply(browser,a.slice(1));}else if(op==='spawn'){out=await exec.spawn(a[0]);}else if(op==='fetchToFile'){out=await fs.fetchToFile(a[0],a[1]);}else{throw new Error("unknown jsh op: "+op);}emit({ok:true,value:out});}catch(e){emit({ok:false,error:(e&&e.message)?e.message:String(e)});}`}function A(e,t){return`node -e ${O(k(e,t))}`}function j(e){let t=e.stdout.lastIndexOf(D);if(t===-1){let t=e.stderr.trim()||e.stdout.trim()||`exit code ${e.exitCode}`;throw Error(`jsh bridge: no result (${t})`)}let n;try{n=JSON.parse(e.stdout.slice(t+10))}catch{throw Error(`jsh bridge: malformed result`)}if(!n.ok)throw Error(n.error||`jsh bridge error`);return n.value}async function M(e,t,n){return j(await e(A(t,n)))}function N(e){let t=``,n=32768;for(let r=0;r<e.length;r+=n)t+=String.fromCharCode(...e.subarray(r,r+n));return btoa(t)}function P(e){let t=atob(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n}function F(e){if(e instanceof Uint8Array)return e;if(e instanceof ArrayBuffer)return new Uint8Array(e);if(ArrayBuffer.isView(e)){let t=e;return new Uint8Array(t.buffer,t.byteOffset,t.byteLength)}if(Array.isArray(e))return new Uint8Array(e);throw Error(`expected Uint8Array, ArrayBuffer, or number[]`)}var I=new Set([101,103,204,205,304]);function L(e){let t=P(e.bodyBase64),n=I.has(e.status)?null:t,r=new Headers(e.headers),i;try{return i=new Response(n,{status:e.status,statusText:e.statusText,headers:r}),Object.defineProperty(i,"url",{value:e.url,configurable:!0}),i}catch{i=new Response(n,{headers:r});let t=e.status>=200&&e.status<300;return Object.defineProperty(i,"status",{value:e.status,configurable:!0}),Object.defineProperty(i,"statusText",{value:e.statusText,configurable:!0}),Object.defineProperty(i,"ok",{value:t,configurable:!0}),Object.defineProperty(i,"url",{value:e.url,configurable:!0}),i}}function R(e){return e.length===0?`''`:`'${e.replace(/'/g,`'\\''`)}'`}var z=class{listeners=new Map;lickHandler;fs;closeHandler;minimizeHandler;stopConeHandler;attachImageHandler;captureScreenHandler;execHandler;hidSubs=new Map;iframePusher;constructor(e,t,n,r,i,a,o,s,c){this.fs=e,this.lickHandler=t,this.closeHandler=n,this.minimizeHandler=r,this.stopConeHandler=i,this.attachImageHandler=a,this.captureScreenHandler=o,this.execHandler=s,this.iframePusher=c}setIframePusher(e){this.iframePusher=e}async hidOp(n,r,i){let a=t();switch(r){case`list`:{let t=e();if(!t)throw Error(`WebHID is unavailable in this browser`);return u(a,t)}case`request`:{let t=e();if(!t)throw Error(`WebHID is unavailable in this browser`);return b(a,t,i[0]??[])}case`info`:return d(a,i[0]);case`open`:{let e=i[0];return await c(a,e),await this.attachHidInputReports(n,e),{ok:!0}}case`close`:{let e=i[0];return await this.detachHidInputReports(n,e),await m(a,e),{ok:!0}}case`sendReport`:{let e=i[0],t=i[1],n=F(i[2]),r=n.buffer.slice(n.byteOffset,n.byteOffset+n.byteLength);return await y(a,e,t,r),{ok:!0}}default:throw Error(`hid: unknown op '${r}'`)}}async serialOp(e,t,s){let c=n();switch(t){case`list`:{let e=r();if(!e)throw Error(`Web Serial is unavailable in this browser`);return o(c,e)}case`request`:{let e=r();if(!e)throw Error(`Web Serial is unavailable in this browser`);return f(c,e,s[0]??[])}case`info`:return v(c,s[0]);case`open`:{let e=s[0],t=s[1]??{baudRate:9600};return await a(c,e,t),{ok:!0}}case`close`:{let e=s[0];return await i(c,e),{ok:!0}}default:throw Error(`serial: unknown op '${t}'`)}}async usbOp(e,t,n){let r=x();switch(t){case`list`:{let e=S();if(!e)throw Error(`WebUSB is unavailable in this browser`);return g(r,e)}case`request`:{let e=S();if(!e)throw Error(`WebUSB is unavailable in this browser`);return p(r,e,n[0]??[])}case`info`:return l(r,n[0]);case`open`:return await _(r,n[0]),{ok:!0};case`close`:return await h(r,n[0]),{ok:!0};default:throw Error(`usb: unknown op '${t}'`)}}async deviceOp(e,t,n,r){if(t===`hid`)return this.hidOp(e,n,r);if(t===`serial`)return this.serialOp(e,n,r);if(t===`usb`)return this.usbOp(e,n,r);throw Error(`unknown device channel '${t}'`)}async attachHidInputReports(e,n){let r=this.hidSubs.get(e);if(r||(r=new Map,this.hidSubs.set(e,r)),r.has(n))return;let i=await s(t(),n,t=>{let r=t.bytes instanceof Uint8Array?t.bytes:new Uint8Array(t.bytes);this.deliverHidInputReport(e,{handle:n,reportId:t.reportId,data:r})});r.set(n,i)}async detachHidInputReports(e,t){let n=this.hidSubs.get(e);if(!n)return;let r=n.get(t);if(r){n.delete(t);try{await Promise.resolve(r())}catch{}}n.size===0&&this.hidSubs.delete(e)}deliverHidInputReport(e,t){let n=this.listeners.get(`${e}:hid:inputreport`);if(n)for(let e of n){let r=n;setTimeout(()=>{if(r.has(e))try{e(t)}catch{}},0)}try{this.iframePusher?.(e,`hid:inputreport`,t)}catch{}}async runExec(e){if(!this.execHandler)return{stdout:``,stderr:`exec: shell bridge not available
1
+ import{n as e,r as t}from"./hid-device-registry-B2R-0rNt.js";import{a as n,i as r}from"./serial-port-registry-CCqklAEr.js";import{C as i,D as a,E as o,S as s,_ as c,a as l,g as u,h as d,k as f,l as p,m,n as h,o as g,s as _,w as v,x as y,y as b}from"./usb-operations-BBXJ4GF8.js";import{i as x,r as S}from"./usb-device-registry-CRsCisej.js";import{n as C}from"./shared-6HJLEwgI.js";var w=`slicc-sprinkle-routes`;function T(){try{let e=localStorage.getItem(w);return e?JSON.parse(e):{}}catch{return{}}}function E(e){return T()[e]}var D=`SLICCJSH`;function O(e){return e.length===0?`''`:`'${e.replace(/'/g,`'\\''`)}'`}function k(e,t){return`var REQ=${JSON.stringify({op:e,args:t})};var P=${JSON.stringify(D)};function emit(o){process.stdout.write(P+JSON.stringify(o));}try{var op=REQ.op,a=REQ.args||[],out;if(op==='fetch'){var r=await fetch(a[0],a[1]||undefined);var h={};r.headers.forEach(function(v,k){h[k]=v;});var u=new Uint8Array(await r.arrayBuffer());var bin="",C=0x8000;for(var i=0;i<u.length;i+=C){bin+=String.fromCharCode.apply(null,u.subarray(i,i+C));}out={ok:r.ok,status:r.status,statusText:r.statusText,url:r.url,headers:h,bodyBase64:btoa(bin)};}else if(op==='http'){var c=http.client(a[0]||{});var res=await c[a[1]](a[2],Object.assign({},a[3]||{},{raw:true}));out={status:res.status,headers:res.headers,body:res.body};}else if(op==='browser'){var m=a[0];if(typeof browser[m]!=="function")throw new Error("browser."+m+" is not available over the sprinkle bridge");out=await browser[m].apply(browser,a.slice(1));}else if(op==='spawn'){out=await exec.spawn(a[0]);}else if(op==='fetchToFile'){out=await fs.fetchToFile(a[0],a[1]);}else{throw new Error("unknown jsh op: "+op);}emit({ok:true,value:out});}catch(e){emit({ok:false,error:(e&&e.message)?e.message:String(e)});}`}function A(e,t){return`node -e ${O(k(e,t))}`}function j(e){let t=e.stdout.lastIndexOf(D);if(t===-1){let t=e.stderr.trim()||e.stdout.trim()||`exit code ${e.exitCode}`;throw Error(`jsh bridge: no result (${t})`)}let n;try{n=JSON.parse(e.stdout.slice(t+10))}catch{throw Error(`jsh bridge: malformed result`)}if(!n.ok)throw Error(n.error||`jsh bridge error`);return n.value}async function M(e,t,n){return j(await e(A(t,n)))}function N(e){let t=``,n=32768;for(let r=0;r<e.length;r+=n)t+=String.fromCharCode(...e.subarray(r,r+n));return btoa(t)}function P(e){let t=atob(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n}function F(e){if(e instanceof Uint8Array)return e;if(e instanceof ArrayBuffer)return new Uint8Array(e);if(ArrayBuffer.isView(e)){let t=e;return new Uint8Array(t.buffer,t.byteOffset,t.byteLength)}if(Array.isArray(e))return new Uint8Array(e);throw Error(`expected Uint8Array, ArrayBuffer, or number[]`)}var I=new Set([101,103,204,205,304]);function L(e){let t=P(e.bodyBase64),n=I.has(e.status)?null:t,r=new Headers(e.headers),i;try{return i=new Response(n,{status:e.status,statusText:e.statusText,headers:r}),Object.defineProperty(i,"url",{value:e.url,configurable:!0}),i}catch{i=new Response(n,{headers:r});let t=e.status>=200&&e.status<300;return Object.defineProperty(i,"status",{value:e.status,configurable:!0}),Object.defineProperty(i,"statusText",{value:e.statusText,configurable:!0}),Object.defineProperty(i,"ok",{value:t,configurable:!0}),Object.defineProperty(i,"url",{value:e.url,configurable:!0}),i}}function R(e){return e.length===0?`''`:`'${e.replace(/'/g,`'\\''`)}'`}var z=class{listeners=new Map;lickHandler;fs;closeHandler;minimizeHandler;stopConeHandler;attachImageHandler;captureScreenHandler;execHandler;hidSubs=new Map;iframePusher;constructor(e,t,n,r,i,a,o,s,c){this.fs=e,this.lickHandler=t,this.closeHandler=n,this.minimizeHandler=r,this.stopConeHandler=i,this.attachImageHandler=a,this.captureScreenHandler=o,this.execHandler=s,this.iframePusher=c}setIframePusher(e){this.iframePusher=e}async hidOp(n,r,i){let a=t();switch(r){case`list`:{let t=e();if(!t)throw Error(`WebHID is unavailable in this browser`);return u(a,t)}case`request`:{let t=e();if(!t)throw Error(`WebHID is unavailable in this browser`);return b(a,t,i[0]??[])}case`info`:return d(a,i[0]);case`open`:{let e=i[0];return await c(a,e),await this.attachHidInputReports(n,e),{ok:!0}}case`close`:{let e=i[0];return await this.detachHidInputReports(n,e),await m(a,e),{ok:!0}}case`sendReport`:{let e=i[0],t=i[1],n=F(i[2]),r=n.buffer.slice(n.byteOffset,n.byteOffset+n.byteLength);return await y(a,e,t,r),{ok:!0}}default:throw Error(`hid: unknown op '${r}'`)}}async serialOp(e,t,s){let c=n();switch(t){case`list`:{let e=r();if(!e)throw Error(`Web Serial is unavailable in this browser`);return o(c,e)}case`request`:{let e=r();if(!e)throw Error(`Web Serial is unavailable in this browser`);return f(c,e,s[0]??[])}case`info`:return v(c,s[0]);case`open`:{let e=s[0],t=s[1]??{baudRate:9600};return await a(c,e,t),{ok:!0}}case`close`:{let e=s[0];return await i(c,e),{ok:!0}}default:throw Error(`serial: unknown op '${t}'`)}}async usbOp(e,t,n){let r=x();switch(t){case`list`:{let e=S();if(!e)throw Error(`WebUSB is unavailable in this browser`);return g(r,e)}case`request`:{let e=S();if(!e)throw Error(`WebUSB is unavailable in this browser`);return p(r,e,n[0]??[])}case`info`:return l(r,n[0]);case`open`:return await _(r,n[0]),{ok:!0};case`close`:return await h(r,n[0]),{ok:!0};default:throw Error(`usb: unknown op '${t}'`)}}async deviceOp(e,t,n,r){if(t===`hid`)return this.hidOp(e,n,r);if(t===`serial`)return this.serialOp(e,n,r);if(t===`usb`)return this.usbOp(e,n,r);throw Error(`unknown device channel '${t}'`)}async attachHidInputReports(e,n){let r=this.hidSubs.get(e);if(r||(r=new Map,this.hidSubs.set(e,r)),r.has(n))return;let i=await s(t(),n,t=>{let r=t.bytes instanceof Uint8Array?t.bytes:new Uint8Array(t.bytes);this.deliverHidInputReport(e,{handle:n,reportId:t.reportId,data:r})});r.set(n,i)}async detachHidInputReports(e,t){let n=this.hidSubs.get(e);if(!n)return;let r=n.get(t);if(r){n.delete(t);try{await Promise.resolve(r())}catch{}}n.size===0&&this.hidSubs.delete(e)}deliverHidInputReport(e,t){let n=this.listeners.get(`${e}:hid:inputreport`);if(n)for(let e of n){let r=n;setTimeout(()=>{if(r.has(e))try{e(t)}catch{}},0)}try{this.iframePusher?.(e,`hid:inputreport`,t)}catch{}}async runExec(e){if(!this.execHandler)return{stdout:``,stderr:`exec: shell bridge not available
2
2
  `,exitCode:127};try{return await this.execHandler(e)}catch(e){return{stdout:``,stderr:`exec: ${e instanceof Error?e.message:String(e)}\n`,exitCode:1}}}async jshDispatch(e,t){if(e===`readFileBinary`)return{base64:N(await this.fs.readFile(t[0],{encoding:`binary`}))};if(e===`writeFileBinary`)return await this.fs.writeFile(t[0],P(t[1])),!0;let n=await M(e=>this.runExec(e),e,t);return e===`fetch`?L(n):n}createLickHandler(e){return t=>{let n=typeof t==`string`?t:t.action,r=typeof t==`string`?void 0:t.data,i={type:`sprinkle`,sprinkleName:e,targetScoop:E(e),timestamp:new Date().toISOString(),body:{action:n,data:r}};this.lickHandler(i)}}createScreenshotHandler(e){return async t=>{if(!e)return``;let n=t?e.querySelector(t):e;if(!n)throw Error(`Element not found: `+(t||`container`));let r=n.getBoundingClientRect(),i=Math.ceil(r.width),a=Math.ceil(r.height);if(i===0||a===0)throw Error(`Element has zero dimensions`);let o=document.createElement(`canvas`),s=window.devicePixelRatio||1;o.width=i*s,o.height=a*s;let c=o.getContext(`2d`);c.scale(s,s);let l=n.cloneNode(!0),u=`<svg xmlns="http://www.w3.org/2000/svg" width="${i}" height="${a}"><foreignObject width="100%" height="100%">${new XMLSerializer().serializeToString(l)}</foreignObject></svg>`;return new Promise((e,t)=>{let n=new Image;n.onload=()=>{c.drawImage(n,0,0),e(o.toDataURL(`image/png`))},n.onerror=()=>t(Error(`Screenshot rendering failed`)),n.src=`data:image/svg+xml;charset=utf-8,`+encodeURIComponent(u)})}}createAgentHandler(){return async(e,t)=>{let n=t?.cwd??`.`,r=t?.allowedCommands??`*`,i=[`agent`];t?.model&&i.push(`--model`,R(t.model)),t?.thinking&&i.push(`--thinking`,R(t.thinking)),t?.readOnly&&i.push(`--read-only`,R(t.readOnly)),i.push(R(n),R(r),R(e));let a=await this.runExec(i.join(` `));return{stdout:a.stdout||a.stderr,exitCode:a.exitCode}}}createHidApi(e){return{list:()=>this.hidOp(e,`list`,[]),request:t=>this.hidOp(e,`request`,[t??[]]),open:async t=>{await this.hidOp(e,`open`,[t])},close:async t=>{await this.hidOp(e,`close`,[t])},sendReport:async(t,n,r)=>{await this.hidOp(e,`sendReport`,[t,n,r])},on:(t,n)=>{if(t!==`inputreport`)return;let r=`${e}:hid:inputreport`,i=this.listeners.get(r);i||(i=new Set,this.listeners.set(r,i)),i.add(n)},off:(t,n)=>{t===`inputreport`&&this.listeners.get(`${e}:hid:inputreport`)?.delete(n)}}}createSerialApi(e){return{list:()=>this.serialOp(e,`list`,[]),request:t=>this.serialOp(e,`request`,[t??[]]),open:async(t,n)=>{await this.serialOp(e,`open`,[t,n])},close:async t=>{await this.serialOp(e,`close`,[t])}}}createUsbApi(e){return{list:()=>this.usbOp(e,`list`,[]),request:t=>this.usbOp(e,`request`,[t??[]]),open:async t=>{await this.usbOp(e,`open`,[t])},close:async t=>{await this.usbOp(e,`close`,[t])}}}createHttpClient(e){let t=t=>(n,r)=>this.jshDispatch(`http`,[e,t,n,r??null]);return{get:t(`get`),post:t(`post`),put:t(`put`),patch:t(`patch`),delete:t(`delete`)}}createAPI(e){let t={name:e,lick:this.createLickHandler(e),on:(t,n)=>{let r=`${e}:${t}`,i=this.listeners.get(r);i||(i=new Set,this.listeners.set(r,i)),i.add(n)},off:(t,n)=>{let r=`${e}:${t}`;this.listeners.get(r)?.delete(n)},readFile:async e=>await this.fs.readFile(e,{encoding:`utf-8`}),writeFile:async(e,t)=>{await this.fs.writeFile(e,t)},readDir:async e=>(await this.fs.readDir(e)).map(e=>({name:e.name,type:e.type})),exists:async e=>this.fs.exists(e),stat:async e=>{let t=await this.fs.stat(e);return{type:t.type,size:t.size}},mkdir:async e=>{await this.fs.mkdir(e,{recursive:!0})},rm:async e=>{await this.fs.rm(e)},screenshot:e=>this.createScreenshotHandler(t._container)(e),setState:t=>{try{localStorage.setItem(`slicc-sprinkle-state:${e}`,JSON.stringify(t))}catch{}},getState:()=>{try{let t=localStorage.getItem(`slicc-sprinkle-state:${e}`);return t?JSON.parse(t):null}catch{return null}},open:e=>{let t=/^https?:|^chrome-extension:/.test(e)?e:C(e);window.open(t,`_blank`)},close:()=>this.closeHandler(e),minimize:()=>this.minimizeHandler(e),stopCone:()=>this.stopConeHandler(),attachImage:(e,t,n)=>this.attachImageHandler(e,t,n),captureScreen:()=>this.captureScreenHandler(),exec:Object.assign(e=>this.runExec(e),{spawn:e=>this.jshDispatch(`spawn`,[e])}),fetch:(e,t)=>this.jshDispatch(`fetch`,[e,t??null]),http:{client:e=>this.createHttpClient(e)},browser:{findTab:e=>this.jshDispatch(`browser`,[`findTab`,e]),ensureTab:(e,t)=>this.jshDispatch(`browser`,[`ensureTab`,e,t??{}]),eval:(e,t)=>this.jshDispatch(`browser`,[`eval`,e,t]),evalAsync:(e,t)=>this.jshDispatch(`browser`,[`evalAsync`,e,t]),cookie:(e,t)=>this.jshDispatch(`browser`,[`cookie`,e,t]),localStorage:(e,t)=>this.jshDispatch(`browser`,[`localStorage`,e,t]),fetch:(e,t,n)=>this.jshDispatch(`browser`,[`fetch`,e,t,n??{}])},hid:this.createHidApi(e),serial:this.createSerialApi(e),usb:this.createUsbApi(e),readFileBinary:async e=>P((await this.jshDispatch(`readFileBinary`,[e])).base64),writeFileBinary:async(e,t)=>{await this.jshDispatch(`writeFileBinary`,[e,N(t)])},fetchToFile:(e,t)=>this.jshDispatch(`fetchToFile`,[e,t]),_jsh:(e,t)=>this.jshDispatch(e,t),_device:(t,n,r)=>this.deviceOp(e,t,n,r),agent:this.createAgentHandler()};return t}pushUpdate(e,t){let n=`${e}:update`,r=this.listeners.get(n);if(r)for(let e of r){let n=r;setTimeout(()=>{if(n.has(e))try{e(t)}catch{}},0)}}removeSprinkle(e){for(let t of this.listeners.keys())t.startsWith(`${e}:`)&&this.listeners.delete(t);let t=this.hidSubs.get(e);if(t){for(let e of t.values())try{Promise.resolve(e()).catch(()=>{})}catch{}this.hidSubs.delete(e)}}};export{M as n,z as t};
@@ -1 +1 @@
1
- import{t as e}from"./logger-DDBAeTLF.js";import{s as t}from"./telemetry-BVzuNdvW.js";import{n,t as r}from"./panel-rpc-B3MSVImO.js";import{t as i}from"./sprinkle-renderer-D64E-W2o.js";import{t as a}from"./sprinkle-bridge-NSQIQ-9p.js";import"./sprinkle-instances-B8n7h-oP.js";var o=[`/shared/sprinkles`],s=new Set([`welcome`,`connect-llm`]);async function c(e){let t=new Map;for(let n of o)await e.exists(n)&&await l(e,n,t);return await l(e,`/`,t),t}async function l(e,t,n){for await(let r of e.walk(t)){if(!r.endsWith(`.shtml`))continue;let t=u(r);if(!s.has(t)&&!n.has(t)){let i;try{i=await e.readFile(r,{encoding:`utf-8`})??``}catch{i=``}n.set(t,{name:t,path:r,title:d(i,t),autoOpen:f(i),icon:p(i)})}}}function u(e){let t=e.split(`/`).pop()??e;return t.endsWith(`.shtml`)?t.slice(0,-6):t}function d(e,t){let n=e.match(/data-sprinkle-title=["']([^"']+)["']/);if(n)return n[1];let r=e.match(/<title>([^<]+)<\/title>/i);return r?r[1].trim():t}function f(e){return/data-sprinkle-autoopen\b/.test(e)}function p(e){let t=/<link\b/gi,n;for(;(n=t.exec(e))!==null;){let t=n.index+n[0].length,r=m(e,t);if(r<0)continue;let i=e.slice(t,r);if(!/\brel\s*=\s*("|')\s*(?:shortcut\s+)?icon\s*\1/i.test(i))continue;let a=h(i,`href`);if(a!==void 0)return a.trim()}let r=h(e,`data-sprinkle-icon`);if(r!==void 0)return r.trim()}function m(e,t){let n=!1,r=!1;for(let i=t;i<e.length;i++){let t=e.charCodeAt(i);if(n)t===34&&(n=!1);else if(r)t===39&&(r=!1);else if(t===34)n=!0;else if(t===39)r=!0;else if(t===62)return i}return-1}function h(e,t){let n=RegExp(`\\b${t}\\s*=\\s*(?:"([^"]*)"|'([^']*)')`,`i`),r=e.match(n);if(r)return r[1]??r[2]??void 0}var g=e(`sprinkle-manager`),_=`slicc-open-sprinkles`,v=`sprinkles`;function y(){try{if(typeof window>`u`||!window.location)return null;let e=new URLSearchParams(window.location.search).get(v);return e===null?null:e===``?[]:e.split(`,`).map(e=>e.trim()).filter(e=>e.length>0)}catch{return null}}function b(e){try{if(typeof window>`u`||!window.location||typeof history>`u`||typeof history.replaceState!=`function`)return;let t=new URL(window.location.href);e.length===0?t.searchParams.delete(v):t.searchParams.set(v,e.join(`,`));let n=t.pathname+t.search+t.hash;history.replaceState(history.state??null,``,n)}catch{}}var x=`slicc-known-sprinkles`;function S(e){try{let t=new Set(e),n=C().filter(e=>t.has(e));localStorage.setItem(x,JSON.stringify(n))}catch{}}function C(){try{let e=localStorage.getItem(x);if(!e)return[];let t=JSON.parse(e);return Array.isArray(t)?t.filter(e=>typeof e==`string`):[]}catch{return[]}}var w=`slicc-autoopened-once`,T=[`/workspace`,`/shared`,`/scoops`],E=250,D=class{fs;bridge;callbacks;availableSprinkles=new Map;watcherUnsub;openSprinkles=new Map;attentionOnly=new Set;inflightRefresh=null;lastRefreshAt=0;autoOpenBehavior;onSendToSprinkle;onSprinkleReloaded;registeredSprinkles=new Set;inlineSprinkles;changeListeners=new Set;changeNotifyScheduled=!1;urlWriteScheduled=!1;constructor(e,t,i,o,s={}){this.fs=e;let c=async()=>{let e=`image/png`,t=n(),i=r();if(!t&&!i)throw Error(`Screen capture unavailable in this environment`);if(t&&!navigator.mediaDevices?.getDisplayMedia)throw Error(`Screen capture not supported in this browser`);let a,o,s;if(t){let t=await navigator.mediaDevices.getDisplayMedia({video:!0,audio:!1});try{let n=document.createElement(`video`);n.srcObject=t,n.muted=!0,n.playsInline=!0,await new Promise((e,t)=>{n.onloadedmetadata=()=>n.play().then(()=>e()).catch(t),n.onerror=()=>t(Error(`Failed to load video stream`))}),await new Promise(e=>setTimeout(e,100)),o=n.videoWidth,s=n.videoHeight;let r=document.createElement(`canvas`);r.width=o,r.height=s;let i=r.getContext(`2d`);if(!i)throw Error(`Failed to get canvas context`);i.drawImage(n,0,0,o,s),a=await(await new Promise((t,n)=>{r.toBlob(e=>e?t(e):n(Error(`Failed to create image blob`)),e,1)})).arrayBuffer()}finally{for(let e of t.getTracks())e.stop()}}else{let t=await i.call(`screencapture`,{mimeType:e,quality:1},{timeoutMs:3e5});a=t.bytes,o=t.width,s=t.height}let c=new Uint8Array(a),l=[],u=8192;for(let e=0;e<c.length;e+=u)l.push(String.fromCharCode(...c.subarray(e,e+u)));return{base64:btoa(l.join(``)),width:o,height:s,mimeType:e}};this.bridge=new a(e,t,e=>this.close(e),e=>this.minimize(e),o,s.onAttachImage??(()=>{}),c,s.execHandler,(e,t,n)=>{this.openSprinkles.get(e)?.renderer.pushDeviceEvent(t,n)}),this.callbacks=i,this.autoOpenBehavior=s.autoOpenBehavior??`activate`,this.onSendToSprinkle=s.onSendToSprinkle,this.onSprinkleReloaded=s.onSprinkleReloaded,this.inlineSprinkles=s.inlineSprinkles??new Set}setSendToSprinkleHook(e){this.onSendToSprinkle&&!e&&g.error(`SprinkleManager broadcast hook detached`),this.onSendToSprinkle=e}setReloadHook(e){this.onSprinkleReloaded=e}async reload(e){let t=this.openSprinkles.get(e);if(!t){g.info(`Cannot reload closed sprinkle`,{name:e});return}let n=this.availableSprinkles.get(e);if(n||=(await this.refresh(),this.availableSprinkles.get(e)),!n){g.warn(`Sprinkle not found during reload`,{name:e});return}let r=await this.fs.readFile(n.path,{encoding:`utf-8`});if(r==null){g.warn(`Failed to read sprinkle content during reload`,{name:e});return}let a=typeof r==`string`?r:new TextDecoder(`utf-8`).decode(r);t.renderer?.dispose(),this.bridge.removeSprinkle(e);let o=this.bridge.createAPI(e),s=new i(t.container,o);if(await s.render(a,e),!this.openSprinkles.has(e)){s.dispose();return}if(t.renderer=s,s.activateBridgeLifecycle(),this.openSprinkles.has(e)&&(g.info(`Sprinkle reloaded`,{name:e}),this.notifyChange(),this.onSprinkleReloaded))try{this.onSprinkleReloaded(e)}catch(t){g.error(`onSprinkleReloaded hook threw`,{name:e,error:t instanceof Error?t.message:String(t)})}}async restoreOpenSprinkles(){try{let e=y();if(e!==null){await this.reopenInBackground(e);return}let t=localStorage.getItem(_);t?await this.restoreFromLegacyStorage(t):await this.autoOpenFirstRun()}catch{}await this.surfaceUnseenSprinkles()}async reopenInBackground(e){for(let t of e)try{await this.open(t,void 0,{background:!0})}catch{g.warn(`Failed to restore sprinkle`,{name:t})}}async restoreFromLegacyStorage(e){try{await this.reopenInBackground(JSON.parse(e))}finally{try{localStorage.removeItem(_)}catch{}}}async autoOpenFirstRun(){let e=this.autoOpenBehavior===`attention`,t=this.loadAutoOpenedOnce(),n=new Set;for(let r of this.availableSprinkles.values())if(!(!r.autoOpen||t.has(r.name)))try{await this.open(r.name,void 0,{attention:e}),n.add(r.name)}catch{g.warn(`Failed to auto-open sprinkle`,{name:r.name})}n.size>0&&this.persistAutoOpenedOnce(n)}async surfaceUnseenSprinkles(){let e=this.loadKnownSprinkles(),t=this.loadAutoOpenedOnce(),n=this.autoOpenBehavior===`attention`,r=new Set;for(let i of this.availableSprinkles.values())if(!e.has(i.name)&&!this.openSprinkles.has(i.name)&&!(i.autoOpen&&t.has(i.name)))try{await this.open(i.name,void 0,{attention:!i.autoOpen||n}),i.autoOpen&&r.add(i.name),g.info(`Surfaced previously-unseen sprinkle`,{name:i.name})}catch{g.warn(`Failed to surface unseen sprinkle`,{name:i.name})}this.persistKnownSprinkles(new Set(this.availableSprinkles.keys())),r.size>0&&this.persistAutoOpenedOnce(r)}loadKnownSprinkles(){return new Set(C())}persistKnownSprinkles(e){try{let t=new Set([...this.loadKnownSprinkles(),...e]);localStorage.setItem(x,JSON.stringify([...t]))}catch{}}loadAutoOpenedOnce(){try{let e=localStorage.getItem(w);if(!e)return new Set;let t=JSON.parse(e);return Array.isArray(t)?new Set(t.filter(e=>typeof e==`string`)):new Set}catch{return new Set}}persistAutoOpenedOnce(e){try{let t=new Set([...this.loadAutoOpenedOnce(),...e]);localStorage.setItem(w,JSON.stringify([...t]))}catch{}}persistOpenSprinkles(){try{let e=[...this.openSprinkles.keys()].filter(e=>!this.attentionOnly.has(e));localStorage.setItem(_,JSON.stringify(e))}catch{}this.schedulePersistOpenSprinklesToUrl()}schedulePersistOpenSprinklesToUrl(){this.urlWriteScheduled||(this.urlWriteScheduled=!0,queueMicrotask(()=>{this.urlWriteScheduled=!1,b([...this.openSprinkles.keys()].filter(e=>!this.attentionOnly.has(e)))}))}async openNewAutoOpenSprinkles(){if(this.inflightRefresh!==null)return this.inflightRefresh;if(!(Date.now()-this.lastRefreshAt<E))return this.inflightRefresh=this.runOpenNewAutoOpenSprinkles().finally(()=>{this.lastRefreshAt=Date.now(),this.inflightRefresh=null}),this.inflightRefresh}async runOpenNewAutoOpenSprinkles(){let e=new Set(this.availableSprinkles.keys());await this.refresh();let t=this.autoOpenBehavior===`attention`,n=this.loadAutoOpenedOnce(),r=new Set,i=!1;for(let a of this.availableSprinkles.values())if(!this.openSprinkles.has(a.name)&&!e.has(a.name))if(i=!0,a.autoOpen){if(n.has(a.name)){g.info(`Skipped one-shot auto-open for previously-consumed sprinkle`,{name:a.name});continue}try{await this.open(a.name,void 0,{attention:t}),r.add(a.name),g.info(`Auto-opened new sprinkle after install`,{name:a.name,attention:t})}catch{g.warn(`Failed to auto-open new sprinkle`,{name:a.name})}}else try{await this.open(a.name,void 0,{attention:!0}),g.info(`Surfaced newly-installed sprinkle in rail`,{name:a.name})}catch{g.warn(`Failed to surface newly-installed sprinkle`,{name:a.name})}i&&this.persistKnownSprinkles(new Set(this.availableSprinkles.keys())),r.size>0&&this.persistAutoOpenedOnce(r)}async refresh(){this.availableSprinkles=await c(this.fs),g.info(`Discovered sprinkles`,{count:this.availableSprinkles.size}),this.syncRegisteredIcons(),this.notifyChange()}syncRegisteredIcons(){if(!this.callbacks.registerSprinkle)return;let e=new Set;for(let t of this.availableSprinkles.values())this.inlineSprinkles.has(t.name)||e.add(t.name);for(let t of this.availableSprinkles.values())if(e.has(t.name)&&!this.registeredSprinkles.has(t.name))try{this.callbacks.registerSprinkle(t.name,t.title,{icon:t.icon}),this.registeredSprinkles.add(t.name)}catch(e){g.warn(`registerSprinkle callback threw`,{name:t.name,error:e instanceof Error?e.message:String(e)})}for(let t of[...this.registeredSprinkles])if(!e.has(t)){this.openSprinkles.has(t)&&this.close(t);try{this.callbacks.unregisterSprinkle?.(t)}catch(e){g.warn(`unregisterSprinkle callback threw`,{name:t,error:e instanceof Error?e.message:String(e)})}this.registeredSprinkles.delete(t)}}onChange(e){return this.changeListeners.add(e),()=>{this.changeListeners.delete(e)}}notifyChange(){this.changeNotifyScheduled||(this.changeNotifyScheduled=!0,queueMicrotask(()=>{this.changeNotifyScheduled=!1;for(let e of this.changeListeners)try{e()}catch(e){g.error(`SprinkleManager.onChange handler threw`,{error:e instanceof Error?e.message:String(e)})}}))}async open(e,n,r={}){if(this.openSprinkles.has(e)){g.info(`Sprinkle already open`,{name:e});return}let a=this.availableSprinkles.get(e);if(a||=(await this.refresh(),this.availableSprinkles.get(e)),!a)throw Error(`Sprinkle not found: ${e}`);let o=await this.fs.readFile(a.path,{encoding:`utf-8`});if(o==null)throw Error(`Failed to read sprinkle content: ${a.path} (file may be corrupted or missing)`);let s=typeof o==`string`?o:new TextDecoder(`utf-8`).decode(o),c=document.createElement(`div`);c.className=`sprinkle-panel`,c.style.cssText=`width: 100%; height: 100%; display: flex; flex-direction: column; overflow-y: auto;`,c.dataset.sprinkle=e,this.openSprinkles.set(e,{renderer:null,container:c}),r.attention?this.attentionOnly.add(e):this.attentionOnly.delete(e),this.callbacks.addSprinkle(e,a.title,c,n,{...r,icon:a.icon});let l=this.bridge.createAPI(e),u=new i(c,l);await u.render(s,e);let d=this.openSprinkles.get(e);if(!d){u.dispose();return}d.renderer=u,u.activateBridgeLifecycle(),this.openSprinkles.has(e)&&(this.persistOpenSprinkles(),t(e),g.info(`Sprinkle opened`,{name:e,title:a.title}),this.notifyChange())}markActivated(e){this.attentionOnly.has(e)&&(this.attentionOnly.delete(e),this.persistOpenSprinkles(),g.info(`Sprinkle promoted from attention to user-opened`,{name:e}),this.notifyChange())}async activate(e,t){if(this.attentionOnly.has(e)){this.markActivated(e);return}let n=this.openSprinkles.get(e);if(!n){try{await this.open(e,t)}catch(t){g.warn(`Failed to open sprinkle from rail-icon click`,{name:e,error:t instanceof Error?t.message:String(t)})}return}let r=this.availableSprinkles.get(e);this.callbacks.addSprinkle(e,r?.title??e,n.container,t,{icon:r?.icon})}close(e){let t=this.openSprinkles.get(e);t&&(t.renderer?.dispose(),t.container.remove(),this.bridge.removeSprinkle(e),this.openSprinkles.delete(e),this.attentionOnly.delete(e),this.callbacks.closeSprinkleContent?this.callbacks.closeSprinkleContent(e):this.callbacks.removeSprinkle(e),this.persistOpenSprinkles(),g.info(`Sprinkle closed`,{name:e}),this.notifyChange())}minimize(e){this.openSprinkles.has(e)&&(this.callbacks.minimizeSprinkle(e),g.info(`Sprinkle minimized`,{name:e}))}available(){return Array.from(this.availableSprinkles.values())}opened(){return Array.from(this.openSprinkles.keys())}setupWatcher(e){let t=null,n=new Map,r=e=>{let r=!1;for(let t of e){let e=this.findOpenSprinkleByPath(t.path);if(e){let t=n.get(e);t&&clearTimeout(t),n.set(e,setTimeout(()=>{n.delete(e),this.reload(e).catch(t=>{g.warn(`Sprinkle reload on watcher event failed`,{name:e,error:t instanceof Error?t.message:String(t)})})},300))}else r=!0}r&&!t&&(t=setTimeout(()=>{t=null,this.openNewAutoOpenSprinkles().catch(e=>{g.warn(`Sprinkle refresh on watcher event failed`,{error:e instanceof Error?e.message:String(e)})})},150))},i=T.map(t=>e.watch(t,e=>e.endsWith(`.shtml`),r));this.watcherUnsub=()=>{for(let e of i)e();t&&=(clearTimeout(t),null);for(let e of n.values())clearTimeout(e);n.clear()}}findOpenSprinkleByPath(e){for(let[t]of this.openSprinkles){let n=this.availableSprinkles.get(t);if(n&&n.path===e)return t}return null}dispose(){this.watcherUnsub?.()}sendToSprinkle(e,t,n){let r=!n?.runtime||n.runtime===`leader`,i=!n?.runtime||n.runtime!==`leader`,a={leader:!1,followers:[]};if(r){let n=this.openSprinkles.get(e);n?(this.bridge.pushUpdate(e,t),n.renderer.pushUpdate(t),a.leader=!0):g.warn(`Cannot send to closed sprinkle`,{name:e})}if(i&&this.onSendToSprinkle)try{let r=this.onSendToSprinkle(e,t,n);r&&(a.followers=r.followers,r.unknownRuntime&&(a.unknownRuntime=r.unknownRuntime))}catch(t){g.error(`onSendToSprinkle hook threw`,{name:e,error:t instanceof Error?t.message:String(t)})}return a}};export{D as SprinkleManager,S as pruneKnownSprinkleNames,C as readKnownSprinkleNames};
1
+ import{t as e}from"./logger-DDBAeTLF.js";import{s as t}from"./telemetry-BVzuNdvW.js";import{n,t as r}from"./panel-rpc-B3MSVImO.js";import{t as i}from"./sprinkle-renderer-D64E-W2o.js";import{t as a}from"./sprinkle-bridge-C4qw-DTw.js";import"./sprinkle-instances-B8n7h-oP.js";var o=[`/shared/sprinkles`],s=new Set([`welcome`,`connect-llm`]);async function c(e){let t=new Map;for(let n of o)await e.exists(n)&&await l(e,n,t);return await l(e,`/`,t),t}async function l(e,t,n){for await(let r of e.walk(t)){if(!r.endsWith(`.shtml`))continue;let t=u(r);if(!s.has(t)&&!n.has(t)){let i;try{i=await e.readFile(r,{encoding:`utf-8`})??``}catch{i=``}n.set(t,{name:t,path:r,title:d(i,t),autoOpen:f(i),icon:p(i)})}}}function u(e){let t=e.split(`/`).pop()??e;return t.endsWith(`.shtml`)?t.slice(0,-6):t}function d(e,t){let n=e.match(/data-sprinkle-title=["']([^"']+)["']/);if(n)return n[1];let r=e.match(/<title>([^<]+)<\/title>/i);return r?r[1].trim():t}function f(e){return/data-sprinkle-autoopen\b/.test(e)}function p(e){let t=/<link\b/gi,n;for(;(n=t.exec(e))!==null;){let t=n.index+n[0].length,r=m(e,t);if(r<0)continue;let i=e.slice(t,r);if(!/\brel\s*=\s*("|')\s*(?:shortcut\s+)?icon\s*\1/i.test(i))continue;let a=h(i,`href`);if(a!==void 0)return a.trim()}let r=h(e,`data-sprinkle-icon`);if(r!==void 0)return r.trim()}function m(e,t){let n=!1,r=!1;for(let i=t;i<e.length;i++){let t=e.charCodeAt(i);if(n)t===34&&(n=!1);else if(r)t===39&&(r=!1);else if(t===34)n=!0;else if(t===39)r=!0;else if(t===62)return i}return-1}function h(e,t){let n=RegExp(`\\b${t}\\s*=\\s*(?:"([^"]*)"|'([^']*)')`,`i`),r=e.match(n);if(r)return r[1]??r[2]??void 0}var g=e(`sprinkle-manager`),_=`slicc-open-sprinkles`,v=`sprinkles`;function y(){try{if(typeof window>`u`||!window.location)return null;let e=new URLSearchParams(window.location.search).get(v);return e===null?null:e===``?[]:e.split(`,`).map(e=>e.trim()).filter(e=>e.length>0)}catch{return null}}function b(e){try{if(typeof window>`u`||!window.location||typeof history>`u`||typeof history.replaceState!=`function`)return;let t=new URL(window.location.href);e.length===0?t.searchParams.delete(v):t.searchParams.set(v,e.join(`,`));let n=t.pathname+t.search+t.hash;history.replaceState(history.state??null,``,n)}catch{}}var x=`slicc-known-sprinkles`;function S(e){try{let t=new Set(e),n=C().filter(e=>t.has(e));localStorage.setItem(x,JSON.stringify(n))}catch{}}function C(){try{let e=localStorage.getItem(x);if(!e)return[];let t=JSON.parse(e);return Array.isArray(t)?t.filter(e=>typeof e==`string`):[]}catch{return[]}}var w=`slicc-autoopened-once`,T=[`/workspace`,`/shared`,`/scoops`],E=250,D=class{fs;bridge;callbacks;availableSprinkles=new Map;watcherUnsub;openSprinkles=new Map;attentionOnly=new Set;inflightRefresh=null;lastRefreshAt=0;autoOpenBehavior;onSendToSprinkle;onSprinkleReloaded;registeredSprinkles=new Set;inlineSprinkles;changeListeners=new Set;changeNotifyScheduled=!1;urlWriteScheduled=!1;constructor(e,t,i,o,s={}){this.fs=e;let c=async()=>{let e=`image/png`,t=n(),i=r();if(!t&&!i)throw Error(`Screen capture unavailable in this environment`);if(t&&!navigator.mediaDevices?.getDisplayMedia)throw Error(`Screen capture not supported in this browser`);let a,o,s;if(t){let t=await navigator.mediaDevices.getDisplayMedia({video:!0,audio:!1});try{let n=document.createElement(`video`);n.srcObject=t,n.muted=!0,n.playsInline=!0,await new Promise((e,t)=>{n.onloadedmetadata=()=>n.play().then(()=>e()).catch(t),n.onerror=()=>t(Error(`Failed to load video stream`))}),await new Promise(e=>setTimeout(e,100)),o=n.videoWidth,s=n.videoHeight;let r=document.createElement(`canvas`);r.width=o,r.height=s;let i=r.getContext(`2d`);if(!i)throw Error(`Failed to get canvas context`);i.drawImage(n,0,0,o,s),a=await(await new Promise((t,n)=>{r.toBlob(e=>e?t(e):n(Error(`Failed to create image blob`)),e,1)})).arrayBuffer()}finally{for(let e of t.getTracks())e.stop()}}else{let t=await i.call(`screencapture`,{mimeType:e,quality:1},{timeoutMs:3e5});a=t.bytes,o=t.width,s=t.height}let c=new Uint8Array(a),l=[],u=8192;for(let e=0;e<c.length;e+=u)l.push(String.fromCharCode(...c.subarray(e,e+u)));return{base64:btoa(l.join(``)),width:o,height:s,mimeType:e}};this.bridge=new a(e,t,e=>this.close(e),e=>this.minimize(e),o,s.onAttachImage??(()=>{}),c,s.execHandler,(e,t,n)=>{this.openSprinkles.get(e)?.renderer.pushDeviceEvent(t,n)}),this.callbacks=i,this.autoOpenBehavior=s.autoOpenBehavior??`activate`,this.onSendToSprinkle=s.onSendToSprinkle,this.onSprinkleReloaded=s.onSprinkleReloaded,this.inlineSprinkles=s.inlineSprinkles??new Set}setSendToSprinkleHook(e){this.onSendToSprinkle&&!e&&g.error(`SprinkleManager broadcast hook detached`),this.onSendToSprinkle=e}setReloadHook(e){this.onSprinkleReloaded=e}async reload(e){let t=this.openSprinkles.get(e);if(!t){g.info(`Cannot reload closed sprinkle`,{name:e});return}let n=this.availableSprinkles.get(e);if(n||=(await this.refresh(),this.availableSprinkles.get(e)),!n){g.warn(`Sprinkle not found during reload`,{name:e});return}let r=await this.fs.readFile(n.path,{encoding:`utf-8`});if(r==null){g.warn(`Failed to read sprinkle content during reload`,{name:e});return}let a=typeof r==`string`?r:new TextDecoder(`utf-8`).decode(r);t.renderer?.dispose(),this.bridge.removeSprinkle(e);let o=this.bridge.createAPI(e),s=new i(t.container,o);if(await s.render(a,e),!this.openSprinkles.has(e)){s.dispose();return}if(t.renderer=s,s.activateBridgeLifecycle(),this.openSprinkles.has(e)&&(g.info(`Sprinkle reloaded`,{name:e}),this.notifyChange(),this.onSprinkleReloaded))try{this.onSprinkleReloaded(e)}catch(t){g.error(`onSprinkleReloaded hook threw`,{name:e,error:t instanceof Error?t.message:String(t)})}}async restoreOpenSprinkles(){try{let e=y();if(e!==null){await this.reopenInBackground(e);return}let t=localStorage.getItem(_);t?await this.restoreFromLegacyStorage(t):await this.autoOpenFirstRun()}catch{}await this.surfaceUnseenSprinkles()}async reopenInBackground(e){for(let t of e)try{await this.open(t,void 0,{background:!0})}catch{g.warn(`Failed to restore sprinkle`,{name:t})}}async restoreFromLegacyStorage(e){try{await this.reopenInBackground(JSON.parse(e))}finally{try{localStorage.removeItem(_)}catch{}}}async autoOpenFirstRun(){let e=this.autoOpenBehavior===`attention`,t=this.loadAutoOpenedOnce(),n=new Set;for(let r of this.availableSprinkles.values())if(!(!r.autoOpen||t.has(r.name)))try{await this.open(r.name,void 0,{attention:e}),n.add(r.name)}catch{g.warn(`Failed to auto-open sprinkle`,{name:r.name})}n.size>0&&this.persistAutoOpenedOnce(n)}async surfaceUnseenSprinkles(){let e=this.loadKnownSprinkles(),t=this.loadAutoOpenedOnce(),n=this.autoOpenBehavior===`attention`,r=new Set;for(let i of this.availableSprinkles.values())if(!e.has(i.name)&&!this.openSprinkles.has(i.name)&&!(i.autoOpen&&t.has(i.name)))try{await this.open(i.name,void 0,{attention:!i.autoOpen||n}),i.autoOpen&&r.add(i.name),g.info(`Surfaced previously-unseen sprinkle`,{name:i.name})}catch{g.warn(`Failed to surface unseen sprinkle`,{name:i.name})}this.persistKnownSprinkles(new Set(this.availableSprinkles.keys())),r.size>0&&this.persistAutoOpenedOnce(r)}loadKnownSprinkles(){return new Set(C())}persistKnownSprinkles(e){try{let t=new Set([...this.loadKnownSprinkles(),...e]);localStorage.setItem(x,JSON.stringify([...t]))}catch{}}loadAutoOpenedOnce(){try{let e=localStorage.getItem(w);if(!e)return new Set;let t=JSON.parse(e);return Array.isArray(t)?new Set(t.filter(e=>typeof e==`string`)):new Set}catch{return new Set}}persistAutoOpenedOnce(e){try{let t=new Set([...this.loadAutoOpenedOnce(),...e]);localStorage.setItem(w,JSON.stringify([...t]))}catch{}}persistOpenSprinkles(){try{let e=[...this.openSprinkles.keys()].filter(e=>!this.attentionOnly.has(e));localStorage.setItem(_,JSON.stringify(e))}catch{}this.schedulePersistOpenSprinklesToUrl()}schedulePersistOpenSprinklesToUrl(){this.urlWriteScheduled||(this.urlWriteScheduled=!0,queueMicrotask(()=>{this.urlWriteScheduled=!1,b([...this.openSprinkles.keys()].filter(e=>!this.attentionOnly.has(e)))}))}async openNewAutoOpenSprinkles(){if(this.inflightRefresh!==null)return this.inflightRefresh;if(!(Date.now()-this.lastRefreshAt<E))return this.inflightRefresh=this.runOpenNewAutoOpenSprinkles().finally(()=>{this.lastRefreshAt=Date.now(),this.inflightRefresh=null}),this.inflightRefresh}async runOpenNewAutoOpenSprinkles(){let e=new Set(this.availableSprinkles.keys());await this.refresh();let t=this.autoOpenBehavior===`attention`,n=this.loadAutoOpenedOnce(),r=new Set,i=!1;for(let a of this.availableSprinkles.values())if(!this.openSprinkles.has(a.name)&&!e.has(a.name))if(i=!0,a.autoOpen){if(n.has(a.name)){g.info(`Skipped one-shot auto-open for previously-consumed sprinkle`,{name:a.name});continue}try{await this.open(a.name,void 0,{attention:t}),r.add(a.name),g.info(`Auto-opened new sprinkle after install`,{name:a.name,attention:t})}catch{g.warn(`Failed to auto-open new sprinkle`,{name:a.name})}}else try{await this.open(a.name,void 0,{attention:!0}),g.info(`Surfaced newly-installed sprinkle in rail`,{name:a.name})}catch{g.warn(`Failed to surface newly-installed sprinkle`,{name:a.name})}i&&this.persistKnownSprinkles(new Set(this.availableSprinkles.keys())),r.size>0&&this.persistAutoOpenedOnce(r)}async refresh(){this.availableSprinkles=await c(this.fs),g.info(`Discovered sprinkles`,{count:this.availableSprinkles.size}),this.syncRegisteredIcons(),this.notifyChange()}syncRegisteredIcons(){if(!this.callbacks.registerSprinkle)return;let e=new Set;for(let t of this.availableSprinkles.values())this.inlineSprinkles.has(t.name)||e.add(t.name);for(let t of this.availableSprinkles.values())if(e.has(t.name)&&!this.registeredSprinkles.has(t.name))try{this.callbacks.registerSprinkle(t.name,t.title,{icon:t.icon}),this.registeredSprinkles.add(t.name)}catch(e){g.warn(`registerSprinkle callback threw`,{name:t.name,error:e instanceof Error?e.message:String(e)})}for(let t of[...this.registeredSprinkles])if(!e.has(t)){this.openSprinkles.has(t)&&this.close(t);try{this.callbacks.unregisterSprinkle?.(t)}catch(e){g.warn(`unregisterSprinkle callback threw`,{name:t,error:e instanceof Error?e.message:String(e)})}this.registeredSprinkles.delete(t)}}onChange(e){return this.changeListeners.add(e),()=>{this.changeListeners.delete(e)}}notifyChange(){this.changeNotifyScheduled||(this.changeNotifyScheduled=!0,queueMicrotask(()=>{this.changeNotifyScheduled=!1;for(let e of this.changeListeners)try{e()}catch(e){g.error(`SprinkleManager.onChange handler threw`,{error:e instanceof Error?e.message:String(e)})}}))}async open(e,n,r={}){if(this.openSprinkles.has(e)){g.info(`Sprinkle already open`,{name:e});return}let a=this.availableSprinkles.get(e);if(a||=(await this.refresh(),this.availableSprinkles.get(e)),!a)throw Error(`Sprinkle not found: ${e}`);let o=await this.fs.readFile(a.path,{encoding:`utf-8`});if(o==null)throw Error(`Failed to read sprinkle content: ${a.path} (file may be corrupted or missing)`);let s=typeof o==`string`?o:new TextDecoder(`utf-8`).decode(o),c=document.createElement(`div`);c.className=`sprinkle-panel`,c.style.cssText=`width: 100%; height: 100%; display: flex; flex-direction: column; overflow-y: auto;`,c.dataset.sprinkle=e,this.openSprinkles.set(e,{renderer:null,container:c}),r.attention?this.attentionOnly.add(e):this.attentionOnly.delete(e),this.callbacks.addSprinkle(e,a.title,c,n,{...r,icon:a.icon});let l=this.bridge.createAPI(e),u=new i(c,l);await u.render(s,e);let d=this.openSprinkles.get(e);if(!d){u.dispose();return}d.renderer=u,u.activateBridgeLifecycle(),this.openSprinkles.has(e)&&(this.persistOpenSprinkles(),t(e),g.info(`Sprinkle opened`,{name:e,title:a.title}),this.notifyChange())}markActivated(e){this.attentionOnly.has(e)&&(this.attentionOnly.delete(e),this.persistOpenSprinkles(),g.info(`Sprinkle promoted from attention to user-opened`,{name:e}),this.notifyChange())}async activate(e,t){if(this.attentionOnly.has(e)){this.markActivated(e);return}let n=this.openSprinkles.get(e);if(!n){try{await this.open(e,t)}catch(t){g.warn(`Failed to open sprinkle from rail-icon click`,{name:e,error:t instanceof Error?t.message:String(t)})}return}let r=this.availableSprinkles.get(e);this.callbacks.addSprinkle(e,r?.title??e,n.container,t,{icon:r?.icon})}close(e){let t=this.openSprinkles.get(e);t&&(t.renderer?.dispose(),t.container.remove(),this.bridge.removeSprinkle(e),this.openSprinkles.delete(e),this.attentionOnly.delete(e),this.callbacks.closeSprinkleContent?this.callbacks.closeSprinkleContent(e):this.callbacks.removeSprinkle(e),this.persistOpenSprinkles(),g.info(`Sprinkle closed`,{name:e}),this.notifyChange())}minimize(e){this.openSprinkles.has(e)&&(this.callbacks.minimizeSprinkle(e),g.info(`Sprinkle minimized`,{name:e}))}available(){return Array.from(this.availableSprinkles.values())}opened(){return Array.from(this.openSprinkles.keys())}setupWatcher(e){let t=null,n=new Map,r=e=>{let r=!1;for(let t of e){let e=this.findOpenSprinkleByPath(t.path);if(e){let t=n.get(e);t&&clearTimeout(t),n.set(e,setTimeout(()=>{n.delete(e),this.reload(e).catch(t=>{g.warn(`Sprinkle reload on watcher event failed`,{name:e,error:t instanceof Error?t.message:String(t)})})},300))}else r=!0}r&&!t&&(t=setTimeout(()=>{t=null,this.openNewAutoOpenSprinkles().catch(e=>{g.warn(`Sprinkle refresh on watcher event failed`,{error:e instanceof Error?e.message:String(e)})})},150))},i=T.map(t=>e.watch(t,e=>e.endsWith(`.shtml`),r));this.watcherUnsub=()=>{for(let e of i)e();t&&=(clearTimeout(t),null);for(let e of n.values())clearTimeout(e);n.clear()}}findOpenSprinkleByPath(e){for(let[t]of this.openSprinkles){let n=this.availableSprinkles.get(t);if(n&&n.path===e)return t}return null}dispose(){this.watcherUnsub?.()}sendToSprinkle(e,t,n){let r=!n?.runtime||n.runtime===`leader`,i=!n?.runtime||n.runtime!==`leader`,a={leader:!1,followers:[]};if(r){let n=this.openSprinkles.get(e);n?(this.bridge.pushUpdate(e,t),n.renderer.pushUpdate(t),a.leader=!0):g.warn(`Cannot send to closed sprinkle`,{name:e})}if(i&&this.onSendToSprinkle)try{let r=this.onSendToSprinkle(e,t,n);r&&(a.followers=r.followers,r.unknownRuntime&&(a.unknownRuntime=r.unknownRuntime))}catch(t){g.error(`onSendToSprinkle hook threw`,{name:e,error:t instanceof Error?t.message:String(t)})}return a}};export{D as SprinkleManager,S as pruneKnownSprinkleNames,C as readKnownSprinkleNames};