gauss-ai 4.0.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/CHANGELOG.md +489 -0
- package/LICENSE +21 -0
- package/README.md +269 -0
- package/dist/a2a/index.cjs +7 -0
- package/dist/a2a/index.cjs.map +1 -0
- package/dist/a2a/index.d.cts +30 -0
- package/dist/a2a/index.d.ts +30 -0
- package/dist/a2a/index.js +7 -0
- package/dist/a2a/index.js.map +1 -0
- package/dist/agent-UIQDSYCE.js +16 -0
- package/dist/agent-UIQDSYCE.js.map +1 -0
- package/dist/agent-builder-8W3mBR-N.d.ts +1075 -0
- package/dist/agent-builder-GEMYdb1p.d.cts +1075 -0
- package/dist/agent-graph-AMQYAWNF.js +1422 -0
- package/dist/agent-graph-AMQYAWNF.js.map +1 -0
- package/dist/ai-sdk-mcp.adapter-SEN6KHNU.js +124 -0
- package/dist/ai-sdk-mcp.adapter-SEN6KHNU.js.map +1 -0
- package/dist/browser/index.js +10 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/bun-runtime.adapter-MQDAJLQM.js +8 -0
- package/dist/bun-runtime.adapter-MQDAJLQM.js.map +1 -0
- package/dist/bun-runtime.adapter-XKOUXVAK.cjs +8 -0
- package/dist/bun-runtime.adapter-XKOUXVAK.cjs.map +1 -0
- package/dist/chat-A3XMRPJL.js +129 -0
- package/dist/chat-A3XMRPJL.js.map +1 -0
- package/dist/chunk-2ZRU47NC.js +91 -0
- package/dist/chunk-2ZRU47NC.js.map +1 -0
- package/dist/chunk-3LD3JTH4.cjs +18 -0
- package/dist/chunk-3LD3JTH4.cjs.map +1 -0
- package/dist/chunk-5FE5TG2W.cjs +16 -0
- package/dist/chunk-5FE5TG2W.cjs.map +1 -0
- package/dist/chunk-6XF673YC.cjs +436 -0
- package/dist/chunk-6XF673YC.cjs.map +1 -0
- package/dist/chunk-7CKWZJNS.js +230 -0
- package/dist/chunk-7CKWZJNS.js.map +1 -0
- package/dist/chunk-BI2G665F.js +4588 -0
- package/dist/chunk-BI2G665F.js.map +1 -0
- package/dist/chunk-C5NLWJS2.js +139 -0
- package/dist/chunk-C5NLWJS2.js.map +1 -0
- package/dist/chunk-CJZ66SU3.cjs +4321 -0
- package/dist/chunk-CJZ66SU3.cjs.map +1 -0
- package/dist/chunk-DAMT2CXW.cjs +91 -0
- package/dist/chunk-DAMT2CXW.cjs.map +1 -0
- package/dist/chunk-E7WG3MO5.js +18 -0
- package/dist/chunk-E7WG3MO5.js.map +1 -0
- package/dist/chunk-EFDM6R4J.js +99 -0
- package/dist/chunk-EFDM6R4J.js.map +1 -0
- package/dist/chunk-F7WIPPEO.js +256 -0
- package/dist/chunk-F7WIPPEO.js.map +1 -0
- package/dist/chunk-FAYDE67N.js +6927 -0
- package/dist/chunk-FAYDE67N.js.map +1 -0
- package/dist/chunk-GAE2KKCM.js +21 -0
- package/dist/chunk-GAE2KKCM.js.map +1 -0
- package/dist/chunk-INLNGRXM.cjs +130 -0
- package/dist/chunk-INLNGRXM.cjs.map +1 -0
- package/dist/chunk-JKXKXB5O.js +130 -0
- package/dist/chunk-JKXKXB5O.js.map +1 -0
- package/dist/chunk-K6SAETGP.js +375 -0
- package/dist/chunk-K6SAETGP.js.map +1 -0
- package/dist/chunk-KEASLAYR.js +157 -0
- package/dist/chunk-KEASLAYR.js.map +1 -0
- package/dist/chunk-KKJVNM6O.js +436 -0
- package/dist/chunk-KKJVNM6O.js.map +1 -0
- package/dist/chunk-KYIMVRIM.js +16 -0
- package/dist/chunk-KYIMVRIM.js.map +1 -0
- package/dist/chunk-MB7NXIZD.js +4321 -0
- package/dist/chunk-MB7NXIZD.js.map +1 -0
- package/dist/chunk-MHHDXPGE.js +209 -0
- package/dist/chunk-MHHDXPGE.js.map +1 -0
- package/dist/chunk-NE6JJA5W.js +401 -0
- package/dist/chunk-NE6JJA5W.js.map +1 -0
- package/dist/chunk-PF46XZBF.cjs +6927 -0
- package/dist/chunk-PF46XZBF.cjs.map +1 -0
- package/dist/chunk-PSJIAGDE.cjs +375 -0
- package/dist/chunk-PSJIAGDE.cjs.map +1 -0
- package/dist/chunk-PWOQDXNQ.js +16 -0
- package/dist/chunk-PWOQDXNQ.js.map +1 -0
- package/dist/chunk-QYOMQBBZ.cjs +230 -0
- package/dist/chunk-QYOMQBBZ.cjs.map +1 -0
- package/dist/chunk-UDFXLC4J.cjs +16 -0
- package/dist/chunk-UDFXLC4J.cjs.map +1 -0
- package/dist/chunk-UO4NGXRT.cjs +259 -0
- package/dist/chunk-UO4NGXRT.cjs.map +1 -0
- package/dist/chunk-UPFDFLEW.js +40 -0
- package/dist/chunk-UPFDFLEW.js.map +1 -0
- package/dist/chunk-V55JSQS7.cjs +16 -0
- package/dist/chunk-V55JSQS7.cjs.map +1 -0
- package/dist/chunk-VJADHXZL.cjs +16 -0
- package/dist/chunk-VJADHXZL.cjs.map +1 -0
- package/dist/chunk-VRWD7LCI.js +59 -0
- package/dist/chunk-VRWD7LCI.js.map +1 -0
- package/dist/chunk-WKKQ443C.js +487 -0
- package/dist/chunk-WKKQ443C.js.map +1 -0
- package/dist/chunk-X2GHUHAF.js +436 -0
- package/dist/chunk-X2GHUHAF.js.map +1 -0
- package/dist/chunk-XLGW3XNI.cjs +256 -0
- package/dist/chunk-XLGW3XNI.cjs.map +1 -0
- package/dist/chunk-ZFJKX4DP.js +16 -0
- package/dist/chunk-ZFJKX4DP.js.map +1 -0
- package/dist/chunk-ZM2OEWM2.js +259 -0
- package/dist/chunk-ZM2OEWM2.js.map +1 -0
- package/dist/chunk-ZNAIP2XV.js +16 -0
- package/dist/chunk-ZNAIP2XV.js.map +1 -0
- package/dist/chunk-ZYFAZYSL.js +42 -0
- package/dist/chunk-ZYFAZYSL.js.map +1 -0
- package/dist/cli/index.js +421 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config-4MHT6TQW.js +153 -0
- package/dist/config-4MHT6TQW.js.map +1 -0
- package/dist/config-REERQFK4.cjs +153 -0
- package/dist/config-REERQFK4.cjs.map +1 -0
- package/dist/cost-tracker-JLOU7IZJ.js +7 -0
- package/dist/cost-tracker-JLOU7IZJ.js.map +1 -0
- package/dist/demo-C52GMSYH.js +188 -0
- package/dist/demo-C52GMSYH.js.map +1 -0
- package/dist/deno/index.js +306 -0
- package/dist/deno/index.js.map +1 -0
- package/dist/deno-runtime.adapter-F744HY7K.js +8 -0
- package/dist/deno-runtime.adapter-F744HY7K.js.map +1 -0
- package/dist/deno-runtime.adapter-RFEVNSCV.cjs +8 -0
- package/dist/deno-runtime.adapter-RFEVNSCV.cjs.map +1 -0
- package/dist/dev-D7DDVDA4.js +218 -0
- package/dist/dev-D7DDVDA4.js.map +1 -0
- package/dist/edge/index.js +10 -0
- package/dist/edge/index.js.map +1 -0
- package/dist/edge-runtime.adapter-UQCW2F7X.js +8 -0
- package/dist/edge-runtime.adapter-UQCW2F7X.js.map +1 -0
- package/dist/edge-runtime.adapter-YED6F3AY.cjs +8 -0
- package/dist/edge-runtime.adapter-YED6F3AY.cjs.map +1 -0
- package/dist/graph-MGFAQZ5W.js +50 -0
- package/dist/graph-MGFAQZ5W.js.map +1 -0
- package/dist/graph-visualization-HBSVQXJK.js +9 -0
- package/dist/graph-visualization-HBSVQXJK.js.map +1 -0
- package/dist/index-BRgqNnh3.d.cts +982 -0
- package/dist/index-CZxpYUxZ.d.ts +982 -0
- package/dist/index.cjs +14789 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +10275 -0
- package/dist/index.d.ts +10275 -0
- package/dist/index.js +14789 -0
- package/dist/index.js.map +1 -0
- package/dist/init-CFWXTQ35.js +133 -0
- package/dist/init-CFWXTQ35.js.map +1 -0
- package/dist/llm-VWO4MC7J.cjs +17 -0
- package/dist/llm-VWO4MC7J.cjs.map +1 -0
- package/dist/llm-XLXVSPBI.js +17 -0
- package/dist/llm-XLXVSPBI.js.map +1 -0
- package/dist/logging-WRAK5ZXT.js +33 -0
- package/dist/logging-WRAK5ZXT.js.map +1 -0
- package/dist/metrics-FAHZVVD4.js +47 -0
- package/dist/metrics-FAHZVVD4.js.map +1 -0
- package/dist/node/index.cjs +280 -0
- package/dist/node/index.cjs.map +1 -0
- package/dist/node/index.d.cts +51 -0
- package/dist/node/index.d.ts +51 -0
- package/dist/node/index.js +280 -0
- package/dist/node/index.js.map +1 -0
- package/dist/node-runtime.adapter-5L7PJ6W2.js +8 -0
- package/dist/node-runtime.adapter-5L7PJ6W2.js.map +1 -0
- package/dist/node-runtime.adapter-CCRZVGHB.cjs +8 -0
- package/dist/node-runtime.adapter-CCRZVGHB.cjs.map +1 -0
- package/dist/persist-usage-WTBTCWEF.js +7 -0
- package/dist/persist-usage-WTBTCWEF.js.map +1 -0
- package/dist/plugin-RCPBWUUA.js +207 -0
- package/dist/plugin-RCPBWUUA.js.map +1 -0
- package/dist/plugins/index.cjs +75 -0
- package/dist/plugins/index.cjs.map +1 -0
- package/dist/plugins/index.d.cts +8 -0
- package/dist/plugins/index.d.ts +8 -0
- package/dist/plugins/index.js +75 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins-L4ING3CX.js +4625 -0
- package/dist/plugins-L4ING3CX.js.map +1 -0
- package/dist/providers/index.cjs +189 -0
- package/dist/providers/index.cjs.map +1 -0
- package/dist/providers/index.d.cts +168 -0
- package/dist/providers/index.d.ts +168 -0
- package/dist/providers/index.js +189 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers-3RNQ5CKZ.js +59 -0
- package/dist/providers-3RNQ5CKZ.js.map +1 -0
- package/dist/providers-66GPXUGQ.cjs +59 -0
- package/dist/providers-66GPXUGQ.cjs.map +1 -0
- package/dist/repl-K6QN4I2S.js +678 -0
- package/dist/repl-K6QN4I2S.js.map +1 -0
- package/dist/rest/index.cjs +17 -0
- package/dist/rest/index.cjs.map +1 -0
- package/dist/rest/index.d.cts +102 -0
- package/dist/rest/index.d.ts +102 -0
- package/dist/rest/index.js +17 -0
- package/dist/rest/index.js.map +1 -0
- package/dist/runtime-deno.js +15 -0
- package/dist/runtime-deno.js.map +1 -0
- package/dist/runtime-edge.js +15 -0
- package/dist/runtime-edge.js.map +1 -0
- package/dist/runtime-node.js +15 -0
- package/dist/runtime-node.js.map +1 -0
- package/dist/scraping/index.cjs +11 -0
- package/dist/scraping/index.cjs.map +1 -0
- package/dist/scraping/index.d.cts +17 -0
- package/dist/scraping/index.d.ts +17 -0
- package/dist/scraping/index.js +11 -0
- package/dist/scraping/index.js.map +1 -0
- package/dist/semantic-scraping.port-CZWUea88.d.cts +54 -0
- package/dist/semantic-scraping.port-CZWUea88.d.ts +54 -0
- package/dist/server/index.js +166 -0
- package/dist/server/index.js.map +1 -0
- package/dist/testing/index.cjs +25 -0
- package/dist/testing/index.cjs.map +1 -0
- package/dist/testing/index.d.cts +63 -0
- package/dist/testing/index.d.ts +63 -0
- package/dist/testing/index.js +25 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/token-counter.port-CRgxZZGe.d.ts +334 -0
- package/dist/token-counter.port-D7BHMCRR.d.cts +334 -0
- package/dist/tools-BZM33OBZ.js +10 -0
- package/dist/tools-BZM33OBZ.js.map +1 -0
- package/dist/tracing-XA3TEWP4.js +48 -0
- package/dist/tracing-XA3TEWP4.js.map +1 -0
- package/dist/types-CVsP7gFI.d.cts +235 -0
- package/dist/types-CVsP7gFI.d.ts +235 -0
- package/dist/virtual-fs.adapter-BBLS-3AY.d.ts +26 -0
- package/dist/virtual-fs.adapter-nb0CTYOj.d.cts +26 -0
- package/dist/workflow/index.cjs +9 -0
- package/dist/workflow/index.cjs.map +1 -0
- package/dist/workflow/index.d.cts +62 -0
- package/dist/workflow/index.d.ts +62 -0
- package/dist/workflow/index.js +9 -0
- package/dist/workflow/index.js.map +1 -0
- package/dist/workflow.port-BaCttxrw.d.cts +153 -0
- package/dist/workflow.port-BaCttxrw.d.ts +153 -0
- package/package.json +230 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { F as FilesystemPort, a as FilesystemZone, L as ListOptions, b as FileEntry, c as FileStat, S as SearchOptions, d as SearchResult, T as TokenCounterPort, M as Message } from '../token-counter.port-D7BHMCRR.cjs';
|
|
2
|
+
import { D as DiskSyncFn, V as VirtualFilesystem } from '../virtual-fs.adapter-nb0CTYOj.cjs';
|
|
3
|
+
import '../types-CVsP7gFI.cjs';
|
|
4
|
+
import 'zod';
|
|
5
|
+
|
|
6
|
+
declare class LocalFilesystem implements FilesystemPort {
|
|
7
|
+
private readonly basePath;
|
|
8
|
+
constructor(basePath: string);
|
|
9
|
+
read(path: string, zone?: FilesystemZone): Promise<string>;
|
|
10
|
+
write(path: string, content: string, zone?: FilesystemZone): Promise<void>;
|
|
11
|
+
exists(path: string, zone?: FilesystemZone): Promise<boolean>;
|
|
12
|
+
delete(path: string, zone?: FilesystemZone): Promise<void>;
|
|
13
|
+
list(path: string, options?: ListOptions, zone?: FilesystemZone): Promise<FileEntry[]>;
|
|
14
|
+
stat(path: string, zone?: FilesystemZone): Promise<FileStat>;
|
|
15
|
+
glob(pattern: string, zone?: FilesystemZone): Promise<string[]>;
|
|
16
|
+
search(pattern: string, options?: SearchOptions, zone?: FilesystemZone): Promise<SearchResult[]>;
|
|
17
|
+
private zoneRoot;
|
|
18
|
+
private resolvePath;
|
|
19
|
+
private readEntries;
|
|
20
|
+
private collectFiles;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
declare class TiktokenTokenCounter implements TokenCounterPort {
|
|
24
|
+
private tiktokenModule;
|
|
25
|
+
private encodingCache;
|
|
26
|
+
private initPromise;
|
|
27
|
+
private available;
|
|
28
|
+
private readonly maxCacheSize;
|
|
29
|
+
constructor(options?: {
|
|
30
|
+
maxCacheSize?: number;
|
|
31
|
+
});
|
|
32
|
+
private init;
|
|
33
|
+
private evictIfNeeded;
|
|
34
|
+
private getEncoding;
|
|
35
|
+
count(text: string, model?: string): number;
|
|
36
|
+
countMessages(messages: Message[], model?: string): number;
|
|
37
|
+
getContextWindowSize(model: string): number;
|
|
38
|
+
estimateCost(inputTokens: number, outputTokens: number, model: string): number;
|
|
39
|
+
truncate(text: string, maxTokens: number, model?: string): string;
|
|
40
|
+
/** Wait for tiktoken to finish loading */
|
|
41
|
+
waitForInit(): Promise<boolean>;
|
|
42
|
+
/** Release cached encodings */
|
|
43
|
+
dispose(): void;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** Create a DiskSyncFn using Node.js fs for use with VirtualFilesystem */
|
|
47
|
+
declare function createNodeDiskSync(): DiskSyncFn;
|
|
48
|
+
/** Create a VirtualFilesystem with Node.js disk sync support */
|
|
49
|
+
declare function createNodeVirtualFilesystem(basePath?: string): VirtualFilesystem;
|
|
50
|
+
|
|
51
|
+
export { DiskSyncFn, LocalFilesystem, TiktokenTokenCounter, createNodeDiskSync, createNodeVirtualFilesystem };
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { F as FilesystemPort, a as FilesystemZone, L as ListOptions, b as FileEntry, c as FileStat, S as SearchOptions, d as SearchResult, T as TokenCounterPort, M as Message } from '../token-counter.port-CRgxZZGe.js';
|
|
2
|
+
import { D as DiskSyncFn, V as VirtualFilesystem } from '../virtual-fs.adapter-BBLS-3AY.js';
|
|
3
|
+
import '../types-CVsP7gFI.js';
|
|
4
|
+
import 'zod';
|
|
5
|
+
|
|
6
|
+
declare class LocalFilesystem implements FilesystemPort {
|
|
7
|
+
private readonly basePath;
|
|
8
|
+
constructor(basePath: string);
|
|
9
|
+
read(path: string, zone?: FilesystemZone): Promise<string>;
|
|
10
|
+
write(path: string, content: string, zone?: FilesystemZone): Promise<void>;
|
|
11
|
+
exists(path: string, zone?: FilesystemZone): Promise<boolean>;
|
|
12
|
+
delete(path: string, zone?: FilesystemZone): Promise<void>;
|
|
13
|
+
list(path: string, options?: ListOptions, zone?: FilesystemZone): Promise<FileEntry[]>;
|
|
14
|
+
stat(path: string, zone?: FilesystemZone): Promise<FileStat>;
|
|
15
|
+
glob(pattern: string, zone?: FilesystemZone): Promise<string[]>;
|
|
16
|
+
search(pattern: string, options?: SearchOptions, zone?: FilesystemZone): Promise<SearchResult[]>;
|
|
17
|
+
private zoneRoot;
|
|
18
|
+
private resolvePath;
|
|
19
|
+
private readEntries;
|
|
20
|
+
private collectFiles;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
declare class TiktokenTokenCounter implements TokenCounterPort {
|
|
24
|
+
private tiktokenModule;
|
|
25
|
+
private encodingCache;
|
|
26
|
+
private initPromise;
|
|
27
|
+
private available;
|
|
28
|
+
private readonly maxCacheSize;
|
|
29
|
+
constructor(options?: {
|
|
30
|
+
maxCacheSize?: number;
|
|
31
|
+
});
|
|
32
|
+
private init;
|
|
33
|
+
private evictIfNeeded;
|
|
34
|
+
private getEncoding;
|
|
35
|
+
count(text: string, model?: string): number;
|
|
36
|
+
countMessages(messages: Message[], model?: string): number;
|
|
37
|
+
getContextWindowSize(model: string): number;
|
|
38
|
+
estimateCost(inputTokens: number, outputTokens: number, model: string): number;
|
|
39
|
+
truncate(text: string, maxTokens: number, model?: string): string;
|
|
40
|
+
/** Wait for tiktoken to finish loading */
|
|
41
|
+
waitForInit(): Promise<boolean>;
|
|
42
|
+
/** Release cached encodings */
|
|
43
|
+
dispose(): void;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** Create a DiskSyncFn using Node.js fs for use with VirtualFilesystem */
|
|
47
|
+
declare function createNodeDiskSync(): DiskSyncFn;
|
|
48
|
+
/** Create a VirtualFilesystem with Node.js disk sync support */
|
|
49
|
+
declare function createNodeVirtualFilesystem(basePath?: string): VirtualFilesystem;
|
|
50
|
+
|
|
51
|
+
export { DiskSyncFn, LocalFilesystem, TiktokenTokenCounter, createNodeDiskSync, createNodeVirtualFilesystem };
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ApproximateTokenCounter,
|
|
3
|
+
VirtualFilesystem,
|
|
4
|
+
globToRegex
|
|
5
|
+
} from "../chunk-F7WIPPEO.js";
|
|
6
|
+
|
|
7
|
+
// src/adapters/filesystem/local-fs.adapter.ts
|
|
8
|
+
import {
|
|
9
|
+
readFile,
|
|
10
|
+
writeFile,
|
|
11
|
+
mkdir,
|
|
12
|
+
rm,
|
|
13
|
+
readdir,
|
|
14
|
+
stat as fsStat
|
|
15
|
+
} from "fs/promises";
|
|
16
|
+
import { join, resolve, relative } from "path";
|
|
17
|
+
var LocalFilesystem = class {
|
|
18
|
+
basePath;
|
|
19
|
+
constructor(basePath) {
|
|
20
|
+
this.basePath = resolve(basePath);
|
|
21
|
+
}
|
|
22
|
+
async read(path, zone = "transient") {
|
|
23
|
+
return readFile(this.resolvePath(path, zone), "utf-8");
|
|
24
|
+
}
|
|
25
|
+
async write(path, content, zone = "transient") {
|
|
26
|
+
const fullPath = this.resolvePath(path, zone);
|
|
27
|
+
await mkdir(resolve(fullPath, ".."), { recursive: true });
|
|
28
|
+
await writeFile(fullPath, content, "utf-8");
|
|
29
|
+
}
|
|
30
|
+
async exists(path, zone = "transient") {
|
|
31
|
+
try {
|
|
32
|
+
await fsStat(this.resolvePath(path, zone));
|
|
33
|
+
return true;
|
|
34
|
+
} catch {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
async delete(path, zone = "transient") {
|
|
39
|
+
await rm(this.resolvePath(path, zone), { recursive: true, force: true });
|
|
40
|
+
}
|
|
41
|
+
async list(path, options = {}, zone = "transient") {
|
|
42
|
+
const fullPath = this.resolvePath(path, zone);
|
|
43
|
+
return this.readEntries(fullPath, fullPath, options, 1);
|
|
44
|
+
}
|
|
45
|
+
async stat(path, zone = "transient") {
|
|
46
|
+
const s = await fsStat(this.resolvePath(path, zone));
|
|
47
|
+
return {
|
|
48
|
+
size: s.size,
|
|
49
|
+
isDirectory: s.isDirectory(),
|
|
50
|
+
isFile: s.isFile(),
|
|
51
|
+
createdAt: s.birthtimeMs,
|
|
52
|
+
modifiedAt: s.mtimeMs
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
async glob(pattern, zone = "transient") {
|
|
56
|
+
const zoneRoot = this.zoneRoot(zone);
|
|
57
|
+
const allFiles = await this.collectFiles(zoneRoot);
|
|
58
|
+
const regex = globToRegex(pattern);
|
|
59
|
+
return allFiles.map((f) => relative(zoneRoot, f).split("\\").join("/")).filter((f) => regex.test(f));
|
|
60
|
+
}
|
|
61
|
+
async search(pattern, options = {}, zone = "transient") {
|
|
62
|
+
const zoneRoot = this.zoneRoot(zone);
|
|
63
|
+
const allFiles = await this.collectFiles(zoneRoot);
|
|
64
|
+
const flags = options.caseSensitive === false ? "gi" : "g";
|
|
65
|
+
const regex = new RegExp(pattern, flags);
|
|
66
|
+
const fileRegex = options.filePattern ? globToRegex(options.filePattern) : null;
|
|
67
|
+
const max = options.maxResults ?? Infinity;
|
|
68
|
+
const results = [];
|
|
69
|
+
for (const absPath of allFiles) {
|
|
70
|
+
const relPath = relative(zoneRoot, absPath).split("\\").join("/");
|
|
71
|
+
if (fileRegex && !fileRegex.test(relPath)) continue;
|
|
72
|
+
const content = await readFile(absPath, "utf-8");
|
|
73
|
+
const lines = content.split("\n");
|
|
74
|
+
for (let i = 0; i < lines.length && results.length < max; i++) {
|
|
75
|
+
regex.lastIndex = 0;
|
|
76
|
+
const match = regex.exec(lines[i]);
|
|
77
|
+
if (match) {
|
|
78
|
+
results.push({
|
|
79
|
+
filePath: relPath,
|
|
80
|
+
lineNumber: i + 1,
|
|
81
|
+
lineContent: lines[i],
|
|
82
|
+
matchStart: match.index,
|
|
83
|
+
matchEnd: match.index + match[0].length
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (results.length >= max) break;
|
|
88
|
+
}
|
|
89
|
+
return results;
|
|
90
|
+
}
|
|
91
|
+
zoneRoot(zone) {
|
|
92
|
+
return join(this.basePath, zone);
|
|
93
|
+
}
|
|
94
|
+
resolvePath(path, zone) {
|
|
95
|
+
const zoneRoot = this.zoneRoot(zone);
|
|
96
|
+
const resolved = resolve(zoneRoot, path);
|
|
97
|
+
const rel = relative(zoneRoot, resolved);
|
|
98
|
+
if (rel.startsWith("..") || resolve(resolved) === resolve(zoneRoot, "..", rel)) {
|
|
99
|
+
throw new Error(`Path traversal denied: ${path}`);
|
|
100
|
+
}
|
|
101
|
+
return resolved;
|
|
102
|
+
}
|
|
103
|
+
async readEntries(dir, rootDir, options, depth) {
|
|
104
|
+
const maxDepth = options.maxDepth ?? (options.recursive ? Infinity : 1);
|
|
105
|
+
if (depth > maxDepth) return [];
|
|
106
|
+
let entries;
|
|
107
|
+
try {
|
|
108
|
+
entries = await readdir(dir, { withFileTypes: true });
|
|
109
|
+
} catch {
|
|
110
|
+
return [];
|
|
111
|
+
}
|
|
112
|
+
const results = [];
|
|
113
|
+
for (const entry of entries) {
|
|
114
|
+
if (!options.includeHidden && entry.name.startsWith(".")) continue;
|
|
115
|
+
const fullPath = join(dir, entry.name);
|
|
116
|
+
const relPath = relative(rootDir, fullPath).split("\\").join("/");
|
|
117
|
+
const s = await fsStat(fullPath);
|
|
118
|
+
results.push({
|
|
119
|
+
name: entry.name,
|
|
120
|
+
path: relPath,
|
|
121
|
+
isDirectory: entry.isDirectory(),
|
|
122
|
+
size: s.size,
|
|
123
|
+
modifiedAt: s.mtimeMs
|
|
124
|
+
});
|
|
125
|
+
if (entry.isDirectory() && options.recursive) {
|
|
126
|
+
const children = await this.readEntries(fullPath, rootDir, options, depth + 1);
|
|
127
|
+
results.push(...children);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return results;
|
|
131
|
+
}
|
|
132
|
+
async collectFiles(dir) {
|
|
133
|
+
let entries;
|
|
134
|
+
try {
|
|
135
|
+
entries = await readdir(dir, { withFileTypes: true });
|
|
136
|
+
} catch {
|
|
137
|
+
return [];
|
|
138
|
+
}
|
|
139
|
+
const files = [];
|
|
140
|
+
for (const entry of entries) {
|
|
141
|
+
const fullPath = join(dir, entry.name);
|
|
142
|
+
if (entry.isDirectory()) {
|
|
143
|
+
files.push(...await this.collectFiles(fullPath));
|
|
144
|
+
} else {
|
|
145
|
+
files.push(fullPath);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return files;
|
|
149
|
+
}
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
// src/adapters/token-counter/tiktoken.adapter.ts
|
|
153
|
+
var fallback = new ApproximateTokenCounter();
|
|
154
|
+
var TiktokenTokenCounter = class {
|
|
155
|
+
tiktokenModule = null;
|
|
156
|
+
encodingCache = /* @__PURE__ */ new Map();
|
|
157
|
+
initPromise = null;
|
|
158
|
+
available = false;
|
|
159
|
+
maxCacheSize;
|
|
160
|
+
constructor(options) {
|
|
161
|
+
this.maxCacheSize = options?.maxCacheSize ?? 50;
|
|
162
|
+
this.initPromise = this.init();
|
|
163
|
+
}
|
|
164
|
+
async init() {
|
|
165
|
+
try {
|
|
166
|
+
this.tiktokenModule = await import("tiktoken");
|
|
167
|
+
this.available = true;
|
|
168
|
+
} catch {
|
|
169
|
+
this.available = false;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
evictIfNeeded() {
|
|
173
|
+
while (this.encodingCache.size >= this.maxCacheSize) {
|
|
174
|
+
const oldest = this.encodingCache.keys().next().value;
|
|
175
|
+
const enc = this.encodingCache.get(oldest);
|
|
176
|
+
this.encodingCache.delete(oldest);
|
|
177
|
+
try {
|
|
178
|
+
enc?.free();
|
|
179
|
+
} catch {
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
getEncoding(model) {
|
|
184
|
+
if (!this.available || !this.tiktokenModule) return null;
|
|
185
|
+
const key = model ?? "cl100k_base";
|
|
186
|
+
const cached = this.encodingCache.get(key);
|
|
187
|
+
if (cached) return cached;
|
|
188
|
+
this.evictIfNeeded();
|
|
189
|
+
try {
|
|
190
|
+
const enc = model ? this.tiktokenModule.encoding_for_model(model) : this.tiktokenModule.get_encoding("cl100k_base");
|
|
191
|
+
this.encodingCache.set(key, enc);
|
|
192
|
+
return enc;
|
|
193
|
+
} catch {
|
|
194
|
+
try {
|
|
195
|
+
const enc = this.tiktokenModule.get_encoding("cl100k_base");
|
|
196
|
+
this.encodingCache.set(key, enc);
|
|
197
|
+
return enc;
|
|
198
|
+
} catch {
|
|
199
|
+
return null;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
count(text, model) {
|
|
204
|
+
if (!text) return 0;
|
|
205
|
+
const enc = this.getEncoding(model);
|
|
206
|
+
if (!enc) return fallback.count(text);
|
|
207
|
+
return enc.encode(text).length;
|
|
208
|
+
}
|
|
209
|
+
countMessages(messages, model) {
|
|
210
|
+
if (!messages.length) return 0;
|
|
211
|
+
const enc = this.getEncoding(model);
|
|
212
|
+
if (!enc) return fallback.countMessages(messages);
|
|
213
|
+
return messages.reduce(
|
|
214
|
+
(sum, msg) => sum + enc.encode(msg.content).length + 4,
|
|
215
|
+
0
|
|
216
|
+
);
|
|
217
|
+
}
|
|
218
|
+
getContextWindowSize(model) {
|
|
219
|
+
return fallback.getContextWindowSize(model);
|
|
220
|
+
}
|
|
221
|
+
estimateCost(inputTokens, outputTokens, model) {
|
|
222
|
+
return fallback.estimateCost(inputTokens, outputTokens, model);
|
|
223
|
+
}
|
|
224
|
+
truncate(text, maxTokens, model) {
|
|
225
|
+
if (!text) return text;
|
|
226
|
+
const enc = this.getEncoding(model);
|
|
227
|
+
if (!enc) return fallback.truncate(text, maxTokens);
|
|
228
|
+
const tokens = enc.encode(text);
|
|
229
|
+
if (tokens.length <= maxTokens) return text;
|
|
230
|
+
let low = 0;
|
|
231
|
+
let high = text.length;
|
|
232
|
+
while (low < high) {
|
|
233
|
+
const mid = Math.floor((low + high + 1) / 2);
|
|
234
|
+
if (enc.encode(text.slice(0, mid)).length <= maxTokens) {
|
|
235
|
+
low = mid;
|
|
236
|
+
} else {
|
|
237
|
+
high = mid - 1;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
return text.slice(0, low);
|
|
241
|
+
}
|
|
242
|
+
/** Wait for tiktoken to finish loading */
|
|
243
|
+
async waitForInit() {
|
|
244
|
+
await this.initPromise;
|
|
245
|
+
return this.available;
|
|
246
|
+
}
|
|
247
|
+
/** Release cached encodings */
|
|
248
|
+
dispose() {
|
|
249
|
+
for (const enc of this.encodingCache.values()) {
|
|
250
|
+
try {
|
|
251
|
+
enc.free();
|
|
252
|
+
} catch {
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
this.encodingCache.clear();
|
|
256
|
+
}
|
|
257
|
+
};
|
|
258
|
+
|
|
259
|
+
// src/node/index.ts
|
|
260
|
+
import { writeFile as writeFile2, mkdir as mkdir2 } from "fs/promises";
|
|
261
|
+
import { dirname } from "path";
|
|
262
|
+
function createNodeDiskSync() {
|
|
263
|
+
return async (filePath, content) => {
|
|
264
|
+
await mkdir2(dirname(filePath), { recursive: true });
|
|
265
|
+
await writeFile2(filePath, content, "utf-8");
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
function createNodeVirtualFilesystem(basePath) {
|
|
269
|
+
return new VirtualFilesystem({
|
|
270
|
+
basePath: basePath ?? process.cwd(),
|
|
271
|
+
onSync: createNodeDiskSync()
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
export {
|
|
275
|
+
LocalFilesystem,
|
|
276
|
+
TiktokenTokenCounter,
|
|
277
|
+
createNodeDiskSync,
|
|
278
|
+
createNodeVirtualFilesystem
|
|
279
|
+
};
|
|
280
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/adapters/filesystem/local-fs.adapter.ts","../../src/adapters/token-counter/tiktoken.adapter.ts","../../src/node/index.ts"],"sourcesContent":["// =============================================================================\n// LocalFilesystem — Sandboxed wrapper over Node.js fs\n// =============================================================================\n\nimport {\n readFile,\n writeFile,\n mkdir,\n rm,\n readdir,\n stat as fsStat,\n} from \"node:fs/promises\";\nimport { join, resolve, relative } from \"node:path\";\n\nimport type { FilesystemPort } from \"../../ports/filesystem.port.js\";\nimport type {\n FileEntry,\n FileStat,\n FilesystemZone,\n ListOptions,\n SearchOptions,\n SearchResult,\n} from \"../../types.js\";\nimport { globToRegex } from \"./glob-utils.js\";\n\nexport class LocalFilesystem implements FilesystemPort {\n private readonly basePath: string;\n\n constructor(basePath: string) {\n this.basePath = resolve(basePath);\n }\n\n async read(path: string, zone: FilesystemZone = \"transient\"): Promise<string> {\n return readFile(this.resolvePath(path, zone), \"utf-8\");\n }\n\n async write(path: string, content: string, zone: FilesystemZone = \"transient\"): Promise<void> {\n const fullPath = this.resolvePath(path, zone);\n await mkdir(resolve(fullPath, \"..\"), { recursive: true });\n await writeFile(fullPath, content, \"utf-8\");\n }\n\n async exists(path: string, zone: FilesystemZone = \"transient\"): Promise<boolean> {\n try {\n await fsStat(this.resolvePath(path, zone));\n return true;\n } catch {\n return false;\n }\n }\n\n async delete(path: string, zone: FilesystemZone = \"transient\"): Promise<void> {\n await rm(this.resolvePath(path, zone), { recursive: true, force: true });\n }\n\n async list(\n path: string,\n options: ListOptions = {},\n zone: FilesystemZone = \"transient\",\n ): Promise<FileEntry[]> {\n const fullPath = this.resolvePath(path, zone);\n return this.readEntries(fullPath, fullPath, options, 1);\n }\n\n async stat(path: string, zone: FilesystemZone = \"transient\"): Promise<FileStat> {\n const s = await fsStat(this.resolvePath(path, zone));\n return {\n size: s.size,\n isDirectory: s.isDirectory(),\n isFile: s.isFile(),\n createdAt: s.birthtimeMs,\n modifiedAt: s.mtimeMs,\n };\n }\n\n async glob(pattern: string, zone: FilesystemZone = \"transient\"): Promise<string[]> {\n const zoneRoot = this.zoneRoot(zone);\n const allFiles = await this.collectFiles(zoneRoot);\n const regex = globToRegex(pattern);\n return allFiles\n .map((f) => relative(zoneRoot, f).split(\"\\\\\").join(\"/\"))\n .filter((f) => regex.test(f));\n }\n\n async search(\n pattern: string,\n options: SearchOptions = {},\n zone: FilesystemZone = \"transient\",\n ): Promise<SearchResult[]> {\n const zoneRoot = this.zoneRoot(zone);\n const allFiles = await this.collectFiles(zoneRoot);\n const flags = options.caseSensitive === false ? \"gi\" : \"g\";\n const regex = new RegExp(pattern, flags);\n const fileRegex = options.filePattern ? globToRegex(options.filePattern) : null;\n const max = options.maxResults ?? Infinity;\n const results: SearchResult[] = [];\n\n for (const absPath of allFiles) {\n const relPath = relative(zoneRoot, absPath).split(\"\\\\\").join(\"/\");\n if (fileRegex && !fileRegex.test(relPath)) continue;\n const content = await readFile(absPath, \"utf-8\");\n const lines = content.split(\"\\n\");\n for (let i = 0; i < lines.length && results.length < max; i++) {\n regex.lastIndex = 0;\n const match = regex.exec(lines[i]!);\n if (match) {\n results.push({\n filePath: relPath,\n lineNumber: i + 1,\n lineContent: lines[i]!,\n matchStart: match.index,\n matchEnd: match.index + match[0].length,\n });\n }\n }\n if (results.length >= max) break;\n }\n return results;\n }\n\n private zoneRoot(zone: FilesystemZone): string {\n return join(this.basePath, zone);\n }\n\n private resolvePath(path: string, zone: FilesystemZone): string {\n const zoneRoot = this.zoneRoot(zone);\n const resolved = resolve(zoneRoot, path);\n const rel = relative(zoneRoot, resolved);\n if (rel.startsWith(\"..\") || resolve(resolved) === resolve(zoneRoot, \"..\", rel)) {\n throw new Error(`Path traversal denied: ${path}`);\n }\n return resolved;\n }\n\n private async readEntries(\n dir: string,\n rootDir: string,\n options: ListOptions,\n depth: number,\n ): Promise<FileEntry[]> {\n const maxDepth = options.maxDepth ?? (options.recursive ? Infinity : 1);\n if (depth > maxDepth) return [];\n let entries;\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return [];\n }\n const results: FileEntry[] = [];\n for (const entry of entries) {\n if (!options.includeHidden && entry.name.startsWith(\".\")) continue;\n const fullPath = join(dir, entry.name);\n const relPath = relative(rootDir, fullPath).split(\"\\\\\").join(\"/\");\n const s = await fsStat(fullPath);\n results.push({\n name: entry.name,\n path: relPath,\n isDirectory: entry.isDirectory(),\n size: s.size,\n modifiedAt: s.mtimeMs,\n });\n if (entry.isDirectory() && options.recursive) {\n const children = await this.readEntries(fullPath, rootDir, options, depth + 1);\n results.push(...children);\n }\n }\n return results;\n }\n\n private async collectFiles(dir: string): Promise<string[]> {\n let entries;\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return [];\n }\n const files: string[] = [];\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n files.push(...(await this.collectFiles(fullPath)));\n } else {\n files.push(fullPath);\n }\n }\n return files;\n }\n}\n\n\n","// =============================================================================\n// TiktokenTokenCounter — Accurate token counting via tiktoken\n// =============================================================================\n\nimport type { Message } from \"../../types.js\";\nimport type { TokenCounterPort } from \"../../ports/token-counter.port.js\";\nimport { ApproximateTokenCounter } from \"./approximate.adapter.js\";\n\ntype TiktokenEncoding = {\n encode: (text: string) => ArrayLike<number>;\n free: () => void;\n};\ntype TiktokenModule = {\n encoding_for_model: (model: string) => TiktokenEncoding;\n get_encoding: (encoding: string) => TiktokenEncoding;\n};\n\nconst fallback = new ApproximateTokenCounter();\n\nexport class TiktokenTokenCounter implements TokenCounterPort {\n private tiktokenModule: TiktokenModule | null = null;\n private encodingCache = new Map<string, TiktokenEncoding>();\n private initPromise: Promise<void> | null = null;\n private available = false;\n private readonly maxCacheSize: number;\n\n constructor(options?: { maxCacheSize?: number }) {\n this.maxCacheSize = options?.maxCacheSize ?? 50;\n this.initPromise = this.init();\n }\n\n private async init(): Promise<void> {\n try {\n this.tiktokenModule = (await import(\"tiktoken\")) as TiktokenModule;\n this.available = true;\n } catch {\n this.available = false;\n }\n }\n\n private evictIfNeeded(): void {\n while (this.encodingCache.size >= this.maxCacheSize) {\n const oldest = this.encodingCache.keys().next().value as string;\n const enc = this.encodingCache.get(oldest);\n this.encodingCache.delete(oldest);\n try { enc?.free(); } catch { /* ignore */ }\n }\n }\n\n private getEncoding(model?: string): TiktokenEncoding | null {\n if (!this.available || !this.tiktokenModule) return null;\n\n const key = model ?? \"cl100k_base\";\n const cached = this.encodingCache.get(key);\n if (cached) return cached;\n\n this.evictIfNeeded();\n\n try {\n const enc = model\n ? this.tiktokenModule.encoding_for_model(model)\n : this.tiktokenModule.get_encoding(\"cl100k_base\");\n this.encodingCache.set(key, enc);\n return enc;\n } catch {\n // Unknown model, use default encoding\n try {\n const enc = this.tiktokenModule.get_encoding(\"cl100k_base\");\n this.encodingCache.set(key, enc);\n return enc;\n } catch {\n return null;\n }\n }\n }\n\n count(text: string, model?: string): number {\n if (!text) return 0;\n const enc = this.getEncoding(model);\n if (!enc) return fallback.count(text);\n return enc.encode(text).length;\n }\n\n countMessages(messages: Message[], model?: string): number {\n if (!messages.length) return 0;\n const enc = this.getEncoding(model);\n if (!enc) return fallback.countMessages(messages);\n return messages.reduce(\n (sum, msg) => sum + enc.encode(msg.content).length + 4,\n 0,\n );\n }\n\n getContextWindowSize(model: string): number {\n return fallback.getContextWindowSize(model);\n }\n\n estimateCost(\n inputTokens: number,\n outputTokens: number,\n model: string,\n ): number {\n return fallback.estimateCost(inputTokens, outputTokens, model);\n }\n\n truncate(text: string, maxTokens: number, model?: string): string {\n if (!text) return text;\n const enc = this.getEncoding(model);\n if (!enc) return fallback.truncate(text, maxTokens);\n\n const tokens = enc.encode(text);\n if (tokens.length <= maxTokens) return text;\n\n // Binary search for the right character cut point\n let low = 0;\n let high = text.length;\n while (low < high) {\n const mid = Math.floor((low + high + 1) / 2);\n if (enc.encode(text.slice(0, mid)).length <= maxTokens) {\n low = mid;\n } else {\n high = mid - 1;\n }\n }\n return text.slice(0, low);\n }\n\n /** Wait for tiktoken to finish loading */\n async waitForInit(): Promise<boolean> {\n await this.initPromise;\n return this.available;\n }\n\n /** Release cached encodings */\n dispose(): void {\n for (const enc of this.encodingCache.values()) {\n try {\n enc.free();\n } catch {\n // ignore\n }\n }\n this.encodingCache.clear();\n }\n}\n","// gauss/node — Node.js-specific adapters\nexport { LocalFilesystem } from \"../adapters/filesystem/local-fs.adapter.js\";\nexport { TiktokenTokenCounter } from \"../adapters/token-counter/tiktoken.adapter.js\";\nexport type { DiskSyncFn } from \"../adapters/filesystem/virtual-fs.adapter.js\";\n\n// Re-export a helper to create a VirtualFilesystem with Node.js disk sync\nimport { writeFile, mkdir } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport { VirtualFilesystem } from \"../adapters/filesystem/virtual-fs.adapter.js\";\nimport type { DiskSyncFn } from \"../adapters/filesystem/virtual-fs.adapter.js\";\n\n/** Create a DiskSyncFn using Node.js fs for use with VirtualFilesystem */\nexport function createNodeDiskSync(): DiskSyncFn {\n return async (filePath: string, content: string): Promise<void> => {\n await mkdir(dirname(filePath), { recursive: true });\n await writeFile(filePath, content, \"utf-8\");\n };\n}\n\n/** Create a VirtualFilesystem with Node.js disk sync support */\nexport function createNodeVirtualFilesystem(basePath?: string): VirtualFilesystem {\n return new VirtualFilesystem({\n basePath: basePath ?? process.cwd(),\n onSync: createNodeDiskSync(),\n });\n}\n"],"mappings":"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","names":["writeFile","mkdir","mkdir","writeFile"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
|
+
|
|
3
|
+
var _chunkUDFXLC4Jcjs = require('./chunk-UDFXLC4J.cjs');
|
|
4
|
+
require('./chunk-3LD3JTH4.cjs');
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
exports.NodeRuntimeAdapter = _chunkUDFXLC4Jcjs.NodeRuntimeAdapter;
|
|
8
|
+
//# sourceMappingURL=node-runtime.adapter-CCRZVGHB.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/giulioleone/Sviluppo/gauss/gauss-flow/dist/node-runtime.adapter-CCRZVGHB.cjs"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACF,kEAAC","file":"/Users/giulioleone/Sviluppo/gauss/gauss-flow/dist/node-runtime.adapter-CCRZVGHB.cjs"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import {
|
|
2
|
+
bold,
|
|
3
|
+
color
|
|
4
|
+
} from "./chunk-VRWD7LCI.js";
|
|
5
|
+
|
|
6
|
+
// src/adapters/plugin-marketplace/local-cache.ts
|
|
7
|
+
import { homedir } from "os";
|
|
8
|
+
import { join, resolve, sep } from "path";
|
|
9
|
+
import { mkdirSync, writeFileSync, readFileSync, readdirSync, rmSync, existsSync } from "fs";
|
|
10
|
+
var PLUGINS_ROOT = join(homedir(), ".gauss", "plugins");
|
|
11
|
+
function assertSafeName(name) {
|
|
12
|
+
if (!name || /[/\\]/.test(name) || name.includes("..") || name === "." || name === "..") {
|
|
13
|
+
throw new Error(`Invalid plugin name: "${name}" \u2014 must not contain path separators or traversal`);
|
|
14
|
+
}
|
|
15
|
+
const resolved = resolve(PLUGINS_ROOT, name);
|
|
16
|
+
if (!resolved.startsWith(PLUGINS_ROOT + sep)) {
|
|
17
|
+
throw new Error(`Invalid plugin name: "${name}" \u2014 path escapes plugins directory`);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function getPluginDir(name) {
|
|
21
|
+
assertSafeName(name);
|
|
22
|
+
return join(PLUGINS_ROOT, name);
|
|
23
|
+
}
|
|
24
|
+
function saveManifest(manifest) {
|
|
25
|
+
const dir = getPluginDir(manifest.name);
|
|
26
|
+
mkdirSync(dir, { recursive: true });
|
|
27
|
+
writeFileSync(join(dir, "manifest.json"), JSON.stringify(manifest, null, 2));
|
|
28
|
+
}
|
|
29
|
+
function readInstalledManifests() {
|
|
30
|
+
if (!existsSync(PLUGINS_ROOT)) return [];
|
|
31
|
+
const entries = readdirSync(PLUGINS_ROOT, { withFileTypes: true });
|
|
32
|
+
const manifests = [];
|
|
33
|
+
for (const entry of entries) {
|
|
34
|
+
if (!entry.isDirectory()) continue;
|
|
35
|
+
const manifestPath = join(PLUGINS_ROOT, entry.name, "manifest.json");
|
|
36
|
+
if (!existsSync(manifestPath)) continue;
|
|
37
|
+
try {
|
|
38
|
+
const raw = readFileSync(manifestPath, "utf-8");
|
|
39
|
+
manifests.push(JSON.parse(raw));
|
|
40
|
+
} catch {
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return manifests;
|
|
44
|
+
}
|
|
45
|
+
function removePluginDir(name) {
|
|
46
|
+
const dir = getPluginDir(name);
|
|
47
|
+
if (existsSync(dir)) {
|
|
48
|
+
rmSync(dir, { recursive: true, force: true });
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// src/adapters/plugin-marketplace/github-registry.adapter.ts
|
|
53
|
+
var DEFAULT_REGISTRY_URL = "https://raw.githubusercontent.com/giulio-leone/gauss-plugins/main/registry.json";
|
|
54
|
+
var GitHubRegistryAdapter = class {
|
|
55
|
+
registryUrl;
|
|
56
|
+
constructor(options) {
|
|
57
|
+
this.registryUrl = options?.registryUrl ?? DEFAULT_REGISTRY_URL;
|
|
58
|
+
}
|
|
59
|
+
async search(query) {
|
|
60
|
+
const manifests = await this.fetchRegistry();
|
|
61
|
+
const lower = query.toLowerCase();
|
|
62
|
+
return manifests.filter(
|
|
63
|
+
(m) => m.name.toLowerCase().includes(lower) || m.description.toLowerCase().includes(lower) || m.tags?.some((t) => t.toLowerCase().includes(lower))
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
async getManifest(name) {
|
|
67
|
+
const manifests = await this.fetchRegistry();
|
|
68
|
+
return manifests.find((m) => m.name === name) ?? null;
|
|
69
|
+
}
|
|
70
|
+
async listInstalled() {
|
|
71
|
+
return readInstalledManifests();
|
|
72
|
+
}
|
|
73
|
+
async install(name) {
|
|
74
|
+
const manifest = await this.getManifest(name);
|
|
75
|
+
if (!manifest) {
|
|
76
|
+
throw new Error(`Plugin "${name}" not found in registry.`);
|
|
77
|
+
}
|
|
78
|
+
saveManifest(manifest);
|
|
79
|
+
}
|
|
80
|
+
async uninstall(name) {
|
|
81
|
+
removePluginDir(name);
|
|
82
|
+
}
|
|
83
|
+
// ─── Private ────────────────────────────────────────────────────────────
|
|
84
|
+
async fetchRegistry() {
|
|
85
|
+
let response;
|
|
86
|
+
try {
|
|
87
|
+
response = await fetch(this.registryUrl);
|
|
88
|
+
} catch (err) {
|
|
89
|
+
throw new Error(
|
|
90
|
+
`Failed to fetch plugin registry: ${err instanceof Error ? err.message : String(err)}`
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
if (!response.ok) {
|
|
94
|
+
throw new Error(
|
|
95
|
+
`Registry returned HTTP ${response.status}: ${response.statusText}`
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
let data;
|
|
99
|
+
try {
|
|
100
|
+
data = await response.json();
|
|
101
|
+
} catch {
|
|
102
|
+
throw new Error("Registry returned invalid JSON.");
|
|
103
|
+
}
|
|
104
|
+
if (!Array.isArray(data)) {
|
|
105
|
+
throw new Error("Registry JSON is not an array.");
|
|
106
|
+
}
|
|
107
|
+
return data.filter(
|
|
108
|
+
(item) => typeof item === "object" && item !== null && typeof item.name === "string" && typeof item.version === "string" && typeof item.description === "string" && typeof item.author === "string" && typeof item.entry === "string"
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
// src/cli/commands/plugin.ts
|
|
114
|
+
function createRegistry() {
|
|
115
|
+
return new GitHubRegistryAdapter();
|
|
116
|
+
}
|
|
117
|
+
async function pluginSearch(query) {
|
|
118
|
+
const registry = createRegistry();
|
|
119
|
+
console.log(color("dim", `
|
|
120
|
+
Searching for "${query}"...
|
|
121
|
+
`));
|
|
122
|
+
let results;
|
|
123
|
+
try {
|
|
124
|
+
results = await registry.search(query);
|
|
125
|
+
} catch (err) {
|
|
126
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
127
|
+
console.error(color("red", `\u2717 Search failed: ${msg}`));
|
|
128
|
+
process.exitCode = 1;
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
if (results.length === 0) {
|
|
132
|
+
console.log(color("yellow", " No plugins found.\n"));
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
console.log(bold(` Found ${results.length} plugin(s):
|
|
136
|
+
`));
|
|
137
|
+
for (const plugin of results) {
|
|
138
|
+
console.log(` ${bold(color("cyan", plugin.name))} ${color("dim", `v${plugin.version}`)}`);
|
|
139
|
+
console.log(` ${plugin.description}`);
|
|
140
|
+
console.log(` ${color("dim", `by ${plugin.author}`)}${plugin.tags?.length ? ` ${color("dim", `[${plugin.tags.join(", ")}]`)}` : ""}`);
|
|
141
|
+
console.log();
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
async function pluginInstall(name) {
|
|
145
|
+
const registry = createRegistry();
|
|
146
|
+
console.log(color("dim", `
|
|
147
|
+
Installing plugin "${name}"...
|
|
148
|
+
`));
|
|
149
|
+
try {
|
|
150
|
+
await registry.install(name);
|
|
151
|
+
console.log(color("green", ` \u2713 Plugin "${name}" installed successfully.
|
|
152
|
+
`));
|
|
153
|
+
} catch (err) {
|
|
154
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
155
|
+
console.error(color("red", ` \u2717 Install failed: ${msg}
|
|
156
|
+
`));
|
|
157
|
+
process.exitCode = 1;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
async function pluginUninstall(name) {
|
|
161
|
+
const registry = createRegistry();
|
|
162
|
+
try {
|
|
163
|
+
await registry.uninstall(name);
|
|
164
|
+
console.log(color("green", `
|
|
165
|
+
\u2713 Plugin "${name}" uninstalled.
|
|
166
|
+
`));
|
|
167
|
+
} catch (err) {
|
|
168
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
169
|
+
console.error(color("red", `
|
|
170
|
+
\u2717 Uninstall failed: ${msg}
|
|
171
|
+
`));
|
|
172
|
+
process.exitCode = 1;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
async function pluginList() {
|
|
176
|
+
const registry = createRegistry();
|
|
177
|
+
let installed;
|
|
178
|
+
try {
|
|
179
|
+
installed = await registry.listInstalled();
|
|
180
|
+
} catch (err) {
|
|
181
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
182
|
+
console.error(color("red", `
|
|
183
|
+
\u2717 Failed to list plugins: ${msg}`));
|
|
184
|
+
process.exitCode = 1;
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
if (installed.length === 0) {
|
|
188
|
+
console.log(color("dim", "\n No plugins installed.\n"));
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
console.log(bold(`
|
|
192
|
+
Installed plugins (${installed.length}):
|
|
193
|
+
`));
|
|
194
|
+
for (const plugin of installed) {
|
|
195
|
+
console.log(` ${bold(color("cyan", plugin.name))} ${color("dim", `v${plugin.version}`)}`);
|
|
196
|
+
console.log(` ${plugin.description}`);
|
|
197
|
+
console.log(` ${color("dim", `by ${plugin.author}`)}`);
|
|
198
|
+
console.log();
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
export {
|
|
202
|
+
pluginInstall,
|
|
203
|
+
pluginList,
|
|
204
|
+
pluginSearch,
|
|
205
|
+
pluginUninstall
|
|
206
|
+
};
|
|
207
|
+
//# sourceMappingURL=plugin-RCPBWUUA.js.map
|