@webless/agent 0.2.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/dist/index.cjs ADDED
@@ -0,0 +1,368 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ DEFAULT_RUNTIME_ORIGIN: () => DEFAULT_RUNTIME_ORIGIN,
24
+ agentHealthUrl: () => agentHealthUrl,
25
+ buildAgentStorageKeyPrefix: () => buildAgentStorageKeyPrefix,
26
+ buildEveHost: () => buildEveHost,
27
+ clearPersistedAgentSession: () => clearPersistedAgentSession,
28
+ clearVisitorSessionId: () => clearVisitorSessionId,
29
+ createAgentClient: () => createAgentClient,
30
+ formatAgentError: () => formatAgentError,
31
+ getOrCreateVisitorSessionId: () => getOrCreateVisitorSessionId,
32
+ loadPersistedAgentSession: () => loadPersistedAgentSession,
33
+ pingAgentHealth: () => pingAgentHealth,
34
+ resolveAgentRuntimeConfig: () => resolveAgentRuntimeConfig,
35
+ savePersistedAgentSession: () => savePersistedAgentSession
36
+ });
37
+ module.exports = __toCommonJS(index_exports);
38
+
39
+ // src/runtime/client.ts
40
+ var import_client = require("eve/client");
41
+
42
+ // src/runtime/config.ts
43
+ var DEFAULT_RUNTIME_ORIGIN = "https://runtime.staging.webless.ai";
44
+ var trimTrailingSlash = (value) => value.replace(/\/+$/, "");
45
+ function buildEveHost(origin, indexId) {
46
+ const base = trimTrailingSlash(origin);
47
+ return `${base}?indexId=${encodeURIComponent(indexId.trim())}`;
48
+ }
49
+ function resolveAgentRuntimeConfig(input) {
50
+ const origin = trimTrailingSlash(input.runtimeOrigin?.trim() || DEFAULT_RUNTIME_ORIGIN);
51
+ const resolvedIndexId = input.indexId.trim();
52
+ return {
53
+ origin,
54
+ indexId: resolvedIndexId,
55
+ host: resolvedIndexId ? buildEveHost(origin, resolvedIndexId) : origin
56
+ };
57
+ }
58
+ function agentHealthUrl(runtimeOrigin) {
59
+ const origin = trimTrailingSlash(runtimeOrigin?.trim() || DEFAULT_RUNTIME_ORIGIN);
60
+ return `${origin}/eve/v1/health`;
61
+ }
62
+
63
+ // src/runtime/session-store.ts
64
+ var DEFAULT_STORAGE_KEY_PREFIX = "webless:agent";
65
+ function normalizeRuntimeOrigin(runtimeOrigin) {
66
+ const trimmed = runtimeOrigin?.trim();
67
+ if (!trimmed) return "_";
68
+ return trimmed.replace(/\/+$/, "");
69
+ }
70
+ function buildAgentStorageKeyPrefix(input) {
71
+ const customerId = input.customerId?.trim() || "_";
72
+ const indexId = input.indexId.trim();
73
+ if (!indexId) {
74
+ throw new Error("indexId is required to build agent storage keys.");
75
+ }
76
+ return `${DEFAULT_STORAGE_KEY_PREFIX}:${customerId}:${indexId}:${normalizeRuntimeOrigin(input.runtimeOrigin)}`;
77
+ }
78
+ function createSessionId() {
79
+ if (typeof crypto !== "undefined" && typeof crypto.randomUUID === "function") {
80
+ return crypto.randomUUID();
81
+ }
82
+ return `sess_${Math.random().toString(36).slice(2)}${Date.now().toString(36)}`;
83
+ }
84
+ function resolvePrefix(options) {
85
+ return options?.storageKeyPrefix?.trim() || DEFAULT_STORAGE_KEY_PREFIX;
86
+ }
87
+ function getOrCreateVisitorSessionId(options) {
88
+ const prefix = resolvePrefix(options);
89
+ const visitorKey = `${prefix}:visitorSessionId`;
90
+ if (typeof sessionStorage === "undefined") {
91
+ return createSessionId();
92
+ }
93
+ const existing = sessionStorage.getItem(visitorKey)?.trim();
94
+ if (existing) return existing;
95
+ const next = createSessionId();
96
+ sessionStorage.setItem(visitorKey, next);
97
+ return next;
98
+ }
99
+ function clearVisitorSessionId(options) {
100
+ if (typeof sessionStorage === "undefined") return;
101
+ const prefix = resolvePrefix(options);
102
+ sessionStorage.removeItem(`${prefix}:visitorSessionId`);
103
+ }
104
+ function runtimeSessionIdKey(visitorSessionId, prefix) {
105
+ return `${prefix}:eve:${visitorSessionId}:sessionId`;
106
+ }
107
+ function runtimeStreamIndexKey(visitorSessionId, prefix) {
108
+ return `${prefix}:eve:${visitorSessionId}:streamIndex`;
109
+ }
110
+ function loadPersistedAgentSession(visitorSessionId, options) {
111
+ if (typeof sessionStorage === "undefined" || !visitorSessionId.trim()) return null;
112
+ const prefix = resolvePrefix(options);
113
+ const sessionId = sessionStorage.getItem(runtimeSessionIdKey(visitorSessionId, prefix))?.trim();
114
+ if (!sessionId) return null;
115
+ const rawIndex = sessionStorage.getItem(runtimeStreamIndexKey(visitorSessionId, prefix));
116
+ const streamIndex = rawIndex ? Number.parseInt(rawIndex, 10) : 0;
117
+ return {
118
+ sessionId,
119
+ streamIndex: Number.isFinite(streamIndex) && streamIndex >= 0 ? streamIndex : 0
120
+ };
121
+ }
122
+ function savePersistedAgentSession(visitorSessionId, sessionId, streamIndex, options) {
123
+ if (typeof sessionStorage === "undefined" || !visitorSessionId.trim() || !sessionId.trim()) {
124
+ return;
125
+ }
126
+ const prefix = resolvePrefix(options);
127
+ sessionStorage.setItem(runtimeSessionIdKey(visitorSessionId, prefix), sessionId);
128
+ sessionStorage.setItem(
129
+ runtimeStreamIndexKey(visitorSessionId, prefix),
130
+ String(Math.max(0, streamIndex))
131
+ );
132
+ }
133
+ function clearPersistedAgentSession(visitorSessionId, options) {
134
+ if (typeof sessionStorage === "undefined" || !visitorSessionId.trim()) return;
135
+ const prefix = resolvePrefix(options);
136
+ sessionStorage.removeItem(runtimeSessionIdKey(visitorSessionId, prefix));
137
+ sessionStorage.removeItem(runtimeStreamIndexKey(visitorSessionId, prefix));
138
+ }
139
+
140
+ // src/runtime/client.ts
141
+ function mapStepLabel(event) {
142
+ if (event.type !== "step.started") return null;
143
+ const stepIndex = event.data.stepIndex;
144
+ return {
145
+ label: "Model step running",
146
+ detail: typeof stepIndex === "number" ? `Step ${stepIndex + 1}` : void 0
147
+ };
148
+ }
149
+ var AgentSession = class {
150
+ constructor(indexId, runtimeOrigin, visitorSessionId, storeOptions) {
151
+ this.indexId = indexId;
152
+ this.runtimeOrigin = runtimeOrigin;
153
+ this.visitorSessionId = visitorSessionId;
154
+ this.storeOptions = storeOptions;
155
+ }
156
+ indexId;
157
+ runtimeOrigin;
158
+ visitorSessionId;
159
+ storeOptions;
160
+ client;
161
+ clientHost;
162
+ session;
163
+ activeResponse;
164
+ renderedPrefix = "";
165
+ getActiveSessionId() {
166
+ return this.session?.state.sessionId ?? loadPersistedAgentSession(this.visitorSessionId, this.storeOptions)?.sessionId;
167
+ }
168
+ reset() {
169
+ void this.activeResponse?.cancel().catch(() => {
170
+ });
171
+ this.activeResponse = void 0;
172
+ this.session = void 0;
173
+ this.renderedPrefix = "";
174
+ clearPersistedAgentSession(this.visitorSessionId, this.storeOptions);
175
+ }
176
+ persistSessionCursor(session) {
177
+ savePersistedAgentSession(
178
+ this.visitorSessionId,
179
+ session.state.sessionId,
180
+ session.state.streamIndex,
181
+ this.storeOptions
182
+ );
183
+ }
184
+ ensureClient() {
185
+ const config = resolveAgentRuntimeConfig({
186
+ indexId: this.indexId,
187
+ runtimeOrigin: this.runtimeOrigin
188
+ });
189
+ if (!config.indexId) {
190
+ throw new Error("indexId is required.");
191
+ }
192
+ if (this.client && this.clientHost === config.host) {
193
+ return this.client;
194
+ }
195
+ this.reset();
196
+ this.client = new import_client.Client({ host: config.host });
197
+ this.clientHost = config.host;
198
+ return this.client;
199
+ }
200
+ attachPersistedSession(client) {
201
+ const persisted = loadPersistedAgentSession(this.visitorSessionId, this.storeOptions);
202
+ if (!persisted?.sessionId) return void 0;
203
+ this.renderedPrefix = "";
204
+ return client.sessions.attach(persisted.sessionId, {
205
+ streamIndex: persisted.streamIndex
206
+ });
207
+ }
208
+ async sendTurn(message, signal, handlers) {
209
+ const client = this.ensureClient();
210
+ let response;
211
+ let session = this.session ?? this.attachPersistedSession(client);
212
+ if (session) {
213
+ this.session = session;
214
+ try {
215
+ response = await session.send(message, { signal });
216
+ } catch (error) {
217
+ if (error instanceof import_client.ClientError && error.status === 409 && error.code === "session_not_active") {
218
+ clearPersistedAgentSession(this.visitorSessionId, this.storeOptions);
219
+ this.session = void 0;
220
+ session = void 0;
221
+ } else {
222
+ throw error;
223
+ }
224
+ }
225
+ }
226
+ if (!response) {
227
+ const created = await client.sessions.create({ message, signal });
228
+ response = created.response;
229
+ session = created.session;
230
+ this.session = session;
231
+ this.renderedPrefix = "";
232
+ this.persistSessionCursor(session);
233
+ }
234
+ this.activeResponse = response;
235
+ let rendered = this.renderedPrefix;
236
+ try {
237
+ for await (const event of response) {
238
+ if (signal.aborted) break;
239
+ const step = mapStepLabel(event);
240
+ if (step) handlers.onStep?.(step.label, step.detail);
241
+ if (event.type === "message.appended") {
242
+ const { messageDelta, messageSoFar } = event.data;
243
+ let delta = messageDelta;
244
+ if (messageSoFar.startsWith(rendered)) {
245
+ delta = messageSoFar.slice(rendered.length);
246
+ rendered = messageSoFar;
247
+ } else if (messageDelta) {
248
+ rendered += messageDelta;
249
+ }
250
+ if (delta) handlers.onDelta(delta);
251
+ }
252
+ if (event.type === "message.completed") {
253
+ handlers.onComplete?.();
254
+ }
255
+ if (event.type === "session.failed") {
256
+ throw new Error(event.data.message || event.data.code);
257
+ }
258
+ }
259
+ } finally {
260
+ this.activeResponse = void 0;
261
+ this.renderedPrefix = rendered;
262
+ if (session) {
263
+ this.persistSessionCursor(session);
264
+ }
265
+ }
266
+ if (!rendered.trim() && !signal.aborted) {
267
+ throw new Error("Empty response from runtime");
268
+ }
269
+ if (signal.aborted) {
270
+ await response.cancel().catch(() => {
271
+ });
272
+ }
273
+ return rendered.trim();
274
+ }
275
+ cancelActive() {
276
+ this.activeResponse?.cancel().catch(() => {
277
+ });
278
+ }
279
+ };
280
+ function createAgentClient(options) {
281
+ const indexId = options.indexId.trim();
282
+ if (!indexId) {
283
+ throw new Error("indexId is required.");
284
+ }
285
+ const runtimeOrigin = options.runtimeOrigin?.trim() || resolveAgentRuntimeConfig({ indexId }).origin;
286
+ const storeOptions = {
287
+ storageKeyPrefix: options.storageKeyPrefix?.trim() || buildAgentStorageKeyPrefix({
288
+ customerId: options.customerId,
289
+ indexId,
290
+ runtimeOrigin
291
+ })
292
+ };
293
+ const visitorSessionId = options.visitorSessionId?.trim() || getOrCreateVisitorSessionId(storeOptions);
294
+ const session = new AgentSession(indexId, runtimeOrigin, visitorSessionId, storeOptions);
295
+ return {
296
+ indexId,
297
+ runtimeOrigin,
298
+ visitorSessionId,
299
+ sendTurn: (message, sendOptions) => session.sendTurn(
300
+ message,
301
+ sendOptions.signal ?? new AbortController().signal,
302
+ sendOptions.handlers
303
+ ),
304
+ reset: () => session.reset(),
305
+ cancelActive: () => session.cancelActive(),
306
+ getActiveSessionId: () => session.getActiveSessionId()
307
+ };
308
+ }
309
+
310
+ // src/runtime/errors.ts
311
+ var import_client2 = require("eve/client");
312
+ function formatAgentError(error) {
313
+ if (error instanceof import_client2.ClientError) {
314
+ if (error.status === 401 && error.code === "index_required") {
315
+ return "Missing indexId \u2014 pass a published index id to createAgentClient().";
316
+ }
317
+ if (error.status === 403 && error.code === "agent_unavailable") {
318
+ return "Agent unavailable for this index (disabled or unpublished).";
319
+ }
320
+ if (error.status === 409 && error.code === "session_not_active") {
321
+ return "Session expired \u2014 send a new message to start again.";
322
+ }
323
+ return error.message || `Runtime error (${error.status})`;
324
+ }
325
+ if (error instanceof DOMException && error.name === "AbortError") {
326
+ return "";
327
+ }
328
+ if (error instanceof Error) return error.message;
329
+ return "Runtime request failed";
330
+ }
331
+
332
+ // src/runtime/health.ts
333
+ async function pingAgentHealth(runtimeOrigin, fetchImpl = fetch) {
334
+ const healthUrl = agentHealthUrl(runtimeOrigin);
335
+ try {
336
+ const response = await fetchImpl(healthUrl, {
337
+ headers: { Accept: "application/json" },
338
+ cache: "no-store"
339
+ });
340
+ if (!response.ok) {
341
+ return { ok: false, detail: `Health check failed (${response.status})` };
342
+ }
343
+ const payload = await response.json();
344
+ if (payload.ok === true) {
345
+ return { ok: true, detail: payload.status ?? "ready" };
346
+ }
347
+ return { ok: false, detail: "Runtime health response was not ok" };
348
+ } catch (error) {
349
+ return { ok: false, detail: formatAgentError(error) || "Health check failed" };
350
+ }
351
+ }
352
+ // Annotate the CommonJS export names for ESM import in node:
353
+ 0 && (module.exports = {
354
+ DEFAULT_RUNTIME_ORIGIN,
355
+ agentHealthUrl,
356
+ buildAgentStorageKeyPrefix,
357
+ buildEveHost,
358
+ clearPersistedAgentSession,
359
+ clearVisitorSessionId,
360
+ createAgentClient,
361
+ formatAgentError,
362
+ getOrCreateVisitorSessionId,
363
+ loadPersistedAgentSession,
364
+ pingAgentHealth,
365
+ resolveAgentRuntimeConfig,
366
+ savePersistedAgentSession
367
+ });
368
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/runtime/client.ts","../src/runtime/config.ts","../src/runtime/session-store.ts","../src/runtime/errors.ts","../src/runtime/health.ts"],"sourcesContent":["export { createAgentClient } from \"./runtime/client\";\nexport {\n DEFAULT_RUNTIME_ORIGIN,\n agentHealthUrl,\n buildEveHost,\n resolveAgentRuntimeConfig,\n} from \"./runtime/config\";\nexport { formatAgentError } from \"./runtime/errors\";\nexport { pingAgentHealth } from \"./runtime/health\";\nexport {\n buildAgentStorageKeyPrefix,\n clearPersistedAgentSession,\n clearVisitorSessionId,\n getOrCreateVisitorSessionId,\n loadPersistedAgentSession,\n savePersistedAgentSession,\n} from \"./runtime/session-store\";\nexport type { SessionStoreOptions } from \"./runtime/session-store\";\nexport type {\n AgentClient,\n AgentClientOptions,\n AgentHealthResult,\n AgentRuntimeConfig,\n AgentSendTurnOptions,\n AgentStreamHandlers,\n PersistedAgentSession,\n} from \"./runtime/types\";\n","import {\n Client,\n ClientError,\n type ClientSession,\n type MessageResponse,\n type MessageStreamEvent,\n} from \"eve/client\";\nimport { resolveAgentRuntimeConfig } from \"./config\";\nimport {\n buildAgentStorageKeyPrefix,\n clearPersistedAgentSession,\n getOrCreateVisitorSessionId,\n loadPersistedAgentSession,\n savePersistedAgentSession,\n type SessionStoreOptions,\n} from \"./session-store\";\nimport type {\n AgentClient,\n AgentClientOptions,\n AgentSendTurnOptions,\n AgentStreamHandlers,\n} from \"./types\";\n\nfunction mapStepLabel(event: MessageStreamEvent): { label: string; detail?: string } | null {\n if (event.type !== \"step.started\") return null;\n const stepIndex = event.data.stepIndex;\n return {\n label: \"Model step running\",\n detail: typeof stepIndex === \"number\" ? `Step ${stepIndex + 1}` : undefined,\n };\n}\n\nclass AgentSession {\n private client: Client | undefined;\n private clientHost: string | undefined;\n private session: ClientSession | undefined;\n private activeResponse: MessageResponse | undefined;\n private renderedPrefix = \"\";\n\n constructor(\n private readonly indexId: string,\n private readonly runtimeOrigin: string,\n private readonly visitorSessionId: string,\n private readonly storeOptions: SessionStoreOptions,\n ) {}\n\n getActiveSessionId(): string | undefined {\n return (\n this.session?.state.sessionId ??\n loadPersistedAgentSession(this.visitorSessionId, this.storeOptions)?.sessionId\n );\n }\n\n reset() {\n void this.activeResponse?.cancel().catch(() => {});\n this.activeResponse = undefined;\n this.session = undefined;\n this.renderedPrefix = \"\";\n clearPersistedAgentSession(this.visitorSessionId, this.storeOptions);\n }\n\n private persistSessionCursor(session: ClientSession) {\n savePersistedAgentSession(\n this.visitorSessionId,\n session.state.sessionId,\n session.state.streamIndex,\n this.storeOptions,\n );\n }\n\n private ensureClient(): Client {\n const config = resolveAgentRuntimeConfig({\n indexId: this.indexId,\n runtimeOrigin: this.runtimeOrigin,\n });\n if (!config.indexId) {\n throw new Error(\"indexId is required.\");\n }\n\n if (this.client && this.clientHost === config.host) {\n return this.client;\n }\n\n this.reset();\n this.client = new Client({ host: config.host });\n this.clientHost = config.host;\n return this.client;\n }\n\n private attachPersistedSession(client: Client): ClientSession | undefined {\n const persisted = loadPersistedAgentSession(this.visitorSessionId, this.storeOptions);\n if (!persisted?.sessionId) return undefined;\n\n this.renderedPrefix = \"\";\n return client.sessions.attach(persisted.sessionId, {\n streamIndex: persisted.streamIndex,\n });\n }\n\n async sendTurn(\n message: string,\n signal: AbortSignal,\n handlers: AgentStreamHandlers,\n ): Promise<string> {\n const client = this.ensureClient();\n let response: MessageResponse | undefined;\n let session = this.session ?? this.attachPersistedSession(client);\n\n if (session) {\n this.session = session;\n try {\n response = await session.send(message, { signal });\n } catch (error) {\n if (\n error instanceof ClientError &&\n error.status === 409 &&\n error.code === \"session_not_active\"\n ) {\n clearPersistedAgentSession(this.visitorSessionId, this.storeOptions);\n this.session = undefined;\n session = undefined;\n } else {\n throw error;\n }\n }\n }\n\n if (!response) {\n const created = await client.sessions.create({ message, signal });\n response = created.response;\n session = created.session;\n this.session = session;\n this.renderedPrefix = \"\";\n this.persistSessionCursor(session);\n }\n\n this.activeResponse = response;\n let rendered = this.renderedPrefix;\n\n try {\n for await (const event of response) {\n if (signal.aborted) break;\n\n const step = mapStepLabel(event);\n if (step) handlers.onStep?.(step.label, step.detail);\n\n if (event.type === \"message.appended\") {\n const { messageDelta, messageSoFar } = event.data;\n let delta = messageDelta;\n if (messageSoFar.startsWith(rendered)) {\n delta = messageSoFar.slice(rendered.length);\n rendered = messageSoFar;\n } else if (messageDelta) {\n rendered += messageDelta;\n }\n if (delta) handlers.onDelta(delta);\n }\n\n if (event.type === \"message.completed\") {\n handlers.onComplete?.();\n }\n\n if (event.type === \"session.failed\") {\n throw new Error(event.data.message || event.data.code);\n }\n }\n } finally {\n this.activeResponse = undefined;\n this.renderedPrefix = rendered;\n if (session) {\n this.persistSessionCursor(session);\n }\n }\n\n if (!rendered.trim() && !signal.aborted) {\n throw new Error(\"Empty response from runtime\");\n }\n\n if (signal.aborted) {\n await response.cancel().catch(() => {});\n }\n\n return rendered.trim();\n }\n\n cancelActive() {\n this.activeResponse?.cancel().catch(() => {});\n }\n}\n\nexport function createAgentClient(options: AgentClientOptions): AgentClient {\n const indexId = options.indexId.trim();\n if (!indexId) {\n throw new Error(\"indexId is required.\");\n }\n\n const runtimeOrigin = options.runtimeOrigin?.trim() || resolveAgentRuntimeConfig({ indexId }).origin;\n const storeOptions: SessionStoreOptions = {\n storageKeyPrefix:\n options.storageKeyPrefix?.trim() ||\n buildAgentStorageKeyPrefix({\n customerId: options.customerId,\n indexId,\n runtimeOrigin,\n }),\n };\n const visitorSessionId =\n options.visitorSessionId?.trim() || getOrCreateVisitorSessionId(storeOptions);\n\n const session = new AgentSession(indexId, runtimeOrigin, visitorSessionId, storeOptions);\n\n return {\n indexId,\n runtimeOrigin,\n visitorSessionId,\n sendTurn: (message, sendOptions: AgentSendTurnOptions) =>\n session.sendTurn(\n message,\n sendOptions.signal ?? new AbortController().signal,\n sendOptions.handlers,\n ),\n reset: () => session.reset(),\n cancelActive: () => session.cancelActive(),\n getActiveSessionId: () => session.getActiveSessionId(),\n };\n}\n","import type { AgentRuntimeConfig } from \"./types\";\n\nexport const DEFAULT_RUNTIME_ORIGIN = \"https://runtime.staging.webless.ai\";\n\nconst trimTrailingSlash = (value: string) => value.replace(/\\/+$/, \"\");\n\nexport function buildEveHost(origin: string, indexId: string): string {\n const base = trimTrailingSlash(origin);\n return `${base}?indexId=${encodeURIComponent(indexId.trim())}`;\n}\n\nexport function resolveAgentRuntimeConfig(input: {\n indexId: string;\n runtimeOrigin?: string;\n}): AgentRuntimeConfig {\n const origin = trimTrailingSlash(input.runtimeOrigin?.trim() || DEFAULT_RUNTIME_ORIGIN);\n const resolvedIndexId = input.indexId.trim();\n\n return {\n origin,\n indexId: resolvedIndexId,\n host: resolvedIndexId ? buildEveHost(origin, resolvedIndexId) : origin,\n };\n}\n\nexport function agentHealthUrl(runtimeOrigin?: string): string {\n const origin = trimTrailingSlash(runtimeOrigin?.trim() || DEFAULT_RUNTIME_ORIGIN);\n return `${origin}/eve/v1/health`;\n}\n","import type { PersistedAgentSession } from \"./types\";\n\nconst DEFAULT_STORAGE_KEY_PREFIX = \"webless:agent\";\n\nexport type SessionStoreOptions = {\n storageKeyPrefix?: string;\n};\n\nfunction normalizeRuntimeOrigin(runtimeOrigin?: string) {\n const trimmed = runtimeOrigin?.trim();\n if (!trimmed) return \"_\";\n return trimmed.replace(/\\/+$/, \"\");\n}\n\nexport function buildAgentStorageKeyPrefix(input: {\n customerId?: string;\n indexId: string;\n runtimeOrigin?: string;\n}) {\n const customerId = input.customerId?.trim() || \"_\";\n const indexId = input.indexId.trim();\n if (!indexId) {\n throw new Error(\"indexId is required to build agent storage keys.\");\n }\n\n return `${DEFAULT_STORAGE_KEY_PREFIX}:${customerId}:${indexId}:${normalizeRuntimeOrigin(input.runtimeOrigin)}`;\n}\n\nfunction createSessionId(): string {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n return `sess_${Math.random().toString(36).slice(2)}${Date.now().toString(36)}`;\n}\n\nfunction resolvePrefix(options?: SessionStoreOptions) {\n return options?.storageKeyPrefix?.trim() || DEFAULT_STORAGE_KEY_PREFIX;\n}\n\nexport function getOrCreateVisitorSessionId(options?: SessionStoreOptions): string {\n const prefix = resolvePrefix(options);\n const visitorKey = `${prefix}:visitorSessionId`;\n\n if (typeof sessionStorage === \"undefined\") {\n return createSessionId();\n }\n\n const existing = sessionStorage.getItem(visitorKey)?.trim();\n if (existing) return existing;\n\n const next = createSessionId();\n sessionStorage.setItem(visitorKey, next);\n return next;\n}\n\nexport function clearVisitorSessionId(options?: SessionStoreOptions) {\n if (typeof sessionStorage === \"undefined\") return;\n\n const prefix = resolvePrefix(options);\n sessionStorage.removeItem(`${prefix}:visitorSessionId`);\n}\n\nfunction runtimeSessionIdKey(visitorSessionId: string, prefix: string) {\n return `${prefix}:eve:${visitorSessionId}:sessionId`;\n}\n\nfunction runtimeStreamIndexKey(visitorSessionId: string, prefix: string) {\n return `${prefix}:eve:${visitorSessionId}:streamIndex`;\n}\n\nexport function loadPersistedAgentSession(\n visitorSessionId: string,\n options?: SessionStoreOptions,\n): PersistedAgentSession | null {\n if (typeof sessionStorage === \"undefined\" || !visitorSessionId.trim()) return null;\n\n const prefix = resolvePrefix(options);\n const sessionId = sessionStorage.getItem(runtimeSessionIdKey(visitorSessionId, prefix))?.trim();\n if (!sessionId) return null;\n\n const rawIndex = sessionStorage.getItem(runtimeStreamIndexKey(visitorSessionId, prefix));\n const streamIndex = rawIndex ? Number.parseInt(rawIndex, 10) : 0;\n\n return {\n sessionId,\n streamIndex: Number.isFinite(streamIndex) && streamIndex >= 0 ? streamIndex : 0,\n };\n}\n\nexport function savePersistedAgentSession(\n visitorSessionId: string,\n sessionId: string,\n streamIndex: number,\n options?: SessionStoreOptions,\n) {\n if (typeof sessionStorage === \"undefined\" || !visitorSessionId.trim() || !sessionId.trim()) {\n return;\n }\n\n const prefix = resolvePrefix(options);\n sessionStorage.setItem(runtimeSessionIdKey(visitorSessionId, prefix), sessionId);\n sessionStorage.setItem(\n runtimeStreamIndexKey(visitorSessionId, prefix),\n String(Math.max(0, streamIndex)),\n );\n}\n\nexport function clearPersistedAgentSession(\n visitorSessionId: string,\n options?: SessionStoreOptions,\n) {\n if (typeof sessionStorage === \"undefined\" || !visitorSessionId.trim()) return;\n const prefix = resolvePrefix(options);\n sessionStorage.removeItem(runtimeSessionIdKey(visitorSessionId, prefix));\n sessionStorage.removeItem(runtimeStreamIndexKey(visitorSessionId, prefix));\n}\n","import { ClientError } from \"eve/client\";\n\nexport function formatAgentError(error: unknown): string {\n if (error instanceof ClientError) {\n if (error.status === 401 && error.code === \"index_required\") {\n return \"Missing indexId — pass a published index id to createAgentClient().\";\n }\n if (error.status === 403 && error.code === \"agent_unavailable\") {\n return \"Agent unavailable for this index (disabled or unpublished).\";\n }\n if (error.status === 409 && error.code === \"session_not_active\") {\n return \"Session expired — send a new message to start again.\";\n }\n return error.message || `Runtime error (${error.status})`;\n }\n if (error instanceof DOMException && error.name === \"AbortError\") {\n return \"\";\n }\n if (error instanceof Error) return error.message;\n return \"Runtime request failed\";\n}\n","import { formatAgentError } from \"./errors\";\nimport { agentHealthUrl } from \"./config\";\nimport type { AgentHealthResult } from \"./types\";\n\nexport async function pingAgentHealth(\n runtimeOrigin?: string,\n fetchImpl: typeof fetch = fetch,\n): Promise<AgentHealthResult> {\n const healthUrl = agentHealthUrl(runtimeOrigin);\n\n try {\n const response = await fetchImpl(healthUrl, {\n headers: { Accept: \"application/json\" },\n cache: \"no-store\",\n });\n if (!response.ok) {\n return { ok: false, detail: `Health check failed (${response.status})` };\n }\n const payload = (await response.json()) as { status?: string; ok?: boolean };\n if (payload.ok === true) {\n return { ok: true, detail: payload.status ?? \"ready\" };\n }\n return { ok: false, detail: \"Runtime health response was not ok\" };\n } catch (error) {\n return { ok: false, detail: formatAgentError(error) || \"Health check failed\" };\n }\n}\n"],"mappings":"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","names":["import_client"]}
@@ -0,0 +1,73 @@
1
+ type AgentRuntimeConfig = {
2
+ origin: string;
3
+ indexId: string;
4
+ host: string;
5
+ };
6
+ type AgentStreamHandlers = {
7
+ onStep?: (label: string, detail?: string) => void;
8
+ onDelta: (delta: string) => void;
9
+ onComplete?: () => void;
10
+ };
11
+ type AgentSendTurnOptions = {
12
+ signal?: AbortSignal;
13
+ handlers: AgentStreamHandlers;
14
+ };
15
+ type PersistedAgentSession = {
16
+ sessionId: string;
17
+ streamIndex: number;
18
+ };
19
+ type AgentClientOptions = {
20
+ /** Published index id sent as `indexId` query param to the runtime. */
21
+ indexId: string;
22
+ /** Customer id used to isolate browser session storage when omitted from storageKeyPrefix. */
23
+ customerId?: string;
24
+ /** Agent runtime origin, e.g. `https://runtime.staging.webless.ai`. */
25
+ runtimeOrigin?: string;
26
+ /** Stable browser conversation id; generated and stored when omitted. */
27
+ visitorSessionId?: string;
28
+ /** Override sessionStorage key prefix (derived from agent identity when omitted). */
29
+ storageKeyPrefix?: string;
30
+ };
31
+ type AgentClient = {
32
+ readonly indexId: string;
33
+ readonly runtimeOrigin: string;
34
+ readonly visitorSessionId: string;
35
+ sendTurn: (message: string, options: AgentSendTurnOptions) => Promise<string>;
36
+ reset: () => void;
37
+ cancelActive: () => void;
38
+ getActiveSessionId: () => string | undefined;
39
+ };
40
+ type AgentHealthResult = {
41
+ ok: boolean;
42
+ detail: string;
43
+ };
44
+
45
+ declare function createAgentClient(options: AgentClientOptions): AgentClient;
46
+
47
+ declare const DEFAULT_RUNTIME_ORIGIN = "https://runtime.staging.webless.ai";
48
+ declare function buildEveHost(origin: string, indexId: string): string;
49
+ declare function resolveAgentRuntimeConfig(input: {
50
+ indexId: string;
51
+ runtimeOrigin?: string;
52
+ }): AgentRuntimeConfig;
53
+ declare function agentHealthUrl(runtimeOrigin?: string): string;
54
+
55
+ declare function formatAgentError(error: unknown): string;
56
+
57
+ declare function pingAgentHealth(runtimeOrigin?: string, fetchImpl?: typeof fetch): Promise<AgentHealthResult>;
58
+
59
+ type SessionStoreOptions = {
60
+ storageKeyPrefix?: string;
61
+ };
62
+ declare function buildAgentStorageKeyPrefix(input: {
63
+ customerId?: string;
64
+ indexId: string;
65
+ runtimeOrigin?: string;
66
+ }): string;
67
+ declare function getOrCreateVisitorSessionId(options?: SessionStoreOptions): string;
68
+ declare function clearVisitorSessionId(options?: SessionStoreOptions): void;
69
+ declare function loadPersistedAgentSession(visitorSessionId: string, options?: SessionStoreOptions): PersistedAgentSession | null;
70
+ declare function savePersistedAgentSession(visitorSessionId: string, sessionId: string, streamIndex: number, options?: SessionStoreOptions): void;
71
+ declare function clearPersistedAgentSession(visitorSessionId: string, options?: SessionStoreOptions): void;
72
+
73
+ export { type AgentClient, type AgentClientOptions, type AgentHealthResult, type AgentRuntimeConfig, type AgentSendTurnOptions, type AgentStreamHandlers, DEFAULT_RUNTIME_ORIGIN, type PersistedAgentSession, type SessionStoreOptions, agentHealthUrl, buildAgentStorageKeyPrefix, buildEveHost, clearPersistedAgentSession, clearVisitorSessionId, createAgentClient, formatAgentError, getOrCreateVisitorSessionId, loadPersistedAgentSession, pingAgentHealth, resolveAgentRuntimeConfig, savePersistedAgentSession };
@@ -0,0 +1,73 @@
1
+ type AgentRuntimeConfig = {
2
+ origin: string;
3
+ indexId: string;
4
+ host: string;
5
+ };
6
+ type AgentStreamHandlers = {
7
+ onStep?: (label: string, detail?: string) => void;
8
+ onDelta: (delta: string) => void;
9
+ onComplete?: () => void;
10
+ };
11
+ type AgentSendTurnOptions = {
12
+ signal?: AbortSignal;
13
+ handlers: AgentStreamHandlers;
14
+ };
15
+ type PersistedAgentSession = {
16
+ sessionId: string;
17
+ streamIndex: number;
18
+ };
19
+ type AgentClientOptions = {
20
+ /** Published index id sent as `indexId` query param to the runtime. */
21
+ indexId: string;
22
+ /** Customer id used to isolate browser session storage when omitted from storageKeyPrefix. */
23
+ customerId?: string;
24
+ /** Agent runtime origin, e.g. `https://runtime.staging.webless.ai`. */
25
+ runtimeOrigin?: string;
26
+ /** Stable browser conversation id; generated and stored when omitted. */
27
+ visitorSessionId?: string;
28
+ /** Override sessionStorage key prefix (derived from agent identity when omitted). */
29
+ storageKeyPrefix?: string;
30
+ };
31
+ type AgentClient = {
32
+ readonly indexId: string;
33
+ readonly runtimeOrigin: string;
34
+ readonly visitorSessionId: string;
35
+ sendTurn: (message: string, options: AgentSendTurnOptions) => Promise<string>;
36
+ reset: () => void;
37
+ cancelActive: () => void;
38
+ getActiveSessionId: () => string | undefined;
39
+ };
40
+ type AgentHealthResult = {
41
+ ok: boolean;
42
+ detail: string;
43
+ };
44
+
45
+ declare function createAgentClient(options: AgentClientOptions): AgentClient;
46
+
47
+ declare const DEFAULT_RUNTIME_ORIGIN = "https://runtime.staging.webless.ai";
48
+ declare function buildEveHost(origin: string, indexId: string): string;
49
+ declare function resolveAgentRuntimeConfig(input: {
50
+ indexId: string;
51
+ runtimeOrigin?: string;
52
+ }): AgentRuntimeConfig;
53
+ declare function agentHealthUrl(runtimeOrigin?: string): string;
54
+
55
+ declare function formatAgentError(error: unknown): string;
56
+
57
+ declare function pingAgentHealth(runtimeOrigin?: string, fetchImpl?: typeof fetch): Promise<AgentHealthResult>;
58
+
59
+ type SessionStoreOptions = {
60
+ storageKeyPrefix?: string;
61
+ };
62
+ declare function buildAgentStorageKeyPrefix(input: {
63
+ customerId?: string;
64
+ indexId: string;
65
+ runtimeOrigin?: string;
66
+ }): string;
67
+ declare function getOrCreateVisitorSessionId(options?: SessionStoreOptions): string;
68
+ declare function clearVisitorSessionId(options?: SessionStoreOptions): void;
69
+ declare function loadPersistedAgentSession(visitorSessionId: string, options?: SessionStoreOptions): PersistedAgentSession | null;
70
+ declare function savePersistedAgentSession(visitorSessionId: string, sessionId: string, streamIndex: number, options?: SessionStoreOptions): void;
71
+ declare function clearPersistedAgentSession(visitorSessionId: string, options?: SessionStoreOptions): void;
72
+
73
+ export { type AgentClient, type AgentClientOptions, type AgentHealthResult, type AgentRuntimeConfig, type AgentSendTurnOptions, type AgentStreamHandlers, DEFAULT_RUNTIME_ORIGIN, type PersistedAgentSession, type SessionStoreOptions, agentHealthUrl, buildAgentStorageKeyPrefix, buildEveHost, clearPersistedAgentSession, clearVisitorSessionId, createAgentClient, formatAgentError, getOrCreateVisitorSessionId, loadPersistedAgentSession, pingAgentHealth, resolveAgentRuntimeConfig, savePersistedAgentSession };