@predicatelabs/sdk 0.99.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +24 -0
- package/README.md +252 -0
- package/dist/actions.d.ts +185 -0
- package/dist/actions.d.ts.map +1 -0
- package/dist/actions.js +1120 -0
- package/dist/actions.js.map +1 -0
- package/dist/agent-runtime.d.ts +352 -0
- package/dist/agent-runtime.d.ts.map +1 -0
- package/dist/agent-runtime.js +1170 -0
- package/dist/agent-runtime.js.map +1 -0
- package/dist/agent.d.ts +164 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +408 -0
- package/dist/agent.js.map +1 -0
- package/dist/asserts/expect.d.ts +159 -0
- package/dist/asserts/expect.d.ts.map +1 -0
- package/dist/asserts/expect.js +547 -0
- package/dist/asserts/expect.js.map +1 -0
- package/dist/asserts/index.d.ts +58 -0
- package/dist/asserts/index.d.ts.map +1 -0
- package/dist/asserts/index.js +70 -0
- package/dist/asserts/index.js.map +1 -0
- package/dist/asserts/query.d.ts +199 -0
- package/dist/asserts/query.d.ts.map +1 -0
- package/dist/asserts/query.js +288 -0
- package/dist/asserts/query.js.map +1 -0
- package/dist/backends/actions.d.ts +119 -0
- package/dist/backends/actions.d.ts.map +1 -0
- package/dist/backends/actions.js +291 -0
- package/dist/backends/actions.js.map +1 -0
- package/dist/backends/browser-use-adapter.d.ts +131 -0
- package/dist/backends/browser-use-adapter.d.ts.map +1 -0
- package/dist/backends/browser-use-adapter.js +219 -0
- package/dist/backends/browser-use-adapter.js.map +1 -0
- package/dist/backends/cdp-backend.d.ts +66 -0
- package/dist/backends/cdp-backend.d.ts.map +1 -0
- package/dist/backends/cdp-backend.js +273 -0
- package/dist/backends/cdp-backend.js.map +1 -0
- package/dist/backends/index.d.ts +80 -0
- package/dist/backends/index.d.ts.map +1 -0
- package/dist/backends/index.js +101 -0
- package/dist/backends/index.js.map +1 -0
- package/dist/backends/protocol.d.ts +156 -0
- package/dist/backends/protocol.d.ts.map +1 -0
- package/dist/backends/protocol.js +16 -0
- package/dist/backends/protocol.js.map +1 -0
- package/dist/backends/sentience-context.d.ts +143 -0
- package/dist/backends/sentience-context.d.ts.map +1 -0
- package/dist/backends/sentience-context.js +359 -0
- package/dist/backends/sentience-context.js.map +1 -0
- package/dist/backends/snapshot.d.ts +188 -0
- package/dist/backends/snapshot.d.ts.map +1 -0
- package/dist/backends/snapshot.js +360 -0
- package/dist/backends/snapshot.js.map +1 -0
- package/dist/browser.d.ts +154 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +920 -0
- package/dist/browser.js.map +1 -0
- package/dist/canonicalization.d.ts +126 -0
- package/dist/canonicalization.d.ts.map +1 -0
- package/dist/canonicalization.js +161 -0
- package/dist/canonicalization.js.map +1 -0
- package/dist/captcha/strategies.d.ts +12 -0
- package/dist/captcha/strategies.d.ts.map +1 -0
- package/dist/captcha/strategies.js +43 -0
- package/dist/captcha/strategies.js.map +1 -0
- package/dist/captcha/types.d.ts +45 -0
- package/dist/captcha/types.d.ts.map +1 -0
- package/dist/captcha/types.js +12 -0
- package/dist/captcha/types.js.map +1 -0
- package/dist/cli.d.ts +5 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +422 -0
- package/dist/cli.js.map +1 -0
- package/dist/conversational-agent.d.ts +123 -0
- package/dist/conversational-agent.d.ts.map +1 -0
- package/dist/conversational-agent.js +341 -0
- package/dist/conversational-agent.js.map +1 -0
- package/dist/cursor-policy.d.ts +41 -0
- package/dist/cursor-policy.d.ts.map +1 -0
- package/dist/cursor-policy.js +81 -0
- package/dist/cursor-policy.js.map +1 -0
- package/dist/debugger.d.ts +28 -0
- package/dist/debugger.d.ts.map +1 -0
- package/dist/debugger.js +107 -0
- package/dist/debugger.js.map +1 -0
- package/dist/expect.d.ts +16 -0
- package/dist/expect.d.ts.map +1 -0
- package/dist/expect.js +67 -0
- package/dist/expect.js.map +1 -0
- package/dist/failure-artifacts.d.ts +95 -0
- package/dist/failure-artifacts.d.ts.map +1 -0
- package/dist/failure-artifacts.js +805 -0
- package/dist/failure-artifacts.js.map +1 -0
- package/dist/generator.d.ts +16 -0
- package/dist/generator.d.ts.map +1 -0
- package/dist/generator.js +205 -0
- package/dist/generator.js.map +1 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +160 -0
- package/dist/index.js.map +1 -0
- package/dist/inspector.d.ts +13 -0
- package/dist/inspector.d.ts.map +1 -0
- package/dist/inspector.js +153 -0
- package/dist/inspector.js.map +1 -0
- package/dist/llm-provider.d.ts +144 -0
- package/dist/llm-provider.d.ts.map +1 -0
- package/dist/llm-provider.js +460 -0
- package/dist/llm-provider.js.map +1 -0
- package/dist/ordinal.d.ts +90 -0
- package/dist/ordinal.d.ts.map +1 -0
- package/dist/ordinal.js +249 -0
- package/dist/ordinal.js.map +1 -0
- package/dist/overlay.d.ts +63 -0
- package/dist/overlay.d.ts.map +1 -0
- package/dist/overlay.js +102 -0
- package/dist/overlay.js.map +1 -0
- package/dist/protocols/browser-protocol.d.ts +79 -0
- package/dist/protocols/browser-protocol.d.ts.map +1 -0
- package/dist/protocols/browser-protocol.js +9 -0
- package/dist/protocols/browser-protocol.js.map +1 -0
- package/dist/query.d.ts +66 -0
- package/dist/query.d.ts.map +1 -0
- package/dist/query.js +482 -0
- package/dist/query.js.map +1 -0
- package/dist/read.d.ts +47 -0
- package/dist/read.d.ts.map +1 -0
- package/dist/read.js +128 -0
- package/dist/read.js.map +1 -0
- package/dist/recorder.d.ts +44 -0
- package/dist/recorder.d.ts.map +1 -0
- package/dist/recorder.js +262 -0
- package/dist/recorder.js.map +1 -0
- package/dist/runtime-agent.d.ts +72 -0
- package/dist/runtime-agent.d.ts.map +1 -0
- package/dist/runtime-agent.js +357 -0
- package/dist/runtime-agent.js.map +1 -0
- package/dist/screenshot.d.ts +17 -0
- package/dist/screenshot.d.ts.map +1 -0
- package/dist/screenshot.js +40 -0
- package/dist/screenshot.js.map +1 -0
- package/dist/snapshot-diff.d.ts +23 -0
- package/dist/snapshot-diff.d.ts.map +1 -0
- package/dist/snapshot-diff.js +119 -0
- package/dist/snapshot-diff.js.map +1 -0
- package/dist/snapshot.d.ts +47 -0
- package/dist/snapshot.d.ts.map +1 -0
- package/dist/snapshot.js +358 -0
- package/dist/snapshot.js.map +1 -0
- package/dist/textSearch.d.ts +64 -0
- package/dist/textSearch.d.ts.map +1 -0
- package/dist/textSearch.js +113 -0
- package/dist/textSearch.js.map +1 -0
- package/dist/tools/context.d.ts +18 -0
- package/dist/tools/context.d.ts.map +1 -0
- package/dist/tools/context.js +40 -0
- package/dist/tools/context.js.map +1 -0
- package/dist/tools/defaults.d.ts +5 -0
- package/dist/tools/defaults.d.ts.map +1 -0
- package/dist/tools/defaults.js +368 -0
- package/dist/tools/defaults.js.map +1 -0
- package/dist/tools/filesystem.d.ts +12 -0
- package/dist/tools/filesystem.d.ts.map +1 -0
- package/dist/tools/filesystem.js +137 -0
- package/dist/tools/filesystem.js.map +1 -0
- package/dist/tools/index.d.ts +5 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +15 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/registry.d.ts +38 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +100 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tracing/cloud-sink.d.ts +189 -0
- package/dist/tracing/cloud-sink.d.ts.map +1 -0
- package/dist/tracing/cloud-sink.js +1067 -0
- package/dist/tracing/cloud-sink.js.map +1 -0
- package/dist/tracing/index-schema.d.ts +231 -0
- package/dist/tracing/index-schema.d.ts.map +1 -0
- package/dist/tracing/index-schema.js +235 -0
- package/dist/tracing/index-schema.js.map +1 -0
- package/dist/tracing/index.d.ts +12 -0
- package/dist/tracing/index.d.ts.map +1 -0
- package/dist/tracing/index.js +28 -0
- package/dist/tracing/index.js.map +1 -0
- package/dist/tracing/indexer.d.ts +20 -0
- package/dist/tracing/indexer.d.ts.map +1 -0
- package/dist/tracing/indexer.js +347 -0
- package/dist/tracing/indexer.js.map +1 -0
- package/dist/tracing/jsonl-sink.d.ts +51 -0
- package/dist/tracing/jsonl-sink.d.ts.map +1 -0
- package/dist/tracing/jsonl-sink.js +329 -0
- package/dist/tracing/jsonl-sink.js.map +1 -0
- package/dist/tracing/sink.d.ts +25 -0
- package/dist/tracing/sink.d.ts.map +1 -0
- package/dist/tracing/sink.js +15 -0
- package/dist/tracing/sink.js.map +1 -0
- package/dist/tracing/tracer-factory.d.ts +102 -0
- package/dist/tracing/tracer-factory.d.ts.map +1 -0
- package/dist/tracing/tracer-factory.js +375 -0
- package/dist/tracing/tracer-factory.js.map +1 -0
- package/dist/tracing/tracer.d.ts +140 -0
- package/dist/tracing/tracer.d.ts.map +1 -0
- package/dist/tracing/tracer.js +336 -0
- package/dist/tracing/tracer.js.map +1 -0
- package/dist/tracing/types.d.ts +203 -0
- package/dist/tracing/types.d.ts.map +1 -0
- package/dist/tracing/types.js +8 -0
- package/dist/tracing/types.js.map +1 -0
- package/dist/types.d.ts +422 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/action-executor.d.ts +25 -0
- package/dist/utils/action-executor.d.ts.map +1 -0
- package/dist/utils/action-executor.js +121 -0
- package/dist/utils/action-executor.js.map +1 -0
- package/dist/utils/browser-evaluator.d.ts +76 -0
- package/dist/utils/browser-evaluator.d.ts.map +1 -0
- package/dist/utils/browser-evaluator.js +130 -0
- package/dist/utils/browser-evaluator.js.map +1 -0
- package/dist/utils/browser.d.ts +30 -0
- package/dist/utils/browser.d.ts.map +1 -0
- package/dist/utils/browser.js +75 -0
- package/dist/utils/browser.js.map +1 -0
- package/dist/utils/element-filter.d.ts +76 -0
- package/dist/utils/element-filter.d.ts.map +1 -0
- package/dist/utils/element-filter.js +195 -0
- package/dist/utils/element-filter.js.map +1 -0
- package/dist/utils/grid-utils.d.ts +37 -0
- package/dist/utils/grid-utils.d.ts.map +1 -0
- package/dist/utils/grid-utils.js +283 -0
- package/dist/utils/grid-utils.js.map +1 -0
- package/dist/utils/llm-interaction-handler.d.ts +41 -0
- package/dist/utils/llm-interaction-handler.d.ts.map +1 -0
- package/dist/utils/llm-interaction-handler.js +171 -0
- package/dist/utils/llm-interaction-handler.js.map +1 -0
- package/dist/utils/llm-response-builder.d.ts +56 -0
- package/dist/utils/llm-response-builder.d.ts.map +1 -0
- package/dist/utils/llm-response-builder.js +130 -0
- package/dist/utils/llm-response-builder.js.map +1 -0
- package/dist/utils/selector-utils.d.ts +12 -0
- package/dist/utils/selector-utils.d.ts.map +1 -0
- package/dist/utils/selector-utils.js +32 -0
- package/dist/utils/selector-utils.js.map +1 -0
- package/dist/utils/snapshot-event-builder.d.ts +28 -0
- package/dist/utils/snapshot-event-builder.d.ts.map +1 -0
- package/dist/utils/snapshot-event-builder.js +88 -0
- package/dist/utils/snapshot-event-builder.js.map +1 -0
- package/dist/utils/snapshot-processor.d.ts +27 -0
- package/dist/utils/snapshot-processor.d.ts.map +1 -0
- package/dist/utils/snapshot-processor.js +47 -0
- package/dist/utils/snapshot-processor.js.map +1 -0
- package/dist/utils/trace-event-builder.d.ts +122 -0
- package/dist/utils/trace-event-builder.d.ts.map +1 -0
- package/dist/utils/trace-event-builder.js +365 -0
- package/dist/utils/trace-event-builder.js.map +1 -0
- package/dist/utils/trace-file-manager.d.ts +70 -0
- package/dist/utils/trace-file-manager.d.ts.map +1 -0
- package/dist/utils/trace-file-manager.js +194 -0
- package/dist/utils/trace-file-manager.js.map +1 -0
- package/dist/utils/zod.d.ts +5 -0
- package/dist/utils/zod.d.ts.map +1 -0
- package/dist/utils/zod.js +80 -0
- package/dist/utils/zod.js.map +1 -0
- package/dist/utils.d.ts +8 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +13 -0
- package/dist/utils.js.map +1 -0
- package/dist/verification.d.ts +194 -0
- package/dist/verification.d.ts.map +1 -0
- package/dist/verification.js +530 -0
- package/dist/verification.js.map +1 -0
- package/dist/vision-executor.d.ts +18 -0
- package/dist/vision-executor.d.ts.map +1 -0
- package/dist/vision-executor.js +60 -0
- package/dist/vision-executor.js.map +1 -0
- package/dist/visual-agent.d.ts +120 -0
- package/dist/visual-agent.d.ts.map +1 -0
- package/dist/visual-agent.js +796 -0
- package/dist/visual-agent.js.map +1 -0
- package/dist/wait.d.ts +35 -0
- package/dist/wait.d.ts.map +1 -0
- package/dist/wait.js +76 -0
- package/dist/wait.js.map +1 -0
- package/package.json +94 -0
- package/spec/README.md +72 -0
- package/spec/SNAPSHOT_V1.md +208 -0
- package/spec/sdk-types.md +259 -0
- package/spec/snapshot.schema.json +148 -0
- package/src/extension/background.js +104 -0
- package/src/extension/content.js +162 -0
- package/src/extension/injected_api.js +1399 -0
- package/src/extension/manifest.json +36 -0
- package/src/extension/pkg/README.md +1340 -0
- package/src/extension/pkg/package.json +15 -0
- package/src/extension/pkg/sentience_core.d.ts +51 -0
- package/src/extension/pkg/sentience_core.js +371 -0
- package/src/extension/pkg/sentience_core_bg.wasm +0 -0
- package/src/extension/pkg/sentience_core_bg.wasm.d.ts +10 -0
- package/src/extension/release.json +116 -0
|
@@ -0,0 +1,460 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* LLM Provider Abstraction - BYOB (Bring Your Own Brain)
|
|
4
|
+
* Enables pluggable LLM support for SentienceAgent
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.GeminiProvider = exports.GLMProvider = exports.AnthropicProvider = exports.OpenAIProvider = exports.LocalVisionLLMProvider = exports.LocalLLMProvider = exports.LLMProvider = void 0;
|
|
8
|
+
/**
|
|
9
|
+
* Abstract base class for LLM providers
|
|
10
|
+
* Implement this to integrate any LLM (OpenAI, Anthropic, Local, etc.)
|
|
11
|
+
*/
|
|
12
|
+
class LLMProvider {
|
|
13
|
+
/**
|
|
14
|
+
* Whether this provider supports image input for vision tasks.
|
|
15
|
+
* Override in subclasses that support vision-capable models.
|
|
16
|
+
*/
|
|
17
|
+
supportsVision() {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Generate with image input (vision-capable models only).
|
|
22
|
+
* Override in subclasses that support vision.
|
|
23
|
+
*/
|
|
24
|
+
async generateWithImage(systemPrompt, userPrompt, imageBase64, options = {}) {
|
|
25
|
+
throw new Error(`${this.constructor.name} does not support vision. ` +
|
|
26
|
+
`Use a vision-capable provider (e.g., OpenAIProvider with GPT-4o, AnthropicProvider with Claude 3).`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
exports.LLMProvider = LLMProvider;
|
|
30
|
+
/**
|
|
31
|
+
* Local OpenAI-compatible Provider (Ollama / LM Studio / llama.cpp server, etc.)
|
|
32
|
+
*
|
|
33
|
+
* This is the TypeScript equivalent of Python's LocalLLMProvider concept, but instead of
|
|
34
|
+
* embedding a full HF runtime inside Node, it calls a local HTTP server that exposes an
|
|
35
|
+
* OpenAI-compatible Chat Completions API.
|
|
36
|
+
*
|
|
37
|
+
* Examples of compatible local servers:
|
|
38
|
+
* - Ollama (OpenAI-compatible endpoint)
|
|
39
|
+
* - LM Studio (OpenAI-compatible endpoint)
|
|
40
|
+
* - llama.cpp server (OpenAI-compatible endpoint)
|
|
41
|
+
*/
|
|
42
|
+
class LocalLLMProvider extends LLMProvider {
|
|
43
|
+
constructor(options = {}) {
|
|
44
|
+
super();
|
|
45
|
+
this._modelName = options.model ?? process.env.SENTIENCE_LOCAL_LLM_MODEL ?? 'local-model';
|
|
46
|
+
// Common defaults:
|
|
47
|
+
// - Ollama OpenAI-compatible: http://localhost:11434/v1
|
|
48
|
+
// - LM Studio: http://localhost:1234/v1
|
|
49
|
+
this._baseUrl =
|
|
50
|
+
options.baseUrl ?? process.env.SENTIENCE_LOCAL_LLM_BASE_URL ?? 'http://localhost:11434/v1';
|
|
51
|
+
this._apiKey = options.apiKey ?? process.env.SENTIENCE_LOCAL_LLM_API_KEY;
|
|
52
|
+
this._timeoutMs = options.timeoutMs ?? 60000;
|
|
53
|
+
this._defaultHeaders = {
|
|
54
|
+
'Content-Type': 'application/json',
|
|
55
|
+
...(options.headers ?? {}),
|
|
56
|
+
};
|
|
57
|
+
if (this._apiKey) {
|
|
58
|
+
this._defaultHeaders.Authorization = `Bearer ${this._apiKey}`;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
supportsJsonMode() {
|
|
62
|
+
// Many local OpenAI-compatible servers don't reliably implement response_format=json_object.
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
get modelName() {
|
|
66
|
+
return this._modelName;
|
|
67
|
+
}
|
|
68
|
+
async generate(systemPrompt, userPrompt, options = {}) {
|
|
69
|
+
const fetchFn = globalThis.fetch;
|
|
70
|
+
if (!fetchFn) {
|
|
71
|
+
throw new Error('Global fetch is not available. Use Node 18+ or polyfill fetch before using LocalLLMProvider.');
|
|
72
|
+
}
|
|
73
|
+
const controller = new AbortController();
|
|
74
|
+
const timeoutId = setTimeout(() => controller.abort(), options.timeoutMs ?? this._timeoutMs);
|
|
75
|
+
const payload = {
|
|
76
|
+
model: this._modelName,
|
|
77
|
+
messages: [
|
|
78
|
+
...(systemPrompt ? [{ role: 'system', content: systemPrompt }] : []),
|
|
79
|
+
{ role: 'user', content: userPrompt },
|
|
80
|
+
],
|
|
81
|
+
temperature: options.temperature ?? 0.0,
|
|
82
|
+
};
|
|
83
|
+
if (options.max_tokens !== undefined)
|
|
84
|
+
payload.max_tokens = options.max_tokens;
|
|
85
|
+
if (options.top_p !== undefined)
|
|
86
|
+
payload.top_p = options.top_p;
|
|
87
|
+
// Allow pass-through of server-specific fields, but avoid overriding core fields accidentally
|
|
88
|
+
const { timeoutMs: _ignoredTimeout, ...rest } = options;
|
|
89
|
+
Object.assign(payload, rest);
|
|
90
|
+
try {
|
|
91
|
+
const res = await fetchFn(`${this._baseUrl}/chat/completions`, {
|
|
92
|
+
method: 'POST',
|
|
93
|
+
headers: this._defaultHeaders,
|
|
94
|
+
body: JSON.stringify(payload),
|
|
95
|
+
signal: controller.signal,
|
|
96
|
+
});
|
|
97
|
+
const text = await res.text();
|
|
98
|
+
if (!res.ok) {
|
|
99
|
+
throw new Error(`Local LLM HTTP ${res.status}: ${text.slice(0, 500)}`);
|
|
100
|
+
}
|
|
101
|
+
const data = JSON.parse(text);
|
|
102
|
+
const choice = data?.choices?.[0];
|
|
103
|
+
const content = choice?.message?.content ?? '';
|
|
104
|
+
const usage = data?.usage;
|
|
105
|
+
return {
|
|
106
|
+
content,
|
|
107
|
+
promptTokens: usage?.prompt_tokens,
|
|
108
|
+
completionTokens: usage?.completion_tokens,
|
|
109
|
+
totalTokens: usage?.total_tokens,
|
|
110
|
+
modelName: data?.model ?? this._modelName,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
finally {
|
|
114
|
+
clearTimeout(timeoutId);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
exports.LocalLLMProvider = LocalLLMProvider;
|
|
119
|
+
/**
|
|
120
|
+
* Local OpenAI-compatible Vision Provider.
|
|
121
|
+
*
|
|
122
|
+
* This is the TypeScript analogue of Python's LocalVisionLLMProvider, but it assumes your
|
|
123
|
+
* local server supports the OpenAI vision message format (image_url with data: URI).
|
|
124
|
+
*
|
|
125
|
+
* If your local stack uses a different schema (e.g., Ollama images array), you can implement
|
|
126
|
+
* a custom provider by extending LLMProvider.
|
|
127
|
+
*/
|
|
128
|
+
class LocalVisionLLMProvider extends LocalLLMProvider {
|
|
129
|
+
supportsVision() {
|
|
130
|
+
return true;
|
|
131
|
+
}
|
|
132
|
+
async generateWithImage(systemPrompt, userPrompt, imageBase64, options = {}) {
|
|
133
|
+
const fetchFn = globalThis.fetch;
|
|
134
|
+
if (!fetchFn) {
|
|
135
|
+
throw new Error('Global fetch is not available. Use Node 18+ or polyfill fetch before using LocalVisionLLMProvider.');
|
|
136
|
+
}
|
|
137
|
+
const controller = new AbortController();
|
|
138
|
+
const timeoutId = setTimeout(() => controller.abort(), options.timeoutMs ?? this._timeoutMs ?? 60000);
|
|
139
|
+
// Rebuild payload (we cannot reuse LocalLLMProvider.generate because message shape differs)
|
|
140
|
+
const modelName = this._modelName ?? 'local-model';
|
|
141
|
+
const baseUrl = this._baseUrl ?? 'http://localhost:11434/v1';
|
|
142
|
+
const headers = this._defaultHeaders ?? { 'Content-Type': 'application/json' };
|
|
143
|
+
const payload = {
|
|
144
|
+
model: modelName,
|
|
145
|
+
messages: [
|
|
146
|
+
...(systemPrompt ? [{ role: 'system', content: systemPrompt }] : []),
|
|
147
|
+
{
|
|
148
|
+
role: 'user',
|
|
149
|
+
content: [
|
|
150
|
+
{ type: 'text', text: userPrompt },
|
|
151
|
+
{ type: 'image_url', image_url: { url: `data:image/png;base64,${imageBase64}` } },
|
|
152
|
+
],
|
|
153
|
+
},
|
|
154
|
+
],
|
|
155
|
+
temperature: options.temperature ?? 0.0,
|
|
156
|
+
};
|
|
157
|
+
if (options.max_tokens !== undefined)
|
|
158
|
+
payload.max_tokens = options.max_tokens;
|
|
159
|
+
const { timeoutMs: _ignoredTimeout, ...rest } = options;
|
|
160
|
+
Object.assign(payload, rest);
|
|
161
|
+
try {
|
|
162
|
+
const res = await fetchFn(`${baseUrl}/chat/completions`, {
|
|
163
|
+
method: 'POST',
|
|
164
|
+
headers,
|
|
165
|
+
body: JSON.stringify(payload),
|
|
166
|
+
signal: controller.signal,
|
|
167
|
+
});
|
|
168
|
+
const text = await res.text();
|
|
169
|
+
if (!res.ok) {
|
|
170
|
+
throw new Error(`Local Vision LLM HTTP ${res.status}: ${text.slice(0, 500)}`);
|
|
171
|
+
}
|
|
172
|
+
const data = JSON.parse(text);
|
|
173
|
+
const choice = data?.choices?.[0];
|
|
174
|
+
const content = choice?.message?.content ?? '';
|
|
175
|
+
const usage = data?.usage;
|
|
176
|
+
return {
|
|
177
|
+
content,
|
|
178
|
+
promptTokens: usage?.prompt_tokens,
|
|
179
|
+
completionTokens: usage?.completion_tokens,
|
|
180
|
+
totalTokens: usage?.total_tokens,
|
|
181
|
+
modelName: data?.model ?? modelName,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
finally {
|
|
185
|
+
clearTimeout(timeoutId);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
exports.LocalVisionLLMProvider = LocalVisionLLMProvider;
|
|
190
|
+
/**
|
|
191
|
+
* OpenAI Provider (GPT-4, GPT-4o, etc.)
|
|
192
|
+
* Requires: npm install openai
|
|
193
|
+
*/
|
|
194
|
+
class OpenAIProvider extends LLMProvider {
|
|
195
|
+
constructor(apiKey, model = 'gpt-4o') {
|
|
196
|
+
super();
|
|
197
|
+
// Lazy import to avoid requiring openai package if not used
|
|
198
|
+
try {
|
|
199
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
200
|
+
const { OpenAI } = require('openai');
|
|
201
|
+
this.client = new OpenAI({ apiKey });
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
throw new Error('OpenAI package not installed. Run: npm install openai');
|
|
205
|
+
}
|
|
206
|
+
this._modelName = model;
|
|
207
|
+
}
|
|
208
|
+
async generate(systemPrompt, userPrompt, options = {}) {
|
|
209
|
+
const response = await this.client.chat.completions.create({
|
|
210
|
+
model: this._modelName,
|
|
211
|
+
messages: [
|
|
212
|
+
{ role: 'system', content: systemPrompt },
|
|
213
|
+
{ role: 'user', content: userPrompt },
|
|
214
|
+
],
|
|
215
|
+
temperature: options.temperature ?? 0.0,
|
|
216
|
+
...options,
|
|
217
|
+
});
|
|
218
|
+
const choice = response.choices[0];
|
|
219
|
+
return {
|
|
220
|
+
content: choice.message.content || '',
|
|
221
|
+
promptTokens: response.usage?.prompt_tokens,
|
|
222
|
+
completionTokens: response.usage?.completion_tokens,
|
|
223
|
+
totalTokens: response.usage?.total_tokens,
|
|
224
|
+
modelName: this._modelName,
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
supportsJsonMode() {
|
|
228
|
+
return true;
|
|
229
|
+
}
|
|
230
|
+
supportsVision() {
|
|
231
|
+
return true;
|
|
232
|
+
}
|
|
233
|
+
async generateWithImage(systemPrompt, userPrompt, imageBase64, options = {}) {
|
|
234
|
+
const response = await this.client.chat.completions.create({
|
|
235
|
+
model: this._modelName,
|
|
236
|
+
messages: [
|
|
237
|
+
{ role: 'system', content: systemPrompt },
|
|
238
|
+
{
|
|
239
|
+
role: 'user',
|
|
240
|
+
content: [
|
|
241
|
+
{ type: 'text', text: userPrompt },
|
|
242
|
+
{ type: 'image_url', image_url: { url: `data:image/png;base64,${imageBase64}` } },
|
|
243
|
+
],
|
|
244
|
+
},
|
|
245
|
+
],
|
|
246
|
+
temperature: options.temperature ?? 0.0,
|
|
247
|
+
...options,
|
|
248
|
+
});
|
|
249
|
+
const choice = response.choices[0];
|
|
250
|
+
return {
|
|
251
|
+
content: choice.message.content || '',
|
|
252
|
+
promptTokens: response.usage?.prompt_tokens,
|
|
253
|
+
completionTokens: response.usage?.completion_tokens,
|
|
254
|
+
totalTokens: response.usage?.total_tokens,
|
|
255
|
+
modelName: this._modelName,
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
get modelName() {
|
|
259
|
+
return this._modelName;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
exports.OpenAIProvider = OpenAIProvider;
|
|
263
|
+
/**
|
|
264
|
+
* Anthropic Provider (Claude 3.5 Sonnet, etc.)
|
|
265
|
+
* Requires: npm install @anthropic-ai/sdk
|
|
266
|
+
*/
|
|
267
|
+
class AnthropicProvider extends LLMProvider {
|
|
268
|
+
constructor(apiKey, model = 'claude-3-5-sonnet-20241022') {
|
|
269
|
+
super();
|
|
270
|
+
try {
|
|
271
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
272
|
+
const { Anthropic } = require('@anthropic-ai/sdk');
|
|
273
|
+
this.client = new Anthropic({ apiKey });
|
|
274
|
+
}
|
|
275
|
+
catch {
|
|
276
|
+
throw new Error('Anthropic SDK not installed. Run: npm install @anthropic-ai/sdk');
|
|
277
|
+
}
|
|
278
|
+
this._modelName = model;
|
|
279
|
+
}
|
|
280
|
+
async generate(systemPrompt, userPrompt, options = {}) {
|
|
281
|
+
const response = await this.client.messages.create({
|
|
282
|
+
model: this._modelName,
|
|
283
|
+
max_tokens: options.max_tokens ?? 1024,
|
|
284
|
+
system: systemPrompt,
|
|
285
|
+
messages: [{ role: 'user', content: userPrompt }],
|
|
286
|
+
temperature: options.temperature ?? 0.0,
|
|
287
|
+
...options,
|
|
288
|
+
});
|
|
289
|
+
const content = response.content[0].text;
|
|
290
|
+
return {
|
|
291
|
+
content,
|
|
292
|
+
promptTokens: response.usage?.input_tokens,
|
|
293
|
+
completionTokens: response.usage?.output_tokens,
|
|
294
|
+
totalTokens: (response.usage?.input_tokens || 0) + (response.usage?.output_tokens || 0),
|
|
295
|
+
modelName: this._modelName,
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
supportsJsonMode() {
|
|
299
|
+
// Claude supports structured output but not via "json_mode" flag
|
|
300
|
+
return false;
|
|
301
|
+
}
|
|
302
|
+
supportsVision() {
|
|
303
|
+
return true;
|
|
304
|
+
}
|
|
305
|
+
async generateWithImage(systemPrompt, userPrompt, imageBase64, options = {}) {
|
|
306
|
+
const response = await this.client.messages.create({
|
|
307
|
+
model: this._modelName,
|
|
308
|
+
max_tokens: options.max_tokens ?? 1024,
|
|
309
|
+
system: systemPrompt,
|
|
310
|
+
messages: [
|
|
311
|
+
{
|
|
312
|
+
role: 'user',
|
|
313
|
+
content: [
|
|
314
|
+
{ type: 'text', text: userPrompt },
|
|
315
|
+
{
|
|
316
|
+
type: 'image',
|
|
317
|
+
source: {
|
|
318
|
+
type: 'base64',
|
|
319
|
+
media_type: options.media_type ?? 'image/png',
|
|
320
|
+
data: imageBase64,
|
|
321
|
+
},
|
|
322
|
+
},
|
|
323
|
+
],
|
|
324
|
+
},
|
|
325
|
+
],
|
|
326
|
+
temperature: options.temperature ?? 0.0,
|
|
327
|
+
...options,
|
|
328
|
+
});
|
|
329
|
+
const content = response.content[0].text;
|
|
330
|
+
return {
|
|
331
|
+
content,
|
|
332
|
+
promptTokens: response.usage?.input_tokens,
|
|
333
|
+
completionTokens: response.usage?.output_tokens,
|
|
334
|
+
totalTokens: (response.usage?.input_tokens || 0) + (response.usage?.output_tokens || 0),
|
|
335
|
+
modelName: this._modelName,
|
|
336
|
+
};
|
|
337
|
+
}
|
|
338
|
+
get modelName() {
|
|
339
|
+
return this._modelName;
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
exports.AnthropicProvider = AnthropicProvider;
|
|
343
|
+
/**
|
|
344
|
+
* Zhipu AI GLM Provider (GLM-4, GLM-4-Plus, etc.)
|
|
345
|
+
*
|
|
346
|
+
* Requirements:
|
|
347
|
+
* npm install zhipuai-sdk-nodejs-v4
|
|
348
|
+
*/
|
|
349
|
+
class GLMProvider extends LLMProvider {
|
|
350
|
+
constructor(apiKey, model = 'glm-4-plus') {
|
|
351
|
+
super();
|
|
352
|
+
try {
|
|
353
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
354
|
+
const ZhipuAI = require('zhipuai-sdk-nodejs-v4');
|
|
355
|
+
this.client = new ZhipuAI({ apiKey });
|
|
356
|
+
}
|
|
357
|
+
catch {
|
|
358
|
+
throw new Error('ZhipuAI SDK not installed. Run: npm install zhipuai-sdk-nodejs-v4');
|
|
359
|
+
}
|
|
360
|
+
this._modelName = model;
|
|
361
|
+
}
|
|
362
|
+
async generate(systemPrompt, userPrompt, options = {}) {
|
|
363
|
+
const messages = [];
|
|
364
|
+
if (systemPrompt) {
|
|
365
|
+
messages.push({ role: 'system', content: systemPrompt });
|
|
366
|
+
}
|
|
367
|
+
messages.push({ role: 'user', content: userPrompt });
|
|
368
|
+
const response = await this.client.chat.completions.create({
|
|
369
|
+
model: this._modelName,
|
|
370
|
+
messages,
|
|
371
|
+
temperature: options.temperature ?? 0.0,
|
|
372
|
+
max_tokens: options.max_tokens,
|
|
373
|
+
...options,
|
|
374
|
+
});
|
|
375
|
+
const choice = response.choices[0];
|
|
376
|
+
const usage = response.usage;
|
|
377
|
+
return {
|
|
378
|
+
content: choice.message?.content || '',
|
|
379
|
+
promptTokens: usage?.prompt_tokens,
|
|
380
|
+
completionTokens: usage?.completion_tokens,
|
|
381
|
+
totalTokens: usage?.total_tokens,
|
|
382
|
+
modelName: this._modelName,
|
|
383
|
+
};
|
|
384
|
+
}
|
|
385
|
+
supportsJsonMode() {
|
|
386
|
+
// GLM-4 models support JSON mode
|
|
387
|
+
return this._modelName.toLowerCase().includes('glm-4');
|
|
388
|
+
}
|
|
389
|
+
get modelName() {
|
|
390
|
+
return this._modelName;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
exports.GLMProvider = GLMProvider;
|
|
394
|
+
/**
|
|
395
|
+
* Google Gemini Provider (Gemini 2.0, Gemini 1.5 Pro, etc.)
|
|
396
|
+
*
|
|
397
|
+
* Requirements:
|
|
398
|
+
* npm install @google/generative-ai
|
|
399
|
+
*/
|
|
400
|
+
class GeminiProvider extends LLMProvider {
|
|
401
|
+
constructor(apiKey, model = 'gemini-2.0-flash-exp') {
|
|
402
|
+
super();
|
|
403
|
+
try {
|
|
404
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
405
|
+
const { GoogleGenerativeAI } = require('@google/generative-ai');
|
|
406
|
+
const genAI = new GoogleGenerativeAI(apiKey);
|
|
407
|
+
this.model = genAI.getGenerativeModel({ model });
|
|
408
|
+
}
|
|
409
|
+
catch {
|
|
410
|
+
throw new Error('Google Generative AI SDK not installed. Run: npm install @google/generative-ai');
|
|
411
|
+
}
|
|
412
|
+
this._modelName = model;
|
|
413
|
+
}
|
|
414
|
+
async generate(systemPrompt, userPrompt, options = {}) {
|
|
415
|
+
// Combine system and user prompts (Gemini doesn't have separate system role in all versions)
|
|
416
|
+
const fullPrompt = systemPrompt ? `${systemPrompt}\n\n${userPrompt}` : userPrompt;
|
|
417
|
+
// Build generation config
|
|
418
|
+
const generationConfig = {
|
|
419
|
+
temperature: options.temperature ?? 0.0,
|
|
420
|
+
};
|
|
421
|
+
if (options.max_tokens) {
|
|
422
|
+
generationConfig.maxOutputTokens = options.max_tokens;
|
|
423
|
+
}
|
|
424
|
+
// Merge additional parameters
|
|
425
|
+
Object.assign(generationConfig, options);
|
|
426
|
+
// Call Gemini API
|
|
427
|
+
const result = await this.model.generateContent({
|
|
428
|
+
contents: [{ role: 'user', parts: [{ text: fullPrompt }] }],
|
|
429
|
+
generationConfig,
|
|
430
|
+
});
|
|
431
|
+
const response = result.response;
|
|
432
|
+
const content = response.text() || '';
|
|
433
|
+
// Extract token usage if available
|
|
434
|
+
let promptTokens;
|
|
435
|
+
let completionTokens;
|
|
436
|
+
let totalTokens;
|
|
437
|
+
if (response.usageMetadata) {
|
|
438
|
+
promptTokens = response.usageMetadata.promptTokenCount;
|
|
439
|
+
completionTokens = response.usageMetadata.candidatesTokenCount;
|
|
440
|
+
totalTokens = response.usageMetadata.totalTokenCount;
|
|
441
|
+
}
|
|
442
|
+
return {
|
|
443
|
+
content,
|
|
444
|
+
promptTokens,
|
|
445
|
+
completionTokens,
|
|
446
|
+
totalTokens,
|
|
447
|
+
modelName: this._modelName,
|
|
448
|
+
};
|
|
449
|
+
}
|
|
450
|
+
supportsJsonMode() {
|
|
451
|
+
// Gemini 1.5+ models support JSON mode via response_mime_type
|
|
452
|
+
const modelLower = this._modelName.toLowerCase();
|
|
453
|
+
return modelLower.includes('gemini-1.5') || modelLower.includes('gemini-2.0');
|
|
454
|
+
}
|
|
455
|
+
get modelName() {
|
|
456
|
+
return this._modelName;
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
exports.GeminiProvider = GeminiProvider;
|
|
460
|
+
//# sourceMappingURL=llm-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-provider.js","sourceRoot":"","sources":["../src/llm-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase 3: Ordinal Intent Detection for Semantic Search
|
|
3
|
+
*
|
|
4
|
+
* This module provides functions to detect ordinal intent in natural language goals
|
|
5
|
+
* and select elements based on their position within groups.
|
|
6
|
+
*
|
|
7
|
+
* Ordinal operators supported:
|
|
8
|
+
* - Position-based: "first", "second", "third", "1st", "2nd", "3rd", etc.
|
|
9
|
+
* - Relative: "top", "bottom", "last", "next", "previous"
|
|
10
|
+
* - Numeric: "#1", "#2", "number 1", "item 3"
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* import { detectOrdinalIntent, selectByOrdinal } from 'sentience';
|
|
15
|
+
*
|
|
16
|
+
* const intent = detectOrdinalIntent("click the first search result");
|
|
17
|
+
* // { detected: true, kind: 'nth', n: 1 }
|
|
18
|
+
*
|
|
19
|
+
* const element = selectByOrdinal(elements, "x5-w2-h1", intent);
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
import { Element } from './types';
|
|
23
|
+
export type OrdinalKind = 'first' | 'last' | 'nth' | 'top_k' | 'next' | 'previous';
|
|
24
|
+
export interface OrdinalIntent {
|
|
25
|
+
/** Whether ordinal intent was detected */
|
|
26
|
+
detected: boolean;
|
|
27
|
+
/** Type of ordinal intent */
|
|
28
|
+
kind?: OrdinalKind;
|
|
29
|
+
/** For "nth" kind: 1-indexed position (1=first, 2=second) */
|
|
30
|
+
n?: number;
|
|
31
|
+
/** For "top_k" kind: number of items */
|
|
32
|
+
k?: number;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Detect ordinal intent from a goal string.
|
|
36
|
+
*
|
|
37
|
+
* @param goal - Natural language goal (e.g., "click the first search result")
|
|
38
|
+
* @returns OrdinalIntent with detected=true if ordinal intent found
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```typescript
|
|
42
|
+
* detectOrdinalIntent("click the first item")
|
|
43
|
+
* // { detected: true, kind: 'nth', n: 1 }
|
|
44
|
+
*
|
|
45
|
+
* detectOrdinalIntent("select the 3rd option")
|
|
46
|
+
* // { detected: true, kind: 'nth', n: 3 }
|
|
47
|
+
*
|
|
48
|
+
* detectOrdinalIntent("show top 5 results")
|
|
49
|
+
* // { detected: true, kind: 'top_k', k: 5 }
|
|
50
|
+
*
|
|
51
|
+
* detectOrdinalIntent("find the submit button")
|
|
52
|
+
* // { detected: false }
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
export declare function detectOrdinalIntent(goal: string): OrdinalIntent;
|
|
56
|
+
/**
|
|
57
|
+
* Select element(s) from a list based on ordinal intent.
|
|
58
|
+
*
|
|
59
|
+
* Uses the dominantGroupKey to filter to the "main content" group,
|
|
60
|
+
* then selects by group_index based on the ordinal intent.
|
|
61
|
+
*
|
|
62
|
+
* @param elements - List of elements with group_key and group_index populated
|
|
63
|
+
* @param dominantGroupKey - The most common group key (main content group)
|
|
64
|
+
* @param intent - Detected ordinal intent
|
|
65
|
+
* @param currentElementId - Current element ID (for next/previous navigation)
|
|
66
|
+
* @returns Single Element for nth/first/last, array of Elements for top_k, or null
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* ```typescript
|
|
70
|
+
* const intent = { detected: true, kind: 'nth', n: 1 };
|
|
71
|
+
* const element = selectByOrdinal(elements, "x5-w2-h1", intent);
|
|
72
|
+
* // Returns element with group_key="x5-w2-h1" and group_index=0
|
|
73
|
+
* ```
|
|
74
|
+
*/
|
|
75
|
+
export declare function selectByOrdinal(elements: Element[], dominantGroupKey: string | null | undefined, intent: OrdinalIntent, currentElementId?: number): Element | Element[] | null;
|
|
76
|
+
/**
|
|
77
|
+
* Boost the importance of elements matching ordinal intent.
|
|
78
|
+
*
|
|
79
|
+
* This is useful for integrating ordinal selection with existing
|
|
80
|
+
* importance-based ranking. Elements matching the ordinal intent
|
|
81
|
+
* get a significant importance boost.
|
|
82
|
+
*
|
|
83
|
+
* @param elements - List of elements (not modified)
|
|
84
|
+
* @param dominantGroupKey - The most common group key
|
|
85
|
+
* @param intent - Detected ordinal intent
|
|
86
|
+
* @param boostFactor - Amount to add to importance (default: 10000)
|
|
87
|
+
* @returns A new array with copies of elements, with boosted importance for matches
|
|
88
|
+
*/
|
|
89
|
+
export declare function boostOrdinalElements(elements: Element[], dominantGroupKey: string | null | undefined, intent: OrdinalIntent, boostFactor?: number): Element[];
|
|
90
|
+
//# sourceMappingURL=ordinal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ordinal.d.ts","sourceRoot":"","sources":["../src/ordinal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,CAAC;AAEnF,MAAM,WAAW,aAAa;IAC5B,0CAA0C;IAC1C,QAAQ,EAAE,OAAO,CAAC;IAClB,6BAA6B;IAC7B,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,6DAA6D;IAC7D,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,wCAAwC;IACxC,CAAC,CAAC,EAAE,MAAM,CAAC;CACZ;AAwDD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAqD/D;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,OAAO,EAAE,EACnB,gBAAgB,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC3C,MAAM,EAAE,aAAa,EACrB,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,GAAG,OAAO,EAAE,GAAG,IAAI,CAmE5B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,OAAO,EAAE,EACnB,gBAAgB,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC3C,MAAM,EAAE,aAAa,EACrB,WAAW,GAAE,MAAc,GAC1B,OAAO,EAAE,CAsBX"}
|