sliccy 6.154.6 → 6.155.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.
- package/README.md +1 -1
- package/dist/ui/.vite/manifest.json +186 -186
- package/dist/ui/assets/GELATIERE-CRe0rWjK.js +1 -0
- package/dist/ui/assets/SKILL-B--riEXN.js +1 -0
- package/dist/ui/assets/{SKILL-Cc0Ep86w.js → SKILL-C3909YTo.js} +1 -1
- package/dist/ui/assets/SKILL-CLKK9YsR.js +1 -0
- package/dist/ui/assets/{account-store-6WG1S7Pm.js → account-store-BL68LrFT.js} +1 -1
- package/dist/ui/assets/{account-store-DZSDFGiY.js → account-store-FUhuBOfI.js} +1 -1
- package/dist/ui/assets/{adobe-DqY2BLDZ.js → adobe-BaHLL9uH.js} +1 -1
- package/dist/ui/assets/{adobe-CSD_HLUo.js → adobe-DNHcSDh3.js} +1 -1
- package/dist/ui/assets/{agent-bridge-D50e_bCg.js → agent-bridge-Vz3IOG0A.js} +1 -1
- package/dist/ui/assets/{agent-panels-CQCFuU0F.js → agent-panels-CPSe8uIz.js} +1 -1
- package/dist/ui/assets/{apply-layout-DpwYWyCv.js → apply-layout-G6vw7FBS.js} +1 -1
- package/dist/ui/assets/{approver-agent-BA3dC9Lg.js → approver-agent-CCkU0PVa.js} +1 -1
- package/dist/ui/assets/{apps-Cvv2F8Zd.js → apps-CLm3AutR.js} +1 -1
- package/dist/ui/assets/{azure-openai-BMHNq52P.js → azure-openai--n3vcQWx.js} +1 -1
- package/dist/ui/assets/{azure-openai-BoKUNg3s.js → azure-openai-N9FaZSuP.js} +1 -1
- package/dist/ui/assets/{budget-usage-source-CxT001UE.js → budget-usage-source-C6vq4Afr.js} +1 -1
- package/dist/ui/assets/{cdp-DyVyxM9p.js → cdp-C7C40sWI.js} +1 -1
- package/dist/ui/assets/{cerebras-BGCRJNZL.js → cerebras-B4z1b7WX.js} +1 -1
- package/dist/ui/assets/{cerebras-Bvb3XQZL.js → cerebras-BecGzlaM.js} +1 -1
- package/dist/ui/assets/{composer-speech-CpHom6zE.js → composer-speech-uDoOk80y.js} +1 -1
- package/dist/ui/assets/{connect-surface-CPqNKSpt.js → connect-surface-CkYbO0v8.js} +1 -1
- package/dist/ui/assets/{directed-approval-Ce8FHRYj.js → directed-approval-DdGH8Fat.js} +1 -1
- package/dist/ui/assets/dist-BCg-GYyx.js +2 -0
- package/dist/ui/assets/dist-ByarBBEi.js +2 -0
- package/dist/ui/assets/{dist-BPPG9gF6.js → dist-CtH2hxRt.js} +9 -9
- package/dist/ui/assets/{dist-BnmWpUNI.js → dist-VS1DwNvU.js} +10 -10
- package/dist/ui/assets/{fs-BV6duUqj.js → fs-BOdMXcsi.js} +2 -2
- package/dist/ui/assets/fs-CL93DUyC.js +1 -0
- package/dist/ui/assets/gelatiere-store-DA2wk9nw.js +1 -0
- package/dist/ui/assets/{gelatiere-unit-Dem3bPJm.js → gelatiere-unit-DnbLwJqw.js} +1 -1
- package/dist/ui/assets/{github-BK9qY3Dp.js → github-CQwdOEdJ.js} +2 -2
- package/dist/ui/assets/{github-J67ogl3l.js → github-FRM6nHar.js} +1 -1
- package/dist/ui/assets/{github-auth-DFK3fTyP.js → github-auth-DgdBb7y7.js} +1 -1
- package/dist/ui/assets/{github-copilot-utdlw5T2.js → github-copilot-CNY2SweM.js} +1 -1
- package/dist/ui/assets/{github-copilot-BD3tCMhs.js → github-copilot-D6XJxicV.js} +1 -1
- package/dist/ui/assets/{github-install-CG84acvy.js → github-install-PNSinMst.js} +1 -1
- package/dist/ui/assets/{github-zip-Dei-4lGa.js → github-zip-BCXSTlT0.js} +1 -1
- package/dist/ui/assets/{hear-gYxFkxil.js → hear-DAaE31Ez.js} +1 -1
- package/dist/ui/assets/{help-dNszPyQ5.js → help-HkZtBCNF.js} +1 -1
- package/dist/ui/assets/icons-Ce7Vz89o.js +1 -0
- package/dist/ui/assets/{js-realm-worker-Bnl_qf6X.js → js-realm-worker-Bp1ohy2N.js} +1 -1
- package/dist/ui/assets/{kernel-worker-XuXyPE5D.js → kernel-worker-dGdJLKhc.js} +608 -604
- package/dist/ui/assets/{local-llm-55U-3pMU.js → local-llm-BKrrjR68.js} +1 -1
- package/dist/ui/assets/{local-llm-BHYcxEqH.js → local-llm-BL_WYiZZ.js} +1 -1
- package/dist/ui/assets/{main-DyuWfD9Q.js → main-DW-YS69h.js} +3 -3
- package/dist/ui/assets/{main-cherry-BzM_BqPA.js → main-cherry-B0AQVdvI.js} +1 -1
- package/dist/ui/assets/{memory-curation-seam-gS_uRoYt.js → memory-curation-seam-CD-ZRKzr.js} +1 -1
- package/dist/ui/assets/migrate-scoop-sudoers-PBnz9AA3.js +1 -0
- package/dist/ui/assets/{mount-Drfr_j4Q.js → mount-DlOEB7Cf.js} +1 -1
- package/dist/ui/assets/{mount-CvjPMVSw.js → mount-igEB5Saa.js} +3 -3
- package/dist/ui/assets/{mount-recovery-Be7iHZMh.js → mount-recovery-WObwrrJB.js} +1 -1
- package/dist/ui/assets/{new-session-BiudxW5x.js → new-session-BlbJzLQE.js} +2 -2
- package/dist/ui/assets/{oauth-bootstrap-Ls8bbNTd.js → oauth-bootstrap-DHGSi_vM.js} +2 -2
- package/dist/ui/assets/{onboarding-orchestrator-BjNAi3ha.js → onboarding-orchestrator-ILCQMWeH.js} +1 -1
- package/dist/ui/assets/{openai-codex-DCoZhGOn.js → openai-codex-ByOwob9t.js} +1 -1
- package/dist/ui/assets/{openai-codex-BqHcjWDm.js → openai-codex-zHgcCFMl.js} +1 -1
- package/dist/ui/assets/{openrouter-XQsjur8s.js → openrouter-CvwSbwg3.js} +1 -1
- package/dist/ui/assets/{openrouter-free-CiD2N3nW.js → openrouter-free-Bw5mRfKy.js} +1 -1
- package/dist/ui/assets/{openrouter-free-W8i93TBB.js → openrouter-free-DAXjSSCv.js} +1 -1
- package/dist/ui/assets/{openrouter-oauth-DUHOu5QH.js → openrouter-oauth-CsQP_eqX.js} +1 -1
- package/dist/ui/assets/{openrouter-oauth-C2jnsYYB.js → openrouter-oauth-DKr2TOOt.js} +1 -1
- package/dist/ui/assets/{openrouter-LWCIZWrE.js → openrouter-ooroqv_7.js} +1 -1
- package/dist/ui/assets/{panel-rpc-handlers-DokKsJYg.js → panel-rpc-handlers-g22Ng2gw.js} +2 -2
- package/dist/ui/assets/{panelize-shell-DbP4SDhf.js → panelize-shell-25ZtCwHW.js} +1 -1
- package/dist/ui/assets/{pi-edit-execution-DYRoRikS.js → pi-edit-execution-jG5wiCuj.js} +1 -1
- package/dist/ui/assets/probe-info-B9GqJE41.js +2 -0
- package/dist/ui/assets/{provider-el781haf.js → provider-B0ZPEVNo.js} +2 -2
- package/dist/ui/assets/{provider-B5DqJTXt.js → provider-iX6700HG.js} +1 -1
- package/dist/ui/assets/provider-settings-jhJRRTGA.js +1 -0
- package/dist/ui/assets/provider-store-access-BtES6Ln2.js +1 -0
- package/dist/ui/assets/provider-store-access-z34_fP_u.js +1 -0
- package/dist/ui/assets/{providers-DuCgei7-.js → providers-DAeL97z_.js} +1 -1
- package/dist/ui/assets/{providers-BHgR4i3z.js → providers-DjUwvFlY.js} +2 -2
- package/dist/ui/assets/{quick-llm-BxSQl3MP.js → quick-llm-CM0bq0Rp.js} +1 -1
- package/dist/ui/assets/{recovery-screen-zniAEHuE.js → recovery-screen-C2-cTzHe.js} +1 -1
- package/dist/ui/assets/{remote-terminal-view-BXjdqm7-.js → remote-terminal-view-D4Ah4AQY.js} +1 -1
- package/dist/ui/assets/{run-DnO5hH4e.js → run-2dG-kPkW.js} +1 -1
- package/dist/ui/assets/{run-Dckyjx6-.js → run-BZq150_-.js} +2 -2
- package/dist/ui/assets/run-FqXwpBiQ.js +54 -0
- package/dist/ui/assets/{run-C5mIkEGQ.js → run-wZKGk8f1.js} +1 -1
- package/dist/ui/assets/{session-jsonl-CWhJWPOK.js → session-jsonl-BUM105sQ.js} +1 -1
- package/dist/ui/assets/{setup-feature-flags-remote-qB-mSMUq.js → setup-feature-flags-remote-CYaTMUGI.js} +1 -1
- package/dist/ui/assets/sidecar-repair-Dyo_uNW9.js +1 -0
- package/dist/ui/assets/{silent-renew-backoff-C251JX1S.js → silent-renew-backoff-CMcARSwp.js} +1 -1
- package/dist/ui/assets/skills-BpO1a28c.js +5 -0
- package/dist/ui/assets/slicc-version-pkH5Cy8d.js +1 -0
- package/dist/ui/assets/{snapshot-C2775cOf.js → snapshot-CUbnB6HL.js} +1 -1
- package/dist/ui/assets/{snapshot-features-ChEbT7az.js → snapshot-features-j6dx6n8x.js} +1 -1
- package/dist/ui/assets/{soundscape-dXwPqTJ-.js → soundscape-BswqsuUI.js} +1 -1
- package/dist/ui/assets/{speak-cpgcfooI.js → speak-BjUpeuE_.js} +1 -1
- package/dist/ui/assets/{sprinkle-manager-jd6a2IYN.js → sprinkle-manager--VjyaGhT.js} +1 -1
- package/dist/ui/assets/{sprinkle-renderer-Br7gWsny.js → sprinkle-renderer-DST9wDsJ.js} +1 -1
- package/dist/ui/assets/{state-C1XZTzHt.js → state-D4U_z-EK.js} +1 -1
- package/dist/ui/assets/{store-D0akwt8a.js → store-B8MYU0Oj.js} +1 -1
- package/dist/ui/assets/{store-CxD6rJNd.js → store-DChdcXsg.js} +1 -1
- package/dist/ui/assets/{sudo-Ng9MeLFC.js → sudo-Zjjvq0o1.js} +1 -1
- package/dist/ui/assets/sudoers-BdBYQPUn.js +3 -0
- package/dist/ui/assets/{suggestions-CFQTt8oo.js → suggestions-B34zKgsF.js} +151 -33
- package/dist/ui/assets/{sync-dialog-g9D5_IF8.js → sync-dialog-CQpxesIG.js} +1 -1
- package/dist/ui/assets/{transformers-env-ClNwGCkj.js → transformers-env-Bfs2yK-G.js} +1 -1
- package/dist/ui/assets/{tray-sidecar-B0K5KzF-.js → tray-sidecar-DoJ0KYqF.js} +1 -1
- package/dist/ui/assets/{upgrade-detection-Cz-hPWu6.js → upgrade-detection-BJO1N35I.js} +1 -1
- package/dist/ui/assets/{upskill-lick-skip-Coa1zDvD.js → upskill-lick-skip-ETmK7gKp.js} +1 -1
- package/dist/ui/assets/{voice-reply-BTnXYrYT.js → voice-reply-CxLeD2UU.js} +1 -1
- package/dist/ui/assets/{wc-attach-CjRJwFv_.js → wc-attach-BqTZtL4F.js} +2 -2
- package/dist/ui/assets/{wc-extension-zyJvXHK3.js → wc-extension-C_P8Z5_f.js} +2 -2
- package/dist/ui/assets/{wc-follower-oauth-CIiFOuDi.js → wc-follower-oauth-CqVmKcTQ.js} +1 -1
- package/dist/ui/assets/{wc-follower-Dm1EanME.js → wc-follower-w1PZlnC3.js} +3 -3
- package/dist/ui/assets/{wc-gelatiere-Cy9jod1J.js → wc-gelatiere-ErLykEqr.js} +1 -1
- package/dist/ui/assets/{wc-live-JCXonoSm.js → wc-live-Kx0jpvxz.js} +5 -5
- package/dist/ui/assets/{wc-nav-CRD8N4xt.js → wc-nav-DMxSQWF8.js} +2 -2
- package/dist/ui/assets/{wc-onboarding-BXeb4TbL.js → wc-onboarding-W0FpgTat.js} +2 -2
- package/dist/ui/assets/{wc-permissions-brfCnfZb.js → wc-permissions-BsGMi4OQ.js} +2 -2
- package/dist/ui/assets/{wc-placeholder-BY85O4B6.js → wc-placeholder-CI7UKO4Z.js} +3 -3
- package/dist/ui/assets/{wc-secret-request-yPyZt78A.js → wc-secret-request-DaAszAFd.js} +1 -1
- package/dist/ui/assets/{wc-settings-BHJBZGEl.js → wc-settings-B-FsPgww.js} +3 -3
- package/dist/ui/assets/{wc-shell-CfRSHqBD.js → wc-shell-Bqj2G2_K.js} +4 -4
- package/dist/ui/assets/{wc-shortcut-config-cEwRH43m.js → wc-shortcut-config-B5nHTfK6.js} +1 -1
- package/dist/ui/assets/{wc-shortcuts-C6T4EYNZ.js → wc-shortcuts-Cbk5hDbX.js} +172 -172
- package/dist/ui/assets/{wc-sprinkles-6kq8ChrP.js → wc-sprinkles-DnBxgn1Q.js} +2 -2
- package/dist/ui/assets/{wc-transcript-export-vCgK8B1Y.js → wc-transcript-export-7tvwdvKC.js} +2 -2
- package/dist/ui/assets/{wc-tray-GsvwH8iN.js → wc-tray-DwUCXdrJ.js} +4 -4
- package/dist/ui/assets/welcome-detection-BePZ1gj8.js +1 -0
- package/dist/ui/assets/{whisper-session-C6BRUKHG.js → whisper-session-DoxUb6hK.js} +2 -2
- package/dist/ui/assets/{xai-grok-DlnOMaxU.js → xai-grok-BHDMfFJ3.js} +1 -1
- package/dist/ui/assets/{xai-grok-Bpe_qjy3.js → xai-grok-CIVOagKi.js} +1 -1
- package/dist/ui/index.html +3 -3
- package/dist/ui/lucide-icons.js +182 -179
- package/dist/ui/packages/webapp/index.html +3 -3
- package/package.json +2 -2
- package/dist/ui/assets/GELATIERE-CDj3aVTD.js +0 -1
- package/dist/ui/assets/SKILL-CLF3MdfR.js +0 -1
- package/dist/ui/assets/SKILL-DvHAkJSI.js +0 -117
- package/dist/ui/assets/dist-CFI3XeIO.js +0 -2
- package/dist/ui/assets/dist-Ciikigd5.js +0 -2
- package/dist/ui/assets/fs-DixtpMlv.js +0 -1
- package/dist/ui/assets/gelatiere-store-CcLPnD5F.js +0 -1
- package/dist/ui/assets/icons-D5_bMrnB.js +0 -1
- package/dist/ui/assets/provider-settings-D8F77Xhh.js +0 -1
- package/dist/ui/assets/provider-store-access-Bbm8UQlA.js +0 -1
- package/dist/ui/assets/provider-store-access-DP_iz1Q0.js +0 -1
- package/dist/ui/assets/run-CHF9lHjk.js +0 -46
- package/dist/ui/assets/sidecar-repair-dj57y-8O.js +0 -1
- package/dist/ui/assets/skills-BtA0WqTn.js +0 -5
- package/dist/ui/assets/slicc-version-42Jn19Ww.js +0 -1
- package/dist/ui/assets/sudoers-KgJRnN4b.js +0 -3
- package/dist/ui/assets/welcome-detection-BAEGrqo6.js +0 -1
|
@@ -12,10 +12,15 @@ var e=`<!DOCTYPE html>
|
|
|
12
12
|
<style>
|
|
13
13
|
* { box-sizing: border-box; margin: 0; padding: 0; }
|
|
14
14
|
|
|
15
|
+
/* The stream fills a panel iframe edge to edge, so the GUTTER IS OURS:
|
|
16
|
+
with the \`*\` reset above and no host padding (neither \`.sprinkle-panel\`
|
|
17
|
+
nor \`.msg__dip\` adds any), content without this sits flush against the
|
|
18
|
+
panel's rounded corners. */
|
|
15
19
|
body {
|
|
16
20
|
font-family: var(--s2-font-family, 'Adobe Clean', -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif);
|
|
17
21
|
background: transparent;
|
|
18
22
|
color: var(--s2-content-default, #e8e8e8);
|
|
23
|
+
padding: 14px 18px 20px;
|
|
19
24
|
}
|
|
20
25
|
|
|
21
26
|
/* ── Gelatiere stream ──
|
|
@@ -23,8 +28,10 @@ var e=`<!DOCTYPE html>
|
|
|
23
28
|
stream draws NO boxes of its own — flat entries separated by
|
|
24
29
|
hairlines, one pill button per entry, everything else plain text. */
|
|
25
30
|
#gelatiereStream[hidden] { display: none; }
|
|
26
|
-
|
|
27
|
-
|
|
31
|
+
/* No horizontal padding of their own — \`body\` owns the gutter, so the
|
|
32
|
+
hairline separators run the full width the way a list should. */
|
|
33
|
+
.gelatiere-entry { padding: 18px 0; }
|
|
34
|
+
.gelatiere-entry:first-child { padding-top: 2px; }
|
|
28
35
|
.gelatiere-entry + .gelatiere-entry,
|
|
29
36
|
.gelatiere-done {
|
|
30
37
|
border-top: 1px solid var(--s2-border-subtle, var(--s2-gray-200, #e8e8e8));
|
|
@@ -40,7 +47,11 @@ var e=`<!DOCTYPE html>
|
|
|
40
47
|
line-height: 1.35;
|
|
41
48
|
color: var(--s2-content-default, #e8e8e8);
|
|
42
49
|
}
|
|
43
|
-
|
|
50
|
+
/* \`:is(i, svg)\` because Lucide REPLACES the \`<i data-lucide>\` placeholder
|
|
51
|
+
with an \`<svg width="24" height="24">\` — an \`i\`-only rule stops
|
|
52
|
+
matching the moment the icons render, and every glyph in the panel
|
|
53
|
+
falls back to 24px. */
|
|
54
|
+
.gelatiere-entry__head :is(i, svg) { width: 15px; height: 15px; flex-shrink: 0; }
|
|
44
55
|
.gelatiere-entry__title { flex: 1; }
|
|
45
56
|
.gelatiere-kind {
|
|
46
57
|
font-size: 10px;
|
|
@@ -68,7 +79,7 @@ var e=`<!DOCTYPE html>
|
|
|
68
79
|
font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
|
|
69
80
|
font-size: 11px;
|
|
70
81
|
}
|
|
71
|
-
/* Buttons sit on the right, dialog-style: quiet "
|
|
82
|
+
/* Buttons sit on the right, dialog-style: quiet "Dismiss" beside the
|
|
72
83
|
primary pill. The taken note pushes itself back to the left. */
|
|
73
84
|
.gelatiere-actions {
|
|
74
85
|
display: flex;
|
|
@@ -78,7 +89,7 @@ var e=`<!DOCTYPE html>
|
|
|
78
89
|
margin-top: 12px;
|
|
79
90
|
}
|
|
80
91
|
.gelatiere-actions .gelatiere-taken-note { margin-right: auto; }
|
|
81
|
-
/* "
|
|
92
|
+
/* "Dismiss" is a quiet text button — one pill per entry is plenty. */
|
|
82
93
|
.gelatiere-quiet-btn {
|
|
83
94
|
background: none;
|
|
84
95
|
border: none;
|
|
@@ -89,11 +100,28 @@ var e=`<!DOCTYPE html>
|
|
|
89
100
|
padding: 4px 0;
|
|
90
101
|
}
|
|
91
102
|
.gelatiere-quiet-btn:hover { color: var(--s2-content-secondary, #a1a1a1); }
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
103
|
+
/* ── Empty state + discovery ──
|
|
104
|
+
Before the first pass there is nothing to render, and "nothing yet"
|
|
105
|
+
alone reads like a broken panel: it says what will land here, then
|
|
106
|
+
links three use cases from www.sliccy.com. Both reuse the entry's own
|
|
107
|
+
head / why classes, so the panel keeps one type ramp and only the
|
|
108
|
+
link chrome is new. */
|
|
109
|
+
.gelatiere-empty { padding: 2px 0 4px; }
|
|
110
|
+
.gelatiere-explore {
|
|
111
|
+
margin-top: 18px;
|
|
112
|
+
padding-top: 14px;
|
|
113
|
+
border-top: 1px solid var(--s2-border-subtle, var(--s2-gray-200, #e8e8e8));
|
|
114
|
+
}
|
|
115
|
+
.gelatiere-explore__link {
|
|
116
|
+
display: block;
|
|
117
|
+
padding: 10px 0;
|
|
118
|
+
text-decoration: none;
|
|
119
|
+
color: inherit;
|
|
120
|
+
}
|
|
121
|
+
.gelatiere-explore__link + .gelatiere-explore__link {
|
|
122
|
+
border-top: 1px solid var(--s2-border-subtle, var(--s2-gray-200, #e8e8e8));
|
|
96
123
|
}
|
|
124
|
+
.gelatiere-explore__link:hover .gelatiere-entry__title { text-decoration: underline; }
|
|
97
125
|
/* An entry the user just acted on: buttons gone, a quiet confirmation
|
|
98
126
|
line in their place. The entry stays until the next render. */
|
|
99
127
|
.gelatiere-entry--taken .gelatiere-entry__head,
|
|
@@ -106,9 +134,9 @@ var e=`<!DOCTYPE html>
|
|
|
106
134
|
font-size: 12px;
|
|
107
135
|
color: var(--s2-content-positive, #2d9d78);
|
|
108
136
|
}
|
|
109
|
-
.gelatiere-taken-note i { width: 14px; height: 14px; flex-shrink: 0; }
|
|
137
|
+
.gelatiere-taken-note :is(i, svg) { width: 14px; height: 14px; flex-shrink: 0; }
|
|
110
138
|
/* The "Done" ledger under the open entries: one quiet line each. */
|
|
111
|
-
.gelatiere-done { margin-top:
|
|
139
|
+
.gelatiere-done { margin-top: 6px; padding-top: 14px; }
|
|
112
140
|
.gelatiere-done-title {
|
|
113
141
|
padding-bottom: 6px;
|
|
114
142
|
font-size: 10px;
|
|
@@ -125,7 +153,7 @@ var e=`<!DOCTYPE html>
|
|
|
125
153
|
font-size: 12px;
|
|
126
154
|
color: var(--s2-content-secondary, #a1a1a1);
|
|
127
155
|
}
|
|
128
|
-
.gelatiere-done-row i {
|
|
156
|
+
.gelatiere-done-row :is(i, svg) {
|
|
129
157
|
width: 13px;
|
|
130
158
|
height: 13px;
|
|
131
159
|
flex-shrink: 0;
|
|
@@ -159,11 +187,24 @@ var e=`<!DOCTYPE html>
|
|
|
159
187
|
// waking the agent; \`gelatiere-install\` / \`gelatiere-try\` go to the
|
|
160
188
|
// cone, which acts on them per the \`gelatiere\` skill.
|
|
161
189
|
var GELATIERE_SUGGESTIONS_PATH = '/shared/.gelatiere/suggestions.json';
|
|
190
|
+
// \`skill-idea\` and \`issue\` are prompt-carrying like \`use-case\` and ride
|
|
191
|
+
// the same \`gelatiere-try\` lick; only the label and the pill differ, so
|
|
192
|
+
// "report this to SLICC" does not render as "Try this".
|
|
162
193
|
var KIND_LABELS = {
|
|
163
|
-
'skill':
|
|
164
|
-
'use-case':
|
|
165
|
-
'tip':
|
|
194
|
+
'skill': { label: 'Skill', icon: 'package', action: 'Install', done: 'installed' },
|
|
195
|
+
'use-case': { label: 'Try this', icon: 'sparkles', action: 'Try it', done: 'tried' },
|
|
196
|
+
'tip': { label: 'Tip', icon: 'lightbulb', action: null, done: 'tried' },
|
|
197
|
+
'skill-idea': { label: 'New skill', icon: 'wand-sparkles', action: 'Draft it', done: 'drafted' },
|
|
198
|
+
'issue': { label: 'Report', icon: 'bug', action: 'Report it', done: 'reported' },
|
|
166
199
|
};
|
|
200
|
+
// Rotated daily by the command, so a second visit differs.
|
|
201
|
+
var USE_CASE_COMMAND = 'gelatiere use-cases --limit 3 --json';
|
|
202
|
+
var USE_CASE_CACHE_MS = 12 * 60 * 60 * 1000;
|
|
203
|
+
var EMPTY_HEADLINE = 'Nothing here yet';
|
|
204
|
+
var EMPTY_BODY =
|
|
205
|
+
'The gelatiere reads how you actually work — nightly, and after each chat ' +
|
|
206
|
+
'ends — and leaves what it finds here: a skill worth installing, a use ' +
|
|
207
|
+
'case worth trying, a habit worth changing. Check back after your next session.';
|
|
167
208
|
|
|
168
209
|
function el(tag, className, text) {
|
|
169
210
|
var node = document.createElement(tag);
|
|
@@ -185,15 +226,16 @@ var e=`<!DOCTYPE html>
|
|
|
185
226
|
return btn;
|
|
186
227
|
}
|
|
187
228
|
|
|
188
|
-
function gelatiereQuietButton(label, onClick) {
|
|
229
|
+
function gelatiereQuietButton(label, onClick, title) {
|
|
189
230
|
var btn = el('button', 'gelatiere-quiet-btn', label);
|
|
190
231
|
btn.type = 'button';
|
|
232
|
+
if (title) btn.title = title;
|
|
191
233
|
btn.onclick = onClick;
|
|
192
234
|
return btn;
|
|
193
235
|
}
|
|
194
236
|
|
|
195
237
|
// WHAT (icon + imperative title + quiet kind label), WHY (one
|
|
196
|
-
// paragraph), then one pill and a quiet "
|
|
238
|
+
// paragraph), then one pill and a quiet "Dismiss". Flat on purpose:
|
|
197
239
|
// the sidebar panel is the box, so the entries draw none of their own.
|
|
198
240
|
function buildSuggestionCard(s) {
|
|
199
241
|
var meta = KIND_LABELS[s.kind] || KIND_LABELS.tip;
|
|
@@ -217,7 +259,7 @@ var e=`<!DOCTYPE html>
|
|
|
217
259
|
var actions = el('div', 'gelatiere-actions');
|
|
218
260
|
// Taking an entry keeps it visible: the buttons swap for a quiet
|
|
219
261
|
// confirmation so the user sees what they set in motion. Dismissing
|
|
220
|
-
// removes it — "
|
|
262
|
+
// removes it — "Dismiss" means "stop showing me this".
|
|
221
263
|
function markTaken(note) {
|
|
222
264
|
card.classList.add('gelatiere-entry--taken');
|
|
223
265
|
var done = el('div', 'gelatiere-taken-note');
|
|
@@ -226,21 +268,21 @@ var e=`<!DOCTYPE html>
|
|
|
226
268
|
actions.replaceChildren(done);
|
|
227
269
|
if (window.LucideIcons) window.LucideIcons.render();
|
|
228
270
|
}
|
|
229
|
-
// "
|
|
271
|
+
// "Dismiss" first in the DOM: the row is right-aligned, so the quiet
|
|
230
272
|
// button sits left of the primary pill, which keeps the right edge.
|
|
231
|
-
actions.appendChild(gelatiereQuietButton('
|
|
273
|
+
actions.appendChild(gelatiereQuietButton('Dismiss', function () {
|
|
232
274
|
if (window.slicc) slicc.lick({ action: 'gelatiere-dismiss', data: { id: s.id } });
|
|
233
275
|
card.remove();
|
|
234
|
-
if (!document.querySelector('.gelatiere-entry'))
|
|
235
|
-
}));
|
|
276
|
+
if (!document.querySelector('.gelatiere-entry')) renderGelatiereCaughtUp();
|
|
277
|
+
}, "that's not for me"));
|
|
236
278
|
if (s.kind === 'skill') {
|
|
237
|
-
actions.appendChild(gelatierePrimaryButton(
|
|
279
|
+
actions.appendChild(gelatierePrimaryButton(meta.action, function () {
|
|
238
280
|
if (window.slicc) slicc.lick({ action: 'gelatiere-install',
|
|
239
281
|
data: { id: s.id, skill: s.skill || null, install: s.install || null, title: s.title } });
|
|
240
282
|
markTaken('Installing — the cone is on it.');
|
|
241
283
|
}));
|
|
242
|
-
} else if (
|
|
243
|
-
actions.appendChild(gelatierePrimaryButton(
|
|
284
|
+
} else if (meta.action && s.prompt) {
|
|
285
|
+
actions.appendChild(gelatierePrimaryButton(meta.action, function () {
|
|
244
286
|
if (window.slicc) slicc.lick({ action: 'gelatiere-try',
|
|
245
287
|
data: { id: s.id, prompt: s.prompt, title: s.title } });
|
|
246
288
|
markTaken('Sent to the cone — watch the chat.');
|
|
@@ -264,21 +306,89 @@ var e=`<!DOCTYPE html>
|
|
|
264
306
|
var wrap = el('div', 'gelatiere-done');
|
|
265
307
|
wrap.appendChild(el('div', 'gelatiere-done-title', 'Done'));
|
|
266
308
|
taken.slice(0, DONE_LEDGER_LIMIT).forEach(function (s) {
|
|
309
|
+
var meta = KIND_LABELS[s.kind] || KIND_LABELS.tip;
|
|
267
310
|
var row = el('div', 'gelatiere-done-row');
|
|
268
311
|
row.appendChild(lucide('check'));
|
|
269
312
|
row.appendChild(el('span', 'gelatiere-done-title-text', s.title));
|
|
270
|
-
row.appendChild(el('span', 'gelatiere-done-what',
|
|
271
|
-
s.kind === 'skill' ? 'installed' : 'tried'));
|
|
313
|
+
row.appendChild(el('span', 'gelatiere-done-what', meta.done));
|
|
272
314
|
wrap.appendChild(row);
|
|
273
315
|
});
|
|
274
316
|
return wrap;
|
|
275
317
|
}
|
|
276
318
|
|
|
277
|
-
|
|
319
|
+
// \`gelatiere use-cases\` owns the fetching (pinned host), so the sprinkle
|
|
320
|
+
// needs no egress of its own; the result is cached in sprinkle state
|
|
321
|
+
// because this runs on every panel open.
|
|
322
|
+
function readCachedUseCases() {
|
|
323
|
+
try {
|
|
324
|
+
var saved = window.slicc && slicc.getState && slicc.getState();
|
|
325
|
+
if (!saved || !saved.useCases || !saved.fetchedAt) return null;
|
|
326
|
+
if (Date.now() - saved.fetchedAt > USE_CASE_CACHE_MS) return null;
|
|
327
|
+
return saved.useCases;
|
|
328
|
+
} catch (e) { return null; }
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
function loadUseCases() {
|
|
332
|
+
var cached = readCachedUseCases();
|
|
333
|
+
if (cached) return Promise.resolve(cached);
|
|
334
|
+
if (!window.slicc || typeof slicc.exec !== 'function') return Promise.resolve([]);
|
|
335
|
+
return Promise.resolve(slicc.exec(USE_CASE_COMMAND)).then(function (result) {
|
|
336
|
+
if (!result || result.exitCode !== 0) return [];
|
|
337
|
+
var parsed = JSON.parse(result.stdout);
|
|
338
|
+
if (!Array.isArray(parsed)) return [];
|
|
339
|
+
var cases = parsed.filter(function (c) { return c && c.url && c.title; });
|
|
340
|
+
try { slicc.setState({ fetchedAt: Date.now(), useCases: cases }); } catch (e) {}
|
|
341
|
+
return cases;
|
|
342
|
+
}, function () { return []; });
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
// Appended after the empty text, never instead of it: the panel must
|
|
346
|
+
// read correctly whether or not the site answers.
|
|
347
|
+
function appendUseCases(stream) {
|
|
348
|
+
loadUseCases().then(function (cases) {
|
|
349
|
+
if (!cases.length || !stream.isConnected) return;
|
|
350
|
+
var wrap = el('div', 'gelatiere-explore');
|
|
351
|
+
wrap.appendChild(el('div', 'gelatiere-done-title', 'Meanwhile, from sliccy.com'));
|
|
352
|
+
cases.forEach(function (c) {
|
|
353
|
+
var link = el('a', 'gelatiere-explore__link');
|
|
354
|
+
link.href = c.url;
|
|
355
|
+
link.target = '_blank';
|
|
356
|
+
link.rel = 'noopener';
|
|
357
|
+
var head = el('div', 'gelatiere-entry__head');
|
|
358
|
+
head.appendChild(el('span', 'gelatiere-entry__title', c.title));
|
|
359
|
+
head.appendChild(lucide('arrow-up-right'));
|
|
360
|
+
link.appendChild(head);
|
|
361
|
+
if (c.description) link.appendChild(el('div', 'gelatiere-why', c.description));
|
|
362
|
+
wrap.appendChild(link);
|
|
363
|
+
});
|
|
364
|
+
stream.appendChild(wrap);
|
|
365
|
+
if (window.LucideIcons) window.LucideIcons.render();
|
|
366
|
+
});
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
// Nothing to act on: what will land here, then what to do until then.
|
|
370
|
+
function renderGelatiereEmpty(headline, body) {
|
|
278
371
|
var stream = document.getElementById('gelatiereStream');
|
|
279
372
|
stream.innerHTML = '';
|
|
280
|
-
|
|
373
|
+
var empty = el('div', 'gelatiere-empty');
|
|
374
|
+
var head = el('div', 'gelatiere-entry__head');
|
|
375
|
+
head.appendChild(lucide('ice-cream-cone'));
|
|
376
|
+
head.appendChild(el('span', 'gelatiere-entry__title', headline));
|
|
377
|
+
empty.appendChild(head);
|
|
378
|
+
empty.appendChild(el('div', 'gelatiere-why', body));
|
|
379
|
+
stream.appendChild(empty);
|
|
281
380
|
stream.hidden = false;
|
|
381
|
+
if (window.LucideIcons) window.LucideIcons.render();
|
|
382
|
+
appendUseCases(stream);
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
/** Every suggestion answered — the Done ledger, if any, follows. */
|
|
386
|
+
function renderGelatiereCaughtUp() {
|
|
387
|
+
renderGelatiereEmpty(
|
|
388
|
+
'All caught up',
|
|
389
|
+
'You have answered everything the gelatiere left here. The next pass runs ' +
|
|
390
|
+
'tonight, and again after your next chat ends.'
|
|
391
|
+
);
|
|
282
392
|
}
|
|
283
393
|
|
|
284
394
|
function renderGelatiereStream() {
|
|
@@ -288,7 +398,7 @@ var e=`<!DOCTYPE html>
|
|
|
288
398
|
// rendering the leader's rail): the quiet empty line, never an error
|
|
289
399
|
// box and never a wizard.
|
|
290
400
|
if (!window.slicc || typeof slicc.readFile !== 'function') {
|
|
291
|
-
renderGelatiereEmpty(
|
|
401
|
+
renderGelatiereEmpty(EMPTY_HEADLINE, EMPTY_BODY);
|
|
292
402
|
return;
|
|
293
403
|
}
|
|
294
404
|
// \`exists\` first: a missing store is the ordinary state before the
|
|
@@ -308,17 +418,25 @@ var e=`<!DOCTYPE html>
|
|
|
308
418
|
var open = readable.filter(function (s) { return !s.dismissedAt && !s.takenAt; });
|
|
309
419
|
var taken = readable.filter(function (s) { return s.takenAt; });
|
|
310
420
|
if (open.length === 0 && taken.length === 0) {
|
|
311
|
-
renderGelatiereEmpty(
|
|
421
|
+
renderGelatiereEmpty(EMPTY_HEADLINE, EMPTY_BODY);
|
|
422
|
+
return;
|
|
423
|
+
}
|
|
424
|
+
// Everything answered: the caught-up copy, then the ledger. The use
|
|
425
|
+
// cases land after both (they arrive a round trip later), so the
|
|
426
|
+
// panel still offers a next step instead of a closed book.
|
|
427
|
+
if (open.length === 0) {
|
|
428
|
+
renderGelatiereCaughtUp();
|
|
429
|
+
stream.appendChild(buildDoneLedger(taken));
|
|
430
|
+
if (window.LucideIcons) window.LucideIcons.render();
|
|
312
431
|
return;
|
|
313
432
|
}
|
|
314
433
|
stream.innerHTML = '';
|
|
315
|
-
if (open.length === 0) stream.appendChild(el('div', 'gelatiere-empty', 'All caught up.'));
|
|
316
434
|
open.forEach(function (s) { stream.appendChild(buildSuggestionCard(s)); });
|
|
317
435
|
if (taken.length > 0) stream.appendChild(buildDoneLedger(taken));
|
|
318
436
|
stream.hidden = false;
|
|
319
437
|
if (window.LucideIcons) window.LucideIcons.render();
|
|
320
438
|
}, function () {
|
|
321
|
-
renderGelatiereEmpty(
|
|
439
|
+
renderGelatiereEmpty(EMPTY_HEADLINE, EMPTY_BODY);
|
|
322
440
|
});
|
|
323
441
|
}
|
|
324
442
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{i as e}from"./bridge-protocol-06nbmp2X.js";import{A as t,D as n,E as r,O as i,T as a,k as o,w as s}from"./wc-live-
|
|
1
|
+
import{i as e}from"./bridge-protocol-06nbmp2X.js";import{A as t,D as n,E as r,O as i,T as a,k as o,w as s}from"./wc-live-Kx0jpvxz.js";import{n as c}from"./clipboard-eqmn97SP.js";import{n as l}from"./icons-Ce7Vz89o.js";function u(e){let t=[{id:`browser`,label:`Browser`},{id:`iphone`,label:`iPhone`},{id:`terminal`,label:`Terminal`}];return e>0&&t.unshift({id:`status`,label:`Status`,badge:e}),t}function d(e){return e>0?`status`:`browser`}function f(e){let t;try{t=new URL(e)}catch{return e}let n=t.pathname.split(`/`),r=n.lastIndexOf(`join`)+1;return r===0||r>=n.length||!n[r]?e:(n[r]=`•`.repeat(8),`${t.origin}${n.join(`/`)}${t.search}${t.hash}`)}function p(e){return`slicc ${e} follow bash -c`}var m=e;function h(e){try{return new URL(e).origin}catch{return m}}function g(e){return`curl -fsSL ${h(e)}/install-cli | sh`}function _(e){return`irm ${h(e)}/install-cli.ps1 | iex`}function v(e){switch(e){case`browser`:return[`Open Sliccy in the other browser, click the avatar, and choose “Connect to another browser”.`,`Paste the join link there.`];case`iphone`:return[`In the Sliccy app, paste the join link into Settings → Join link.`,`Signed in to the same iCloud account? The session is already listed under iCloud Sessions — no link needed.`];case`terminal`:return[`Lend a machine to this session — run these in its terminal:`,`The agent can then run commands on that machine as you.`]}}function y(e){return e===0?`Nothing connected yet.`:`${e} ${e===1?`device is`:`devices are`} connected.`}function b(e){return e===0?`Revoke link? The old link stops working.`:`Revoke link? ${e} connected ${e===1?`device`:`devices`} will be disconnected.`}var x=`font-family: var(--s2-font-mono); font-size: 11px; color: var(--s2-content-default); word-break: break-all; padding: 8px 12px; background: var(--s2-bg-sunken); border-radius: var(--s2-radius-default); border: 1px solid var(--s2-border-subtle);`,S=`font-size: 11px; color: var(--s2-content-secondary);`,C=`font-size: 12px; color: var(--s2-content-default);`,w=`flex: 0 0 auto; width: auto; padding: 8px 14px;`;function T(e,t,n){let r=document.createElement(e);return t&&(r.style.cssText=t),n!=null&&(r.textContent=n),r}function E(e,t,n=`normal`){e.statusEl.textContent=t,e.statusEl.style.color=n===`error`?`var(--slicc-cone)`:`var(--s2-content-secondary)`}async function D(e,t,n){await c(t)?E(e,n):E(e,`Couldn’t copy. Select the text and copy it manually.`,`error`)}async function O(e){let{onReset:t}=e.options,n=e.revokeBtn;if(!(!t||!n)){if(!e.revokeArmed){e.revokeArmed=!0,n.textContent=b(e.followers.length),k(n,!0);return}n.disabled=!0,e.doneBtn.disabled=!0,E(e,`Revoking the join link…`);try{await t(),E(e,`Join link revoked. Enable sharing from the avatar menu to get a new one.`),e.urlRevealed=!1,n.textContent=`Revoked`,e.doneBtn.disabled=!1,L(e)}catch(t){E(e,`Revoke failed: ${t instanceof Error?t.message:String(t)}`,`error`),e.revokeArmed=!1,n.textContent=`Revoke link`,k(n,!1),n.disabled=!1,e.doneBtn.disabled=!1}}}function k(e,t){e.dataset.armed=t?`1`:`0`,e.style.background=t?`var(--s2-negative)`:``,e.style.borderColor=t?`transparent`:``,e.style.color=t?`#fff`:``}function A(e){let t=T(`div`),n=T(`button`,`margin-bottom: 8px;`,`Copy join link`);n.className=`dialog__btn dialog__btn--secondary`,n.dataset.action=`copy-link`,n.addEventListener(`click`,()=>{D(e,e.options.joinUrl,`Join link copied.`)}),t.appendChild(n);let r=T(`div`,`display: flex; align-items: center; gap: 8px;`),i=T(`div`,`${x} flex: 1 1 auto; min-width: 0; color: var(--s2-content-secondary);`);i.dataset.joinUrl=`1`,i.textContent=e.urlRevealed?e.options.joinUrl:f(e.options.joinUrl);let a=T(`button`,`${w}`,e.urlRevealed?`Hide`:`Show`);return a.className=`dialog__btn dialog__btn--secondary`,a.dataset.action=`toggle-url`,a.addEventListener(`click`,()=>{e.urlRevealed=!e.urlRevealed,L(e)}),r.append(i,a),t.appendChild(r),t.appendChild(T(`div`,`${S} margin-top: 8px;`,`Anyone with this link can drive this session.`)),t}function j(e,t){let n=T(`div`,`margin-bottom: 10px;`);n.appendChild(T(`div`,`${S} margin-bottom: 4px;`,t.caption));let r=T(`div`,`${x} margin-bottom: 6px;`,t.command);r.dataset.command=t.action,n.appendChild(r);let i=T(`button`,`margin-bottom: 0;`,t.copyLabel);return i.className=`dialog__btn dialog__btn--secondary`,i.dataset.action=t.action,i.addEventListener(`click`,()=>{D(e,t.copyValue??t.command,t.okMessage)}),n.appendChild(i),n}function M(e,t){let n=T(`div`),{joinUrl:r}=e.options,i=p(r),a=e.urlRevealed?i:p(f(r));n.appendChild(j(e,{caption:`1. Install the slicc CLI (skip if you already have it):`,command:g(r),action:`copy-install`,copyLabel:`Copy install command`,okMessage:`Install command copied.`})),n.appendChild(T(`div`,`${S} margin: -6px 0 12px;`,`Windows: ${_(r)}`)),n.appendChild(j(e,{caption:`2. Connect that machine to this session:`,command:a,copyValue:i,action:`copy-command`,copyLabel:`Copy command`,okMessage:`Command copied.`}));let o=T(`button`,`${w} margin-bottom: 8px;`,e.urlRevealed?`Hide link`:`Show link`);return o.className=`dialog__btn dialog__btn--secondary`,o.dataset.action=`toggle-url`,o.addEventListener(`click`,()=>{e.urlRevealed=!e.urlRevealed,L(e)}),n.appendChild(o),n.appendChild(T(`div`,`${S} margin-bottom: 0;`,`\u26a0 ${t}`)),n}function N(e,t){let n=T(`div`),[r,i]=v(t);return n.appendChild(T(`div`,`${C} line-height: 1.5; margin-bottom: 6px;`,r)),t===`terminal`?(n.appendChild(M(e,i)),n):(n.appendChild(T(`div`,`${S} margin-bottom: 10px;`,i)),n.appendChild(A(e)),n)}function P(e){let s=T(`div`,`display: grid; grid-template-columns: 16px 1fr auto; gap: 8px; align-items: start;`);s.dataset.follower=e.runtimeId;let c=T(`span`,`display: flex; margin-top: 2px; color: var(--s2-content-secondary);`);c.appendChild(l(n(e),{size:14})),s.appendChild(c);let u=T(`div`,`display: flex; flex-direction: column; gap: 2px; min-width: 0;`);u.appendChild(T(`div`,`${C} font-weight: 500;`,t(e)));let d=r(e);d&&u.appendChild(T(`div`,`${S} overflow-wrap: anywhere;`,d));let f=a(e);if(f.length>0){let e=T(`div`,`display: flex; gap: 4px; flex-wrap: wrap; margin-top: 2px;`);for(let t of f)e.appendChild(T(`span`,`padding: 1px 6px; border-radius: 9999px; background: var(--s2-bg-layer-1); border: 1px solid var(--s2-border-subtle); font-size: 10px; font-weight: 600; color: var(--s2-content-secondary);`,t));u.appendChild(e)}s.appendChild(u);let p=o(e),m=p===`active`?`var(--s2-positive)`:p===`warn`?`var(--s2-notice)`:`var(--s2-content-tertiary)`,h=T(`div`,`display: flex; align-items: center; gap: 5px; ${S} white-space: nowrap;`);return h.appendChild(T(`span`,`width: 6px; height: 6px; border-radius: 50%; flex: 0 0 auto; background: ${m};`)),h.appendChild(T(`span`,void 0,i(e))),s.appendChild(h),s}function F(e){let t=T(`div`,`display: flex; flex-direction: column; gap: 10px;`);for(let n of e.followers)t.appendChild(P(n));return e.followers.length===0&&t.appendChild(T(`div`,`font-size: 12px; color: var(--s2-content-secondary);`,`Nothing connected right now.`)),t}function I(e,t,n){let r=t===e.activeTab,i=T(`button`,`flex: 0 0 auto; padding: 4px 10px; border-radius: 9999px; font-size: 12px; cursor: pointer; border: 1px solid ${r?`var(--s2-border-subtle)`:`transparent`}; background: ${r?`var(--s2-bg-layer-1)`:`transparent`}; color: ${r?`var(--s2-content-default)`:`var(--s2-content-secondary)`};`,n);return i.type=`button`,i.setAttribute(`role`,`tab`),i.setAttribute(`aria-selected`,String(r)),i.dataset.tab=t,i.addEventListener(`click`,()=>{e.activeTab=t,L(e)}),i}function L(e){let t=u(e.followers.length);t.some(t=>t.id===e.activeTab)||(e.activeTab=d(0)),e.tabsRow.replaceChildren(...t.map(t=>I(e,t.id,t.badge==null?t.label:`${t.label} · ${t.badge}`))),e.body.replaceChildren(e.activeTab===`status`?F(e):N(e,e.activeTab)),e.summaryEl.textContent=y(e.followers.length),e.revokeBtn&&!e.revokeArmed&&e.revokeBtn.textContent!==`Revoked`&&(e.revokeBtn.textContent=`Revoke link`,k(e.revokeBtn,!1))}function R(e){let t=T(`div`);t.className=`dialog-overlay`,t.dataset.syncDialog=`1`;let n=T(`div`);n.className=`dialog`,n.setAttribute(`role`,`dialog`),n.setAttribute(`aria-modal`,`true`),n.setAttribute(`aria-label`,`Session sharing`),t.appendChild(n);let r=T(`div`,void 0,`Session sharing`);r.className=`dialog__title`;let i=T(`div`,`display: flex; gap: 4px; margin-bottom: 12px; flex-wrap: wrap;`);i.setAttribute(`role`,`tablist`);let a=T(`div`,`margin-bottom: 12px;`);a.setAttribute(`role`,`tabpanel`);let o=T(`div`,`font-size: 12px; margin-bottom: 8px; min-height: 16px;`);o.setAttribute(`role`,`status`),o.setAttribute(`aria-live`,`polite`);let s=T(`div`,`${S} margin-bottom: 8px;`),c=T(`button`,void 0,`Done`);c.className=`dialog__btn`,n.append(r,i,a,o,s,c);let l=e.followers??[];return{options:e,followers:l,activeTab:e.initialTab??d(l.length),urlRevealed:!1,revokeArmed:!1,overlay:t,tabsRow:i,body:a,statusEl:o,summaryEl:s,doneBtn:c,revokeBtn:null}}var z=null;function B(e){z?.(),document.querySelectorAll(`.dialog-overlay[data-sync-dialog]`).forEach(e=>{e.remove()});let t=R(e),n=t.overlay.firstElementChild;if(e.onReset){let e=T(`button`,`margin-top: 8px;`,`Revoke link`);e.className=`dialog__btn dialog__btn--secondary`,e.dataset.action=`revoke`,e.addEventListener(`click`,()=>{O(t)}),n.appendChild(e),t.revokeBtn=e}let r=e=>{t.followers=e.detail?.followers??[],L(t)},i=e=>{e.key===`Escape`&&a()};function a(){window.removeEventListener(s,r),document.removeEventListener(`keydown`,i),t.overlay.remove(),z===a&&(z=null)}t.doneBtn.addEventListener(`click`,()=>a()),t.overlay.addEventListener(`click`,e=>{e.target===t.overlay&&a()}),window.addEventListener(s,r),document.addEventListener(`keydown`,i),z=a,e.copied&&E(t,`Join link copied to clipboard.`),L(t),document.body.appendChild(t.overlay)}export{B as showSyncEnabledDialog};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{J as e}from"./wc-shortcuts-
|
|
1
|
+
import{J as e}from"./wc-shortcuts-Cbk5hDbX.js";import"./proxied-fetch-DyBveeCl.js";import{n as t}from"./runtime-env-Dlaokqg1.js";import{a as n,t as r}from"./api-endpoint-DGxXvrur.js";import{t as i}from"./shared-mBEktoxE.js";var a=1e3;function o(e=()=>Date.now()){let t=new Map,n=null,r=0,i=()=>{let e=0,n=0;for(let r of t.values())e+=r.loaded,n+=r.total;return{loaded:e,total:n}};return{update(a,o,s){t.set(a,{loaded:Math.max(0,o),total:Math.max(t.get(a)?.total??0,s,o)}),n===null&&(n=e(),r=i().loaded)},complete(e){let n=t.get(e);n&&(n.loaded=n.total)},snapshot(){let{loaded:t,total:o}=i(),s=null;if(n!==null&&o>0&&t<o){let i=e()-n,c=t-r;if(i>=a&&c>0){let e=c/i;s=(o-t)/e/1e3}}return o>0&&t>=o&&(s=0),{loaded:t,total:o,etaSeconds:s}}}}var s=`onnx-community/whisper-tiny`,c=`onnx-community/Kokoro-82M-v1.0-ONNX`,l=Symbol.for(`slicc.transformers-env.fetch-wrapped`),u=t,d=`/workspace/node_modules/onnxruntime-web/dist/`,f=`/workspace/models/`;function p(e){return typeof e==`string`?e:e instanceof URL?e.toString():e.url}function m(e){let t=p(e);return t.startsWith(`http://`)||t.startsWith(`https://`)}function h(){return globalThis.location?.origin??null}function g(e){let t=h();if(!t)return!1;try{return new URL(p(e)).origin===t}catch{return!1}}async function _(e,t){let i=p(e),a={};t?.headers&&new Headers(t.headers).forEach((e,t)=>{a[t]=e});let o=r({...a,"X-Target-URL":i}),s=(t?.method??`GET`).toUpperCase(),c={method:s,headers:o,cache:`no-store`};return t?.body&&s!==`GET`&&s!==`HEAD`&&(c.body=t.body),fetch(n(`/api/fetch-proxy`),c)}var v=3e4,y=[`ort-wasm-simd-threaded.jsep.mjs`,`https://${["cdn","jsdelivr","net"].join(".")}/npm/onnxruntime-web@1.26.0-dev.20260416-b7804b056c/dist/ort-wasm-simd-threaded.jsep.wasm`,`ort-wasm-simd-threaded.mjs`,`https://${["cdn","jsdelivr","net"].join(".")}/npm/onnxruntime-web@1.26.0-dev.20260416-b7804b056c/dist/ort.wasm`,`ort-wasm-simd-threaded.asyncify.mjs`,`https://${["cdn","jsdelivr","net"].join(".")}/npm/onnxruntime-web@1.26.0-dev.20260416-b7804b056c/dist/ort-wasm-simd-threaded.asyncify.wasm`],b=Symbol.for(`slicc.transformers-env.vfs-enoent`);function x(e){if(typeof BroadcastChannel>`u`)return Promise.reject(Error(`Cannot read VFS path ${e}: BroadcastChannel unavailable in this realm`));let t=new BroadcastChannel(`preview-vfs`),n=`tfx-${Date.now()}-${Math.random().toString(36).slice(2)}`;return new Promise((r,i)=>{let a=e=>{t.removeEventListener(`message`,c),t.close(),e()},o,s=()=>{clearTimeout(o),o=setTimeout(()=>{let t=Error(`ENOENT: ${e} (preview-vfs responder timed out)`);t[b]=!0,a(()=>i(t))},v)};s();let c=t=>{let c=t.data;if(!c||c.id!==n)return;if(c.type===`preview-vfs-start`){s();return}if(c.type!==`preview-vfs-response`)return;if(clearTimeout(o),typeof c.error==`string`){let e=Error(c.error);c.error.includes(`ENOENT`)&&(e[b]=!0),a(()=>i(e));return}let l=c.content;if(l instanceof Uint8Array){a(()=>r(l));return}if(typeof l==`string`){a(()=>r(new TextEncoder().encode(l)));return}a(()=>i(Error(`Unexpected empty preview-vfs response for ${e}`)))};t.addEventListener(`message`,c),t.postMessage({type:`preview-vfs-read`,id:n,path:e,asText:!1})})}function S(e){return!!e?.[b]}function C(e){let t=new ArrayBuffer(e.byteLength),n=new Uint8Array(t);return n.set(e),n}function w(e,t){return!t||!e.startsWith(t)?null:`${f}${e.slice(t.length).split(`?`)[0].split(`#`)[0]}`}async function T(e,t){let n;try{n=await x(e)}catch(t){if(S(t))return new Response(`Not found: ${e}`,{status:404,headers:{"Content-Type":`text/plain`}});throw t}let r=i(e);return(t?.headers?new Headers(t.headers).get(`range`):null)===`bytes=0-0`?new Response(null,{status:206,headers:{"Content-Type":r,"Content-Length":String(n.byteLength),"Content-Range":`bytes 0-0/${n.byteLength}`}}):new Response(C(n),{status:200,headers:{"Content-Type":r,"Content-Length":String(n.byteLength)}})}var E=null;async function D(){if(typeof URL>`u`||typeof URL.createObjectURL!=`function`)throw Error(`onnxruntime-web blob URLs require URL.createObjectURL (browser realm only)`);let e={};if(await Promise.all(y.map(async t=>{try{let n=await x(`${d}${t}`),r=new Blob([C(n)],{type:i(t)});e[t]=URL.createObjectURL(r)}catch(e){if(!S(e))throw e}})),Object.keys(e).length===0)throw Error("onnxruntime-web is not installed — run `ipk add onnxruntime-web` to stage the wasm runtime in /workspace/node_modules/.");return e}function O(){return E||=D(),E}var k=`slicc_ort_num_threads`;function A(e){if(!e.isolated)return 1;let t=e.hardwareConcurrency,n=typeof t==`number`&&Number.isFinite(t)&&t>=1,r=n?Math.min(4,Math.floor(t)):4,i=e.override==null?NaN:Number.parseInt(e.override,10);return Number.isFinite(i)&&i>=1?Math.max(1,Math.min(r,i)):n?Math.max(1,r):1}function j(){let e=null;try{e=globalThis.localStorage?.getItem(`slicc_ort_num_threads`)??null}catch{}let t={isolated:globalThis.crossOriginIsolated===!0,hardwareConcurrency:globalThis.navigator?.hardwareConcurrency,override:e},n=A(t);return e!=null&&t.isolated&&console.warn(`[speech] ort-web numThreads=${n} forced by localStorage.${k}=${JSON.stringify(e)} — this persists until removed`),n}function M(t){let n=t.backends?.onnx?.wasm;if(n&&(n.wasmPaths=e(d),n.numThreads=j()),t.allowRemoteModels=!1,t.allowLocalModels=!0,t.localModelPath=e(f),u())return;t.allowRemoteModels=!0,t.remoteHost=t.localModelPath,t.remotePathTemplate=`{model}/`,n&&O().then(e=>{n.wasmPaths=e},()=>{});let r=t.fetch;if(r?.[l])return;let i=r,a=t.localModelPath,o=async(e,t)=>{let n=w(p(e),a);return n===null?!m(e)||g(e)?i?i(e,t):fetch(e,t):_(e,t):T(n,t)};o[l]=!0,t.fetch=o}async function N(e){let t=`weights for ${e} are missing — run \`hf download ${e}\` to fetch them into /workspace/models/.`;try{await x(`${f}${e}/config.json`)}catch(e){if(S(e))throw Error(t);let n=e instanceof Error?e.message:String(e);throw Error(`${t} (probe failed: ${n})`)}}export{s as a,c as i,M as n,o,O as r,N as t};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{t as e}from"./logger-DDBAeTLF.js";import{t}from"./base64-DJRlyqZu.js";import{f as n,p as r}from"./wc-follower-oauth-
|
|
1
|
+
import{t as e}from"./logger-DDBAeTLF.js";import{t}from"./base64-DJRlyqZu.js";import{f as n,p as r}from"./wc-follower-oauth-CqVmKcTQ.js";import{r as i}from"./tray-leader-BmmfZ-wo.js";var a=e(`tray-sidecar`),o=`slicc-sidecar`,s=4194304,c={exec:!1},l=class{onChunk;stdout=``;stderr=``;truncated=!1;units=0;constructor(e){this.onChunk=e}push(e,t){if(!(this.truncated||t.length===0)){if(this.units+=t.length,this.units>s){this.truncated=!0;return}e===`stdout`?this.stdout+=t:this.stderr+=t,this.onChunk?.({stream:e,text:t})}}result(e,t){return{stdout:this.truncated?`${this.stdout}\n[output truncated at cap]`:this.stdout,stderr:this.stderr,exitCode:e,...t?{error:t}:{},...this.truncated?{truncated:!0}:{}}}},u=class{name;handle=null;channel=null;unsubscribe=null;listeners=new Set;dropListeners=new Set;status=null;attachedAt=Date.now();currentJoinUrl;startPromise=null;constructor(e,t){this.name=e,this.currentJoinUrl=t}statusSink={get:()=>this.status??{state:`inactive`,joinUrl:this.currentJoinUrl,trayId:null,error:null,lastPingTime:null,reconnectAttempts:0,attachAttempts:0,lastAttachCode:null,connectingSince:null,lastError:null},set:e=>{this.status=e}};get info(){let e=this.statusSink.get();return{name:this.name,joinUrl:this.currentJoinUrl,trayId:e.trayId,state:e.state,attachedAt:this.attachedAt,error:e.error}}get connected(){return this.channel!==null&&this.statusSink.get().state===`connected`}get dead(){return this.statusSink.get().state===`error`}async ready(){await(this.startPromise??Promise.resolve())}async start(e){return this.startPromise=new Promise((t,r)=>{let i=!1,a=setTimeout(()=>{i||(i=!0,this.stop(),r(Error(`timed out after ${Math.round(e/1e3)}s connecting to leader`)))},e);this.handle=n({joinUrl:this.currentJoinUrl,runtime:o,statusSink:this.statusSink,onJoinUrlChanged:e=>{this.currentJoinUrl=e}},{onConnected:e=>{this.wire(e.channel),!i&&(i=!0,clearTimeout(a),t())},onReconnecting:()=>{this.notifyDropped(`connection dropped; reconnecting`)},onGaveUp:e=>{this.notifyDropped(`reconnect gave up: ${e}`),!i&&(i=!0,clearTimeout(a),this.stop(),r(Error(e)))}})}),await this.startPromise}wire(e){let t=this.channel!==null;this.unsubscribe?.();let n=new r(e);this.channel=n,this.unsubscribe=n.onMessage(e=>this.dispatch(e)),n.send({type:`hello`,protocolVersion:8,runtime:o,capabilities:c}),a.info(t?`Sidecar reconnected`:`Sidecar attached`,{name:this.name}),t&&this.notifyDropped(`reconnected mid-request; the reply was lost`)}dispatch(e){if(e.type===`ping`){this.channel?.send({type:`pong`});return}if(e.type!==`pong`){if(e.type===`exec.request`){this.channel?.send({type:`exec.response`,requestId:e.requestId,exitCode:127,error:`slicc sidecar is a client-only attachment and does not accept exec`});return}for(let t of[...this.listeners])try{t(e)}catch(e){a.error(`Sidecar listener threw`,{name:this.name,error:e instanceof Error?e.message:String(e)})}}}send(e){return this.channel?.send(e)??!1}onMessage(e){return this.listeners.add(e),()=>this.listeners.delete(e)}onDropped(e){return this.dropListeners.add(e),()=>this.dropListeners.delete(e)}notifyDropped(e){for(let t of[...this.dropListeners])try{t(e)}catch{}}stop(){this.unsubscribe?.(),this.unsubscribe=null,this.channel?.close(),this.channel=null,this.handle?.cancel(),this.handle=null,this.notifyDropped(`detached`),this.listeners.clear(),this.dropListeners.clear()}};function d(e){let t;try{t=new URL(e)}catch{throw Error(`not a URL: ${e}`)}if(t.protocol!==`https:`&&t.protocol!==`http:`)throw Error(`join URL must be http(s): ${e}`);if(!t.pathname.includes(`/join/`))throw Error(`not a tray join URL (expected .../join/<token>): ${e}`);return t}function f(e){let t=i().session?.joinUrl;if(!t)return!1;try{let n=new URL(t);return n.origin===e.origin&&n.pathname===e.pathname}catch{return!1}}function p(e,t,n,r){return new Promise(i=>{let a=!1,o=null,s=null,c=null,l=null,u=null,d=(e,r,d)=>{a||(a=!0,c&&clearTimeout(c),l&&clearTimeout(l),o?.(),s?.(),u&&t.signal?.removeEventListener(`abort`,u),i({result:n.result(r,d),outcome:e}))},f={finish:(e,t)=>d(`complete`,e,t)};if(o=e.onMessage(e=>r(e,f)),s=e.onDropped(e=>d(`dropped`,1,`connection lost: ${e}`)),t.timeoutMs!==void 0){let e=Math.round(t.timeoutMs/1e3);c=setTimeout(()=>d(`abort`,124,`timed out after ${e}s`),t.timeoutMs)}if(t.expireMs!==void 0&&(l=setTimeout(()=>d(`expire`,0),t.expireMs)),t.signal){if(t.signal.aborted){d(`abort`,130,`interrupted`);return}u=()=>d(`abort`,130,`interrupted`),t.signal.addEventListener(`abort`,u,{once:!0})}})}var m=class{attachments=new Map;counter=0;list(){return[...this.attachments.values()].map(e=>e.info)}async attach(e){let t=d(e.joinUrl);if(f(t))throw Error(`refusing to attach to this instance's own tray — that would deadlock the leader thread`);let n=this.findByJoinUrl(t);if(n?.dead)a.info(`Replacing a dead sidecar attachment`,{name:n.name}),this.detach(n.name);else if(n){if(await n.ready(),!n.dead)return n.info;this.detach(n.name)}if(this.attachments.size>=8)throw Error(`too many sidecar attachments (8); detach one first`);let r=e.name??`slicc-${++this.counter}`;if(this.attachments.has(r))throw Error(`attachment '${r}' already exists`);let i=new u(r,t.toString());this.attachments.set(r,i);try{await i.start(e.connectTimeoutMs??3e4)}catch(e){throw this.attachments.delete(r),e}return i.info}detach(e){let t=this.attachments.get(e);return t?(t.stop(),this.attachments.delete(e),!0):!1}detachAll(){for(let e of[...this.attachments.keys()])this.detach(e)}findByJoinUrl(e){let t=`${e.origin}${e.pathname}`;return[...this.attachments.values()].find(e=>{try{let n=new URL(e.info.joinUrl);return`${n.origin}${n.pathname}`===t}catch{return!1}})}require(e){let t=this.attachments.get(e);if(!t)throw Error(`no such attachment: ${e}`);if(!t.connected)throw Error(`attachment '${e}' is not connected`);return t}async prompt(e,t,n={}){let r=this.require(e),i=new l(n.onChunk),a=!1,o=p(r,n,i,(e,t)=>{if(e.type===`agent_event`){let n=e.event;n.type===`content_delta`?i.push(`stdout`,n.text):n.type===`turn_end`?t.finish(0):n.type===`error`&&(i.push(`stderr`,`${n.error}\n`),t.finish(1));return}if(e.type===`status`){e.scoopStatus===`processing`?a=!0:a&&t.finish(0);return}e.type===`error`&&(i.push(`stderr`,`${e.error}\n`),t.finish(1))});if(!r.send({type:`user_message`,text:t,messageId:crypto.randomUUID(),...n.steer?{steer:!0}:{}}))return{stdout:``,stderr:``,exitCode:1,error:`failed to send user_message`};let{result:s,outcome:c}=await o;return c===`abort`&&r.send({type:`abort`}),s}async exec(e,n,r={}){let i=this.require(e),a=crypto.randomUUID(),o=new l(r.onChunk),s=new TextDecoder,c=new TextDecoder,u=p(i,r,o,(e,n)=>{if(e.type===`exec.chunk`&&e.requestId===a){let n;try{n=t(e.data)}catch{return}let r=e.stream===`stdout`?s:c;o.push(e.stream,r.decode(n,{stream:!0}));return}e.type===`exec.response`&&e.requestId===a&&(o.push(`stdout`,s.decode()),o.push(`stderr`,c.decode()),n.finish(e.exitCode,e.error))});if(!i.send({type:`exec.request`,requestId:a,command:n,...r.cwd?{cwd:r.cwd}:{},...r.env?{env:r.env}:{},...r.stdin?{stdin:r.stdin}:{}}))return{stdout:``,stderr:``,exitCode:1,error:`failed to send exec.request`};let{result:d,outcome:f}=await u;return f===`abort`&&i.send({type:`exec.signal`,requestId:a,signal:`SIGINT`}),d}async watch(e,t){let n=this.require(e),r=new l(t.onChunk),i=!1,{result:a}=await p(n,{...t,timeoutMs:void 0,expireMs:t.durationMs},r,(e,n)=>{if(e.type===`user_message_echo`){r.push(`stdout`,`\n> ${e.text}\n`);return}if(e.type===`agent_event`){if(t.scoopJid&&e.scoopJid!==t.scoopJid)return;r.push(`stdout`,h(e.event));return}if(e.type===`status`){if(t.scoopJid&&e.scoopJid!==t.scoopJid)return;e.scoopStatus===`processing`?i=!0:i&&t.untilIdle&&n.finish(0);return}e.type===`error`&&r.push(`stderr`,`${e.error}\n`)});return a}};function h(e){switch(e.type){case`content_delta`:return e.text;case`tool_use_start`:return`\n[tool] ${e.toolName} ${g(e.toolInput)}\n`;case`tool_result`:return`[${e.isError?`tool-error`:`tool-ok`}] ${_(e.result,200)}\n`;case`turn_end`:return`
|
|
2
2
|
`;case`error`:return`[error] ${e.error}\n`;default:return``}}function g(e){if(e==null)return``;try{return _(JSON.stringify(e),120)}catch{return``}}function _(e,t){let n=e.replace(/\s+/g,` `).trim();return n.length<=t?n:`${n.slice(0,t-1)}…`}export{m as SidecarRegistry};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{D as e,g as t}from"./db-DSIYsBgP.js";import{n}from"./slicc-version-
|
|
1
|
+
import{D as e,g as t}from"./db-DSIYsBgP.js";import{n}from"./slicc-version-pkH5Cy8d.js";const r=`slicc:last-seen-version`;function i(){let{version:e,releasedAt:t}=n();return{version:e,releasedAt:t}}async function a(){let e=await t(r);return e&&e.length>0?e:null}async function o(t){await e(r,t)}async function s(){let e=i(),t=await a();return t===null?(await o(e.version),{bundled:e,lastSeen:null,isUpgrade:!1}):t===e.version?{bundled:e,lastSeen:t,isUpgrade:!1}:{bundled:e,lastSeen:t,isUpgrade:!0}}async function c(e){await o(e)}export{s as detectUpgrade,a as getLastSeenVersion,c as recordVersionSeen};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{i as e}from"./github-install-
|
|
1
|
+
import{i as e}from"./github-install-PNSinMst.js";function t(e){return(e??``).replace(/^\/+|\/+$/g,``)}function n(e,t){let n=e.toLowerCase(),r=t.toLowerCase();return n===r||n.startsWith(r)||r.startsWith(n)}function r(e){let n=t(e);if(n)return n.split(`/`).pop()||void 0}function i(e,n,i){if(e.kind!==`github`||e.source!==n)return!1;let a=t(e.path);if(!i||a===i||a.startsWith(`${i}/`))return!0;let o=r(i);return!!(o&&(e.skill===o||e.skill===i))}async function a(e,t){let n=e.body??{};if(n.verb!==`upskill`||typeof n.target!=`string`||!n.target)return!1;let r=t();if(!r)return!1;let[{scanSkillProvenance:i,resolveCommitSha:a},{createProxiedFetch:s},{createGitHubRequestContext:c}]=await Promise.all([import(`./provenance-DdmsQ3Nr.js`).then(e=>e.n),import(`./proxied-fetch-DEK8DT-z.js`).then(e=>e.i),import(`./github-auth-DgdBb7y7.js`).then(e=>e.r)]),l=await i(r),u=await c(s());return await o({target:n.target,branch:typeof n.branch==`string`?n.branch:void 0,path:typeof n.path==`string`?n.path:void 0,provenanced:l.provenanced,unattributed:l.unattributed,resolveSha:({owner:e,repo:t,ref:n,path:r})=>a(e,t,n,u,!0,r)})!==`raise`}async function o(a){let o=e(a.target);if(!o)return`raise`;let s=`${o.owner}/${o.repo}`,c=t(a.path??o.path),l=a.branch??o.branch,u=a.provenanced.filter(({provenance:e})=>i(e,s,c)),d=r(c);if(u.length===0)return d&&a.unattributed.includes(d)?`skip-no-provenance`:`raise`;let f=u.map(({provenance:e})=>e.sha).filter(e=>typeof e==`string`&&e.length>0);if(f.length!==u.length)return`skip-no-provenance`;let p=await a.resolveSha({owner:o.owner,repo:o.repo,ref:l,path:c||void 0});return p?f.every(e=>n(e,p))?`skip-same-sha`:`raise`:`skip-no-provenance`}export{a as shouldSkipNavigateUpskill};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as e}from"./logger-DDBAeTLF.js";import{K as t,W as n}from"./wc-shortcuts-
|
|
1
|
+
import{t as e}from"./logger-DDBAeTLF.js";import{K as t,W as n}from"./wc-shortcuts-Cbk5hDbX.js";import{hasVoiceForLang as r,speak as i,speechTextFromMarkdown as a}from"./speak-BjUpeuE_.js";var o=e(`speech:voice-reply`),s=0;function c(){s++}function l(){return s<=0?!1:(s--,!0)}async function u(e,s=i,c=r){let l=n(e);if(l&&!await c(l))return;let u=a(t(e));if(u)try{await s(l?{text:u,lang:l}:{text:u})}catch(e){o.warn(`spoken reply failed`,e)}}export{l as consumeVoiceSubmission,c as markVoiceSubmission,u as speakReplyMarkdown};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/wc-shortcuts-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/wc-shortcuts-Cbk5hDbX.js","assets/rolldown-runtime-Dd_uD5pT.js","assets/account-store-FUhuBOfI.js","assets/preload-helper-Czpn1I53.js","assets/claude-model-version-CSATLzrT.js","assets/models-BSkXF4T6.js","assets/diagnostics-DN_idNHx.js","assets/provider-env-CTOcDKrQ.js","assets/__vite-browser-external-5eBdwsFd.js","assets/openrouter.models-B-zmcypy.js","assets/libesm-BypnjKEL.js","assets/logger-DDBAeTLF.js","assets/base64-DJRlyqZu.js","assets/proxied-fetch-DyBveeCl.js","assets/fetch-body-1l9I58Vk.js","assets/api-endpoint-DGxXvrur.js","assets/runtime-env-Dlaokqg1.js","assets/float-topology-YtctpJaG.js","assets/secret-topology-DLJBhHOi.js","assets/secrets-bridge-client--VZ3E0yk.js","assets/port-bridge-client-Dn8JtUyP.js","assets/tool-ui-eSQ1g2I1.js","assets/providers-DjUwvFlY.js","assets/panel-rpc-B3MSVImO.js","assets/bedrock-camp-compat-BeCSBUrZ.js","assets/icons-Ce7Vz89o.js","assets/wc-secret-request-DaAszAFd.js","assets/secret-request-registry-DrOMKR1H.js"])))=>i.map(i=>d[i]);
|
|
2
2
|
import{t as e}from"./preload-helper-Czpn1I53.js";import{r as t,t as n}from"./base64-DJRlyqZu.js";import{t as r}from"./permissions-surface-registry-CilCRwhh.js";var i=8,a=2e3,o=[`/workspace`,`/shared`,`/tmp`],s=8,c=new Set([`node_modules`,`.git`]),l=1e4,u=/\.(png|jpe?g|gif|webp|svg|avif)$/i,d=4194304,f=262144;function p(){return`att-${Date.now()}-${Math.random().toString(36).slice(2,8)}`}function m(e){return{png:`image/png`,jpg:`image/jpeg`,jpeg:`image/jpeg`,gif:`image/gif`,webp:`image/webp`,svg:`image/svg+xml`,avif:`image/avif`,md:`text/markdown`,json:`application/json`}[e.toLowerCase().split(`.`).pop()??``]??`text/plain`}function h(e,n){let r={id:p(),name:e,size:n.length};if(u.test(e))return n.length>d?{...r,mimeType:m(e),kind:`image`,error:`image too large to inline`}:{...r,mimeType:m(e),kind:`image`,data:t(n)};let i={...r,mimeType:m(e),kind:`file`};return n.length>f?{...i,error:`file too large to inline`}:i}async function g(e){let t=new Uint8Array(await e.arrayBuffer()),n=h(e.name,t);return e.type?{...n,mimeType:e.type}:n}function _(e,t){let n=t.match(/^data:(image\/[^;]+);base64,(.+)$/);return n?{id:p(),name:e,mimeType:n[1],size:Math.floor(n[2].length*3/4),kind:`image`,data:n[2]}:null}var v=`/tmp/upload`,y=1568;async function b(e,t,n){await e.mkdir(v,{recursive:!0}).catch(()=>void 0);let r=`${v}/${Date.now()}-${t.replace(/[^A-Za-z0-9._-]+/g,`_`)}`;return await e.writeFile(r,n),r}async function x(e,t=y){let n=new Image;n.src=e;try{await n.decode()}catch{return e}let r=Math.min(1,t/Math.max(n.naturalWidth,n.naturalHeight,1));if(r>=1)return e;let i=document.createElement(`canvas`);return i.width=Math.round(n.naturalWidth*r),i.height=Math.round(n.naturalHeight*r),i.getContext(`2d`)?.drawImage(n,0,0,i.width,i.height),i.toDataURL(`image/jpeg`,.85)}async function S(e,t,r){let i=_(e,t);if(!i)return null;let a;return r&&i.data&&(a=await b(r,e,n(i.data)).catch(()=>void 0)),{..._(e,await x(t).catch(()=>t))??i,name:e,path:a}}async function C(e,t,n){if(!n)return null;let r=new Uint8Array(await t.arrayBuffer()),i=await b(n,e,r).catch(()=>void 0);return i?{id:p(),name:e,mimeType:t.type||`video/webm`,size:r.length,kind:`file`,path:i}:null}async function w(e){let t=[],n=o.map(e=>({dir:e,depth:0}));for(;n.length>0&&t.length<a;){let{dir:r,depth:i}=n.shift(),o;try{o=await e.readDir(r)}catch{continue}for(let e of o){let o=`${r}/${e.name}`;if(e.type===`directory`)i<s&&!c.has(e.name)&&n.push({dir:o,depth:i+1});else if(t.push(o),t.length>=a)break}}return t}function T(e){let t=null;return async n=>{let r=await e.openReader();(!t||Date.now()-t.at>l)&&(t={at:Date.now(),paths:await w(r)});let a=e=>n===``||e.toLowerCase().includes(n),o=t.paths.filter(e=>a(e)).slice(0,i).map(e=>({id:e,label:e.split(`/`).pop()??e,sub:e.slice(0,e.lastIndexOf(`/`))})),s=[];try{s=(await r.readDir(`/workspace/skills`)).filter(e=>e.type===`directory`&&a(e.name)).slice(0,i).map(e=>({id:e.name,label:e.name}))}catch{}let c=(await e.listConversations().catch(()=>[])).filter(e=>a(e.label)).slice(0,i);return[{kind:`file`,label:`Files`,icon:`file`,entries:o},{kind:`skill`,label:`Skills`,icon:`sparkles`,entries:s},{kind:`conversation`,label:`Conversations`,icon:`message-square`,entries:c}]}}var E=`slicc-wc-attach-style`,D=`
|
|
3
3
|
.wcatt{display:flex;flex-wrap:wrap;gap:6px;padding:8px 10px 0;font-family:var(--ui);}
|
|
4
4
|
.wcatt:empty{display:none;}
|
|
@@ -10,4 +10,4 @@ import{t as e}from"./preload-helper-Czpn1I53.js";import{r as t,t as n}from"./bas
|
|
|
10
10
|
.wcatt__x{appearance:none;background:none;border:none;cursor:pointer;color:var(--txt-3);
|
|
11
11
|
font:inherit;padding:0;line-height:1;}
|
|
12
12
|
.wcatt__x:hover{color:var(--ink);}
|
|
13
|
-
`,O=class{#e;#t=[];constructor(e){if(!document.getElementById(E)){let e=document.createElement(`style`);e.id=E,e.textContent=D,document.head.appendChild(e)}this.#e=document.createElement(`div`),this.#e.className=`wcatt`,e.prepend(this.#e)}get items(){return this.#t}add(e){this.#t.push(e),this.#n()}take(){let e=this.#t;return this.#t=[],this.#n(),e}#n(){this.#e.replaceChildren(...this.#t.map(e=>this.#r(e)))}#r(t){let n=document.createElement(`span`);if(n.className=`wcatt__chip`,t.kind===`image`&&t.data){let r=document.createElement(`img`);r.className=`wcatt__thumb`,r.src=`data:${t.mimeType};base64,${t.data}`,r.alt=t.name,r.addEventListener(`click`,()=>{e(async()=>{let{SliccImagePreview:e}=await import(`./wc-shortcuts-
|
|
13
|
+
`,O=class{#e;#t=[];constructor(e){if(!document.getElementById(E)){let e=document.createElement(`style`);e.id=E,e.textContent=D,document.head.appendChild(e)}this.#e=document.createElement(`div`),this.#e.className=`wcatt`,e.prepend(this.#e)}get items(){return this.#t}add(e){this.#t.push(e),this.#n()}take(){let e=this.#t;return this.#t=[],this.#n(),e}#n(){this.#e.replaceChildren(...this.#t.map(e=>this.#r(e)))}#r(t){let n=document.createElement(`span`);if(n.className=`wcatt__chip`,t.kind===`image`&&t.data){let r=document.createElement(`img`);r.className=`wcatt__thumb`,r.src=`data:${t.mimeType};base64,${t.data}`,r.alt=t.name,r.addEventListener(`click`,()=>{e(async()=>{let{SliccImagePreview:e}=await import(`./wc-shortcuts-Cbk5hDbX.js`).then(e=>e.m);return{SliccImagePreview: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])).then(({SliccImagePreview:e})=>e.show(r.src,r))}),n.append(r)}let r=document.createElement(`span`);r.className=`wcatt__name`,r.textContent=t.name;let i=document.createElement(`button`);return i.type=`button`,i.className=`wcatt__x`,i.setAttribute(`aria-label`,`Remove ${t.name}`),i.textContent=`×`,i.addEventListener(`click`,()=>{this.#t=this.#t.filter(e=>e.id!==t.id),this.#n()}),n.append(r,i),n}};async function k(e){let t=document.createElement(`video`);t.srcObject=e,t.muted=!0;try{await t.play(),await new Promise(e=>requestAnimationFrame(()=>e(null)));let e=document.createElement(`canvas`);return e.width=t.videoWidth,e.height=t.videoHeight,e.width===0||e.height===0?null:(e.getContext(`2d`)?.drawImage(t,0,0),e.toDataURL(`image/png`))}finally{for(let t of e.getTracks())t.stop();t.srcObject=null}}async function A(){let e=r();if(e){let t=await e.request(`screenshare`,{constraints:{video:!0}});if(!t)return null;let n=t.stream;return k(n)}return k(await navigator.mediaDevices.getDisplayMedia({video:!0}))}async function j(e,t){let n=r();if(!n)return null;let i=await n.prompt({kinds:e,description:t,skipIfGranted:!0});for(let e of i.grants)if(e.kind===`camera`||e.kind===`microphone`||e.kind===`screenshare`)for(let t of e.stream.getTracks())t.stop();return i.status===`granted`}var M=`slicc_camera_device`,N=`slicc_microphone_device`,P=[`position:absolute`,`left:50%`,`right:auto`,`transform:translateX(-50%)`,`bottom:56px`,`width:calc(100% - 32px)`,`max-width:680px`,`z-index:3`].join(`;`);async function F(e,t){if(await j([`camera`,`microphone`],`Slicc is requesting access to your camera and microphone to capture a photo or video for this conversation.`)===!1)return null;let n=document.createElement(`slicc-composer-capture`),r=localStorage.getItem(M);r&&n.setAttribute(`preferred-device`,r);let i=localStorage.getItem(N);i&&n.setAttribute(`preferred-audio-device`,i),n.style.cssText=P,n.hidden=!0,n.addEventListener(`slicc-capture-device-change`,e=>{let t=e.detail;if(!t?.deviceId)return;let n=t.kind===`microphone`?N:M;localStorage.setItem(n,t.deviceId)}),e.append(n);try{return await n.open(t)}finally{n.remove()}}async function I(e,t,n){if(!e.dataUrl)return;let r=`photo-${Date.now()}.png`,i=await t.openWriter?.().catch(()=>null)??null,a=await S(r,e.dataUrl,i);a&&n.add(a)}async function L(e,t,n){if(!e.blob)return;let r=/webm/i.test(e.mimeType)?`webm`:`bin`,i=`video-${Date.now()}.${r}`,a=await t.openWriter?.().catch(()=>null)??null,o=await C(i,e.blob,a);o&&n.add(o)}async function R(e,t,n){if(e.mode===`photo`){if(!t.composer){let e=await z();if(!e)return;let r=await S(`photo-${Date.now()}.png`,e,await t.openWriter?.().catch(()=>null)??null);r&&n.add(r);return}let e=await F(t.composer,`photo`);if(!e)return;e.kind===`image`?await I(e,t,n):e.kind===`video`&&await L(e,t,n);return}let r=await A();if(!r)return;let i=await S(`screenshot-${Date.now()}.png`,r,await t.openWriter?.().catch(()=>null)??null);i&&n.add(i)}async function z(){if(await j([`camera`],`Slicc is requesting access to your camera to capture a photo for this conversation.`)===!1)return null;let e=document.createElement(`slicc-camera-dialog`),t=localStorage.getItem(M);t&&e.setAttribute(`preferred-device`,t),e.addEventListener(`slicc-camera-device-change`,e=>{let t=e.detail?.deviceId;t&&localStorage.setItem(M,t)}),document.body.append(e);try{return await e.open()}finally{e.remove()}}async function B(e,t,n){let r=await n.openWriter?.().catch(()=>null)??null,i=r?await b(r,e.name,t).catch(()=>void 0):void 0;return i?{...e,error:void 0,path:i}:e.kind===`image`?e:{...e,error:`could not be saved to the virtual filesystem`}}async function V(e,t,n){let r=await(await t()).readFile(e,{encoding:`binary`});return typeof r==`string`?(n.error(`VFS image pick returned text, not bytes — skipping the inline copy`,e),null):r}async function H(e,t,n){let r=0;try{r=(await(await n()).stat(e)).size}catch{}return{id:p(),name:t,mimeType:m(t),size:r,kind:`file`,path:e}}async function U(e,t,n,r){let i=e.split(`/`).pop()??e;if(u.test(i)){let a=await V(e,t,r);if(a){let t=h(i,a);n.add({...t,error:void 0,path:e});return}}n.add(await H(e,i,t))}function W(e,t){let n=t.value??t.getAttribute(`value`)??``,r=n&&!n.endsWith(` `)?` `:``;t.setAttribute(`value`,`${n}${r}${e}`)}function G(e,t){W(`Use the "${e}" skill: `,t)}async function K(t){let{requestSecretFromUser:n}=await e(async()=>{let{requestSecretFromUser:e}=await import(`./wc-secret-request-DaAszAFd.js`);return{requestSecretFromUser:e}},__vite__mapDeps([26,2,1,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,0,25,27])),r=await n();if(!r.stored)return;let i=r.domains.join(`, `),a=r.persisted?`saved`:`this session only`;W(r.maskedValue?`I stored the secret ${r.name} (masked value ${r.maskedValue}, scope: ${i}, ${a}). Use the masked value — SLICC swaps in the real one at the network boundary. `:`I stored the secret ${r.name} (scope: ${i}, ${a}). Run \`secret get ${r.name}\` for its masked value. `,t.inputCard)}function q(e){return e?.name===`NotAllowedError`}async function J(e,t,n){if(e.kind===`upload`&&e.file instanceof File){let r=new Uint8Array(await e.file.arrayBuffer());n.add(await B(await g(e.file),r,t))}else e.kind===`capture`?await R(e,t,n):e.kind===`file`&&typeof e.id==`string`&&t.openReader?await U(e.id,t.openReader,n,t.log):e.kind===`secret`?await K(t):e.kind===`skill`&&typeof e.label==`string`?G(e.label,t.inputCard):e.kind===`conversation`&&typeof e.id==`string`&&t.freezer.dispatchEvent(new CustomEvent(`freezer-card-select`,{bubbles:!0,composed:!0,detail:{slug:e.id}}))}function Y(e){let{inputCard:t,log:n}=e,r=new O(t),i=t.querySelector(`slicc-add-menu`);return i&&(e.openReader?i.provider=T({openReader:e.openReader,listConversations:e.listConversations??(async()=>[])}):i.results=[],i.setAttribute(`global-drop`,``),e.noCamera&&i.setAttribute(`no-camera`,``),e.secretEntry&&i.setAttribute(`secret-action`,``)),t.addEventListener(`slicc-add`,t=>{let i=t.detail;i&&J(i,e,r).catch(e=>{q(e)||n.error(`WC add-menu action failed`,e)})}),t.addEventListener(`paste`,t=>{let i=t.clipboardData?.items;if(i)for(let a of Array.from(i)){if(!a.type.startsWith(`image/`))continue;let i=a.getAsFile();if(!i)continue;t.preventDefault();let o=(i.type.split(`/`)[1]||`png`).replace(/[^a-z0-9]/gi,``)||`png`,s=i.name?i:new File([i],`pasted-image.${o}`,{type:i.type});J({kind:`upload`,name:s.name,size:s.size,file:s},e,r).catch(e=>n.error(`Paste image failed`,e))}}),r}export{Y as wireWcAttach};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/main-
|
|
2
|
-
import{t as e}from"./preload-helper-Czpn1I53.js";import{C as t,S as n,b as r,r as i,t as a,y as o}from"./wc-live-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/main-DW-YS69h.js","assets/rolldown-runtime-Dd_uD5pT.js","assets/modulepreload-polyfill-P2Xu9kJm.js","assets/account-store-FUhuBOfI.js","assets/preload-helper-Czpn1I53.js","assets/claude-model-version-CSATLzrT.js","assets/models-BSkXF4T6.js","assets/diagnostics-DN_idNHx.js","assets/provider-env-CTOcDKrQ.js","assets/__vite-browser-external-5eBdwsFd.js","assets/openrouter.models-B-zmcypy.js","assets/libesm-BypnjKEL.js","assets/logger-DDBAeTLF.js","assets/base64-DJRlyqZu.js","assets/proxied-fetch-DyBveeCl.js","assets/fetch-body-1l9I58Vk.js","assets/api-endpoint-DGxXvrur.js","assets/runtime-env-Dlaokqg1.js","assets/float-topology-YtctpJaG.js","assets/secret-topology-DLJBhHOi.js","assets/secrets-bridge-client--VZ3E0yk.js","assets/port-bridge-client-Dn8JtUyP.js","assets/tool-ui-eSQ1g2I1.js","assets/providers-DjUwvFlY.js","assets/panel-rpc-B3MSVImO.js","assets/bedrock-camp-compat-BeCSBUrZ.js","assets/bridge-protocol-06nbmp2X.js","assets/messages-zAgr7E2T.js","assets/tray-runtime-config-B9jN9kUJ.js","assets/telemetry-DJyRzh6X.js","assets/feature-flags-O-TLmy2G.js","assets/tray-follower-status-BAjnN7Ar.js","assets/clipboard-eqmn97SP.js","assets/tray-join-url-BIvzbiFR.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{t as e}from"./preload-helper-Czpn1I53.js";import{C as t,S as n,b as r,r as i,t as a,y as o}from"./wc-live-Kx0jpvxz.js";import{wireWcDetached as s}from"./wc-detached-F7FTH1YG.js";async function c(c,l,u=!1){let d;await i(c,l,{floatKind:`extension`,connect:e=>{d=new t(o(e.wiring));let i=n(d);return{client:r(e.wiring),host:i,workbench:(e,t)=>{a(e,d,t,i,l)}}}}),s({client:d,isDetachedSelf:u});let{setupSudoExtension:f}=await e(async()=>{let{setupSudoExtension:e}=await import(`./main-DW-YS69h.js`).then(e=>e.i);return{setupSudoExtension: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,33]));await f({log:l}),d.requestState(),l.info(`WC extension shell connected to offscreen engine`)}export{c as bootExtensionFloat};
|