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,91 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); var _class;// src/plugins/a2a-delegation.ts
|
|
2
|
+
var A2ADelegationManager = (_class = class {
|
|
3
|
+
__init() {this.agents = /* @__PURE__ */ new Map()}
|
|
4
|
+
|
|
5
|
+
constructor(fetchImpl = globalThis.fetch) {;_class.prototype.__init.call(this);
|
|
6
|
+
if (!fetchImpl) {
|
|
7
|
+
throw new Error("A2ADelegationManager requires a fetch implementation");
|
|
8
|
+
}
|
|
9
|
+
this.fetchImpl = fetchImpl;
|
|
10
|
+
}
|
|
11
|
+
register(agent) {
|
|
12
|
+
this.agents.set(agent.name, agent);
|
|
13
|
+
}
|
|
14
|
+
unregister(name) {
|
|
15
|
+
this.agents.delete(name);
|
|
16
|
+
}
|
|
17
|
+
listAgents() {
|
|
18
|
+
return Array.from(this.agents.values());
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Find the best agent for a task based on required skills.
|
|
22
|
+
* Uses a simple skill overlap scoring system.
|
|
23
|
+
*/
|
|
24
|
+
findAgent(requiredSkills) {
|
|
25
|
+
if (requiredSkills.length === 0) {
|
|
26
|
+
const agents = Array.from(this.agents.values());
|
|
27
|
+
return agents.length > 0 ? agents[0] : null;
|
|
28
|
+
}
|
|
29
|
+
let bestAgent = null;
|
|
30
|
+
let bestScore = 0;
|
|
31
|
+
for (const agent of this.agents.values()) {
|
|
32
|
+
const overlap = requiredSkills.filter(
|
|
33
|
+
(skill) => agent.skills.some(
|
|
34
|
+
(agentSkill) => agentSkill.toLowerCase().includes(skill.toLowerCase()) || skill.toLowerCase().includes(agentSkill.toLowerCase())
|
|
35
|
+
)
|
|
36
|
+
);
|
|
37
|
+
const score = overlap.length / requiredSkills.length;
|
|
38
|
+
if (score > bestScore) {
|
|
39
|
+
bestScore = score;
|
|
40
|
+
bestAgent = agent;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return bestAgent;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Delegate a task to the best matching agent.
|
|
47
|
+
*/
|
|
48
|
+
async delegate(prompt, requiredSkills, fetchImpl = this.fetchImpl) {
|
|
49
|
+
const selectedAgent = this.findAgent(requiredSkills);
|
|
50
|
+
if (!selectedAgent) {
|
|
51
|
+
throw new Error("No suitable agent found for delegation");
|
|
52
|
+
}
|
|
53
|
+
const taskId = crypto.randomUUID();
|
|
54
|
+
const payload = {
|
|
55
|
+
jsonrpc: "2.0",
|
|
56
|
+
id: taskId,
|
|
57
|
+
method: "tasks/send",
|
|
58
|
+
params: {
|
|
59
|
+
prompt,
|
|
60
|
+
taskId,
|
|
61
|
+
metadata: { delegatedSkills: requiredSkills }
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
try {
|
|
65
|
+
const response = await fetchImpl(selectedAgent.endpoint, {
|
|
66
|
+
method: "POST",
|
|
67
|
+
headers: { "Content-Type": "application/json" },
|
|
68
|
+
body: JSON.stringify(payload)
|
|
69
|
+
});
|
|
70
|
+
if (!response.ok) {
|
|
71
|
+
throw new Error(`Agent endpoint returned HTTP ${response.status}`);
|
|
72
|
+
}
|
|
73
|
+
const result = await response.json();
|
|
74
|
+
if (result.error) {
|
|
75
|
+
throw new Error(`Agent error [${result.error.code}]: ${result.error.message}`);
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
selectedAgent,
|
|
79
|
+
taskId,
|
|
80
|
+
result: result.result
|
|
81
|
+
};
|
|
82
|
+
} catch (error) {
|
|
83
|
+
throw new Error(`Delegation failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}, _class);
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
exports.A2ADelegationManager = A2ADelegationManager;
|
|
91
|
+
//# sourceMappingURL=chunk-DAMT2CXW.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/giulioleone/Sviluppo/gauss/gauss-flow/dist/chunk-DAMT2CXW.cjs","../src/plugins/a2a-delegation.ts"],"names":[],"mappings":"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","file":"/Users/giulioleone/Sviluppo/gauss/gauss-flow/dist/chunk-DAMT2CXW.cjs","sourcesContent":[null,"// =============================================================================\n// A2A Delegation — Multi-Agent Capability-based Delegation\n// =============================================================================\n\nimport type { A2AJsonRpcRequest, A2AJsonRpcResponse, A2ATask } from \"./a2a-handler.js\";\n\nexport interface AgentCapability {\n name: string;\n description: string;\n skills: string[];\n endpoint: string;\n}\n\nexport interface DelegationResult {\n selectedAgent: AgentCapability;\n taskId: string;\n result: unknown;\n}\n\nexport class A2ADelegationManager {\n private readonly agents = new Map<string, AgentCapability>();\n private readonly fetchImpl: typeof fetch;\n\n constructor(fetchImpl: typeof fetch = globalThis.fetch) {\n if (!fetchImpl) {\n throw new Error(\"A2ADelegationManager requires a fetch implementation\");\n }\n this.fetchImpl = fetchImpl;\n }\n\n register(agent: AgentCapability): void {\n this.agents.set(agent.name, agent);\n }\n\n unregister(name: string): void {\n this.agents.delete(name);\n }\n\n listAgents(): AgentCapability[] {\n return Array.from(this.agents.values());\n }\n\n /**\n * Find the best agent for a task based on required skills.\n * Uses a simple skill overlap scoring system.\n */\n findAgent(requiredSkills: string[]): AgentCapability | null {\n if (requiredSkills.length === 0) {\n const agents = Array.from(this.agents.values());\n return agents.length > 0 ? agents[0] : null;\n }\n\n let bestAgent: AgentCapability | null = null;\n let bestScore = 0;\n\n for (const agent of this.agents.values()) {\n const overlap = requiredSkills.filter(skill =>\n agent.skills.some(agentSkill =>\n agentSkill.toLowerCase().includes(skill.toLowerCase()) ||\n skill.toLowerCase().includes(agentSkill.toLowerCase())\n )\n );\n \n const score = overlap.length / requiredSkills.length;\n if (score > bestScore) {\n bestScore = score;\n bestAgent = agent;\n }\n }\n\n return bestAgent;\n }\n\n /**\n * Delegate a task to the best matching agent.\n */\n async delegate(\n prompt: string,\n requiredSkills: string[],\n fetchImpl: typeof fetch = this.fetchImpl\n ): Promise<DelegationResult> {\n const selectedAgent = this.findAgent(requiredSkills);\n if (!selectedAgent) {\n throw new Error(\"No suitable agent found for delegation\");\n }\n\n const taskId = crypto.randomUUID();\n const payload: A2AJsonRpcRequest = {\n jsonrpc: \"2.0\",\n id: taskId,\n method: \"tasks/send\",\n params: {\n prompt,\n taskId,\n metadata: { delegatedSkills: requiredSkills }\n }\n };\n\n try {\n const response = await fetchImpl(selectedAgent.endpoint, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload)\n });\n\n if (!response.ok) {\n throw new Error(`Agent endpoint returned HTTP ${response.status}`);\n }\n\n const result = await response.json() as A2AJsonRpcResponse;\n \n if (result.error) {\n throw new Error(`Agent error [${result.error.code}]: ${result.error.message}`);\n }\n\n return {\n selectedAgent,\n taskId,\n result: result.result\n };\n } catch (error) {\n throw new Error(`Delegation failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n}"]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// src/adapters/runtime/base-runtime.adapter.ts
|
|
2
|
+
var BaseRuntimeAdapter = class {
|
|
3
|
+
randomUUID() {
|
|
4
|
+
return crypto.randomUUID();
|
|
5
|
+
}
|
|
6
|
+
fetch(input, init) {
|
|
7
|
+
return globalThis.fetch(input, init);
|
|
8
|
+
}
|
|
9
|
+
setTimeout(callback, ms) {
|
|
10
|
+
const handle = globalThis.setTimeout(callback, ms);
|
|
11
|
+
return { clear: () => globalThis.clearTimeout(handle) };
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export {
|
|
16
|
+
BaseRuntimeAdapter
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=chunk-E7WG3MO5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/adapters/runtime/base-runtime.adapter.ts"],"sourcesContent":["import type { RuntimePort } from \"../../ports/runtime.port.js\";\n\n/**\n * Base implementation of RuntimePort using Web Standard APIs.\n * Subclasses only need to override name and getEnv() for runtime-specific access.\n */\nexport abstract class BaseRuntimeAdapter implements RuntimePort {\n abstract readonly name: RuntimePort['name'];\n\n randomUUID(): string {\n return crypto.randomUUID();\n }\n\n fetch(input: string | URL | Request, init?: RequestInit): Promise<Response> {\n return globalThis.fetch(input, init);\n }\n\n abstract getEnv(key: string): string | undefined;\n\n setTimeout(callback: () => void, ms: number): { clear(): void } {\n const handle = globalThis.setTimeout(callback, ms);\n return { clear: () => globalThis.clearTimeout(handle) };\n }\n}\n"],"mappings":";AAMO,IAAe,qBAAf,MAAyD;AAAA,EAG9D,aAAqB;AACnB,WAAO,OAAO,WAAW;AAAA,EAC3B;AAAA,EAEA,MAAM,OAA+B,MAAuC;AAC1E,WAAO,WAAW,MAAM,OAAO,IAAI;AAAA,EACrC;AAAA,EAIA,WAAW,UAAsB,IAA+B;AAC9D,UAAM,SAAS,WAAW,WAAW,UAAU,EAAE;AACjD,WAAO,EAAE,OAAO,MAAM,WAAW,aAAa,MAAM,EAAE;AAAA,EACxD;AACF;","names":[]}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
// src/adapters/cost-tracker/default-cost-tracker.adapter.ts
|
|
2
|
+
var MODEL_PRICING = {
|
|
3
|
+
// OpenAI
|
|
4
|
+
"gpt-5.2": [2.5, 10],
|
|
5
|
+
"gpt-5.2-mini": [0.15, 0.6],
|
|
6
|
+
"gpt-4-turbo": [10, 30],
|
|
7
|
+
// Anthropic
|
|
8
|
+
"claude-sonnet-4-20250514": [3, 15],
|
|
9
|
+
"claude-3-haiku": [0.25, 1.25],
|
|
10
|
+
"claude-opus-4-20250514": [15, 75],
|
|
11
|
+
// Google
|
|
12
|
+
"gemini-2.5-flash-preview-05-20": [0.1, 0.4],
|
|
13
|
+
"gemini-1.5-pro": [1.25, 5],
|
|
14
|
+
// Groq
|
|
15
|
+
"llama-3.1-70b": [0.59, 0.79],
|
|
16
|
+
// Mistral
|
|
17
|
+
"mistral-large": [2, 6]
|
|
18
|
+
};
|
|
19
|
+
var DefaultCostTrackerAdapter = class {
|
|
20
|
+
usages = [];
|
|
21
|
+
budget;
|
|
22
|
+
onBudgetExceeded;
|
|
23
|
+
silent;
|
|
24
|
+
budgetExceededFired = false;
|
|
25
|
+
totalCost = 0;
|
|
26
|
+
/** Models seen that have no pricing data. */
|
|
27
|
+
unpricedModels = /* @__PURE__ */ new Set();
|
|
28
|
+
constructor(options = {}) {
|
|
29
|
+
this.budget = options.budget ?? null;
|
|
30
|
+
this.onBudgetExceeded = options.onBudgetExceeded;
|
|
31
|
+
this.silent = options.silent ?? false;
|
|
32
|
+
}
|
|
33
|
+
recordUsage(usage) {
|
|
34
|
+
const inputTokens = Number.isFinite(usage.inputTokens) && usage.inputTokens > 0 ? usage.inputTokens : 0;
|
|
35
|
+
const outputTokens = Number.isFinite(usage.outputTokens) && usage.outputTokens > 0 ? usage.outputTokens : 0;
|
|
36
|
+
const sanitized = { ...usage, inputTokens, outputTokens };
|
|
37
|
+
this.usages.push(sanitized);
|
|
38
|
+
if (!MODEL_PRICING[sanitized.model]) {
|
|
39
|
+
if (!this.unpricedModels.has(sanitized.model)) {
|
|
40
|
+
if (!this.silent) {
|
|
41
|
+
console.warn(`[CostTracker] Unknown model "${sanitized.model}" \u2014 cost will be recorded as $0`);
|
|
42
|
+
}
|
|
43
|
+
this.unpricedModels.add(sanitized.model);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
this.totalCost += this.calculateCost(sanitized.model, inputTokens, outputTokens);
|
|
47
|
+
if (this.onBudgetExceeded && !this.budgetExceededFired && this.isOverBudget()) {
|
|
48
|
+
this.budgetExceededFired = true;
|
|
49
|
+
this.onBudgetExceeded();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
getEstimate() {
|
|
53
|
+
const byModel = /* @__PURE__ */ new Map();
|
|
54
|
+
for (const u of this.usages) {
|
|
55
|
+
const existing = byModel.get(u.model) ?? { inputTokens: 0, outputTokens: 0 };
|
|
56
|
+
existing.inputTokens += u.inputTokens;
|
|
57
|
+
existing.outputTokens += u.outputTokens;
|
|
58
|
+
byModel.set(u.model, existing);
|
|
59
|
+
}
|
|
60
|
+
let totalInputTokens = 0;
|
|
61
|
+
let totalOutputTokens = 0;
|
|
62
|
+
const breakdown = [];
|
|
63
|
+
for (const [model, tokens] of byModel) {
|
|
64
|
+
const cost = this.calculateCost(model, tokens.inputTokens, tokens.outputTokens);
|
|
65
|
+
totalInputTokens += tokens.inputTokens;
|
|
66
|
+
totalOutputTokens += tokens.outputTokens;
|
|
67
|
+
breakdown.push({ model, inputTokens: tokens.inputTokens, outputTokens: tokens.outputTokens, cost });
|
|
68
|
+
}
|
|
69
|
+
const totalCost = breakdown.reduce((sum, b) => sum + b.cost, 0);
|
|
70
|
+
return { totalInputTokens, totalOutputTokens, totalCost, currency: "USD", breakdown };
|
|
71
|
+
}
|
|
72
|
+
getSessionBudget() {
|
|
73
|
+
return this.budget;
|
|
74
|
+
}
|
|
75
|
+
isOverBudget() {
|
|
76
|
+
if (this.budget === null) return false;
|
|
77
|
+
return this.totalCost > this.budget;
|
|
78
|
+
}
|
|
79
|
+
reset() {
|
|
80
|
+
this.usages.length = 0;
|
|
81
|
+
this.totalCost = 0;
|
|
82
|
+
this.unpricedModels.clear();
|
|
83
|
+
this.budgetExceededFired = false;
|
|
84
|
+
}
|
|
85
|
+
exportUsage() {
|
|
86
|
+
return JSON.stringify(this.usages);
|
|
87
|
+
}
|
|
88
|
+
calculateCost(model, inputTokens, outputTokens) {
|
|
89
|
+
const pricing = MODEL_PRICING[model];
|
|
90
|
+
if (!pricing) return 0;
|
|
91
|
+
const [inputPer1M, outputPer1M] = pricing;
|
|
92
|
+
return inputTokens / 1e6 * inputPer1M + outputTokens / 1e6 * outputPer1M;
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
export {
|
|
97
|
+
DefaultCostTrackerAdapter
|
|
98
|
+
};
|
|
99
|
+
//# sourceMappingURL=chunk-EFDM6R4J.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/adapters/cost-tracker/default-cost-tracker.adapter.ts"],"sourcesContent":["// =============================================================================\n// DefaultCostTrackerAdapter — In-memory cost tracking with model pricing\n// =============================================================================\n\nimport type { CostTrackerPort, CostTokenUsage, CostEstimate } from \"../../ports/cost-tracker.port.js\";\n\n// Pricing per 1M tokens: [input, output]\nconst MODEL_PRICING: Record<string, [number, number]> = {\n // OpenAI\n \"gpt-5.2\": [2.50, 10.00],\n \"gpt-5.2-mini\": [0.15, 0.60],\n \"gpt-4-turbo\": [10.00, 30.00],\n // Anthropic\n \"claude-sonnet-4-20250514\": [3.00, 15.00],\n \"claude-3-haiku\": [0.25, 1.25],\n \"claude-opus-4-20250514\": [15.00, 75.00],\n // Google\n \"gemini-2.5-flash-preview-05-20\": [0.10, 0.40],\n \"gemini-1.5-pro\": [1.25, 5.00],\n // Groq\n \"llama-3.1-70b\": [0.59, 0.79],\n // Mistral\n \"mistral-large\": [2.00, 6.00],\n};\n\nexport interface CostTrackerOptions {\n budget?: number;\n onBudgetExceeded?: () => void;\n /** When true, suppresses console.warn for unknown models (useful for replaying records). */\n silent?: boolean;\n}\n\nexport class DefaultCostTrackerAdapter implements CostTrackerPort {\n private readonly usages: CostTokenUsage[] = [];\n private readonly budget: number | null;\n private readonly onBudgetExceeded?: () => void;\n private readonly silent: boolean;\n private budgetExceededFired = false;\n private totalCost = 0;\n\n /** Models seen that have no pricing data. */\n readonly unpricedModels = new Set<string>();\n\n constructor(options: CostTrackerOptions = {}) {\n this.budget = options.budget ?? null;\n this.onBudgetExceeded = options.onBudgetExceeded;\n this.silent = options.silent ?? false;\n }\n\n recordUsage(usage: CostTokenUsage): void {\n // Validate: clamp non-finite / negative token counts to 0\n const inputTokens = Number.isFinite(usage.inputTokens) && usage.inputTokens > 0 ? usage.inputTokens : 0;\n const outputTokens = Number.isFinite(usage.outputTokens) && usage.outputTokens > 0 ? usage.outputTokens : 0;\n const sanitized: CostTokenUsage = { ...usage, inputTokens, outputTokens };\n\n this.usages.push(sanitized);\n\n // Warn and track unpriced models\n if (!MODEL_PRICING[sanitized.model]) {\n if (!this.unpricedModels.has(sanitized.model)) {\n if (!this.silent) {\n console.warn(`[CostTracker] Unknown model \"${sanitized.model}\" — cost will be recorded as $0`);\n }\n this.unpricedModels.add(sanitized.model);\n }\n }\n\n // Maintain running total for O(1) budget check\n this.totalCost += this.calculateCost(sanitized.model, inputTokens, outputTokens);\n\n if (this.onBudgetExceeded && !this.budgetExceededFired && this.isOverBudget()) {\n this.budgetExceededFired = true;\n this.onBudgetExceeded();\n }\n }\n\n getEstimate(): CostEstimate {\n const byModel = new Map<string, { inputTokens: number; outputTokens: number }>();\n\n for (const u of this.usages) {\n const existing = byModel.get(u.model) ?? { inputTokens: 0, outputTokens: 0 };\n existing.inputTokens += u.inputTokens;\n existing.outputTokens += u.outputTokens;\n byModel.set(u.model, existing);\n }\n\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n const breakdown: CostEstimate[\"breakdown\"] = [];\n\n for (const [model, tokens] of byModel) {\n const cost = this.calculateCost(model, tokens.inputTokens, tokens.outputTokens);\n totalInputTokens += tokens.inputTokens;\n totalOutputTokens += tokens.outputTokens;\n breakdown.push({ model, inputTokens: tokens.inputTokens, outputTokens: tokens.outputTokens, cost });\n }\n\n const totalCost = breakdown.reduce((sum, b) => sum + b.cost, 0);\n return { totalInputTokens, totalOutputTokens, totalCost, currency: \"USD\", breakdown };\n }\n\n getSessionBudget(): number | null {\n return this.budget;\n }\n\n isOverBudget(): boolean {\n if (this.budget === null) return false;\n return this.totalCost > this.budget;\n }\n\n reset(): void {\n this.usages.length = 0;\n this.totalCost = 0;\n this.unpricedModels.clear();\n this.budgetExceededFired = false;\n }\n\n exportUsage(): string {\n return JSON.stringify(this.usages);\n }\n\n private calculateCost(model: string, inputTokens: number, outputTokens: number): number {\n const pricing = MODEL_PRICING[model];\n if (!pricing) return 0;\n const [inputPer1M, outputPer1M] = pricing;\n return (inputTokens / 1_000_000) * inputPer1M + (outputTokens / 1_000_000) * outputPer1M;\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
// src/adapters/filesystem/glob-utils.ts
|
|
2
|
+
var regexCache = /* @__PURE__ */ new Map();
|
|
3
|
+
var MAX_CACHE_SIZE = 500;
|
|
4
|
+
function globToRegex(pattern) {
|
|
5
|
+
const cached = regexCache.get(pattern);
|
|
6
|
+
if (cached) return cached;
|
|
7
|
+
let result = "";
|
|
8
|
+
let i = 0;
|
|
9
|
+
while (i < pattern.length) {
|
|
10
|
+
const char = pattern[i];
|
|
11
|
+
if (char === "*" && pattern[i + 1] === "*") {
|
|
12
|
+
result += ".*";
|
|
13
|
+
i += pattern[i + 2] === "/" ? 3 : 2;
|
|
14
|
+
} else if (char === "*") {
|
|
15
|
+
result += "[^/]*";
|
|
16
|
+
i++;
|
|
17
|
+
} else if (char === "?") {
|
|
18
|
+
result += "[^/]";
|
|
19
|
+
i++;
|
|
20
|
+
} else if (".+^${}()|[]\\".includes(char)) {
|
|
21
|
+
result += "\\" + char;
|
|
22
|
+
i++;
|
|
23
|
+
} else {
|
|
24
|
+
result += char;
|
|
25
|
+
i++;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
const regex = new RegExp("^" + result + "$");
|
|
29
|
+
if (regexCache.size >= MAX_CACHE_SIZE) {
|
|
30
|
+
const oldest = regexCache.keys().next().value;
|
|
31
|
+
regexCache.delete(oldest);
|
|
32
|
+
}
|
|
33
|
+
regexCache.set(pattern, regex);
|
|
34
|
+
return regex;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// src/adapters/filesystem/virtual-fs.adapter.ts
|
|
38
|
+
var VirtualFilesystem = class {
|
|
39
|
+
zones = {
|
|
40
|
+
transient: /* @__PURE__ */ new Map(),
|
|
41
|
+
persistent: /* @__PURE__ */ new Map()
|
|
42
|
+
};
|
|
43
|
+
basePath;
|
|
44
|
+
onSync;
|
|
45
|
+
constructor(options = {}) {
|
|
46
|
+
this.basePath = options.basePath ?? "";
|
|
47
|
+
this.onSync = options.onSync;
|
|
48
|
+
}
|
|
49
|
+
async read(path, zone = "transient") {
|
|
50
|
+
const entry = this.zones[zone].get(normalizePath(path));
|
|
51
|
+
if (!entry || entry.isDirectory) {
|
|
52
|
+
throw new Error(`File not found: ${path}`);
|
|
53
|
+
}
|
|
54
|
+
return entry.content;
|
|
55
|
+
}
|
|
56
|
+
async write(path, content, zone = "transient") {
|
|
57
|
+
const normalized = normalizePath(path);
|
|
58
|
+
this.ensureParentDirs(normalized, zone);
|
|
59
|
+
const now = Date.now();
|
|
60
|
+
const existing = this.zones[zone].get(normalized);
|
|
61
|
+
this.zones[zone].set(normalized, {
|
|
62
|
+
content,
|
|
63
|
+
isDirectory: false,
|
|
64
|
+
createdAt: existing?.createdAt ?? now,
|
|
65
|
+
modifiedAt: now
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
async exists(path, zone = "transient") {
|
|
69
|
+
return this.zones[zone].has(normalizePath(path));
|
|
70
|
+
}
|
|
71
|
+
async delete(path, zone = "transient") {
|
|
72
|
+
const normalized = normalizePath(path);
|
|
73
|
+
const store = this.zones[zone];
|
|
74
|
+
const prefix = normalized.endsWith("/") ? normalized : normalized + "/";
|
|
75
|
+
for (const key of store.keys()) {
|
|
76
|
+
if (key === normalized || key.startsWith(prefix)) {
|
|
77
|
+
store.delete(key);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
async list(path, options = {}, zone = "transient") {
|
|
82
|
+
const normalized = normalizePath(path);
|
|
83
|
+
const prefix = normalized === "" ? "" : normalized + "/";
|
|
84
|
+
const maxDepth = options.maxDepth ?? (options.recursive ? Infinity : 1);
|
|
85
|
+
const results = [];
|
|
86
|
+
for (const [key, entry] of this.zones[zone]) {
|
|
87
|
+
if (!key.startsWith(prefix) || key === normalized) continue;
|
|
88
|
+
const relative = key.slice(prefix.length);
|
|
89
|
+
if (!options.includeHidden && relative.split("/").some((s) => s.startsWith("."))) continue;
|
|
90
|
+
const depth = relative.split("/").length;
|
|
91
|
+
if (depth > maxDepth) continue;
|
|
92
|
+
results.push({
|
|
93
|
+
name: relative.split("/").pop(),
|
|
94
|
+
path: key,
|
|
95
|
+
isDirectory: entry.isDirectory,
|
|
96
|
+
size: entry.content.length,
|
|
97
|
+
modifiedAt: entry.modifiedAt
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
return results;
|
|
101
|
+
}
|
|
102
|
+
async stat(path, zone = "transient") {
|
|
103
|
+
const entry = this.zones[zone].get(normalizePath(path));
|
|
104
|
+
if (!entry) throw new Error(`Not found: ${path}`);
|
|
105
|
+
return {
|
|
106
|
+
size: entry.content.length,
|
|
107
|
+
isDirectory: entry.isDirectory,
|
|
108
|
+
isFile: !entry.isDirectory,
|
|
109
|
+
createdAt: entry.createdAt,
|
|
110
|
+
modifiedAt: entry.modifiedAt
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
async glob(pattern, zone = "transient") {
|
|
114
|
+
const regex = globToRegex(pattern);
|
|
115
|
+
const results = [];
|
|
116
|
+
for (const [key, entry] of this.zones[zone]) {
|
|
117
|
+
if (!entry.isDirectory && regex.test(key)) {
|
|
118
|
+
results.push(key);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return results;
|
|
122
|
+
}
|
|
123
|
+
async search(pattern, options = {}, zone = "transient") {
|
|
124
|
+
const flags = options.caseSensitive === false ? "gi" : "g";
|
|
125
|
+
const regex = new RegExp(pattern, flags);
|
|
126
|
+
const fileRegex = options.filePattern ? globToRegex(options.filePattern) : null;
|
|
127
|
+
const results = [];
|
|
128
|
+
const max = options.maxResults ?? Infinity;
|
|
129
|
+
for (const [filePath, entry] of this.zones[zone]) {
|
|
130
|
+
if (entry.isDirectory) continue;
|
|
131
|
+
if (fileRegex && !fileRegex.test(filePath)) continue;
|
|
132
|
+
const lines = entry.content.split("\n");
|
|
133
|
+
for (let i = 0; i < lines.length && results.length < max; i++) {
|
|
134
|
+
regex.lastIndex = 0;
|
|
135
|
+
const match = regex.exec(lines[i]);
|
|
136
|
+
if (match) {
|
|
137
|
+
results.push({
|
|
138
|
+
filePath,
|
|
139
|
+
lineNumber: i + 1,
|
|
140
|
+
lineContent: lines[i],
|
|
141
|
+
matchStart: match.index,
|
|
142
|
+
matchEnd: match.index + match[0].length
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
if (results.length >= max) break;
|
|
147
|
+
}
|
|
148
|
+
return results;
|
|
149
|
+
}
|
|
150
|
+
async syncToPersistent() {
|
|
151
|
+
if (!this.onSync) {
|
|
152
|
+
throw new Error("syncToPersistent requires an onSync callback");
|
|
153
|
+
}
|
|
154
|
+
for (const [filePath, entry] of this.zones.persistent) {
|
|
155
|
+
if (entry.isDirectory) continue;
|
|
156
|
+
const fullPath = this.basePath ? this.basePath + "/" + filePath : filePath;
|
|
157
|
+
await this.onSync(fullPath, entry.content);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
async clearTransient() {
|
|
161
|
+
this.zones.transient.clear();
|
|
162
|
+
}
|
|
163
|
+
ensureParentDirs(filePath, zone) {
|
|
164
|
+
const parts = filePath.split("/");
|
|
165
|
+
const now = Date.now();
|
|
166
|
+
for (let i = 1; i < parts.length; i++) {
|
|
167
|
+
const dirPath = parts.slice(0, i).join("/");
|
|
168
|
+
if (dirPath && !this.zones[zone].has(dirPath)) {
|
|
169
|
+
this.zones[zone].set(dirPath, {
|
|
170
|
+
content: "",
|
|
171
|
+
isDirectory: true,
|
|
172
|
+
createdAt: now,
|
|
173
|
+
modifiedAt: now
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
function normalizePath(p) {
|
|
180
|
+
const segments = p.replace(/\/+/g, "/").split("/");
|
|
181
|
+
const resolved = [];
|
|
182
|
+
for (const seg of segments) {
|
|
183
|
+
if (seg === "." || seg === "") continue;
|
|
184
|
+
if (seg === "..") {
|
|
185
|
+
resolved.pop();
|
|
186
|
+
} else {
|
|
187
|
+
resolved.push(seg);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return resolved.join("/");
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// src/adapters/token-counter/approximate.adapter.ts
|
|
194
|
+
var CHARS_PER_TOKEN = 4;
|
|
195
|
+
var ROLE_OVERHEAD_TOKENS = 4;
|
|
196
|
+
var CONTEXT_WINDOW_SIZES = {
|
|
197
|
+
"gpt-5.2": 128e3,
|
|
198
|
+
"gpt-5.2-mini": 128e3,
|
|
199
|
+
"gpt-4-turbo": 128e3,
|
|
200
|
+
"gpt-4": 8192,
|
|
201
|
+
"gpt-3.5-turbo": 16385,
|
|
202
|
+
"claude-3.5-sonnet": 2e5,
|
|
203
|
+
"claude-3-sonnet": 2e5,
|
|
204
|
+
"claude-3-haiku": 2e5,
|
|
205
|
+
"claude-3-opus": 2e5,
|
|
206
|
+
"claude-4-sonnet": 2e5,
|
|
207
|
+
"gemini-2.5-flash-preview-05-20": 1e6,
|
|
208
|
+
"gemini-2.5-flash": 1e6,
|
|
209
|
+
"gemini-2.5-pro": 1e6,
|
|
210
|
+
"gemini-1.5-flash": 1e6,
|
|
211
|
+
"gemini-1.5-pro": 2e6
|
|
212
|
+
};
|
|
213
|
+
var DEFAULT_CONTEXT_WINDOW = 128e3;
|
|
214
|
+
var COST_TABLE = {
|
|
215
|
+
"gpt-5.2": [2.5, 10],
|
|
216
|
+
"gpt-5.2-mini": [0.15, 0.6],
|
|
217
|
+
"claude-3.5-sonnet": [3, 15],
|
|
218
|
+
"claude-3-haiku": [0.25, 1.25],
|
|
219
|
+
"gemini-2.5-flash-preview-05-20": [0.075, 0.3],
|
|
220
|
+
"gemini-2.5-flash": [0.15, 0.6],
|
|
221
|
+
"gemini-2.5-pro": [1.25, 10]
|
|
222
|
+
};
|
|
223
|
+
var DEFAULT_COST = [1, 3];
|
|
224
|
+
var ApproximateTokenCounter = class {
|
|
225
|
+
count(text) {
|
|
226
|
+
if (!text) return 0;
|
|
227
|
+
return Math.ceil(text.length / CHARS_PER_TOKEN);
|
|
228
|
+
}
|
|
229
|
+
countMessages(messages) {
|
|
230
|
+
if (!messages.length) return 0;
|
|
231
|
+
return messages.reduce(
|
|
232
|
+
(sum, msg) => sum + this.count(msg.content) + ROLE_OVERHEAD_TOKENS,
|
|
233
|
+
0
|
|
234
|
+
);
|
|
235
|
+
}
|
|
236
|
+
getContextWindowSize(model) {
|
|
237
|
+
return CONTEXT_WINDOW_SIZES[model] ?? DEFAULT_CONTEXT_WINDOW;
|
|
238
|
+
}
|
|
239
|
+
estimateCost(inputTokens, outputTokens, model) {
|
|
240
|
+
const [inputRate, outputRate] = COST_TABLE[model] ?? DEFAULT_COST;
|
|
241
|
+
return inputTokens / 1e6 * inputRate + outputTokens / 1e6 * outputRate;
|
|
242
|
+
}
|
|
243
|
+
truncate(text, maxTokens) {
|
|
244
|
+
if (!text) return text;
|
|
245
|
+
const maxChars = maxTokens * CHARS_PER_TOKEN;
|
|
246
|
+
if (text.length <= maxChars) return text;
|
|
247
|
+
return text.slice(0, maxChars);
|
|
248
|
+
}
|
|
249
|
+
};
|
|
250
|
+
|
|
251
|
+
export {
|
|
252
|
+
globToRegex,
|
|
253
|
+
VirtualFilesystem,
|
|
254
|
+
ApproximateTokenCounter
|
|
255
|
+
};
|
|
256
|
+
//# sourceMappingURL=chunk-F7WIPPEO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/adapters/filesystem/glob-utils.ts","../src/adapters/filesystem/virtual-fs.adapter.ts","../src/adapters/token-counter/approximate.adapter.ts"],"sourcesContent":["// =============================================================================\n// Glob pattern matching utility (no external deps)\n// =============================================================================\n\nconst regexCache = new Map<string, RegExp>();\nconst MAX_CACHE_SIZE = 500;\n\n/** Convert a glob pattern to a RegExp. Supports *, **, and ? wildcards. */\nexport function globToRegex(pattern: string): RegExp {\n const cached = regexCache.get(pattern);\n if (cached) return cached;\n\n let result = \"\";\n let i = 0;\n while (i < pattern.length) {\n const char = pattern[i]!;\n if (char === \"*\" && pattern[i + 1] === \"*\") {\n result += \".*\";\n i += pattern[i + 2] === \"/\" ? 3 : 2;\n } else if (char === \"*\") {\n result += \"[^/]*\";\n i++;\n } else if (char === \"?\") {\n result += \"[^/]\";\n i++;\n } else if (\".+^${}()|[]\\\\\".includes(char)) {\n result += \"\\\\\" + char;\n i++;\n } else {\n result += char;\n i++;\n }\n }\n const regex = new RegExp(\"^\" + result + \"$\");\n if (regexCache.size >= MAX_CACHE_SIZE) {\n const oldest = regexCache.keys().next().value as string;\n regexCache.delete(oldest);\n }\n regexCache.set(pattern, regex);\n return regex;\n}\n","// =============================================================================\n// VirtualFilesystem — In-memory filesystem with optional disk persistence\n// =============================================================================\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\ninterface StoredEntry {\n content: string;\n isDirectory: boolean;\n createdAt: number;\n modifiedAt: number;\n}\n\nexport type DiskSyncFn = (filePath: string, content: string) => Promise<void>;\n\ninterface VirtualFsOptions {\n basePath?: string;\n onSync?: DiskSyncFn;\n}\n\nexport class VirtualFilesystem implements FilesystemPort {\n private readonly zones: Record<FilesystemZone, Map<string, StoredEntry>> = {\n transient: new Map(),\n persistent: new Map(),\n };\n private readonly basePath: string;\n private readonly onSync?: DiskSyncFn;\n\n constructor(options: VirtualFsOptions = {}) {\n this.basePath = options.basePath ?? \"\";\n this.onSync = options.onSync;\n }\n\n async read(path: string, zone: FilesystemZone = \"transient\"): Promise<string> {\n const entry = this.zones[zone].get(normalizePath(path));\n if (!entry || entry.isDirectory) {\n throw new Error(`File not found: ${path}`);\n }\n return entry.content;\n }\n\n async write(path: string, content: string, zone: FilesystemZone = \"transient\"): Promise<void> {\n const normalized = normalizePath(path);\n this.ensureParentDirs(normalized, zone);\n const now = Date.now();\n const existing = this.zones[zone].get(normalized);\n this.zones[zone].set(normalized, {\n content,\n isDirectory: false,\n createdAt: existing?.createdAt ?? now,\n modifiedAt: now,\n });\n }\n\n async exists(path: string, zone: FilesystemZone = \"transient\"): Promise<boolean> {\n return this.zones[zone].has(normalizePath(path));\n }\n\n async delete(path: string, zone: FilesystemZone = \"transient\"): Promise<void> {\n const normalized = normalizePath(path);\n const store = this.zones[zone];\n const prefix = normalized.endsWith(\"/\") ? normalized : normalized + \"/\";\n for (const key of store.keys()) {\n if (key === normalized || key.startsWith(prefix)) {\n store.delete(key);\n }\n }\n }\n\n async list(\n path: string,\n options: ListOptions = {},\n zone: FilesystemZone = \"transient\",\n ): Promise<FileEntry[]> {\n const normalized = normalizePath(path);\n const prefix = normalized === \"\" ? \"\" : normalized + \"/\";\n const maxDepth = options.maxDepth ?? (options.recursive ? Infinity : 1);\n const results: FileEntry[] = [];\n\n for (const [key, entry] of this.zones[zone]) {\n if (!key.startsWith(prefix) || key === normalized) continue;\n const relative = key.slice(prefix.length);\n if (!options.includeHidden && relative.split(\"/\").some((s) => s.startsWith(\".\"))) continue;\n const depth = relative.split(\"/\").length;\n if (depth > maxDepth) continue;\n results.push({\n name: relative.split(\"/\").pop()!,\n path: key,\n isDirectory: entry.isDirectory,\n size: entry.content.length,\n modifiedAt: entry.modifiedAt,\n });\n }\n return results;\n }\n\n async stat(path: string, zone: FilesystemZone = \"transient\"): Promise<FileStat> {\n const entry = this.zones[zone].get(normalizePath(path));\n if (!entry) throw new Error(`Not found: ${path}`);\n return {\n size: entry.content.length,\n isDirectory: entry.isDirectory,\n isFile: !entry.isDirectory,\n createdAt: entry.createdAt,\n modifiedAt: entry.modifiedAt,\n };\n }\n\n async glob(pattern: string, zone: FilesystemZone = \"transient\"): Promise<string[]> {\n const regex = globToRegex(pattern);\n const results: string[] = [];\n for (const [key, entry] of this.zones[zone]) {\n if (!entry.isDirectory && regex.test(key)) {\n results.push(key);\n }\n }\n return results;\n }\n\n async search(\n pattern: string,\n options: SearchOptions = {},\n zone: FilesystemZone = \"transient\",\n ): Promise<SearchResult[]> {\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 results: SearchResult[] = [];\n const max = options.maxResults ?? Infinity;\n\n for (const [filePath, entry] of this.zones[zone]) {\n if (entry.isDirectory) continue;\n if (fileRegex && !fileRegex.test(filePath)) continue;\n const lines = entry.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,\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 async syncToPersistent(): Promise<void> {\n if (!this.onSync) {\n throw new Error(\"syncToPersistent requires an onSync callback\");\n }\n for (const [filePath, entry] of this.zones.persistent) {\n if (entry.isDirectory) continue;\n const fullPath = this.basePath ? this.basePath + \"/\" + filePath : filePath;\n await this.onSync(fullPath, entry.content);\n }\n }\n\n async clearTransient(): Promise<void> {\n this.zones.transient.clear();\n }\n\n private ensureParentDirs(filePath: string, zone: FilesystemZone): void {\n const parts = filePath.split(\"/\");\n const now = Date.now();\n for (let i = 1; i < parts.length; i++) {\n const dirPath = parts.slice(0, i).join(\"/\");\n if (dirPath && !this.zones[zone].has(dirPath)) {\n this.zones[zone].set(dirPath, {\n content: \"\",\n isDirectory: true,\n createdAt: now,\n modifiedAt: now,\n });\n }\n }\n }\n}\n\nfunction normalizePath(p: string): string {\n // Collapse consecutive slashes, then split into segments\n const segments = p.replace(/\\/+/g, \"/\").split(\"/\");\n const resolved: string[] = [];\n for (const seg of segments) {\n if (seg === \".\" || seg === \"\") continue;\n if (seg === \"..\") {\n resolved.pop();\n } else {\n resolved.push(seg);\n }\n }\n return resolved.join(\"/\");\n}\n","// =============================================================================\n// ApproximateTokenCounter — Char-based token estimation\n// =============================================================================\n\nimport type { Message } from \"../../types.js\";\nimport type { TokenCounterPort } from \"../../ports/token-counter.port.js\";\n\nconst CHARS_PER_TOKEN = 4;\nconst ROLE_OVERHEAD_TOKENS = 4;\n\nconst CONTEXT_WINDOW_SIZES: Record<string, number> = {\n \"gpt-5.2\": 128_000,\n \"gpt-5.2-mini\": 128_000,\n \"gpt-4-turbo\": 128_000,\n \"gpt-4\": 8_192,\n \"gpt-3.5-turbo\": 16_385,\n \"claude-3.5-sonnet\": 200_000,\n \"claude-3-sonnet\": 200_000,\n \"claude-3-haiku\": 200_000,\n \"claude-3-opus\": 200_000,\n \"claude-4-sonnet\": 200_000,\n \"gemini-2.5-flash-preview-05-20\": 1_000_000,\n \"gemini-2.5-flash\": 1_000_000,\n \"gemini-2.5-pro\": 1_000_000,\n \"gemini-1.5-flash\": 1_000_000,\n \"gemini-1.5-pro\": 2_000_000,\n};\n\nconst DEFAULT_CONTEXT_WINDOW = 128_000;\n\n// Cost per 1M tokens (USD): [input, output]\nconst COST_TABLE: Record<string, [number, number]> = {\n \"gpt-5.2\": [2.5, 10],\n \"gpt-5.2-mini\": [0.15, 0.6],\n \"claude-3.5-sonnet\": [3, 15],\n \"claude-3-haiku\": [0.25, 1.25],\n \"gemini-2.5-flash-preview-05-20\": [0.075, 0.3],\n \"gemini-2.5-flash\": [0.15, 0.6],\n \"gemini-2.5-pro\": [1.25, 10],\n};\n\nconst DEFAULT_COST: [number, number] = [1, 3];\n\nexport class ApproximateTokenCounter implements TokenCounterPort {\n count(text: string): number {\n if (!text) return 0;\n return Math.ceil(text.length / CHARS_PER_TOKEN);\n }\n\n countMessages(messages: Message[]): number {\n if (!messages.length) return 0;\n return messages.reduce(\n (sum, msg) => sum + this.count(msg.content) + ROLE_OVERHEAD_TOKENS,\n 0,\n );\n }\n\n getContextWindowSize(model: string): number {\n return CONTEXT_WINDOW_SIZES[model] ?? DEFAULT_CONTEXT_WINDOW;\n }\n\n estimateCost(\n inputTokens: number,\n outputTokens: number,\n model: string,\n ): number {\n const [inputRate, outputRate] = COST_TABLE[model] ?? DEFAULT_COST;\n return (\n (inputTokens / 1_000_000) * inputRate +\n (outputTokens / 1_000_000) * outputRate\n );\n }\n\n truncate(text: string, maxTokens: number): string {\n if (!text) return text;\n const maxChars = maxTokens * CHARS_PER_TOKEN;\n if (text.length <= maxChars) return text;\n return text.slice(0, maxChars);\n }\n}\n"],"mappings":";AAIA,IAAM,aAAa,oBAAI,IAAoB;AAC3C,IAAM,iBAAiB;AAGhB,SAAS,YAAY,SAAyB;AACnD,QAAM,SAAS,WAAW,IAAI,OAAO;AACrC,MAAI,OAAQ,QAAO;AAEnB,MAAI,SAAS;AACb,MAAI,IAAI;AACR,SAAO,IAAI,QAAQ,QAAQ;AACzB,UAAM,OAAO,QAAQ,CAAC;AACtB,QAAI,SAAS,OAAO,QAAQ,IAAI,CAAC,MAAM,KAAK;AAC1C,gBAAU;AACV,WAAK,QAAQ,IAAI,CAAC,MAAM,MAAM,IAAI;AAAA,IACpC,WAAW,SAAS,KAAK;AACvB,gBAAU;AACV;AAAA,IACF,WAAW,SAAS,KAAK;AACvB,gBAAU;AACV;AAAA,IACF,WAAW,gBAAgB,SAAS,IAAI,GAAG;AACzC,gBAAU,OAAO;AACjB;AAAA,IACF,OAAO;AACL,gBAAU;AACV;AAAA,IACF;AAAA,EACF;AACA,QAAM,QAAQ,IAAI,OAAO,MAAM,SAAS,GAAG;AAC3C,MAAI,WAAW,QAAQ,gBAAgB;AACrC,UAAM,SAAS,WAAW,KAAK,EAAE,KAAK,EAAE;AACxC,eAAW,OAAO,MAAM;AAAA,EAC1B;AACA,aAAW,IAAI,SAAS,KAAK;AAC7B,SAAO;AACT;;;ACXO,IAAM,oBAAN,MAAkD;AAAA,EACtC,QAA0D;AAAA,IACzE,WAAW,oBAAI,IAAI;AAAA,IACnB,YAAY,oBAAI,IAAI;AAAA,EACtB;AAAA,EACiB;AAAA,EACA;AAAA,EAEjB,YAAY,UAA4B,CAAC,GAAG;AAC1C,SAAK,WAAW,QAAQ,YAAY;AACpC,SAAK,SAAS,QAAQ;AAAA,EACxB;AAAA,EAEA,MAAM,KAAK,MAAc,OAAuB,aAA8B;AAC5E,UAAM,QAAQ,KAAK,MAAM,IAAI,EAAE,IAAI,cAAc,IAAI,CAAC;AACtD,QAAI,CAAC,SAAS,MAAM,aAAa;AAC/B,YAAM,IAAI,MAAM,mBAAmB,IAAI,EAAE;AAAA,IAC3C;AACA,WAAO,MAAM;AAAA,EACf;AAAA,EAEA,MAAM,MAAM,MAAc,SAAiB,OAAuB,aAA4B;AAC5F,UAAM,aAAa,cAAc,IAAI;AACrC,SAAK,iBAAiB,YAAY,IAAI;AACtC,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,WAAW,KAAK,MAAM,IAAI,EAAE,IAAI,UAAU;AAChD,SAAK,MAAM,IAAI,EAAE,IAAI,YAAY;AAAA,MAC/B;AAAA,MACA,aAAa;AAAA,MACb,WAAW,UAAU,aAAa;AAAA,MAClC,YAAY;AAAA,IACd,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,OAAO,MAAc,OAAuB,aAA+B;AAC/E,WAAO,KAAK,MAAM,IAAI,EAAE,IAAI,cAAc,IAAI,CAAC;AAAA,EACjD;AAAA,EAEA,MAAM,OAAO,MAAc,OAAuB,aAA4B;AAC5E,UAAM,aAAa,cAAc,IAAI;AACrC,UAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,UAAM,SAAS,WAAW,SAAS,GAAG,IAAI,aAAa,aAAa;AACpE,eAAW,OAAO,MAAM,KAAK,GAAG;AAC9B,UAAI,QAAQ,cAAc,IAAI,WAAW,MAAM,GAAG;AAChD,cAAM,OAAO,GAAG;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,KACJ,MACA,UAAuB,CAAC,GACxB,OAAuB,aACD;AACtB,UAAM,aAAa,cAAc,IAAI;AACrC,UAAM,SAAS,eAAe,KAAK,KAAK,aAAa;AACrD,UAAM,WAAW,QAAQ,aAAa,QAAQ,YAAY,WAAW;AACrE,UAAM,UAAuB,CAAC;AAE9B,eAAW,CAAC,KAAK,KAAK,KAAK,KAAK,MAAM,IAAI,GAAG;AAC3C,UAAI,CAAC,IAAI,WAAW,MAAM,KAAK,QAAQ,WAAY;AACnD,YAAM,WAAW,IAAI,MAAM,OAAO,MAAM;AACxC,UAAI,CAAC,QAAQ,iBAAiB,SAAS,MAAM,GAAG,EAAE,KAAK,CAAC,MAAM,EAAE,WAAW,GAAG,CAAC,EAAG;AAClF,YAAM,QAAQ,SAAS,MAAM,GAAG,EAAE;AAClC,UAAI,QAAQ,SAAU;AACtB,cAAQ,KAAK;AAAA,QACX,MAAM,SAAS,MAAM,GAAG,EAAE,IAAI;AAAA,QAC9B,MAAM;AAAA,QACN,aAAa,MAAM;AAAA,QACnB,MAAM,MAAM,QAAQ;AAAA,QACpB,YAAY,MAAM;AAAA,MACpB,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,KAAK,MAAc,OAAuB,aAAgC;AAC9E,UAAM,QAAQ,KAAK,MAAM,IAAI,EAAE,IAAI,cAAc,IAAI,CAAC;AACtD,QAAI,CAAC,MAAO,OAAM,IAAI,MAAM,cAAc,IAAI,EAAE;AAChD,WAAO;AAAA,MACL,MAAM,MAAM,QAAQ;AAAA,MACpB,aAAa,MAAM;AAAA,MACnB,QAAQ,CAAC,MAAM;AAAA,MACf,WAAW,MAAM;AAAA,MACjB,YAAY,MAAM;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,MAAM,KAAK,SAAiB,OAAuB,aAAgC;AACjF,UAAM,QAAQ,YAAY,OAAO;AACjC,UAAM,UAAoB,CAAC;AAC3B,eAAW,CAAC,KAAK,KAAK,KAAK,KAAK,MAAM,IAAI,GAAG;AAC3C,UAAI,CAAC,MAAM,eAAe,MAAM,KAAK,GAAG,GAAG;AACzC,gBAAQ,KAAK,GAAG;AAAA,MAClB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,OACJ,SACA,UAAyB,CAAC,GAC1B,OAAuB,aACE;AACzB,UAAM,QAAQ,QAAQ,kBAAkB,QAAQ,OAAO;AACvD,UAAM,QAAQ,IAAI,OAAO,SAAS,KAAK;AACvC,UAAM,YAAY,QAAQ,cAAc,YAAY,QAAQ,WAAW,IAAI;AAC3E,UAAM,UAA0B,CAAC;AACjC,UAAM,MAAM,QAAQ,cAAc;AAElC,eAAW,CAAC,UAAU,KAAK,KAAK,KAAK,MAAM,IAAI,GAAG;AAChD,UAAI,MAAM,YAAa;AACvB,UAAI,aAAa,CAAC,UAAU,KAAK,QAAQ,EAAG;AAC5C,YAAM,QAAQ,MAAM,QAAQ,MAAM,IAAI;AACtC,eAAS,IAAI,GAAG,IAAI,MAAM,UAAU,QAAQ,SAAS,KAAK,KAAK;AAC7D,cAAM,YAAY;AAClB,cAAM,QAAQ,MAAM,KAAK,MAAM,CAAC,CAAE;AAClC,YAAI,OAAO;AACT,kBAAQ,KAAK;AAAA,YACX;AAAA,YACA,YAAY,IAAI;AAAA,YAChB,aAAa,MAAM,CAAC;AAAA,YACpB,YAAY,MAAM;AAAA,YAClB,UAAU,MAAM,QAAQ,MAAM,CAAC,EAAE;AAAA,UACnC,CAAC;AAAA,QACH;AAAA,MACF;AACA,UAAI,QAAQ,UAAU,IAAK;AAAA,IAC7B;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,mBAAkC;AACtC,QAAI,CAAC,KAAK,QAAQ;AAChB,YAAM,IAAI,MAAM,8CAA8C;AAAA,IAChE;AACA,eAAW,CAAC,UAAU,KAAK,KAAK,KAAK,MAAM,YAAY;AACrD,UAAI,MAAM,YAAa;AACvB,YAAM,WAAW,KAAK,WAAW,KAAK,WAAW,MAAM,WAAW;AAClE,YAAM,KAAK,OAAO,UAAU,MAAM,OAAO;AAAA,IAC3C;AAAA,EACF;AAAA,EAEA,MAAM,iBAAgC;AACpC,SAAK,MAAM,UAAU,MAAM;AAAA,EAC7B;AAAA,EAEQ,iBAAiB,UAAkB,MAA4B;AACrE,UAAM,QAAQ,SAAS,MAAM,GAAG;AAChC,UAAM,MAAM,KAAK,IAAI;AACrB,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,YAAM,UAAU,MAAM,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG;AAC1C,UAAI,WAAW,CAAC,KAAK,MAAM,IAAI,EAAE,IAAI,OAAO,GAAG;AAC7C,aAAK,MAAM,IAAI,EAAE,IAAI,SAAS;AAAA,UAC5B,SAAS;AAAA,UACT,aAAa;AAAA,UACb,WAAW;AAAA,UACX,YAAY;AAAA,QACd,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,cAAc,GAAmB;AAExC,QAAM,WAAW,EAAE,QAAQ,QAAQ,GAAG,EAAE,MAAM,GAAG;AACjD,QAAM,WAAqB,CAAC;AAC5B,aAAW,OAAO,UAAU;AAC1B,QAAI,QAAQ,OAAO,QAAQ,GAAI;AAC/B,QAAI,QAAQ,MAAM;AAChB,eAAS,IAAI;AAAA,IACf,OAAO;AACL,eAAS,KAAK,GAAG;AAAA,IACnB;AAAA,EACF;AACA,SAAO,SAAS,KAAK,GAAG;AAC1B;;;ACvMA,IAAM,kBAAkB;AACxB,IAAM,uBAAuB;AAE7B,IAAM,uBAA+C;AAAA,EACnD,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,SAAS;AAAA,EACT,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,kCAAkC;AAAA,EAClC,oBAAoB;AAAA,EACpB,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,kBAAkB;AACpB;AAEA,IAAM,yBAAyB;AAG/B,IAAM,aAA+C;AAAA,EACnD,WAAW,CAAC,KAAK,EAAE;AAAA,EACnB,gBAAgB,CAAC,MAAM,GAAG;AAAA,EAC1B,qBAAqB,CAAC,GAAG,EAAE;AAAA,EAC3B,kBAAkB,CAAC,MAAM,IAAI;AAAA,EAC7B,kCAAkC,CAAC,OAAO,GAAG;AAAA,EAC7C,oBAAoB,CAAC,MAAM,GAAG;AAAA,EAC9B,kBAAkB,CAAC,MAAM,EAAE;AAC7B;AAEA,IAAM,eAAiC,CAAC,GAAG,CAAC;AAErC,IAAM,0BAAN,MAA0D;AAAA,EAC/D,MAAM,MAAsB;AAC1B,QAAI,CAAC,KAAM,QAAO;AAClB,WAAO,KAAK,KAAK,KAAK,SAAS,eAAe;AAAA,EAChD;AAAA,EAEA,cAAc,UAA6B;AACzC,QAAI,CAAC,SAAS,OAAQ,QAAO;AAC7B,WAAO,SAAS;AAAA,MACd,CAAC,KAAK,QAAQ,MAAM,KAAK,MAAM,IAAI,OAAO,IAAI;AAAA,MAC9C;AAAA,IACF;AAAA,EACF;AAAA,EAEA,qBAAqB,OAAuB;AAC1C,WAAO,qBAAqB,KAAK,KAAK;AAAA,EACxC;AAAA,EAEA,aACE,aACA,cACA,OACQ;AACR,UAAM,CAAC,WAAW,UAAU,IAAI,WAAW,KAAK,KAAK;AACrD,WACG,cAAc,MAAa,YAC3B,eAAe,MAAa;AAAA,EAEjC;AAAA,EAEA,SAAS,MAAc,WAA2B;AAChD,QAAI,CAAC,KAAM,QAAO;AAClB,UAAM,WAAW,YAAY;AAC7B,QAAI,KAAK,UAAU,SAAU,QAAO;AACpC,WAAO,KAAK,MAAM,GAAG,QAAQ;AAAA,EAC/B;AACF;","names":[]}
|