@webless/agent 0.2.6 → 0.2.7
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/{chunk-GMG4WJNF.js → chunk-4QGS7UZY.js} +30 -12
- package/dist/chunk-4QGS7UZY.js.map +1 -0
- package/dist/embed.cjs +81 -12
- package/dist/embed.cjs.map +1 -1
- package/dist/embed.d.cts +19 -5
- package/dist/embed.d.ts +19 -5
- package/dist/embed.js +52 -2
- package/dist/embed.js.map +1 -1
- package/dist/index.cjs +19 -6
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +10 -3
- package/dist/index.d.ts +10 -3
- package/dist/index.js +19 -6
- package/dist/index.js.map +1 -1
- package/dist/{placement-2d9GQGou.d.cts → placement-CXW_83AF.d.cts} +3 -1
- package/dist/{placement-2d9GQGou.d.ts → placement-CXW_83AF.d.ts} +3 -1
- package/dist/react.cjs +29 -11
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +6 -4
- package/dist/react.d.ts +6 -4
- package/dist/react.js +1 -1
- package/package.json +4 -4
- package/scripts/build-agent-manifest-bundle-impl.mjs +32 -32
- package/dist/chunk-GMG4WJNF.js.map +0 -1
package/dist/embed.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/embed/mount.tsx","../src/embed/AgentWidget.tsx","../src/embed/manifest.ts"],"sourcesContent":["import { createRoot, type Root } from \"react-dom/client\";\nimport { closeAgentPanel, openAgentPanel } from \"./controller\";\nimport { AgentWidget } from \"./AgentWidget\";\nimport {\n normalizeAgentTagManifest,\n type AgentTagManifest,\n type NormalizedAgentTagManifest,\n} from \"./manifest\";\n\nexport type AgentRuntimeHandle = {\n customerId: string;\n manifest: NormalizedAgentTagManifest;\n host: HTMLElement;\n root: Root;\n open: () => void;\n close: () => void;\n unmount: () => void;\n};\n\nconst mountedHandles = new Map<string, AgentRuntimeHandle>();\nlet latestCustomerId: string | null = null;\n\nfunction resolveMountHost(manifest: NormalizedAgentTagManifest, script?: HTMLScriptElement | null) {\n const strategy = manifest.mount.strategy ?? \"body\";\n\n if (strategy === \"script-parent\" && script?.parentElement instanceof HTMLElement) {\n return script.parentElement;\n }\n\n if (strategy === \"selector\" && manifest.mount.selector) {\n const target = document.querySelector(manifest.mount.selector);\n if (target instanceof HTMLElement) return target;\n }\n\n return document.body;\n}\n\nfunction createHost(customerId: string) {\n const host = document.createElement(\"div\");\n host.dataset.weblessAgentCustomerId = customerId;\n host.setAttribute(\"data-webless-agent\", customerId);\n return host;\n}\n\nexport function mountAgent(input: {\n manifest: AgentTagManifest;\n script?: HTMLScriptElement | null;\n}): AgentRuntimeHandle {\n const manifest = normalizeAgentTagManifest(input.manifest);\n const existing = mountedHandles.get(manifest.customerId);\n if (existing) {\n return existing;\n }\n\n const mountTarget = resolveMountHost(manifest, input.script ?? null);\n const host = createHost(manifest.customerId);\n mountTarget.append(host);\n\n const root = createRoot(host);\n root.render(<AgentWidget manifest={manifest} />);\n\n const handle: AgentRuntimeHandle = {\n customerId: manifest.customerId,\n manifest,\n host,\n root,\n open: () => {\n openAgentPanel(manifest.customerId);\n },\n close: () => {\n closeAgentPanel(manifest.customerId);\n },\n unmount: () => {\n root.unmount();\n host.remove();\n mountedHandles.delete(manifest.customerId);\n if (latestCustomerId === manifest.customerId) {\n latestCustomerId = null;\n }\n },\n };\n\n mountedHandles.set(manifest.customerId, handle);\n latestCustomerId = manifest.customerId;\n return handle;\n}\n\nexport function unmountAgent(customerId?: string) {\n const id = customerId ?? latestCustomerId;\n if (!id) return false;\n const handle = mountedHandles.get(id);\n if (!handle) return false;\n handle.unmount();\n return true;\n}\n\nexport function getMountedAgent(customerId?: string) {\n if (customerId) return mountedHandles.get(customerId) ?? null;\n if (latestCustomerId) return mountedHandles.get(latestCustomerId) ?? null;\n return mountedHandles.values().next().value ?? null;\n}\n\nexport function bootstrapAgent(manifest: AgentTagManifest, script?: HTMLScriptElement | null) {\n return mountAgent({ manifest, script });\n}\n","import { AgentWidget as WeblessAgentWidget } from \"../react/components/AgentWidget\";\nimport type { NormalizedAgentTagManifest } from \"./manifest\";\n\nexport function AgentWidget({ manifest }: { manifest: NormalizedAgentTagManifest }) {\n return (\n <WeblessAgentWidget\n indexId={manifest.indexId}\n customerId={manifest.customerId}\n runtimeOrigin={manifest.runtimeOrigin}\n placement={manifest.placement}\n defaultCollapsed\n registerPanelController\n />\n );\n}\n","import { DEFAULT_RUNTIME_ORIGIN, resolveAgentRuntimeConfig } from \"../runtime/config\";\nimport {\n DEFAULT_AGENT_PLACEMENT,\n normalizeAgentPlacement,\n type AgentPlacementConfig,\n} from \"../react/placement\";\n\nexport type { AgentPlacementConfig };\nexport type AgentMountStrategy = \"body\" | \"selector\" | \"script-parent\";\n\nexport type AgentTabVariant = AgentPlacementConfig[\"variant\"];\nexport type AgentTabSide = AgentPlacementConfig[\"side\"];\n\nexport type AgentTagManifest = {\n customerId: string;\n indexId: string;\n runtimeOrigin?: string;\n version?: string;\n mount?: {\n selector?: string;\n strategy?: AgentMountStrategy;\n };\n placement?: Partial<AgentPlacementConfig>;\n};\n\nexport { DEFAULT_AGENT_PLACEMENT, normalizeAgentPlacement };\n\nexport function normalizeAgentTagManifest(manifest: AgentTagManifest) {\n const indexId = manifest.indexId.trim();\n if (!indexId) {\n throw new Error(\"Agent manifest requires indexId.\");\n }\n\n const customerId = manifest.customerId.trim();\n if (!customerId) {\n throw new Error(\"Agent manifest requires customerId.\");\n }\n\n const runtime = resolveAgentRuntimeConfig({\n indexId,\n runtimeOrigin: manifest.runtimeOrigin?.trim() || DEFAULT_RUNTIME_ORIGIN,\n });\n\n return {\n customerId,\n indexId,\n runtimeOrigin: runtime.origin,\n version: manifest.version?.trim() || \"published\",\n mount: {\n selector: manifest.mount?.selector?.trim(),\n strategy: manifest.mount?.strategy ?? \"body\",\n },\n placement: normalizeAgentPlacement(manifest.placement),\n };\n}\n\nexport type NormalizedAgentTagManifest = ReturnType<typeof normalizeAgentTagManifest>;\n"],"mappings":"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","names":["AgentWidget","jsx","AgentWidget"]}
|
|
1
|
+
{"version":3,"sources":["../src/embed/mount.tsx","../src/embed/AgentWidget.tsx","../src/embed/manifest.ts","../src/embed/iife-bootstrap.ts"],"sourcesContent":["import { createRoot, type Root } from \"react-dom/client\";\nimport { closeAgentPanel, openAgentPanel } from \"./controller\";\nimport { AgentWidget } from \"./AgentWidget\";\nimport {\n normalizeAgentTagManifest,\n type AgentTagManifest,\n type NormalizedAgentTagManifest,\n} from \"./manifest\";\n\nexport type AgentRuntimeHandle = {\n customerId: string;\n manifest: NormalizedAgentTagManifest;\n host: HTMLElement;\n root: Root;\n open: () => void;\n close: () => void;\n unmount: () => void;\n};\n\nconst mountedHandles = new Map<string, AgentRuntimeHandle>();\nlet latestCustomerId: string | null = null;\n\nfunction resolveMountHost(manifest: NormalizedAgentTagManifest, script?: HTMLScriptElement | null) {\n const strategy = manifest.mount.strategy ?? \"body\";\n\n if (strategy === \"script-parent\" && script?.parentElement instanceof HTMLElement) {\n return script.parentElement;\n }\n\n if (strategy === \"selector\" && manifest.mount.selector) {\n const target = document.querySelector(manifest.mount.selector);\n if (target instanceof HTMLElement) return target;\n }\n\n return document.body;\n}\n\nfunction createHost(customerId: string) {\n const host = document.createElement(\"div\");\n host.dataset.weblessAgentCustomerId = customerId;\n host.setAttribute(\"data-webless-agent\", customerId);\n return host;\n}\n\nexport function mountAgent(input: {\n manifest: AgentTagManifest;\n script?: HTMLScriptElement | null;\n}): AgentRuntimeHandle {\n const manifest = normalizeAgentTagManifest(input.manifest);\n const existing = mountedHandles.get(manifest.customerId);\n if (existing) {\n return existing;\n }\n\n const mountTarget = resolveMountHost(manifest, input.script ?? null);\n const host = createHost(manifest.customerId);\n mountTarget.append(host);\n\n const root = createRoot(host);\n root.render(<AgentWidget manifest={manifest} />);\n\n const handle: AgentRuntimeHandle = {\n customerId: manifest.customerId,\n manifest,\n host,\n root,\n open: () => {\n openAgentPanel(manifest.customerId);\n },\n close: () => {\n closeAgentPanel(manifest.customerId);\n },\n unmount: () => {\n root.unmount();\n host.remove();\n mountedHandles.delete(manifest.customerId);\n if (latestCustomerId === manifest.customerId) {\n latestCustomerId = null;\n }\n },\n };\n\n mountedHandles.set(manifest.customerId, handle);\n latestCustomerId = manifest.customerId;\n return handle;\n}\n\nexport function unmountAgent(customerId?: string) {\n const id = customerId ?? latestCustomerId;\n if (!id) return false;\n const handle = mountedHandles.get(id);\n if (!handle) return false;\n handle.unmount();\n return true;\n}\n\nexport function getMountedAgent(customerId?: string) {\n if (customerId) return mountedHandles.get(customerId) ?? null;\n if (latestCustomerId) return mountedHandles.get(latestCustomerId) ?? null;\n return mountedHandles.values().next().value ?? null;\n}\n\nexport function bootstrapAgent(manifest: AgentTagManifest, script?: HTMLScriptElement | null) {\n return mountAgent({ manifest, script });\n}\n","import { AgentWidget as WeblessAgentWidget } from \"../react/components/AgentWidget\";\nimport type { NormalizedAgentTagManifest } from \"./manifest\";\n\nexport function AgentWidget({ manifest }: { manifest: NormalizedAgentTagManifest }) {\n return (\n <WeblessAgentWidget\n indexId={manifest.indexId}\n customerId={manifest.customerId}\n version={manifest.version}\n runtimeOrigin={manifest.runtimeOrigin}\n placement={manifest.placement}\n defaultCollapsed\n registerPanelController\n />\n );\n}\n","import { DEFAULT_RUNTIME_ORIGIN, resolveAgentRuntimeConfig } from \"../runtime/config\";\nimport type { AgentIndexVersion } from \"../runtime/types\";\nimport {\n DEFAULT_AGENT_PLACEMENT,\n normalizeAgentPlacement,\n type AgentPlacementConfig,\n} from \"../react/placement\";\n\nexport type { AgentPlacementConfig };\nexport type AgentMountStrategy = \"body\" | \"selector\" | \"script-parent\";\n\nexport type AgentTabVariant = AgentPlacementConfig[\"variant\"];\nexport type AgentTabSide = AgentPlacementConfig[\"side\"];\n\nexport type AgentTagManifest = {\n customerId: string;\n indexId: string;\n runtimeOrigin?: string;\n version?: AgentIndexVersion;\n mount?: {\n selector?: string;\n strategy?: AgentMountStrategy;\n };\n placement?: Partial<AgentPlacementConfig>;\n};\n\nexport { DEFAULT_AGENT_PLACEMENT, normalizeAgentPlacement };\n\nexport function normalizeAgentTagManifest(manifest: AgentTagManifest) {\n const indexId = manifest.indexId.trim();\n if (!indexId) {\n throw new Error(\"Agent manifest requires indexId.\");\n }\n\n const customerId = manifest.customerId.trim();\n if (!customerId) {\n throw new Error(\"Agent manifest requires customerId.\");\n }\n\n const version = manifest.version ?? \"published\";\n if (version !== \"published\" && version !== \"unpublished\") {\n throw new Error(\"Agent manifest version must be published or unpublished.\");\n }\n\n const runtime = resolveAgentRuntimeConfig({\n indexId,\n version,\n runtimeOrigin: manifest.runtimeOrigin?.trim() || DEFAULT_RUNTIME_ORIGIN,\n });\n\n return {\n customerId,\n indexId,\n runtimeOrigin: runtime.origin,\n version,\n mount: {\n selector: manifest.mount?.selector?.trim(),\n strategy: manifest.mount?.strategy ?? \"body\",\n },\n placement: normalizeAgentPlacement(manifest.placement),\n };\n}\n\nexport type NormalizedAgentTagManifest = ReturnType<typeof normalizeAgentTagManifest>;\n","import {\n getMountedAgent,\n mountAgent,\n unmountAgent,\n} from \"./mount\";\nimport type { AgentTagManifest } from \"./manifest\";\n\ndeclare global {\n interface Window {\n WeblessAgent?: WeblessAgentPublicApi;\n }\n}\n\nexport type WeblessAgentPublicApi = {\n mount: (options?: Partial<AgentTagManifest>) => ReturnType<typeof mountAgent>;\n unmount: (customerId?: string) => boolean;\n open: (customerId?: string) => void;\n close: (customerId?: string) => void;\n get: (customerId?: string) => ReturnType<typeof getMountedAgent>;\n};\n\nexport function createWeblessAgentPublicApi(manifest: AgentTagManifest): WeblessAgentPublicApi {\n const script = document.currentScript instanceof HTMLScriptElement ? document.currentScript : null;\n\n function mount(options: Partial<AgentTagManifest> = {}) {\n return mountAgent({\n manifest: {\n ...manifest,\n ...options,\n customerId: manifest.customerId,\n },\n script,\n });\n }\n\n function unmount(customerId?: string) {\n return unmountAgent(customerId ?? manifest.customerId);\n }\n\n function open(customerId?: string) {\n getMountedAgent(customerId ?? manifest.customerId)?.open();\n }\n\n function close(customerId?: string) {\n getMountedAgent(customerId ?? manifest.customerId)?.close();\n }\n\n function get(customerId?: string) {\n return getMountedAgent(customerId ?? manifest.customerId);\n }\n\n const api: WeblessAgentPublicApi = {\n mount,\n unmount,\n open,\n close,\n get,\n };\n\n window.WeblessAgent = api;\n\n void (async () => {\n try {\n mount();\n } catch (error) {\n console.error(\"[Webless] Agent mount failed\", error);\n }\n })();\n\n return api;\n}\n"],"mappings":"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","names":["AgentWidget","jsx","AgentWidget"]}
|
package/dist/index.cjs
CHANGED
|
@@ -42,17 +42,23 @@ var import_client = require("eve/client");
|
|
|
42
42
|
// src/runtime/config.ts
|
|
43
43
|
var DEFAULT_RUNTIME_ORIGIN = "https://runtime.staging.webless.ai";
|
|
44
44
|
var trimTrailingSlash = (value) => value.replace(/\/+$/, "");
|
|
45
|
-
function buildEveHost(origin, indexId) {
|
|
45
|
+
function buildEveHost(origin, indexId, version = "published") {
|
|
46
46
|
const base = trimTrailingSlash(origin);
|
|
47
|
-
|
|
47
|
+
const searchParams = new URLSearchParams({ indexId: indexId.trim() });
|
|
48
|
+
if (version === "unpublished") {
|
|
49
|
+
searchParams.set("version", version);
|
|
50
|
+
}
|
|
51
|
+
return `${base}?${searchParams.toString()}`;
|
|
48
52
|
}
|
|
49
53
|
function resolveAgentRuntimeConfig(input) {
|
|
50
54
|
const origin = trimTrailingSlash(input.runtimeOrigin?.trim() || DEFAULT_RUNTIME_ORIGIN);
|
|
51
55
|
const resolvedIndexId = input.indexId.trim();
|
|
56
|
+
const version = input.version ?? "published";
|
|
52
57
|
return {
|
|
53
58
|
origin,
|
|
54
59
|
indexId: resolvedIndexId,
|
|
55
|
-
|
|
60
|
+
version,
|
|
61
|
+
host: resolvedIndexId ? buildEveHost(origin, resolvedIndexId, version) : origin
|
|
56
62
|
};
|
|
57
63
|
}
|
|
58
64
|
function agentHealthUrl(runtimeOrigin) {
|
|
@@ -73,7 +79,8 @@ function buildAgentStorageKeyPrefix(input) {
|
|
|
73
79
|
if (!indexId) {
|
|
74
80
|
throw new Error("indexId is required to build agent storage keys.");
|
|
75
81
|
}
|
|
76
|
-
|
|
82
|
+
const versionSuffix = input.version === "unpublished" ? ":unpublished" : "";
|
|
83
|
+
return `${DEFAULT_STORAGE_KEY_PREFIX}:${customerId}:${indexId}${versionSuffix}:${normalizeRuntimeOrigin(input.runtimeOrigin)}`;
|
|
77
84
|
}
|
|
78
85
|
function createSessionId() {
|
|
79
86
|
if (typeof crypto !== "undefined" && typeof crypto.randomUUID === "function") {
|
|
@@ -147,13 +154,15 @@ function mapStepLabel(event) {
|
|
|
147
154
|
};
|
|
148
155
|
}
|
|
149
156
|
var AgentSession = class {
|
|
150
|
-
constructor(indexId, runtimeOrigin, visitorSessionId, storeOptions) {
|
|
157
|
+
constructor(indexId, version, runtimeOrigin, visitorSessionId, storeOptions) {
|
|
151
158
|
this.indexId = indexId;
|
|
159
|
+
this.version = version;
|
|
152
160
|
this.runtimeOrigin = runtimeOrigin;
|
|
153
161
|
this.visitorSessionId = visitorSessionId;
|
|
154
162
|
this.storeOptions = storeOptions;
|
|
155
163
|
}
|
|
156
164
|
indexId;
|
|
165
|
+
version;
|
|
157
166
|
runtimeOrigin;
|
|
158
167
|
visitorSessionId;
|
|
159
168
|
storeOptions;
|
|
@@ -184,6 +193,7 @@ var AgentSession = class {
|
|
|
184
193
|
ensureClient() {
|
|
185
194
|
const config = resolveAgentRuntimeConfig({
|
|
186
195
|
indexId: this.indexId,
|
|
196
|
+
version: this.version,
|
|
187
197
|
runtimeOrigin: this.runtimeOrigin
|
|
188
198
|
});
|
|
189
199
|
if (!config.indexId) {
|
|
@@ -283,17 +293,20 @@ function createAgentClient(options) {
|
|
|
283
293
|
throw new Error("indexId is required.");
|
|
284
294
|
}
|
|
285
295
|
const runtimeOrigin = options.runtimeOrigin?.trim() || resolveAgentRuntimeConfig({ indexId }).origin;
|
|
296
|
+
const version = options.version ?? "published";
|
|
286
297
|
const storeOptions = {
|
|
287
298
|
storageKeyPrefix: options.storageKeyPrefix?.trim() || buildAgentStorageKeyPrefix({
|
|
288
299
|
customerId: options.customerId,
|
|
289
300
|
indexId,
|
|
301
|
+
version,
|
|
290
302
|
runtimeOrigin
|
|
291
303
|
})
|
|
292
304
|
};
|
|
293
305
|
const visitorSessionId = options.visitorSessionId?.trim() || getOrCreateVisitorSessionId(storeOptions);
|
|
294
|
-
const session = new AgentSession(indexId, runtimeOrigin, visitorSessionId, storeOptions);
|
|
306
|
+
const session = new AgentSession(indexId, version, runtimeOrigin, visitorSessionId, storeOptions);
|
|
295
307
|
return {
|
|
296
308
|
indexId,
|
|
309
|
+
version,
|
|
297
310
|
runtimeOrigin,
|
|
298
311
|
visitorSessionId,
|
|
299
312
|
sendTurn: (message, sendOptions) => session.sendTurn(
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +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":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,oBAMO;;;ACJA,IAAM,yBAAyB;AAEtC,IAAM,oBAAoB,CAAC,UAAkB,MAAM,QAAQ,QAAQ,EAAE;AAE9D,SAAS,aAAa,QAAgB,SAAyB;AACpE,QAAM,OAAO,kBAAkB,MAAM;AACrC,SAAO,GAAG,IAAI,YAAY,mBAAmB,QAAQ,KAAK,CAAC,CAAC;AAC9D;AAEO,SAAS,0BAA0B,OAGnB;AACrB,QAAM,SAAS,kBAAkB,MAAM,eAAe,KAAK,KAAK,sBAAsB;AACtF,QAAM,kBAAkB,MAAM,QAAQ,KAAK;AAE3C,SAAO;AAAA,IACL;AAAA,IACA,SAAS;AAAA,IACT,MAAM,kBAAkB,aAAa,QAAQ,eAAe,IAAI;AAAA,EAClE;AACF;AAEO,SAAS,eAAe,eAAgC;AAC7D,QAAM,SAAS,kBAAkB,eAAe,KAAK,KAAK,sBAAsB;AAChF,SAAO,GAAG,MAAM;AAClB;;;AC1BA,IAAM,6BAA6B;AAMnC,SAAS,uBAAuB,eAAwB;AACtD,QAAM,UAAU,eAAe,KAAK;AACpC,MAAI,CAAC,QAAS,QAAO;AACrB,SAAO,QAAQ,QAAQ,QAAQ,EAAE;AACnC;AAEO,SAAS,2BAA2B,OAIxC;AACD,QAAM,aAAa,MAAM,YAAY,KAAK,KAAK;AAC/C,QAAM,UAAU,MAAM,QAAQ,KAAK;AACnC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,kDAAkD;AAAA,EACpE;AAEA,SAAO,GAAG,0BAA0B,IAAI,UAAU,IAAI,OAAO,IAAI,uBAAuB,MAAM,aAAa,CAAC;AAC9G;AAEA,SAAS,kBAA0B;AACjC,MAAI,OAAO,WAAW,eAAe,OAAO,OAAO,eAAe,YAAY;AAC5E,WAAO,OAAO,WAAW;AAAA,EAC3B;AACA,SAAO,QAAQ,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC,GAAG,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC;AAC9E;AAEA,SAAS,cAAc,SAA+B;AACpD,SAAO,SAAS,kBAAkB,KAAK,KAAK;AAC9C;AAEO,SAAS,4BAA4B,SAAuC;AACjF,QAAM,SAAS,cAAc,OAAO;AACpC,QAAM,aAAa,GAAG,MAAM;AAE5B,MAAI,OAAO,mBAAmB,aAAa;AACzC,WAAO,gBAAgB;AAAA,EACzB;AAEA,QAAM,WAAW,eAAe,QAAQ,UAAU,GAAG,KAAK;AAC1D,MAAI,SAAU,QAAO;AAErB,QAAM,OAAO,gBAAgB;AAC7B,iBAAe,QAAQ,YAAY,IAAI;AACvC,SAAO;AACT;AAEO,SAAS,sBAAsB,SAA+B;AACnE,MAAI,OAAO,mBAAmB,YAAa;AAE3C,QAAM,SAAS,cAAc,OAAO;AACpC,iBAAe,WAAW,GAAG,MAAM,mBAAmB;AACxD;AAEA,SAAS,oBAAoB,kBAA0B,QAAgB;AACrE,SAAO,GAAG,MAAM,QAAQ,gBAAgB;AAC1C;AAEA,SAAS,sBAAsB,kBAA0B,QAAgB;AACvE,SAAO,GAAG,MAAM,QAAQ,gBAAgB;AAC1C;AAEO,SAAS,0BACd,kBACA,SAC8B;AAC9B,MAAI,OAAO,mBAAmB,eAAe,CAAC,iBAAiB,KAAK,EAAG,QAAO;AAE9E,QAAM,SAAS,cAAc,OAAO;AACpC,QAAM,YAAY,eAAe,QAAQ,oBAAoB,kBAAkB,MAAM,CAAC,GAAG,KAAK;AAC9F,MAAI,CAAC,UAAW,QAAO;AAEvB,QAAM,WAAW,eAAe,QAAQ,sBAAsB,kBAAkB,MAAM,CAAC;AACvF,QAAM,cAAc,WAAW,OAAO,SAAS,UAAU,EAAE,IAAI;AAE/D,SAAO;AAAA,IACL;AAAA,IACA,aAAa,OAAO,SAAS,WAAW,KAAK,eAAe,IAAI,cAAc;AAAA,EAChF;AACF;AAEO,SAAS,0BACd,kBACA,WACA,aACA,SACA;AACA,MAAI,OAAO,mBAAmB,eAAe,CAAC,iBAAiB,KAAK,KAAK,CAAC,UAAU,KAAK,GAAG;AAC1F;AAAA,EACF;AAEA,QAAM,SAAS,cAAc,OAAO;AACpC,iBAAe,QAAQ,oBAAoB,kBAAkB,MAAM,GAAG,SAAS;AAC/E,iBAAe;AAAA,IACb,sBAAsB,kBAAkB,MAAM;AAAA,IAC9C,OAAO,KAAK,IAAI,GAAG,WAAW,CAAC;AAAA,EACjC;AACF;AAEO,SAAS,2BACd,kBACA,SACA;AACA,MAAI,OAAO,mBAAmB,eAAe,CAAC,iBAAiB,KAAK,EAAG;AACvE,QAAM,SAAS,cAAc,OAAO;AACpC,iBAAe,WAAW,oBAAoB,kBAAkB,MAAM,CAAC;AACvE,iBAAe,WAAW,sBAAsB,kBAAkB,MAAM,CAAC;AAC3E;;;AF5FA,SAAS,aAAa,OAAsE;AAC1F,MAAI,MAAM,SAAS,eAAgB,QAAO;AAC1C,QAAM,YAAY,MAAM,KAAK;AAC7B,SAAO;AAAA,IACL,OAAO;AAAA,IACP,QAAQ,OAAO,cAAc,WAAW,QAAQ,YAAY,CAAC,KAAK;AAAA,EACpE;AACF;AAEA,IAAM,eAAN,MAAmB;AAAA,EAOjB,YACmB,SACA,eACA,kBACA,cACjB;AAJiB;AACA;AACA;AACA;AAAA,EAChB;AAAA,EAJgB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAVX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAiB;AAAA,EASzB,qBAAyC;AACvC,WACE,KAAK,SAAS,MAAM,aACpB,0BAA0B,KAAK,kBAAkB,KAAK,YAAY,GAAG;AAAA,EAEzE;AAAA,EAEA,QAAQ;AACN,SAAK,KAAK,gBAAgB,OAAO,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AACjD,SAAK,iBAAiB;AACtB,SAAK,UAAU;AACf,SAAK,iBAAiB;AACtB,+BAA2B,KAAK,kBAAkB,KAAK,YAAY;AAAA,EACrE;AAAA,EAEQ,qBAAqB,SAAwB;AACnD;AAAA,MACE,KAAK;AAAA,MACL,QAAQ,MAAM;AAAA,MACd,QAAQ,MAAM;AAAA,MACd,KAAK;AAAA,IACP;AAAA,EACF;AAAA,EAEQ,eAAuB;AAC7B,UAAM,SAAS,0BAA0B;AAAA,MACvC,SAAS,KAAK;AAAA,MACd,eAAe,KAAK;AAAA,IACtB,CAAC;AACD,QAAI,CAAC,OAAO,SAAS;AACnB,YAAM,IAAI,MAAM,sBAAsB;AAAA,IACxC;AAEA,QAAI,KAAK,UAAU,KAAK,eAAe,OAAO,MAAM;AAClD,aAAO,KAAK;AAAA,IACd;AAEA,SAAK,MAAM;AACX,SAAK,SAAS,IAAI,qBAAO,EAAE,MAAM,OAAO,KAAK,CAAC;AAC9C,SAAK,aAAa,OAAO;AACzB,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,uBAAuB,QAA2C;AACxE,UAAM,YAAY,0BAA0B,KAAK,kBAAkB,KAAK,YAAY;AACpF,QAAI,CAAC,WAAW,UAAW,QAAO;AAElC,SAAK,iBAAiB;AACtB,WAAO,OAAO,SAAS,OAAO,UAAU,WAAW;AAAA,MACjD,aAAa,UAAU;AAAA,IACzB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,SACJ,SACA,QACA,UACiB;AACjB,UAAM,SAAS,KAAK,aAAa;AACjC,QAAI;AACJ,QAAI,UAAU,KAAK,WAAW,KAAK,uBAAuB,MAAM;AAEhE,QAAI,SAAS;AACX,WAAK,UAAU;AACf,UAAI;AACF,mBAAW,MAAM,QAAQ,KAAK,SAAS,EAAE,OAAO,CAAC;AAAA,MACnD,SAAS,OAAO;AACd,YACE,iBAAiB,6BACjB,MAAM,WAAW,OACjB,MAAM,SAAS,sBACf;AACA,qCAA2B,KAAK,kBAAkB,KAAK,YAAY;AACnE,eAAK,UAAU;AACf,oBAAU;AAAA,QACZ,OAAO;AACL,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,UAAU;AACb,YAAM,UAAU,MAAM,OAAO,SAAS,OAAO,EAAE,SAAS,OAAO,CAAC;AAChE,iBAAW,QAAQ;AACnB,gBAAU,QAAQ;AAClB,WAAK,UAAU;AACf,WAAK,iBAAiB;AACtB,WAAK,qBAAqB,OAAO;AAAA,IACnC;AAEA,SAAK,iBAAiB;AACtB,QAAI,WAAW,KAAK;AAEpB,QAAI;AACF,uBAAiB,SAAS,UAAU;AAClC,YAAI,OAAO,QAAS;AAEpB,cAAM,OAAO,aAAa,KAAK;AAC/B,YAAI,KAAM,UAAS,SAAS,KAAK,OAAO,KAAK,MAAM;AAEnD,YAAI,MAAM,SAAS,oBAAoB;AACrC,gBAAM,EAAE,cAAc,aAAa,IAAI,MAAM;AAC7C,cAAI,QAAQ;AACZ,cAAI,aAAa,WAAW,QAAQ,GAAG;AACrC,oBAAQ,aAAa,MAAM,SAAS,MAAM;AAC1C,uBAAW;AAAA,UACb,WAAW,cAAc;AACvB,wBAAY;AAAA,UACd;AACA,cAAI,MAAO,UAAS,QAAQ,KAAK;AAAA,QACnC;AAEA,YAAI,MAAM,SAAS,qBAAqB;AACtC,mBAAS,aAAa;AAAA,QACxB;AAEA,YAAI,MAAM,SAAS,kBAAkB;AACnC,gBAAM,IAAI,MAAM,MAAM,KAAK,WAAW,MAAM,KAAK,IAAI;AAAA,QACvD;AAAA,MACF;AAAA,IACF,UAAE;AACA,WAAK,iBAAiB;AACtB,WAAK,iBAAiB;AACtB,UAAI,SAAS;AACX,aAAK,qBAAqB,OAAO;AAAA,MACnC;AAAA,IACF;AAEA,QAAI,CAAC,SAAS,KAAK,KAAK,CAAC,OAAO,SAAS;AACvC,YAAM,IAAI,MAAM,6BAA6B;AAAA,IAC/C;AAEA,QAAI,OAAO,SAAS;AAClB,YAAM,SAAS,OAAO,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IACxC;AAEA,WAAO,SAAS,KAAK;AAAA,EACvB;AAAA,EAEA,eAAe;AACb,SAAK,gBAAgB,OAAO,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EAC9C;AACF;AAEO,SAAS,kBAAkB,SAA0C;AAC1E,QAAM,UAAU,QAAQ,QAAQ,KAAK;AACrC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,sBAAsB;AAAA,EACxC;AAEA,QAAM,gBAAgB,QAAQ,eAAe,KAAK,KAAK,0BAA0B,EAAE,QAAQ,CAAC,EAAE;AAC9F,QAAM,eAAoC;AAAA,IACxC,kBACE,QAAQ,kBAAkB,KAAK,KAC/B,2BAA2B;AAAA,MACzB,YAAY,QAAQ;AAAA,MACpB;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACL;AACA,QAAM,mBACJ,QAAQ,kBAAkB,KAAK,KAAK,4BAA4B,YAAY;AAE9E,QAAM,UAAU,IAAI,aAAa,SAAS,eAAe,kBAAkB,YAAY;AAEvF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU,CAAC,SAAS,gBAClB,QAAQ;AAAA,MACN;AAAA,MACA,YAAY,UAAU,IAAI,gBAAgB,EAAE;AAAA,MAC5C,YAAY;AAAA,IACd;AAAA,IACF,OAAO,MAAM,QAAQ,MAAM;AAAA,IAC3B,cAAc,MAAM,QAAQ,aAAa;AAAA,IACzC,oBAAoB,MAAM,QAAQ,mBAAmB;AAAA,EACvD;AACF;;;AGjOA,IAAAA,iBAA4B;AAErB,SAAS,iBAAiB,OAAwB;AACvD,MAAI,iBAAiB,4BAAa;AAChC,QAAI,MAAM,WAAW,OAAO,MAAM,SAAS,kBAAkB;AAC3D,aAAO;AAAA,IACT;AACA,QAAI,MAAM,WAAW,OAAO,MAAM,SAAS,qBAAqB;AAC9D,aAAO;AAAA,IACT;AACA,QAAI,MAAM,WAAW,OAAO,MAAM,SAAS,sBAAsB;AAC/D,aAAO;AAAA,IACT;AACA,WAAO,MAAM,WAAW,kBAAkB,MAAM,MAAM;AAAA,EACxD;AACA,MAAI,iBAAiB,gBAAgB,MAAM,SAAS,cAAc;AAChE,WAAO;AAAA,EACT;AACA,MAAI,iBAAiB,MAAO,QAAO,MAAM;AACzC,SAAO;AACT;;;AChBA,eAAsB,gBACpB,eACA,YAA0B,OACE;AAC5B,QAAM,YAAY,eAAe,aAAa;AAE9C,MAAI;AACF,UAAM,WAAW,MAAM,UAAU,WAAW;AAAA,MAC1C,SAAS,EAAE,QAAQ,mBAAmB;AAAA,MACtC,OAAO;AAAA,IACT,CAAC;AACD,QAAI,CAAC,SAAS,IAAI;AAChB,aAAO,EAAE,IAAI,OAAO,QAAQ,wBAAwB,SAAS,MAAM,IAAI;AAAA,IACzE;AACA,UAAM,UAAW,MAAM,SAAS,KAAK;AACrC,QAAI,QAAQ,OAAO,MAAM;AACvB,aAAO,EAAE,IAAI,MAAM,QAAQ,QAAQ,UAAU,QAAQ;AAAA,IACvD;AACA,WAAO,EAAE,IAAI,OAAO,QAAQ,qCAAqC;AAAA,EACnE,SAAS,OAAO;AACd,WAAO,EAAE,IAAI,OAAO,QAAQ,iBAAiB,KAAK,KAAK,sBAAsB;AAAA,EAC/E;AACF;","names":["import_client"]}
|
|
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 AgentIndexVersion,\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 AgentIndexVersion,\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 version: AgentIndexVersion,\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 version: this.version,\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 version = options.version ?? \"published\";\n const storeOptions: SessionStoreOptions = {\n storageKeyPrefix:\n options.storageKeyPrefix?.trim() ||\n buildAgentStorageKeyPrefix({\n customerId: options.customerId,\n indexId,\n version,\n runtimeOrigin,\n }),\n };\n const visitorSessionId =\n options.visitorSessionId?.trim() || getOrCreateVisitorSessionId(storeOptions);\n\n const session = new AgentSession(indexId, version, runtimeOrigin, visitorSessionId, storeOptions);\n\n return {\n indexId,\n version,\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 { AgentIndexVersion, 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(\n origin: string,\n indexId: string,\n version: AgentIndexVersion = \"published\",\n): string {\n const base = trimTrailingSlash(origin);\n const searchParams = new URLSearchParams({ indexId: indexId.trim() });\n if (version === \"unpublished\") {\n searchParams.set(\"version\", version);\n }\n return `${base}?${searchParams.toString()}`;\n}\n\nexport function resolveAgentRuntimeConfig(input: {\n indexId: string;\n runtimeOrigin?: string;\n version?: AgentIndexVersion;\n}): AgentRuntimeConfig {\n const origin = trimTrailingSlash(input.runtimeOrigin?.trim() || DEFAULT_RUNTIME_ORIGIN);\n const resolvedIndexId = input.indexId.trim();\n const version = input.version ?? \"published\";\n\n return {\n origin,\n indexId: resolvedIndexId,\n version,\n host: resolvedIndexId ? buildEveHost(origin, resolvedIndexId, version) : 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 { AgentIndexVersion, 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 version?: AgentIndexVersion;\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 const versionSuffix = input.version === \"unpublished\" ? \":unpublished\" : \"\";\n return `${DEFAULT_STORAGE_KEY_PREFIX}:${customerId}:${indexId}${versionSuffix}:${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"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
type AgentIndexVersion = "published" | "unpublished";
|
|
1
2
|
type AgentRuntimeConfig = {
|
|
2
3
|
origin: string;
|
|
3
4
|
indexId: string;
|
|
5
|
+
version: AgentIndexVersion;
|
|
4
6
|
host: string;
|
|
5
7
|
};
|
|
6
8
|
type AgentStreamHandlers = {
|
|
@@ -17,8 +19,10 @@ type PersistedAgentSession = {
|
|
|
17
19
|
streamIndex: number;
|
|
18
20
|
};
|
|
19
21
|
type AgentClientOptions = {
|
|
20
|
-
/**
|
|
22
|
+
/** Index id sent as `indexId` query param to the runtime. */
|
|
21
23
|
indexId: string;
|
|
24
|
+
/** Selects the published index by default, or its unpublished preview. */
|
|
25
|
+
version?: AgentIndexVersion;
|
|
22
26
|
/** Customer id used to isolate browser session storage when omitted from storageKeyPrefix. */
|
|
23
27
|
customerId?: string;
|
|
24
28
|
/** Agent runtime origin, e.g. `https://runtime.staging.webless.ai`. */
|
|
@@ -30,6 +34,7 @@ type AgentClientOptions = {
|
|
|
30
34
|
};
|
|
31
35
|
type AgentClient = {
|
|
32
36
|
readonly indexId: string;
|
|
37
|
+
readonly version: AgentIndexVersion;
|
|
33
38
|
readonly runtimeOrigin: string;
|
|
34
39
|
readonly visitorSessionId: string;
|
|
35
40
|
sendTurn: (message: string, options: AgentSendTurnOptions) => Promise<string>;
|
|
@@ -45,10 +50,11 @@ type AgentHealthResult = {
|
|
|
45
50
|
declare function createAgentClient(options: AgentClientOptions): AgentClient;
|
|
46
51
|
|
|
47
52
|
declare const DEFAULT_RUNTIME_ORIGIN = "https://runtime.staging.webless.ai";
|
|
48
|
-
declare function buildEveHost(origin: string, indexId: string): string;
|
|
53
|
+
declare function buildEveHost(origin: string, indexId: string, version?: AgentIndexVersion): string;
|
|
49
54
|
declare function resolveAgentRuntimeConfig(input: {
|
|
50
55
|
indexId: string;
|
|
51
56
|
runtimeOrigin?: string;
|
|
57
|
+
version?: AgentIndexVersion;
|
|
52
58
|
}): AgentRuntimeConfig;
|
|
53
59
|
declare function agentHealthUrl(runtimeOrigin?: string): string;
|
|
54
60
|
|
|
@@ -63,6 +69,7 @@ declare function buildAgentStorageKeyPrefix(input: {
|
|
|
63
69
|
customerId?: string;
|
|
64
70
|
indexId: string;
|
|
65
71
|
runtimeOrigin?: string;
|
|
72
|
+
version?: AgentIndexVersion;
|
|
66
73
|
}): string;
|
|
67
74
|
declare function getOrCreateVisitorSessionId(options?: SessionStoreOptions): string;
|
|
68
75
|
declare function clearVisitorSessionId(options?: SessionStoreOptions): void;
|
|
@@ -70,4 +77,4 @@ declare function loadPersistedAgentSession(visitorSessionId: string, options?: S
|
|
|
70
77
|
declare function savePersistedAgentSession(visitorSessionId: string, sessionId: string, streamIndex: number, options?: SessionStoreOptions): void;
|
|
71
78
|
declare function clearPersistedAgentSession(visitorSessionId: string, options?: SessionStoreOptions): void;
|
|
72
79
|
|
|
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 };
|
|
80
|
+
export { type AgentClient, type AgentClientOptions, type AgentHealthResult, type AgentIndexVersion, 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 };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
type AgentIndexVersion = "published" | "unpublished";
|
|
1
2
|
type AgentRuntimeConfig = {
|
|
2
3
|
origin: string;
|
|
3
4
|
indexId: string;
|
|
5
|
+
version: AgentIndexVersion;
|
|
4
6
|
host: string;
|
|
5
7
|
};
|
|
6
8
|
type AgentStreamHandlers = {
|
|
@@ -17,8 +19,10 @@ type PersistedAgentSession = {
|
|
|
17
19
|
streamIndex: number;
|
|
18
20
|
};
|
|
19
21
|
type AgentClientOptions = {
|
|
20
|
-
/**
|
|
22
|
+
/** Index id sent as `indexId` query param to the runtime. */
|
|
21
23
|
indexId: string;
|
|
24
|
+
/** Selects the published index by default, or its unpublished preview. */
|
|
25
|
+
version?: AgentIndexVersion;
|
|
22
26
|
/** Customer id used to isolate browser session storage when omitted from storageKeyPrefix. */
|
|
23
27
|
customerId?: string;
|
|
24
28
|
/** Agent runtime origin, e.g. `https://runtime.staging.webless.ai`. */
|
|
@@ -30,6 +34,7 @@ type AgentClientOptions = {
|
|
|
30
34
|
};
|
|
31
35
|
type AgentClient = {
|
|
32
36
|
readonly indexId: string;
|
|
37
|
+
readonly version: AgentIndexVersion;
|
|
33
38
|
readonly runtimeOrigin: string;
|
|
34
39
|
readonly visitorSessionId: string;
|
|
35
40
|
sendTurn: (message: string, options: AgentSendTurnOptions) => Promise<string>;
|
|
@@ -45,10 +50,11 @@ type AgentHealthResult = {
|
|
|
45
50
|
declare function createAgentClient(options: AgentClientOptions): AgentClient;
|
|
46
51
|
|
|
47
52
|
declare const DEFAULT_RUNTIME_ORIGIN = "https://runtime.staging.webless.ai";
|
|
48
|
-
declare function buildEveHost(origin: string, indexId: string): string;
|
|
53
|
+
declare function buildEveHost(origin: string, indexId: string, version?: AgentIndexVersion): string;
|
|
49
54
|
declare function resolveAgentRuntimeConfig(input: {
|
|
50
55
|
indexId: string;
|
|
51
56
|
runtimeOrigin?: string;
|
|
57
|
+
version?: AgentIndexVersion;
|
|
52
58
|
}): AgentRuntimeConfig;
|
|
53
59
|
declare function agentHealthUrl(runtimeOrigin?: string): string;
|
|
54
60
|
|
|
@@ -63,6 +69,7 @@ declare function buildAgentStorageKeyPrefix(input: {
|
|
|
63
69
|
customerId?: string;
|
|
64
70
|
indexId: string;
|
|
65
71
|
runtimeOrigin?: string;
|
|
72
|
+
version?: AgentIndexVersion;
|
|
66
73
|
}): string;
|
|
67
74
|
declare function getOrCreateVisitorSessionId(options?: SessionStoreOptions): string;
|
|
68
75
|
declare function clearVisitorSessionId(options?: SessionStoreOptions): void;
|
|
@@ -70,4 +77,4 @@ declare function loadPersistedAgentSession(visitorSessionId: string, options?: S
|
|
|
70
77
|
declare function savePersistedAgentSession(visitorSessionId: string, sessionId: string, streamIndex: number, options?: SessionStoreOptions): void;
|
|
71
78
|
declare function clearPersistedAgentSession(visitorSessionId: string, options?: SessionStoreOptions): void;
|
|
72
79
|
|
|
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 };
|
|
80
|
+
export { type AgentClient, type AgentClientOptions, type AgentHealthResult, type AgentIndexVersion, 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 };
|
package/dist/index.js
CHANGED
|
@@ -7,17 +7,23 @@ import {
|
|
|
7
7
|
// src/runtime/config.ts
|
|
8
8
|
var DEFAULT_RUNTIME_ORIGIN = "https://runtime.staging.webless.ai";
|
|
9
9
|
var trimTrailingSlash = (value) => value.replace(/\/+$/, "");
|
|
10
|
-
function buildEveHost(origin, indexId) {
|
|
10
|
+
function buildEveHost(origin, indexId, version = "published") {
|
|
11
11
|
const base = trimTrailingSlash(origin);
|
|
12
|
-
|
|
12
|
+
const searchParams = new URLSearchParams({ indexId: indexId.trim() });
|
|
13
|
+
if (version === "unpublished") {
|
|
14
|
+
searchParams.set("version", version);
|
|
15
|
+
}
|
|
16
|
+
return `${base}?${searchParams.toString()}`;
|
|
13
17
|
}
|
|
14
18
|
function resolveAgentRuntimeConfig(input) {
|
|
15
19
|
const origin = trimTrailingSlash(input.runtimeOrigin?.trim() || DEFAULT_RUNTIME_ORIGIN);
|
|
16
20
|
const resolvedIndexId = input.indexId.trim();
|
|
21
|
+
const version = input.version ?? "published";
|
|
17
22
|
return {
|
|
18
23
|
origin,
|
|
19
24
|
indexId: resolvedIndexId,
|
|
20
|
-
|
|
25
|
+
version,
|
|
26
|
+
host: resolvedIndexId ? buildEveHost(origin, resolvedIndexId, version) : origin
|
|
21
27
|
};
|
|
22
28
|
}
|
|
23
29
|
function agentHealthUrl(runtimeOrigin) {
|
|
@@ -38,7 +44,8 @@ function buildAgentStorageKeyPrefix(input) {
|
|
|
38
44
|
if (!indexId) {
|
|
39
45
|
throw new Error("indexId is required to build agent storage keys.");
|
|
40
46
|
}
|
|
41
|
-
|
|
47
|
+
const versionSuffix = input.version === "unpublished" ? ":unpublished" : "";
|
|
48
|
+
return `${DEFAULT_STORAGE_KEY_PREFIX}:${customerId}:${indexId}${versionSuffix}:${normalizeRuntimeOrigin(input.runtimeOrigin)}`;
|
|
42
49
|
}
|
|
43
50
|
function createSessionId() {
|
|
44
51
|
if (typeof crypto !== "undefined" && typeof crypto.randomUUID === "function") {
|
|
@@ -112,13 +119,15 @@ function mapStepLabel(event) {
|
|
|
112
119
|
};
|
|
113
120
|
}
|
|
114
121
|
var AgentSession = class {
|
|
115
|
-
constructor(indexId, runtimeOrigin, visitorSessionId, storeOptions) {
|
|
122
|
+
constructor(indexId, version, runtimeOrigin, visitorSessionId, storeOptions) {
|
|
116
123
|
this.indexId = indexId;
|
|
124
|
+
this.version = version;
|
|
117
125
|
this.runtimeOrigin = runtimeOrigin;
|
|
118
126
|
this.visitorSessionId = visitorSessionId;
|
|
119
127
|
this.storeOptions = storeOptions;
|
|
120
128
|
}
|
|
121
129
|
indexId;
|
|
130
|
+
version;
|
|
122
131
|
runtimeOrigin;
|
|
123
132
|
visitorSessionId;
|
|
124
133
|
storeOptions;
|
|
@@ -149,6 +158,7 @@ var AgentSession = class {
|
|
|
149
158
|
ensureClient() {
|
|
150
159
|
const config = resolveAgentRuntimeConfig({
|
|
151
160
|
indexId: this.indexId,
|
|
161
|
+
version: this.version,
|
|
152
162
|
runtimeOrigin: this.runtimeOrigin
|
|
153
163
|
});
|
|
154
164
|
if (!config.indexId) {
|
|
@@ -248,17 +258,20 @@ function createAgentClient(options) {
|
|
|
248
258
|
throw new Error("indexId is required.");
|
|
249
259
|
}
|
|
250
260
|
const runtimeOrigin = options.runtimeOrigin?.trim() || resolveAgentRuntimeConfig({ indexId }).origin;
|
|
261
|
+
const version = options.version ?? "published";
|
|
251
262
|
const storeOptions = {
|
|
252
263
|
storageKeyPrefix: options.storageKeyPrefix?.trim() || buildAgentStorageKeyPrefix({
|
|
253
264
|
customerId: options.customerId,
|
|
254
265
|
indexId,
|
|
266
|
+
version,
|
|
255
267
|
runtimeOrigin
|
|
256
268
|
})
|
|
257
269
|
};
|
|
258
270
|
const visitorSessionId = options.visitorSessionId?.trim() || getOrCreateVisitorSessionId(storeOptions);
|
|
259
|
-
const session = new AgentSession(indexId, runtimeOrigin, visitorSessionId, storeOptions);
|
|
271
|
+
const session = new AgentSession(indexId, version, runtimeOrigin, visitorSessionId, storeOptions);
|
|
260
272
|
return {
|
|
261
273
|
indexId,
|
|
274
|
+
version,
|
|
262
275
|
runtimeOrigin,
|
|
263
276
|
visitorSessionId,
|
|
264
277
|
sendTurn: (message, sendOptions) => session.sendTurn(
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/runtime/client.ts","../src/runtime/config.ts","../src/runtime/session-store.ts","../src/runtime/errors.ts","../src/runtime/health.ts"],"sourcesContent":["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":["ClientError"]}
|
|
1
|
+
{"version":3,"sources":["../src/runtime/client.ts","../src/runtime/config.ts","../src/runtime/session-store.ts","../src/runtime/errors.ts","../src/runtime/health.ts"],"sourcesContent":["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 AgentIndexVersion,\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 version: AgentIndexVersion,\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 version: this.version,\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 version = options.version ?? \"published\";\n const storeOptions: SessionStoreOptions = {\n storageKeyPrefix:\n options.storageKeyPrefix?.trim() ||\n buildAgentStorageKeyPrefix({\n customerId: options.customerId,\n indexId,\n version,\n runtimeOrigin,\n }),\n };\n const visitorSessionId =\n options.visitorSessionId?.trim() || getOrCreateVisitorSessionId(storeOptions);\n\n const session = new AgentSession(indexId, version, runtimeOrigin, visitorSessionId, storeOptions);\n\n return {\n indexId,\n version,\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 { AgentIndexVersion, 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(\n origin: string,\n indexId: string,\n version: AgentIndexVersion = \"published\",\n): string {\n const base = trimTrailingSlash(origin);\n const searchParams = new URLSearchParams({ indexId: indexId.trim() });\n if (version === \"unpublished\") {\n searchParams.set(\"version\", version);\n }\n return `${base}?${searchParams.toString()}`;\n}\n\nexport function resolveAgentRuntimeConfig(input: {\n indexId: string;\n runtimeOrigin?: string;\n version?: AgentIndexVersion;\n}): AgentRuntimeConfig {\n const origin = trimTrailingSlash(input.runtimeOrigin?.trim() || DEFAULT_RUNTIME_ORIGIN);\n const resolvedIndexId = input.indexId.trim();\n const version = input.version ?? \"published\";\n\n return {\n origin,\n indexId: resolvedIndexId,\n version,\n host: resolvedIndexId ? buildEveHost(origin, resolvedIndexId, version) : 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 { AgentIndexVersion, 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 version?: AgentIndexVersion;\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 const versionSuffix = input.version === \"unpublished\" ? \":unpublished\" : \"\";\n return `${DEFAULT_STORAGE_KEY_PREFIX}:${customerId}:${indexId}${versionSuffix}:${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":["ClientError"]}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
2
|
|
|
3
|
+
type AgentIndexVersion = "published" | "unpublished";
|
|
4
|
+
|
|
3
5
|
type AssistTabVariant = "outline" | "ask" | "fill";
|
|
4
6
|
type AssistTabSide = "right" | "left" | "top" | "bottom";
|
|
5
7
|
declare function AssistEdgeTab({ variant, side, along, inset, visible, onOpen, }: {
|
|
@@ -20,4 +22,4 @@ type AgentPlacementConfig = {
|
|
|
20
22
|
declare const DEFAULT_AGENT_PLACEMENT: AgentPlacementConfig;
|
|
21
23
|
declare function normalizeAgentPlacement(placement?: Partial<AgentPlacementConfig>): AgentPlacementConfig;
|
|
22
24
|
|
|
23
|
-
export { type
|
|
25
|
+
export { type AgentIndexVersion as A, DEFAULT_AGENT_PLACEMENT as D, type AgentPlacementConfig as a, AssistEdgeTab as b, type AssistTabSide as c, type AssistTabVariant as d, normalizeAgentPlacement as n };
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
2
|
|
|
3
|
+
type AgentIndexVersion = "published" | "unpublished";
|
|
4
|
+
|
|
3
5
|
type AssistTabVariant = "outline" | "ask" | "fill";
|
|
4
6
|
type AssistTabSide = "right" | "left" | "top" | "bottom";
|
|
5
7
|
declare function AssistEdgeTab({ variant, side, along, inset, visible, onOpen, }: {
|
|
@@ -20,4 +22,4 @@ type AgentPlacementConfig = {
|
|
|
20
22
|
declare const DEFAULT_AGENT_PLACEMENT: AgentPlacementConfig;
|
|
21
23
|
declare function normalizeAgentPlacement(placement?: Partial<AgentPlacementConfig>): AgentPlacementConfig;
|
|
22
24
|
|
|
23
|
-
export { type
|
|
25
|
+
export { type AgentIndexVersion as A, DEFAULT_AGENT_PLACEMENT as D, type AgentPlacementConfig as a, AssistEdgeTab as b, type AssistTabSide as c, type AssistTabVariant as d, normalizeAgentPlacement as n };
|