@ai-ecoverse/slicc-agent 5.10.1 → 6.0.1

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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/serving.ts"],
4
- "sourcesContent": ["import {\n type Ctx,\n isChordError,\n method,\n type Principal,\n type Readable,\n type RemoteContract,\n type ReplicatedState,\n remote,\n type StateEvent,\n} from '@earendil-works/chord';\nimport { BACKGROUND_CONTEXT, type Context, withAbortSignal } from '@earendil-works/chord/context';\nimport { diffRevisions } from '@earendil-works/chord/delta';\nimport { Type } from 'typebox';\n\nexport const AGENT_HOST = 'agent';\n\nexport type Seat = 'owner' | 'control' | 'view' | 'guest';\n\nexport interface GuestPrincipal {\n id: string;\n name: string;\n epoch: number;\n}\n\nexport interface AgentPrincipal {\n seat: Seat;\n link: number;\n guest?: GuestPrincipal;\n device?: string;\n}\n\nexport const seatOf = (principal: Principal): Seat => (principal as AgentPrincipal).seat;\n\nexport const guestOf = (principal: Principal): GuestPrincipal | undefined => {\n const found = principal as Partial<AgentPrincipal> | undefined;\n return found?.seat === 'guest' ? found.guest : undefined;\n};\n\nexport const deviceOf = (principal: Principal): string | undefined =>\n (principal as AgentPrincipal).device;\n\nexport const principalKey = (principal: Principal): string => {\n const { seat, link } = (principal ?? {}) as Partial<AgentPrincipal>;\n const guest = guestOf(principal);\n if (guest) return `guest:${guest.id}:e${guest.epoch}:${link}`;\n return seat ? `${seat}:${link}` : 'host';\n};\n\nexport interface Members {\n methods?: readonly string[];\n state?: readonly string[];\n}\n\nconst Args = Type.Array(Type.Unknown());\nconst Value = Type.Unknown();\n\nexport function contract(name: string, variants: Record<string, Members>): RemoteContract {\n const def: Parameters<typeof remote>[1] = {\n version: 1,\n input: Type.Object({}),\n variants: Object.fromEntries(\n Object.entries(variants).map(([kind, members]) => [\n kind,\n {\n state: Object.fromEntries((members.state ?? []).map((member) => [member, Value])),\n methods: Object.fromEntries(\n (members.methods ?? []).map((member) => [member, method(Args, Value)])\n ),\n },\n ])\n ),\n };\n return remote(name, def);\n}\n\nexport type Callable = (...args: unknown[]) => Promise<unknown>;\n\nexport const contextOf = (ctx: Ctx): Context => withAbortSignal(ctx.signal, BACKGROUND_CONTEXT);\n\nexport function served(\n impl: () => object,\n names: readonly string[]\n): Record<string, (args: unknown[], ctx: Ctx) => Promise<unknown>> {\n return Object.fromEntries(\n names.map((name) => [\n name,\n (args: unknown[], ctx: Ctx) =>\n ((impl() as Record<string, Callable>)[name] as Callable)(...args, contextOf(ctx)),\n ])\n );\n}\n\nconst readables = new WeakMap<object, Readable<unknown>>();\n\nexport function readable<T>(state: ReplicatedState<T>): Readable<T> {\n const known = readables.get(state);\n if (known) return known as Readable<T>;\n const values = new Set<(value: T) => void>();\n const events = new Set<(event: StateEvent<T>) => void>();\n let value = state.value as T;\n let off: (() => void) | undefined;\n const start = () => {\n if (off) return;\n value = state.value as T;\n off = state.subscribe((next) => {\n const before = value;\n value = next;\n if (before === next) return;\n const event: StateEvent<T> =\n before === undefined\n ? { type: 'reset', value: next }\n : { type: 'ops', ops: diffRevisions(before as never, next as never), value: next };\n for (const listener of [...events]) listener(event);\n for (const listener of [...values]) listener(next);\n });\n };\n const stop = () => {\n if (values.size + events.size > 0 || !off) return;\n off();\n off = undefined;\n };\n const made: Readable<T> = {\n get value() {\n return off ? value : (state.value as T);\n },\n subscribe(listener) {\n values.add(listener);\n start();\n listener(value);\n return () => {\n values.delete(listener);\n stop();\n };\n },\n events(listener) {\n events.add(listener);\n start();\n listener({ type: 'snap', value });\n return () => {\n events.delete(listener);\n stop();\n };\n },\n };\n readables.set(state, made);\n return made;\n}\n\nexport function readablesOf(\n states: Record<string, ReplicatedState<unknown>>\n): Record<string, Readable<unknown>> {\n return Object.fromEntries(Object.entries(states).map(([name, state]) => [name, readable(state)]));\n}\n\nexport interface Remote {\n readonly kind: string | undefined;\n readonly ready: Promise<void>;\n release(): void;\n [member: string]: unknown;\n}\n\nexport function replicated<T>(member: Readable<T | undefined>): ReplicatedState<T> {\n return {\n get value() {\n return member.value;\n },\n subscribe(listener: (value: T, context: Context, delivery: never) => unknown) {\n let sequence = 0;\n return member.subscribe((value) => {\n if (value === undefined) return;\n sequence += 1;\n void listener(value, BACKGROUND_CONTEXT, {\n kind: sequence === 1 ? 'hydrate' : 'update',\n sequence,\n } as never);\n });\n },\n } as ReplicatedState<T>;\n}\n\nexport function kept(member: Readable<unknown>): { ready: Promise<void>; stop(): void } {\n let resolve!: () => void;\n const ready = new Promise<void>((done) => {\n resolve = done;\n });\n const stop = member.subscribe((value) => {\n if (value !== undefined) resolve();\n });\n return { ready, stop };\n}\n\nexport const CLOSED = 'the connection to the agent is closed';\n\nexport function plain(error: unknown): unknown {\n if (!isChordError(error)) return error;\n if (error.code === 'released') return Object.assign(new Error(CLOSED), { code: 'released' });\n const prefix = error.reason ? `${error.code}/${error.reason}: ` : `${error.code}: `;\n const message = error.message.startsWith(prefix)\n ? error.message.slice(prefix.length)\n : error.message;\n return Object.assign(new Error(message), { code: error.code });\n}\n\nconst isContext = (value: unknown): value is Context =>\n typeof value === 'object' &&\n value !== null &&\n 'abortSignal' in value &&\n typeof (value as Context).value === 'function';\n\nexport type Root = <R>(\n run: (ctx: Ctx) => Promise<R>,\n options: { signal?: AbortSignal }\n) => Promise<R>;\n\nexport function bound<T extends object>(\n handle: Remote,\n root: Root,\n names: readonly string[],\n absent: (name: string) => Callable\n): T {\n const shape = (handle as { shape?: { members: readonly string[] } }).shape;\n const members = new Set(shape?.members ?? []);\n return Object.fromEntries(\n names.map((name) => {\n if (!members.has(name)) return [name, absent(name)];\n const call = handle[name] as (args: unknown[], ctx: Ctx) => Promise<unknown>;\n return [\n name,\n async (...given: unknown[]) => {\n const last = given.at(-1);\n const context = isContext(last) ? last : undefined;\n const args = context ? given.slice(0, -1) : given;\n const signal = context?.abortSignal;\n try {\n return await root((ctx) => call(args, ctx), signal ? { signal } : {});\n } catch (error) {\n throw plain(error);\n }\n },\n ];\n })\n ) as T;\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {\n type Ctx,\n hostNamed,\n isChordError,\n method,\n type Readable,\n type RemoteContract,\n type ReplicatedState,\n remote,\n type StateEvent,\n} from '@earendil-works/chord';\nimport { BACKGROUND_CONTEXT, type Context, withAbortSignal } from '@earendil-works/chord/context';\nimport { diffRevisions } from '@earendil-works/chord/delta';\nimport { Type } from 'typebox';\n\nexport const AGENT_HOST = 'agent';\n\nexport type Seat = 'owner' | 'control' | 'view' | 'guest';\n\nexport interface GuestPrincipal {\n id: string;\n name: string;\n epoch: number;\n}\n\nexport type AgentPrincipal =\n | { seat: 'owner' | 'control' | 'view'; link: number; device?: string }\n | { seat: 'guest'; link: number; guest: GuestPrincipal }\n | { seat: 'host' };\n\nexport const SELF: AgentPrincipal = { seat: 'host' };\n\nexport const principalKey = (principal: AgentPrincipal): string => {\n if (principal.seat === 'host') return 'host';\n if (principal.seat === 'guest') {\n const { guest, link } = principal;\n return `guest:${guest.id}:e${guest.epoch}:${link}`;\n }\n return `${principal.seat}:${principal.link}`;\n};\n\nexport interface Members {\n methods?: readonly string[];\n state?: readonly string[];\n}\n\nconst Args = Type.Array(Type.Unknown());\nconst Value = Type.Unknown();\n\nexport function contract(name: string, variants: Record<string, Members>): RemoteContract {\n const def: Parameters<typeof remote>[1] = {\n version: 1,\n input: Type.Object({}),\n host: hostNamed(AGENT_HOST),\n variants: Object.fromEntries(\n Object.entries(variants).map(([kind, members]) => [\n kind,\n {\n state: Object.fromEntries((members.state ?? []).map((member) => [member, Value])),\n methods: Object.fromEntries(\n (members.methods ?? []).map((member) => [member, method(Args, Value)])\n ),\n },\n ])\n ),\n };\n return remote(name, def);\n}\n\nexport type Callable = (...args: unknown[]) => Promise<unknown>;\n\nexport const contextOf = (ctx: Ctx): Context => withAbortSignal(ctx.signal, BACKGROUND_CONTEXT);\n\nexport function served(\n impl: () => object,\n names: readonly string[]\n): Record<string, (args: unknown[], ctx: Ctx) => Promise<unknown>> {\n return Object.fromEntries(\n names.map((name) => [\n name,\n (args: unknown[], ctx: Ctx) =>\n ((impl() as Record<string, Callable>)[name] as Callable)(...args, contextOf(ctx)),\n ])\n );\n}\n\nconst readables = new WeakMap<object, Readable<unknown>>();\n\nexport function readable<T>(state: ReplicatedState<T>): Readable<T> {\n const known = readables.get(state);\n if (known) return known as Readable<T>;\n const values = new Set<(value: T) => void>();\n const events = new Set<(event: StateEvent<T>) => void>();\n let value = state.value as T;\n let off: (() => void) | undefined;\n const start = () => {\n if (off) return;\n value = state.value as T;\n off = state.subscribe((next) => {\n const before = value;\n value = next;\n if (before === next) return;\n const event: StateEvent<T> =\n before === undefined\n ? { type: 'reset', value: next }\n : { type: 'ops', ops: diffRevisions(before as never, next as never), value: next };\n for (const listener of [...events]) listener(event);\n for (const listener of [...values]) listener(next);\n });\n };\n const stop = () => {\n if (values.size + events.size > 0 || !off) return;\n off();\n off = undefined;\n };\n const made: Readable<T> = {\n get value() {\n return off ? value : (state.value as T);\n },\n subscribe(listener) {\n values.add(listener);\n start();\n listener(value);\n return () => {\n values.delete(listener);\n stop();\n };\n },\n events(listener) {\n events.add(listener);\n start();\n listener({ type: 'snap', value });\n return () => {\n events.delete(listener);\n stop();\n };\n },\n };\n readables.set(state, made);\n return made;\n}\n\nexport function readablesOf(\n states: Record<string, ReplicatedState<unknown>>\n): Record<string, Readable<unknown>> {\n return Object.fromEntries(Object.entries(states).map(([name, state]) => [name, readable(state)]));\n}\n\nexport interface Remote {\n readonly variant: string | undefined;\n readonly ready: Promise<void>;\n release(): void;\n [member: string]: unknown;\n}\n\nexport function replicated<T>(member: Readable<T>): ReplicatedState<T> {\n return {\n get value() {\n return member.value;\n },\n subscribe(listener: (value: T, context: Context, delivery: never) => unknown) {\n let sequence = 0;\n return member.subscribe((value) => {\n sequence += 1;\n void listener(value, BACKGROUND_CONTEXT, {\n kind: sequence === 1 ? 'hydrate' : 'update',\n sequence,\n } as never);\n });\n },\n } as ReplicatedState<T>;\n}\n\nexport const CLOSED = 'the connection to the agent is closed';\n\nexport function plain(error: unknown): unknown {\n if (!isChordError(error)) return error;\n if (error.code === 'released') return Object.assign(new Error(CLOSED), { code: 'released' });\n const prefix = error.reason ? `${error.code}/${error.reason}: ` : `${error.code}: `;\n const message = error.message.startsWith(prefix)\n ? error.message.slice(prefix.length)\n : error.message;\n return Object.assign(new Error(message), { code: error.code });\n}\n\nconst isContext = (value: unknown): value is Context =>\n typeof value === 'object' &&\n value !== null &&\n 'abortSignal' in value &&\n typeof (value as Context).value === 'function';\n\nexport type Root = <R>(\n run: (ctx: Ctx) => Promise<R>,\n options: { signal?: AbortSignal }\n) => Promise<R>;\n\nexport function bound<T extends object>(\n handle: Remote,\n root: Root,\n names: readonly string[],\n absent: (name: string) => Callable\n): T {\n const shape = (handle as { shape?: { members: readonly string[] } }).shape;\n const members = new Set(shape?.members ?? []);\n return Object.fromEntries(\n names.map((name) => {\n if (!members.has(name)) return [name, absent(name)];\n const call = handle[name] as (args: unknown[], ctx: Ctx) => Promise<unknown>;\n return [\n name,\n async (...given: unknown[]) => {\n const last = given.at(-1);\n const context = isContext(last) ? last : undefined;\n const args = context ? given.slice(0, -1) : given;\n const signal = context?.abortSignal;\n try {\n return await root((ctx) => call(args, ctx), signal ? { signal } : {});\n } catch (error) {\n throw plain(error);\n }\n },\n ];\n })\n ) as T;\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/dist/settings.js CHANGED
@@ -10,6 +10,7 @@ import {
10
10
  adobeProvider,
11
11
  adobeUsage
12
12
  } from "./adobe.js";
13
+ import { abortableBedrock } from "./bedrock.js";
13
14
  import { MCP_ACCOUNT } from "./mcp/label.js";
14
15
  import { BEDROCK, preferredModel } from "./preferred.js";
15
16
  import { BEDROCK as BEDROCK2, PREFERRED_MODELS, preferredModel as preferredModel2 } from "./preferred.js";
@@ -56,7 +57,7 @@ function withDefaultRegions(credentials) {
56
57
  }
57
58
  function createSliccModels(credentials, providers = sliccProviders()) {
58
59
  const models = createModels({ credentials: withDefaultRegions(credentials) });
59
- for (const provider of providers) models.setProvider(provider);
60
+ for (const provider of providers) models.setProvider(abortableBedrock(provider));
60
61
  return models;
61
62
  }
62
63
  const SHORT = { [BEDROCK]: "Bedrock", [ADOBE]: "Adobe" };
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/settings.ts"],
4
- "sourcesContent": ["import { type Context, replicatedState } from '@earendil-works/chord';\nimport { BACKGROUND_CONTEXT } from '@earendil-works/chord/context';\nimport type { CredentialStore, Provider } from '@earendil-works/pi-ai';\nimport { createModels, type MutableModels } from '@earendil-works/pi-ai/models';\nimport { amazonBedrockProvider } from '@earendil-works/pi-ai/providers/amazon-bedrock';\nimport {\n ADOBE,\n ADOBE_PROXY,\n adobeConfig,\n adobeIdentity,\n adobeProvider,\n adobeUsage,\n type Budget,\n} from './adobe.ts';\nimport type { McpAccounts } from './mcp/index.ts';\nimport { MCP_ACCOUNT } from './mcp/label.ts';\nimport { BEDROCK, preferredModel } from './preferred.ts';\nimport type { KeysMoved } from './secrets/legacy.ts';\nimport type { VaultRecords } from './secrets/records.ts';\nimport type { PlainStore } from './secrets/store.ts';\nimport type {\n AccountField,\n AccountState,\n AgentSettings,\n ModelChoice,\n SettingsState,\n} from './services.ts';\n\nexport { BEDROCK, PREFERRED_MODELS, preferredModel } from './preferred.ts';\n\nexport const DEFAULT_MODEL = { provider: BEDROCK, modelId: 'us.anthropic.claude-sonnet-5-5' };\nexport const DEFAULT_REGIONS: Readonly<Record<string, string>> = { [BEDROCK]: 'us-west-2' };\n\nexport const ACCOUNT_FIELDS: Readonly<Record<string, readonly AccountField[]>> = {\n [BEDROCK]: [{ name: 'region', label: 'Region' }],\n};\nconst FIELD_ENV: Readonly<Record<string, string>> = { region: 'AWS_REGION' };\nexport const SIGN_IN_NEEDS_VAULT = \"Adobe sign-in needs seven's vault: update seven\";\nexport const KEY_NEEDS_VAULT = \"API keys are kept in seven's vault: update seven\";\n\nexport async function resolveDefaultModel(\n credentials: CredentialStore,\n providers: Provider[],\n models: MutableModels\n): Promise<{ provider: string; modelId: string }> {\n const stored = new Set((await credentials.list()).map((info) => info.providerId));\n for (const provider of providers) {\n if (!stored.has(provider.id)) continue;\n if (!models.getModels(provider.id).length && provider.refreshModels) {\n await models.refresh({ providers: [provider.id] }).catch(() => undefined);\n }\n const chosen = preferredModel(provider.id, models.getModels(provider.id));\n if (chosen) return { provider: provider.id, modelId: chosen.id };\n }\n return DEFAULT_MODEL;\n}\n\nconst corsFree = new Set([BEDROCK, ADOBE]);\nconst signIn = new Set([ADOBE]);\nconst BUDGET_EVERY = 5 * 60 * 1000;\n\nexport function sliccProviders(version?: string): Provider[] {\n return [amazonBedrockProvider() as Provider, adobeProvider({ version })];\n}\n\nexport function withDefaultRegions(credentials: CredentialStore): CredentialStore {\n return {\n async read(providerId, options) {\n const credential = await credentials.read(providerId, options);\n const region = DEFAULT_REGIONS[providerId];\n if (credential?.type !== 'api_key' || !region || credential.env?.AWS_REGION) {\n return credential;\n }\n return { ...credential, env: { ...credential.env, AWS_REGION: region } };\n },\n list: (options) => credentials.list(options),\n modify: (providerId, fn, options) => credentials.modify(providerId, fn, options),\n delete: (providerId, options) => credentials.delete(providerId, options),\n };\n}\n\nexport function createSliccModels(\n credentials: CredentialStore,\n providers = sliccProviders()\n): MutableModels {\n const models = createModels({ credentials: withDefaultRegions(credentials) });\n for (const provider of providers) models.setProvider(provider);\n return models;\n}\n\nconst SHORT: Record<string, string> = { [BEDROCK]: 'Bedrock', [ADOBE]: 'Adobe' };\n\nfunction labels(\n models: MutableModels,\n providers: Provider[],\n stored: ReadonlySet<string>\n): Record<string, string> {\n return Object.fromEntries(\n providers\n .filter((provider) => !stored.has(provider.id))\n .flatMap((provider) =>\n models\n .getModels(provider.id)\n .map((model) => [\n `${provider.id}/${model.id}`,\n `${model.name} on ${SHORT[provider.id] ?? provider.name ?? provider.id}`,\n ])\n )\n );\n}\n\nfunction choices(\n models: MutableModels,\n providers: Provider[],\n stored: ReadonlySet<string>\n): ModelChoice[] {\n return providers\n .filter((provider) => stored.has(provider.id))\n .flatMap((provider) =>\n models.getModels(provider.id).map((model) => ({\n id: `${provider.id}/${model.id}`,\n label: model.name,\n provider: provider.name ?? provider.id,\n kind: 'chat' as const,\n reasoning: Boolean(model.reasoning),\n images: model.input.includes('image'),\n contextWindow: model.contextWindow,\n }))\n );\n}\n\nfunction accounts(records: Pick<VaultRecords, 'model'>, providers: Provider[]): AccountState[] {\n return providers.map((provider) => {\n const record = records.model(provider.id);\n const fields = ACCOUNT_FIELDS[provider.id];\n return {\n id: provider.id,\n provider: provider.name ?? provider.id,\n identity: record ? (signIn.has(provider.id) ? 'Adobe ID' : 'API key') : '',\n status: !record ? 'disconnected' : record.state === 'expired' ? 'expired' : 'connected',\n auth: signIn.has(provider.id) ? 'oauth' : 'api-key',\n needs: corsFree.has(provider.id) ? 'cors-free-transport' : null,\n store: 'vault',\n ...(fields ? { fields: fields.map((field) => ({ ...field })) } : {}),\n };\n });\n}\n\nexport interface ProviderFields {\n get(providerId: string): Readonly<Record<string, string>> | undefined;\n env(providerId: string): Readonly<Record<string, string>> | undefined;\n set(providerId: string, fields: Record<string, string> | undefined): Promise<void>;\n}\n\nexport async function providerFields(\n store: PlainStore,\n providers: readonly Provider[]\n): Promise<ProviderFields> {\n const known = new Map<string, Record<string, string>>();\n for (const provider of providers) {\n const saved = (await store.get(`model:${provider.id}`)) as Record<string, string> | undefined;\n if (saved && typeof saved === 'object') known.set(provider.id, saved);\n }\n return {\n get: (providerId) => known.get(providerId),\n env(providerId) {\n const fields = known.get(providerId);\n if (!fields) return undefined;\n return Object.fromEntries(\n Object.entries(fields).flatMap(([name, value]) =>\n FIELD_ENV[name] ? [[FIELD_ENV[name], value]] : []\n )\n );\n },\n async set(providerId, fields) {\n const allowed = new Set((ACCOUNT_FIELDS[providerId] ?? []).map((field) => field.name));\n const kept = Object.fromEntries(\n Object.entries(fields ?? {}).filter(\n ([name, value]) => allowed.has(name) && typeof value === 'string' && value.trim() !== ''\n )\n );\n const next = Object.keys(kept).length ? kept : undefined;\n if (next) known.set(providerId, next);\n else known.delete(providerId);\n await store.set(`model:${providerId}`, next);\n },\n };\n}\n\nexport type UsageReader = (token: string) => Promise<Budget | null>;\n\nasync function budget(records: Pick<VaultRecords, 'model'>, usage: UsageReader) {\n const key = records.model(ADOBE)?.placeholder;\n const found = key ? await usage(key).catch(() => null) : null;\n return found ? { provider: ADOBE, ...found } : null;\n}\n\nexport interface SettingsSources {\n records: VaultRecords;\n fields: ProviderFields;\n}\n\nexport async function createAgentSettings(\n models: MutableModels,\n sources: SettingsSources,\n providers = sliccProviders(),\n options: { usage?: UsageReader; every?: number; mcp?: McpAccounts; moved?: KeysMoved } = {}\n): Promise<AgentSettings> {\n const { mcp, moved } = options;\n const { records, fields } = sources;\n const routed = (providerId: string) => (providerId.startsWith(MCP_ACCOUNT) ? mcp : undefined);\n const adobe = providers.find((provider) => provider.id === ADOBE);\n const endpoint = adobe?.baseUrl ?? ADOBE_PROXY;\n const identity = (adobe?.headers as Record<string, string> | undefined) ?? adobeIdentity();\n const usage = options.usage ?? ((token: string) => adobeUsage(token, { endpoint, identity }));\n const snapshot = async (): Promise<SettingsState> => {\n const stored = new Set(\n providers.filter((provider) => records.model(provider.id)).map((provider) => provider.id)\n );\n return {\n models: choices(models, providers, stored),\n labels: labels(models, providers, stored),\n accounts: [...accounts(records, providers), ...((await mcp?.accounts()) ?? [])],\n budget: await budget(records, usage),\n ...(moved?.state.value?.length\n ? { moved: moved.state.value.map((name) => ({ ...name })) }\n : {}),\n };\n };\n const state = replicatedState<SettingsState>(await snapshot());\n let latest = Promise.resolve();\n const refresh = (context: Context) => {\n const next = latest.then(async () => state.replace(context, await snapshot()));\n latest = next.catch(() => undefined);\n return next;\n };\n const signedIn = providers\n .filter((provider) => signIn.has(provider.id))\n .map((provider) => provider.id);\n const discover = (ids: string[]) =>\n models.refresh({ providers: ids }).then(\n () => undefined,\n () => undefined\n );\n if (signedIn.length) {\n const cycle = () =>\n void discover(signedIn)\n .then(() => refresh(BACKGROUND_CONTEXT))\n .catch(() => undefined);\n cycle();\n const timer: unknown = setInterval(cycle, options.every ?? BUDGET_EVERY);\n (timer as { unref?: () => void }).unref?.();\n }\n mcp?.onChange(() => void refresh(BACKGROUND_CONTEXT).catch(() => undefined));\n moved?.state.subscribe((_value, context) => void refresh(context).catch(() => undefined));\n const held = () => signedIn.filter((id) => records.model(id)).join(' ');\n let seen = held();\n records.state.subscribe(() => {\n const now = held();\n const added = now !== seen;\n seen = now;\n const discovered = added ? discover(signedIn) : Promise.resolve();\n void discovered.then(() => refresh(BACKGROUND_CONTEXT)).catch(() => undefined);\n });\n const reread = (context: Context) => records.refresh(context).catch(() => undefined);\n return {\n state,\n async connect(providerId, secret, given, context) {\n const server = routed(providerId);\n if (server) {\n await server.connect(providerId, secret);\n await refresh(context);\n return;\n }\n if (secret !== null)\n throw new Error(signIn.has(providerId) ? SIGN_IN_NEEDS_VAULT : KEY_NEEDS_VAULT);\n if (given !== null) await fields.set(providerId, given);\n await reread(context);\n if (signIn.has(providerId)) await discover([providerId]);\n await refresh(context);\n },\n async signIn(providerId) {\n const server = routed(providerId);\n if (server) return server.signIn(providerId);\n if (providerId !== ADOBE) return null;\n const { clientId, scopes, imsEnvironment } = await adobeConfig(\n endpoint,\n (input, init) => globalThis.fetch(input, init),\n identity\n );\n return { clientId, scopes, imsEnvironment: imsEnvironment || 'prod' };\n },\n async dismissMoved(context) {\n await moved?.dismiss(context);\n await refresh(context);\n },\n async disconnect(providerId, context) {\n const server = routed(providerId);\n if (server) await server.disconnect(providerId);\n else await fields.set(providerId, undefined);\n await reread(context);\n await refresh(context);\n },\n };\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { type Context, replicatedState } from '@earendil-works/chord';\nimport { BACKGROUND_CONTEXT } from '@earendil-works/chord/context';\nimport type { CredentialStore, Provider } from '@earendil-works/pi-ai';\nimport { createModels, type MutableModels } from '@earendil-works/pi-ai/models';\nimport { amazonBedrockProvider } from '@earendil-works/pi-ai/providers/amazon-bedrock';\nimport {\n ADOBE,\n ADOBE_PROXY,\n adobeConfig,\n adobeIdentity,\n adobeProvider,\n adobeUsage,\n type Budget,\n} from './adobe.ts';\nimport { abortableBedrock } from './bedrock.ts';\nimport type { McpAccounts } from './mcp/index.ts';\nimport { MCP_ACCOUNT } from './mcp/label.ts';\nimport { BEDROCK, preferredModel } from './preferred.ts';\nimport type { KeysMoved } from './secrets/legacy.ts';\nimport type { VaultRecords } from './secrets/records.ts';\nimport type { PlainStore } from './secrets/store.ts';\nimport type {\n AccountField,\n AccountState,\n AgentSettings,\n ModelChoice,\n SettingsState,\n} from './services.ts';\n\nexport { BEDROCK, PREFERRED_MODELS, preferredModel } from './preferred.ts';\n\nexport const DEFAULT_MODEL = { provider: BEDROCK, modelId: 'us.anthropic.claude-sonnet-5-5' };\nexport const DEFAULT_REGIONS: Readonly<Record<string, string>> = { [BEDROCK]: 'us-west-2' };\n\nexport const ACCOUNT_FIELDS: Readonly<Record<string, readonly AccountField[]>> = {\n [BEDROCK]: [{ name: 'region', label: 'Region' }],\n};\nconst FIELD_ENV: Readonly<Record<string, string>> = { region: 'AWS_REGION' };\nexport const SIGN_IN_NEEDS_VAULT = \"Adobe sign-in needs seven's vault: update seven\";\nexport const KEY_NEEDS_VAULT = \"API keys are kept in seven's vault: update seven\";\n\nexport async function resolveDefaultModel(\n credentials: CredentialStore,\n providers: Provider[],\n models: MutableModels\n): Promise<{ provider: string; modelId: string }> {\n const stored = new Set((await credentials.list()).map((info) => info.providerId));\n for (const provider of providers) {\n if (!stored.has(provider.id)) continue;\n if (!models.getModels(provider.id).length && provider.refreshModels) {\n await models.refresh({ providers: [provider.id] }).catch(() => undefined);\n }\n const chosen = preferredModel(provider.id, models.getModels(provider.id));\n if (chosen) return { provider: provider.id, modelId: chosen.id };\n }\n return DEFAULT_MODEL;\n}\n\nconst corsFree = new Set([BEDROCK, ADOBE]);\nconst signIn = new Set([ADOBE]);\nconst BUDGET_EVERY = 5 * 60 * 1000;\n\nexport function sliccProviders(version?: string): Provider[] {\n return [amazonBedrockProvider() as Provider, adobeProvider({ version })];\n}\n\nexport function withDefaultRegions(credentials: CredentialStore): CredentialStore {\n return {\n async read(providerId, options) {\n const credential = await credentials.read(providerId, options);\n const region = DEFAULT_REGIONS[providerId];\n if (credential?.type !== 'api_key' || !region || credential.env?.AWS_REGION) {\n return credential;\n }\n return { ...credential, env: { ...credential.env, AWS_REGION: region } };\n },\n list: (options) => credentials.list(options),\n modify: (providerId, fn, options) => credentials.modify(providerId, fn, options),\n delete: (providerId, options) => credentials.delete(providerId, options),\n };\n}\n\nexport function createSliccModels(\n credentials: CredentialStore,\n providers = sliccProviders()\n): MutableModels {\n const models = createModels({ credentials: withDefaultRegions(credentials) });\n for (const provider of providers) models.setProvider(abortableBedrock(provider));\n return models;\n}\n\nconst SHORT: Record<string, string> = { [BEDROCK]: 'Bedrock', [ADOBE]: 'Adobe' };\n\nfunction labels(\n models: MutableModels,\n providers: Provider[],\n stored: ReadonlySet<string>\n): Record<string, string> {\n return Object.fromEntries(\n providers\n .filter((provider) => !stored.has(provider.id))\n .flatMap((provider) =>\n models\n .getModels(provider.id)\n .map((model) => [\n `${provider.id}/${model.id}`,\n `${model.name} on ${SHORT[provider.id] ?? provider.name ?? provider.id}`,\n ])\n )\n );\n}\n\nfunction choices(\n models: MutableModels,\n providers: Provider[],\n stored: ReadonlySet<string>\n): ModelChoice[] {\n return providers\n .filter((provider) => stored.has(provider.id))\n .flatMap((provider) =>\n models.getModels(provider.id).map((model) => ({\n id: `${provider.id}/${model.id}`,\n label: model.name,\n provider: provider.name ?? provider.id,\n kind: 'chat' as const,\n reasoning: Boolean(model.reasoning),\n images: model.input.includes('image'),\n contextWindow: model.contextWindow,\n }))\n );\n}\n\nfunction accounts(records: Pick<VaultRecords, 'model'>, providers: Provider[]): AccountState[] {\n return providers.map((provider) => {\n const record = records.model(provider.id);\n const fields = ACCOUNT_FIELDS[provider.id];\n return {\n id: provider.id,\n provider: provider.name ?? provider.id,\n identity: record ? (signIn.has(provider.id) ? 'Adobe ID' : 'API key') : '',\n status: !record ? 'disconnected' : record.state === 'expired' ? 'expired' : 'connected',\n auth: signIn.has(provider.id) ? 'oauth' : 'api-key',\n needs: corsFree.has(provider.id) ? 'cors-free-transport' : null,\n store: 'vault',\n ...(fields ? { fields: fields.map((field) => ({ ...field })) } : {}),\n };\n });\n}\n\nexport interface ProviderFields {\n get(providerId: string): Readonly<Record<string, string>> | undefined;\n env(providerId: string): Readonly<Record<string, string>> | undefined;\n set(providerId: string, fields: Record<string, string> | undefined): Promise<void>;\n}\n\nexport async function providerFields(\n store: PlainStore,\n providers: readonly Provider[]\n): Promise<ProviderFields> {\n const known = new Map<string, Record<string, string>>();\n for (const provider of providers) {\n const saved = (await store.get(`model:${provider.id}`)) as Record<string, string> | undefined;\n if (saved && typeof saved === 'object') known.set(provider.id, saved);\n }\n return {\n get: (providerId) => known.get(providerId),\n env(providerId) {\n const fields = known.get(providerId);\n if (!fields) return undefined;\n return Object.fromEntries(\n Object.entries(fields).flatMap(([name, value]) =>\n FIELD_ENV[name] ? [[FIELD_ENV[name], value]] : []\n )\n );\n },\n async set(providerId, fields) {\n const allowed = new Set((ACCOUNT_FIELDS[providerId] ?? []).map((field) => field.name));\n const kept = Object.fromEntries(\n Object.entries(fields ?? {}).filter(\n ([name, value]) => allowed.has(name) && typeof value === 'string' && value.trim() !== ''\n )\n );\n const next = Object.keys(kept).length ? kept : undefined;\n if (next) known.set(providerId, next);\n else known.delete(providerId);\n await store.set(`model:${providerId}`, next);\n },\n };\n}\n\nexport type UsageReader = (token: string) => Promise<Budget | null>;\n\nasync function budget(records: Pick<VaultRecords, 'model'>, usage: UsageReader) {\n const key = records.model(ADOBE)?.placeholder;\n const found = key ? await usage(key).catch(() => null) : null;\n return found ? { provider: ADOBE, ...found } : null;\n}\n\nexport interface SettingsSources {\n records: VaultRecords;\n fields: ProviderFields;\n}\n\nexport async function createAgentSettings(\n models: MutableModels,\n sources: SettingsSources,\n providers = sliccProviders(),\n options: { usage?: UsageReader; every?: number; mcp?: McpAccounts; moved?: KeysMoved } = {}\n): Promise<AgentSettings> {\n const { mcp, moved } = options;\n const { records, fields } = sources;\n const routed = (providerId: string) => (providerId.startsWith(MCP_ACCOUNT) ? mcp : undefined);\n const adobe = providers.find((provider) => provider.id === ADOBE);\n const endpoint = adobe?.baseUrl ?? ADOBE_PROXY;\n const identity = (adobe?.headers as Record<string, string> | undefined) ?? adobeIdentity();\n const usage = options.usage ?? ((token: string) => adobeUsage(token, { endpoint, identity }));\n const snapshot = async (): Promise<SettingsState> => {\n const stored = new Set(\n providers.filter((provider) => records.model(provider.id)).map((provider) => provider.id)\n );\n return {\n models: choices(models, providers, stored),\n labels: labels(models, providers, stored),\n accounts: [...accounts(records, providers), ...((await mcp?.accounts()) ?? [])],\n budget: await budget(records, usage),\n ...(moved?.state.value?.length\n ? { moved: moved.state.value.map((name) => ({ ...name })) }\n : {}),\n };\n };\n const state = replicatedState<SettingsState>(await snapshot());\n let latest = Promise.resolve();\n const refresh = (context: Context) => {\n const next = latest.then(async () => state.replace(context, await snapshot()));\n latest = next.catch(() => undefined);\n return next;\n };\n const signedIn = providers\n .filter((provider) => signIn.has(provider.id))\n .map((provider) => provider.id);\n const discover = (ids: string[]) =>\n models.refresh({ providers: ids }).then(\n () => undefined,\n () => undefined\n );\n if (signedIn.length) {\n const cycle = () =>\n void discover(signedIn)\n .then(() => refresh(BACKGROUND_CONTEXT))\n .catch(() => undefined);\n cycle();\n const timer: unknown = setInterval(cycle, options.every ?? BUDGET_EVERY);\n (timer as { unref?: () => void }).unref?.();\n }\n mcp?.onChange(() => void refresh(BACKGROUND_CONTEXT).catch(() => undefined));\n moved?.state.subscribe((_value, context) => void refresh(context).catch(() => undefined));\n const held = () => signedIn.filter((id) => records.model(id)).join(' ');\n let seen = held();\n records.state.subscribe(() => {\n const now = held();\n const added = now !== seen;\n seen = now;\n const discovered = added ? discover(signedIn) : Promise.resolve();\n void discovered.then(() => refresh(BACKGROUND_CONTEXT)).catch(() => undefined);\n });\n const reread = (context: Context) => records.refresh(context).catch(() => undefined);\n return {\n state,\n async connect(providerId, secret, given, context) {\n const server = routed(providerId);\n if (server) {\n await server.connect(providerId, secret);\n await refresh(context);\n return;\n }\n if (secret !== null)\n throw new Error(signIn.has(providerId) ? SIGN_IN_NEEDS_VAULT : KEY_NEEDS_VAULT);\n if (given !== null) await fields.set(providerId, given);\n await reread(context);\n if (signIn.has(providerId)) await discover([providerId]);\n await refresh(context);\n },\n async signIn(providerId) {\n const server = routed(providerId);\n if (server) return server.signIn(providerId);\n if (providerId !== ADOBE) return null;\n const { clientId, scopes, imsEnvironment } = await adobeConfig(\n endpoint,\n (input, init) => globalThis.fetch(input, init),\n identity\n );\n return { clientId, scopes, imsEnvironment: imsEnvironment || 'prod' };\n },\n async dismissMoved(context) {\n await moved?.dismiss(context);\n await refresh(context);\n },\n async disconnect(providerId, context) {\n const server = routed(providerId);\n if (server) await server.disconnect(providerId);\n else await fields.set(providerId, undefined);\n await reread(context);\n await refresh(context);\n },\n };\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["BEDROCK", "preferredModel"]
7
7
  }
@@ -0,0 +1,14 @@
1
+ import type { Provider } from '@earendil-works/pi-ai';
2
+ export declare const UNPATCHED_COPY = "aws-websocket-abort-signal: Bedrock answered through a WebSocketFetchHandler the agent didn't patch, so Stop can't cancel its requests; the agent and @aws-sdk/client-bedrock-runtime load different copies of @aws-sdk/middleware-websocket";
3
+ export interface Probe {
4
+ sent: number;
5
+ }
6
+ export declare function patchWebSocketHandler(target: {
7
+ prototype: object;
8
+ }): Probe;
9
+ export declare function patchBedrockAbort(load?: () => Promise<{
10
+ WebSocketFetchHandler: {
11
+ prototype: object;
12
+ };
13
+ }>): Promise<Probe>;
14
+ export declare function abortableBedrock(provider: Provider, patch?: () => Promise<Probe>, warn?: (message: string) => void): Provider;
@@ -1,4 +1,4 @@
1
- import { type Context, type ReplicatedState } from '@earendil-works/chord';
1
+ import { type Context, type Host, type ReplicatedState } from '@earendil-works/chord';
2
2
  import type { ConversationView } from '@earendil-works/pi-durable';
3
3
  import type { ApprovalPolicy } from './approvals/policy.ts';
4
4
  import type { Approval } from './approvals/record.ts';
@@ -10,8 +10,9 @@ import type { AgentRemote } from './remote/host.ts';
10
10
  import type { AgentPages } from './remote/pages.ts';
11
11
  import type { VaultState } from './secrets/vault.ts';
12
12
  import { AgentControl, AgentSettings, type AgentsSummary, type Command, type Delivered, type GuestProposal, type GuestShown, type MonitorFeed, type PrivateRevision, type SendMode } from './services.ts';
13
+ import { type AgentPrincipal, type Remote } from './serving.ts';
13
14
  import type { Sprinkle } from './sprinkles/kind.ts';
14
- import { type PortEndpoint } from './wire.ts';
15
+ import { type PortEndpoint, PortLink } from './wire.ts';
15
16
  export interface AgentConnection {
16
17
  readonly serverId: string;
17
18
  readonly control: AgentControl;
@@ -56,8 +57,12 @@ export interface Lasting<T> {
56
57
  freeze(): void;
57
58
  }
58
59
  export declare function lasting<T>(state: ReplicatedState<T>): Lasting<T>;
59
- export declare const OTHER_VERSION = "That SLICC runs another version of the agent, so this tab can't follow it. Update both SLICCs, then reload this page.";
60
60
  export declare const final: (error: unknown) => unknown;
61
+ export declare const ended: (link: PortLink) => Promise<never>;
62
+ type Contract = Parameters<Host<AgentPrincipal>['get']>[0];
63
+ export declare function clientHost(link: PortLink, name: string): Host<AgentPrincipal>;
64
+ export declare function holding(host: Host<AgentPrincipal>, link: PortLink, contracts: readonly Contract[]): Promise<Remote[]>;
61
65
  export declare function connectAgent(endpoint: PortEndpoint, options?: {
62
66
  context?: Context;
63
67
  }): Promise<AgentConnection>;
68
+ export {};
@@ -2,10 +2,11 @@ import type { Context, Host, ReplicatedState } from '@earendil-works/chord';
2
2
  import type { ConversationView } from '@earendil-works/pi-durable';
3
3
  import type { Agents } from '../agents.ts';
4
4
  import type { AgentGuest, GuestProposal } from '../services.ts';
5
- import type { GuestPrincipal } from '../serving.ts';
5
+ import type { AgentPrincipal, GuestPrincipal } from '../serving.ts';
6
6
  import { type PortEndpoint } from '../wire.ts';
7
7
  import type { Guests } from './index.ts';
8
8
  import type { ReviewsState } from './review.ts';
9
+ export declare const GUEST_CALLS = 4;
9
10
  export declare function proposalsOf(state: ReviewsState | null | undefined, seat: string): GuestProposal[];
10
11
  export declare function guestOpener(guests: Guests, agents: Pick<Agents, 'state'>, views: ReplicatedState<Record<string, ConversationView>>, context: Context): (principal: GuestPrincipal) => {
11
12
  value: AgentGuest;
@@ -14,4 +15,4 @@ export declare function guestOpener(guests: Guests, agents: Pick<Agents, 'state'
14
15
  export declare function admitGuest(guests: Guests, endpoint: PortEndpoint, asked: {
15
16
  id: string;
16
17
  label: string;
17
- }, serverId: string, link: number, host: Pick<Host, 'accept'>): void;
18
+ }, serverId: string, link: number, host: Pick<Host<AgentPrincipal>, 'accept'>): void;
@@ -16,7 +16,7 @@ import { type Pages } from './remote/pages.ts';
16
16
  import type { SecretName } from './secrets/names.ts';
17
17
  import type { VaultState } from './secrets/vault.ts';
18
18
  import { AgentControl, type AgentGuest, AgentSettings, AgentTranscript } from './services.ts';
19
- import { type GuestPrincipal } from './serving.ts';
19
+ import { type AgentPrincipal, type GuestPrincipal } from './serving.ts';
20
20
  import type { SkillsRuntime } from './skills/index.ts';
21
21
  import type { SprinklesRuntime } from './sprinkles/index.ts';
22
22
  import { type Thumbnail } from './thumbs.ts';
@@ -88,7 +88,7 @@ interface Served {
88
88
  }
89
89
  export declare const CLOSED_TO_GUESTS = "a guest seat has only its transcript and propose";
90
90
  export declare const openToGuests: <F extends object>(factory: F) => F;
91
- export declare function closedToGuests(host: Host): Host;
91
+ export declare function closedToGuests(host: Host<AgentPrincipal>): Host<AgentPrincipal>;
92
92
  export declare function lazily<T>(state: () => ReplicatedState<T>): Readable<T>;
93
- export declare function serveAgent(serving: Served): Host;
93
+ export declare function serveAgent(serving: Served): Host<AgentPrincipal>;
94
94
  export {};
@@ -1 +1,2 @@
1
1
  export declare const MCP_SSE_PATCH = "pi-mcp-sse-buffer";
2
+ export declare const BEDROCK_ABORT_PATCH = "aws-websocket-abort-signal";
@@ -1,4 +1,4 @@
1
- import { type Ctx, type Principal, type Readable, type RemoteContract, type ReplicatedState } from '@earendil-works/chord';
1
+ import { type Ctx, type Readable, type RemoteContract, type ReplicatedState } from '@earendil-works/chord';
2
2
  import { type Context } from '@earendil-works/chord/context';
3
3
  export declare const AGENT_HOST = "agent";
4
4
  export type Seat = 'owner' | 'control' | 'view' | 'guest';
@@ -7,16 +7,19 @@ export interface GuestPrincipal {
7
7
  name: string;
8
8
  epoch: number;
9
9
  }
10
- export interface AgentPrincipal {
11
- seat: Seat;
10
+ export type AgentPrincipal = {
11
+ seat: 'owner' | 'control' | 'view';
12
12
  link: number;
13
- guest?: GuestPrincipal;
14
13
  device?: string;
15
- }
16
- export declare const seatOf: (principal: Principal) => Seat;
17
- export declare const guestOf: (principal: Principal) => GuestPrincipal | undefined;
18
- export declare const deviceOf: (principal: Principal) => string | undefined;
19
- export declare const principalKey: (principal: Principal) => string;
14
+ } | {
15
+ seat: 'guest';
16
+ link: number;
17
+ guest: GuestPrincipal;
18
+ } | {
19
+ seat: 'host';
20
+ };
21
+ export declare const SELF: AgentPrincipal;
22
+ export declare const principalKey: (principal: AgentPrincipal) => string;
20
23
  export interface Members {
21
24
  methods?: readonly string[];
22
25
  state?: readonly string[];
@@ -28,16 +31,12 @@ export declare function served(impl: () => object, names: readonly string[]): Re
28
31
  export declare function readable<T>(state: ReplicatedState<T>): Readable<T>;
29
32
  export declare function readablesOf(states: Record<string, ReplicatedState<unknown>>): Record<string, Readable<unknown>>;
30
33
  export interface Remote {
31
- readonly kind: string | undefined;
34
+ readonly variant: string | undefined;
32
35
  readonly ready: Promise<void>;
33
36
  release(): void;
34
37
  [member: string]: unknown;
35
38
  }
36
- export declare function replicated<T>(member: Readable<T | undefined>): ReplicatedState<T>;
37
- export declare function kept(member: Readable<unknown>): {
38
- ready: Promise<void>;
39
- stop(): void;
40
- };
39
+ export declare function replicated<T>(member: Readable<T>): ReplicatedState<T>;
41
40
  export declare const CLOSED = "the connection to the agent is closed";
42
41
  export declare function plain(error: unknown): unknown;
43
42
  export type Root = <R>(run: (ctx: Ctx) => Promise<R>, options: {
@@ -1,4 +1,4 @@
1
- import type { Frame as ChordFrame, Link } from '@earendil-works/chord';
1
+ import { type Frame as ChordFrame, type Link } from '@earendil-works/chord';
2
2
  export interface PortEndpoint {
3
3
  postMessage(message: unknown, transfer?: Transferable[]): void;
4
4
  addEventListener(type: 'message', listener: (event: MessageEvent) => void): void;
@@ -11,6 +11,8 @@ export type Frame = {
11
11
  } | {
12
12
  close: true;
13
13
  } | Uint8Array;
14
+ export declare const OTHER_VERSION = "That SLICC runs another version of the agent, so this tab can't follow it. Update both SLICCs, then reload this page.";
15
+ export declare const otherVersion: (cause?: unknown) => Error;
14
16
  export declare class PortLink implements Link {
15
17
  #private;
16
18
  readonly hello: Promise<string>;
@@ -18,7 +20,8 @@ export declare class PortLink implements Link {
18
20
  constructor(endpoint: PortEndpoint);
19
21
  get closed(): boolean;
20
22
  greet(serverId: string): void;
21
- send(frame: ChordFrame): void;
23
+ mismatched(): void;
24
+ send(frame: ChordFrame): number;
22
25
  receive(handler: (frame: ChordFrame) => void): void;
23
26
  onClose(handler: (reason: string) => void): void;
24
27
  close(reason?: string): void;
package/dist/wire.js CHANGED
@@ -1,3 +1,8 @@
1
+ import { PROTOCOL_VERSION } from "@earendil-works/chord";
2
+ const OTHER_VERSION = "That SLICC runs another version of the agent, so this tab can't follow it. Update both SLICCs, then reload this page.";
3
+ const otherVersion = (cause) => Object.assign(new Error(OTHER_VERSION, cause === void 0 ? void 0 : { cause }), {
4
+ code: "EVERSION"
5
+ });
1
6
  const encoder = new TextEncoder();
2
7
  const decoder = new TextDecoder();
3
8
  function parse(chunk) {
@@ -14,14 +19,18 @@ class PortLink {
14
19
  #closers = /* @__PURE__ */ new Set();
15
20
  #handler;
16
21
  #closed = false;
22
+ #held;
23
+ #heard = false;
24
+ #legacy = false;
25
+ #mismatch = false;
17
26
  #greet;
18
- #refuse;
27
+ #unwelcome;
19
28
  #finish;
20
29
  constructor(endpoint) {
21
30
  this.#endpoint = endpoint;
22
- this.hello = new Promise((greet, refuse) => {
31
+ this.hello = new Promise((greet, unwelcome) => {
23
32
  this.#greet = greet;
24
- this.#refuse = refuse;
33
+ this.#unwelcome = unwelcome;
25
34
  });
26
35
  this.hello.catch(() => void 0);
27
36
  this.ended = new Promise((finish) => {
@@ -38,11 +47,21 @@ class PortLink {
38
47
  return this.#closed;
39
48
  }
40
49
  greet(serverId) {
50
+ this.#held ??= [];
41
51
  this.#endpoint.postMessage({ hello: serverId });
42
52
  }
53
+ mismatched() {
54
+ this.#mismatch = true;
55
+ }
43
56
  send(frame) {
44
- if (this.#closed) return;
57
+ if (this.#closed) return 0;
45
58
  const bytes = encoder.encode(JSON.stringify(frame));
59
+ const size = bytes.byteLength;
60
+ if (this.#held) this.#held.push(bytes);
61
+ else this.#post(bytes);
62
+ return size;
63
+ }
64
+ #post(bytes) {
46
65
  this.#endpoint.postMessage(bytes, [bytes.buffer]);
47
66
  }
48
67
  receive(handler) {
@@ -55,6 +74,7 @@ class PortLink {
55
74
  }
56
75
  close(reason = "closed") {
57
76
  if (this.#closed) return;
77
+ this.#held = void 0;
58
78
  this.send({ t: "bye", reason });
59
79
  this.#endpoint.postMessage({ close: true });
60
80
  this.#end(reason, false);
@@ -76,21 +96,43 @@ class PortLink {
76
96
  return;
77
97
  }
78
98
  if (frame.t === "bye") this.#end(frame.reason ?? "peer closed", false);
99
+ else if (!this.#heard) this.#hello(frame);
100
+ else if (this.#legacy) this.#refuse(frame);
79
101
  else this.#handler?.(frame);
80
102
  }
103
+ #hello(frame) {
104
+ this.#heard = true;
105
+ const held = this.#held;
106
+ this.#held = void 0;
107
+ if (frame.t !== "hello" || frame.protocol !== void 0) {
108
+ for (const bytes of held ?? []) this.#post(bytes);
109
+ this.#handler?.(frame);
110
+ return;
111
+ }
112
+ this.#legacy = true;
113
+ this.#mismatch = true;
114
+ if (!held) this.close(`protocol-version ${PROTOCOL_VERSION}`);
115
+ }
116
+ #refuse(frame) {
117
+ if (frame.t !== "hold") return;
118
+ const error = { code: "upgrade_required", message: `upgrade_required: ${OTHER_VERSION}` };
119
+ this.#post(encoder.encode(JSON.stringify({ t: "gone", id: frame.id, error })));
120
+ }
81
121
  #end(reason, failed) {
82
122
  if (this.#closed) return;
83
123
  this.#closed = true;
84
124
  this.#queue.length = 0;
125
+ this.#held = void 0;
85
126
  this.#endpoint.close?.();
86
- const error = new Error(reason);
87
- this.#refuse(new Error(`agent port closed before hello: ${reason}`));
88
- this.#finish(failed ? error : void 0);
127
+ this.#unwelcome(new Error(`agent port closed before hello: ${reason}`));
89
128
  for (const handler of [...this.#closers]) handler(reason);
90
129
  this.#closers.clear();
130
+ this.#finish(this.#mismatch ? otherVersion() : failed ? new Error(reason) : void 0);
91
131
  }
92
132
  }
93
133
  export {
94
- PortLink
134
+ OTHER_VERSION,
135
+ PortLink,
136
+ otherVersion
95
137
  };
96
138
  //# sourceMappingURL=wire.js.map
package/dist/wire.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/wire.ts"],
4
- "sourcesContent": ["import type { Frame as ChordFrame, Link } from '@earendil-works/chord';\n\nexport interface PortEndpoint {\n postMessage(message: unknown, transfer?: Transferable[]): void;\n addEventListener(type: 'message', listener: (event: MessageEvent) => void): void;\n addEventListener(\n type: 'close' | 'messageerror' | 'error',\n listener: (event: Event) => void\n ): void;\n start?(): void;\n close?(): void;\n}\n\nexport type Frame = { hello: string } | { close: true } | Uint8Array;\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\n\nfunction parse(chunk: Uint8Array): ChordFrame {\n const frame = JSON.parse(decoder.decode(chunk)) as { t?: unknown } | null;\n if (frame === null || typeof frame !== 'object' || typeof frame.t !== 'string')\n throw new TypeError('not a chord frame');\n return frame as ChordFrame;\n}\n\nexport class PortLink implements Link {\n readonly hello: Promise<string>;\n readonly ended: Promise<Error | undefined>;\n readonly #endpoint: PortEndpoint;\n readonly #queue: Uint8Array[] = [];\n readonly #closers = new Set<(reason: string) => void>();\n #handler: ((frame: ChordFrame) => void) | undefined;\n #closed = false;\n #greet!: (hello: string) => void;\n #refuse!: (error: Error) => void;\n #finish!: (reason: Error | undefined) => void;\n\n constructor(endpoint: PortEndpoint) {\n this.#endpoint = endpoint;\n this.hello = new Promise((greet, refuse) => {\n this.#greet = greet;\n this.#refuse = refuse;\n });\n this.hello.catch(() => undefined);\n this.ended = new Promise((finish) => {\n this.#finish = finish;\n });\n endpoint.addEventListener('message', ({ data }) => this.#receive(data as Frame));\n const failed = (event: Event) => this.#end(`agent port ${event.type}`, true);\n endpoint.addEventListener('messageerror', failed);\n endpoint.addEventListener('error', failed);\n endpoint.addEventListener('close', () => this.#end('peer closed', false));\n endpoint.start?.();\n }\n\n get closed(): boolean {\n return this.#closed;\n }\n\n greet(serverId: string): void {\n this.#endpoint.postMessage({ hello: serverId } satisfies Frame);\n }\n\n send(frame: ChordFrame): void {\n if (this.#closed) return;\n const bytes = encoder.encode(JSON.stringify(frame));\n this.#endpoint.postMessage(bytes, [bytes.buffer]);\n }\n\n receive(handler: (frame: ChordFrame) => void): void {\n this.#handler = handler;\n for (const chunk of this.#queue.splice(0)) this.#deliver(chunk);\n }\n\n onClose(handler: (reason: string) => void): void {\n if (this.#closed) handler('closed');\n else this.#closers.add(handler);\n }\n\n close(reason = 'closed'): void {\n if (this.#closed) return;\n this.send({ t: 'bye', reason });\n this.#endpoint.postMessage({ close: true } satisfies Frame);\n this.#end(reason, false);\n }\n\n #receive(frame: Frame): void {\n if (this.#closed) return;\n if (frame instanceof Uint8Array) {\n if (this.#handler) this.#deliver(frame);\n else this.#queue.push(frame);\n } else if ('hello' in frame) this.#greet(frame.hello);\n else this.#end('peer closed', false);\n }\n\n #deliver(chunk: Uint8Array): void {\n let frame: ChordFrame;\n try {\n frame = parse(chunk);\n } catch {\n this.close('protocol error');\n return;\n }\n if (frame.t === 'bye') this.#end(frame.reason ?? 'peer closed', false);\n else this.#handler?.(frame);\n }\n\n #end(reason: string, failed: boolean): void {\n if (this.#closed) return;\n this.#closed = true;\n this.#queue.length = 0;\n this.#endpoint.close?.();\n const error = new Error(reason);\n this.#refuse(new Error(`agent port closed before hello: ${reason}`));\n this.#finish(failed ? error : undefined);\n for (const handler of [...this.#closers]) handler(reason);\n this.#closers.clear();\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { type Frame as ChordFrame, type Link, PROTOCOL_VERSION } from '@earendil-works/chord';\n\nexport interface PortEndpoint {\n postMessage(message: unknown, transfer?: Transferable[]): void;\n addEventListener(type: 'message', listener: (event: MessageEvent) => void): void;\n addEventListener(\n type: 'close' | 'messageerror' | 'error',\n listener: (event: Event) => void\n ): void;\n start?(): void;\n close?(): void;\n}\n\nexport type Frame = { hello: string } | { close: true } | Uint8Array;\n\nexport const OTHER_VERSION =\n \"That SLICC runs another version of the agent, so this tab can't follow it. Update both SLICCs, then reload this page.\";\n\nexport const otherVersion = (cause?: unknown): Error =>\n Object.assign(new Error(OTHER_VERSION, cause === undefined ? undefined : { cause }), {\n code: 'EVERSION',\n });\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\n\nfunction parse(chunk: Uint8Array): ChordFrame {\n const frame = JSON.parse(decoder.decode(chunk)) as { t?: unknown } | null;\n if (frame === null || typeof frame !== 'object' || typeof frame.t !== 'string')\n throw new TypeError('not a chord frame');\n return frame as ChordFrame;\n}\n\nexport class PortLink implements Link {\n readonly hello: Promise<string>;\n readonly ended: Promise<Error | undefined>;\n readonly #endpoint: PortEndpoint;\n readonly #queue: Uint8Array[] = [];\n readonly #closers = new Set<(reason: string) => void>();\n #handler: ((frame: ChordFrame) => void) | undefined;\n #closed = false;\n #held: Uint8Array[] | undefined;\n #heard = false;\n #legacy = false;\n #mismatch = false;\n #greet!: (hello: string) => void;\n #unwelcome!: (error: Error) => void;\n #finish!: (reason: Error | undefined) => void;\n\n constructor(endpoint: PortEndpoint) {\n this.#endpoint = endpoint;\n this.hello = new Promise((greet, unwelcome) => {\n this.#greet = greet;\n this.#unwelcome = unwelcome;\n });\n this.hello.catch(() => undefined);\n this.ended = new Promise((finish) => {\n this.#finish = finish;\n });\n endpoint.addEventListener('message', ({ data }) => this.#receive(data as Frame));\n const failed = (event: Event) => this.#end(`agent port ${event.type}`, true);\n endpoint.addEventListener('messageerror', failed);\n endpoint.addEventListener('error', failed);\n endpoint.addEventListener('close', () => this.#end('peer closed', false));\n endpoint.start?.();\n }\n\n get closed(): boolean {\n return this.#closed;\n }\n\n greet(serverId: string): void {\n this.#held ??= [];\n this.#endpoint.postMessage({ hello: serverId } satisfies Frame);\n }\n\n mismatched(): void {\n this.#mismatch = true;\n }\n\n send(frame: ChordFrame): number {\n if (this.#closed) return 0;\n const bytes = encoder.encode(JSON.stringify(frame));\n const size = bytes.byteLength;\n if (this.#held) this.#held.push(bytes);\n else this.#post(bytes);\n return size;\n }\n\n #post(bytes: Uint8Array): void {\n this.#endpoint.postMessage(bytes, [bytes.buffer]);\n }\n\n receive(handler: (frame: ChordFrame) => void): void {\n this.#handler = handler;\n for (const chunk of this.#queue.splice(0)) this.#deliver(chunk);\n }\n\n onClose(handler: (reason: string) => void): void {\n if (this.#closed) handler('closed');\n else this.#closers.add(handler);\n }\n\n close(reason = 'closed'): void {\n if (this.#closed) return;\n this.#held = undefined;\n this.send({ t: 'bye', reason });\n this.#endpoint.postMessage({ close: true } satisfies Frame);\n this.#end(reason, false);\n }\n\n #receive(frame: Frame): void {\n if (this.#closed) return;\n if (frame instanceof Uint8Array) {\n if (this.#handler) this.#deliver(frame);\n else this.#queue.push(frame);\n } else if ('hello' in frame) this.#greet(frame.hello);\n else this.#end('peer closed', false);\n }\n\n #deliver(chunk: Uint8Array): void {\n let frame: ChordFrame;\n try {\n frame = parse(chunk);\n } catch {\n this.close('protocol error');\n return;\n }\n if (frame.t === 'bye') this.#end(frame.reason ?? 'peer closed', false);\n else if (!this.#heard) this.#hello(frame);\n else if (this.#legacy) this.#refuse(frame);\n else this.#handler?.(frame);\n }\n\n #hello(frame: ChordFrame): void {\n this.#heard = true;\n const held = this.#held;\n this.#held = undefined;\n if (frame.t !== 'hello' || frame.protocol !== undefined) {\n for (const bytes of held ?? []) this.#post(bytes);\n this.#handler?.(frame);\n return;\n }\n this.#legacy = true;\n this.#mismatch = true;\n if (!held) this.close(`protocol-version ${PROTOCOL_VERSION}`);\n }\n\n #refuse(frame: ChordFrame): void {\n if (frame.t !== 'hold') return;\n const error = { code: 'upgrade_required', message: `upgrade_required: ${OTHER_VERSION}` };\n this.#post(encoder.encode(JSON.stringify({ t: 'gone', id: frame.id, error })));\n }\n\n #end(reason: string, failed: boolean): void {\n if (this.#closed) return;\n this.#closed = true;\n this.#queue.length = 0;\n this.#held = undefined;\n this.#endpoint.close?.();\n this.#unwelcome(new Error(`agent port closed before hello: ${reason}`));\n for (const handler of [...this.#closers]) handler(reason);\n this.#closers.clear();\n this.#finish(this.#mismatch ? otherVersion() : failed ? new Error(reason) : undefined);\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-ecoverse/slicc-agent",
3
- "version": "5.10.1",
3
+ "version": "6.0.1",
4
4
  "description": "SLICC's agent core on pi durable: an agent worker, session storage, remoting and pi extensions",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -65,7 +65,7 @@
65
65
  "devDependencies": {
66
66
  "@ai-ecoverse/slicc-kernel": "1.110.0",
67
67
  "@ai-ecoverse/slicc-scrub": "1.0.0",
68
- "@ai-ecoverse/slicc-shared-web": "1.23.0",
68
+ "@ai-ecoverse/slicc-shared-web": "1.23.1",
69
69
  "@ai-ecoverse/slicc-spectrum": "1.84.2",
70
70
  "@ai-ecoverse/wasm-bash": "5.3.0-18",
71
71
  "@ai-ecoverse/wasm-coreutils": "9.12.0-8",
@@ -78,12 +78,14 @@
78
78
  "monocart-coverage-reports": "2.13.2",
79
79
  "playwright-core": "1.64.0",
80
80
  "semantic-release": "25.0.9",
81
+ "slicc-agent-5": "npm:@ai-ecoverse/slicc-agent@5.10.1",
81
82
  "typescript": "7.0.2"
82
83
  },
83
84
  "dependencies": {
84
85
  "@ai-ecoverse/slicc-browsers": "1.7.6",
85
86
  "@ai-ecoverse/slicc-vault": "1.9.1",
86
- "@earendil-works/chord": "1.2.0",
87
+ "@aws-sdk/middleware-websocket": "^3.972.54",
88
+ "@earendil-works/chord": "1.3.0",
87
89
  "@earendil-works/pi-ai": "1.3.0",
88
90
  "@earendil-works/pi-codemode": "1.3.0",
89
91
  "@earendil-works/pi-durable": "1.3.0",