@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.
Files changed (302) hide show
  1. package/LICENSE +24 -0
  2. package/README.md +252 -0
  3. package/dist/actions.d.ts +185 -0
  4. package/dist/actions.d.ts.map +1 -0
  5. package/dist/actions.js +1120 -0
  6. package/dist/actions.js.map +1 -0
  7. package/dist/agent-runtime.d.ts +352 -0
  8. package/dist/agent-runtime.d.ts.map +1 -0
  9. package/dist/agent-runtime.js +1170 -0
  10. package/dist/agent-runtime.js.map +1 -0
  11. package/dist/agent.d.ts +164 -0
  12. package/dist/agent.d.ts.map +1 -0
  13. package/dist/agent.js +408 -0
  14. package/dist/agent.js.map +1 -0
  15. package/dist/asserts/expect.d.ts +159 -0
  16. package/dist/asserts/expect.d.ts.map +1 -0
  17. package/dist/asserts/expect.js +547 -0
  18. package/dist/asserts/expect.js.map +1 -0
  19. package/dist/asserts/index.d.ts +58 -0
  20. package/dist/asserts/index.d.ts.map +1 -0
  21. package/dist/asserts/index.js +70 -0
  22. package/dist/asserts/index.js.map +1 -0
  23. package/dist/asserts/query.d.ts +199 -0
  24. package/dist/asserts/query.d.ts.map +1 -0
  25. package/dist/asserts/query.js +288 -0
  26. package/dist/asserts/query.js.map +1 -0
  27. package/dist/backends/actions.d.ts +119 -0
  28. package/dist/backends/actions.d.ts.map +1 -0
  29. package/dist/backends/actions.js +291 -0
  30. package/dist/backends/actions.js.map +1 -0
  31. package/dist/backends/browser-use-adapter.d.ts +131 -0
  32. package/dist/backends/browser-use-adapter.d.ts.map +1 -0
  33. package/dist/backends/browser-use-adapter.js +219 -0
  34. package/dist/backends/browser-use-adapter.js.map +1 -0
  35. package/dist/backends/cdp-backend.d.ts +66 -0
  36. package/dist/backends/cdp-backend.d.ts.map +1 -0
  37. package/dist/backends/cdp-backend.js +273 -0
  38. package/dist/backends/cdp-backend.js.map +1 -0
  39. package/dist/backends/index.d.ts +80 -0
  40. package/dist/backends/index.d.ts.map +1 -0
  41. package/dist/backends/index.js +101 -0
  42. package/dist/backends/index.js.map +1 -0
  43. package/dist/backends/protocol.d.ts +156 -0
  44. package/dist/backends/protocol.d.ts.map +1 -0
  45. package/dist/backends/protocol.js +16 -0
  46. package/dist/backends/protocol.js.map +1 -0
  47. package/dist/backends/sentience-context.d.ts +143 -0
  48. package/dist/backends/sentience-context.d.ts.map +1 -0
  49. package/dist/backends/sentience-context.js +359 -0
  50. package/dist/backends/sentience-context.js.map +1 -0
  51. package/dist/backends/snapshot.d.ts +188 -0
  52. package/dist/backends/snapshot.d.ts.map +1 -0
  53. package/dist/backends/snapshot.js +360 -0
  54. package/dist/backends/snapshot.js.map +1 -0
  55. package/dist/browser.d.ts +154 -0
  56. package/dist/browser.d.ts.map +1 -0
  57. package/dist/browser.js +920 -0
  58. package/dist/browser.js.map +1 -0
  59. package/dist/canonicalization.d.ts +126 -0
  60. package/dist/canonicalization.d.ts.map +1 -0
  61. package/dist/canonicalization.js +161 -0
  62. package/dist/canonicalization.js.map +1 -0
  63. package/dist/captcha/strategies.d.ts +12 -0
  64. package/dist/captcha/strategies.d.ts.map +1 -0
  65. package/dist/captcha/strategies.js +43 -0
  66. package/dist/captcha/strategies.js.map +1 -0
  67. package/dist/captcha/types.d.ts +45 -0
  68. package/dist/captcha/types.d.ts.map +1 -0
  69. package/dist/captcha/types.js +12 -0
  70. package/dist/captcha/types.js.map +1 -0
  71. package/dist/cli.d.ts +5 -0
  72. package/dist/cli.d.ts.map +1 -0
  73. package/dist/cli.js +422 -0
  74. package/dist/cli.js.map +1 -0
  75. package/dist/conversational-agent.d.ts +123 -0
  76. package/dist/conversational-agent.d.ts.map +1 -0
  77. package/dist/conversational-agent.js +341 -0
  78. package/dist/conversational-agent.js.map +1 -0
  79. package/dist/cursor-policy.d.ts +41 -0
  80. package/dist/cursor-policy.d.ts.map +1 -0
  81. package/dist/cursor-policy.js +81 -0
  82. package/dist/cursor-policy.js.map +1 -0
  83. package/dist/debugger.d.ts +28 -0
  84. package/dist/debugger.d.ts.map +1 -0
  85. package/dist/debugger.js +107 -0
  86. package/dist/debugger.js.map +1 -0
  87. package/dist/expect.d.ts +16 -0
  88. package/dist/expect.d.ts.map +1 -0
  89. package/dist/expect.js +67 -0
  90. package/dist/expect.js.map +1 -0
  91. package/dist/failure-artifacts.d.ts +95 -0
  92. package/dist/failure-artifacts.d.ts.map +1 -0
  93. package/dist/failure-artifacts.js +805 -0
  94. package/dist/failure-artifacts.js.map +1 -0
  95. package/dist/generator.d.ts +16 -0
  96. package/dist/generator.d.ts.map +1 -0
  97. package/dist/generator.js +205 -0
  98. package/dist/generator.js.map +1 -0
  99. package/dist/index.d.ts +37 -0
  100. package/dist/index.d.ts.map +1 -0
  101. package/dist/index.js +160 -0
  102. package/dist/index.js.map +1 -0
  103. package/dist/inspector.d.ts +13 -0
  104. package/dist/inspector.d.ts.map +1 -0
  105. package/dist/inspector.js +153 -0
  106. package/dist/inspector.js.map +1 -0
  107. package/dist/llm-provider.d.ts +144 -0
  108. package/dist/llm-provider.d.ts.map +1 -0
  109. package/dist/llm-provider.js +460 -0
  110. package/dist/llm-provider.js.map +1 -0
  111. package/dist/ordinal.d.ts +90 -0
  112. package/dist/ordinal.d.ts.map +1 -0
  113. package/dist/ordinal.js +249 -0
  114. package/dist/ordinal.js.map +1 -0
  115. package/dist/overlay.d.ts +63 -0
  116. package/dist/overlay.d.ts.map +1 -0
  117. package/dist/overlay.js +102 -0
  118. package/dist/overlay.js.map +1 -0
  119. package/dist/protocols/browser-protocol.d.ts +79 -0
  120. package/dist/protocols/browser-protocol.d.ts.map +1 -0
  121. package/dist/protocols/browser-protocol.js +9 -0
  122. package/dist/protocols/browser-protocol.js.map +1 -0
  123. package/dist/query.d.ts +66 -0
  124. package/dist/query.d.ts.map +1 -0
  125. package/dist/query.js +482 -0
  126. package/dist/query.js.map +1 -0
  127. package/dist/read.d.ts +47 -0
  128. package/dist/read.d.ts.map +1 -0
  129. package/dist/read.js +128 -0
  130. package/dist/read.js.map +1 -0
  131. package/dist/recorder.d.ts +44 -0
  132. package/dist/recorder.d.ts.map +1 -0
  133. package/dist/recorder.js +262 -0
  134. package/dist/recorder.js.map +1 -0
  135. package/dist/runtime-agent.d.ts +72 -0
  136. package/dist/runtime-agent.d.ts.map +1 -0
  137. package/dist/runtime-agent.js +357 -0
  138. package/dist/runtime-agent.js.map +1 -0
  139. package/dist/screenshot.d.ts +17 -0
  140. package/dist/screenshot.d.ts.map +1 -0
  141. package/dist/screenshot.js +40 -0
  142. package/dist/screenshot.js.map +1 -0
  143. package/dist/snapshot-diff.d.ts +23 -0
  144. package/dist/snapshot-diff.d.ts.map +1 -0
  145. package/dist/snapshot-diff.js +119 -0
  146. package/dist/snapshot-diff.js.map +1 -0
  147. package/dist/snapshot.d.ts +47 -0
  148. package/dist/snapshot.d.ts.map +1 -0
  149. package/dist/snapshot.js +358 -0
  150. package/dist/snapshot.js.map +1 -0
  151. package/dist/textSearch.d.ts +64 -0
  152. package/dist/textSearch.d.ts.map +1 -0
  153. package/dist/textSearch.js +113 -0
  154. package/dist/textSearch.js.map +1 -0
  155. package/dist/tools/context.d.ts +18 -0
  156. package/dist/tools/context.d.ts.map +1 -0
  157. package/dist/tools/context.js +40 -0
  158. package/dist/tools/context.js.map +1 -0
  159. package/dist/tools/defaults.d.ts +5 -0
  160. package/dist/tools/defaults.d.ts.map +1 -0
  161. package/dist/tools/defaults.js +368 -0
  162. package/dist/tools/defaults.js.map +1 -0
  163. package/dist/tools/filesystem.d.ts +12 -0
  164. package/dist/tools/filesystem.d.ts.map +1 -0
  165. package/dist/tools/filesystem.js +137 -0
  166. package/dist/tools/filesystem.js.map +1 -0
  167. package/dist/tools/index.d.ts +5 -0
  168. package/dist/tools/index.d.ts.map +1 -0
  169. package/dist/tools/index.js +15 -0
  170. package/dist/tools/index.js.map +1 -0
  171. package/dist/tools/registry.d.ts +38 -0
  172. package/dist/tools/registry.d.ts.map +1 -0
  173. package/dist/tools/registry.js +100 -0
  174. package/dist/tools/registry.js.map +1 -0
  175. package/dist/tracing/cloud-sink.d.ts +189 -0
  176. package/dist/tracing/cloud-sink.d.ts.map +1 -0
  177. package/dist/tracing/cloud-sink.js +1067 -0
  178. package/dist/tracing/cloud-sink.js.map +1 -0
  179. package/dist/tracing/index-schema.d.ts +231 -0
  180. package/dist/tracing/index-schema.d.ts.map +1 -0
  181. package/dist/tracing/index-schema.js +235 -0
  182. package/dist/tracing/index-schema.js.map +1 -0
  183. package/dist/tracing/index.d.ts +12 -0
  184. package/dist/tracing/index.d.ts.map +1 -0
  185. package/dist/tracing/index.js +28 -0
  186. package/dist/tracing/index.js.map +1 -0
  187. package/dist/tracing/indexer.d.ts +20 -0
  188. package/dist/tracing/indexer.d.ts.map +1 -0
  189. package/dist/tracing/indexer.js +347 -0
  190. package/dist/tracing/indexer.js.map +1 -0
  191. package/dist/tracing/jsonl-sink.d.ts +51 -0
  192. package/dist/tracing/jsonl-sink.d.ts.map +1 -0
  193. package/dist/tracing/jsonl-sink.js +329 -0
  194. package/dist/tracing/jsonl-sink.js.map +1 -0
  195. package/dist/tracing/sink.d.ts +25 -0
  196. package/dist/tracing/sink.d.ts.map +1 -0
  197. package/dist/tracing/sink.js +15 -0
  198. package/dist/tracing/sink.js.map +1 -0
  199. package/dist/tracing/tracer-factory.d.ts +102 -0
  200. package/dist/tracing/tracer-factory.d.ts.map +1 -0
  201. package/dist/tracing/tracer-factory.js +375 -0
  202. package/dist/tracing/tracer-factory.js.map +1 -0
  203. package/dist/tracing/tracer.d.ts +140 -0
  204. package/dist/tracing/tracer.d.ts.map +1 -0
  205. package/dist/tracing/tracer.js +336 -0
  206. package/dist/tracing/tracer.js.map +1 -0
  207. package/dist/tracing/types.d.ts +203 -0
  208. package/dist/tracing/types.d.ts.map +1 -0
  209. package/dist/tracing/types.js +8 -0
  210. package/dist/tracing/types.js.map +1 -0
  211. package/dist/types.d.ts +422 -0
  212. package/dist/types.d.ts.map +1 -0
  213. package/dist/types.js +6 -0
  214. package/dist/types.js.map +1 -0
  215. package/dist/utils/action-executor.d.ts +25 -0
  216. package/dist/utils/action-executor.d.ts.map +1 -0
  217. package/dist/utils/action-executor.js +121 -0
  218. package/dist/utils/action-executor.js.map +1 -0
  219. package/dist/utils/browser-evaluator.d.ts +76 -0
  220. package/dist/utils/browser-evaluator.d.ts.map +1 -0
  221. package/dist/utils/browser-evaluator.js +130 -0
  222. package/dist/utils/browser-evaluator.js.map +1 -0
  223. package/dist/utils/browser.d.ts +30 -0
  224. package/dist/utils/browser.d.ts.map +1 -0
  225. package/dist/utils/browser.js +75 -0
  226. package/dist/utils/browser.js.map +1 -0
  227. package/dist/utils/element-filter.d.ts +76 -0
  228. package/dist/utils/element-filter.d.ts.map +1 -0
  229. package/dist/utils/element-filter.js +195 -0
  230. package/dist/utils/element-filter.js.map +1 -0
  231. package/dist/utils/grid-utils.d.ts +37 -0
  232. package/dist/utils/grid-utils.d.ts.map +1 -0
  233. package/dist/utils/grid-utils.js +283 -0
  234. package/dist/utils/grid-utils.js.map +1 -0
  235. package/dist/utils/llm-interaction-handler.d.ts +41 -0
  236. package/dist/utils/llm-interaction-handler.d.ts.map +1 -0
  237. package/dist/utils/llm-interaction-handler.js +171 -0
  238. package/dist/utils/llm-interaction-handler.js.map +1 -0
  239. package/dist/utils/llm-response-builder.d.ts +56 -0
  240. package/dist/utils/llm-response-builder.d.ts.map +1 -0
  241. package/dist/utils/llm-response-builder.js +130 -0
  242. package/dist/utils/llm-response-builder.js.map +1 -0
  243. package/dist/utils/selector-utils.d.ts +12 -0
  244. package/dist/utils/selector-utils.d.ts.map +1 -0
  245. package/dist/utils/selector-utils.js +32 -0
  246. package/dist/utils/selector-utils.js.map +1 -0
  247. package/dist/utils/snapshot-event-builder.d.ts +28 -0
  248. package/dist/utils/snapshot-event-builder.d.ts.map +1 -0
  249. package/dist/utils/snapshot-event-builder.js +88 -0
  250. package/dist/utils/snapshot-event-builder.js.map +1 -0
  251. package/dist/utils/snapshot-processor.d.ts +27 -0
  252. package/dist/utils/snapshot-processor.d.ts.map +1 -0
  253. package/dist/utils/snapshot-processor.js +47 -0
  254. package/dist/utils/snapshot-processor.js.map +1 -0
  255. package/dist/utils/trace-event-builder.d.ts +122 -0
  256. package/dist/utils/trace-event-builder.d.ts.map +1 -0
  257. package/dist/utils/trace-event-builder.js +365 -0
  258. package/dist/utils/trace-event-builder.js.map +1 -0
  259. package/dist/utils/trace-file-manager.d.ts +70 -0
  260. package/dist/utils/trace-file-manager.d.ts.map +1 -0
  261. package/dist/utils/trace-file-manager.js +194 -0
  262. package/dist/utils/trace-file-manager.js.map +1 -0
  263. package/dist/utils/zod.d.ts +5 -0
  264. package/dist/utils/zod.d.ts.map +1 -0
  265. package/dist/utils/zod.js +80 -0
  266. package/dist/utils/zod.js.map +1 -0
  267. package/dist/utils.d.ts +8 -0
  268. package/dist/utils.d.ts.map +1 -0
  269. package/dist/utils.js +13 -0
  270. package/dist/utils.js.map +1 -0
  271. package/dist/verification.d.ts +194 -0
  272. package/dist/verification.d.ts.map +1 -0
  273. package/dist/verification.js +530 -0
  274. package/dist/verification.js.map +1 -0
  275. package/dist/vision-executor.d.ts +18 -0
  276. package/dist/vision-executor.d.ts.map +1 -0
  277. package/dist/vision-executor.js +60 -0
  278. package/dist/vision-executor.js.map +1 -0
  279. package/dist/visual-agent.d.ts +120 -0
  280. package/dist/visual-agent.d.ts.map +1 -0
  281. package/dist/visual-agent.js +796 -0
  282. package/dist/visual-agent.js.map +1 -0
  283. package/dist/wait.d.ts +35 -0
  284. package/dist/wait.d.ts.map +1 -0
  285. package/dist/wait.js +76 -0
  286. package/dist/wait.js.map +1 -0
  287. package/package.json +94 -0
  288. package/spec/README.md +72 -0
  289. package/spec/SNAPSHOT_V1.md +208 -0
  290. package/spec/sdk-types.md +259 -0
  291. package/spec/snapshot.schema.json +148 -0
  292. package/src/extension/background.js +104 -0
  293. package/src/extension/content.js +162 -0
  294. package/src/extension/injected_api.js +1399 -0
  295. package/src/extension/manifest.json +36 -0
  296. package/src/extension/pkg/README.md +1340 -0
  297. package/src/extension/pkg/package.json +15 -0
  298. package/src/extension/pkg/sentience_core.d.ts +51 -0
  299. package/src/extension/pkg/sentience_core.js +371 -0
  300. package/src/extension/pkg/sentience_core_bg.wasm +0 -0
  301. package/src/extension/pkg/sentience_core_bg.wasm.d.ts +10 -0
  302. 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"}