@ai-ecoverse/slicc-agent 6.18.8 → 6.18.9

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.
@@ -11,6 +11,7 @@ const SCHEMED = /^[a-z][a-z0-9+.-]*:/i;
11
11
  const EMBEDDED = /[a-z][a-z0-9+.-]*:\/\/[^\s'"`<>(){}\\]+/gi;
12
12
  const RELATIVE = /(?<![:\w/])\/\/[^\s'"`<>(){}\\/]+/g;
13
13
  const PREFIX = /^(?:[A-Za-z_][A-Za-z0-9_]*|-{1,2}[A-Za-z0-9-]+)=/;
14
+ const HOSTLIKE = /^[^\s/?#]*(?:\.|%2e|%e3%80%82|%ef%bc%8e|%ef%bd%a1|[\u3002\uff0e\uff61])[^\s/?#]*(?:[/?#]\S*)?$/i;
14
15
  function parse(url) {
15
16
  try {
16
17
  return new URL(url);
@@ -26,8 +27,8 @@ function foreignKernel(url) {
26
27
  const host = parsed.hostname.replace(/\.+$/, "");
27
28
  return kernelHost(host) && !ownKernelServer(host);
28
29
  }
29
- function forbidden(url, matcher) {
30
- return matcher.url(url) || foreignKernel(url);
30
+ function forbidden(url, matcher, lenient = false) {
31
+ return matcher.url(url, { readOnly: lenient }) || foreignKernel(url);
31
32
  }
32
33
  function candidates(raw) {
33
34
  const word = raw.replace(/[\t\n\r]/g, "").replace(/^[\0- ]+|[\0- ]+$/g, "");
@@ -37,11 +38,11 @@ function candidates(raw) {
37
38
  value,
38
39
  ...value.match(EMBEDDED) ?? [],
39
40
  ...(value.match(RELATIVE) ?? []).map((relative) => `https:${relative}`)
40
- ];
41
+ ].map((url) => ({ url, lenient: false }));
41
42
  if (!/^[/.~-]/.test(value) && !/^[a-z][a-z0-9+.-]*:\/\//i.test(value))
42
- found.push(`https://${value}`);
43
- if (value.startsWith("//")) found.push(`https:${value}`);
44
- return found.filter((each) => SCHEMED.test(each));
43
+ found.push({ url: `https://${value}`, lenient: !HOSTLIKE.test(value) });
44
+ if (value.startsWith("//")) found.push({ url: `https:${value}`, lenient: false });
45
+ return found.filter((each) => SCHEMED.test(each.url));
45
46
  }
46
47
  function browserCommand(word) {
47
48
  return BROWSER.has(word.slice(word.lastIndexOf("/") + 1));
@@ -49,7 +50,9 @@ function browserCommand(word) {
49
50
  function refused(command, matcher) {
50
51
  const all = words(command);
51
52
  if (!all.some(browserCommand)) return false;
52
- return all.some((word) => candidates(word).some((url) => forbidden(url, matcher)));
53
+ return all.some(
54
+ (word) => candidates(word).some(({ url, lenient }) => forbidden(url, matcher, lenient))
55
+ );
53
56
  }
54
57
  function commandOf(args) {
55
58
  const command = args?.command;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/browser/guard.ts"],
4
- "sourcesContent": ["import { defineExtension, type Extension, hook, ToolTask } from '@earendil-works/pi-durable';\nimport { FACADE_PORT, kernelHost, ownKernelServer } from '../kernel/loopback.ts';\nimport { PROTECTED_RULES, type ProtectedMatcher, protectedMatcher } from './origins.ts';\nimport { words } from './shell.ts';\n\nexport const BROWSER_GUARD = 'slicc-browser-guard';\nexport const REFUSAL = \"SLICC's own pages can't be opened or driven from the browser tools.\";\nexport { FACADE_PORT, ownKernelServer };\n\nconst BROWSER = new Set(['playwright-cli', 'curlwright']);\nconst WEB = new Set(['http:', 'https:', 'ws:', 'wss:']);\nconst INNER = new Set(PROTECTED_RULES.innerSchemes.map((scheme) => `${scheme}:`));\nconst SCHEMED = /^[a-z][a-z0-9+.-]*:/i;\nconst EMBEDDED = /[a-z][a-z0-9+.-]*:\\/\\/[^\\s'\"`<>(){}\\\\]+/gi;\nconst RELATIVE = /(?<![:\\w/])\\/\\/[^\\s'\"`<>(){}\\\\/]+/g;\nconst PREFIX = /^(?:[A-Za-z_][A-Za-z0-9_]*|-{1,2}[A-Za-z0-9-]+)=/;\n\nfunction parse(url: string): URL | undefined {\n try {\n return new URL(url);\n } catch {\n return undefined;\n }\n}\n\nexport function foreignKernel(url: string): boolean {\n let parsed = parse(url);\n for (let depth = 0; parsed && INNER.has(parsed.protocol) && depth < 8; depth++)\n parsed = parse(parsed.href.slice(parsed.protocol.length));\n if (!parsed || !WEB.has(parsed.protocol)) return false;\n const host = parsed.hostname.replace(/\\.+$/, '');\n return kernelHost(host) && !ownKernelServer(host);\n}\n\nexport function forbidden(url: string, matcher: ProtectedMatcher): boolean {\n return matcher.url(url) || foreignKernel(url);\n}\n\nexport function candidates(raw: string): string[] {\n const word = raw.replace(/[\\t\\n\\r]/g, '').replace(/^[\\0- ]+|[\\0- ]+$/g, '');\n const value = word.replace(PREFIX, '');\n const found = [\n word,\n value,\n ...(value.match(EMBEDDED) ?? []),\n ...(value.match(RELATIVE) ?? []).map((relative) => `https:${relative}`),\n ];\n if (!/^[/.~-]/.test(value) && !/^[a-z][a-z0-9+.-]*:\\/\\//i.test(value))\n found.push(`https://${value}`);\n if (value.startsWith('//')) found.push(`https:${value}`);\n return found.filter((each) => SCHEMED.test(each));\n}\n\nfunction browserCommand(word: string): boolean {\n return BROWSER.has(word.slice(word.lastIndexOf('/') + 1));\n}\n\nexport function refused(command: string, matcher: ProtectedMatcher): boolean {\n const all = words(command);\n if (!all.some(browserCommand)) return false;\n return all.some((word) => candidates(word).some((url) => forbidden(url, matcher)));\n}\n\nfunction commandOf(args: unknown): string {\n const command = (args as { command?: unknown } | undefined)?.command;\n return typeof command === 'string' ? command : '';\n}\n\nexport function browserGuard(origins: readonly string[]): Extension {\n const matcher = protectedMatcher(origins);\n return defineExtension({\n name: BROWSER_GUARD,\n hooks: [\n hook(ToolTask, {\n beforeTool: (call) =>\n call.name === 'bash' && refused(commandOf(call.arguments), matcher)\n ? { block: REFUSAL }\n : undefined,\n }),\n ],\n });\n}\n"],
5
- "mappings": "AAAA,SAAS,iBAAiC,MAAM,gBAAgB;AAChE,SAAS,aAAa,YAAY,uBAAuB;AACzD,SAAS,iBAAwC,wBAAwB;AACzE,SAAS,aAAa;AAEf,MAAM,gBAAgB;AACtB,MAAM,UAAU;AAGvB,MAAM,UAAU,oBAAI,IAAI,CAAC,kBAAkB,YAAY,CAAC;AACxD,MAAM,MAAM,oBAAI,IAAI,CAAC,SAAS,UAAU,OAAO,MAAM,CAAC;AACtD,MAAM,QAAQ,IAAI,IAAI,gBAAgB,aAAa,IAAI,CAAC,WAAW,GAAG,MAAM,GAAG,CAAC;AAChF,MAAM,UAAU;AAChB,MAAM,WAAW;AACjB,MAAM,WAAW;AACjB,MAAM,SAAS;AAEf,SAAS,MAAM,KAA8B;AAC3C,MAAI;AACF,WAAO,IAAI,IAAI,GAAG;AAAA,EACpB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,cAAc,KAAsB;AAClD,MAAI,SAAS,MAAM,GAAG;AACtB,WAAS,QAAQ,GAAG,UAAU,MAAM,IAAI,OAAO,QAAQ,KAAK,QAAQ,GAAG;AACrE,aAAS,MAAM,OAAO,KAAK,MAAM,OAAO,SAAS,MAAM,CAAC;AAC1D,MAAI,CAAC,UAAU,CAAC,IAAI,IAAI,OAAO,QAAQ,EAAG,QAAO;AACjD,QAAM,OAAO,OAAO,SAAS,QAAQ,QAAQ,EAAE;AAC/C,SAAO,WAAW,IAAI,KAAK,CAAC,gBAAgB,IAAI;AAClD;AAEO,SAAS,UAAU,KAAa,SAAoC;AACzE,SAAO,QAAQ,IAAI,GAAG,KAAK,cAAc,GAAG;AAC9C;AAEO,SAAS,WAAW,KAAuB;AAChD,QAAM,OAAO,IAAI,QAAQ,aAAa,EAAE,EAAE,QAAQ,sBAAsB,EAAE;AAC1E,QAAM,QAAQ,KAAK,QAAQ,QAAQ,EAAE;AACrC,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA;AAAA,IACA,GAAI,MAAM,MAAM,QAAQ,KAAK,CAAC;AAAA,IAC9B,IAAI,MAAM,MAAM,QAAQ,KAAK,CAAC,GAAG,IAAI,CAAC,aAAa,SAAS,QAAQ,EAAE;AAAA,EACxE;AACA,MAAI,CAAC,UAAU,KAAK,KAAK,KAAK,CAAC,2BAA2B,KAAK,KAAK;AAClE,UAAM,KAAK,WAAW,KAAK,EAAE;AAC/B,MAAI,MAAM,WAAW,IAAI,EAAG,OAAM,KAAK,SAAS,KAAK,EAAE;AACvD,SAAO,MAAM,OAAO,CAAC,SAAS,QAAQ,KAAK,IAAI,CAAC;AAClD;AAEA,SAAS,eAAe,MAAuB;AAC7C,SAAO,QAAQ,IAAI,KAAK,MAAM,KAAK,YAAY,GAAG,IAAI,CAAC,CAAC;AAC1D;AAEO,SAAS,QAAQ,SAAiB,SAAoC;AAC3E,QAAM,MAAM,MAAM,OAAO;AACzB,MAAI,CAAC,IAAI,KAAK,cAAc,EAAG,QAAO;AACtC,SAAO,IAAI,KAAK,CAAC,SAAS,WAAW,IAAI,EAAE,KAAK,CAAC,QAAQ,UAAU,KAAK,OAAO,CAAC,CAAC;AACnF;AAEA,SAAS,UAAU,MAAuB;AACxC,QAAM,UAAW,MAA4C;AAC7D,SAAO,OAAO,YAAY,WAAW,UAAU;AACjD;AAEO,SAAS,aAAa,SAAuC;AAClE,QAAM,UAAU,iBAAiB,OAAO;AACxC,SAAO,gBAAgB;AAAA,IACrB,MAAM;AAAA,IACN,OAAO;AAAA,MACL,KAAK,UAAU;AAAA,QACb,YAAY,CAAC,SACX,KAAK,SAAS,UAAU,QAAQ,UAAU,KAAK,SAAS,GAAG,OAAO,IAC9D,EAAE,OAAO,QAAQ,IACjB;AAAA,MACR,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH;",
4
+ "sourcesContent": ["import { defineExtension, type Extension, hook, ToolTask } from '@earendil-works/pi-durable';\nimport { FACADE_PORT, kernelHost, ownKernelServer } from '../kernel/loopback.ts';\nimport { PROTECTED_RULES, type ProtectedMatcher, protectedMatcher } from './origins.ts';\nimport { words } from './shell.ts';\n\nexport const BROWSER_GUARD = 'slicc-browser-guard';\nexport const REFUSAL = \"SLICC's own pages can't be opened or driven from the browser tools.\";\nexport { FACADE_PORT, ownKernelServer };\n\nconst BROWSER = new Set(['playwright-cli', 'curlwright']);\nconst WEB = new Set(['http:', 'https:', 'ws:', 'wss:']);\nconst INNER = new Set(PROTECTED_RULES.innerSchemes.map((scheme) => `${scheme}:`));\nconst SCHEMED = /^[a-z][a-z0-9+.-]*:/i;\nconst EMBEDDED = /[a-z][a-z0-9+.-]*:\\/\\/[^\\s'\"`<>(){}\\\\]+/gi;\nconst RELATIVE = /(?<![:\\w/])\\/\\/[^\\s'\"`<>(){}\\\\/]+/g;\nconst PREFIX = /^(?:[A-Za-z_][A-Za-z0-9_]*|-{1,2}[A-Za-z0-9-]+)=/;\nconst HOSTLIKE =\n /^[^\\s/?#]*(?:\\.|%2e|%e3%80%82|%ef%bc%8e|%ef%bd%a1|[\\u3002\\uff0e\\uff61])[^\\s/?#]*(?:[/?#]\\S*)?$/i;\n\nexport interface Candidate {\n url: string;\n lenient: boolean;\n}\n\nfunction parse(url: string): URL | undefined {\n try {\n return new URL(url);\n } catch {\n return undefined;\n }\n}\n\nexport function foreignKernel(url: string): boolean {\n let parsed = parse(url);\n for (let depth = 0; parsed && INNER.has(parsed.protocol) && depth < 8; depth++)\n parsed = parse(parsed.href.slice(parsed.protocol.length));\n if (!parsed || !WEB.has(parsed.protocol)) return false;\n const host = parsed.hostname.replace(/\\.+$/, '');\n return kernelHost(host) && !ownKernelServer(host);\n}\n\nexport function forbidden(url: string, matcher: ProtectedMatcher, lenient = false): boolean {\n return matcher.url(url, { readOnly: lenient }) || foreignKernel(url);\n}\n\nexport function candidates(raw: string): Candidate[] {\n const word = raw.replace(/[\\t\\n\\r]/g, '').replace(/^[\\0- ]+|[\\0- ]+$/g, '');\n const value = word.replace(PREFIX, '');\n const found = [\n word,\n value,\n ...(value.match(EMBEDDED) ?? []),\n ...(value.match(RELATIVE) ?? []).map((relative) => `https:${relative}`),\n ].map((url) => ({ url, lenient: false }));\n if (!/^[/.~-]/.test(value) && !/^[a-z][a-z0-9+.-]*:\\/\\//i.test(value))\n found.push({ url: `https://${value}`, lenient: !HOSTLIKE.test(value) });\n if (value.startsWith('//')) found.push({ url: `https:${value}`, lenient: false });\n return found.filter((each) => SCHEMED.test(each.url));\n}\n\nfunction browserCommand(word: string): boolean {\n return BROWSER.has(word.slice(word.lastIndexOf('/') + 1));\n}\n\nexport function refused(command: string, matcher: ProtectedMatcher): boolean {\n const all = words(command);\n if (!all.some(browserCommand)) return false;\n return all.some((word) =>\n candidates(word).some(({ url, lenient }) => forbidden(url, matcher, lenient))\n );\n}\n\nfunction commandOf(args: unknown): string {\n const command = (args as { command?: unknown } | undefined)?.command;\n return typeof command === 'string' ? command : '';\n}\n\nexport function browserGuard(origins: readonly string[]): Extension {\n const matcher = protectedMatcher(origins);\n return defineExtension({\n name: BROWSER_GUARD,\n hooks: [\n hook(ToolTask, {\n beforeTool: (call) =>\n call.name === 'bash' && refused(commandOf(call.arguments), matcher)\n ? { block: REFUSAL }\n : undefined,\n }),\n ],\n });\n}\n"],
5
+ "mappings": "AAAA,SAAS,iBAAiC,MAAM,gBAAgB;AAChE,SAAS,aAAa,YAAY,uBAAuB;AACzD,SAAS,iBAAwC,wBAAwB;AACzE,SAAS,aAAa;AAEf,MAAM,gBAAgB;AACtB,MAAM,UAAU;AAGvB,MAAM,UAAU,oBAAI,IAAI,CAAC,kBAAkB,YAAY,CAAC;AACxD,MAAM,MAAM,oBAAI,IAAI,CAAC,SAAS,UAAU,OAAO,MAAM,CAAC;AACtD,MAAM,QAAQ,IAAI,IAAI,gBAAgB,aAAa,IAAI,CAAC,WAAW,GAAG,MAAM,GAAG,CAAC;AAChF,MAAM,UAAU;AAChB,MAAM,WAAW;AACjB,MAAM,WAAW;AACjB,MAAM,SAAS;AACf,MAAM,WACJ;AAOF,SAAS,MAAM,KAA8B;AAC3C,MAAI;AACF,WAAO,IAAI,IAAI,GAAG;AAAA,EACpB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,cAAc,KAAsB;AAClD,MAAI,SAAS,MAAM,GAAG;AACtB,WAAS,QAAQ,GAAG,UAAU,MAAM,IAAI,OAAO,QAAQ,KAAK,QAAQ,GAAG;AACrE,aAAS,MAAM,OAAO,KAAK,MAAM,OAAO,SAAS,MAAM,CAAC;AAC1D,MAAI,CAAC,UAAU,CAAC,IAAI,IAAI,OAAO,QAAQ,EAAG,QAAO;AACjD,QAAM,OAAO,OAAO,SAAS,QAAQ,QAAQ,EAAE;AAC/C,SAAO,WAAW,IAAI,KAAK,CAAC,gBAAgB,IAAI;AAClD;AAEO,SAAS,UAAU,KAAa,SAA2B,UAAU,OAAgB;AAC1F,SAAO,QAAQ,IAAI,KAAK,EAAE,UAAU,QAAQ,CAAC,KAAK,cAAc,GAAG;AACrE;AAEO,SAAS,WAAW,KAA0B;AACnD,QAAM,OAAO,IAAI,QAAQ,aAAa,EAAE,EAAE,QAAQ,sBAAsB,EAAE;AAC1E,QAAM,QAAQ,KAAK,QAAQ,QAAQ,EAAE;AACrC,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA;AAAA,IACA,GAAI,MAAM,MAAM,QAAQ,KAAK,CAAC;AAAA,IAC9B,IAAI,MAAM,MAAM,QAAQ,KAAK,CAAC,GAAG,IAAI,CAAC,aAAa,SAAS,QAAQ,EAAE;AAAA,EACxE,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,SAAS,MAAM,EAAE;AACxC,MAAI,CAAC,UAAU,KAAK,KAAK,KAAK,CAAC,2BAA2B,KAAK,KAAK;AAClE,UAAM,KAAK,EAAE,KAAK,WAAW,KAAK,IAAI,SAAS,CAAC,SAAS,KAAK,KAAK,EAAE,CAAC;AACxE,MAAI,MAAM,WAAW,IAAI,EAAG,OAAM,KAAK,EAAE,KAAK,SAAS,KAAK,IAAI,SAAS,MAAM,CAAC;AAChF,SAAO,MAAM,OAAO,CAAC,SAAS,QAAQ,KAAK,KAAK,GAAG,CAAC;AACtD;AAEA,SAAS,eAAe,MAAuB;AAC7C,SAAO,QAAQ,IAAI,KAAK,MAAM,KAAK,YAAY,GAAG,IAAI,CAAC,CAAC;AAC1D;AAEO,SAAS,QAAQ,SAAiB,SAAoC;AAC3E,QAAM,MAAM,MAAM,OAAO;AACzB,MAAI,CAAC,IAAI,KAAK,cAAc,EAAG,QAAO;AACtC,SAAO,IAAI;AAAA,IAAK,CAAC,SACf,WAAW,IAAI,EAAE,KAAK,CAAC,EAAE,KAAK,QAAQ,MAAM,UAAU,KAAK,SAAS,OAAO,CAAC;AAAA,EAC9E;AACF;AAEA,SAAS,UAAU,MAAuB;AACxC,QAAM,UAAW,MAA4C;AAC7D,SAAO,OAAO,YAAY,WAAW,UAAU;AACjD;AAEO,SAAS,aAAa,SAAuC;AAClE,QAAM,UAAU,iBAAiB,OAAO;AACxC,SAAO,gBAAgB;AAAA,IACrB,MAAM;AAAA,IACN,OAAO;AAAA,MACL,KAAK,UAAU;AAAA,QACb,YAAY,CAAC,SACX,KAAK,SAAS,UAAU,QAAQ,UAAU,KAAK,SAAS,GAAG,OAAO,IAC9D,EAAE,OAAO,QAAQ,IACjB;AAAA,MACR,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH;",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/browser/origins.ts"],
4
- "sourcesContent": ["import catalog from '@ai-ecoverse/slicc-browsers/catalog.json' with { type: 'json' };\nimport { protectedOrigins } from '@ai-ecoverse/slicc-browsers/protected.mjs';\n\nexport const PROTECTED_RULES = catalog.protectedOrigins;\n\nexport interface ProtectedMatcher {\n url(text: string): boolean;\n target(target: { url: string; previous?: boolean; opener?: string }): boolean;\n cookieDomain(domain: string): boolean;\n storageKey(key: string): boolean;\n}\n\nexport function protectedMatcher(extra: readonly string[] = []): ProtectedMatcher {\n return protectedOrigins(PROTECTED_RULES, [...extra]);\n}\n"],
4
+ "sourcesContent": ["import catalog from '@ai-ecoverse/slicc-browsers/catalog.json' with { type: 'json' };\nimport { protectedOrigins } from '@ai-ecoverse/slicc-browsers/protected.mjs';\n\nexport const PROTECTED_RULES = catalog.protectedOrigins;\n\nexport interface ProtectedMatcher {\n url(text: string, options?: { readOnly?: boolean }): boolean;\n target(target: { url: string; previous?: boolean; opener?: string }): boolean;\n cookieDomain(domain: string): boolean;\n storageKey(key: string): boolean;\n}\n\nexport function protectedMatcher(extra: readonly string[] = []): ProtectedMatcher {\n return protectedOrigins(PROTECTED_RULES, [...extra]);\n}\n"],
5
5
  "mappings": "AAAA,OAAO,aAAa,2CAA2C,KAAK,EAAE,MAAM,OAAO;AACnF,SAAS,wBAAwB;AAE1B,MAAM,kBAAkB,QAAQ;AAShC,SAAS,iBAAiB,QAA2B,CAAC,GAAqB;AAChF,SAAO,iBAAiB,iBAAiB,CAAC,GAAG,KAAK,CAAC;AACrD;",
6
6
  "names": []
7
7
  }
@@ -4,8 +4,12 @@ import { type ProtectedMatcher } from './origins.ts';
4
4
  export declare const BROWSER_GUARD = "slicc-browser-guard";
5
5
  export declare const REFUSAL = "SLICC's own pages can't be opened or driven from the browser tools.";
6
6
  export { FACADE_PORT, ownKernelServer };
7
+ export interface Candidate {
8
+ url: string;
9
+ lenient: boolean;
10
+ }
7
11
  export declare function foreignKernel(url: string): boolean;
8
- export declare function forbidden(url: string, matcher: ProtectedMatcher): boolean;
9
- export declare function candidates(raw: string): string[];
12
+ export declare function forbidden(url: string, matcher: ProtectedMatcher, lenient?: boolean): boolean;
13
+ export declare function candidates(raw: string): Candidate[];
10
14
  export declare function refused(command: string, matcher: ProtectedMatcher): boolean;
11
15
  export declare function browserGuard(origins: readonly string[]): Extension;
@@ -9,10 +9,19 @@ export declare const PROTECTED_RULES: {
9
9
  aboutScheme: string;
10
10
  targetTypes: string[];
11
11
  inheriting: string[];
12
+ errorPage: {
13
+ url: string;
14
+ target: string;
15
+ redact: string;
16
+ };
17
+ unparseable: string;
18
+ unparseableRefusal: string;
12
19
  refusal: string;
13
20
  };
14
21
  export interface ProtectedMatcher {
15
- url(text: string): boolean;
22
+ url(text: string, options?: {
23
+ readOnly?: boolean;
24
+ }): boolean;
16
25
  target(target: {
17
26
  url: string;
18
27
  previous?: boolean;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-ecoverse/slicc-agent",
3
- "version": "6.18.8",
3
+ "version": "6.18.9",
4
4
  "description": "SLICC's agent core on pi durable: an agent worker, session storage, remoting and pi extensions",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -45,7 +45,7 @@
45
45
  "packages/vfs-root"
46
46
  ],
47
47
  "scripts": {
48
- "prepare": "lefthook install",
48
+ "prepare": "slicc-install-hooks",
49
49
  "build": "node build.mjs && tsc -p tsconfig.build.json",
50
50
  "prepack": "npm run build",
51
51
  "start": "npm run build && node test/integration/chrome.mjs",
@@ -65,10 +65,10 @@
65
65
  "release": "semantic-release"
66
66
  },
67
67
  "devDependencies": {
68
- "@ai-ecoverse/slicc-kernel": "1.141.2",
68
+ "@ai-ecoverse/slicc-kernel": "1.141.3",
69
69
  "@ai-ecoverse/slicc-scrub": "1.0.0",
70
- "@ai-ecoverse/slicc-shared-web": "1.29.6",
71
- "@ai-ecoverse/slicc-spectrum": "1.104.0",
70
+ "@ai-ecoverse/slicc-shared-web": "1.29.9",
71
+ "@ai-ecoverse/slicc-spectrum": "1.104.1",
72
72
  "@ai-ecoverse/wasi-fnox": "1.39.0-6",
73
73
  "@ai-ecoverse/wasm-bash": "5.3.0-22",
74
74
  "@ai-ecoverse/wasm-coreutils": "9.12.0-12",
@@ -85,7 +85,7 @@
85
85
  "typescript": "7.0.2"
86
86
  },
87
87
  "dependencies": {
88
- "@ai-ecoverse/slicc-browsers": "1.9.2",
88
+ "@ai-ecoverse/slicc-browsers": "1.13.2",
89
89
  "@ai-ecoverse/slicc-vault": "1.15.1",
90
90
  "@aws-sdk/middleware-websocket": "^3.972.54",
91
91
  "@earendil-works/chord": "1.3.0",