@webless/agent 0.2.12 → 0.2.14
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-K52TJUV6.js → chunk-6FNE65AR.js} +144 -37
- package/dist/chunk-6FNE65AR.js.map +1 -0
- package/dist/embed.cjs +143 -36
- package/dist/embed.cjs.map +1 -1
- package/dist/embed.js +1 -1
- package/dist/index.cjs +72 -25
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +72 -25
- package/dist/index.js.map +1 -1
- package/dist/react.cjs +143 -36
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +4 -2
- package/dist/react.d.ts +4 -2
- package/dist/react.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-K52TJUV6.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/runtime/client.ts","../src/runtime/capability.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 {\n createAgentRuntimeCapability,\n type AgentRuntimeCapability,\n withCapabilityRefresh,\n} from \"./capability\";\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 AgentResumeTurnOptions,\n AgentSendTurnOptions,\n AgentStreamHandlers,\n} from \"./types\";\n\nfunction isTurnBoundary(event: MessageStreamEvent) {\n return (\n event.type === \"session.waiting\" ||\n event.type === \"session.completed\" ||\n event.type === \"session.failed\"\n );\n}\n\nfunction applyMessageEvent(\n event: MessageStreamEvent,\n rendered: string,\n handlers: AgentStreamHandlers,\n) {\n const step = mapStepLabel(event);\n if (step) handlers.onStep?.(step.label, step.detail);\n\n if (event.type === \"session.failed\") {\n throw new Error(event.data.message || event.data.code);\n }\n\n if (event.type === \"message.completed\") {\n handlers.onComplete?.();\n }\n\n if (event.type !== \"message.appended\") return rendered;\n\n const { messageDelta, messageSoFar } = event.data;\n let delta = messageDelta;\n let next = rendered;\n if (messageSoFar.startsWith(rendered)) {\n delta = messageSoFar.slice(rendered.length);\n next = messageSoFar;\n } else if (messageDelta) {\n next += messageDelta;\n }\n if (delta) handlers.onDelta(delta);\n return next;\n}\n\nfunction latestTurnEvents(events: readonly MessageStreamEvent[]) {\n let startIndex = -1;\n for (let index = events.length - 1; index >= 0; index -= 1) {\n if (events[index]?.type === \"message.received\") {\n startIndex = index;\n break;\n }\n }\n return startIndex >= 0 ? events.slice(startIndex) : [];\n}\n\nfunction renderTurn(events: readonly MessageStreamEvent[]) {\n let rendered = \"\";\n for (const event of events) {\n if (event.type !== \"message.appended\") continue;\n const { messageDelta, messageSoFar } = event.data;\n if (messageSoFar.startsWith(rendered)) {\n rendered = messageSoFar;\n } else if (messageDelta) {\n rendered += messageDelta;\n }\n }\n return rendered;\n}\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 readonly capability: AgentRuntimeCapability;\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 this.capability = createAgentRuntimeCapability({\n indexId,\n runtimeOrigin,\n version,\n visitorSessionId,\n });\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 if (this.activeResponse) {\n void this.activeResponse.cancel().catch(() => {});\n } else {\n void this.session?.cancel().catch(() => {});\n }\n this.activeResponse = undefined;\n this.session = undefined;\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.activeResponse = undefined;\n this.session = undefined;\n this.client = new Client({\n auth: { bearer: () => this.capability.getAccessToken() },\n host: config.host,\n redirect: \"error\",\n });\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 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 const activeSession = session;\n response = await withCapabilityRefresh(this.capability, () =>\n activeSession.send(message, { signal }),\n );\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 withCapabilityRefresh(this.capability, () =>\n client.sessions.create({ message, signal }),\n );\n response = created.response;\n session = created.session;\n this.session = session;\n this.persistSessionCursor(session);\n }\n\n this.activeResponse = response;\n let streamIndex = session?.state.streamIndex ?? 0;\n let rendered = \"\";\n\n try {\n for await (const event of response) {\n if (signal.aborted) break;\n rendered = applyMessageEvent(event, rendered, handlers);\n streamIndex += 1;\n if (session) {\n savePersistedAgentSession(\n this.visitorSessionId,\n session.state.sessionId,\n streamIndex,\n this.storeOptions,\n );\n }\n }\n } finally {\n this.activeResponse = undefined;\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 return rendered.trim();\n }\n\n async resumeTurn(\n message: string,\n signal: AbortSignal,\n handlers: AgentStreamHandlers,\n initialText = \"\",\n ): Promise<string | null> {\n const persisted = loadPersistedAgentSession(this.visitorSessionId, this.storeOptions);\n if (!persisted) return null;\n\n const client = this.ensureClient();\n const attached = client.sessions.attach(persisted.sessionId, {\n streamIndex: persisted.streamIndex,\n });\n const snapshot = await withCapabilityRefresh(this.capability, () =>\n attached.snapshot({ signal }),\n );\n const turnEvents = latestTurnEvents(snapshot.events);\n const received = turnEvents[0];\n if (received?.type !== \"message.received\" || received.data.message !== message) {\n return null;\n }\n let rendered = renderTurn(turnEvents);\n\n if (rendered.startsWith(initialText)) {\n const missedText = rendered.slice(initialText.length);\n if (missedText) handlers.onDelta(missedText);\n } else if (initialText.startsWith(rendered)) {\n rendered = initialText;\n } else if (!initialText.startsWith(rendered)) {\n rendered = initialText + rendered;\n }\n\n let session = client.sessions.attach(snapshot.session.sessionId, {\n streamIndex: snapshot.session.streamIndex,\n });\n this.session = session;\n this.persistSessionCursor(session);\n\n let snapshotBoundary: MessageStreamEvent | undefined;\n for (let index = turnEvents.length - 1; index >= 0; index -= 1) {\n const event = turnEvents[index];\n if (event && isTurnBoundary(event)) {\n snapshotBoundary = event;\n break;\n }\n }\n if (snapshotBoundary) {\n if (snapshotBoundary.type === \"session.failed\") {\n throw new Error(snapshotBoundary.data.message || snapshotBoundary.data.code);\n }\n handlers.onComplete?.();\n if (!rendered.trim()) throw new Error(\"Empty response from runtime\");\n return rendered.trim();\n }\n\n let streamIndex = snapshot.session.streamIndex;\n for await (const event of session.stream({ signal })) {\n if (signal.aborted) break;\n rendered = applyMessageEvent(event, rendered, handlers);\n streamIndex += 1;\n savePersistedAgentSession(\n this.visitorSessionId,\n session.state.sessionId,\n streamIndex,\n this.storeOptions,\n );\n if (isTurnBoundary(event)) break;\n }\n\n session = client.sessions.attach(session.state.sessionId, { streamIndex });\n this.session = session;\n this.persistSessionCursor(session);\n\n if (!rendered.trim() && !signal.aborted) {\n throw new Error(\"Empty response from runtime\");\n }\n return rendered.trim();\n }\n\n cancelActive() {\n if (this.activeResponse) {\n this.activeResponse.cancel().catch(() => {});\n } else {\n this.session?.cancel().catch(() => {});\n }\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 version = options.version ?? \"published\";\n const runtimeOrigin = resolveAgentRuntimeConfig({\n indexId,\n runtimeOrigin: options.runtimeOrigin,\n version,\n }).origin;\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 resumeTurn: (resumeOptions: AgentResumeTurnOptions) =>\n session.resumeTurn(\n resumeOptions.message,\n resumeOptions.signal ?? new AbortController().signal,\n resumeOptions.handlers,\n resumeOptions.initialText,\n ),\n reset: () => session.reset(),\n cancelActive: () => session.cancelActive(),\n getActiveSessionId: () => session.getActiveSessionId(),\n };\n}\n","import { ClientError } from \"eve/client\";\nimport type { AgentIndexVersion } from \"./types\";\n\ntype RuntimeCapability = {\n accessToken: string;\n refreshAt: number;\n};\n\ntype AgentRuntimeCapabilityOptions = {\n indexId: string;\n runtimeOrigin: string;\n version: AgentIndexVersion;\n visitorSessionId: string;\n fetchImplementation?: typeof fetch;\n now?: () => number;\n};\n\nconst MAX_REFRESH_SKEW_MS = 30_000;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction parseBootstrapResponse(value: unknown, indexId: string, now: number): RuntimeCapability {\n if (\n !isRecord(value) ||\n value.apiVersion !== \"webless.ai/agent-runtime-bootstrap/v1\" ||\n typeof value.accessToken !== \"string\" ||\n !value.accessToken ||\n typeof value.expiresAt !== \"string\" ||\n !isRecord(value.identity) ||\n value.identity.indexId !== indexId ||\n typeof value.identity.revision !== \"string\" ||\n !value.identity.revision ||\n typeof value.identity.tenantId !== \"string\" ||\n !value.identity.tenantId ||\n typeof value.origin !== \"string\" ||\n !value.origin ||\n value.tokenType !== \"Bearer\" ||\n typeof value.visitorSubject !== \"string\" ||\n !value.visitorSubject\n ) {\n throw new Error(\"Agent Runtime returned an invalid access response.\");\n }\n\n const expiresAt = Date.parse(value.expiresAt);\n if (!Number.isFinite(expiresAt) || expiresAt <= now) {\n throw new Error(\"Agent Runtime returned an expired access response.\");\n }\n\n const refreshSkew = Math.min(MAX_REFRESH_SKEW_MS, Math.floor((expiresAt - now) / 10));\n return {\n accessToken: value.accessToken,\n refreshAt: expiresAt - refreshSkew,\n };\n}\n\nasync function readBootstrapError(response: Response): Promise<string> {\n const fallback = `Agent Runtime is unavailable (${response.status}).`;\n try {\n const value: unknown = await response.json();\n return isRecord(value) && typeof value.error === \"string\" && value.error\n ? value.error\n : fallback;\n } catch {\n return fallback;\n }\n}\n\nexport function createAgentRuntimeCapability(options: AgentRuntimeCapabilityOptions) {\n const fetchImplementation = options.fetchImplementation ?? fetch;\n const now = options.now ?? Date.now;\n let capability: RuntimeCapability | undefined;\n let pendingBootstrap: Promise<RuntimeCapability> | undefined;\n\n const bootstrap = async (): Promise<RuntimeCapability> => {\n const response = await fetchImplementation(`${options.runtimeOrigin}/webless/v1/bootstrap`, {\n body: JSON.stringify({\n clientSessionId: options.visitorSessionId,\n indexId: options.indexId,\n version: options.version,\n }),\n headers: { \"content-type\": \"application/json\" },\n method: \"POST\",\n });\n if (!response.ok) {\n throw new Error(await readBootstrapError(response));\n }\n\n let value: unknown;\n try {\n value = await response.json();\n } catch {\n throw new Error(\"Agent Runtime returned an invalid access response.\");\n }\n return parseBootstrapResponse(value, options.indexId, now());\n };\n\n return {\n getAccessToken: async (): Promise<string> => {\n if (capability && capability.refreshAt > now()) {\n return capability.accessToken;\n }\n\n pendingBootstrap ??= bootstrap().finally(() => {\n pendingBootstrap = undefined;\n });\n capability = await pendingBootstrap;\n return capability.accessToken;\n },\n invalidate: () => {\n capability = undefined;\n },\n };\n}\n\nexport type AgentRuntimeCapability = ReturnType<typeof createAgentRuntimeCapability>;\n\nexport async function withCapabilityRefresh<T>(\n capability: AgentRuntimeCapability,\n request: () => Promise<T>,\n): Promise<T> {\n try {\n return await request();\n } catch (error) {\n if (!(error instanceof ClientError) || error.status !== 401) {\n throw error;\n }\n capability.invalidate();\n return await request();\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","ClientError","ClientError"]}
|
|
1
|
+
{"version":3,"sources":["../src/runtime/client.ts","../src/runtime/capability.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 {\n createAgentRuntimeCapability,\n type AgentRuntimeCapability,\n withCapabilityRefresh,\n} from \"./capability\";\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 AgentResumeTurnOptions,\n AgentSendTurnOptions,\n AgentStreamHandlers,\n} from \"./types\";\n\nfunction isTurnBoundary(event: MessageStreamEvent) {\n return (\n event.type === \"session.waiting\" ||\n event.type === \"session.completed\" ||\n event.type === \"session.failed\"\n );\n}\n\nfunction applyMessageEvent(\n event: MessageStreamEvent,\n rendered: string,\n handlers: AgentStreamHandlers\n) {\n const step = mapStepLabel(event);\n if (step) handlers.onStep?.(step.label, step.detail);\n\n if (event.type === \"session.failed\") {\n throw new Error(event.data.message || event.data.code);\n }\n\n if (event.type === \"message.completed\") {\n handlers.onComplete?.();\n }\n\n if (event.type !== \"message.appended\") return rendered;\n\n const { messageDelta, messageSoFar } = event.data;\n let delta = messageDelta;\n let next = rendered;\n if (messageSoFar.startsWith(rendered)) {\n delta = messageSoFar.slice(rendered.length);\n next = messageSoFar;\n } else if (messageDelta) {\n next += messageDelta;\n }\n if (delta) handlers.onDelta(delta);\n return next;\n}\n\nfunction latestTurnEvents(events: readonly MessageStreamEvent[]) {\n let startIndex = -1;\n for (let index = events.length - 1; index >= 0; index -= 1) {\n if (events[index]?.type === \"message.received\") {\n startIndex = index;\n break;\n }\n }\n return startIndex >= 0 ? events.slice(startIndex) : [];\n}\n\nfunction renderTurn(events: readonly MessageStreamEvent[]) {\n let rendered = \"\";\n for (const event of events) {\n if (event.type !== \"message.appended\") continue;\n const { messageDelta, messageSoFar } = event.data;\n if (messageSoFar.startsWith(rendered)) {\n rendered = messageSoFar;\n } else if (messageDelta) {\n rendered += messageDelta;\n }\n }\n return rendered;\n}\n\nfunction mapStepLabel(\n event: MessageStreamEvent\n): { 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 readonly capability: AgentRuntimeCapability;\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 getUnpublishedPreviewGrant?: () => Promise<string>\n ) {\n this.capability = createAgentRuntimeCapability({\n getUnpublishedPreviewGrant,\n indexId,\n runtimeOrigin,\n version,\n visitorSessionId,\n });\n }\n\n getActiveSessionId(): string | undefined {\n return (\n this.session?.state.sessionId ??\n loadPersistedAgentSession(this.visitorSessionId, this.storeOptions)\n ?.sessionId\n );\n }\n\n reset() {\n if (this.activeResponse) {\n void this.activeResponse.cancel().catch(() => {});\n } else {\n void this.session?.cancel().catch(() => {});\n }\n this.activeResponse = undefined;\n this.session = undefined;\n this.capability.invalidate();\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.activeResponse = undefined;\n this.session = undefined;\n this.client = new Client({\n auth: { bearer: () => this.capability.getAccessToken() },\n host: config.host,\n redirect: \"error\",\n });\n this.clientHost = config.host;\n return this.client;\n }\n\n private attachPersistedSession(client: Client): ClientSession | undefined {\n const persisted = loadPersistedAgentSession(\n this.visitorSessionId,\n this.storeOptions\n );\n if (!persisted?.sessionId) return undefined;\n\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 const activeSession = session;\n response = await withCapabilityRefresh(this.capability, () =>\n activeSession.send(message, { signal })\n );\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 withCapabilityRefresh(this.capability, () =>\n client.sessions.create({ message, signal })\n );\n response = created.response;\n session = created.session;\n this.session = session;\n this.persistSessionCursor(session);\n }\n\n this.activeResponse = response;\n let streamIndex = session?.state.streamIndex ?? 0;\n let rendered = \"\";\n\n try {\n for await (const event of response) {\n if (signal.aborted) break;\n rendered = applyMessageEvent(event, rendered, handlers);\n streamIndex += 1;\n if (session) {\n savePersistedAgentSession(\n this.visitorSessionId,\n session.state.sessionId,\n streamIndex,\n this.storeOptions\n );\n }\n }\n } finally {\n this.activeResponse = undefined;\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 return rendered.trim();\n }\n\n async resumeTurn(\n message: string,\n signal: AbortSignal,\n handlers: AgentStreamHandlers,\n initialText = \"\"\n ): Promise<string | null> {\n const persisted = loadPersistedAgentSession(\n this.visitorSessionId,\n this.storeOptions\n );\n if (!persisted) return null;\n\n const client = this.ensureClient();\n const attached = client.sessions.attach(persisted.sessionId, {\n streamIndex: persisted.streamIndex,\n });\n const snapshot = await withCapabilityRefresh(this.capability, () =>\n attached.snapshot({ signal })\n );\n const turnEvents = latestTurnEvents(snapshot.events);\n const received = turnEvents[0];\n if (\n received?.type !== \"message.received\" ||\n received.data.message !== message\n ) {\n return null;\n }\n let rendered = renderTurn(turnEvents);\n\n if (rendered.startsWith(initialText)) {\n const missedText = rendered.slice(initialText.length);\n if (missedText) handlers.onDelta(missedText);\n } else if (initialText.startsWith(rendered)) {\n rendered = initialText;\n } else if (!initialText.startsWith(rendered)) {\n rendered = initialText + rendered;\n }\n\n let session = client.sessions.attach(snapshot.session.sessionId, {\n streamIndex: snapshot.session.streamIndex,\n });\n this.session = session;\n this.persistSessionCursor(session);\n\n let snapshotBoundary: MessageStreamEvent | undefined;\n for (let index = turnEvents.length - 1; index >= 0; index -= 1) {\n const event = turnEvents[index];\n if (event && isTurnBoundary(event)) {\n snapshotBoundary = event;\n break;\n }\n }\n if (snapshotBoundary) {\n if (snapshotBoundary.type === \"session.failed\") {\n throw new Error(\n snapshotBoundary.data.message || snapshotBoundary.data.code\n );\n }\n handlers.onComplete?.();\n if (!rendered.trim()) throw new Error(\"Empty response from runtime\");\n return rendered.trim();\n }\n\n let streamIndex = snapshot.session.streamIndex;\n for await (const event of session.stream({ signal })) {\n if (signal.aborted) break;\n rendered = applyMessageEvent(event, rendered, handlers);\n streamIndex += 1;\n savePersistedAgentSession(\n this.visitorSessionId,\n session.state.sessionId,\n streamIndex,\n this.storeOptions\n );\n if (isTurnBoundary(event)) break;\n }\n\n session = client.sessions.attach(session.state.sessionId, { streamIndex });\n this.session = session;\n this.persistSessionCursor(session);\n\n if (!rendered.trim() && !signal.aborted) {\n throw new Error(\"Empty response from runtime\");\n }\n return rendered.trim();\n }\n\n cancelActive() {\n if (this.activeResponse) {\n this.activeResponse.cancel().catch(() => {});\n } else {\n this.session?.cancel().catch(() => {});\n }\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 version = options.version ?? \"published\";\n const runtimeOrigin = resolveAgentRuntimeConfig({\n indexId,\n runtimeOrigin: options.runtimeOrigin,\n version,\n }).origin;\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() ||\n getOrCreateVisitorSessionId(storeOptions);\n\n const session = new AgentSession(\n indexId,\n version,\n runtimeOrigin,\n visitorSessionId,\n storeOptions,\n options.getUnpublishedPreviewGrant\n );\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 resumeTurn: (resumeOptions: AgentResumeTurnOptions) =>\n session.resumeTurn(\n resumeOptions.message,\n resumeOptions.signal ?? new AbortController().signal,\n resumeOptions.handlers,\n resumeOptions.initialText\n ),\n reset: () => session.reset(),\n cancelActive: () => session.cancelActive(),\n getActiveSessionId: () => session.getActiveSessionId(),\n };\n}\n","import { ClientError } from \"eve/client\";\nimport type { AgentIndexVersion } from \"./types\";\n\ntype RuntimeCapability = {\n accessToken: string;\n refreshAt: number;\n};\n\ntype AgentRuntimeCapabilityOptions = {\n getUnpublishedPreviewGrant?: () => Promise<string>;\n indexId: string;\n runtimeOrigin: string;\n version: AgentIndexVersion;\n visitorSessionId: string;\n fetchImplementation?: typeof fetch;\n now?: () => number;\n};\n\nconst MAX_REFRESH_SKEW_MS = 30_000;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction parseBootstrapResponse(\n value: unknown,\n indexId: string,\n now: number\n): RuntimeCapability {\n if (\n !isRecord(value) ||\n value.apiVersion !== \"webless.ai/agent-runtime-bootstrap/v1\" ||\n typeof value.accessToken !== \"string\" ||\n !value.accessToken ||\n typeof value.expiresAt !== \"string\" ||\n !isRecord(value.identity) ||\n value.identity.indexId !== indexId ||\n typeof value.identity.revision !== \"string\" ||\n !value.identity.revision ||\n typeof value.identity.tenantId !== \"string\" ||\n !value.identity.tenantId ||\n typeof value.origin !== \"string\" ||\n !value.origin ||\n value.tokenType !== \"Bearer\" ||\n typeof value.visitorSubject !== \"string\" ||\n !value.visitorSubject\n ) {\n throw new Error(\"Agent Runtime returned an invalid access response.\");\n }\n\n const expiresAt = Date.parse(value.expiresAt);\n if (!Number.isFinite(expiresAt) || expiresAt <= now) {\n throw new Error(\"Agent Runtime returned an expired access response.\");\n }\n\n const refreshSkew = Math.min(\n MAX_REFRESH_SKEW_MS,\n Math.floor((expiresAt - now) / 10)\n );\n return {\n accessToken: value.accessToken,\n refreshAt: expiresAt - refreshSkew,\n };\n}\n\nasync function readBootstrapError(response: Response): Promise<string> {\n const fallback = `Agent Runtime is unavailable (${response.status}).`;\n try {\n const value: unknown = await response.json();\n return isRecord(value) && typeof value.error === \"string\" && value.error\n ? value.error\n : fallback;\n } catch {\n return fallback;\n }\n}\n\nexport function createAgentRuntimeCapability(\n options: AgentRuntimeCapabilityOptions\n) {\n const fetchImplementation = options.fetchImplementation ?? fetch;\n const now = options.now ?? Date.now;\n let capability: RuntimeCapability | undefined;\n let generation = 0;\n let pendingBootstrap: Promise<RuntimeCapability> | undefined;\n\n const bootstrap = async (): Promise<RuntimeCapability> => {\n let previewGrant: string | undefined;\n if (options.version === \"unpublished\") {\n previewGrant = (await options.getUnpublishedPreviewGrant?.())?.trim();\n if (!previewGrant) {\n throw new Error(\n \"An unpublished preview grant is required to use the Agent Runtime preview.\"\n );\n }\n }\n\n const response = await fetchImplementation(\n `${options.runtimeOrigin}/webless/v1/bootstrap`,\n {\n body: JSON.stringify({\n clientSessionId: options.visitorSessionId,\n indexId: options.indexId,\n ...(previewGrant ? { previewGrant } : {}),\n version: options.version,\n }),\n headers: { \"content-type\": \"application/json\" },\n method: \"POST\",\n }\n );\n if (!response.ok) {\n throw new Error(await readBootstrapError(response));\n }\n\n let value: unknown;\n try {\n value = await response.json();\n } catch {\n throw new Error(\"Agent Runtime returned an invalid access response.\");\n }\n return parseBootstrapResponse(value, options.indexId, now());\n };\n\n const getAccessToken = async (): Promise<string> => {\n if (capability && capability.refreshAt > now()) {\n return capability.accessToken;\n }\n\n const requestedGeneration = generation;\n if (!pendingBootstrap) {\n const trackedBootstrap = bootstrap().finally(() => {\n if (pendingBootstrap === trackedBootstrap) {\n pendingBootstrap = undefined;\n }\n });\n pendingBootstrap = trackedBootstrap;\n }\n\n const nextCapability = await pendingBootstrap;\n if (requestedGeneration !== generation) {\n return getAccessToken();\n }\n\n capability = nextCapability;\n return capability.accessToken;\n };\n\n return {\n getAccessToken,\n invalidate: () => {\n capability = undefined;\n generation += 1;\n pendingBootstrap = undefined;\n },\n };\n}\n\nexport type AgentRuntimeCapability = ReturnType<\n typeof createAgentRuntimeCapability\n>;\n\nexport async function withCapabilityRefresh<T>(\n capability: AgentRuntimeCapability,\n request: () => Promise<T>\n): Promise<T> {\n try {\n return await request();\n } catch (error) {\n if (!(error instanceof ClientError) || error.status !== 401) {\n throw error;\n }\n capability.invalidate();\n return await request();\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","ClientError","ClientError"]}
|
package/dist/react.cjs
CHANGED
|
@@ -56,7 +56,10 @@ function parseBootstrapResponse(value, indexId, now) {
|
|
|
56
56
|
if (!Number.isFinite(expiresAt) || expiresAt <= now) {
|
|
57
57
|
throw new Error("Agent Runtime returned an expired access response.");
|
|
58
58
|
}
|
|
59
|
-
const refreshSkew = Math.min(
|
|
59
|
+
const refreshSkew = Math.min(
|
|
60
|
+
MAX_REFRESH_SKEW_MS,
|
|
61
|
+
Math.floor((expiresAt - now) / 10)
|
|
62
|
+
);
|
|
60
63
|
return {
|
|
61
64
|
accessToken: value.accessToken,
|
|
62
65
|
refreshAt: expiresAt - refreshSkew
|
|
@@ -75,17 +78,31 @@ function createAgentRuntimeCapability(options) {
|
|
|
75
78
|
const fetchImplementation = options.fetchImplementation ?? fetch;
|
|
76
79
|
const now = options.now ?? Date.now;
|
|
77
80
|
let capability;
|
|
81
|
+
let generation = 0;
|
|
78
82
|
let pendingBootstrap;
|
|
79
83
|
const bootstrap = async () => {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
}
|
|
84
|
+
let previewGrant;
|
|
85
|
+
if (options.version === "unpublished") {
|
|
86
|
+
previewGrant = (await options.getUnpublishedPreviewGrant?.())?.trim();
|
|
87
|
+
if (!previewGrant) {
|
|
88
|
+
throw new Error(
|
|
89
|
+
"An unpublished preview grant is required to use the Agent Runtime preview."
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
const response = await fetchImplementation(
|
|
94
|
+
`${options.runtimeOrigin}/webless/v1/bootstrap`,
|
|
95
|
+
{
|
|
96
|
+
body: JSON.stringify({
|
|
97
|
+
clientSessionId: options.visitorSessionId,
|
|
98
|
+
indexId: options.indexId,
|
|
99
|
+
...previewGrant ? { previewGrant } : {},
|
|
100
|
+
version: options.version
|
|
101
|
+
}),
|
|
102
|
+
headers: { "content-type": "application/json" },
|
|
103
|
+
method: "POST"
|
|
104
|
+
}
|
|
105
|
+
);
|
|
89
106
|
if (!response.ok) {
|
|
90
107
|
throw new Error(await readBootstrapError(response));
|
|
91
108
|
}
|
|
@@ -97,19 +114,32 @@ function createAgentRuntimeCapability(options) {
|
|
|
97
114
|
}
|
|
98
115
|
return parseBootstrapResponse(value, options.indexId, now());
|
|
99
116
|
};
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
if (capability && capability.refreshAt > now()) {
|
|
103
|
-
return capability.accessToken;
|
|
104
|
-
}
|
|
105
|
-
pendingBootstrap ??= bootstrap().finally(() => {
|
|
106
|
-
pendingBootstrap = void 0;
|
|
107
|
-
});
|
|
108
|
-
capability = await pendingBootstrap;
|
|
117
|
+
const getAccessToken = async () => {
|
|
118
|
+
if (capability && capability.refreshAt > now()) {
|
|
109
119
|
return capability.accessToken;
|
|
110
|
-
}
|
|
120
|
+
}
|
|
121
|
+
const requestedGeneration = generation;
|
|
122
|
+
if (!pendingBootstrap) {
|
|
123
|
+
const trackedBootstrap = bootstrap().finally(() => {
|
|
124
|
+
if (pendingBootstrap === trackedBootstrap) {
|
|
125
|
+
pendingBootstrap = void 0;
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
pendingBootstrap = trackedBootstrap;
|
|
129
|
+
}
|
|
130
|
+
const nextCapability = await pendingBootstrap;
|
|
131
|
+
if (requestedGeneration !== generation) {
|
|
132
|
+
return getAccessToken();
|
|
133
|
+
}
|
|
134
|
+
capability = nextCapability;
|
|
135
|
+
return capability.accessToken;
|
|
136
|
+
};
|
|
137
|
+
return {
|
|
138
|
+
getAccessToken,
|
|
111
139
|
invalidate: () => {
|
|
112
140
|
capability = void 0;
|
|
141
|
+
generation += 1;
|
|
142
|
+
pendingBootstrap = void 0;
|
|
113
143
|
}
|
|
114
144
|
};
|
|
115
145
|
}
|
|
@@ -279,13 +309,14 @@ function mapStepLabel(event) {
|
|
|
279
309
|
};
|
|
280
310
|
}
|
|
281
311
|
var AgentSession = class {
|
|
282
|
-
constructor(indexId, version, runtimeOrigin, visitorSessionId, storeOptions) {
|
|
312
|
+
constructor(indexId, version, runtimeOrigin, visitorSessionId, storeOptions, getUnpublishedPreviewGrant) {
|
|
283
313
|
this.indexId = indexId;
|
|
284
314
|
this.version = version;
|
|
285
315
|
this.runtimeOrigin = runtimeOrigin;
|
|
286
316
|
this.visitorSessionId = visitorSessionId;
|
|
287
317
|
this.storeOptions = storeOptions;
|
|
288
318
|
this.capability = createAgentRuntimeCapability({
|
|
319
|
+
getUnpublishedPreviewGrant,
|
|
289
320
|
indexId,
|
|
290
321
|
runtimeOrigin,
|
|
291
322
|
version,
|
|
@@ -315,6 +346,7 @@ var AgentSession = class {
|
|
|
315
346
|
}
|
|
316
347
|
this.activeResponse = void 0;
|
|
317
348
|
this.session = void 0;
|
|
349
|
+
this.capability.invalidate();
|
|
318
350
|
clearPersistedAgentSession(this.visitorSessionId, this.storeOptions);
|
|
319
351
|
}
|
|
320
352
|
persistSessionCursor(session) {
|
|
@@ -348,7 +380,10 @@ var AgentSession = class {
|
|
|
348
380
|
return this.client;
|
|
349
381
|
}
|
|
350
382
|
attachPersistedSession(client) {
|
|
351
|
-
const persisted = loadPersistedAgentSession(
|
|
383
|
+
const persisted = loadPersistedAgentSession(
|
|
384
|
+
this.visitorSessionId,
|
|
385
|
+
this.storeOptions
|
|
386
|
+
);
|
|
352
387
|
if (!persisted?.sessionId) return void 0;
|
|
353
388
|
return client.sessions.attach(persisted.sessionId, {
|
|
354
389
|
streamIndex: persisted.streamIndex
|
|
@@ -415,7 +450,10 @@ var AgentSession = class {
|
|
|
415
450
|
return rendered.trim();
|
|
416
451
|
}
|
|
417
452
|
async resumeTurn(message, signal, handlers, initialText = "") {
|
|
418
|
-
const persisted = loadPersistedAgentSession(
|
|
453
|
+
const persisted = loadPersistedAgentSession(
|
|
454
|
+
this.visitorSessionId,
|
|
455
|
+
this.storeOptions
|
|
456
|
+
);
|
|
419
457
|
if (!persisted) return null;
|
|
420
458
|
const client = this.ensureClient();
|
|
421
459
|
const attached = client.sessions.attach(persisted.sessionId, {
|
|
@@ -454,7 +492,9 @@ var AgentSession = class {
|
|
|
454
492
|
}
|
|
455
493
|
if (snapshotBoundary) {
|
|
456
494
|
if (snapshotBoundary.type === "session.failed") {
|
|
457
|
-
throw new Error(
|
|
495
|
+
throw new Error(
|
|
496
|
+
snapshotBoundary.data.message || snapshotBoundary.data.code
|
|
497
|
+
);
|
|
458
498
|
}
|
|
459
499
|
handlers.onComplete?.();
|
|
460
500
|
if (!rendered.trim()) throw new Error("Empty response from runtime");
|
|
@@ -511,7 +551,14 @@ function createAgentClient(options) {
|
|
|
511
551
|
})
|
|
512
552
|
};
|
|
513
553
|
const visitorSessionId = options.visitorSessionId?.trim() || getOrCreateVisitorSessionId(storeOptions);
|
|
514
|
-
const session = new AgentSession(
|
|
554
|
+
const session = new AgentSession(
|
|
555
|
+
indexId,
|
|
556
|
+
version,
|
|
557
|
+
runtimeOrigin,
|
|
558
|
+
visitorSessionId,
|
|
559
|
+
storeOptions,
|
|
560
|
+
options.getUnpublishedPreviewGrant
|
|
561
|
+
);
|
|
515
562
|
return {
|
|
516
563
|
indexId,
|
|
517
564
|
version,
|
|
@@ -652,24 +699,50 @@ function delay(ms, signal) {
|
|
|
652
699
|
}
|
|
653
700
|
async function runStatusSequence(signal, onStep) {
|
|
654
701
|
for (const item of STATUS_SEQUENCE) {
|
|
655
|
-
onStep({
|
|
702
|
+
onStep({
|
|
703
|
+
id: item.id,
|
|
704
|
+
label: item.label,
|
|
705
|
+
detail: item.detail,
|
|
706
|
+
state: "active"
|
|
707
|
+
});
|
|
656
708
|
await delay(item.ms, signal);
|
|
657
709
|
}
|
|
658
710
|
}
|
|
659
711
|
function useAgentChat({
|
|
660
712
|
customerId,
|
|
713
|
+
getUnpublishedPreviewGrant,
|
|
661
714
|
indexId,
|
|
662
715
|
version,
|
|
663
716
|
runtimeOrigin,
|
|
664
717
|
visitorSessionId,
|
|
665
718
|
storageKeyPrefix
|
|
666
719
|
}) {
|
|
720
|
+
const previewGrantProviderRef = (0, import_react.useRef)(getUnpublishedPreviewGrant);
|
|
721
|
+
previewGrantProviderRef.current = getUnpublishedPreviewGrant;
|
|
722
|
+
const resolveUnpublishedPreviewGrant = () => {
|
|
723
|
+
const provider = previewGrantProviderRef.current;
|
|
724
|
+
if (!provider) {
|
|
725
|
+
return Promise.reject(
|
|
726
|
+
new Error(
|
|
727
|
+
"An unpublished preview grant is required to use the Agent Runtime preview."
|
|
728
|
+
)
|
|
729
|
+
);
|
|
730
|
+
}
|
|
731
|
+
return provider();
|
|
732
|
+
};
|
|
667
733
|
const resolvedStorageKeyPrefix = (0, import_react.useMemo)(
|
|
668
|
-
() => storageKeyPrefix?.trim() || buildAgentStorageKeyPrefix({
|
|
734
|
+
() => storageKeyPrefix?.trim() || buildAgentStorageKeyPrefix({
|
|
735
|
+
customerId,
|
|
736
|
+
indexId,
|
|
737
|
+
version,
|
|
738
|
+
runtimeOrigin
|
|
739
|
+
}),
|
|
669
740
|
[customerId, indexId, runtimeOrigin, storageKeyPrefix, version]
|
|
670
741
|
);
|
|
671
742
|
const visitorId = (0, import_react.useMemo)(
|
|
672
|
-
() => visitorSessionId?.trim() || getOrCreateVisitorSessionId({
|
|
743
|
+
() => visitorSessionId?.trim() || getOrCreateVisitorSessionId({
|
|
744
|
+
storageKeyPrefix: resolvedStorageKeyPrefix
|
|
745
|
+
}),
|
|
673
746
|
[resolvedStorageKeyPrefix, visitorSessionId]
|
|
674
747
|
);
|
|
675
748
|
const [state, setState] = (0, import_react.useState)(
|
|
@@ -681,6 +754,7 @@ function useAgentChat({
|
|
|
681
754
|
const clientRef = (0, import_react.useRef)(
|
|
682
755
|
createAgentClient({
|
|
683
756
|
customerId,
|
|
757
|
+
getUnpublishedPreviewGrant: resolveUnpublishedPreviewGrant,
|
|
684
758
|
indexId,
|
|
685
759
|
version,
|
|
686
760
|
runtimeOrigin,
|
|
@@ -699,6 +773,7 @@ function useAgentChat({
|
|
|
699
773
|
runRef.current = null;
|
|
700
774
|
clientRef.current = createAgentClient({
|
|
701
775
|
customerId,
|
|
776
|
+
getUnpublishedPreviewGrant: resolveUnpublishedPreviewGrant,
|
|
702
777
|
indexId,
|
|
703
778
|
version,
|
|
704
779
|
runtimeOrigin,
|
|
@@ -710,7 +785,15 @@ function useAgentChat({
|
|
|
710
785
|
loadPersistedAgentConversation(resolvedStorageKeyPrefix, visitorId)
|
|
711
786
|
)
|
|
712
787
|
);
|
|
713
|
-
}, [
|
|
788
|
+
}, [
|
|
789
|
+
customerId,
|
|
790
|
+
identityKey,
|
|
791
|
+
indexId,
|
|
792
|
+
runtimeOrigin,
|
|
793
|
+
resolvedStorageKeyPrefix,
|
|
794
|
+
version,
|
|
795
|
+
visitorId
|
|
796
|
+
]);
|
|
714
797
|
(0, import_react.useEffect)(() => {
|
|
715
798
|
if (!hasVisitorMessages(state.messages)) return;
|
|
716
799
|
savePersistedAgentConversation(resolvedStorageKeyPrefix, visitorId, {
|
|
@@ -718,7 +801,13 @@ function useAgentChat({
|
|
|
718
801
|
pending: isAgentBusy(state.phase),
|
|
719
802
|
streamingText: state.streamingText
|
|
720
803
|
});
|
|
721
|
-
}, [
|
|
804
|
+
}, [
|
|
805
|
+
resolvedStorageKeyPrefix,
|
|
806
|
+
state.messages,
|
|
807
|
+
state.phase,
|
|
808
|
+
state.streamingText,
|
|
809
|
+
visitorId
|
|
810
|
+
]);
|
|
722
811
|
const reset = (0, import_react.useCallback)(() => {
|
|
723
812
|
runRef.current?.abort();
|
|
724
813
|
runRef.current = null;
|
|
@@ -736,7 +825,11 @@ function useAgentChat({
|
|
|
736
825
|
let streamed = initialText;
|
|
737
826
|
const planningPromise = resume ? Promise.resolve() : runStatusSequence(signal, (step) => {
|
|
738
827
|
if (streamStarted || !isActiveRun()) return;
|
|
739
|
-
setState((prev) => ({
|
|
828
|
+
setState((prev) => ({
|
|
829
|
+
...prev,
|
|
830
|
+
phase: "running-tools",
|
|
831
|
+
toolSteps: [step]
|
|
832
|
+
}));
|
|
740
833
|
});
|
|
741
834
|
const handlers = {
|
|
742
835
|
onStep: (label, detail) => {
|
|
@@ -744,7 +837,9 @@ function useAgentChat({
|
|
|
744
837
|
setState((prev) => ({
|
|
745
838
|
...prev,
|
|
746
839
|
phase: "running-tools",
|
|
747
|
-
toolSteps: [
|
|
840
|
+
toolSteps: [
|
|
841
|
+
{ id: `step-${label}`, label, detail, state: "active" }
|
|
842
|
+
]
|
|
748
843
|
}));
|
|
749
844
|
},
|
|
750
845
|
onDelta: (delta) => {
|
|
@@ -761,7 +856,11 @@ function useAgentChat({
|
|
|
761
856
|
}));
|
|
762
857
|
}
|
|
763
858
|
streamed += delta;
|
|
764
|
-
setState((prev) => ({
|
|
859
|
+
setState((prev) => ({
|
|
860
|
+
...prev,
|
|
861
|
+
phase: "streaming",
|
|
862
|
+
streamingText: streamed
|
|
863
|
+
}));
|
|
765
864
|
},
|
|
766
865
|
onComplete: () => {
|
|
767
866
|
if (!isActiveRun()) return;
|
|
@@ -775,7 +874,10 @@ function useAgentChat({
|
|
|
775
874
|
signal
|
|
776
875
|
}) : await clientRef.current.sendTurn(visitorText, { handlers, signal });
|
|
777
876
|
if (resume && finalText === null) {
|
|
778
|
-
finalText = await clientRef.current.sendTurn(visitorText, {
|
|
877
|
+
finalText = await clientRef.current.sendTurn(visitorText, {
|
|
878
|
+
handlers,
|
|
879
|
+
signal
|
|
880
|
+
});
|
|
779
881
|
}
|
|
780
882
|
await planningPromise.catch(() => {
|
|
781
883
|
});
|
|
@@ -797,7 +899,8 @@ function useAgentChat({
|
|
|
797
899
|
}));
|
|
798
900
|
runRef.current = null;
|
|
799
901
|
} catch (error) {
|
|
800
|
-
if (error instanceof DOMException && error.name === "AbortError")
|
|
902
|
+
if (error instanceof DOMException && error.name === "AbortError")
|
|
903
|
+
return;
|
|
801
904
|
if (!isActiveRun()) return;
|
|
802
905
|
const message = formatAgentError(error);
|
|
803
906
|
if (!message) return;
|
|
@@ -831,7 +934,9 @@ function useAgentChat({
|
|
|
831
934
|
...prev,
|
|
832
935
|
phase: "thinking",
|
|
833
936
|
messages: [...prev.messages, visitorMessage],
|
|
834
|
-
toolSteps: [
|
|
937
|
+
toolSteps: [
|
|
938
|
+
{ id: "s1", label: "Starting Eve session", state: "active" }
|
|
939
|
+
],
|
|
835
940
|
journey: null,
|
|
836
941
|
followUps: [],
|
|
837
942
|
streamingText: "",
|
|
@@ -1348,6 +1453,7 @@ var import_jsx_runtime8 = require("react/jsx-runtime");
|
|
|
1348
1453
|
function AgentWidget({
|
|
1349
1454
|
indexId,
|
|
1350
1455
|
customerId,
|
|
1456
|
+
getUnpublishedPreviewGrant,
|
|
1351
1457
|
version,
|
|
1352
1458
|
runtimeOrigin,
|
|
1353
1459
|
placement: placementInput,
|
|
@@ -1360,6 +1466,7 @@ function AgentWidget({
|
|
|
1360
1466
|
const [railExpanded, setRailExpanded] = (0, import_react5.useState)(false);
|
|
1361
1467
|
const { state, submit } = useAgentChat({
|
|
1362
1468
|
customerId,
|
|
1469
|
+
getUnpublishedPreviewGrant,
|
|
1363
1470
|
indexId,
|
|
1364
1471
|
version,
|
|
1365
1472
|
runtimeOrigin
|