sliccy 6.148.6 → 6.149.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 -0
- package/dist/node-server/_shared/transcript-redaction.d.ts +12 -1
- package/dist/node-server/_shared/transcript-redaction.d.ts.map +1 -1
- package/dist/node-server/_shared/transcript-redaction.js +5 -5
- package/dist/node-server/_shared/transcript-redaction.js.map +1 -1
- package/dist/ui/.vite/manifest.json +186 -172
- package/dist/ui/assets/CLAUDE-C2sAF3Q0.js +1 -0
- package/dist/ui/assets/DREAMING-DKcamfu0.js +74 -0
- package/dist/ui/assets/GELATIERE-BnNVlnMz.js +1 -0
- package/dist/ui/assets/{MEMORY-BEEBDXkY.js → MEMORY-1jIGxLn4.js} +12 -3
- package/dist/ui/assets/SKILL-C9vwCrkC.js +1 -0
- package/dist/ui/assets/SKILL-Cc0Ep86w.js +1 -0
- package/dist/ui/assets/{SKILL-2Mi1pQ3F.js → SKILL-DJtLE66_.js} +5 -3
- package/dist/ui/assets/SKILL-DvHAkJSI.js +117 -0
- package/dist/ui/assets/SKILL-UcxSfshP.js +66 -0
- package/dist/ui/assets/WIKI-DoBxwf2u.js +1 -0
- package/dist/ui/assets/{account-store-CxhEKTWa.js → account-store-CA1A4MNg.js} +1 -1
- package/dist/ui/assets/{account-store-CSvfMN0q.js → account-store-D5-EuwRH.js} +1 -1
- package/dist/ui/assets/{adobe-CkbPEFWB.js → adobe-DV-vFrsP.js} +1 -1
- package/dist/ui/assets/{adobe-DwR2UBAP.js → adobe-DtbhCwKF.js} +1 -1
- package/dist/ui/assets/{agent-bridge-_io6UvbS.js → agent-bridge-Bk8XJ8b8.js} +8 -8
- package/dist/ui/assets/{agent-panels-DCYDDalu.js → agent-panels-DKzja1c3.js} +1 -1
- package/dist/ui/assets/{apply-layout-CUKNJsnM.js → apply-layout-y9wx9NT9.js} +1 -1
- package/dist/ui/assets/{approver-agent-O_C8F_lu.js → approver-agent-BA3dC9Lg.js} +1 -1
- package/dist/ui/assets/{apps-DmBDvKqA.js → apps-yQbw27PS.js} +1 -1
- package/dist/ui/assets/archive-redaction-ByV7X5fs.js +1 -0
- package/dist/ui/assets/{azure-openai-BqeIibmb.js → azure-openai-DHtO2E0K.js} +1 -1
- package/dist/ui/assets/{azure-openai-hucQjFkk.js → azure-openai-yibXp_Bz.js} +1 -1
- package/dist/ui/assets/{budget-usage-source-B7HIa-K7.js → budget-usage-source-CsYOdKgf.js} +1 -1
- package/dist/ui/assets/{cdp-fnaJdghg.js → cdp-DvBgKWeM.js} +1 -1
- package/dist/ui/assets/{cerebras-Cp_tyicG.js → cerebras-CS6Db07O.js} +1 -1
- package/dist/ui/assets/{cerebras-D4eNW8Dz.js → cerebras-CaDy2asW.js} +1 -1
- package/dist/ui/assets/{composer-speech-Y9nFpucg.js → composer-speech-DPiVvFU6.js} +1 -1
- package/dist/ui/assets/cone-memory-budget-ieIsscyt.js +15 -0
- package/dist/ui/assets/{connect-surface-DE9AvQcr.js → connect-surface-DZZV0bKb.js} +1 -1
- package/dist/ui/assets/descriptor-D-6Koktu.js +1 -0
- package/dist/ui/assets/{directed-approval-B64z8WXS.js → directed-approval-zgdk1qJY.js} +1 -1
- package/dist/ui/assets/feature-flags-BX-OhLDm.js +1 -0
- package/dist/ui/assets/feature-flags-CYCRk6Dq.js +1 -0
- package/dist/ui/assets/frozen-archive-writer--a4fMghf.js +8 -0
- package/dist/ui/assets/{fs-CIkDZ_Dd.js → fs-CeHAWOzG.js} +2 -2
- package/dist/ui/assets/{fs-Bdk6lf_I.js → fs-ZsGKH6_S.js} +1 -1
- package/dist/ui/assets/gelatiere-constants-BYJlhm8R.js +1 -0
- package/dist/ui/assets/gelatiere-store-D36IMluj.js +1 -0
- package/dist/ui/assets/gelatiere-unit-7xZALH_i.js +1 -0
- package/dist/ui/assets/{github-D62L-Qj4.js → github-CaKl6IqQ.js} +1 -1
- package/dist/ui/assets/{github-7zGAPnOR.js → github-EHGL5L1f.js} +2 -2
- package/dist/ui/assets/{github-copilot-DTqmEBkZ.js → github-copilot-BHsKQLD0.js} +1 -1
- package/dist/ui/assets/{github-copilot-K4pi5pmY.js → github-copilot-Cjxeuomt.js} +1 -1
- package/dist/ui/assets/{github-install-DW9eSCWK.js → github-install-CZ0EukOV.js} +1 -1
- package/dist/ui/assets/{github-zip-D5pmGz48.js → github-zip-CS4YNRru.js} +1 -1
- package/dist/ui/assets/{hear-C_o9CbL8.js → hear-Cbevfmh3.js} +1 -1
- package/dist/ui/assets/{help-lfImwIAI.js → help-B7QDR4Te.js} +1 -1
- package/dist/ui/assets/instruction-frontmatter-Bk64dayp.js +3 -0
- package/dist/ui/assets/{js-realm-worker-CuwcQntH.js → js-realm-worker-8iSCqCPx.js} +1 -1
- package/dist/ui/assets/{kernel-worker-ESg7BZtf.js → kernel-worker-C_WWxLV9.js} +648 -662
- package/dist/ui/assets/key-DExP84Xm.js +1 -0
- package/dist/ui/assets/lick-target-env-8JxfVcIV.js +1 -0
- package/dist/ui/assets/{live-session-snapshot-BnA6Mq0G.js → live-session-snapshot-CpwRZg6K.js} +1 -1
- package/dist/ui/assets/{local-llm-BIkUvHqY.js → local-llm-0LkBgtj2.js} +1 -1
- package/dist/ui/assets/{local-llm-D_T0EnaA.js → local-llm-Dr2UbIXv.js} +1 -1
- package/dist/ui/assets/log-DEDI5t_h.js +1 -0
- package/dist/ui/assets/{main-B6EOlFVs.js → main-BAC0OCne.js} +3 -3
- package/dist/ui/assets/{main-cherry-Dn_p-eb4.js → main-cherry-CewPDwbT.js} +1 -1
- package/dist/ui/assets/manager-CstXzWYQ.js +1 -0
- package/dist/ui/assets/memory-budget-CIVoqHgl.js +1 -0
- package/dist/ui/assets/memory-curation-seam-Dhr-Lh0Q.js +1 -0
- package/dist/ui/assets/memory-health-MhSOmzAf.js +1 -0
- package/dist/ui/assets/memory-v2-flag-D50hE5F1.js +1 -0
- package/dist/ui/assets/{mount-PrIS1Sa3.js → mount-BLSZhkn-.js} +3 -3
- package/dist/ui/assets/{mount-a6GiK5eK.js → mount-C-ANRQIp.js} +1 -1
- package/dist/ui/assets/{mount-recovery-B_EuFRnE.js → mount-recovery-DUczfSWq.js} +1 -1
- package/dist/ui/assets/new-session-BoS7dRsh.js +2 -0
- package/dist/ui/assets/{oauth-bootstrap-97a5ChZn.js → oauth-bootstrap-Bxgy2Cqv.js} +2 -2
- package/dist/ui/assets/{onboarding-orchestrator-xYbh_T_5.js → onboarding-orchestrator-Dk1ohi_0.js} +1 -1
- package/dist/ui/assets/{openai-codex-C1-zR0yq.js → openai-codex-BknfgoBF.js} +1 -1
- package/dist/ui/assets/{openai-codex-BOoUGfZo.js → openai-codex-DMzQdrNm.js} +1 -1
- package/dist/ui/assets/{openrouter-DQfvvYij.js → openrouter-CQPRB3mI.js} +1 -1
- package/dist/ui/assets/{openrouter-DoxfEMdx.js → openrouter-CRaR6ORa.js} +1 -1
- package/dist/ui/assets/{openrouter-free-GMWxIUhh.js → openrouter-free-BCZac4lk.js} +1 -1
- package/dist/ui/assets/{openrouter-free-DDqDQdRp.js → openrouter-free-CKjfWow9.js} +1 -1
- package/dist/ui/assets/{openrouter-oauth-CEDhl0OZ.js → openrouter-oauth-DQ6_4qbW.js} +1 -1
- package/dist/ui/assets/{openrouter-oauth-sMAXA75w.js → openrouter-oauth-DZ-Abl0n.js} +1 -1
- package/dist/ui/assets/{panel-rpc-handlers-r2ejq7DG.js → panel-rpc-handlers-l_wby7rY.js} +2 -2
- package/dist/ui/assets/{panelize-shell-BgsRRYSF.js → panelize-shell-BExnoycZ.js} +1 -1
- package/dist/ui/assets/{provider-DBzel_xl.js → provider-CHJuS3Eo.js} +2 -2
- package/dist/ui/assets/{provider-C9ruriwF.js → provider-Ccwke1Gk.js} +1 -1
- package/dist/ui/assets/provider-settings-C9aYrpFT.js +1 -0
- package/dist/ui/assets/provider-store-access-Bvoy_8oD.js +1 -0
- package/dist/ui/assets/provider-store-access-C2g47uIb.js +1 -0
- package/dist/ui/assets/{providers-BecFVHcB.js → providers-BYl2eNQm.js} +1 -1
- package/dist/ui/assets/{providers-Bk7_R6-e.js → providers-Dx2Bx5aE.js} +2 -2
- package/dist/ui/assets/{quick-llm-B8jKq4iQ.js → quick-llm-DT2lt16M.js} +1 -1
- package/dist/ui/assets/{recovery-screen-C8SMqbts.js → recovery-screen-BjiUo-AL.js} +1 -1
- package/dist/ui/assets/run-BY9if0Td.js +42 -0
- package/dist/ui/assets/{run-Cu2b1qXL.js → run-BtmtVfUW.js} +1 -1
- package/dist/ui/assets/{run-DLmWyiS5.js → run-BxzwgwS3.js} +2 -2
- package/dist/ui/assets/{run-CRtbfNhS.js → run-DLgsQ07W.js} +1 -1
- package/dist/ui/assets/run-tBUQGAj8.js +50 -0
- package/dist/ui/assets/{session-command-memory-Bh_U73Lu.js → session-command-memory-BTDKlIRk.js} +4 -3
- package/dist/ui/assets/session-jsonl-BigzXvfg.js +11 -0
- package/dist/ui/assets/{session-jsonl-BxhPJRfn.js → session-jsonl-eMNv3Qki.js} +1 -1
- package/dist/ui/assets/session-search-index-D2VtAM_Q.js +3 -0
- package/dist/ui/assets/{setup-feature-flags-remote-DTWNUOEW.js → setup-feature-flags-remote-Ca2-hqlo.js} +1 -1
- package/dist/ui/assets/sidecar-repair-wcIxeWMP.js +1 -0
- package/dist/ui/assets/{silent-renew-backoff-7OJRYyhc.js → silent-renew-backoff-BHjNTQU2.js} +1 -1
- package/dist/ui/assets/{skills-59WNpYyE.js → skills-CJ8qNnZs.js} +1 -1
- package/dist/ui/assets/slicc-version-PYnMeU2R.js +1 -0
- package/dist/ui/assets/{snapshot-BNRtY2CJ.js → snapshot-DGK3m0L_.js} +1 -1
- package/dist/ui/assets/{snapshot-features-DVnp1w2e.js → snapshot-features-DluhSLEH.js} +1 -1
- package/dist/ui/assets/{soundscape-9bfPI94m.js → soundscape-BK9WmnUG.js} +1 -1
- package/dist/ui/assets/{speak-BaQH0gYp.js → speak-DZISsPxk.js} +1 -1
- package/dist/ui/assets/sprinkle-manager-BCrGJ7_g.js +1 -0
- package/dist/ui/assets/{sprinkle-renderer-BaQcBKrt.js → sprinkle-renderer-D-1PliuW.js} +1 -1
- package/dist/ui/assets/{state-XwTXvaim.js → state-KlJITKEj.js} +1 -1
- package/dist/ui/assets/{store-DR4bp0Ym.js → store-Bfm_2de6.js} +1 -1
- package/dist/ui/assets/{store-CJgEv6ac.js → store-C4pwV1r3.js} +1 -1
- package/dist/ui/assets/{sudo-XxCuOTwL.js → sudo-ClTWT5F4.js} +1 -1
- package/dist/ui/assets/suggestions-CFQTt8oo.js +329 -0
- package/dist/ui/assets/{sync-dialog-DifyU9Wz.js → sync-dialog-Dlmp9or_.js} +1 -1
- package/dist/ui/assets/{transformers-env-0DWpJU1C.js → transformers-env-CKztDfUT.js} +1 -1
- package/dist/ui/assets/{tray-sidecar-BEYI1163.js → tray-sidecar-izQ2ZF5D.js} +1 -1
- package/dist/ui/assets/{upgrade-detection-BDZBbbdQ.js → upgrade-detection-CNPzRkE7.js} +1 -1
- package/dist/ui/assets/{voice-reply-DToO6RTd.js → voice-reply-JlXeQN7_.js} +1 -1
- package/dist/ui/assets/{wc-attach-4VTzCaDp.js → wc-attach-Cl4Hwieg.js} +2 -2
- package/dist/ui/assets/{wc-extension-D0bVp8vB.js → wc-extension-ChMc6MeX.js} +2 -2
- package/dist/ui/assets/wc-follower-CvdBVpCG.js +17 -0
- package/dist/ui/assets/wc-follower-oauth-C83SZJty.js +5 -0
- package/dist/ui/assets/wc-gelatiere-3y6MXjH6.js +1 -0
- package/dist/ui/assets/wc-live-xtrWHFoh.js +406 -0
- package/dist/ui/assets/{wc-nav-D-p0rPR_.js → wc-nav-CDS_UeWj.js} +2 -2
- package/dist/ui/assets/wc-onboarding-DqB8019g.js +2 -0
- package/dist/ui/assets/{wc-placeholder-Db-RyktI.js → wc-placeholder-CZw2rZaI.js} +3 -3
- package/dist/ui/assets/{wc-secret-request-BIFBoH1h.js → wc-secret-request-CP500uCX.js} +1 -1
- package/dist/ui/assets/{wc-settings-C7ARFKxx.js → wc-settings-yS0Tn1rR.js} +3 -3
- package/dist/ui/assets/wc-shell-CuK7bTlD.js +125 -0
- package/dist/ui/assets/{wc-shortcut-config-DiZwCi5M.js → wc-shortcut-config-C-lIC8ic.js} +1 -1
- package/dist/ui/assets/{wc-shortcuts--04PLpy8.js → wc-shortcuts-DsrVa-7o.js} +192 -190
- package/dist/ui/assets/wc-sprinkles-CWvQ1c_3.js +2 -0
- package/dist/ui/assets/{wc-transcript-export-BCJ5AJA8.js → wc-transcript-export-BIlHmS1O.js} +2 -2
- package/dist/ui/assets/wc-tray-PhDRuhzo.js +5 -0
- package/dist/ui/assets/{welcome-CyCMJDqG.js → welcome-BzW33ZtP.js} +10 -9
- package/dist/ui/assets/welcome-detection-DocFcHWj.js +1 -0
- package/dist/ui/assets/{whisper-session-Dl9qamsc.js → whisper-session-B0UflXuX.js} +2 -2
- package/dist/ui/assets/wiki-BXN4hgmw.js +7 -0
- package/dist/ui/assets/wiki-DA0qKUVC.js +307 -0
- package/dist/ui/assets/{xai-grok-SveZvKuJ.js → xai-grok-C_IBpHs8.js} +1 -1
- package/dist/ui/assets/{xai-grok-exJQ7ID9.js → xai-grok-k1KZairZ.js} +1 -1
- package/dist/ui/index.html +4 -4
- package/dist/ui/packages/webapp/index.html +4 -4
- package/package.json +1 -1
- package/dist/ui/assets/CLAUDE-DM1onrcU.js +0 -1
- package/dist/ui/assets/SKILL-D40-t9w0.js +0 -57
- package/dist/ui/assets/descriptor-DObnXZNI.js +0 -1
- package/dist/ui/assets/feature-flags-COdcJUhl.js +0 -1
- package/dist/ui/assets/feature-flags-a-IfHs0F.js +0 -1
- package/dist/ui/assets/frozen-archive-writer-cEYcj5un.js +0 -8
- package/dist/ui/assets/key-MwVo0KUb.js +0 -1
- package/dist/ui/assets/memory-v2-flag-C1duOEOb.js +0 -1
- package/dist/ui/assets/new-session-0QEsz4J9.js +0 -2
- package/dist/ui/assets/provider-settings-BYSP7NWc.js +0 -1
- package/dist/ui/assets/provider-store-access-Csl5Rhtr.js +0 -1
- package/dist/ui/assets/provider-store-access-bV6_bNHG.js +0 -1
- package/dist/ui/assets/session-jsonl-DvUI4M0M.js +0 -11
- package/dist/ui/assets/session-search-index-CYtd-I68.js +0 -3
- package/dist/ui/assets/sidecar-repair-WrV53KRw.js +0 -1
- package/dist/ui/assets/slicc-version-DEC4XjJk.js +0 -1
- package/dist/ui/assets/sprinkle-manager-CxTROBQi.js +0 -1
- package/dist/ui/assets/wc-follower-DUW9NJ1s.js +0 -17
- package/dist/ui/assets/wc-follower-oauth-C-tQshgH.js +0 -5
- package/dist/ui/assets/wc-live-DD50Wcz1.js +0 -399
- package/dist/ui/assets/wc-onboarding-DONgW5bd.js +0 -2
- package/dist/ui/assets/wc-shell-Q2g5GEE1.js +0 -125
- package/dist/ui/assets/wc-sprinkles-x7qO5aBO.js +0 -2
- package/dist/ui/assets/wc-tray-N6BbXJYM.js +0 -5
- package/dist/ui/assets/welcome-detection-CJv2bH67.js +0 -1
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
var e=`// wiki.jsh — CLI for the shared LLM wiki knowledge base at /shared/wiki.
|
|
2
|
+
//
|
|
3
|
+
// Adapted from ai-ecoverse/skills → skills/llm-wiki/wiki.jsh (post the
|
|
4
|
+
// bind-fs-via-require / fail-loudly-on-zero-scan fix and the NFC-normalized
|
|
5
|
+
// comparisons); only the WIKI_ROOT constant differs. Keep the body in sync
|
|
6
|
+
// with upstream when refreshing.
|
|
7
|
+
const fs = require('fs');
|
|
8
|
+
const WIKI_ROOT = '/shared/wiki';
|
|
9
|
+
const RAW_DIR = WIKI_ROOT + '/_raw';
|
|
10
|
+
const nk = (s) => String(s).normalize('NFC');
|
|
11
|
+
|
|
12
|
+
let CATS = null; // populated once by discoverCats()
|
|
13
|
+
|
|
14
|
+
async function discoverCats(soft) {
|
|
15
|
+
if (CATS) return CATS;
|
|
16
|
+
const root = [], nested = [];
|
|
17
|
+
try {
|
|
18
|
+
const top = await fs.readDir(WIKI_ROOT);
|
|
19
|
+
for (const e of top) {
|
|
20
|
+
const n = en(e);
|
|
21
|
+
if (!n || n.startsWith('_') || n.startsWith('.')) continue;
|
|
22
|
+
const dp = WIKI_ROOT + '/' + n;
|
|
23
|
+
try {
|
|
24
|
+
const es = await fs.readDir(dp);
|
|
25
|
+
if (es.some(f => { const fn = en(f); return fn && fn.endsWith('.md'); }))
|
|
26
|
+
root.push(n);
|
|
27
|
+
if (n === 'projects') {
|
|
28
|
+
for (const pe of es) {
|
|
29
|
+
const pn = en(pe);
|
|
30
|
+
if (!pn || pn.startsWith('_') || pn.startsWith('.')) continue;
|
|
31
|
+
const pp = dp + '/' + pn;
|
|
32
|
+
try {
|
|
33
|
+
const pes = await fs.readDir(pp);
|
|
34
|
+
if (pes.some(f => { const fn = en(f); return fn && fn.endsWith('.md'); }))
|
|
35
|
+
nested.push('projects/' + pn);
|
|
36
|
+
} catch (_) {}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
} catch (_) {} // not a directory or unreadable
|
|
40
|
+
}
|
|
41
|
+
} catch (e) {
|
|
42
|
+
if (soft) return [];
|
|
43
|
+
console.error('Error discovering categories: ' + e.message);
|
|
44
|
+
process.exit(1);
|
|
45
|
+
}
|
|
46
|
+
root.sort((a, b) => a.localeCompare(b));
|
|
47
|
+
nested.sort((a, b) => a.localeCompare(b));
|
|
48
|
+
CATS = root.concat(nested);
|
|
49
|
+
return CATS;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const args = process.argv.slice(2);
|
|
53
|
+
const sub = (args[0] || '').toLowerCase();
|
|
54
|
+
|
|
55
|
+
function en(e) {
|
|
56
|
+
return typeof e === 'string' ? e : e.name;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
async function catDirs(cs) {
|
|
60
|
+
const r = [];
|
|
61
|
+
for (const c of cs) {
|
|
62
|
+
try {
|
|
63
|
+
const es = await fs.readDir(WIKI_ROOT + '/' + c);
|
|
64
|
+
for (const e of es) {
|
|
65
|
+
const n = en(e);
|
|
66
|
+
if (n && n.endsWith('.md')) r.push({ cat: c, file: n, path: WIKI_ROOT + '/' + c + '/' + n });
|
|
67
|
+
}
|
|
68
|
+
} catch (_) {}
|
|
69
|
+
}
|
|
70
|
+
return r;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function t(f) {
|
|
74
|
+
return f.replace(/\\.md$/, '').replace(/-/g, ' ');
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
async function find(name) {
|
|
78
|
+
const cats = await discoverCats();
|
|
79
|
+
let c = null, s = name;
|
|
80
|
+
if (name.includes('/')) {
|
|
81
|
+
const p = name.split('/');
|
|
82
|
+
// Support projects/<name>/page as well as cat/page
|
|
83
|
+
if (p[0] === 'projects' && p.length >= 3) {
|
|
84
|
+
c = p[0] + '/' + p[1];
|
|
85
|
+
s = p.slice(2).join('/');
|
|
86
|
+
} else {
|
|
87
|
+
c = p[0];
|
|
88
|
+
s = p.slice(1).join('/');
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
s = s.replace(/\\.md$/, '');
|
|
92
|
+
const ds = c ? [c] : cats;
|
|
93
|
+
for (const d of ds) {
|
|
94
|
+
const p = WIKI_ROOT + '/' + d + '/' + s + '.md';
|
|
95
|
+
if (await fs.exists(p)) return { cat: d, file: s + '.md', path: p };
|
|
96
|
+
}
|
|
97
|
+
const l = nk(s).toLowerCase();
|
|
98
|
+
for (const d of ds) {
|
|
99
|
+
try {
|
|
100
|
+
const es = await fs.readDir(WIKI_ROOT + '/' + d);
|
|
101
|
+
for (const e of es) {
|
|
102
|
+
const n = en(e);
|
|
103
|
+
if (n && nk(n).replace(/\\.md$/, '').toLowerCase() === l) return { cat: d, file: n, path: WIKI_ROOT + '/' + d + '/' + n };
|
|
104
|
+
}
|
|
105
|
+
} catch (_) {}
|
|
106
|
+
}
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function wl(c) {
|
|
111
|
+
const r = /\\[\\[([^\\]]+)\\]\\]/g, ls = [];
|
|
112
|
+
let m;
|
|
113
|
+
for (m = r.exec(c); m !== null; m = r.exec(c)) {
|
|
114
|
+
const target = m[1].split('|', 1)[0].trim();
|
|
115
|
+
if (target) ls.push(target);
|
|
116
|
+
}
|
|
117
|
+
return ls;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
async function cmdSearch() {
|
|
121
|
+
const cats = await discoverCats();
|
|
122
|
+
const term = args.slice(1).join(' ');
|
|
123
|
+
if (!term) { console.error('Usage: wiki search <term>'); process.exit(1); }
|
|
124
|
+
const lo = nk(term).toLowerCase(), pages = await catDirs(cats);
|
|
125
|
+
let h = 0;
|
|
126
|
+
for (const p of pages) {
|
|
127
|
+
if (h >= 20) break;
|
|
128
|
+
const nm = nk(p.file).toLowerCase().includes(lo);
|
|
129
|
+
let lm = null;
|
|
130
|
+
try {
|
|
131
|
+
const c = await fs.readFile(p.path);
|
|
132
|
+
for (const line of c.split('\\n')) {
|
|
133
|
+
if (nk(line).toLowerCase().includes(lo)) { lm = line.trim(); break; }
|
|
134
|
+
}
|
|
135
|
+
} catch (_) { continue; }
|
|
136
|
+
if (nm || lm) { console.log(' ' + p.cat + '/' + p.file + ' — ' + (lm || t(p.file))); h++; }
|
|
137
|
+
}
|
|
138
|
+
if (!h) console.log('No results for "' + term + '".');
|
|
139
|
+
else console.log('\\n' + h + ' result' + (h === 1 ? '' : 's') + '.');
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
async function cmdList() {
|
|
143
|
+
const cats = await discoverCats();
|
|
144
|
+
let c = null;
|
|
145
|
+
if (args[1]) {
|
|
146
|
+
const want = nk(args[1]).toLowerCase();
|
|
147
|
+
c = cats.find(x => nk(x).toLowerCase() === want) || null;
|
|
148
|
+
if (!c) { console.error('Unknown category: ' + args[1] + '\\nCategories: ' + cats.join(', ')); process.exit(1); }
|
|
149
|
+
}
|
|
150
|
+
const pages = await catDirs(c ? [c] : cats);
|
|
151
|
+
if (!pages.length) { console.log(c ? 'No pages in ' + c + '.' : 'No wiki pages found.'); return; }
|
|
152
|
+
let cur = null;
|
|
153
|
+
for (const p of pages) {
|
|
154
|
+
if (p.cat !== cur) { if (cur) console.log(''); console.log(p.cat + '/'); cur = p.cat; }
|
|
155
|
+
console.log(' ' + t(p.file) + ' (' + p.cat + '/' + p.file + ')');
|
|
156
|
+
}
|
|
157
|
+
console.log('\\n' + pages.length + ' page' + (pages.length === 1 ? '' : 's') + ' total.');
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
async function cmdRead() {
|
|
161
|
+
const name = args.slice(1).join(' ');
|
|
162
|
+
if (!name) { console.error('Usage: wiki read <note-name>'); process.exit(1); }
|
|
163
|
+
const n = await find(name);
|
|
164
|
+
if (!n) { console.error('Page not found: ' + name); process.exit(1); }
|
|
165
|
+
try {
|
|
166
|
+
const c = await fs.readFile(n.path);
|
|
167
|
+
console.log('[' + n.cat + '/' + n.file + ']\\n');
|
|
168
|
+
console.log(c);
|
|
169
|
+
} catch (e) { console.error('Error: ' + e.message); process.exit(1); }
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
async function cmdStats() {
|
|
173
|
+
const cats = await discoverCats();
|
|
174
|
+
const rows = [];
|
|
175
|
+
let tot = 0;
|
|
176
|
+
for (const c of cats) {
|
|
177
|
+
try {
|
|
178
|
+
const es = await fs.readDir(WIKI_ROOT + '/' + c);
|
|
179
|
+
const md = es.filter(e => { const n = en(e); return n && n.endsWith('.md'); });
|
|
180
|
+
if (md.length) rows.push(' ' + c.padEnd(24) + ' ' + md.length);
|
|
181
|
+
tot += md.length;
|
|
182
|
+
} catch (_) {}
|
|
183
|
+
}
|
|
184
|
+
let rc = 0, ea = null, la = null;
|
|
185
|
+
try {
|
|
186
|
+
const re = await fs.readDir(RAW_DIR);
|
|
187
|
+
const mf = re.map(e => en(e)).filter(n => n && n.endsWith('.md'));
|
|
188
|
+
rc = mf.length;
|
|
189
|
+
const ds = [];
|
|
190
|
+
for (const f of mf) { const m = f.match(/^(\\d{4}-\\d{2}-\\d{2})_/); if (m) ds.push(m[1]); }
|
|
191
|
+
ds.sort();
|
|
192
|
+
if (ds.length) { ea = ds[0]; la = ds[ds.length - 1]; }
|
|
193
|
+
} catch (_) {}
|
|
194
|
+
if (tot === 0 && rc === 0) {
|
|
195
|
+
console.error('Error: No wiki pages or raw source files found at ' + WIKI_ROOT + '.');
|
|
196
|
+
process.exit(1);
|
|
197
|
+
}
|
|
198
|
+
console.log('Wiki pages by category:');
|
|
199
|
+
for (const row of rows) console.log(row);
|
|
200
|
+
console.log(' ' + 'total'.padEnd(24) + ' ' + tot);
|
|
201
|
+
console.log('\\nRaw source files: ' + rc);
|
|
202
|
+
if (ea && la) console.log(' Date range: ' + ea + ' to ' + la);
|
|
203
|
+
let tl = 0;
|
|
204
|
+
const pages = await catDirs(cats);
|
|
205
|
+
for (const p of pages) { try { tl += wl(await fs.readFile(p.path)).length; } catch (_) {} }
|
|
206
|
+
console.log('\\nTotal wikilinks: ' + tl);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
async function cmdLinks() {
|
|
210
|
+
const cats = await discoverCats();
|
|
211
|
+
const name = args.slice(1).join(' ');
|
|
212
|
+
if (!name) { console.error('Usage: wiki links <note-name>'); process.exit(1); }
|
|
213
|
+
const n = await find(name);
|
|
214
|
+
if (!n) { console.error('Page not found: ' + name); process.exit(1); }
|
|
215
|
+
let ob = [];
|
|
216
|
+
try { ob = [...new Set(wl(await fs.readFile(n.path)))]; } catch (e) { console.error('Error: ' + e.message); process.exit(1); }
|
|
217
|
+
console.log('Links for: ' + n.cat + '/' + n.file + '\\n');
|
|
218
|
+
console.log('Outbound (' + ob.length + '):');
|
|
219
|
+
if (!ob.length) console.log(' (none)');
|
|
220
|
+
else for (const l of ob.sort()) console.log(' -> [[' + l + ']]');
|
|
221
|
+
const nm = nk(n.file).replace(/\\.md$/, ''), pages = await catDirs(cats), ib = [];
|
|
222
|
+
for (const p of pages) {
|
|
223
|
+
if (nk(p.path) === nk(n.path)) continue;
|
|
224
|
+
try { if (wl(await fs.readFile(p.path)).some(l => nk(l) === nm)) ib.push(p.cat + '/' + p.file); } catch (_) {}
|
|
225
|
+
}
|
|
226
|
+
console.log('\\nInbound (' + ib.length + '):');
|
|
227
|
+
if (!ib.length) console.log(' (none)');
|
|
228
|
+
else for (const r of ib.sort()) console.log(' <- ' + r);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
async function cmdOrphans() {
|
|
232
|
+
const cats = await discoverCats();
|
|
233
|
+
const pages = await catDirs(cats), linked = new Set();
|
|
234
|
+
let readable = 0;
|
|
235
|
+
for (const p of pages) {
|
|
236
|
+
try {
|
|
237
|
+
const c = await fs.readFile(p.path);
|
|
238
|
+
readable++;
|
|
239
|
+
for (const l of wl(c)) linked.add(nk(l));
|
|
240
|
+
} catch (_) {}
|
|
241
|
+
}
|
|
242
|
+
if (readable === 0) {
|
|
243
|
+
console.error('Error: No wiki pages could be read at ' + WIKI_ROOT + '.');
|
|
244
|
+
process.exit(1);
|
|
245
|
+
}
|
|
246
|
+
const orph = [];
|
|
247
|
+
for (const p of pages) { const s = nk(p.file).replace(/\\.md$/, ''); if (!linked.has(s)) orph.push(p.cat + '/' + p.file); }
|
|
248
|
+
if (!orph.length) { console.log('No orphan pages found.'); return; }
|
|
249
|
+
console.log('Orphan pages (' + orph.length + '):\\n');
|
|
250
|
+
for (const o of orph) console.log(' ' + o);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
async function cmdRecent() {
|
|
254
|
+
const n = parseInt(args[1], 10) || 10;
|
|
255
|
+
try {
|
|
256
|
+
const es = await fs.readDir(RAW_DIR);
|
|
257
|
+
const mf = es.map(e => en(e)).filter(n => n && n.endsWith('.md'));
|
|
258
|
+
const d = [];
|
|
259
|
+
for (const f of mf) {
|
|
260
|
+
const m = f.match(/^(\\d{4}-\\d{2}-\\d{2})_(.+?)_[0-9a-f]+\\.md$/);
|
|
261
|
+
if (m) d.push({ date: m[1], title: m[2].replace(/-/g, ' '), file: f });
|
|
262
|
+
}
|
|
263
|
+
d.sort((a, b) => b.date.localeCompare(a.date));
|
|
264
|
+
const s = d.slice(0, n);
|
|
265
|
+
console.log(s.length + ' most recent raw sources:\\n');
|
|
266
|
+
for (const e of s) { console.log(' ' + e.date + ' ' + e.title); console.log(' ' + e.file); }
|
|
267
|
+
} catch (e) { console.error('Error: ' + e.message); process.exit(1); }
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
async function cmdLog() {
|
|
271
|
+
const n = parseInt(args[1], 10) || 10;
|
|
272
|
+
const lp = WIKI_ROOT + '/log.md';
|
|
273
|
+
try {
|
|
274
|
+
if (!(await fs.exists(lp))) { console.log('log.md does not exist yet.'); return; }
|
|
275
|
+
const c = await fs.readFile(lp), lines = c.split('\\n'), entries = [];
|
|
276
|
+
let cur = null;
|
|
277
|
+
for (const l of lines) {
|
|
278
|
+
if (l.startsWith('## ')) { if (cur) entries.push(cur); cur = { heading: l, body: [] }; }
|
|
279
|
+
else if (cur) cur.body.push(l);
|
|
280
|
+
}
|
|
281
|
+
if (cur) entries.push(cur);
|
|
282
|
+
if (!entries.length) { console.log('No log entries found.'); return; }
|
|
283
|
+
const s = entries.slice(-n);
|
|
284
|
+
console.log('Last ' + s.length + ' log entr' + (s.length === 1 ? 'y' : 'ies') + ':\\n');
|
|
285
|
+
for (const e of s) { console.log(e.heading); for (const b of e.body.filter(l => l.trim()).slice(0, 3)) console.log(' ' + b.trim()); console.log(''); }
|
|
286
|
+
} catch (e) { console.error('Error: ' + e.message); process.exit(1); }
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
async function cmdHelp() {
|
|
290
|
+
const cats = await discoverCats(true);
|
|
291
|
+
const catLine = cats.length ? cats.join(', ') : '(none discovered at ' + WIKI_ROOT + ')';
|
|
292
|
+
console.log('wiki — LLM wiki knowledge base CLI\\n\\nUsage: wiki <command> [args]\\n\\nCommands:\\n search <term> Search wiki pages by title and content (max 20 results)\\n list [category] List all wiki pages, optionally filtered by category\\n read <note> Display a wiki page (accepts name, name.md, or category/name)\\n stats Pages per category, raw file count, date range, wikilink count\\n links <note> Show inbound and outbound wikilinks for a note\\n orphans Find pages with zero inbound links\\n recent [n] Show N most recent raw source files (default 10)\\n log [n] Show last N log.md entries (default 10)\\n help Show this help\\n\\nCategories: ' + catLine + '\\nWiki root: ' + WIKI_ROOT);
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
switch (sub) {
|
|
296
|
+
case 'search': await cmdSearch(); break;
|
|
297
|
+
case 'list': await cmdList(); break;
|
|
298
|
+
case 'read': await cmdRead(); break;
|
|
299
|
+
case 'stats': await cmdStats(); break;
|
|
300
|
+
case 'links': await cmdLinks(); break;
|
|
301
|
+
case 'orphans': await cmdOrphans(); break;
|
|
302
|
+
case 'recent': await cmdRecent(); break;
|
|
303
|
+
case 'log': await cmdLog(); break;
|
|
304
|
+
case 'help': await cmdHelp(); break;
|
|
305
|
+
default: await cmdHelp(); break;
|
|
306
|
+
}
|
|
307
|
+
`;export{e as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as e,r as t}from"./account-store-
|
|
1
|
+
import{_ as e,r as t}from"./account-store-D5-EuwRH.js";import{a as n}from"./diagnostics-DN_idNHx.js";import{a as r,r as i}from"./compat-uEPf6-XW.js";import{c as a,i as o,r as s,s as c}from"./legacy-api-aliases-jKEvBgOL.js";import"./provider-settings-C9aYrpFT.js";import{n as l,r as u,t as d}from"./pkce-hGf_TEnP.js";import{XaiErrorCode as f,XaiOAuthError as p}from"./xai-grok-errors-ByEMMSoz.js";function m(e){return typeof e==`object`&&!!e}function h(e){if(!m(e))return null;let t=m(e.config)?e.config:e,n=t.creditUsagePercent;if(typeof n!=`number`||!Number.isFinite(n))return null;let r=Math.min(1e3,Math.max(0,n)),i=m(t.currentPeriod)?t.currentPeriod:{},a=i.type,o=typeof a==`string`?a.replace(`USAGE_PERIOD_TYPE_`,``).toLowerCase():``,s=i.end??t.billingPeriodEnd,c=typeof s==`string`&&Number.isFinite(Date.parse(s))?s:void 0;return{percent:r,status:`ok`,window:o&&o!==`unspecified`?o:`billing`,...c?{resetsAt:c}:{}}}async function g(e,t,n={}){let r=new AbortController,i=setTimeout(()=>r.abort(),n.timeoutMs??8e3);try{let n=await t(`https://cli-chat-proxy.grok.com/v1/billing?format=credits`,{headers:{Authorization:`Bearer ${e}`},signal:r.signal}),{status:i}=n;if(i===404||i===501)return null;if(!n.ok)throw Error(`xAI Grok usage: ${i===401||i===403?`re-login required`:`failed`} (${i})`);let a=await n.text();if(a.length>65536)return null;try{return h(JSON.parse(a))}catch{return null}}finally{clearTimeout(i)}}const _=`xai-grok`,v=`https://auth.x.ai`,y=`${v}/oauth2/authorize`,b=`${v}/oauth2/token`,x=`b1a00492-073a-47ea-816f-4c329264a828`,S=`http://127.0.0.1:56121/callback`,C=`https://api.x.ai/v1`,w=`grok-4.5`,T=`${_}-openai`;function E(){return i(`xai`)}function D(e){return{id:e.id,name:e.name,api:`openai`,reasoning:e.reasoning,input:e.input,context_window:e.contextWindow,max_tokens:e.maxTokens,compat:e.compat,thinkingLevelMap:e.thinkingLevelMap}}function O(e){let t=E(),n=t.find(t=>t.id===e.id);if(!n&&(console.warn(`xAI model "${e.id}" is no longer in the pi-ai catalog; falling back to default "${w}"`),n=t.find(e=>e.id===w),!n))throw Error(`xAI default model "${w}" is not registered by pi-ai`);if(n.api!==`openai-responses`&&n.api!==`openai-completions`)throw Error(`Unsupported pi-ai API "${n.api}" for xAI model "${e.id}"`);return{...e,...n,baseUrl:C}}async function k(e,t){let n=new URLSearchParams({grant_type:`authorization_code`,code:e,redirect_uri:S,client_id:x,code_verifier:t}),r=await fetch(b,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:n});if(!r.ok)throw new p(`xAI token exchange failed: ${r.status} ${await r.text()}`,f.TOKEN_EXCHANGE_FAILED);let i=await r.json();if(!i.access_token)throw new p(`xAI token exchange did not return access_token.`,f.TOKEN_EXCHANGE_INVALID);return i}async function A(e){try{let t=new URLSearchParams({grant_type:`refresh_token`,refresh_token:e,client_id:x}),n=await fetch(b,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:t});return n.ok?await n.json():(console.error(`[xai-grok] refresh failed:`,n.status,await n.text()),null)}catch(e){return console.error(`[xai-grok] refresh error:`,e instanceof Error?e.message:String(e)),null}}function j(){return t().find(e=>e.providerId===_)}async function M(){let t=j();if(!t?.accessToken)throw new p("Not signed in to xAI Grok — run /login or `oauth-token xai-grok`",f.AUTH_MISSING,!0);let n=t.tokenExpiresAt??0;if(n&&Date.now()+6e4<n)return t.accessToken;if(t.refreshToken){let n=await A(t.refreshToken);if(n?.access_token)return await e({providerId:_,accessToken:n.access_token,refreshToken:n.refresh_token??t.refreshToken,tokenExpiresAt:Date.now()+(n.expires_in??21600)*1e3,scopes:n.scope??t.scopes}),n.access_token}return t.accessToken}async function N(){if(!j()?.accessToken)throw Error(`xAI Grok budget: not signed in`);return g(await M(),fetch)}function P(e,t){return{type:`error`,reason:`error`,error:{role:`assistant`,content:[],api:T,provider:_,model:e.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:`error`,errorMessage:t instanceof Error?t.message:String(t),timestamp:Date.now()}}}function F(e,t){return t?{...e??{},"x-grok-conv-id":t}:e}function I(e){console.error(`[xai-grok] Stream error:`,e instanceof Error?e.message:String(e))}async function L(e,t,n,r){try{let i=await M(),a=r.sessionId,c=O(t),l={...r,apiKey:i,headers:F(r.headers,a)},u=c.api===`openai-responses`?o(c,n,l):s(c,n,l);for await(let t of u)e.push(t);e.end()}catch(n){I(n),e.push(P(t,n)),e.end()}}async function R(e,t,n,r){try{let i=await M(),o=r?.sessionId,s=O(t),l={...r,apiKey:i,headers:F(r?.headers,o)},u=s.api===`openai-responses`?a(s,n,l):c(s,n,l);for await(let t of u)e.push(t);e.end()}catch(n){I(n),e.push(P(t,n)),e.end()}}const z=(e,t,r={})=>{let i=n();return L(i,e,t,r).catch(I),i},B=(e,t,r)=>{let i=n();return R(i,e,t,r).catch(I),i},V={id:_,name:`xAI Grok (SuperGrok OAuth)`,description:`Grok via xAI OAuth — uses your SuperGrok subscription, no API key needed. Default model is Grok 4.5.`,requiresApiKey:!1,requiresBaseUrl:!1,isOAuth:!0,defaultModelId:w,oauthTokenDomains:[`api.x.ai`,`*.x.ai`,`auth.x.ai`,`accounts.x.ai`,`cli-chat-proxy.grok.com`],getModelIds:()=>E().map(D),getBudgetUsage:N,onOAuthLoginIntercepted:async(t,n,r)=>{let i=l(),a=await d(i),o=u(),s=u(),c=new URL(y);c.searchParams.set(`response_type`,`code`),c.searchParams.set(`client_id`,x),c.searchParams.set(`redirect_uri`,S),c.searchParams.set(`scope`,r?.scopes??`openid profile email offline_access grok-cli:access api:access`),c.searchParams.set(`code_challenge`,a),c.searchParams.set(`code_challenge_method`,`S256`),c.searchParams.set(`state`,o),c.searchParams.set(`nonce`,s),c.searchParams.set(`plan`,`generic`),c.searchParams.set(`referrer`,`slicc`);let m=await t({authorizeUrl:c.toString(),redirectUriPattern:`http://127.0.0.1:56121/*`,onCapture:`close`});if(!m)throw new p(`xAI OAuth login was cancelled or timed out`,f.CALLBACK_TIMEOUT);let h=new URL(m),g=h.searchParams.get(`code`),v=h.searchParams.get(`state`);if(!g)throw new p(`xAI OAuth redirect did not include a code`,f.CODE_MISSING);if(v!==o)throw new p(`xAI OAuth state mismatch — possible CSRF, aborting`,f.STATE_MISMATCH);let b=await k(g,i);await e({providerId:_,accessToken:b.access_token,refreshToken:b.refresh_token,tokenExpiresAt:Date.now()+(b.expires_in??21600)*1e3,baseUrl:C,scopes:b.scope}),n()},onOAuthLogout:async()=>{await e({providerId:_,accessToken:``})},onSilentRenew:async()=>{let t=j();if(!t?.refreshToken)return null;let n=await A(t.refreshToken);return n?.access_token?(await e({providerId:_,accessToken:n.access_token,refreshToken:n.refresh_token??t.refreshToken,tokenExpiresAt:Date.now()+(n.expires_in??21600)*1e3,scopes:n.scope??t.scopes}),n.access_token):null}};function H(){r({api:T,stream:z,streamSimple:B})}export{f as XaiErrorCode,p as XaiOAuthError,V as config,H as register};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{G as e,f as t}from"./account-store-
|
|
1
|
+
import{G as e,f as t}from"./account-store-CA1A4MNg.js";import{a as n}from"./diagnostics-DN_idNHx.js";import{d as r,l as i}from"./claude-model-version-CSATLzrT.js";import{c as a,i as o,r as s,s as c}from"./legacy-api-aliases-bAJ0Klzq.js";import"./main-BAC0OCne.js";import{n as l,r as u,t as d}from"./pkce-hGf_TEnP.js";import{XaiErrorCode as f,XaiOAuthError as p}from"./xai-grok-errors-bnlIBeu-.js";var m=`https://cli-chat-proxy.grok.com/v1/billing?format=credits`,h=8e3,g=65536,_=1e3;function v(e){return typeof e==`object`&&!!e}function y(e){if(!v(e))return null;let t=v(e.config)?e.config:e,n=t.creditUsagePercent;if(typeof n!=`number`||!Number.isFinite(n))return null;let r=Math.min(_,Math.max(0,n)),i=v(t.currentPeriod)?t.currentPeriod:{},a=i.type,o=typeof a==`string`?a.replace(`USAGE_PERIOD_TYPE_`,``).toLowerCase():``,s=i.end??t.billingPeriodEnd,c=typeof s==`string`&&Number.isFinite(Date.parse(s))?s:void 0;return{percent:r,status:`ok`,window:o&&o!==`unspecified`?o:`billing`,...c?{resetsAt:c}:{}}}async function b(e,t,n={}){let r=new AbortController,i=setTimeout(()=>r.abort(),n.timeoutMs??h);try{let n=await t(m,{headers:{Authorization:`Bearer ${e}`},signal:r.signal}),{status:i}=n;if(i===404||i===501)return null;if(!n.ok)throw Error(`xAI Grok usage: ${i===401||i===403?`re-login required`:`failed`} (${i})`);let a=await n.text();if(a.length>g)return null;try{return y(JSON.parse(a))}catch{return null}}finally{clearTimeout(i)}}var x=`xai-grok`,S=`https://auth.x.ai`,C=`${S}/oauth2/authorize`,w=`${S}/oauth2/token`,T=`b1a00492-073a-47ea-816f-4c329264a828`,E=`openid profile email offline_access grok-cli:access api:access`,D=`http://127.0.0.1:56121/callback`,O=`http://127.0.0.1:56121/*`,k=`https://api.x.ai/v1`,A=`grok-4.5`,j=`${x}-openai`;function M(){return i(`xai`)}function N(e){return{id:e.id,name:e.name,api:`openai`,reasoning:e.reasoning,input:e.input,context_window:e.contextWindow,max_tokens:e.maxTokens,compat:e.compat,thinkingLevelMap:e.thinkingLevelMap}}function P(e){let t=M(),n=t.find(t=>t.id===e.id);if(!n&&(console.warn(`xAI model "${e.id}" is no longer in the pi-ai catalog; falling back to default "${A}"`),n=t.find(e=>e.id===A),!n))throw Error(`xAI default model "${A}" is not registered by pi-ai`);if(n.api!==`openai-responses`&&n.api!==`openai-completions`)throw Error(`Unsupported pi-ai API "${n.api}" for xAI model "${e.id}"`);return{...e,...n,baseUrl:k}}async function F(e,t){let n=new URLSearchParams({grant_type:`authorization_code`,code:e,redirect_uri:D,client_id:T,code_verifier:t}),r=await fetch(w,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:n});if(!r.ok)throw new p(`xAI token exchange failed: ${r.status} ${await r.text()}`,f.TOKEN_EXCHANGE_FAILED);let i=await r.json();if(!i.access_token)throw new p(`xAI token exchange did not return access_token.`,f.TOKEN_EXCHANGE_INVALID);return i}async function I(e){try{let t=new URLSearchParams({grant_type:`refresh_token`,refresh_token:e,client_id:T}),n=await fetch(w,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:t});return n.ok?await n.json():(console.error(`[xai-grok] refresh failed:`,n.status,await n.text()),null)}catch(e){return console.error(`[xai-grok] refresh error:`,e instanceof Error?e.message:String(e)),null}}function L(){return t().find(e=>e.providerId===x)}async function R(){let t=L();if(!t?.accessToken)throw new p("Not signed in to xAI Grok — run /login or `oauth-token xai-grok`",f.AUTH_MISSING,!0);let n=t.tokenExpiresAt??0;if(n&&Date.now()+6e4<n)return t.accessToken;if(t.refreshToken){let n=await I(t.refreshToken);if(n?.access_token)return await e({providerId:x,accessToken:n.access_token,refreshToken:n.refresh_token??t.refreshToken,tokenExpiresAt:Date.now()+(n.expires_in??21600)*1e3,scopes:n.scope??t.scopes}),n.access_token}return t.accessToken}async function z(){if(!L()?.accessToken)throw Error(`xAI Grok budget: not signed in`);return b(await R(),fetch)}function B(e,t){return{type:`error`,reason:`error`,error:{role:`assistant`,content:[],api:j,provider:x,model:e.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:`error`,errorMessage:t instanceof Error?t.message:String(t),timestamp:Date.now()}}}function V(e,t){return t?{...e??{},"x-grok-conv-id":t}:e}function H(e){console.error(`[xai-grok] Stream error:`,e instanceof Error?e.message:String(e))}async function U(e,t,n,r){try{let i=await R(),a=r.sessionId,c=P(t),l={...r,apiKey:i,headers:V(r.headers,a)},u=c.api===`openai-responses`?o(c,n,l):s(c,n,l);for await(let t of u)e.push(t);e.end()}catch(n){H(n),e.push(B(t,n)),e.end()}}async function W(e,t,n,r){try{let i=await R(),o=r?.sessionId,s=P(t),l={...r,apiKey:i,headers:V(r?.headers,o)},u=s.api===`openai-responses`?a(s,n,l):c(s,n,l);for await(let t of u)e.push(t);e.end()}catch(n){H(n),e.push(B(t,n)),e.end()}}var G=(e,t,r={})=>{let i=n();return U(i,e,t,r).catch(H),i},K=(e,t,r)=>{let i=n();return W(i,e,t,r).catch(H),i},q={id:x,name:`xAI Grok (SuperGrok OAuth)`,description:`Grok via xAI OAuth — uses your SuperGrok subscription, no API key needed. Default model is Grok 4.5.`,requiresApiKey:!1,requiresBaseUrl:!1,isOAuth:!0,defaultModelId:A,oauthTokenDomains:[`api.x.ai`,`*.x.ai`,`auth.x.ai`,`accounts.x.ai`,`cli-chat-proxy.grok.com`],getModelIds:()=>M().map(N),getBudgetUsage:z,onOAuthLoginIntercepted:async(t,n,r)=>{let i=l(),a=await d(i),o=u(),s=u(),c=new URL(C);c.searchParams.set(`response_type`,`code`),c.searchParams.set(`client_id`,T),c.searchParams.set(`redirect_uri`,D),c.searchParams.set(`scope`,r?.scopes??E),c.searchParams.set(`code_challenge`,a),c.searchParams.set(`code_challenge_method`,`S256`),c.searchParams.set(`state`,o),c.searchParams.set(`nonce`,s),c.searchParams.set(`plan`,`generic`),c.searchParams.set(`referrer`,`slicc`);let m=await t({authorizeUrl:c.toString(),redirectUriPattern:O,onCapture:`close`});if(!m)throw new p(`xAI OAuth login was cancelled or timed out`,f.CALLBACK_TIMEOUT);let h=new URL(m),g=h.searchParams.get(`code`),_=h.searchParams.get(`state`);if(!g)throw new p(`xAI OAuth redirect did not include a code`,f.CODE_MISSING);if(_!==o)throw new p(`xAI OAuth state mismatch — possible CSRF, aborting`,f.STATE_MISMATCH);let v=await F(g,i);await e({providerId:x,accessToken:v.access_token,refreshToken:v.refresh_token,tokenExpiresAt:Date.now()+(v.expires_in??21600)*1e3,baseUrl:k,scopes:v.scope}),n()},onOAuthLogout:async()=>{await e({providerId:x,accessToken:``})},onSilentRenew:async()=>{let t=L();if(!t?.refreshToken)return null;let n=await I(t.refreshToken);return n?.access_token?(await e({providerId:x,accessToken:n.access_token,refreshToken:n.refresh_token??t.refreshToken,tokenExpiresAt:Date.now()+(n.expires_in??21600)*1e3,scopes:n.scope??t.scopes}),n.access_token):null}};function J(){r({api:j,stream:G,streamSimple:K})}export{f as XaiErrorCode,p as XaiOAuthError,q as config,J as register};
|
package/dist/ui/index.html
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<title>slicc</title>
|
|
7
7
|
<link rel="icon" type="image/png" href="/logos/sliccy-color-1scoops-32x32.png" />
|
|
8
|
-
<script type="module" crossorigin src="/assets/main-
|
|
8
|
+
<script type="module" crossorigin src="/assets/main-BAC0OCne.js"></script>
|
|
9
9
|
<link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-Dd_uD5pT.js">
|
|
10
10
|
<link rel="modulepreload" crossorigin href="/assets/modulepreload-polyfill-P2Xu9kJm.js">
|
|
11
11
|
<link rel="modulepreload" crossorigin href="/assets/preload-helper-Czpn1I53.js">
|
|
@@ -27,15 +27,15 @@
|
|
|
27
27
|
<link rel="modulepreload" crossorigin href="/assets/port-bridge-client-Dn8JtUyP.js">
|
|
28
28
|
<link rel="modulepreload" crossorigin href="/assets/secrets-bridge-client--VZ3E0yk.js">
|
|
29
29
|
<link rel="modulepreload" crossorigin href="/assets/tool-ui-eSQ1g2I1.js">
|
|
30
|
-
<link rel="modulepreload" crossorigin href="/assets/providers-
|
|
30
|
+
<link rel="modulepreload" crossorigin href="/assets/providers-Dx2Bx5aE.js">
|
|
31
31
|
<link rel="modulepreload" crossorigin href="/assets/panel-rpc-B3MSVImO.js">
|
|
32
32
|
<link rel="modulepreload" crossorigin href="/assets/bedrock-camp-compat-BeCSBUrZ.js">
|
|
33
|
-
<link rel="modulepreload" crossorigin href="/assets/account-store-
|
|
33
|
+
<link rel="modulepreload" crossorigin href="/assets/account-store-CA1A4MNg.js">
|
|
34
34
|
<link rel="modulepreload" crossorigin href="/assets/bridge-protocol-06nbmp2X.js">
|
|
35
35
|
<link rel="modulepreload" crossorigin href="/assets/messages-zAgr7E2T.js">
|
|
36
36
|
<link rel="modulepreload" crossorigin href="/assets/tray-runtime-config-B9jN9kUJ.js">
|
|
37
37
|
<link rel="modulepreload" crossorigin href="/assets/telemetry-DJyRzh6X.js">
|
|
38
|
-
<link rel="modulepreload" crossorigin href="/assets/feature-flags-
|
|
38
|
+
<link rel="modulepreload" crossorigin href="/assets/feature-flags-CYCRk6Dq.js">
|
|
39
39
|
<link rel="modulepreload" crossorigin href="/assets/tray-follower-status-BAjnN7Ar.js">
|
|
40
40
|
<link rel="modulepreload" crossorigin href="/assets/clipboard-eqmn97SP.js">
|
|
41
41
|
<link rel="modulepreload" crossorigin href="/assets/tray-join-url-BIvzbiFR.js">
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<title>slicc</title>
|
|
7
7
|
<link rel="icon" type="image/png" href="/logos/sliccy-color-1scoops-32x32.png" />
|
|
8
|
-
<script type="module" crossorigin src="/assets/main-
|
|
8
|
+
<script type="module" crossorigin src="/assets/main-BAC0OCne.js"></script>
|
|
9
9
|
<link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-Dd_uD5pT.js">
|
|
10
10
|
<link rel="modulepreload" crossorigin href="/assets/modulepreload-polyfill-P2Xu9kJm.js">
|
|
11
11
|
<link rel="modulepreload" crossorigin href="/assets/preload-helper-Czpn1I53.js">
|
|
@@ -27,15 +27,15 @@
|
|
|
27
27
|
<link rel="modulepreload" crossorigin href="/assets/port-bridge-client-Dn8JtUyP.js">
|
|
28
28
|
<link rel="modulepreload" crossorigin href="/assets/secrets-bridge-client--VZ3E0yk.js">
|
|
29
29
|
<link rel="modulepreload" crossorigin href="/assets/tool-ui-eSQ1g2I1.js">
|
|
30
|
-
<link rel="modulepreload" crossorigin href="/assets/providers-
|
|
30
|
+
<link rel="modulepreload" crossorigin href="/assets/providers-Dx2Bx5aE.js">
|
|
31
31
|
<link rel="modulepreload" crossorigin href="/assets/panel-rpc-B3MSVImO.js">
|
|
32
32
|
<link rel="modulepreload" crossorigin href="/assets/bedrock-camp-compat-BeCSBUrZ.js">
|
|
33
|
-
<link rel="modulepreload" crossorigin href="/assets/account-store-
|
|
33
|
+
<link rel="modulepreload" crossorigin href="/assets/account-store-CA1A4MNg.js">
|
|
34
34
|
<link rel="modulepreload" crossorigin href="/assets/bridge-protocol-06nbmp2X.js">
|
|
35
35
|
<link rel="modulepreload" crossorigin href="/assets/messages-zAgr7E2T.js">
|
|
36
36
|
<link rel="modulepreload" crossorigin href="/assets/tray-runtime-config-B9jN9kUJ.js">
|
|
37
37
|
<link rel="modulepreload" crossorigin href="/assets/telemetry-DJyRzh6X.js">
|
|
38
|
-
<link rel="modulepreload" crossorigin href="/assets/feature-flags-
|
|
38
|
+
<link rel="modulepreload" crossorigin href="/assets/feature-flags-CYCRk6Dq.js">
|
|
39
39
|
<link rel="modulepreload" crossorigin href="/assets/tray-follower-status-BAjnN7Ar.js">
|
|
40
40
|
<link rel="modulepreload" crossorigin href="/assets/clipboard-eqmn97SP.js">
|
|
41
41
|
<link rel="modulepreload" crossorigin href="/assets/tray-join-url-BIvzbiFR.js">
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
var e="# CLAUDE.md\n\nThis file covers the default virtual filesystem payload in `packages/vfs-root/`.\n\n## What This Package Contains\n\n`packages/vfs-root/` is copied into the app's virtual filesystem on init/reset. It is content, not runtime code.\n\n## Directory Structure\n\n| Path | Purpose |\n| ------------------------------------- | ------------------------------------------------------------------------------------------ |\n| `packages/vfs-root/shared/` | Shared content that becomes `/shared/` in the VFS |\n| `packages/vfs-root/workspace/` | Default workspace content that becomes `/workspace/` in the VFS |\n| `packages/vfs-root/shared/CLAUDE.md` | Agent-facing runtime instructions bundled into `/shared/CLAUDE.md` |\n| `packages/vfs-root/shared/MEMORY.md` | User-editable memory curator config bundled as `/shared/MEMORY.md` |\n| `packages/vfs-root/shared/sprinkles/` | Built-in sprinkle UIs |\n| `packages/vfs-root/shared/sounds/` | Shared notification sounds |\n| `packages/vfs-root/workspace/skills/` | Default installable workspace skills |\n| `packages/vfs-root/etc/` | System config seeded into `/etc/` (`models`, `sudoers`, `APPROVALS.md`, `slicc/keys.json`) |\n\n## Adding Default Content\n\n### Memory curator\n\n- `shared/MEMORY.md` is the single source for the runner's build-time fallback and the seeded\n `/shared/MEMORY.md` file.\n- The file is seeded only when absent, so user and skill customizations survive later boots.\n- `MEMORY.md` is user-edited only; the curator intentionally cannot rewrite its own instructions.\n- Frontmatter uses a strict YAML subset: block-array items may have `#` comment tails; inline\n entries containing commas must be quoted. A bare `/` is rejected from `writablePaths`.\n- Frontmatter `allowedCommands` entries extend the curator's built-in base set; they do not\n replace or remove base commands.\n- The curator may rewrite the entire memory file, and the hard character budget\n applies to the entire file with no protected region.\n- **The curator edits a staged draft, never the live file.** `{{MEMORY_PATH}}` resolves to\n `/sessions/.curation/<archive>/draft.md`, seeded (with a `base.md` snapshot) from the live\n memory when the pass spawns; the agent bridge three-way-merges base→draft onto the live file\n on exit 0, before the success receipt (`mergeOnSuccess`). Concurrent live edits survive;\n conflicting regions resolve to the curator. A killed or failed run leaves the live memory\n untouched. The bridge also writes `/sessions/.curation/<archive>/status.json` on both exit\n paths (`outcomeReceiptPath`) — the durable ledger of which sessions completed vs failed\n curation; the index entry mirrors it as `memoryCuratedAt` / `memoryFailed`. Per-archive\n keying means parallel per-cone curators (#1666) never share staging state.\n- Every `##`/`###` memory section ends with a `YYYY-MM-DD` last-verified date, in UTC to match\n archive timestamps. Each pass re-verifies the oldest sections first; undated sections are\n maximally stale.\n- The curator's write grant is `/workspace/CLAUDE.md` alone, not `/workspace/`. It can run `upskill`\n to look up a skill for a pitfall it found, and a directory-wide grant would also let it install\n into `/workspace/skills/`. Reads still cover `/workspace/`. Single-file entries in\n `writablePaths` work because `generateScoopSudoers` emits both the bare path and the `/**` form.\n- The pass is detached, so it spawns with `notifyOnComplete`. Its closing message reaches the cone\n on the `scoop-notify` channel; that is where a skill suggestion lands. Without it the report is\n discarded and the cone never learns the pass ran.\n- Turn count is what a pass costs, because every turn re-reads the whole context as a cache read.\n Two things keep it down, and both belong to the prompt rather than the runtime: `thinkingLevel`\n (default `medium`; spawned agents otherwise resolve to `off`) so the curator plans the cut\n instead of converging by trial and error, and the archive reading recipes so it never `cat`s a\n multi-megabyte archive whose `slicc:session-data` block is a single line holding half the file.\n\n### Approver agent\n\n- `etc/APPROVALS.md` is the single source for the runner's build-time fallback and\n the seeded `/etc/APPROVALS.md`, exactly like `shared/MEMORY.md` is for the curator.\n `SudoManager.ensureDefaults()` does the seeding, when absent, on the ungated\n handle — the same place `/etc/sudoers` is seeded, and for the same reason: the\n file is self-protected, so anything else that had to create it (the `upgrade\napply` merge) would prompt the owner to approve the default already in force (#2686).\n- It lives in `/etc/` because it is POLICY, next to `sudoers` — not in `/shared/`,\n which is agent-visible content. Writes to it are self-protected in\n `base/sudoers.ts` (`isSelfProtectedWrite`) for the same reason writes to\n `/etc/sudoers` are: it decides what a GUEST may do, and a cone acting on a\n guest's message must not rewrite the rules gating that guest without the owner\n seeing a prompt.\n- Re-read on EVERY decision, not cached: an owner who tightens it after a bad\n call expects the next decision to use it. Missing or unreadable falls back to\n the bundled default rather than wedging approvals shut.\n- The optional ```yaml block tunes `timeoutSeconds` (clamped — a guest, and for\n a tool gate the cone's turn, is blocked on the decision), `model`, and\n `thinkingLevel`. Unreadable values fall back rather than becoming real.\n- The approver never reads this file itself; the runtime reads it and puts it in\n the prompt. The agent holds no write grant at all.\n\n### Skills\n\n- Add new built-in workspace skills under `packages/vfs-root/workspace/skills/<skill-name>/`.\n- Include `SKILL.md` and any companion assets or `.jsh` scripts the skill needs.\n\n### Keyboard shortcuts\n\n- `etc/slicc/keys.json` is the user's OVERRIDE file for keyboard mode, seeded on first boot by\n `ui/wc/wc-shortcut-config.ts`. It ships with `\"trigger\": \"auto\"` and `\"bindings\": {}` — the\n keymap itself is `DEFAULT_KEYMAP` in `ui/wc/wc-shortcuts.ts`, and a test asserts the file binds\n nothing. `trigger` is `auto` | `esc` | `null` (Theme settings switches it live).\n- **Never list a binding here again.** v1 wrote its whole keymap into the seed, and because the\n file is applied OVER the defaults that pinned every install to v1 forever: no later map, and no\n key for any command added since, could reach anyone who had booted once. An empty bindings object\n is what makes the shipped map — and every future change to it — inheritable.\n- The one write beyond seeding is that migration: a file still holding the v1 map exactly\n (`isUntouchedV1Document`) is replaced once. Anything else, including v1 with one line changed,\n is the user's and is left alone — an edited config must survive every later boot. Theme settings\n may also rewrite `trigger` in place.\n- The `//` comment must name every `CommandId` (a test asserts it) and carries the v1 keymap as a\n paste-back block for anyone who wants the old keys. `s` maps to `sprinkles` there, not to a\n cycle command: `p`/`s` opens the first and the step keys walk the rest.\n\n### Sprinkles\n\n- Add built-in sprinkles under `packages/vfs-root/shared/sprinkles/<name>/`.\n- Keep the main file named `<name>.shtml` to match discovery and sprinkle naming conventions.\n\n### Sounds\n\n- Add shared sounds under `packages/vfs-root/shared/sounds/`.\n- Prefer stable filenames because shell commands and docs may reference them directly.\n\n## External Handoffs\n\n- Mechanism: RFC 8288 `Link` response header carrying `https://www.sliccy.ai/rel/handoff` or `https://www.sliccy.ai/rel/upskill` on a main-frame document response → `navigate` lick → cone approval card.\n- Agent-facing flow: `packages/vfs-root/workspace/skills/handoff/SKILL.md` (bundled to `/workspace/skills/handoff/SKILL.md`); the agent reaches it through the injected skill index, not through `shared/CLAUDE.md`, which only states that handoffs are human-gated.\n- Protocol reference: `docs/slicc-handoff.md`.\n- When handoff behavior changes, keep the skill and `docs/slicc-handoff.md` aligned — do not duplicate their content here or in `shared/CLAUDE.md`.\n\n## Important Distinction\n\n`packages/vfs-root/shared/CLAUDE.md` is **agent-facing runtime content** bundled into the virtual filesystem.\n\nIt is different from the developer-facing `CLAUDE.md` files in the repository. Do not merge those roles together.\n";export{e as default};
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
var e=`---
|
|
2
|
-
name: welcome
|
|
3
|
-
description: |
|
|
4
|
-
Use this when you receive a \`[Sprinkle Event: welcome]\` lick with
|
|
5
|
-
\`action: 'onboarding-complete-with-provider'\` — fired exactly once after the
|
|
6
|
-
user finishes the first-run wizard and validates an LLM provider. Send a
|
|
7
|
-
short personalized reply (greet by name, react to provider/model, three
|
|
8
|
-
follow-up actions: obvious + obligatory + outrageous), then silently run
|
|
9
|
-
\`upskill recommendations --install\`. Other welcome-flow actions
|
|
10
|
-
(\`first-run\`, \`onboarding-complete\`, \`connect-ready\`, \`connect-attempt\`,
|
|
11
|
-
\`oauth-attempt\`, \`shortcut-migrate\`, \`request-mount\`) are intercepted by
|
|
12
|
-
the runtime and do not reach the agent — ignore them if they ever leak.
|
|
13
|
-
allowed-tools: bash
|
|
14
|
-
---
|
|
15
|
-
|
|
16
|
-
# Welcome Onboarding
|
|
17
|
-
|
|
18
|
-
The deterministic onboarding flow now lives entirely in the webapp. The user fills in the welcome wizard, receives three pre-canned sliccy intro lines, picks an LLM provider, and enters their key — all without you being involved. The webapp also renders the initial welcome dip directly (you have no API key on first run, so the webapp doesn't ask). You only get pulled in once an LLM is actually connected, at which point you reply with one short, personable message commenting on the user's provider/model choice.
|
|
19
|
-
|
|
20
|
-
There is exactly **one** event you handle.
|
|
21
|
-
|
|
22
|
-
## Trigger: Onboarding complete WITH provider
|
|
23
|
-
|
|
24
|
-
When you receive a \`[Sprinkle Event: welcome]\` with \`action: 'onboarding-complete-with-provider'\`, the user has already finished the wizard, picked a provider, entered an API key, and the webapp validated it. The lick payload looks like:
|
|
25
|
-
|
|
26
|
-
\`\`\`json
|
|
27
|
-
{
|
|
28
|
-
"action": "onboarding-complete-with-provider",
|
|
29
|
-
"data": {
|
|
30
|
-
"profile": {
|
|
31
|
-
"name": "Paolo",
|
|
32
|
-
"purpose": "work",
|
|
33
|
-
"role": "developer",
|
|
34
|
-
"tasks": ["build-websites"]
|
|
35
|
-
},
|
|
36
|
-
"provider": "openai",
|
|
37
|
-
"model": "gpt-4o",
|
|
38
|
-
"modelLabel": "GPT-4o",
|
|
39
|
-
"validation": "ok" // or "skipped" (probe couldn't run) or "oauth" (OAuth-authed provider, no probe)
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
\`\`\`
|
|
43
|
-
|
|
44
|
-
Your one and only job is to send a single short reply (≤ 6 sentences total) that:
|
|
45
|
-
|
|
46
|
-
1. Greets the user by name (or warmly acknowledges them anonymously if \`profile.name\` is empty) and reacts genuinely to the chosen \`provider\` + \`modelLabel\` (or \`model\`) — a sentence or two. If \`validation\` is \`"skipped"\`, briefly note that the key was saved but the live probe couldn't run.
|
|
47
|
-
2. Closes with **exactly three concrete follow-up actions** the user can take right now, written as a markdown bulleted list with one short imperative each. Ground the suggestions in the user's \`profile.tasks\` / \`profile.role\` / \`profile.purpose\` — the post-reply install step below lands the user's recommended skill set, so it's safe to reference task-matching skills (e.g. \`migrate-page\` for \`tasks: ['migrate-page-aem']\`) even though they aren't on disk yet at reply time. The three bullets must follow this mix exactly:
|
|
48
|
-
- **One obvious** — the natural next step a user with this profile would expect, ideally invoking a freshly installed skill that matches their stated tasks (e.g. for an AEM developer with \`migration\` installed: "Try \`migrate-page\` on a real AEM URL").
|
|
49
|
-
- **One obligatory** — the practical setup-or-housekeeping step they really should do before anything else (e.g. "Run \`git config --global user.email …\` so your commits are attributed", "Open the Files tab and mount your project directory", or "Drop your team's coding-style doc into chat so I can pick it up").
|
|
50
|
-
- **One outrageous** — a deliberately bold, slightly-cheeky use of the available skills that pushes the user beyond their stated profile and shows what's possible (e.g. "Ask me to rewrite your homepage in pirate English", "Have me generate a brand-compliance report for your competitor's site", or "Spin up a scoop that drafts your next pull request from a one-line brief"). Keep it tasteful but unmistakably playful.
|
|
51
|
-
|
|
52
|
-
Pick concrete suggestions that actually fit what's installed; do **not** copy the examples above verbatim if they don't fit. If you cannot ground a bullet in the profile or the skill set, fall back to a useful generic one (e.g. "Drop a URL into the chat for me to inspect", "Paste a screenshot you'd like me to analyse").
|
|
53
|
-
|
|
54
|
-
Do **not** print a capability table, do **not** call \`update_global_memory\`, do **not** install other skills beyond the \`upskill recommendations --install\` step below, do **not** edit \`/shared/CLAUDE.md\`.
|
|
55
|
-
|
|
56
|
-
After sending the reply, silently run \`upskill recommendations --install\` (do **not** show the output to the user) to land the user's recommended skill set. The command is profile-driven (it reads \`/home/<user>/.welcome.json\`, which the webapp persisted when the wizard finished) and idempotent.
|
|
57
|
-
`;export{e as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{C as e,E as t,O as n,S as r,T as i,b as a,i as o,t as s,x as c}from"./record-YqlVEfh_.js";function l(e){switch(e){case`initializing`:return`creating`;case`processing`:return`running`;case`error`:return`failed`;case`ready`:return`ready`;default:return`creating`}}const u=`/workspace/skills`;function d(t){if(e(t)){if(o(t))return{root:`/workspace`,memoryPath:`/workspace/CLAUDE.md`,scratch:`/tmp`};let e=`/cones/${t.folder}`;return{root:`${e}/workspace`,memoryPath:`${e}/CLAUDE.md`,scratch:`/tmp`}}let n=`/scoops/${t.folder}`;return{root:`${n}/workspace`,memoryPath:`${n}/CLAUDE.md`,scratch:n}}const f=`/tmp`;function p(n,r){if(!r)return`${f}/${s}`;if(e(r))return`${f}/${r.folder}`;let a=[...n],o=i(a,r)??t(a)[0];return`${f}/${o?.folder??`cone`}/${r.folder}`}const m=Object.freeze(d({parentJid:null,folder:s}));function h(e,n){let r=[...e],a=i(r,n)??t(r)[0];return a?d(a):m}function g(e){let t=`${e.root}/`,n=`${u}/`;return n.startsWith(t)?[t]:[t,n]}function _(e,t,n,r){let i=`/scoops/${t}/`;return e===`private`?{visiblePaths:[],writablePaths:[i]}:{visiblePaths:g({root:r??n.root}),writablePaths:[i,`/shared/`]}}function v(e){let{root:t}=d(e);return{workspaceId:t,root:t,access:y(e)}}function y(t){if(e(t))return`shared-live`;let r=t.config?.workspaceMode;return r===`private`||r===`shared-readonly`||r===`snapshot`||r===`shared-live`?r:n}function b(t,n){let i=e(t);return{id:t.jid,parentId:t.parentJid,name:t.name,folder:t.folder,status:l(n?.status),display:{role:i?`primary`:`child`,label:t.assistantLabel},workspace:d(t),workspaceHandle:v(t),policy:r(t),completion:a(t),onParentClose:c(t)}}export{g as a,b as c,_ as i,d as l,u as n,h as o,f as r,p as s,m as t,l as u};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
const e=Object.freeze([Object.freeze({id:`experimental-settings`,label:`Experimental settings`,description:`Show controls for experimental features.`,defaultValue:`on`,floatDefaults:Object.freeze({cherry:`off`}),userToggleable:!1}),Object.freeze({id:`panel-layouts`,label:`Panel layouts`,description:`Arrange the UI as movable, resizable panels instead of the fixed workbench.`,defaultValue:`off`,userToggleable:!0}),Object.freeze({id:`agentic-memory`,label:`Agentic memory`,description:`Curate session memory with a background agent instead of a one-shot extraction call.`,defaultValue:`off`,userToggleable:!0}),Object.freeze({id:`multiple-cones`,label:`Multiple cones`,description:`Add, switch between and remove cones from the freezer rail. Extra cones share the workspace.`,defaultValue:`on`,floatDefaults:Object.freeze({cherry:`off`}),userToggleable:!1}),Object.freeze({id:`compact-on-idle`,label:`Compact on idle`,description:`When a cone has been idle for a while with a large context, summarize its history in the background. The full transcript is kept in /sessions.`,defaultValue:`off`,userToggleable:!0}),Object.freeze({id:`memory-v2`,label:`Memory v2`,description:`Searchable session history and scoop pre-compaction snapshots for agent memory.`,defaultValue:`off`,userToggleable:!0})]);new Map(e.map(e=>[e.id,e]));const t=new Set([`1`,`on`,`true`]);let n=`standalone`,r={},i={};function a(t,n={},r=o()){let a={};for(let o of e){let e=r[o.id];if(typeof e==`string`&&f(o,t)){a[o.id]=e;continue}let s=i[o.id];if(typeof s==`string`&&f(o,t)){a[o.id]=s;continue}let c=n[o.id];a[o.id]=typeof c==`string`?c:d(o,t)}return a}function o(){try{let e=m()?.getItem(`slicc_feature_flags`);return e?p(JSON.parse(e)):{}}catch{return{}}}function s(e,t={}){n=e,r=p(t),i={}}function c(e){return a(n,r)[e]}function l(e){return typeof e==`string`&&t.has(e.trim().toLowerCase())}function u(e){return l(c(e))}function d(e,t){return e.floatDefaults?.[t]??e.defaultValue}function f(e,t){return e.userToggleable&&(e.overridableFloats===void 0||e.overridableFloats.includes(t))}function p(t){if(typeof t!=`object`||!t||Array.isArray(t))return{};let n=t,r={};for(let t of e){let e=n[t.id];typeof e==`string`&&(r[t.id]=e)}return r}function m(){try{let e=globalThis.localStorage;return typeof e?.getItem!=`function`||typeof e.setItem!=`function`?void 0:e}catch{return}}export{u as n,s as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
var e=`slicc_feature_flags`,t=Object.freeze([Object.freeze({id:`experimental-settings`,label:`Experimental settings`,description:`Show controls for experimental features.`,defaultValue:`on`,floatDefaults:Object.freeze({cherry:`off`}),userToggleable:!1}),Object.freeze({id:`panel-layouts`,label:`Panel layouts`,description:`Arrange the UI as movable, resizable panels instead of the fixed workbench.`,defaultValue:`off`,userToggleable:!0}),Object.freeze({id:`agentic-memory`,label:`Agentic memory`,description:`Curate session memory with a background agent instead of a one-shot extraction call.`,defaultValue:`off`,userToggleable:!0}),Object.freeze({id:`multiple-cones`,label:`Multiple cones`,description:`Add, switch between and remove cones from the freezer rail. Extra cones share the workspace.`,defaultValue:`on`,floatDefaults:Object.freeze({cherry:`off`}),userToggleable:!1}),Object.freeze({id:`compact-on-idle`,label:`Compact on idle`,description:`When a cone has been idle for a while with a large context, summarize its history in the background. The full transcript is kept in /sessions.`,defaultValue:`off`,userToggleable:!0}),Object.freeze({id:`memory-v2`,label:`Memory v2`,description:`Searchable session history and scoop pre-compaction snapshots for agent memory.`,defaultValue:`off`,userToggleable:!0})]),n=new Map(t.map(e=>[e.id,e])),r=new Set([`1`,`on`,`true`]),i=`standalone`,a={},o={};function s(){return t}function c(e,n={},r=l()){let i={};for(let a of t){let t=r[a.id];if(typeof t==`string`&&v(a,e)){i[a.id]=t;continue}let s=o[a.id];if(typeof s==`string`&&v(a,e)){i[a.id]=s;continue}let c=n[a.id];i[a.id]=typeof c==`string`?c:_(a,e)}return i}function l(){try{let t=b()?.getItem(e);return t?y(JSON.parse(t)):{}}catch{return{}}}function u(t){try{b()?.setItem(e,JSON.stringify(y(t)))}catch{}}function d(e,t){let r=n.get(e);if(!r||!v(r,i))return;let a=l();typeof t==`string`?a[e]=t:delete a[e],u(a)}function f(e,t={}){i=e,a=y(t),o={}}function p(e){let t={};for(let[r,a]of Object.entries(e)){let e=n.get(r);!e||typeof a!=`string`||!v(e,i)||(t[e.id]=a)}return o={...o,...t},t}function m(e){return c(i,a)[e]}function h(e){return typeof e==`string`&&r.has(e.trim().toLowerCase())}function g(e){return h(m(e))}function _(e,t){return e.floatDefaults?.[t]??e.defaultValue}function v(e,t){return e.userToggleable&&(e.overridableFloats===void 0||e.overridableFloats.includes(t))}function y(e){if(typeof e!=`object`||!e||Array.isArray(e))return{};let n=e,r={};for(let e of t){let t=n[e.id];typeof t==`string`&&(r[e.id]=t)}return r}function b(){try{let e=globalThis.localStorage;return typeof e?.getItem!=`function`||typeof e.setItem!=`function`?void 0:e}catch{return}}export{d as a,s as i,f as n,g as r,p as t};
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./slugify-BYJ6QVAt.js";import{t}from"./attachments-u2K0aIPI.js";import{t as n}from"./types-Dgm4REV3.js";import{n as r,t as i}from"./frozen-archive-format-B4efpvB9.js";const a=/\uD83C\uDF99\uFE0F?/g,o=/\u25C1[\s\S]*?\u25B7/g;function s(e){return e.replace(o,``).replace(a,``).replace(/[ \t]+$/g,``).trimEnd()}function c(e){let n=``;for(let r of e){let e=r.role===`user`?`User`:`Assistant`,i=r.role===`user`?s(r.content):r.content;if(n+=`## ${e}\n${i}\n\n`,r.attachments?.length&&(n+=`Attachments:\n${r.attachments.map(e=>`- ${t(e)}`).join(`
|
|
2
|
-
`)}\n\n`),r.toolCalls)for(let e of r.toolCalls)n+=`### Tool: ${e.name}\nInput: ${JSON.stringify(e.input,null,2)}\nResult: ${e.result??``}\n\n`}return n}function l(e){return`live-${f(e)}-${d()}.md`}function u(e,t){return e.find(e=>e.live===!0&&(e.cone??`cone`)===t)}function d(){return`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,6)}`}function f(t){return e(t,{maxLen:48,fallback:`session`})}function p(e){let t=e.find(e=>e.role===`user`);if(!t?.content)return`untitled-session`;let n=t.content.trim().replace(/\s+/g,` `);return n.length>60?`${n.slice(0,60)}…`:n||`untitled-session`}function m(e){return e.map(e=>{let t={id:e.id,role:e.role,content:e.content,timestamp:e.timestamp};return e.attachments?.length&&(t.attachments=e.attachments),e.toolCalls?.length&&(t.toolCalls=e.toolCalls.map(e=>({id:e.id,name:e.name,input:e.input,...e.result===void 0?{}:{result:e.result},...e.isError?{isError:e.isError}:{}}))),e.source&&(t.source=e.source),e.channel&&(t.channel=e.channel),e.compaction&&(t.compaction=e.compaction),t})}function h(e){let t=(e.cost?`cost: ${JSON.stringify(e.cost)}\n`:``)+(e.models?`models: ${JSON.stringify(e.models)}\n`:``),n=(e.cone?`cone: ${e.cone}\n`:``)+(e.coneLabel?`coneLabel: ${JSON.stringify(e.coneLabel)}\n`:``)+(e.memorySkipped?`memorySkipped: true
|
|
3
|
-
`:``)+(e.live?`live: true
|
|
4
|
-
`:``)+(e.live&&e.liveThrough?`liveThrough: ${e.liveThrough}\n`:``)+(e.live&&e.compactions?`compactions: ${e.compactions}\n`:``),r=`---\nid: ${e.id}\ntitle: ${JSON.stringify(e.title)}\nfrozenAt: ${e.frozenAt}\ncreatedAt: ${e.createdAt}\nupdatedAt: ${e.updatedAt}\nmessageCount: ${e.messageCount}\n`+t+n+`---
|
|
5
|
-
|
|
6
|
-
`,i=`# ${e.title}\n\n`;return r+`<!-- slicc:session-data
|
|
7
|
-
${JSON.stringify(m(e.messages)).replace(/-->/g,`-- >`)}
|
|
8
|
-
-->\n\n`+i+c(e.messages)}function g(e){return e===`/sessions`?r:`${e}/index.json`}function _(e){return e===`/sessions`?b:`slicc:sessions-index:${e}`}async function v(e,t=i){try{await e.mkdir(t,{recursive:!0})}catch{}}async function y(e,t=i){try{let n=await e.readFile(g(t),{encoding:`utf-8`}),r=typeof n==`string`?n:new TextDecoder().decode(n),i=JSON.parse(r);return Array.isArray(i)?i:[]}catch(e){if(e instanceof n&&e.code!==`ENOENT`)throw e;return[]}}const b=`slicc:sessions-index`;let x=Promise.resolve();function S(e,t=b){let n=()=>{let n=globalThis.navigator?.locks;return typeof n?.request==`function`?n.request(t,()=>e()):e()},r=x.then(n,n);return x=r.then(()=>void 0,()=>void 0),r}function C(e,t,n=i){return e.writeFile(g(n),JSON.stringify(t,null,2))}async function w(e,t,n=i){await C(e,[t,...(await y(e,n)).filter(e=>e.filename!==t.filename)],n)}export{l as a,_ as c,p as i,w as l,u as n,y as o,h as r,S as s,v as t,C as u};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-Dd_uD5pT.js";import{l as t}from"./descriptor-DObnXZNI.js";var n=e({conversationKeyFor:()=>i,workspaceIdFor:()=>r});function r(e){return t(e).root}function i(e){return`${r(e)}::${e.jid}`}export{n,r,i as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{n as e}from"./feature-flags-COdcJUhl.js";function t(){return e(`memory-v2`)}export{t as isMemoryV2Enabled};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/quick-llm-B8jKq4iQ.js","assets/rolldown-runtime-Dd_uD5pT.js","assets/account-store-CxhEKTWa.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-Bk7_R6-e.js","assets/panel-rpc-B3MSVImO.js","assets/bedrock-camp-compat-BeCSBUrZ.js","assets/llm-session-id-bZQs6gBN.js","assets/icons-Df1OSRR-.js"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{B as e,g as t}from"./account-store-CxhEKTWa.js";import{t as n}from"./preload-helper-Czpn1I53.js";import{t as r}from"./logger-DDBAeTLF.js";import{B as i,F as a,I as o,M as s,N as c,P as l}from"./wc-live-DD50Wcz1.js";import{r as u}from"./feature-flags-a-IfHs0F.js";import"./main-B6EOlFVs.js";import{t as d}from"./llm-session-id-bZQs6gBN.js";var f=r(`new-session`),p=`ui-new-session`,m=2e4,h=250;async function g(n){try{let r=await n.openVfs(),i=t()??void 0;if(!i)return;let a;try{a=e()}catch{return}let s=a.provider===`adobe`?{"X-Session-Id":d(p)}:void 0;await o({vfs:r,model:a,apiKey:i,headers:s}),n.onComplete?.()}catch(e){f.warn(`Pending session catch-up failed (boot continues)`,{error:e instanceof Error?e.message:String(e)})}}function _(e){(e.schedule??v)(()=>{g(e)})}function v(e){if(typeof globalThis.requestIdleCallback==`function`){globalThis.requestIdleCallback(e,{timeout:5e3});return}setTimeout(e,0)}function y(e){if(u(`agentic-memory`)){if(!e.agenticMemorySpawn){f.info(`Agentic memory enabled but agent bridge unavailable — using legacy enrichment`);return}return e.agenticMemorySpawn}}async function b(e,t,n,r,i,o){let s=await l({sessionStore:t,vfs:e.vfs,mode:`quick`,agenticMemorySpawn:o,cone:e.cone});if(!s)return null;if(e.captureCompleteSnapshot)try{await e.captureCompleteSnapshot(s)}catch(t){let n=t?.code??`unknown`;f.warn(`captureCompleteSnapshot failed`,{code:n}),s.completeSnapshotUnavailable=!0;try{await a(e.vfs,s.filename)}catch{}}return x(e,t,n,r,i,o,s),s}async function x(e,t,r,i,a,o,l){let u=l;try{let t=await c(e.vfs,l,{model:r,apiKey:i,headers:a,skipMemory:!0,pickIcon:e=>n(async()=>{let{pickLucideIcon:e}=await import(`./quick-llm-B8jKq4iQ.js`).then(e=>e.n);return{pickLucideIcon:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26])).then(({pickLucideIcon:t})=>t(e))});t&&(u={...t,archive:l.archive},e.onBackgroundEnriched?.(t))}catch(e){f.warn(`Agentic title enrichment threw (draft stays pending)`,{filename:l.filename,error:e instanceof Error?e.message:String(e)})}let d=await s({sessionStore:t,vfs:e.vfs,mode:`full`,model:r,apiKey:i,headers:a,agenticMemorySpawn:o,cone:e.cone},u).catch(e=>(f.warn(`Agentic memory curator threw (entry stays pending)`,{filename:u.filename,error:e instanceof Error?e.message:String(e)}),null));f.info(`Agentic memory curator finished`,{filename:u.filename,memoryPending:!d||d.memoryPending===!0}),e.onBackgroundEnriched?.(d)}function S(e){return e?.code===`ENOENT`}function C(e,t){return e===t||t.startsWith(e.endsWith(`/`)?e:`${e}/`)}async function w(e,t,n,r){for(let i of n){let n=`${t}/${i.name}`;if(!r.has(n)){if(i.type===`directory`){let t;try{t=await e.readDir(n)}catch(e){if(S(e))continue;throw e}if(await w(e,n,t,r),[...r].some(e=>e.startsWith(`${n}/`)))continue}try{await e.rm(n)}catch(e){if(!S(e))throw e}}}}async function T(e,t){let n=(await e.listMountPoints()).map(({path:e})=>e);if(n.some(e=>C(e,t)))return;let r=new Set(n.filter(e=>e.startsWith(`${t}/`))),i;try{i=await e.readDir(t)}catch(n){if(n?.code!==`ENOENT`)throw n;await e.mkdir(t,{recursive:!0});return}await w(e,t,i,r),await e.mkdir(t,{recursive:!0})}async function E(r){let o=r.enrichmentRaceMs??m,s=t()??void 0,u;try{u=e()}catch(e){f.info(`No active model — freezing without LLM enrichment`,{error:e instanceof Error?e.message:String(e)})}let h=u?.provider===`adobe`?{"X-Session-Id":d(p)}:void 0,g=new i;try{await g.init()}catch(e){return f.warn(`SessionStore init failed — cannot freeze`,{error:e instanceof Error?e.message:String(e)}),null}let _=s&&u?y(r):void 0;if(_)return await b(r,g,u,s,h,_);let v=await l({sessionStore:g,vfs:r.vfs,mode:`quick`,cone:r.cone});if(!v)return null;if(r.captureCompleteSnapshot)try{await r.captureCompleteSnapshot(v)}catch(e){let t=e?.code??`unknown`;f.warn(`captureCompleteSnapshot failed`,{code:t}),v.completeSnapshotUnavailable=!0;try{await a(r.vfs,v.filename)}catch{}}if(!s||!u)return f.info(`Frozen without enrichment (no LLM credentials) — left pending`,{filename:v.filename}),v;let x=u,S=c(r.vfs,v,{model:x,apiKey:s,headers:h,pickIcon:e=>n(async()=>{let{pickLucideIcon:e}=await import(`./quick-llm-B8jKq4iQ.js`).then(e=>e.n);return{pickLucideIcon:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26])).then(({pickLucideIcon:t})=>t(e))}).catch(e=>(f.warn(`Single-click enrichment threw (entry stays pending)`,{filename:v.filename,error:e instanceof Error?e.message:String(e)}),null)),C=await D(S,o,r.onProgress);return C.kind===`llm`?C.updated?{...C.updated,archive:v.archive}:v:(S.then(e=>{f.info(`Background enrichment resolved after race window`,{filename:v.filename,enriched:e?.filename??null}),r.onBackgroundEnriched?.(e)}),v)}async function D(e,t,n){let r=Date.now(),i,a;n?.(0),n&&(i=setInterval(()=>{n(Math.min(1,(Date.now()-r)/t))},h));let o=new Promise(e=>{a=setTimeout(()=>e({kind:`timer`}),t)}),s=e.then(e=>({kind:`llm`,updated:e}));try{return await Promise.race([s,o])}finally{i&&clearInterval(i),a&&clearTimeout(a),n?.(null)}}async function O(e){return A(e,void 0)}async function k(e){return A(e,`skip`)}async function A(e,t){let n=new i;try{await n.init()}catch(e){return f.warn(`SessionStore init failed — cannot quick-freeze`,{error:e instanceof Error?e.message:String(e)}),null}let r=await l({sessionStore:n,vfs:e.vfs,mode:`quick`,cone:e.cone,...t?{memory:t}:{}});if(r&&e.captureCompleteSnapshot)try{await e.captureCompleteSnapshot(r)}catch(t){let n=t?.code??`unknown`;f.warn(`captureCompleteSnapshot failed (quick-freeze)`,{code:n}),r.completeSnapshotUnavailable=!0;try{await a(e.vfs,r.filename)}catch{}}return r}export{T as resetNewSessionTmp,k as runNewSessionArchiveOnly,E as runNewSessionFreeze,O as runNewSessionFreezeQuick,_ as schedulePendingSessionCatchup};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./logger-LESFN7Hj.js";import"./account-store-CSvfMN0q.js";import"./core-D59qaXEb.js";import"./tray-runtime-config--rtR6Gxd.js";e(`provider-settings`);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./store-CJgEv6ac.js";export{e as readMcpAuthEntries};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./provider-DBzel_xl.js";export{e as readMcpAuthEntries};
|