sliccy 2.9.4 → 2.9.6

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.
@@ -1,4 +1,4 @@
1
- import{r as e}from"./chunk-jRWAZmH_.js";import{a as t,c as n,d as r,f as i,l as a,n as o,o as s,r as c,s as l,t as u,u as d}from"./constants-BnzYaC4L.js";import{r as f,t as p}from"./path-utils-CgbXfwyO.js";import"./index-Bwi1rPU5.js";function m(e){let t={},n=e.split(`
1
+ import{r as e}from"./chunk-jRWAZmH_.js";import{a as t,c as n,d as r,f as i,l as a,n as o,o as s,r as c,s as l,t as u,u as d}from"./constants-BnzYaC4L.js";import{r as f,t as p}from"./path-utils-CgbXfwyO.js";import"./index-Bal-53s0.js";function m(e){let t={},n=e.split(`
2
2
  `),r=null,i=!1,a={},o=null;for(let e of n){let n=e.trim();if(!n||n.startsWith(`#`))continue;if(n.startsWith(`- `)){let e=n.slice(2).trim();i&&o?o.push(e):r&&r.push(e);continue}let s=n.indexOf(`:`);if(s===-1)continue;let c=n.slice(0,s).trim(),l=n.slice(s+1).trim(),u=e.search(/\S/);if(c===`structured`){i=!0,a={},t.structured=a;continue}if(i&&u>=2){if(u>=4&&o)continue;l===``||l===`[]`?(o=[],a[c]=o):(a[c]=l,o=null);continue}u===0&&(i=!1),l===``||l===`[]`?(r=[],t[c]=r):(t[c]=l,r=null)}return t}function h(e,t=u){let n=m(e);if(!n.skill||typeof n.skill!=`string`)throw Error(`Invalid manifest: missing 'skill' field in ${t}`);if(!n.version||typeof n.version!=`string`)throw Error(`Invalid manifest: missing 'version' field in ${t}`);return{skill:n.skill,version:n.version,description:n.description||``,adds:n.adds||[],modifies:n.modifies||[],structured:n.structured,conflicts:n.conflicts||[],depends:n.depends||[],test:n.test,author:n.author}}async function g(e,t){let n=`${t}/${u}`;return h(await e.readTextFile(n),n)}function _(e,t){let n=(e.depends||[]).filter(e=>!t.includes(e));return{ok:n.length===0,missing:n}}function v(e,t){let n=(e.conflicts||[]).filter(e=>t.includes(e));return{ok:n.length===0,conflicting:n}}var y=/^[A-Za-z0-9][A-Za-z0-9._-]*$/,b=class extends Error{};function x(e){return new TextDecoder().decode(e)}function S(e){let t=e.replace(/\\/g,`/`);if(!t||t.endsWith(`/`))return null;if(t.startsWith(`/`)||/^[A-Za-z]:\//.test(t))throw Error(`Blocked suspicious path "${e}".`);let n=t.split(`/`);if(n.some(e=>e===``||e===`.`||e===`..`))throw Error(`Blocked suspicious path "${e}".`);return n.join(`/`)}function ee(e){if(!y.test(e))throw Error(`Invalid manifest: skill name "${e}" must be a simple directory name.`)}function C(e){let t=[];for(let[n,r]of Object.entries(e)){let e=S(n);e&&t.push({originalPath:n,path:e,bytes:r})}return t}function w(e){let t=e.filter(e=>e.path===`manifest.yaml`||e.path.endsWith(`/manifest.yaml`));if(t.length===0)throw Error(`Skill archive is missing ${u}.`);if(t.length>1)throw Error(`Skill archive contains multiple ${u} files.`);return t[0]}function T(e){let t=0,n=0;return i(e,{filter(e){if(t++,t>1e3)throw new b(`Skill archives may contain at most ${o} entries.`);if(n+=e.originalSize,n>52428800)throw new b(`Skill archives must expand to 50 MB or smaller after extraction.`);return!0}})}function E(e){return p(r,`.${e}.tmp-${`${Date.now()}-${Math.random().toString(16).slice(2,8)}`}`)}async function D(e,t){if(!t.name.toLowerCase().endsWith(`.skill`))throw Error(`Only ${l} archives can be installed with drag and drop.`);if(t.size>52428800)throw Error(`Skill archives must be 50 MB or smaller.`);let n;try{n=T(new Uint8Array(await t.arrayBuffer()))}catch(e){if(e instanceof b)throw e;let t=e instanceof Error?e.message:String(e);throw Error(`Invalid .skill archive: ${t}`)}let i=C(n),a=w(i),o=h(x(a.bytes),a.path);ee(o.skill);let s=p(r,o.skill);if(await e.exists(s))throw Error(`Skill "${o.skill}" already exists at ${s}.`);let c=E(o.skill),d=a.path===`manifest.yaml`?``:a.path.slice(0,-(u.length+1));await e.mkdir(c,{recursive:!0});try{let t=0;for(let n of i){if(d&&(n.path===d||!n.path.startsWith(`${d}/`)))continue;let r=d?n.path.slice(d.length+1):n.path;if(!r)continue;let i=p(c,r),{dir:a}=f(i);a!==`/`&&await e.mkdir(a,{recursive:!0}),await e.writeFile(i,n.bytes),t++}return await e.rename(c,s),{skillName:o.skill,destinationPath:s,fileCount:t}}catch(t){throw await e.exists(c)&&await e.rm(c,{recursive:!0}),t}}var O=`/${a}/${d}`;async function k(e){try{await e.mkdir(`/${a}`)}catch{}try{await e.stat(O)}catch{let t={version:s,applied_skills:[]};await e.writeFile(O,JSON.stringify(t,null,2))}}async function A(e){try{let t=await e.readTextFile(O);return JSON.parse(t)}catch(e){if(typeof e==`object`&&e&&e.code===`ENOENT`)return{version:s,applied_skills:[]};throw e}}async function j(e,t){await k(e),await e.writeFile(O,JSON.stringify(t,null,2))}async function M(e){return(await A(e)).applied_skills.map(e=>e.name)}async function N(e,t){let n=await A(e);n.applied_skills=n.applied_skills.filter(e=>e.name!==t.name),n.applied_skills.push(t),await j(e,n)}async function te(e,t){let n=await A(e);n.applied_skills=n.applied_skills.filter(e=>e.name!==t),await j(e,n)}async function P(e){let t=new TextEncoder().encode(e),n=await crypto.subtle.digest(`SHA-256`,t);return Array.from(new Uint8Array(n)).map(e=>e.toString(16).padStart(2,`0`)).join(``)}function F(e){return e.startsWith(`/`)?{valid:!1,error:`Absolute path not allowed: ${e}`}:e.split(`/`).some(e=>e===`..`)?{valid:!1,error:`Path traversal not allowed: ${e}`}:e.includes(`%2e%2e`)||e.includes(`%2E%2E`)?{valid:!1,error:`Encoded path traversal not allowed: ${e}`}:{valid:!0}}async function I(e,t){let n=t.split(`/`).filter(Boolean),r=``;for(let t of n){r+=`/`+t;try{await e.mkdir(r)}catch{}}}async function L(e,t,n=`/workspace/skills`){let r=`${n}/${t}`;await k(e);let i;try{i=await g(e,r)}catch(e){return{success:!1,skill:t,version:`unknown`,error:`Failed to read manifest: ${e instanceof Error?e.message:String(e)}`}}if(i.skill!==t)return{success:!1,skill:t,version:i.version,error:`Manifest skill name "${i.skill}" does not match directory name "${t}"`};let a=await M(e);if(a.includes(i.skill))return{success:!1,skill:i.skill,version:i.version,error:`Skill "${i.skill}" is already installed`};let o=_(i,a);if(!o.ok)return{success:!1,skill:i.skill,version:i.version,error:`Missing dependencies: ${o.missing.join(`, `)}`};let s=v(i,a);if(!s.ok)return{success:!1,skill:i.skill,version:i.version,error:`Conflicting skills: ${s.conflicting.join(`, `)}`};let c={},l=[];try{if(i.adds&&i.adds.length>0)for(let t of i.adds){let n=F(t);if(!n.valid)return{success:!1,skill:i.skill,version:i.version,error:n.error};let a=`${r}/add/${t}`,o=`/${t}`;try{let n=o.substring(0,o.lastIndexOf(`/`));n&&await I(e,n),await e.copyFile(a,o),l.push(t),c[t]=await P(await e.readTextFile(o))}catch(e){return{success:!1,skill:i.skill,version:i.version,error:`Failed to copy ${t}: ${e instanceof Error?e.message:String(e)}`}}}if(i.modifies&&i.modifies.length>0)for(let t of i.modifies){let n=F(t);if(!n.valid)return{success:!1,skill:i.skill,version:i.version,error:n.error};let a=`${r}/modify/${t}`;try{let n=await e.readTextFile(a),r=``;try{r=await e.readTextFile(`/${t}`)}catch{}let i;if(n.includes(`// APPEND_AFTER:`)){let e=n.split(`
3
3
  `),t=e.find(e=>e.includes(`// APPEND_AFTER:`))?.split(`// APPEND_AFTER:`)[1]?.trim(),a=e.filter(e=>!e.includes(`// APPEND_AFTER:`)).join(`
4
4
  `);if(t&&r.includes(t)){let e=r.indexOf(t)+t.length,n=r.indexOf(`
@@ -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/index-Bwi1rPU5.js"></script>
8
+ <script type="module" crossorigin src="/assets/index-Bal-53s0.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-jRWAZmH_.js">
10
10
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-D4M6sveU.js">
11
11
  <link rel="modulepreload" crossorigin href="/assets/constants-BnzYaC4L.js">
@@ -13,11 +13,11 @@
13
13
  <link rel="modulepreload" crossorigin href="/assets/path-utils-CgbXfwyO.js">
14
14
  <link rel="modulepreload" crossorigin href="/assets/db-ybNEUfR8.js">
15
15
  <link rel="modulepreload" crossorigin href="/assets/magick-wasm-BtLTRPKb.js">
16
- <link rel="modulepreload" crossorigin href="/assets/skills-C37L_943.js">
17
- <link rel="modulepreload" crossorigin href="/assets/index-Bwi1rPU5.js">
16
+ <link rel="modulepreload" crossorigin href="/assets/skills-Cwc_5caT.js">
17
+ <link rel="modulepreload" crossorigin href="/assets/index-Bal-53s0.js">
18
18
  <link rel="modulepreload" crossorigin href="/assets/simple-options-CP_5aL7H.js">
19
19
  <link rel="modulepreload" crossorigin href="/assets/openai-CuiHR4mv.js">
20
- <link rel="modulepreload" crossorigin href="/assets/provider-settings-VV3vHhWw.js">
20
+ <link rel="modulepreload" crossorigin href="/assets/provider-settings-ArVcQj7G.js">
21
21
  <link rel="stylesheet" crossorigin href="/assets/index-Bj1XpXDE.css">
22
22
  </head>
23
23
  <body>
@@ -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/index-Bwi1rPU5.js"></script>
8
+ <script type="module" crossorigin src="/assets/index-Bal-53s0.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-jRWAZmH_.js">
10
10
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-D4M6sveU.js">
11
11
  <link rel="modulepreload" crossorigin href="/assets/constants-BnzYaC4L.js">
@@ -13,11 +13,11 @@
13
13
  <link rel="modulepreload" crossorigin href="/assets/path-utils-CgbXfwyO.js">
14
14
  <link rel="modulepreload" crossorigin href="/assets/db-ybNEUfR8.js">
15
15
  <link rel="modulepreload" crossorigin href="/assets/magick-wasm-BtLTRPKb.js">
16
- <link rel="modulepreload" crossorigin href="/assets/skills-C37L_943.js">
17
- <link rel="modulepreload" crossorigin href="/assets/index-Bwi1rPU5.js">
16
+ <link rel="modulepreload" crossorigin href="/assets/skills-Cwc_5caT.js">
17
+ <link rel="modulepreload" crossorigin href="/assets/index-Bal-53s0.js">
18
18
  <link rel="modulepreload" crossorigin href="/assets/simple-options-CP_5aL7H.js">
19
19
  <link rel="modulepreload" crossorigin href="/assets/openai-CuiHR4mv.js">
20
- <link rel="modulepreload" crossorigin href="/assets/provider-settings-VV3vHhWw.js">
20
+ <link rel="modulepreload" crossorigin href="/assets/provider-settings-ArVcQj7G.js">
21
21
  <link rel="stylesheet" crossorigin href="/assets/index-Bj1XpXDE.css">
22
22
  </head>
23
23
  <body>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sliccy",
3
- "version": "2.9.4",
3
+ "version": "2.9.6",
4
4
  "description": "Browser-based coding agent with thin CLI server",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",