Skip to main content

Sessions and storage

The session lifecycle

MethodWhat it does
ensure(input?)Reuses a valid stored session, or mints a new one via getBootstrapAssertion.
getStoredSession()Returns public session metadata, or null.
clearStoredSession()Removes the locally stored session.
revokeSession()Revokes the session server-side.
const stored = await client.getStoredSession();
if (stored && stored.expiresAt < Date.now()) {
await client.ensure({ forceRefresh: true });
}

getStoredSession() returns PublicStoredExternalAgentSession — the stored record minus its sessionToken. There is no public method that hands the bearer token back to you.

Storage adapters

By default the SDK keeps the session in memory, so it is lost on reload. Provide a RuntimeStorage adapter to persist it:

import type { RuntimeStorage } from '@agentshelf/agent-runtime-sdk-core';
import type { ExternalAgentStoredSessionRecord } from '@agentshelf/external-agents-sdk';

const storage: RuntimeStorage<ExternalAgentStoredSessionRecord> = {
get: async (key) => secureStore.get(key),
set: async (key, value) => secureStore.set(key, value),
remove: async (key) => secureStore.remove(key),
};

const client = createExternalAgentClient({
externalAgentRef: 'ext_agent_public_12345678',
getBootstrapAssertion,
storage,
storageKey: 'agentshelf:checkout-agent',
});

All three methods may return synchronously or as a promise.

Choose the store deliberately

The stored record includes sessionToken — the bearer credential the SDK uses for every public API call. Anything that can read your storage can act as that session until it expires.

In a browser, localStorage is readable by any script on the origin, including injected third-party scripts. Prefer a shorter-lived store, scope the session narrowly, and call revokeSession() when the user logs out.

Use a distinct storageKey per agent if one page embeds more than one, otherwise the second client will overwrite the first client's session.

What is in a session record

ExternalAgentStoredSessionRecord holds externalAgentRef, sessionRef, sessionToken, expiresAt, and optionally externalAppRef, externalUserRef, and workspaceBindingRef. Every identifier in it is a public ref.