@symerian/symi 3.5.20 → 3.5.22
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.
- package/dist/{agent-D0Z4r5fr.js → agent-DgVWcnlD.js} +1 -1
- package/dist/{agent-DCDT-MPE.js → agent-NT0EKnK_.js} +18 -18
- package/dist/{agent-scope-DOrZjOnW.js → agent-scope-Bnsyyeci.js} +18 -18
- package/dist/{agents-CdkBeP0d.js → agents-Dlcpc1K3.js} +3 -3
- package/dist/{agents.config-B7sNDvhz.js → agents.config-DA0ISLi7.js} +1 -1
- package/dist/{audit-B7deV4Lp.js → audit-CPloCzEZ.js} +2 -2
- package/dist/{audit-BCStg-Hv.js → audit-CXIXYDRx.js} +20 -20
- package/dist/{auth-choice-BIGcxSzP.js → auth-choice--DymOp5O.js} +2 -2
- package/dist/{auth-choice-B3DU-aBr.js → auth-choice-BtXIQPTU.js} +11 -11
- package/dist/{auth-profiles-Ce7R_25e.js → auth-profiles-D5nYBj_Z.js} +2 -2
- package/dist/{auth-token-Cr28IDKY.js → auth-token-fgnCQEHT.js} +3 -3
- package/dist/{banner-ChNdzPjD.js → banner-CY_9VW7E.js} +1 -1
- package/dist/{browser-cli-C9xaKW8l.js → browser-cli-C5VVk6C9.js} +3 -3
- package/dist/{browser-cli-BTg8SVs-.js → browser-cli-DOTM7UBC.js} +9 -9
- package/dist/build-info.json +3 -3
- package/dist/bundled/boot-md/handler.js +2 -2
- package/dist/bundled/session-memory/handler.js +2 -2
- package/dist/{call-BccaLPi8.js → call-Bpjj5p7I.js} +9 -9
- package/dist/{call-DZg43vv8.js → call-C2urR5Fj.js} +1 -1
- package/dist/canvas-host/a2ui/.bundle.hash +1 -1
- package/dist/{channel-options-CUptVX8c.js → channel-options-XRJiHUm5.js} +1 -1
- package/dist/{channel-options-LLmAnD_L.js → channel-options-rFgJaKzJ.js} +1 -1
- package/dist/{channels-cli-xoromnio.js → channels-cli-CQ4M05oy.js} +57 -57
- package/dist/{channels-cli-B0OQvVUL.js → channels-cli-QMHCRAb5.js} +9 -9
- package/dist/{chrome-DJChpTwP.js → chrome-38OnGyuN.js} +2 -2
- package/dist/{chrome-3jl2ulOE.js → chrome-DNssqQJs.js} +7 -7
- package/dist/{cli-C7v-sID8.js → cli-B-uoiYP2.js} +45 -45
- package/dist/{cli-CMNR7ULk.js → cli-BafqEuaj.js} +6 -6
- package/dist/{client-k0MT6NBw.js → client-CTrfpKT3.js} +7 -2
- package/dist/{client-DCxeV1bw.js → client-yVTJ5jx5.js} +6 -1
- package/dist/{command-registry-CXcvXjUR.js → command-registry-CLm8TAH3.js} +11 -11
- package/dist/{commands-registry-Ca5hh7nh.js → commands-registry-CwXsDVuO.js} +1 -1
- package/dist/{completion-cli-DJ1YCeSg.js → completion-cli-Cn_81QBb.js} +12 -12
- package/dist/{completion-cli-B1Fg6Lmg.js → completion-cli-DOBXkVwG.js} +2 -2
- package/dist/{config-B4jkreCN.js → config-BngIfn5l.js} +2 -2
- package/dist/{config-cli-D5DlWt6T.js → config-cli-B1cPkJ4p.js} +4 -4
- package/dist/{config-cli-CQ1FAvY_.js → config-cli-BgHYqFH1.js} +1 -1
- package/dist/{config-guard-BRm3RiOi.js → config-guard-DStz4_V2.js} +6 -6
- package/dist/{config-validation-Cdyg1BZB.js → config-validation-Dxj9LRzr.js} +1 -1
- package/dist/{configure-bhJB2Dti.js → configure-C7zmSgvC.js} +14 -14
- package/dist/{configure-DG1lf0Ld.js → configure-DmzM0S7L.js} +6 -6
- package/dist/{consolidate-DymnvvYm.js → consolidate-CO32_TEx.js} +6 -6
- package/dist/{control-service-D8kKOts5.js → control-service-CUreKVeY.js} +4 -4
- package/dist/control-ui/css/style.css +281 -0
- package/dist/control-ui/index.html +45 -115
- package/dist/control-ui/js/scheduling.js +85 -224
- package/dist/control-ui/js/subagents.js +78 -394
- package/dist/control-ui/js/symframe-awaiting.js +306 -0
- package/dist/control-ui/js/symframe-pin-store.js +104 -0
- package/dist/control-ui/js/symframe-substrate.js +11 -7
- package/dist/control-ui/js/symframe.js +250 -30
- package/dist/{control-ui-assets-CJQ97d4u.js → control-ui-assets-B8B9z_Ll.js} +1 -1
- package/dist/{cost-cli-DWiVCOCx.js → cost-cli-D-ssjcRF.js} +3 -3
- package/dist/{cron-cli-8RaBr1CM.js → cron-cli-BNBs3zue.js} +3 -3
- package/dist/{cron-cli-fW3wtftG.js → cron-cli-otPeKxmi.js} +7 -7
- package/dist/{daemon-cli-Y6clFgva.js → daemon-cli-DDqeG2nd.js} +2 -2
- package/dist/{daemon-cli-0EiZTQ2A.js → daemon-cli-qDdMg615.js} +11 -11
- package/dist/daemon-cli.js +6 -1
- package/dist/{daemon-runtime-DlQla_dA.js → daemon-runtime-CKn0wmCk.js} +10 -10
- package/dist/{deliver-lTZLIQqf.js → deliver-CWMFmMCv.js} +2 -2
- package/dist/{deliver-f3cIWxXT.js → deliver-q23ar_Pm.js} +4 -4
- package/dist/{deps-Bf9dt2UO.js → deps-CdibsPMx.js} +1 -1
- package/dist/{devices-cli-C2gQTsB0.js → devices-cli-BJ3rVWOw.js} +2 -2
- package/dist/{devices-cli-DfiSkZ7k.js → devices-cli-DDPwF2Nx.js} +6 -6
- package/dist/{diagnostics-DlZODdRf.js → diagnostics-CYkqD5lP.js} +5 -5
- package/dist/{directory-cli-Bm5QYEo-.js → directory-cli-giqTe8Yg.js} +3 -3
- package/dist/{dm-policy-shared-CeFt0nch.js → dm-policy-shared-B61_yf6G.js} +1 -1
- package/dist/{dns-cli-CubLq4j9.js → dns-cli-Dssz4RqF.js} +3 -3
- package/dist/{docs-cli-PS8m1er7.js → docs-cli-Ct1STieY.js} +1 -1
- package/dist/{doctor-completion-CfF0J8fs.js → doctor-completion-CL7MyXlo.js} +2 -2
- package/dist/{doctor-completion-ScxFfN93.js → doctor-completion-k0HiL05o.js} +1 -1
- package/dist/{doctor-config-flow-C52W1uUK.js → doctor-config-flow-ljVnQJjo.js} +9 -9
- package/dist/entry.js +1 -1
- package/dist/{exec-approvals-cli-Cl-vWA1q.js → exec-approvals-cli-Cau1vPQI.js} +4 -4
- package/dist/{exec-approvals-cli-BaKWIf56.js → exec-approvals-cli-DsBoQu5H.js} +13 -13
- package/dist/extensionAPI.js +4 -4
- package/dist/{file-lock-BVUYnlQv.js → file-lock-2AecMjCa.js} +8 -8
- package/dist/{fs-safe-BdejYjW8.js → fs-safe-B0Is-oLk.js} +6 -6
- package/dist/{gateway-cli-kq5EWlnF.js → gateway-cli-DG_2YZ8B.js} +98 -98
- package/dist/{gateway-cli-CK-5nguV.js → gateway-cli-DgmGygc6.js} +16 -16
- package/dist/{gateway-rpc-Bzg_TTKP.js → gateway-rpc-Kv0-8W2E.js} +1 -1
- package/dist/{gateway-rpc-D12UaJS5.js → gateway-rpc-gaoD882s.js} +1 -1
- package/dist/{glass-ui-ws-B6p0iPsO.js → glass-ui-ws-Bof7krDJ.js} +67 -67
- package/dist/{glass-ui-ws-CVr0_1gT.js → glass-ui-ws-Dl45d7eU.js} +13 -13
- package/dist/{health-CPU9rQGj.js → health-CMbUI4aN.js} +4 -4
- package/dist/{health-CJb2CYtg.js → health-znS85U-F.js} +1 -1
- package/dist/{hooks-cli-DbgVZaP4.js → hooks-cli-Cb9BzCOY.js} +7 -7
- package/dist/{hooks-cli-13HCu5Xs.js → hooks-cli-Cgjor7F-.js} +59 -59
- package/dist/{image-ops-L70xVnpG.js → image-ops-BzCBIakN.js} +10 -10
- package/dist/index.js +52 -52
- package/dist/{inspect-CGKsaVZ4.js → inspect-DzYUb_Dl.js} +4 -4
- package/dist/{install-safe-path-B2JrFspY.js → install-safe-path-BrpA09f2.js} +11 -11
- package/dist/{installs-D890uIIW.js → installs-bnDlOSq2.js} +10 -10
- package/dist/{internal-DVCddhhN.js → internal-csqU78gW.js} +9 -9
- package/dist/{lifecycle-core-wFwnK_mD.js → lifecycle-core-cSR_xiIO.js} +5 -5
- package/dist/llm-slug-generator.js +2 -2
- package/dist/{local-roots-CgDCgCuM.js → local-roots-2Jb79HZ8.js} +1 -1
- package/dist/{logs-cli-R16VTptK.js → logs-cli-Kr145PO_.js} +7 -7
- package/dist/{logs-cli-CQeK5fn7.js → logs-cli-LiAjkog2.js} +3 -3
- package/dist/{manager-CxFs8Z_F.js → manager-CceVgXHV.js} +1 -1
- package/dist/{manager-B2SWSuad.js → manager-DDynl084.js} +1 -1
- package/dist/{manager-CHLdCC6u.js → manager-DG6PODgu.js} +15 -15
- package/dist/{manager-LPPGAsqn.js → manager-qrAOWmHt.js} +1 -1
- package/dist/{memory-DFpqcIst.js → memory-A2D5e8dL.js} +2 -2
- package/dist/{memory-DavRjdTi.js → memory-BFnx3v3_.js} +5 -5
- package/dist/{memory-cli-DZnq3S6s.js → memory-cli-1zjVJITN.js} +2 -2
- package/dist/{memory-cli-B-Cp1Sb1.js → memory-cli-CHNghdrm.js} +12 -12
- package/dist/{model-MUMSB_7d.js → model-Cwbcw-km.js} +1 -1
- package/dist/{model-auth-1EAQvYRv.js → model-auth-_C07_3Yr.js} +2 -2
- package/dist/{model-catalog-IWi6-nY9.js → model-catalog-BWurV7gl.js} +3 -3
- package/dist/{model-picker-Cf6UgQEh.js → model-picker-Dpkr5xBW.js} +5 -5
- package/dist/{model-selection-7wdmO-Iw.js → model-selection-CCTzD29o.js} +1 -1
- package/dist/{models-Cht7Mzvs.js → models-BYev6YAG.js} +3 -3
- package/dist/{models-cli-B_motPDX.js → models-cli-BbK8HMKa.js} +55 -55
- package/dist/{models-cli-DXswzgUR.js → models-cli-Fa5r1QYP.js} +9 -9
- package/dist/{models-config-B5Xxy-c-.js → models-config-DlXge3Sd.js} +8 -8
- package/dist/{node-cli-D-gsjRXY.js → node-cli-BPnBosC4.js} +27 -27
- package/dist/{node-cli-VmKhIXuP.js → node-cli-Cv7x1gGu.js} +1 -1
- package/dist/{node-service-BH08wY5j.js → node-service-Cc18m-uk.js} +1 -1
- package/dist/{nodes-cli-BMvxQGCp.js → nodes-cli-CN_m6PO5.js} +10 -10
- package/dist/{nodes-cli-D199d74o.js → nodes-cli-DaHOBbd4.js} +3 -3
- package/dist/{nodes-screen-De9ma6e1.js → nodes-screen-Cp5QP3ET.js} +4 -4
- package/dist/{npm-registry-spec-DTqn-NXZ.js → npm-registry-spec-C-muP97-.js} +9 -9
- package/dist/{onboard-DFJcbABp.js → onboard-B2IcTMv-.js} +15 -15
- package/dist/{onboard-CdRA8BRG.js → onboard-D-m6WTZl.js} +3 -3
- package/dist/{onboard-channels-fadyQGBK.js → onboard-channels-Z-Jkrk5-.js} +1 -1
- package/dist/{onboard-channels-Ca7ZFQ2Y.js → onboard-channels-wfGO5Zlh.js} +4 -4
- package/dist/{onboard-custom-BcRYreNG.js → onboard-custom-DnDrvxSg.js} +3 -3
- package/dist/{onboard-helpers-CQBpac8h.js → onboard-helpers-BKejzolA.js} +8 -8
- package/dist/{onboard-helpers-BcLPSb5N.js → onboard-helpers-Dhr98nj8.js} +1 -1
- package/dist/{onboard-hooks-2SCajRKc.js → onboard-hooks-D9jHwImb.js} +1 -1
- package/dist/{onboard-remote-Bo3tpC9N.js → onboard-remote-DZdMxd1Q.js} +1 -1
- package/dist/{onboard-remote-BWK5Ths4.js → onboard-remote-y3ZmP90U.js} +1 -1
- package/dist/{onboard-skills-BLl8HPJO.js → onboard-skills-2SUv-W7i.js} +1 -1
- package/dist/{onboard-skills-DvacccqZ.js → onboard-skills-BFhHfrt9.js} +3 -3
- package/dist/{onboarding-ojb2rFkA.js → onboarding-BckHLQMV.js} +7 -7
- package/dist/{onboarding-BywueA1d.js → onboarding-DqlPV372.js} +12 -12
- package/dist/{onboarding.finalize-DdxBQpUU.js → onboarding.finalize-Bwjv3jew.js} +31 -31
- package/dist/{onboarding.finalize-DHvlZi9G.js → onboarding.finalize-CbH_ShIW.js} +9 -9
- package/dist/{onboarding.gateway-config-DPBNWNV6.js → onboarding.gateway-config-CiRo9EMt.js} +8 -8
- package/dist/{onboarding.gateway-config-ZK9517uR.js → onboarding.gateway-config-sNSeEykB.js} +3 -3
- package/dist/{openai-model-default-BkuuK-Di.js → openai-model-default-De-UAjwg.js} +2 -2
- package/dist/{pairing-cli-Rsae0KnN.js → pairing-cli-CBMMCNnx.js} +5 -5
- package/dist/{pairing-store-BNhJOnWn.js → pairing-store-Be-ZQK87.js} +1 -1
- package/dist/{pairing-token-Dcy37-4s.js → pairing-token-B703A1U3.js} +7 -7
- package/dist/{paths-DObzwe08.js → paths-BWqg8NZT.js} +1 -1
- package/dist/{pi-auth-json-Db8XJVGL.js → pi-auth-json-D-vdh-nY.js} +6 -6
- package/dist/{pi-embedded-Da0QRlM0.js → pi-embedded-CviuByGd.js} +32 -16
- package/dist/{pi-embedded-helpers-D-OFjhdI.js → pi-embedded-helpers-j1JrlsI0.js} +6 -6
- package/dist/{pi-tools.policy-H2t-Xkfc.js → pi-tools.policy-CvAqjEH9.js} +3 -3
- package/dist/{plugin-auto-enable-DJBhDIMq.js → plugin-auto-enable-BXSJTxI7.js} +1 -1
- package/dist/{plugin-registry-tG7NXc3Y.js → plugin-registry-B43UosQh.js} +3 -3
- package/dist/{plugin-registry-Tlmjr-LX.js → plugin-registry-CS4WgHbu.js} +1 -1
- package/dist/plugin-sdk/gateway/protocol/schema/logs-chat.d.ts +1 -1
- package/dist/plugin-sdk/infra/symframe-broadcast.d.ts +18 -6
- package/dist/{plugins-cli-CRKD8aho.js → plugins-cli-BV2wbjfI.js} +54 -54
- package/dist/{plugins-cli-Cm0G_-Y5.js → plugins-cli-BY42hyHP.js} +7 -7
- package/dist/{ports-r7LBic2V.js → ports-Bi3V_3n9.js} +1 -1
- package/dist/{ports-gxLM5ahL.js → ports-CB_Iu83U.js} +2 -2
- package/dist/{program-DEmAlwmD.js → program-P9F1DxBa.js} +12 -12
- package/dist/{program-context-DRCRbDpu.js → program-context-BmXxHUKe.js} +40 -40
- package/dist/{prompt-select-styled-pomsR-zf.js → prompt-select-styled-B2ah467m.js} +7 -7
- package/dist/{prompt-select-styled-B41Tx9aC.js → prompt-select-styled-BlQZX6pK.js} +38 -38
- package/dist/{provider-auth-helpers-rKWs_r7a.js → provider-auth-helpers-Bgb_Bfp9.js} +1 -1
- package/dist/{provider-auth-helpers-CdQwOam7.js → provider-auth-helpers-WLwb6tL4.js} +6 -6
- package/dist/{push-apns-eCM0qmrY.js → push-apns-CBGvXev_.js} +4 -4
- package/dist/{push-apns-CZPUHftn.js → push-apns-DnSCjFu7.js} +1 -1
- package/dist/{pw-ai-BiBvIJzd.js → pw-ai-CP5pn3eU.js} +7 -7
- package/dist/{pw-ai-DOAsQ5NX.js → pw-ai-v__CyAlM.js} +1 -1
- package/dist/{qmd-manager-C8-M4Pru.js → qmd-manager-Dxyue7B1.js} +19 -19
- package/dist/{qr-cli-1sCVaPcF.js → qr-cli-DHw6muwK.js} +3 -3
- package/dist/{register.agent-BQPvYYdn.js → register.agent-BuEcmVg0.js} +12 -12
- package/dist/{register.agent-N1hoqMFR.js → register.agent-CXdTiqyP.js} +67 -67
- package/dist/{register.configure-BHHZ44xB.js → register.configure-DVcn-gCO.js} +70 -70
- package/dist/{register.configure-BAc3P4Z-.js → register.configure-YDKJ-KQg.js} +14 -14
- package/dist/{register.maintenance-lX0a3Hzl.js → register.maintenance-BiGvpEj-.js} +13 -13
- package/dist/{register.maintenance-DDgy5Iyy.js → register.maintenance-cpspl8D6.js} +67 -67
- package/dist/{register.message-Br-IH_0z.js → register.message-BIuLbESM.js} +7 -7
- package/dist/{register.message-B4lDhHpE.js → register.message-BjcYy5UG.js} +47 -47
- package/dist/{register.onboard-B-GoYJIc.js → register.onboard-C4vIASed.js} +6 -6
- package/dist/{register.onboard-Bv0s2_KV.js → register.onboard-D4RN92s2.js} +25 -25
- package/dist/{register.setup-DQ6KLkAI.js → register.setup-BvoXF0xl.js} +28 -28
- package/dist/{register.setup-4lNdC98i.js → register.setup-D-Jt2e1d.js} +6 -6
- package/dist/{register.status-health-sessions-Cg7bK5K2.js → register.status-health-sessions-BY9hMD1s.js} +8 -8
- package/dist/{register.status-health-sessions-ByGn71_M.js → register.status-health-sessions-DjDvCXBn.js} +41 -41
- package/dist/{register.subclis-FMlcLBX0.js → register.subclis-Cibmeapc.js} +20 -20
- package/dist/{replies-CbXXjn9X.js → replies-B_3j7R_Q.js} +1 -1
- package/dist/{reply-prefix-BFNeXT65.js → reply-prefix-CtZtkTJK.js} +1 -1
- package/dist/{resolve-route-C1IIA6kH.js → resolve-route-Du0VftVs.js} +1 -1
- package/dist/{routes-ivqbutvM.js → routes-BwTUoI5h.js} +10 -10
- package/dist/{rpc-Dk1Az_d8.js → rpc-BnAKPQDB.js} +1 -1
- package/dist/{rpc-JAmDaTYt.js → rpc-CwxSZZOx.js} +1 -1
- package/dist/{run-main-DSyeVDsT.js → run-main-BhEQjKtM.js} +20 -20
- package/dist/{sandbox-BkznAPKO.js → sandbox-CZGTCone.js} +18 -18
- package/dist/{sandbox-cli-Bb9cBtBH.js → sandbox-cli-DEtGT_4y.js} +13 -13
- package/dist/{security-cli-DmgGLP83.js → security-cli-CS-ZT1LE.js} +3 -3
- package/dist/{security-cli-D47LQbpf.js → security-cli-DJd7Fcdy.js} +29 -29
- package/dist/{send-B0jHSNMF.js → send-CxjvucMO.js} +7 -7
- package/dist/{server-context-ChcbJgNo.js → server-context-DXdk410X.js} +5 -5
- package/dist/{server-methods-DGBBt49x.js → server-methods-CWxr5b-w.js} +19 -13
- package/dist/{server-methods-BkHB2MOW.js → server-methods-DfVfzYqq.js} +68 -62
- package/dist/{server-node-events-C186LRm0.js → server-node-events-B0yC6hi1.js} +48 -48
- package/dist/{server-node-events-D-Akk3uq.js → server-node-events-ClDEcUTJ.js} +8 -8
- package/dist/{service-e6MzlLCd.js → service-CRZoXO_n.js} +15 -15
- package/dist/{session-dirs-C9E2G0yZ.js → session-dirs-a00Ad2SO.js} +2 -2
- package/dist/{session-utils-Cs1jlD-q.js → session-utils-CJhcRx3E.js} +14 -14
- package/dist/{sessions-Dxf5Kjig.js → sessions-BCc3THTm.js} +10 -10
- package/dist/{shared-1xPo9ygd.js → shared-C39SiDDJ.js} +1 -1
- package/dist/{shared-COtpr3Ad.js → shared-Dh-O8nRd.js} +3 -3
- package/dist/{skill-commands-DDGGlq68.js → skill-commands-DWvXs3lz.js} +4 -4
- package/dist/{skill-scanner-BCgVcIwi.js → skill-scanner-CIlHPszT.js} +5 -5
- package/dist/{skills-BwDmcZdt.js → skills-CYcBtLGH.js} +4 -4
- package/dist/{skills-cli-B-7TY-vS.js → skills-cli-CD9s3cgm.js} +7 -7
- package/dist/{skills-install-Dwzsjoc8.js → skills-install-BTa9IuQ6.js} +3 -3
- package/dist/{skills-remote-bz71Bstn.js → skills-remote-BcRQTDsZ.js} +3 -3
- package/dist/{skills-status-BKX1PjCc.js → skills-status-DLnCHUZ2.js} +1 -1
- package/dist/{sqlite-Cod7C5ba.js → sqlite-BpogPlQW.js} +5 -5
- package/dist/{status-CFgCSaDq.js → status-BWxLtb3D.js} +23 -23
- package/dist/{status-poPDyC8O.js → status-Doq8T1zj.js} +3 -3
- package/dist/{status-Bahhq7OQ.js → status-K1k4g3Ai.js} +1 -1
- package/dist/{status-D9LC5P_Y.js → status-ojZB_Lrf.js} +5 -5
- package/dist/{status.update-DGJi0OLl.js → status.update-CKfyV6zw.js} +3 -3
- package/dist/{subagent-registry-V2o45tIn.js → subagent-registry-BOt7g9hn.js} +21 -10
- package/dist/{symframe-cli-bxdpivve.js → symframe-cli-CrUtJw_7.js} +31 -7
- package/dist/{symframe-cli-ppdMo15M.js → symframe-cli-D1CtN3pf.js} +37 -13
- package/dist/{symi-root-BQ0IpoW2.js → symi-root-DeCVdZB4.js} +2 -2
- package/dist/{synthesis-B2EyHFXy.js → synthesis-BIQLrbys.js} +6 -6
- package/dist/{synthesis-C2WbvLOI.js → synthesis-D91XE0n4.js} +2 -2
- package/dist/{synthesis-DGau1ONT.js → synthesis-DuP2d469.js} +4 -4
- package/dist/{synthesis-CPSq83PP.js → synthesis-VZNnlUTf.js} +45 -45
- package/dist/{system-cli-nPyjUPBH.js → system-cli-CvN-Wq9U.js} +3 -3
- package/dist/{system-cli-BroqLjZ6.js → system-cli-r7WJj0Xh.js} +7 -7
- package/dist/{systemd-CUIM0n5P.js → systemd-CsoVnIbM.js} +5 -5
- package/dist/{systemd-hints-CsrzMCTD.js → systemd-hints-QISwLlFU.js} +6 -6
- package/dist/{systemd-linger-BzYk7A6M.js → systemd-linger-BnhuRdbt.js} +1 -1
- package/dist/{tui-Bp9k5skv.js → tui-BxgdImL_.js} +2 -2
- package/dist/{tui-DzROrE20.js → tui-J7Jxp-FF.js} +7 -7
- package/dist/{tui-cli-BHBF8O-3.js → tui-cli-DR48dU_C.js} +19 -19
- package/dist/{tui-cli-Dv4hBFdc.js → tui-cli-DqvgN5ng.js} +3 -3
- package/dist/{unified-runner-CIQIkbvi.js → unified-runner-CdJx7yN8.js} +25 -9
- package/dist/{unified-runner-CduaBH_0.js → unified-runner-DXjH-prv.js} +117 -106
- package/dist/{update-yYduAjKd.js → update-Cb0Fmxic.js} +3 -3
- package/dist/{update-check-BCL_K7kx.js → update-check-u6Jgr1cz.js} +5 -5
- package/dist/{update-cli-WcLxjBiY.js → update-cli-CKpjWtlv.js} +77 -77
- package/dist/{update-cli-BKnHBe8a.js → update-cli-Dn6QQZLd.js} +14 -14
- package/dist/{update-runner-BLV8SI96.js → update-runner-G2YgEATs.js} +15 -15
- package/dist/{webhooks-cli-D5k-Y2A8.js → webhooks-cli-DjUITimx.js} +4 -4
- package/dist/{with-timeout-DPR4A2dx.js → with-timeout-CLrF-Yr_.js} +1 -1
- package/dist/{workspace-dirs-jKFQf7of.js → workspace-dirs-DCICLTHx.js} +1 -1
- package/dist/{wsl-CglTdtlb.js → wsl-DTi7eX-V.js} +2 -2
- package/extensions/memory-core/package.json +1 -1
- package/extensions/msteams/CHANGELOG.md +12 -0
- package/extensions/msteams/package.json +1 -1
- package/extensions/open-prose/package.json +1 -1
- package/extensions/outlook/package.json +1 -1
- package/extensions/slack/package.json +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
// ── Symframe AWAITING surface ───────────────────────────────────────────────
|
|
2
|
+
// Stage C of the Dynamic Glass Panel arc — see ~/Documents/dynamic-glass-panel.md.
|
|
3
|
+
//
|
|
4
|
+
// The AWAITING surface is a footer inside the symframe that merges
|
|
5
|
+
// in-flight sub-agents and scheduled cron jobs into a single list —
|
|
6
|
+
// one mental concept: "things that aren't done yet."
|
|
7
|
+
//
|
|
8
|
+
// Sort order:
|
|
9
|
+
// 1. In-flight sub-agents first, sorted by start time (descending —
|
|
10
|
+
// most-recently-started visible at the top)
|
|
11
|
+
// 2. Then scheduled jobs sorted by next ETA (soonest first)
|
|
12
|
+
//
|
|
13
|
+
// Data flow:
|
|
14
|
+
// subagents.js + scheduling.js dispatch CustomEvents after each
|
|
15
|
+
// successful poll fetch. The AWAITING surface listens to both events
|
|
16
|
+
// and re-renders the merged list. No duplicate polling — single
|
|
17
|
+
// source of truth per data type.
|
|
18
|
+
//
|
|
19
|
+
// Click handlers:
|
|
20
|
+
// - Sub-agent row → no-op for now (subagents.list returns enough
|
|
21
|
+
// info to display, but there's no per-subagent detail modal yet;
|
|
22
|
+
// future enhancement: open a side view with the subagent transcript)
|
|
23
|
+
// - Schedule row → opens the existing schedule edit modal via
|
|
24
|
+
// window.schedulingPanel.openForEdit(job)
|
|
25
|
+
// - Schedule toggle → window.schedulingPanel.toggle(jobId)
|
|
26
|
+
// - [+ Add] → small menu: "Spawn subagent" / "Add scheduled task"
|
|
27
|
+
// → opens the corresponding existing modal.
|
|
28
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
29
|
+
|
|
30
|
+
"use strict";
|
|
31
|
+
|
|
32
|
+
(function () {
|
|
33
|
+
const root = document.getElementById("symframe-awaiting");
|
|
34
|
+
if (!root) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const list = document.getElementById("awaiting-list");
|
|
38
|
+
const countEl = document.getElementById("awaiting-count");
|
|
39
|
+
const addBtn = document.getElementById("awaiting-add-btn");
|
|
40
|
+
const addMenu = document.getElementById("awaiting-add-menu");
|
|
41
|
+
|
|
42
|
+
// ── State ──
|
|
43
|
+
let subagents = [];
|
|
44
|
+
let schedules = [];
|
|
45
|
+
|
|
46
|
+
// ── DOM helpers ──
|
|
47
|
+
function escHtml(s) {
|
|
48
|
+
return String(s ?? "")
|
|
49
|
+
.replace(/&/g, "&")
|
|
50
|
+
.replace(/</g, "<")
|
|
51
|
+
.replace(/>/g, ">")
|
|
52
|
+
.replace(/"/g, """)
|
|
53
|
+
.replace(/'/g, "'");
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// ── Formatters ──
|
|
57
|
+
function formatRuntime(sub) {
|
|
58
|
+
const start = sub.startedAt;
|
|
59
|
+
const end = sub.endedAt || Date.now();
|
|
60
|
+
if (!start) {
|
|
61
|
+
return "--";
|
|
62
|
+
}
|
|
63
|
+
const seconds = Math.floor((end - start) / 1000);
|
|
64
|
+
if (seconds < 60) {
|
|
65
|
+
return `${seconds}s`;
|
|
66
|
+
}
|
|
67
|
+
const minutes = Math.floor(seconds / 60);
|
|
68
|
+
const secs = seconds % 60;
|
|
69
|
+
if (minutes < 60) {
|
|
70
|
+
return `${minutes}m${secs > 0 ? secs + "s" : ""}`;
|
|
71
|
+
}
|
|
72
|
+
const hours = Math.floor(minutes / 60);
|
|
73
|
+
const mins = minutes % 60;
|
|
74
|
+
return `${hours}h${mins}m`;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function formatEta(nextRunAtMs) {
|
|
78
|
+
if (!nextRunAtMs) {
|
|
79
|
+
return "—";
|
|
80
|
+
}
|
|
81
|
+
const ms = nextRunAtMs - Date.now();
|
|
82
|
+
if (ms <= 0) {
|
|
83
|
+
return "now";
|
|
84
|
+
}
|
|
85
|
+
const minutes = Math.floor(ms / 60_000);
|
|
86
|
+
if (minutes < 1) {
|
|
87
|
+
return "<1m";
|
|
88
|
+
}
|
|
89
|
+
if (minutes < 60) {
|
|
90
|
+
return `in ${minutes}m`;
|
|
91
|
+
}
|
|
92
|
+
const hours = Math.floor(minutes / 60);
|
|
93
|
+
const mins = minutes % 60;
|
|
94
|
+
if (hours < 24) {
|
|
95
|
+
return mins > 0 ? `in ${hours}h ${mins}m` : `in ${hours}h`;
|
|
96
|
+
}
|
|
97
|
+
const days = Math.floor(hours / 24);
|
|
98
|
+
const hrs = hours % 24;
|
|
99
|
+
return hrs > 0 ? `in ${days}d ${hrs}h` : `in ${days}d`;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// ── Item builders ──
|
|
103
|
+
function buildSubagentRow(sub) {
|
|
104
|
+
const item = document.createElement("div");
|
|
105
|
+
item.className = "awaiting-item awaiting-item-subagent";
|
|
106
|
+
item.dataset.runId = sub.runId || "";
|
|
107
|
+
const label = sub.label || "Subagent";
|
|
108
|
+
const status = sub.status === "active" || !sub.endedAt ? "running" : sub.status;
|
|
109
|
+
const right = status === "running" ? formatRuntime(sub) : status;
|
|
110
|
+
item.innerHTML = `
|
|
111
|
+
<span class="awaiting-glyph awaiting-glyph-subagent">◆</span>
|
|
112
|
+
<span class="awaiting-label">${escHtml(label)}</span>
|
|
113
|
+
<span class="awaiting-meta">${escHtml(right)}</span>
|
|
114
|
+
`;
|
|
115
|
+
return item;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function buildScheduleRow(job) {
|
|
119
|
+
const item = document.createElement("div");
|
|
120
|
+
item.className = "awaiting-item awaiting-item-schedule";
|
|
121
|
+
if (!job.enabled) {
|
|
122
|
+
item.classList.add("awaiting-item-disabled");
|
|
123
|
+
}
|
|
124
|
+
item.dataset.scheduleId = job.id || "";
|
|
125
|
+
item.tabIndex = 0;
|
|
126
|
+
item.setAttribute("role", "button");
|
|
127
|
+
const name = job.name || "Unnamed";
|
|
128
|
+
const eta = job.enabled ? formatEta(job.state?.nextRunAtMs) : "off";
|
|
129
|
+
item.innerHTML = `
|
|
130
|
+
<span class="awaiting-glyph awaiting-glyph-schedule" data-action="toggle" title="${job.enabled ? "Disable" : "Enable"}">⏱</span>
|
|
131
|
+
<span class="awaiting-label">${escHtml(name)}</span>
|
|
132
|
+
<span class="awaiting-meta">${escHtml(eta)}</span>
|
|
133
|
+
`;
|
|
134
|
+
// Toggle on the glyph; edit modal on the row.
|
|
135
|
+
item.addEventListener("click", (e) => {
|
|
136
|
+
if (e.target instanceof Element && e.target.dataset.action === "toggle") {
|
|
137
|
+
e.stopPropagation();
|
|
138
|
+
if (typeof window.schedulingPanel?.toggle === "function") {
|
|
139
|
+
void window.schedulingPanel.toggle(job.id);
|
|
140
|
+
}
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
if (typeof window.schedulingPanel?.openForEdit === "function") {
|
|
144
|
+
window.schedulingPanel.openForEdit(job);
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
item.addEventListener("keydown", (e) => {
|
|
148
|
+
if (e.key === "Enter" || e.key === " ") {
|
|
149
|
+
e.preventDefault();
|
|
150
|
+
if (typeof window.schedulingPanel?.openForEdit === "function") {
|
|
151
|
+
window.schedulingPanel.openForEdit(job);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
return item;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// ── Render ──
|
|
159
|
+
// Stage C.1 fix: the AWAITING footer is ALWAYS visible — it's a
|
|
160
|
+
// permanent part of the panel's identity (matches the §5 spec
|
|
161
|
+
// "always-present footer"). When nothing's pending, an empty-state
|
|
162
|
+
// placeholder appears so the user always sees the surface, the
|
|
163
|
+
// [+ Add] button, and the implicit "this is where deferred work
|
|
164
|
+
// shows up" affordance.
|
|
165
|
+
function render() {
|
|
166
|
+
const activeSubagents = subagents
|
|
167
|
+
.filter((s) => s.status === "active" || !s.endedAt)
|
|
168
|
+
.toSorted((a, b) => (b.startedAt || 0) - (a.startedAt || 0));
|
|
169
|
+
|
|
170
|
+
const sortedSchedules = schedules.toSorted((a, b) => {
|
|
171
|
+
// Enabled first; then by next ETA ascending; disabled tail
|
|
172
|
+
if (a.enabled !== b.enabled) {
|
|
173
|
+
return b.enabled ? 1 : -1;
|
|
174
|
+
}
|
|
175
|
+
return (a.state?.nextRunAtMs || Infinity) - (b.state?.nextRunAtMs || Infinity);
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
const totalActive = activeSubagents.length + sortedSchedules.filter((s) => s.enabled).length;
|
|
179
|
+
|
|
180
|
+
// Count badge: "N active" (in-flight subagents + enabled schedules)
|
|
181
|
+
// or "idle" when nothing's pending.
|
|
182
|
+
if (countEl) {
|
|
183
|
+
if (totalActive === 0) {
|
|
184
|
+
countEl.textContent = "idle";
|
|
185
|
+
} else {
|
|
186
|
+
const subPart =
|
|
187
|
+
activeSubagents.length > 0
|
|
188
|
+
? `${activeSubagents.length} sub${activeSubagents.length !== 1 ? "s" : ""}`
|
|
189
|
+
: null;
|
|
190
|
+
const schedPart =
|
|
191
|
+
sortedSchedules.filter((s) => s.enabled).length > 0
|
|
192
|
+
? `${sortedSchedules.filter((s) => s.enabled).length} job${sortedSchedules.filter((s) => s.enabled).length !== 1 ? "s" : ""}`
|
|
193
|
+
: null;
|
|
194
|
+
countEl.textContent = [subPart, schedPart].filter(Boolean).join(" · ");
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
if (!list) {
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
list.innerHTML = "";
|
|
202
|
+
if (activeSubagents.length === 0 && sortedSchedules.length === 0) {
|
|
203
|
+
const empty = document.createElement("div");
|
|
204
|
+
empty.className = "awaiting-empty";
|
|
205
|
+
empty.textContent = "Nothing pending — use [+ Add] to spawn a subagent or schedule a task.";
|
|
206
|
+
list.appendChild(empty);
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
for (const sub of activeSubagents) {
|
|
210
|
+
list.appendChild(buildSubagentRow(sub));
|
|
211
|
+
}
|
|
212
|
+
for (const job of sortedSchedules) {
|
|
213
|
+
list.appendChild(buildScheduleRow(job));
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
// ── Add menu ──
|
|
218
|
+
let addMenuOpen = false;
|
|
219
|
+
|
|
220
|
+
function openAddMenu() {
|
|
221
|
+
if (!addMenu || !addBtn) {
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
addMenuOpen = true;
|
|
225
|
+
addMenu.hidden = false;
|
|
226
|
+
addBtn.setAttribute("aria-expanded", "true");
|
|
227
|
+
document.addEventListener("click", onOutsideClickAddMenu, true);
|
|
228
|
+
document.addEventListener("keydown", onAddMenuKey);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
function closeAddMenu() {
|
|
232
|
+
if (!addMenu || !addBtn) {
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
addMenuOpen = false;
|
|
236
|
+
addMenu.hidden = true;
|
|
237
|
+
addBtn.setAttribute("aria-expanded", "false");
|
|
238
|
+
document.removeEventListener("click", onOutsideClickAddMenu, true);
|
|
239
|
+
document.removeEventListener("keydown", onAddMenuKey);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
function onOutsideClickAddMenu(e) {
|
|
243
|
+
if (!addMenu || !addBtn) {
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
if (e.target instanceof Node) {
|
|
247
|
+
if (addMenu.contains(e.target) || addBtn.contains(e.target)) {
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
closeAddMenu();
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
function onAddMenuKey(e) {
|
|
255
|
+
if (e.key === "Escape") {
|
|
256
|
+
closeAddMenu();
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
// ── Init ──
|
|
261
|
+
function init() {
|
|
262
|
+
window.addEventListener("symi:subagents-updated", (e) => {
|
|
263
|
+
subagents = e.detail?.subagents || [];
|
|
264
|
+
render();
|
|
265
|
+
});
|
|
266
|
+
window.addEventListener("symi:schedules-updated", (e) => {
|
|
267
|
+
schedules = e.detail?.schedules || [];
|
|
268
|
+
render();
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
if (addBtn) {
|
|
272
|
+
addBtn.addEventListener("click", (e) => {
|
|
273
|
+
e.stopPropagation();
|
|
274
|
+
if (addMenuOpen) {
|
|
275
|
+
closeAddMenu();
|
|
276
|
+
} else {
|
|
277
|
+
openAddMenu();
|
|
278
|
+
}
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
if (addMenu) {
|
|
282
|
+
addMenu.addEventListener("click", (e) => {
|
|
283
|
+
const target = e.target instanceof Element ? e.target.closest("[data-add]") : null;
|
|
284
|
+
if (!target) {
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
const which = target.getAttribute("data-add");
|
|
288
|
+
closeAddMenu();
|
|
289
|
+
if (which === "subagent" && typeof window.subagentsPanel?.open === "function") {
|
|
290
|
+
window.subagentsPanel.open();
|
|
291
|
+
} else if (which === "schedule" && typeof window.schedulingPanel?.open === "function") {
|
|
292
|
+
window.schedulingPanel.open();
|
|
293
|
+
}
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
// First paint
|
|
298
|
+
render();
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
if (document.readyState === "loading") {
|
|
302
|
+
document.addEventListener("DOMContentLoaded", init);
|
|
303
|
+
} else {
|
|
304
|
+
init();
|
|
305
|
+
}
|
|
306
|
+
})();
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
// ── Symframe Pin Store ──────────────────────────────────────────────────────
|
|
2
|
+
// Stage C of the Dynamic Glass Panel arc — see ~/Documents/dynamic-glass-panel.md §9.3.
|
|
3
|
+
//
|
|
4
|
+
// Per-browser pin persistence via localStorage. Pinned cards survive
|
|
5
|
+
// page reload, /new, and gateway reconnect — they are user-curated
|
|
6
|
+
// state, not agent-pushed state.
|
|
7
|
+
//
|
|
8
|
+
// Storage shape:
|
|
9
|
+
// localStorage["symi:symframe:pins"] = JSON.stringify({
|
|
10
|
+
// version: 1,
|
|
11
|
+
// pins: [
|
|
12
|
+
// { id, card: {...}, pinnedAt: <ms> },
|
|
13
|
+
// ...
|
|
14
|
+
// ]
|
|
15
|
+
// })
|
|
16
|
+
//
|
|
17
|
+
// `card` is a snapshot of the card at pin time — frozen content. A
|
|
18
|
+
// dynamic card whose content changes after pinning will keep the
|
|
19
|
+
// pinned-time snapshot in the registry on next reload (intentional;
|
|
20
|
+
// the user pinned what they saw).
|
|
21
|
+
//
|
|
22
|
+
// Public API (window.symframePinStore):
|
|
23
|
+
// list() — snapshot of all pinned card records
|
|
24
|
+
// pin(card) — write a card to localStorage (idempotent on id)
|
|
25
|
+
// unpin(id) — remove a card from localStorage by id
|
|
26
|
+
// isPinned(id) — boolean check
|
|
27
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
28
|
+
|
|
29
|
+
"use strict";
|
|
30
|
+
|
|
31
|
+
(function () {
|
|
32
|
+
const KEY = "symi:symframe:pins";
|
|
33
|
+
const VERSION = 1;
|
|
34
|
+
|
|
35
|
+
function readStore() {
|
|
36
|
+
try {
|
|
37
|
+
const raw = localStorage.getItem(KEY);
|
|
38
|
+
if (!raw) {
|
|
39
|
+
return { version: VERSION, pins: [] };
|
|
40
|
+
}
|
|
41
|
+
const parsed = JSON.parse(raw);
|
|
42
|
+
if (!parsed || typeof parsed !== "object" || !Array.isArray(parsed.pins)) {
|
|
43
|
+
return { version: VERSION, pins: [] };
|
|
44
|
+
}
|
|
45
|
+
return parsed;
|
|
46
|
+
} catch (err) {
|
|
47
|
+
console.warn("[symframe-pin-store] read failed; resetting:", err);
|
|
48
|
+
return { version: VERSION, pins: [] };
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function writeStore(store) {
|
|
53
|
+
try {
|
|
54
|
+
localStorage.setItem(KEY, JSON.stringify(store));
|
|
55
|
+
} catch (err) {
|
|
56
|
+
console.warn("[symframe-pin-store] write failed:", err);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function list() {
|
|
61
|
+
return readStore().pins;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function pin(card) {
|
|
65
|
+
if (!card || typeof card !== "object" || !card.id) {
|
|
66
|
+
console.warn("[symframe-pin-store] pin: card missing id");
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
const store = readStore();
|
|
70
|
+
const existing = store.pins.findIndex((p) => p.id === card.id);
|
|
71
|
+
const record = {
|
|
72
|
+
id: card.id,
|
|
73
|
+
card: { ...card, pinned: true },
|
|
74
|
+
pinnedAt: Date.now(),
|
|
75
|
+
};
|
|
76
|
+
if (existing >= 0) {
|
|
77
|
+
store.pins[existing] = record;
|
|
78
|
+
} else {
|
|
79
|
+
store.pins.push(record);
|
|
80
|
+
}
|
|
81
|
+
writeStore(store);
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function unpin(id) {
|
|
86
|
+
if (!id) {
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
const store = readStore();
|
|
90
|
+
const before = store.pins.length;
|
|
91
|
+
store.pins = store.pins.filter((p) => p.id !== id);
|
|
92
|
+
if (store.pins.length === before) {
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
writeStore(store);
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function isPinned(id) {
|
|
100
|
+
return readStore().pins.some((p) => p.id === id);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
window.symframePinStore = { list, pin, unpin, isPinned };
|
|
104
|
+
})();
|
|
@@ -46,14 +46,18 @@
|
|
|
46
46
|
// ── Decay tiers ─────────────────────────────────────────────────────
|
|
47
47
|
// Each entry carries dataset.createdAt; the tick reads its age and
|
|
48
48
|
// looks up the matching tier. Tiers are evaluated in order; first
|
|
49
|
-
// match (age < maxAge) wins.
|
|
50
|
-
//
|
|
49
|
+
// match (age < maxAge) wins.
|
|
50
|
+
//
|
|
51
|
+
// Stage C.1 revision: the original aggressive curve faded entries to
|
|
52
|
+
// 8% opacity + 6px blur (effectively invisible) after 10 minutes.
|
|
53
|
+
// Users perceived the substrate as "fading to nothing." The new
|
|
54
|
+
// curve keeps content readable at every age — older entries dim and
|
|
55
|
+
// shrink slightly but stay legible. No texture-mode collapse.
|
|
51
56
|
const DECAY_TIERS = [
|
|
52
|
-
{ maxAge:
|
|
53
|
-
{ maxAge:
|
|
54
|
-
{ maxAge:
|
|
55
|
-
{ maxAge:
|
|
56
|
-
{ maxAge: Infinity, opacity: 0.08, blur: 6, scale: 0.94, texture: true },
|
|
57
|
+
{ maxAge: 60_000, opacity: 1.0, blur: 0, scale: 1.0, texture: false }, // 0-1min sharp
|
|
58
|
+
{ maxAge: 300_000, opacity: 0.9, blur: 0, scale: 1.0, texture: false }, // 1-5min slight dim
|
|
59
|
+
{ maxAge: 1_800_000, opacity: 0.7, blur: 1, scale: 1.0, texture: false }, // 5-30min readable
|
|
60
|
+
{ maxAge: Infinity, opacity: 0.5, blur: 2, scale: 0.98, texture: false }, // 30min+ floor
|
|
57
61
|
];
|
|
58
62
|
|
|
59
63
|
const DECAY_TICK_MS = 1000;
|