@ai-ecoverse/slicc-agent 4.3.4 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/README.md +8 -9
  2. package/dist/browser/guard.js +1 -1
  3. package/dist/browser/guard.js.map +2 -2
  4. package/dist/client.js +89 -84
  5. package/dist/client.js.map +3 -3
  6. package/dist/codemode/index.js +8 -12
  7. package/dist/codemode/index.js.map +2 -2
  8. package/dist/host.js +69 -117
  9. package/dist/host.js.map +3 -3
  10. package/dist/images/index.js +2 -2
  11. package/dist/images/index.js.map +2 -2
  12. package/dist/index.js +4 -13
  13. package/dist/index.js.map +2 -2
  14. package/dist/licks/extension.js +2 -2
  15. package/dist/licks/extension.js.map +2 -2
  16. package/dist/mcp/tools.js +3 -3
  17. package/dist/mcp/tools.js.map +2 -2
  18. package/dist/memory/extract.js +3 -1
  19. package/dist/memory/extract.js.map +2 -2
  20. package/dist/memory/prompt.js +2 -2
  21. package/dist/memory/prompt.js.map +2 -2
  22. package/dist/mismatch.js +9 -4
  23. package/dist/mismatch.js.map +2 -2
  24. package/dist/patches.js +1 -22
  25. package/dist/patches.js.map +2 -2
  26. package/dist/readonly.js +12 -38
  27. package/dist/readonly.js.map +2 -2
  28. package/dist/scoops/extension.js +1 -1
  29. package/dist/scoops/extension.js.map +2 -2
  30. package/dist/secrets/extension.js +13 -5
  31. package/dist/secrets/extension.js.map +2 -2
  32. package/dist/services.js +111 -13
  33. package/dist/services.js.map +2 -2
  34. package/dist/serving.js +174 -0
  35. package/dist/serving.js.map +7 -0
  36. package/dist/settings.js +4 -18
  37. package/dist/settings.js.map +2 -2
  38. package/dist/spectrum/agent-port.js +5 -1
  39. package/dist/spectrum/agent-port.js.map +2 -2
  40. package/dist/spectrum/index.js +11 -2
  41. package/dist/spectrum/index.js.map +2 -2
  42. package/dist/spectrum/notices-port.js +17 -2
  43. package/dist/spectrum/notices-port.js.map +2 -2
  44. package/dist/types/host.d.ts +15 -3
  45. package/dist/types/index.d.ts +2 -4
  46. package/dist/types/mismatch.d.ts +2 -2
  47. package/dist/types/patches.d.ts +0 -10
  48. package/dist/types/readonly.d.ts +6 -4
  49. package/dist/types/services.d.ts +13 -13
  50. package/dist/types/serving.d.ts +37 -0
  51. package/dist/types/settings.d.ts +0 -1
  52. package/dist/types/spectrum/agent-port.d.ts +2 -0
  53. package/dist/types/spectrum/index.d.ts +1 -1
  54. package/dist/types/spectrum/notices-port.d.ts +3 -1
  55. package/dist/types/wire.d.ts +10 -8
  56. package/dist/wire.js +70 -77
  57. package/dist/wire.js.map +2 -2
  58. package/package.json +13 -14
  59. package/dist/listener.js +0 -73
  60. package/dist/listener.js.map +0 -7
  61. package/dist/types/listener.d.ts +0 -11
package/dist/settings.js CHANGED
@@ -1,4 +1,4 @@
1
- import { RemoteServiceError, replicatedState } from "@earendil-works/chord";
1
+ import { replicatedState } from "@earendil-works/chord";
2
2
  import { BACKGROUND_CONTEXT } from "@earendil-works/chord/context";
3
3
  import { createModels } from "@earendil-works/pi-ai/models";
4
4
  import { amazonBedrockProvider } from "@earendil-works/pi-ai/providers/amazon-bedrock";
@@ -130,16 +130,6 @@ async function providerFields(store, providers) {
130
130
  }
131
131
  };
132
132
  }
133
- async function shown(run) {
134
- try {
135
- return await run();
136
- } catch (error) {
137
- throw new RemoteServiceError(
138
- "service_invalid_value",
139
- error instanceof Error ? error.message : String(error)
140
- );
141
- }
142
- }
143
133
  async function budget(records, usage) {
144
134
  const key = records.model(ADOBE)?.placeholder;
145
135
  const found = key ? await usage(key).catch(() => null) : null;
@@ -200,15 +190,12 @@ async function createAgentSettings(models, sources, providers = sliccProviders()
200
190
  async connect(providerId, secret, given, context) {
201
191
  const server = routed(providerId);
202
192
  if (server) {
203
- await shown(() => server.connect(providerId, secret));
193
+ await server.connect(providerId, secret);
204
194
  await refresh(context);
205
195
  return;
206
196
  }
207
197
  if (secret !== null)
208
- throw new RemoteServiceError(
209
- "service_invalid_value",
210
- signIn.has(providerId) ? SIGN_IN_NEEDS_VAULT : KEY_NEEDS_VAULT
211
- );
198
+ throw new Error(signIn.has(providerId) ? SIGN_IN_NEEDS_VAULT : KEY_NEEDS_VAULT);
212
199
  if (given !== null) await fields.set(providerId, given);
213
200
  await reread(context);
214
201
  if (signIn.has(providerId)) await discover([providerId]);
@@ -216,7 +203,7 @@ async function createAgentSettings(models, sources, providers = sliccProviders()
216
203
  },
217
204
  async signIn(providerId) {
218
205
  const server = routed(providerId);
219
- if (server) return shown(() => server.signIn(providerId));
206
+ if (server) return server.signIn(providerId);
220
207
  if (providerId !== ADOBE) return null;
221
208
  const { clientId, scopes, imsEnvironment } = await adobeConfig(
222
209
  endpoint,
@@ -251,7 +238,6 @@ export {
251
238
  preferredModel2 as preferredModel,
252
239
  providerFields,
253
240
  resolveDefaultModel,
254
- shown,
255
241
  sliccProviders,
256
242
  withDefaultRegions
257
243
  };
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/settings.ts"],
4
- "sourcesContent": ["import { type Context, RemoteServiceError, 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 async function shown<T>(run: () => Promise<T>): Promise<T> {\n try {\n return await run();\n } catch (error) {\n throw new RemoteServiceError(\n 'service_invalid_value',\n error instanceof Error ? error.message : String(error)\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 shown(() => server.connect(providerId, secret));\n await refresh(context);\n return;\n }\n if (secret !== null)\n throw new RemoteServiceError(\n 'service_invalid_value',\n signIn.has(providerId) ? SIGN_IN_NEEDS_VAULT : KEY_NEEDS_VAULT\n );\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 shown(() => 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 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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",
6
6
  "names": ["BEDROCK", "preferredModel"]
7
7
  }
@@ -32,6 +32,7 @@ function answers(messages) {
32
32
  function slashCommand({ kind, ...command }) {
33
33
  return kind === "action" ? command : { ...command, kind };
34
34
  }
35
+ const WATCH_ONLY = "Watch only.";
35
36
  function sameHold(a, b) {
36
37
  return a === b || a !== null && b !== null && a.reason === b.reason && a.held === b.held;
37
38
  }
@@ -88,7 +89,6 @@ class AgentAdapter extends Emitter {
88
89
  };
89
90
  connection.commands?.subscribe(stale);
90
91
  connection.privateRevision?.subscribe(stale);
91
- if (connection.mismatch) this.notify(connection.mismatch);
92
92
  }
93
93
  #summary() {
94
94
  const agents = this.#connection.agents?.value?.agents;
@@ -198,6 +198,9 @@ class AgentAdapter extends Emitter {
198
198
  hold() {
199
199
  return vaultHold(this.#connection.vault?.value);
200
200
  }
201
+ readOnly() {
202
+ return this.#connection.mismatch ? WATCH_ONLY : null;
203
+ }
201
204
  list() {
202
205
  const rows = this.#connection.frozen?.value ?? [];
203
206
  return this.#summary().map((summary) => {
@@ -569,6 +572,7 @@ class AgentAdapter extends Emitter {
569
572
  export {
570
573
  AgentAdapter,
571
574
  CONE,
575
+ WATCH_ONLY,
572
576
  slashCommand
573
577
  };
574
578
  //# sourceMappingURL=agent-port.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/spectrum/agent-port.ts"],
4
- "sourcesContent": ["import type {\n Agent,\n AgentEvents,\n AgentPort,\n AgentStatus,\n FrozenCone,\n Message,\n Outgoing,\n SlashCommand,\n SystemMessage,\n Thinking,\n UserMessage,\n} from '@ai-ecoverse/slicc-spectrum/ui';\nimport { BACKGROUND_CONTEXT } from '@earendil-works/chord/context';\nimport type { ConversationView } from '@earendil-works/pi-durable';\nimport type { AgentConnection } from '../client.ts';\nimport { contextRatio, contextTokens } from '../context.ts';\nimport { shrink } from '../images/fit.ts';\nimport { entryLick } from '../licks/state.ts';\nimport { type VaultHold, vaultHold } from '../secrets/view.ts';\nimport type { AgentSettingsChange, AgentSummary, Command } from '../services.ts';\nimport { shownLabel } from '../titles/shown.ts';\nimport { attempt } from './attempt.ts';\nimport { Emitter } from './emitter.ts';\nimport { CONNECT_IT, isBusy, providerName, queued, toMessages } from './messages.ts';\nimport { readUrl, sendAttachments } from './outgoing.ts';\n\nexport const CONE = 'cone';\n\nconst thinking: Record<string, Thinking> = {\n off: 'off',\n minimal: 'low',\n low: 'low',\n medium: 'medium',\n high: 'high',\n xhigh: 'high',\n max: 'high',\n};\n\ninterface AgentDoc {\n model?: { provider: string; modelId: string };\n thinkingLevel?: string;\n}\n\nfunction status(view: ConversationView | undefined, messages: readonly Message[]): AgentStatus {\n if (isBusy(view)) {\n const live = view?.docs['pi.live'] as { tools?: { status: string }[] } | undefined;\n return live?.tools?.some((slot) => slot.status === 'running') ? 'working' : 'thinking';\n }\n const last = messages.at(-1);\n return last?.role === 'assistant' && last.status === 'error' ? 'error' : 'idle';\n}\n\nfunction answers(messages: readonly Message[]): string[] {\n return messages\n .filter((message) => message.role === 'assistant' && message.status !== 'streaming')\n .map((message) => message.id);\n}\n\nexport function slashCommand({ kind, ...command }: Command): SlashCommand {\n return kind === 'action' ? command : { ...command, kind };\n}\n\nexport type AgentHold = VaultHold;\n\nexport type AgentAdapterEvents = AgentEvents & { hold: AgentHold | null };\n\nfunction sameHold(a: AgentHold | null, b: AgentHold | null): boolean {\n return a === b || (a !== null && b !== null && a.reason === b.reason && a.held === b.held);\n}\n\ninterface Pending {\n agentId: string;\n message: UserMessage;\n dropped: boolean;\n release(): void;\n released: Promise<void>;\n}\n\nexport class AgentAdapter extends Emitter<AgentAdapterEvents> implements AgentPort {\n readonly #connection: AgentConnection;\n readonly #ready: Promise<void>;\n readonly #messages = new Map<string, Message[]>();\n #active: string | null = null;\n #creating = new Map<string, Promise<string | null>>();\n #hold: AgentHold | null = null;\n readonly #outbox = new Map<string, Pending>();\n readonly #notices = new Map<string, { at: number; message: SystemMessage }[]>();\n readonly #unread = new Map<string, number>();\n readonly #seen = new Map<string, Set<string>>();\n readonly #queuedAt = new Map<string, Map<string, { at: number; seen: boolean }>>();\n #opened: ReadonlySet<string> | null = null;\n readonly #agentCommandsCache = new Map<string, Command[]>();\n readonly #agentCommandsLoading = new Set<string>();\n #agentCommandsGeneration = 0;\n\n constructor(connection: AgentConnection) {\n super();\n this.#connection = connection;\n this.#hold = this.hold();\n connection.vault?.subscribe(() => {\n const next = this.hold();\n if (sameHold(next, this.#hold)) return;\n this.#hold = next;\n if (!next) for (const pending of this.#outbox.values()) pending.release();\n this.emit('hold', next);\n this.emit('agents', this.list());\n });\n connection.frozen?.subscribe(() => {\n this.emit('frozen', this.frozen());\n this.emit('agents', this.list());\n });\n this.#ready = new Promise((resolve) => {\n connection.transcript.subscribe(() => {\n this.#refresh();\n resolve();\n });\n connection.deliveries.subscribe(() => this.#refresh());\n connection.views?.subscribe(() => this.#refresh());\n connection.agents?.subscribe(() => this.#refresh());\n });\n connection.settings?.state.subscribe(() => {\n this.emit('agents', this.list());\n this.#refresh();\n });\n const stale = () => {\n this.#agentCommandsGeneration += 1;\n this.#agentCommandsLoading.clear();\n this.#agentCommandsCache.clear();\n this.emit('agents', this.list());\n };\n connection.commands?.subscribe(stale);\n connection.privateRevision?.subscribe(stale);\n if (connection.mismatch) this.notify(connection.mismatch);\n }\n\n #summary(): readonly AgentSummary[] {\n const agents = this.#connection.agents?.value?.agents;\n return agents?.length\n ? agents\n : [{ id: CONE, name: 'sliccy', kind: 'cone', parentId: null, role: null }];\n }\n\n #view(agentId: string = this.active()): ConversationView | undefined {\n const views = this.#connection.views?.value;\n const view = views?.[agentId];\n if (view) return view;\n const cone = this.#connection.agents?.value?.active ?? CONE;\n return agentId === cone ? this.#connection.transcript.value : undefined;\n }\n\n #refresh(): void {\n this.#active ??= this.#connection.agents?.value?.active ?? null;\n if (!this.#opened && (!this.#connection.agents || this.#connection.agents.value))\n this.#opened = new Set(this.#summary().map((summary) => summary.id));\n for (const summary of this.#summary()) this.#stamp(summary.id, this.#view(summary.id));\n this.emit('agents', this.list());\n let unread = false;\n for (const summary of this.#summary()) unread = this.#update(summary.id) || unread;\n for (const id of [...this.#messages.keys(), ...this.#notices.keys(), ...this.#seen.keys()])\n if (!this.#summary().some((summary) => summary.id === id)) {\n this.#messages.delete(id);\n this.#notices.delete(id);\n this.#seen.delete(id);\n this.#unread.delete(id);\n this.#queuedAt.delete(id);\n }\n if (unread) this.emit('agents', this.list());\n }\n\n #count(agentId: string, view: ConversationView, messages: readonly Message[]): boolean {\n const ids = answers(messages);\n const known = this.#seen.get(agentId);\n if (agentId === this.active() || (!known && (!this.#opened || this.#opened.has(agentId)))) {\n this.#seen.set(agentId, new Set(ids));\n return false;\n }\n const seen = known ?? new Set<string>();\n this.#seen.set(agentId, seen);\n const fresh = isBusy(view) ? [] : ids.filter((id) => !seen.has(id));\n if (!fresh.length) return false;\n for (const id of fresh) seen.add(id);\n this.#unread.set(agentId, (this.#unread.get(agentId) ?? 0) + fresh.length);\n return true;\n }\n\n notify(text: string, agentId: string = this.active()): void {\n this.#note(agentId, { kind: 'notice', text });\n }\n\n #note(agentId: string, shown: Pick<SystemMessage, 'kind' | 'text' | 'title' | 'action'>): void {\n const notes = this.#notices.get(agentId) ?? [];\n notes.push({\n at: this.#messages.get(agentId)?.length ?? 0,\n message: { id: `n${crypto.randomUUID()}`, role: 'system', ...shown, createdAt: Date.now() },\n });\n this.#notices.set(agentId, notes);\n this.emit('messages', agentId);\n }\n\n #unconnected(agentId: string, submissionId: string): void {\n const provider = this.list()\n .find((row) => row.id === agentId)\n ?.model.split('/')[0];\n const accounts = this.#connection.settings?.state.value?.accounts ?? [];\n const account = accounts.find((item) => item.id === provider);\n if (!account || account.status === 'connected') return;\n const title = `${providerName(account.id, account.provider)} isn't connected.`;\n this.#connection.control.wait(submissionId, BACKGROUND_CONTEXT).then(\n (settled) => {\n if (settled.status === 'unanswered' && settled.reason === 'no_model')\n this.#note(agentId, {\n kind: 'error',\n title,\n text: CONNECT_IT,\n action: 'settings',\n });\n },\n () => undefined\n );\n }\n\n #report(agentId: string): (text: string) => void {\n return (text) => this.notify(text, agentId);\n }\n\n #update(agentId: string): boolean {\n const view = this.#view(agentId);\n if (!view) return false;\n const before = this.#messages.get(agentId) ?? [];\n const after = this.#labelled(toMessages(view, this.#connection.deliveries.value));\n this.#messages.set(agentId, after);\n if (before.length !== after.length) this.emit('messages', agentId);\n else {\n const changed = after.filter(\n (message, index) => JSON.stringify(message) !== JSON.stringify(before[index])\n );\n if (changed.length === 1) this.emit('message', { agentId, message: changed[0] as Message });\n else if (changed.length > 1) this.emit('messages', agentId);\n }\n return this.#count(agentId, view, after);\n }\n\n #labelled(messages: Message[]): Message[] {\n const state = this.#connection.settings?.state.value;\n const labels = state?.labels ?? {};\n const known = new Set((state?.models ?? []).map((model) => model.id));\n return messages.map((message) =>\n message.role === 'assistant' &&\n message.model &&\n !known.has(message.model) &&\n labels[message.model]\n ? { ...message, model: labels[message.model] as string }\n : message\n );\n }\n\n ready(): Promise<void> {\n return this.#ready;\n }\n\n hold(): AgentHold | null {\n return vaultHold(this.#connection.vault?.value);\n }\n\n list(): readonly Agent[] {\n const rows = this.#connection.frozen?.value ?? [];\n return this.#summary().map((summary) => {\n const view = this.#view(summary.id);\n const doc = view?.docs['pi.agent'] as AgentDoc | undefined;\n const title = rows.find((row) => row.id === summary.id)?.title;\n const model = doc?.model ? `${doc.model.provider}/${doc.model.modelId}` : '';\n const models = this.#connection.settings?.state.value?.models ?? [];\n return {\n id: summary.id,\n name: summary.role ? `${summary.name} \u00B7 ${summary.role}` : summary.name,\n kind: summary.kind,\n parentId: summary.parentId,\n status: this.#status(summary.id, status(view, this.#messages.get(summary.id) ?? [])),\n model,\n contextFill: contextRatio(contextTokens(view), model, models) ?? 0,\n unread: this.#unread.get(summary.id) ?? 0,\n thinking: thinking[doc?.thinkingLevel ?? 'off'] ?? 'off',\n ...(title ? { title } : {}),\n };\n });\n }\n\n active(): string {\n const known = this.#summary();\n if (this.#active && this.#creating.has(this.#active)) return this.#active;\n if (this.#active && known.some((summary) => summary.id === this.#active)) return this.#active;\n return this.#connection.agents?.value?.active ?? CONE;\n }\n\n select(id: string): void {\n if (this.#creating.has(id)) {\n this.#active = id;\n this.emit('active', id);\n return;\n }\n const found = this.#summary().find((summary) => summary.id === id);\n if (!found) return;\n this.#active = id;\n this.#seen.set(id, new Set(answers(this.#messages.get(id) ?? [])));\n const read = this.#unread.delete(id);\n if (found.kind === 'cone')\n attempt(\n this.#connection.control.selectCone(id, BACKGROUND_CONTEXT),\n 'switch cones',\n this.#report(id)\n );\n this.emit('active', id);\n this.emit('messages', id);\n if (read) this.emit('agents', this.list());\n }\n\n messages(agentId: string = this.active()): readonly Message[] {\n const shown = this.#messages.get(agentId) ?? [];\n const notes = this.#notices.get(agentId);\n if (!notes) return shown;\n const at = (index: number) => notes.filter((note) => note.at === index).map((n) => n.message);\n const late = notes.filter((note) => note.at >= shown.length).map((note) => note.message);\n return [...shown.flatMap((message, index) => [...at(index), message]), ...late];\n }\n\n async send(agentId: string, input: string | Outgoing): Promise<void> {\n const outgoing = typeof input === 'string' ? { text: input } : input;\n const attachments = outgoing.attachments?.length\n ? await sendAttachments(outgoing.attachments, readUrl, shrink, (ref) =>\n this.#connection.control.image(ref, BACKGROUND_CONTEXT)\n ).catch((error: Error) => {\n this.notify(error.message, agentId);\n return null;\n })\n : [];\n if (!attachments) return;\n const target = this.#creating.has(agentId) ? await this.#creating.get(agentId) : agentId;\n if (target === null) throw new Error('The scoop could not be created.');\n const pending = target && this.#held(target) ? this.#pending(target, outgoing) : undefined;\n if (pending) await pending.released;\n if (pending?.dropped) return this.#settle(pending);\n const at = Date.now();\n const sent = await this.#connection.control\n .send(\n {\n text: outgoing.text,\n whenBusy: outgoing.mode === 'queue' ? 'followUp' : 'steer',\n requestId: crypto.randomUUID(),\n agentId: target || null,\n ...(attachments.length ? { attachments } : {}),\n },\n BACKGROUND_CONTEXT\n )\n .finally(() => pending && this.#settle(pending));\n if (!sent.accepted) throw new Error(sent.error.message);\n this.#sent(target || agentId, `q${sent.submissionId}`, at);\n this.#unconnected(target || agentId, sent.submissionId);\n if (pending?.dropped)\n attempt(\n this.#connection.control.unqueue(pending.agentId, sent.submissionId, BACKGROUND_CONTEXT),\n 'remove queued messages',\n this.#report(pending.agentId)\n );\n }\n\n #stamps(agentId: string): Map<string, { at: number; seen: boolean }> {\n const stamps = this.#queuedAt.get(agentId) ?? new Map();\n this.#queuedAt.set(agentId, stamps);\n return stamps;\n }\n\n #sent(agentId: string, id: string, at: number): void {\n const stamps = this.#stamps(agentId);\n const known = stamps.get(id);\n stamps.set(id, { at: Math.min(at, known?.at ?? at), seen: known?.seen ?? false });\n }\n\n #stamp(agentId: string, view: ConversationView | undefined): void {\n const stamps = this.#stamps(agentId);\n const ids = new Set(queued(view).map((message) => message.id));\n const now = Date.now();\n for (const id of ids) stamps.set(id, { at: stamps.get(id)?.at ?? now, seen: true });\n for (const [id, stamp] of stamps)\n if (!ids.has(id) && (stamp.seen || (!ids.size && !isBusy(view)))) stamps.delete(id);\n }\n\n #pending(agentId: string, outgoing: Outgoing): Pending {\n const id = `p${crypto.randomUUID()}`;\n const message: UserMessage = {\n id,\n role: 'user',\n text: outgoing.text,\n createdAt: Date.now(),\n ...(outgoing.attachments?.length ? { attachments: [...outgoing.attachments] } : {}),\n queued: true,\n mode: outgoing.mode === 'queue' ? 'queue' : 'steer',\n };\n const { promise: released, resolve: release } = Promise.withResolvers<void>();\n const pending = { agentId, message, dropped: false, release, released };\n this.#outbox.set(id, pending);\n this.emit('messages', agentId);\n return pending;\n }\n\n #settle(pending: Pending): void {\n this.#outbox.delete(pending.message.id);\n this.emit('messages', pending.agentId);\n }\n\n async rewind(agentId: string, messageId: string): Promise<Outgoing | null> {\n const rewound = await this.#connection.control.rewindAgent(\n agentId,\n messageId,\n BACKGROUND_CONTEXT\n );\n if (!rewound.done) return null;\n return rewound.attachments?.length\n ? { text: rewound.text, attachments: rewound.attachments }\n : { text: rewound.text };\n }\n\n stop(agentId: string = this.active()): void {\n attempt(\n this.#connection.control.stopAgent(agentId, BACKGROUND_CONTEXT),\n 'stop agents',\n this.#report(agentId)\n );\n }\n\n busy(agentId: string = this.active()): boolean {\n return isBusy(this.#view(agentId)) || this.#held(agentId);\n }\n\n #status(agentId: string, shown: AgentStatus): AgentStatus {\n return shown === 'idle' && this.#held(agentId) ? 'working' : shown;\n }\n\n #held(agentId: string): boolean {\n return this.#hold !== null && agentId === (this.#connection.agents?.value?.active ?? CONE);\n }\n\n queue(agentId: string = this.active()): readonly UserMessage[] {\n const pending = [...this.#outbox.values()]\n .filter((item) => item.agentId === agentId && !item.dropped)\n .map((item) => item.message);\n const stamps = this.#queuedAt.get(agentId);\n const at = (id: string) => stamps?.get(id)?.at ?? 0;\n return [...queued(this.#view(agentId), at), ...pending];\n }\n\n unqueue(agentId: string, messageId: string): void {\n const pending = this.#outbox.get(messageId);\n if (pending) {\n pending.dropped = true;\n pending.release();\n this.emit('messages', pending.agentId);\n return;\n }\n attempt(\n this.#connection.control.unqueue(agentId, messageId.replace(/^q/, ''), BACKGROUND_CONTEXT),\n 'remove queued messages',\n this.#report(agentId)\n );\n }\n\n suggestion(): string | null {\n return null;\n }\n\n answer(): void {}\n\n resolveLick(agentId: string, messageId: string, state: 'confirmed' | 'dismissed'): void {\n const message = this.messages(agentId).find((candidate) => candidate.id === messageId);\n const entry = this.#view(agentId)?.entries.find(\n (candidate) => `e${candidate.id}` === messageId\n );\n const lick = message?.role === 'lick' && entry ? entryLick(entry) : undefined;\n if (lick)\n attempt(\n this.#connection.control.resolveAgentLick(agentId, lick.id, state, BACKGROUND_CONTEXT),\n 'answer licks',\n this.#report(agentId)\n );\n }\n\n compact(agentId: string = this.active()): void {\n attempt(\n this.#connection.control.compactAgent(agentId, null, BACKGROUND_CONTEXT),\n 'compact conversations',\n this.#report(agentId)\n );\n }\n\n clear(agentId: string = this.active()): void {\n attempt(\n this.#connection.control.newChat(agentId, BACKGROUND_CONTEXT),\n 'start new chats',\n this.#report(agentId)\n );\n }\n\n freeze(agentId: string = this.active()): void {\n attempt(\n this.#connection.control.freeze(agentId, BACKGROUND_CONTEXT),\n 'freeze cones',\n this.#report(agentId)\n );\n }\n\n #configure(agentId: string, change: Partial<AgentSettingsChange>): void {\n attempt(\n this.#connection.control.configure(\n {\n model: change.model ?? null,\n thinkingLevel: change.thinkingLevel ?? null,\n agentId,\n },\n BACKGROUND_CONTEXT\n ),\n 'change agent settings',\n this.#report(agentId)\n );\n }\n\n setModel(agentId: string, model: string): void {\n const at = model.indexOf('/');\n if (at <= 0) return;\n this.#configure(agentId, {\n model: { provider: model.slice(0, at), modelId: model.slice(at + 1) },\n });\n }\n\n setThinking(agentId: string, level: Thinking): void {\n this.#configure(agentId, { thinkingLevel: level });\n }\n\n async older(): Promise<readonly Message[]> {\n return [];\n }\n\n #fetchCommands(agentId: string): void {\n if (this.#agentCommandsLoading.has(agentId)) return;\n if (typeof this.#connection.control.agentCommands !== 'function') return;\n this.#agentCommandsLoading.add(agentId);\n const generation = this.#agentCommandsGeneration;\n this.#connection.control\n .agentCommands(agentId, BACKGROUND_CONTEXT)\n .then((commands) => {\n if (generation !== this.#agentCommandsGeneration) return;\n this.#agentCommandsCache.set(agentId, commands);\n this.emit('agents', this.list());\n })\n .catch(() => undefined)\n .finally(() => {\n if (generation === this.#agentCommandsGeneration)\n this.#agentCommandsLoading.delete(agentId);\n });\n }\n\n commands(agentId: string = this.active()): readonly SlashCommand[] {\n const cached = this.#agentCommandsCache.get(agentId);\n if (cached) return cached.map(slashCommand);\n this.#fetchCommands(agentId);\n return (this.#connection.commands?.value ?? []).map(slashCommand);\n }\n\n createScoop(parentId: string, name: string): Agent {\n const provisional = `scoop:creating-${crypto.randomUUID()}`;\n const created = this.#connection.control.createScoop(parentId, name, BACKGROUND_CONTEXT).then(\n (result) => result.id,\n () => null\n );\n this.#creating.set(provisional, created);\n void created.then((id) => {\n if (this.#active !== provisional) return;\n this.#active = id ?? parentId;\n this.emit('active', this.#active);\n this.emit('messages', this.#active);\n });\n return {\n id: provisional,\n name,\n kind: 'scoop',\n parentId,\n status: 'idle',\n model: '',\n contextFill: 0,\n unread: 0,\n };\n }\n\n async drop(agentId: string): Promise<void> {\n const parent = this.#summary().find((summary) => summary.id === agentId)?.parentId ?? CONE;\n const dropped = await this.#connection.control.drop(agentId, BACKGROUND_CONTEXT);\n if (dropped.error !== null) throw new Error(dropped.error);\n if (this.#active === agentId) this.select(parent);\n }\n\n async createCone(name: string): Promise<Agent> {\n const created = await this.#connection.control.createCone(name, BACKGROUND_CONTEXT);\n if (created.error !== null) throw new Error(created.error);\n return {\n id: created.id,\n name: name.trim(),\n kind: 'cone',\n parentId: null,\n status: 'idle',\n model: '',\n contextFill: 0,\n unread: 0,\n };\n }\n\n async toolLabel(agentId: string, callIds: readonly string[]): Promise<string | null> {\n const shown = shownLabel(this.#connection.labels?.value, callIds);\n if (shown !== undefined) return shown;\n return this.#connection.control\n .toolLabel(agentId, [...callIds], BACKGROUND_CONTEXT)\n .catch(() => null);\n }\n\n frozen(): readonly FrozenCone[] {\n return (this.#connection.frozen?.value ?? []).map(\n ({ id, name, title, model, messages, frozenAt, kind, live, thawedAs }) => ({\n id,\n name,\n title,\n model,\n messages,\n frozenAt,\n kind,\n live,\n ...(thawedAs ? { thawedAs } : {}),\n })\n );\n }\n\n thaw(id: string): Agent | null {\n const record = this.frozen().find((item) => item.id === id);\n if (!record) return null;\n if (record.live) {\n const running = this.list().find((agent) => agent.id === id) ?? null;\n if (running) this.select(id);\n return running;\n }\n const provisional = `thawing-${crypto.randomUUID()}`;\n const thawed = this.#connection.control.thaw(id, BACKGROUND_CONTEXT).then(\n (result) => result.id,\n () => null\n );\n this.#creating.set(provisional, thawed);\n void thawed.then((cone) => {\n if (this.#active !== provisional) return;\n this.#active = cone ?? CONE;\n this.emit('active', this.#active);\n this.emit('messages', this.#active);\n });\n return {\n id: provisional,\n name: record.name,\n kind: 'cone',\n parentId: null,\n status: 'idle',\n model: record.model,\n contextFill: 0,\n unread: 0,\n };\n }\n\n discard(id: string): void {\n attempt(\n this.#connection.control.discard(id, BACKGROUND_CONTEXT),\n 'discard frozen cones',\n this.#report(this.active())\n );\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type {\n Agent,\n AgentEvents,\n AgentPort,\n AgentStatus,\n FrozenCone,\n Message,\n Outgoing,\n SlashCommand,\n SystemMessage,\n Thinking,\n UserMessage,\n} from '@ai-ecoverse/slicc-spectrum/ui';\nimport { BACKGROUND_CONTEXT } from '@earendil-works/chord/context';\nimport type { ConversationView } from '@earendil-works/pi-durable';\nimport type { AgentConnection } from '../client.ts';\nimport { contextRatio, contextTokens } from '../context.ts';\nimport { shrink } from '../images/fit.ts';\nimport { entryLick } from '../licks/state.ts';\nimport { type VaultHold, vaultHold } from '../secrets/view.ts';\nimport type { AgentSettingsChange, AgentSummary, Command } from '../services.ts';\nimport { shownLabel } from '../titles/shown.ts';\nimport { attempt } from './attempt.ts';\nimport { Emitter } from './emitter.ts';\nimport { CONNECT_IT, isBusy, providerName, queued, toMessages } from './messages.ts';\nimport { readUrl, sendAttachments } from './outgoing.ts';\n\nexport const CONE = 'cone';\n\nconst thinking: Record<string, Thinking> = {\n off: 'off',\n minimal: 'low',\n low: 'low',\n medium: 'medium',\n high: 'high',\n xhigh: 'high',\n max: 'high',\n};\n\ninterface AgentDoc {\n model?: { provider: string; modelId: string };\n thinkingLevel?: string;\n}\n\nfunction status(view: ConversationView | undefined, messages: readonly Message[]): AgentStatus {\n if (isBusy(view)) {\n const live = view?.docs['pi.live'] as { tools?: { status: string }[] } | undefined;\n return live?.tools?.some((slot) => slot.status === 'running') ? 'working' : 'thinking';\n }\n const last = messages.at(-1);\n return last?.role === 'assistant' && last.status === 'error' ? 'error' : 'idle';\n}\n\nfunction answers(messages: readonly Message[]): string[] {\n return messages\n .filter((message) => message.role === 'assistant' && message.status !== 'streaming')\n .map((message) => message.id);\n}\n\nexport function slashCommand({ kind, ...command }: Command): SlashCommand {\n return kind === 'action' ? command : { ...command, kind };\n}\n\nexport const WATCH_ONLY = 'Watch only.';\n\nexport type AgentHold = VaultHold;\n\nexport type AgentAdapterEvents = AgentEvents & { hold: AgentHold | null };\n\nfunction sameHold(a: AgentHold | null, b: AgentHold | null): boolean {\n return a === b || (a !== null && b !== null && a.reason === b.reason && a.held === b.held);\n}\n\ninterface Pending {\n agentId: string;\n message: UserMessage;\n dropped: boolean;\n release(): void;\n released: Promise<void>;\n}\n\nexport class AgentAdapter extends Emitter<AgentAdapterEvents> implements AgentPort {\n readonly #connection: AgentConnection;\n readonly #ready: Promise<void>;\n readonly #messages = new Map<string, Message[]>();\n #active: string | null = null;\n #creating = new Map<string, Promise<string | null>>();\n #hold: AgentHold | null = null;\n readonly #outbox = new Map<string, Pending>();\n readonly #notices = new Map<string, { at: number; message: SystemMessage }[]>();\n readonly #unread = new Map<string, number>();\n readonly #seen = new Map<string, Set<string>>();\n readonly #queuedAt = new Map<string, Map<string, { at: number; seen: boolean }>>();\n #opened: ReadonlySet<string> | null = null;\n readonly #agentCommandsCache = new Map<string, Command[]>();\n readonly #agentCommandsLoading = new Set<string>();\n #agentCommandsGeneration = 0;\n\n constructor(connection: AgentConnection) {\n super();\n this.#connection = connection;\n this.#hold = this.hold();\n connection.vault?.subscribe(() => {\n const next = this.hold();\n if (sameHold(next, this.#hold)) return;\n this.#hold = next;\n if (!next) for (const pending of this.#outbox.values()) pending.release();\n this.emit('hold', next);\n this.emit('agents', this.list());\n });\n connection.frozen?.subscribe(() => {\n this.emit('frozen', this.frozen());\n this.emit('agents', this.list());\n });\n this.#ready = new Promise((resolve) => {\n connection.transcript.subscribe(() => {\n this.#refresh();\n resolve();\n });\n connection.deliveries.subscribe(() => this.#refresh());\n connection.views?.subscribe(() => this.#refresh());\n connection.agents?.subscribe(() => this.#refresh());\n });\n connection.settings?.state.subscribe(() => {\n this.emit('agents', this.list());\n this.#refresh();\n });\n const stale = () => {\n this.#agentCommandsGeneration += 1;\n this.#agentCommandsLoading.clear();\n this.#agentCommandsCache.clear();\n this.emit('agents', this.list());\n };\n connection.commands?.subscribe(stale);\n connection.privateRevision?.subscribe(stale);\n }\n\n #summary(): readonly AgentSummary[] {\n const agents = this.#connection.agents?.value?.agents;\n return agents?.length\n ? agents\n : [{ id: CONE, name: 'sliccy', kind: 'cone', parentId: null, role: null }];\n }\n\n #view(agentId: string = this.active()): ConversationView | undefined {\n const views = this.#connection.views?.value;\n const view = views?.[agentId];\n if (view) return view;\n const cone = this.#connection.agents?.value?.active ?? CONE;\n return agentId === cone ? this.#connection.transcript.value : undefined;\n }\n\n #refresh(): void {\n this.#active ??= this.#connection.agents?.value?.active ?? null;\n if (!this.#opened && (!this.#connection.agents || this.#connection.agents.value))\n this.#opened = new Set(this.#summary().map((summary) => summary.id));\n for (const summary of this.#summary()) this.#stamp(summary.id, this.#view(summary.id));\n this.emit('agents', this.list());\n let unread = false;\n for (const summary of this.#summary()) unread = this.#update(summary.id) || unread;\n for (const id of [...this.#messages.keys(), ...this.#notices.keys(), ...this.#seen.keys()])\n if (!this.#summary().some((summary) => summary.id === id)) {\n this.#messages.delete(id);\n this.#notices.delete(id);\n this.#seen.delete(id);\n this.#unread.delete(id);\n this.#queuedAt.delete(id);\n }\n if (unread) this.emit('agents', this.list());\n }\n\n #count(agentId: string, view: ConversationView, messages: readonly Message[]): boolean {\n const ids = answers(messages);\n const known = this.#seen.get(agentId);\n if (agentId === this.active() || (!known && (!this.#opened || this.#opened.has(agentId)))) {\n this.#seen.set(agentId, new Set(ids));\n return false;\n }\n const seen = known ?? new Set<string>();\n this.#seen.set(agentId, seen);\n const fresh = isBusy(view) ? [] : ids.filter((id) => !seen.has(id));\n if (!fresh.length) return false;\n for (const id of fresh) seen.add(id);\n this.#unread.set(agentId, (this.#unread.get(agentId) ?? 0) + fresh.length);\n return true;\n }\n\n notify(text: string, agentId: string = this.active()): void {\n this.#note(agentId, { kind: 'notice', text });\n }\n\n #note(agentId: string, shown: Pick<SystemMessage, 'kind' | 'text' | 'title' | 'action'>): void {\n const notes = this.#notices.get(agentId) ?? [];\n notes.push({\n at: this.#messages.get(agentId)?.length ?? 0,\n message: { id: `n${crypto.randomUUID()}`, role: 'system', ...shown, createdAt: Date.now() },\n });\n this.#notices.set(agentId, notes);\n this.emit('messages', agentId);\n }\n\n #unconnected(agentId: string, submissionId: string): void {\n const provider = this.list()\n .find((row) => row.id === agentId)\n ?.model.split('/')[0];\n const accounts = this.#connection.settings?.state.value?.accounts ?? [];\n const account = accounts.find((item) => item.id === provider);\n if (!account || account.status === 'connected') return;\n const title = `${providerName(account.id, account.provider)} isn't connected.`;\n this.#connection.control.wait(submissionId, BACKGROUND_CONTEXT).then(\n (settled) => {\n if (settled.status === 'unanswered' && settled.reason === 'no_model')\n this.#note(agentId, {\n kind: 'error',\n title,\n text: CONNECT_IT,\n action: 'settings',\n });\n },\n () => undefined\n );\n }\n\n #report(agentId: string): (text: string) => void {\n return (text) => this.notify(text, agentId);\n }\n\n #update(agentId: string): boolean {\n const view = this.#view(agentId);\n if (!view) return false;\n const before = this.#messages.get(agentId) ?? [];\n const after = this.#labelled(toMessages(view, this.#connection.deliveries.value));\n this.#messages.set(agentId, after);\n if (before.length !== after.length) this.emit('messages', agentId);\n else {\n const changed = after.filter(\n (message, index) => JSON.stringify(message) !== JSON.stringify(before[index])\n );\n if (changed.length === 1) this.emit('message', { agentId, message: changed[0] as Message });\n else if (changed.length > 1) this.emit('messages', agentId);\n }\n return this.#count(agentId, view, after);\n }\n\n #labelled(messages: Message[]): Message[] {\n const state = this.#connection.settings?.state.value;\n const labels = state?.labels ?? {};\n const known = new Set((state?.models ?? []).map((model) => model.id));\n return messages.map((message) =>\n message.role === 'assistant' &&\n message.model &&\n !known.has(message.model) &&\n labels[message.model]\n ? { ...message, model: labels[message.model] as string }\n : message\n );\n }\n\n ready(): Promise<void> {\n return this.#ready;\n }\n\n hold(): AgentHold | null {\n return vaultHold(this.#connection.vault?.value);\n }\n\n readOnly(): string | null {\n return this.#connection.mismatch ? WATCH_ONLY : null;\n }\n\n list(): readonly Agent[] {\n const rows = this.#connection.frozen?.value ?? [];\n return this.#summary().map((summary) => {\n const view = this.#view(summary.id);\n const doc = view?.docs['pi.agent'] as AgentDoc | undefined;\n const title = rows.find((row) => row.id === summary.id)?.title;\n const model = doc?.model ? `${doc.model.provider}/${doc.model.modelId}` : '';\n const models = this.#connection.settings?.state.value?.models ?? [];\n return {\n id: summary.id,\n name: summary.role ? `${summary.name} \u00B7 ${summary.role}` : summary.name,\n kind: summary.kind,\n parentId: summary.parentId,\n status: this.#status(summary.id, status(view, this.#messages.get(summary.id) ?? [])),\n model,\n contextFill: contextRatio(contextTokens(view), model, models) ?? 0,\n unread: this.#unread.get(summary.id) ?? 0,\n thinking: thinking[doc?.thinkingLevel ?? 'off'] ?? 'off',\n ...(title ? { title } : {}),\n };\n });\n }\n\n active(): string {\n const known = this.#summary();\n if (this.#active && this.#creating.has(this.#active)) return this.#active;\n if (this.#active && known.some((summary) => summary.id === this.#active)) return this.#active;\n return this.#connection.agents?.value?.active ?? CONE;\n }\n\n select(id: string): void {\n if (this.#creating.has(id)) {\n this.#active = id;\n this.emit('active', id);\n return;\n }\n const found = this.#summary().find((summary) => summary.id === id);\n if (!found) return;\n this.#active = id;\n this.#seen.set(id, new Set(answers(this.#messages.get(id) ?? [])));\n const read = this.#unread.delete(id);\n if (found.kind === 'cone')\n attempt(\n this.#connection.control.selectCone(id, BACKGROUND_CONTEXT),\n 'switch cones',\n this.#report(id)\n );\n this.emit('active', id);\n this.emit('messages', id);\n if (read) this.emit('agents', this.list());\n }\n\n messages(agentId: string = this.active()): readonly Message[] {\n const shown = this.#messages.get(agentId) ?? [];\n const notes = this.#notices.get(agentId);\n if (!notes) return shown;\n const at = (index: number) => notes.filter((note) => note.at === index).map((n) => n.message);\n const late = notes.filter((note) => note.at >= shown.length).map((note) => note.message);\n return [...shown.flatMap((message, index) => [...at(index), message]), ...late];\n }\n\n async send(agentId: string, input: string | Outgoing): Promise<void> {\n const outgoing = typeof input === 'string' ? { text: input } : input;\n const attachments = outgoing.attachments?.length\n ? await sendAttachments(outgoing.attachments, readUrl, shrink, (ref) =>\n this.#connection.control.image(ref, BACKGROUND_CONTEXT)\n ).catch((error: Error) => {\n this.notify(error.message, agentId);\n return null;\n })\n : [];\n if (!attachments) return;\n const target = this.#creating.has(agentId) ? await this.#creating.get(agentId) : agentId;\n if (target === null) throw new Error('The scoop could not be created.');\n const pending = target && this.#held(target) ? this.#pending(target, outgoing) : undefined;\n if (pending) await pending.released;\n if (pending?.dropped) return this.#settle(pending);\n const at = Date.now();\n const sent = await this.#connection.control\n .send(\n {\n text: outgoing.text,\n whenBusy: outgoing.mode === 'queue' ? 'followUp' : 'steer',\n requestId: crypto.randomUUID(),\n agentId: target || null,\n ...(attachments.length ? { attachments } : {}),\n },\n BACKGROUND_CONTEXT\n )\n .finally(() => pending && this.#settle(pending));\n if (!sent.accepted) throw new Error(sent.error.message);\n this.#sent(target || agentId, `q${sent.submissionId}`, at);\n this.#unconnected(target || agentId, sent.submissionId);\n if (pending?.dropped)\n attempt(\n this.#connection.control.unqueue(pending.agentId, sent.submissionId, BACKGROUND_CONTEXT),\n 'remove queued messages',\n this.#report(pending.agentId)\n );\n }\n\n #stamps(agentId: string): Map<string, { at: number; seen: boolean }> {\n const stamps = this.#queuedAt.get(agentId) ?? new Map();\n this.#queuedAt.set(agentId, stamps);\n return stamps;\n }\n\n #sent(agentId: string, id: string, at: number): void {\n const stamps = this.#stamps(agentId);\n const known = stamps.get(id);\n stamps.set(id, { at: Math.min(at, known?.at ?? at), seen: known?.seen ?? false });\n }\n\n #stamp(agentId: string, view: ConversationView | undefined): void {\n const stamps = this.#stamps(agentId);\n const ids = new Set(queued(view).map((message) => message.id));\n const now = Date.now();\n for (const id of ids) stamps.set(id, { at: stamps.get(id)?.at ?? now, seen: true });\n for (const [id, stamp] of stamps)\n if (!ids.has(id) && (stamp.seen || (!ids.size && !isBusy(view)))) stamps.delete(id);\n }\n\n #pending(agentId: string, outgoing: Outgoing): Pending {\n const id = `p${crypto.randomUUID()}`;\n const message: UserMessage = {\n id,\n role: 'user',\n text: outgoing.text,\n createdAt: Date.now(),\n ...(outgoing.attachments?.length ? { attachments: [...outgoing.attachments] } : {}),\n queued: true,\n mode: outgoing.mode === 'queue' ? 'queue' : 'steer',\n };\n const { promise: released, resolve: release } = Promise.withResolvers<void>();\n const pending = { agentId, message, dropped: false, release, released };\n this.#outbox.set(id, pending);\n this.emit('messages', agentId);\n return pending;\n }\n\n #settle(pending: Pending): void {\n this.#outbox.delete(pending.message.id);\n this.emit('messages', pending.agentId);\n }\n\n async rewind(agentId: string, messageId: string): Promise<Outgoing | null> {\n const rewound = await this.#connection.control.rewindAgent(\n agentId,\n messageId,\n BACKGROUND_CONTEXT\n );\n if (!rewound.done) return null;\n return rewound.attachments?.length\n ? { text: rewound.text, attachments: rewound.attachments }\n : { text: rewound.text };\n }\n\n stop(agentId: string = this.active()): void {\n attempt(\n this.#connection.control.stopAgent(agentId, BACKGROUND_CONTEXT),\n 'stop agents',\n this.#report(agentId)\n );\n }\n\n busy(agentId: string = this.active()): boolean {\n return isBusy(this.#view(agentId)) || this.#held(agentId);\n }\n\n #status(agentId: string, shown: AgentStatus): AgentStatus {\n return shown === 'idle' && this.#held(agentId) ? 'working' : shown;\n }\n\n #held(agentId: string): boolean {\n return this.#hold !== null && agentId === (this.#connection.agents?.value?.active ?? CONE);\n }\n\n queue(agentId: string = this.active()): readonly UserMessage[] {\n const pending = [...this.#outbox.values()]\n .filter((item) => item.agentId === agentId && !item.dropped)\n .map((item) => item.message);\n const stamps = this.#queuedAt.get(agentId);\n const at = (id: string) => stamps?.get(id)?.at ?? 0;\n return [...queued(this.#view(agentId), at), ...pending];\n }\n\n unqueue(agentId: string, messageId: string): void {\n const pending = this.#outbox.get(messageId);\n if (pending) {\n pending.dropped = true;\n pending.release();\n this.emit('messages', pending.agentId);\n return;\n }\n attempt(\n this.#connection.control.unqueue(agentId, messageId.replace(/^q/, ''), BACKGROUND_CONTEXT),\n 'remove queued messages',\n this.#report(agentId)\n );\n }\n\n suggestion(): string | null {\n return null;\n }\n\n answer(): void {}\n\n resolveLick(agentId: string, messageId: string, state: 'confirmed' | 'dismissed'): void {\n const message = this.messages(agentId).find((candidate) => candidate.id === messageId);\n const entry = this.#view(agentId)?.entries.find(\n (candidate) => `e${candidate.id}` === messageId\n );\n const lick = message?.role === 'lick' && entry ? entryLick(entry) : undefined;\n if (lick)\n attempt(\n this.#connection.control.resolveAgentLick(agentId, lick.id, state, BACKGROUND_CONTEXT),\n 'answer licks',\n this.#report(agentId)\n );\n }\n\n compact(agentId: string = this.active()): void {\n attempt(\n this.#connection.control.compactAgent(agentId, null, BACKGROUND_CONTEXT),\n 'compact conversations',\n this.#report(agentId)\n );\n }\n\n clear(agentId: string = this.active()): void {\n attempt(\n this.#connection.control.newChat(agentId, BACKGROUND_CONTEXT),\n 'start new chats',\n this.#report(agentId)\n );\n }\n\n freeze(agentId: string = this.active()): void {\n attempt(\n this.#connection.control.freeze(agentId, BACKGROUND_CONTEXT),\n 'freeze cones',\n this.#report(agentId)\n );\n }\n\n #configure(agentId: string, change: Partial<AgentSettingsChange>): void {\n attempt(\n this.#connection.control.configure(\n {\n model: change.model ?? null,\n thinkingLevel: change.thinkingLevel ?? null,\n agentId,\n },\n BACKGROUND_CONTEXT\n ),\n 'change agent settings',\n this.#report(agentId)\n );\n }\n\n setModel(agentId: string, model: string): void {\n const at = model.indexOf('/');\n if (at <= 0) return;\n this.#configure(agentId, {\n model: { provider: model.slice(0, at), modelId: model.slice(at + 1) },\n });\n }\n\n setThinking(agentId: string, level: Thinking): void {\n this.#configure(agentId, { thinkingLevel: level });\n }\n\n async older(): Promise<readonly Message[]> {\n return [];\n }\n\n #fetchCommands(agentId: string): void {\n if (this.#agentCommandsLoading.has(agentId)) return;\n if (typeof this.#connection.control.agentCommands !== 'function') return;\n this.#agentCommandsLoading.add(agentId);\n const generation = this.#agentCommandsGeneration;\n this.#connection.control\n .agentCommands(agentId, BACKGROUND_CONTEXT)\n .then((commands) => {\n if (generation !== this.#agentCommandsGeneration) return;\n this.#agentCommandsCache.set(agentId, commands);\n this.emit('agents', this.list());\n })\n .catch(() => undefined)\n .finally(() => {\n if (generation === this.#agentCommandsGeneration)\n this.#agentCommandsLoading.delete(agentId);\n });\n }\n\n commands(agentId: string = this.active()): readonly SlashCommand[] {\n const cached = this.#agentCommandsCache.get(agentId);\n if (cached) return cached.map(slashCommand);\n this.#fetchCommands(agentId);\n return (this.#connection.commands?.value ?? []).map(slashCommand);\n }\n\n createScoop(parentId: string, name: string): Agent {\n const provisional = `scoop:creating-${crypto.randomUUID()}`;\n const created = this.#connection.control.createScoop(parentId, name, BACKGROUND_CONTEXT).then(\n (result) => result.id,\n () => null\n );\n this.#creating.set(provisional, created);\n void created.then((id) => {\n if (this.#active !== provisional) return;\n this.#active = id ?? parentId;\n this.emit('active', this.#active);\n this.emit('messages', this.#active);\n });\n return {\n id: provisional,\n name,\n kind: 'scoop',\n parentId,\n status: 'idle',\n model: '',\n contextFill: 0,\n unread: 0,\n };\n }\n\n async drop(agentId: string): Promise<void> {\n const parent = this.#summary().find((summary) => summary.id === agentId)?.parentId ?? CONE;\n const dropped = await this.#connection.control.drop(agentId, BACKGROUND_CONTEXT);\n if (dropped.error !== null) throw new Error(dropped.error);\n if (this.#active === agentId) this.select(parent);\n }\n\n async createCone(name: string): Promise<Agent> {\n const created = await this.#connection.control.createCone(name, BACKGROUND_CONTEXT);\n if (created.error !== null) throw new Error(created.error);\n return {\n id: created.id,\n name: name.trim(),\n kind: 'cone',\n parentId: null,\n status: 'idle',\n model: '',\n contextFill: 0,\n unread: 0,\n };\n }\n\n async toolLabel(agentId: string, callIds: readonly string[]): Promise<string | null> {\n const shown = shownLabel(this.#connection.labels?.value, callIds);\n if (shown !== undefined) return shown;\n return this.#connection.control\n .toolLabel(agentId, [...callIds], BACKGROUND_CONTEXT)\n .catch(() => null);\n }\n\n frozen(): readonly FrozenCone[] {\n return (this.#connection.frozen?.value ?? []).map(\n ({ id, name, title, model, messages, frozenAt, kind, live, thawedAs }) => ({\n id,\n name,\n title,\n model,\n messages,\n frozenAt,\n kind,\n live,\n ...(thawedAs ? { thawedAs } : {}),\n })\n );\n }\n\n thaw(id: string): Agent | null {\n const record = this.frozen().find((item) => item.id === id);\n if (!record) return null;\n if (record.live) {\n const running = this.list().find((agent) => agent.id === id) ?? null;\n if (running) this.select(id);\n return running;\n }\n const provisional = `thawing-${crypto.randomUUID()}`;\n const thawed = this.#connection.control.thaw(id, BACKGROUND_CONTEXT).then(\n (result) => result.id,\n () => null\n );\n this.#creating.set(provisional, thawed);\n void thawed.then((cone) => {\n if (this.#active !== provisional) return;\n this.#active = cone ?? CONE;\n this.emit('active', this.#active);\n this.emit('messages', this.#active);\n });\n return {\n id: provisional,\n name: record.name,\n kind: 'cone',\n parentId: null,\n status: 'idle',\n model: record.model,\n contextFill: 0,\n unread: 0,\n };\n }\n\n discard(id: string): void {\n attempt(\n this.#connection.control.discard(id, BACKGROUND_CONTEXT),\n 'discard frozen cones',\n this.#report(this.active())\n );\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -23,7 +23,14 @@ import {
23
23
  MonitorAdapter as MonitorAdapter2,
24
24
  monitorSnapshot
25
25
  } from "./monitor-port.js";
26
- import { KEYS_MOVED, movedList, movedNotice, NoticesAdapter as NoticesAdapter2 } from "./notices-port.js";
26
+ import {
27
+ KEYS_MOVED,
28
+ MISMATCH,
29
+ mismatchBanner,
30
+ movedList,
31
+ movedNotice,
32
+ NoticesAdapter as NoticesAdapter2
33
+ } from "./notices-port.js";
27
34
  import {
28
35
  PageAdapter as PageAdapter2
29
36
  } from "./page-port.js";
@@ -47,7 +54,7 @@ function createAgentModel(connection, options = {}) {
47
54
  sprinkles: new SprinkleAdapter(connection, report),
48
55
  memory: new MemoryAdapter(connection, report),
49
56
  changes: new ChangesAdapter(connection, report),
50
- notices: new NoticesAdapter(connection.settings, report),
57
+ notices: new NoticesAdapter(connection.settings, report, connection.mismatch),
51
58
  monitor: new MonitorAdapter(
52
59
  connection,
53
60
  options.monitor?.extra ? { extra: options.monitor.extra } : {}
@@ -59,6 +66,7 @@ export {
59
66
  CONE,
60
67
  ChangesAdapter2 as ChangesAdapter,
61
68
  KEYS_MOVED,
69
+ MISMATCH,
62
70
  MemoryAdapter2 as MemoryAdapter,
63
71
  MonitorAdapter2 as MonitorAdapter,
64
72
  NoticesAdapter2 as NoticesAdapter,
@@ -72,6 +80,7 @@ export {
72
80
  errorAction,
73
81
  errorPart,
74
82
  isBusy,
83
+ mismatchBanner,
75
84
  monitorSnapshot,
76
85
  movedList,
77
86
  movedNotice,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/spectrum/index.ts"],
4
- "sourcesContent": ["import type { MonitorSection } from '@ai-ecoverse/slicc-spectrum/ui';\nimport type { AgentConnection } from '../client.ts';\nimport { AgentAdapter } from './agent-port.ts';\nimport { ChangesAdapter } from './changes-port.ts';\nimport { MemoryAdapter } from './memory-port.ts';\nimport { MonitorAdapter } from './monitor-port.ts';\nimport { NoticesAdapter } from './notices-port.ts';\nimport { PageAdapter, type PageOptions } from './page-port.ts';\nimport { type Login, SettingsAdapter } from './settings-port.ts';\nimport { SprinkleAdapter } from './sprinkle-port.ts';\nimport { TrayAdapter } from './tray-port.ts';\n\nexport { AgentAdapter, CONE } from './agent-port.ts';\nexport { ChangesAdapter, type ChangesEvents } from './changes-port.ts';\nexport { MemoryAdapter } from './memory-port.ts';\nexport {\n assistant,\n errorAction,\n errorPart,\n isBusy,\n queued,\n textOf,\n toMessages,\n} from './messages.ts';\nexport {\n MonitorAdapter,\n type MonitorAdapterOptions,\n type MonitorInput,\n monitorSnapshot,\n} from './monitor-port.ts';\nexport { KEYS_MOVED, movedList, movedNotice, NoticesAdapter } from './notices-port.ts';\nexport {\n PageAdapter,\n type PageDocument,\n type PageOptions,\n type PageRun,\n type PageTarget,\n} from './page-port.ts';\nexport { type Login, SETTINGS_KEY, SettingsAdapter } from './settings-port.ts';\nexport { SprinkleAdapter } from './sprinkle-port.ts';\nexport { TrayAdapter } from './tray-port.ts';\n\nexport function createAgentModel(\n connection: AgentConnection,\n options: {\n storage?: Pick<Storage, 'getItem' | 'setItem'> | null;\n login?: Login;\n monitor?: { extra?: () => readonly MonitorSection[] };\n page?: PageOptions;\n } = {}\n): {\n agent: AgentAdapter;\n settings: SettingsAdapter;\n tray: TrayAdapter;\n sprinkles: SprinkleAdapter;\n memory: MemoryAdapter;\n changes: ChangesAdapter;\n monitor: MonitorAdapter;\n notices: NoticesAdapter;\n page: PageAdapter | null;\n} {\n const agent = new AgentAdapter(connection);\n const report = (text: string) => agent.notify(text);\n const run = options.page?.run;\n return {\n agent,\n page: options.page && run ? new PageAdapter(connection, agent, { ...options.page, run }) : null,\n settings: new SettingsAdapter(\n connection.settings,\n agent,\n options.storage ?? null,\n options.login ?? null\n ),\n tray: new TrayAdapter(connection.settings),\n sprinkles: new SprinkleAdapter(connection, report),\n memory: new MemoryAdapter(connection, report),\n changes: new ChangesAdapter(connection, report),\n notices: new NoticesAdapter(connection.settings, report),\n monitor: new MonitorAdapter(\n connection,\n options.monitor?.extra ? { extra: options.monitor.extra } : {}\n ),\n };\n}\n"],
5
- "mappings": "AAEA,SAAS,oBAAoB;AAC7B,SAAS,sBAAsB;AAC/B,SAAS,qBAAqB;AAC9B,SAAS,sBAAsB;AAC/B,SAAS,sBAAsB;AAC/B,SAAS,mBAAqC;AAC9C,SAAqB,uBAAuB;AAC5C,SAAS,uBAAuB;AAChC,SAAS,mBAAmB;AAE5B,SAAS,gBAAAA,eAAc,YAAY;AACnC,SAAS,kBAAAC,uBAA0C;AACnD,SAAS,iBAAAC,sBAAqB;AAC9B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE,kBAAAC;AAAA,EAGA;AAAA,OACK;AACP,SAAS,YAAY,WAAW,aAAa,kBAAAC,uBAAsB;AACnE;AAAA,EACE,eAAAC;AAAA,OAKK;AACP,SAAqB,cAAc,mBAAAC,wBAAuB;AAC1D,SAAS,mBAAAC,wBAAuB;AAChC,SAAS,eAAAC,oBAAmB;AAErB,SAAS,iBACd,YACA,UAKI,CAAC,GAWL;AACA,QAAM,QAAQ,IAAI,aAAa,UAAU;AACzC,QAAM,SAAS,CAAC,SAAiB,MAAM,OAAO,IAAI;AAClD,QAAM,MAAM,QAAQ,MAAM;AAC1B,SAAO;AAAA,IACL;AAAA,IACA,MAAM,QAAQ,QAAQ,MAAM,IAAI,YAAY,YAAY,OAAO,EAAE,GAAG,QAAQ,MAAM,IAAI,CAAC,IAAI;AAAA,IAC3F,UAAU,IAAI;AAAA,MACZ,WAAW;AAAA,MACX;AAAA,MACA,QAAQ,WAAW;AAAA,MACnB,QAAQ,SAAS;AAAA,IACnB;AAAA,IACA,MAAM,IAAI,YAAY,WAAW,QAAQ;AAAA,IACzC,WAAW,IAAI,gBAAgB,YAAY,MAAM;AAAA,IACjD,QAAQ,IAAI,cAAc,YAAY,MAAM;AAAA,IAC5C,SAAS,IAAI,eAAe,YAAY,MAAM;AAAA,IAC9C,SAAS,IAAI,eAAe,WAAW,UAAU,MAAM;AAAA,IACvD,SAAS,IAAI;AAAA,MACX;AAAA,MACA,QAAQ,SAAS,QAAQ,EAAE,OAAO,QAAQ,QAAQ,MAAM,IAAI,CAAC;AAAA,IAC/D;AAAA,EACF;AACF;",
4
+ "sourcesContent": ["import type { MonitorSection } from '@ai-ecoverse/slicc-spectrum/ui';\nimport type { AgentConnection } from '../client.ts';\nimport { AgentAdapter } from './agent-port.ts';\nimport { ChangesAdapter } from './changes-port.ts';\nimport { MemoryAdapter } from './memory-port.ts';\nimport { MonitorAdapter } from './monitor-port.ts';\nimport { NoticesAdapter } from './notices-port.ts';\nimport { PageAdapter, type PageOptions } from './page-port.ts';\nimport { type Login, SettingsAdapter } from './settings-port.ts';\nimport { SprinkleAdapter } from './sprinkle-port.ts';\nimport { TrayAdapter } from './tray-port.ts';\n\nexport { AgentAdapter, CONE } from './agent-port.ts';\nexport { ChangesAdapter, type ChangesEvents } from './changes-port.ts';\nexport { MemoryAdapter } from './memory-port.ts';\nexport {\n assistant,\n errorAction,\n errorPart,\n isBusy,\n queued,\n textOf,\n toMessages,\n} from './messages.ts';\nexport {\n MonitorAdapter,\n type MonitorAdapterOptions,\n type MonitorInput,\n monitorSnapshot,\n} from './monitor-port.ts';\nexport {\n KEYS_MOVED,\n MISMATCH,\n mismatchBanner,\n movedList,\n movedNotice,\n NoticesAdapter,\n} from './notices-port.ts';\nexport {\n PageAdapter,\n type PageDocument,\n type PageOptions,\n type PageRun,\n type PageTarget,\n} from './page-port.ts';\nexport { type Login, SETTINGS_KEY, SettingsAdapter } from './settings-port.ts';\nexport { SprinkleAdapter } from './sprinkle-port.ts';\nexport { TrayAdapter } from './tray-port.ts';\n\nexport function createAgentModel(\n connection: AgentConnection,\n options: {\n storage?: Pick<Storage, 'getItem' | 'setItem'> | null;\n login?: Login;\n monitor?: { extra?: () => readonly MonitorSection[] };\n page?: PageOptions;\n } = {}\n): {\n agent: AgentAdapter;\n settings: SettingsAdapter;\n tray: TrayAdapter;\n sprinkles: SprinkleAdapter;\n memory: MemoryAdapter;\n changes: ChangesAdapter;\n monitor: MonitorAdapter;\n notices: NoticesAdapter;\n page: PageAdapter | null;\n} {\n const agent = new AgentAdapter(connection);\n const report = (text: string) => agent.notify(text);\n const run = options.page?.run;\n return {\n agent,\n page: options.page && run ? new PageAdapter(connection, agent, { ...options.page, run }) : null,\n settings: new SettingsAdapter(\n connection.settings,\n agent,\n options.storage ?? null,\n options.login ?? null\n ),\n tray: new TrayAdapter(connection.settings),\n sprinkles: new SprinkleAdapter(connection, report),\n memory: new MemoryAdapter(connection, report),\n changes: new ChangesAdapter(connection, report),\n notices: new NoticesAdapter(connection.settings, report, connection.mismatch),\n monitor: new MonitorAdapter(\n connection,\n options.monitor?.extra ? { extra: options.monitor.extra } : {}\n ),\n };\n}\n"],
5
+ "mappings": "AAEA,SAAS,oBAAoB;AAC7B,SAAS,sBAAsB;AAC/B,SAAS,qBAAqB;AAC9B,SAAS,sBAAsB;AAC/B,SAAS,sBAAsB;AAC/B,SAAS,mBAAqC;AAC9C,SAAqB,uBAAuB;AAC5C,SAAS,uBAAuB;AAChC,SAAS,mBAAmB;AAE5B,SAAS,gBAAAA,eAAc,YAAY;AACnC,SAAS,kBAAAC,uBAA0C;AACnD,SAAS,iBAAAC,sBAAqB;AAC9B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE,kBAAAC;AAAA,EAGA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,kBAAAC;AAAA,OACK;AACP;AAAA,EACE,eAAAC;AAAA,OAKK;AACP,SAAqB,cAAc,mBAAAC,wBAAuB;AAC1D,SAAS,mBAAAC,wBAAuB;AAChC,SAAS,eAAAC,oBAAmB;AAErB,SAAS,iBACd,YACA,UAKI,CAAC,GAWL;AACA,QAAM,QAAQ,IAAI,aAAa,UAAU;AACzC,QAAM,SAAS,CAAC,SAAiB,MAAM,OAAO,IAAI;AAClD,QAAM,MAAM,QAAQ,MAAM;AAC1B,SAAO;AAAA,IACL;AAAA,IACA,MAAM,QAAQ,QAAQ,MAAM,IAAI,YAAY,YAAY,OAAO,EAAE,GAAG,QAAQ,MAAM,IAAI,CAAC,IAAI;AAAA,IAC3F,UAAU,IAAI;AAAA,MACZ,WAAW;AAAA,MACX;AAAA,MACA,QAAQ,WAAW;AAAA,MACnB,QAAQ,SAAS;AAAA,IACnB;AAAA,IACA,MAAM,IAAI,YAAY,WAAW,QAAQ;AAAA,IACzC,WAAW,IAAI,gBAAgB,YAAY,MAAM;AAAA,IACjD,QAAQ,IAAI,cAAc,YAAY,MAAM;AAAA,IAC5C,SAAS,IAAI,eAAe,YAAY,MAAM;AAAA,IAC9C,SAAS,IAAI,eAAe,WAAW,UAAU,QAAQ,WAAW,QAAQ;AAAA,IAC5E,SAAS,IAAI;AAAA,MACX;AAAA,MACA,QAAQ,SAAS,QAAQ,EAAE,OAAO,QAAQ,QAAQ,MAAM,IAAI,CAAC;AAAA,IAC/D;AAAA,EACF;AACF;",
6
6
  "names": ["AgentAdapter", "ChangesAdapter", "MemoryAdapter", "MonitorAdapter", "NoticesAdapter", "PageAdapter", "SettingsAdapter", "SprinkleAdapter", "TrayAdapter"]
7
7
  }
@@ -2,6 +2,17 @@ import { BACKGROUND_CONTEXT } from "@earendil-works/chord/context";
2
2
  import { attempt } from "./attempt.js";
3
3
  import { Emitter } from "./emitter.js";
4
4
  const KEYS_MOVED = "keys-moved";
5
+ const MISMATCH = "agent-mismatch";
6
+ function mismatchBanner(text) {
7
+ return {
8
+ id: MISMATCH,
9
+ tone: "warning",
10
+ title: "This tab can't follow that SLICC",
11
+ body: text,
12
+ actions: [],
13
+ dismissible: false
14
+ };
15
+ }
5
16
  function servers(names, lead) {
6
17
  if (names.length > 1) return `MCP servers: ${names.join(", ")}`;
7
18
  return `${lead ? "the" : "and the"} MCP server ${names[0]}`;
@@ -25,16 +36,18 @@ function movedNotice(accounts) {
25
36
  class NoticesAdapter extends Emitter {
26
37
  #settings;
27
38
  #report;
39
+ #mismatch;
28
40
  #hidden = false;
29
- constructor(settings, report) {
41
+ constructor(settings, report, mismatch) {
30
42
  super();
31
43
  this.#settings = settings;
32
44
  this.#report = report;
45
+ this.#mismatch = mismatch ? [mismatchBanner(mismatch)] : [];
33
46
  settings.state.subscribe(() => this.emit("notices", this.list()));
34
47
  }
35
48
  list() {
36
49
  const moved = this.#settings.state.value?.moved;
37
- return moved?.length && !this.#hidden ? [movedNotice(moved)] : [];
50
+ return [...this.#mismatch, ...moved?.length && !this.#hidden ? [movedNotice(moved)] : []];
38
51
  }
39
52
  async act() {
40
53
  }
@@ -47,7 +60,9 @@ class NoticesAdapter extends Emitter {
47
60
  }
48
61
  export {
49
62
  KEYS_MOVED,
63
+ MISMATCH,
50
64
  NoticesAdapter,
65
+ mismatchBanner,
51
66
  movedList,
52
67
  movedNotice
53
68
  };
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/spectrum/notices-port.ts"],
4
- "sourcesContent": ["import type { Notice, NoticesPort } from '@ai-ecoverse/slicc-spectrum/ui';\nimport { BACKGROUND_CONTEXT } from '@earendil-works/chord/context';\nimport type { MovedName } from '../secrets/legacy.ts';\nimport type { AgentSettings } from '../services.ts';\nimport { attempt, type Report } from './attempt.ts';\nimport { Emitter } from './emitter.ts';\n\nexport const KEYS_MOVED = 'keys-moved';\n\nfunction servers(names: readonly string[], lead: boolean): string {\n if (names.length > 1) return `MCP servers: ${names.join(', ')}`;\n return `${lead ? 'the' : 'and the'} MCP server ${names[0]}`;\n}\n\nexport function movedList(accounts: readonly MovedName[]): string {\n const models = accounts.filter((name) => name.kind === 'model').map((name) => name.label);\n const mcp = accounts.filter((name) => name.kind === 'mcp').map((name) => name.label);\n if (!mcp.length) return models.join(', ');\n if (!models.length) return servers(mcp, true);\n return `${models.join(', ')}${mcp.length > 1 ? '; ' : ', '}${servers(mcp, false)}`;\n}\n\nexport function movedNotice(accounts: readonly MovedName[]): Notice {\n return {\n id: KEYS_MOVED,\n tone: 'info',\n title: \"Your keys moved to seven's vault.\",\n body: `Add them again in Settings \u203A Accounts: ${movedList(accounts)}.`,\n actions: [],\n };\n}\n\nexport class NoticesAdapter extends Emitter<{ notices: readonly Notice[] }> implements NoticesPort {\n readonly #settings: AgentSettings;\n readonly #report: Report;\n #hidden = false;\n\n constructor(settings: AgentSettings, report: Report) {\n super();\n this.#settings = settings;\n this.#report = report;\n settings.state.subscribe(() => this.emit('notices', this.list()));\n }\n\n list(): readonly Notice[] {\n const moved = this.#settings.state.value?.moved;\n return moved?.length && !this.#hidden ? [movedNotice(moved)] : [];\n }\n\n async act(): Promise<void> {}\n\n dismiss(id: string): void {\n if (id !== KEYS_MOVED) return;\n this.#hidden = true;\n this.emit('notices', this.list());\n attempt(this.#settings.dismissMoved(BACKGROUND_CONTEXT), 'dismiss the notice', this.#report);\n }\n}\n"],
5
- "mappings": "AACA,SAAS,0BAA0B;AAGnC,SAAS,eAA4B;AACrC,SAAS,eAAe;AAEjB,MAAM,aAAa;AAE1B,SAAS,QAAQ,OAA0B,MAAuB;AAChE,MAAI,MAAM,SAAS,EAAG,QAAO,gBAAgB,MAAM,KAAK,IAAI,CAAC;AAC7D,SAAO,GAAG,OAAO,QAAQ,SAAS,eAAe,MAAM,CAAC,CAAC;AAC3D;AAEO,SAAS,UAAU,UAAwC;AAChE,QAAM,SAAS,SAAS,OAAO,CAAC,SAAS,KAAK,SAAS,OAAO,EAAE,IAAI,CAAC,SAAS,KAAK,KAAK;AACxF,QAAM,MAAM,SAAS,OAAO,CAAC,SAAS,KAAK,SAAS,KAAK,EAAE,IAAI,CAAC,SAAS,KAAK,KAAK;AACnF,MAAI,CAAC,IAAI,OAAQ,QAAO,OAAO,KAAK,IAAI;AACxC,MAAI,CAAC,OAAO,OAAQ,QAAO,QAAQ,KAAK,IAAI;AAC5C,SAAO,GAAG,OAAO,KAAK,IAAI,CAAC,GAAG,IAAI,SAAS,IAAI,OAAO,IAAI,GAAG,QAAQ,KAAK,KAAK,CAAC;AAClF;AAEO,SAAS,YAAY,UAAwC;AAClE,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM,+CAA0C,UAAU,QAAQ,CAAC;AAAA,IACnE,SAAS,CAAC;AAAA,EACZ;AACF;AAEO,MAAM,uBAAuB,QAA+D;AAAA,EACxF;AAAA,EACA;AAAA,EACT,UAAU;AAAA,EAEV,YAAY,UAAyB,QAAgB;AACnD,UAAM;AACN,SAAK,YAAY;AACjB,SAAK,UAAU;AACf,aAAS,MAAM,UAAU,MAAM,KAAK,KAAK,WAAW,KAAK,KAAK,CAAC,CAAC;AAAA,EAClE;AAAA,EAEA,OAA0B;AACxB,UAAM,QAAQ,KAAK,UAAU,MAAM,OAAO;AAC1C,WAAO,OAAO,UAAU,CAAC,KAAK,UAAU,CAAC,YAAY,KAAK,CAAC,IAAI,CAAC;AAAA,EAClE;AAAA,EAEA,MAAM,MAAqB;AAAA,EAAC;AAAA,EAE5B,QAAQ,IAAkB;AACxB,QAAI,OAAO,WAAY;AACvB,SAAK,UAAU;AACf,SAAK,KAAK,WAAW,KAAK,KAAK,CAAC;AAChC,YAAQ,KAAK,UAAU,aAAa,kBAAkB,GAAG,sBAAsB,KAAK,OAAO;AAAA,EAC7F;AACF;",
4
+ "sourcesContent": ["import type { Notice, NoticesPort } from '@ai-ecoverse/slicc-spectrum/ui';\nimport { BACKGROUND_CONTEXT } from '@earendil-works/chord/context';\nimport type { MovedName } from '../secrets/legacy.ts';\nimport type { AgentSettings } from '../services.ts';\nimport { attempt, type Report } from './attempt.ts';\nimport { Emitter } from './emitter.ts';\n\nexport const KEYS_MOVED = 'keys-moved';\n\nexport const MISMATCH = 'agent-mismatch';\n\nexport function mismatchBanner(text: string): Notice {\n return {\n id: MISMATCH,\n tone: 'warning',\n title: \"This tab can't follow that SLICC\",\n body: text,\n actions: [],\n dismissible: false,\n };\n}\n\nfunction servers(names: readonly string[], lead: boolean): string {\n if (names.length > 1) return `MCP servers: ${names.join(', ')}`;\n return `${lead ? 'the' : 'and the'} MCP server ${names[0]}`;\n}\n\nexport function movedList(accounts: readonly MovedName[]): string {\n const models = accounts.filter((name) => name.kind === 'model').map((name) => name.label);\n const mcp = accounts.filter((name) => name.kind === 'mcp').map((name) => name.label);\n if (!mcp.length) return models.join(', ');\n if (!models.length) return servers(mcp, true);\n return `${models.join(', ')}${mcp.length > 1 ? '; ' : ', '}${servers(mcp, false)}`;\n}\n\nexport function movedNotice(accounts: readonly MovedName[]): Notice {\n return {\n id: KEYS_MOVED,\n tone: 'info',\n title: \"Your keys moved to seven's vault.\",\n body: `Add them again in Settings \u203A Accounts: ${movedList(accounts)}.`,\n actions: [],\n };\n}\n\nexport class NoticesAdapter extends Emitter<{ notices: readonly Notice[] }> implements NoticesPort {\n readonly #settings: AgentSettings;\n readonly #report: Report;\n readonly #mismatch: readonly Notice[];\n #hidden = false;\n\n constructor(settings: AgentSettings, report: Report, mismatch?: string) {\n super();\n this.#settings = settings;\n this.#report = report;\n this.#mismatch = mismatch ? [mismatchBanner(mismatch)] : [];\n settings.state.subscribe(() => this.emit('notices', this.list()));\n }\n\n list(): readonly Notice[] {\n const moved = this.#settings.state.value?.moved;\n return [...this.#mismatch, ...(moved?.length && !this.#hidden ? [movedNotice(moved)] : [])];\n }\n\n async act(): Promise<void> {}\n\n dismiss(id: string): void {\n if (id !== KEYS_MOVED) return;\n this.#hidden = true;\n this.emit('notices', this.list());\n attempt(this.#settings.dismissMoved(BACKGROUND_CONTEXT), 'dismiss the notice', this.#report);\n }\n}\n"],
5
+ "mappings": "AACA,SAAS,0BAA0B;AAGnC,SAAS,eAA4B;AACrC,SAAS,eAAe;AAEjB,MAAM,aAAa;AAEnB,MAAM,WAAW;AAEjB,SAAS,eAAe,MAAsB;AACnD,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,SAAS,CAAC;AAAA,IACV,aAAa;AAAA,EACf;AACF;AAEA,SAAS,QAAQ,OAA0B,MAAuB;AAChE,MAAI,MAAM,SAAS,EAAG,QAAO,gBAAgB,MAAM,KAAK,IAAI,CAAC;AAC7D,SAAO,GAAG,OAAO,QAAQ,SAAS,eAAe,MAAM,CAAC,CAAC;AAC3D;AAEO,SAAS,UAAU,UAAwC;AAChE,QAAM,SAAS,SAAS,OAAO,CAAC,SAAS,KAAK,SAAS,OAAO,EAAE,IAAI,CAAC,SAAS,KAAK,KAAK;AACxF,QAAM,MAAM,SAAS,OAAO,CAAC,SAAS,KAAK,SAAS,KAAK,EAAE,IAAI,CAAC,SAAS,KAAK,KAAK;AACnF,MAAI,CAAC,IAAI,OAAQ,QAAO,OAAO,KAAK,IAAI;AACxC,MAAI,CAAC,OAAO,OAAQ,QAAO,QAAQ,KAAK,IAAI;AAC5C,SAAO,GAAG,OAAO,KAAK,IAAI,CAAC,GAAG,IAAI,SAAS,IAAI,OAAO,IAAI,GAAG,QAAQ,KAAK,KAAK,CAAC;AAClF;AAEO,SAAS,YAAY,UAAwC;AAClE,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM,+CAA0C,UAAU,QAAQ,CAAC;AAAA,IACnE,SAAS,CAAC;AAAA,EACZ;AACF;AAEO,MAAM,uBAAuB,QAA+D;AAAA,EACxF;AAAA,EACA;AAAA,EACA;AAAA,EACT,UAAU;AAAA,EAEV,YAAY,UAAyB,QAAgB,UAAmB;AACtE,UAAM;AACN,SAAK,YAAY;AACjB,SAAK,UAAU;AACf,SAAK,YAAY,WAAW,CAAC,eAAe,QAAQ,CAAC,IAAI,CAAC;AAC1D,aAAS,MAAM,UAAU,MAAM,KAAK,KAAK,WAAW,KAAK,KAAK,CAAC,CAAC;AAAA,EAClE;AAAA,EAEA,OAA0B;AACxB,UAAM,QAAQ,KAAK,UAAU,MAAM,OAAO;AAC1C,WAAO,CAAC,GAAG,KAAK,WAAW,GAAI,OAAO,UAAU,CAAC,KAAK,UAAU,CAAC,YAAY,KAAK,CAAC,IAAI,CAAC,CAAE;AAAA,EAC5F;AAAA,EAEA,MAAM,MAAqB;AAAA,EAAC;AAAA,EAE5B,QAAQ,IAAkB;AACxB,QAAI,OAAO,WAAY;AACvB,SAAK,UAAU;AACf,SAAK,KAAK,WAAW,KAAK,KAAK,CAAC;AAChC,YAAQ,KAAK,UAAU,aAAa,kBAAkB,GAAG,sBAAsB,KAAK,OAAO;AAAA,EAC7F;AACF;",
6
6
  "names": []
7
7
  }
@@ -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 { Agent } from './agent.ts';
3
3
  import type { ChangesRuntime } from './changes/index.ts';
4
4
  import { type HostLicks, type HostScoops } from './control.ts';
@@ -7,16 +7,17 @@ import type { UserClients } from './kernel/users.ts';
7
7
  import type { McpRuntime } from './mcp/index.ts';
8
8
  import type { MemoryRuntime } from './memory/index.ts';
9
9
  import { type MonitorOptions } from './monitor/index.ts';
10
+ import { type AgentRemote } from './remote/host.ts';
10
11
  import { type Pages } from './remote/pages.ts';
11
12
  import type { SecretName } from './secrets/names.ts';
12
13
  import type { VaultState } from './secrets/vault.ts';
13
- import { AgentSettings } from './services.ts';
14
+ import { AgentControl, AgentSettings, AgentTranscript } from './services.ts';
14
15
  import type { SkillsRuntime } from './skills/index.ts';
15
16
  import type { SprinklesRuntime } from './sprinkles/index.ts';
16
17
  import { type Thumbnail } from './thumbs.ts';
17
18
  import { type LabelsRuntime } from './titles/labels.ts';
18
19
  import type { Uploads } from './uploads.ts';
19
- import type { PortEndpoint } from './wire.ts';
20
+ import { type PortEndpoint } from './wire.ts';
20
21
  export interface ConnectOptions {
21
22
  readOnly?: boolean;
22
23
  pages?: boolean;
@@ -54,3 +55,14 @@ export declare function hostAgent(agent: Agent, options?: {
54
55
  thumbnail?: Thumbnail;
55
56
  labels?: LabelsRuntime;
56
57
  }): Promise<AgentHost>;
58
+ interface Served {
59
+ trusted: AgentControl;
60
+ viewed: AgentControl;
61
+ transcript: Record<keyof AgentTranscript, ReplicatedState<unknown>>;
62
+ viewMonitor: ReplicatedState<unknown>;
63
+ settings: AgentSettings;
64
+ remote: AgentRemote;
65
+ pages: Pages;
66
+ }
67
+ export declare function serveAgent(serving: Served): Host;
68
+ export {};
@@ -7,17 +7,15 @@ export { type AgentHost, type ConnectOptions, hostAgent } from './host.ts';
7
7
  export type { KernelClient, KernelFs, KernelProcess, KernelStat, SpawnOptions, } from './kernel/client.ts';
8
8
  export { HOME, type KernelEnvOptions, kernelEnvironment, SliccKernelEnv } from './kernel/env.ts';
9
9
  export { adminOver, type KernelAdmin, type KernelGroup, type KernelGroups, type KernelUser, type KernelUsers, serveAdmin, type UserClient, type UserClients, type UserConnect, type UserSpec, userClients, } from './kernel/users.ts';
10
- export { PortListener } from './listener.ts';
11
10
  export { type AgentWorkerOptions, type AgentWorkerScope, type KernelAttach, runAgentWorker, } from './main.ts';
12
11
  export { type Loopback, type Transport, type TransportResponse, transportFetch, } from './net.ts';
13
12
  export { AGENT_LOCK, type AgentOwner, type AgentWorker, type KernelSource, type OwnerOptions, startAgent, } from './owner.ts';
14
- export { applyPatches, patchServerAccept } from './patches.ts';
15
13
  export { SliccPrompt, sliccPrompt } from './prompt.ts';
16
14
  export { type AgentPages, createPages, type PageBatch, type PageCaller, type PageRequest, type PageResult, type Pages, type PagesOpened, type PageTab, } from './remote/pages.ts';
17
- export { type AccountState, AGENT_SESSION, AgentControl, AgentPagesService, AgentSessions, AgentSettings, type AgentSettingsChange, AgentTranscript, type BudgetState, type ModelChoice, type OperationError, type PromptResult, type SendMode, type SendRequest, type SendResponse, type SettingsState, type SignIn, } from './services.ts';
15
+ export { type AccountState, AgentControl, AgentPagesService, AgentSettings, type AgentSettingsChange, AgentTranscript, type BudgetState, type ModelChoice, type OperationError, type PromptResult, type SendMode, type SendRequest, type SendResponse, type SettingsState, type SignIn, } from './services.ts';
18
16
  export { BEDROCK, createAgentSettings, createSliccModels, DEFAULT_MODEL, DEFAULT_REGIONS, PREFERRED_MODELS, preferredModel, resolveDefaultModel, sliccProviders, withDefaultRegions, } from './settings.ts';
19
17
  export { AGENT_DIRECTORY, type OpfsSqliteOptions, openMemorySqliteStorage, openOpfsSqliteStorage, WasmSqliteDatabase, } from './sqlite.ts';
20
18
  export { type SystemFacts, systemSection } from './system.ts';
21
19
  export { UPLOADS, type Uploads, upload } from './uploads.ts';
22
- export { PortChannel, type PortEndpoint, withUnrefTimers } from './wire.ts';
20
+ export { LINK_PROTOCOL, type PortEndpoint, PortLink } from './wire.ts';
23
21
  export { type KernelPorts, kernelPort, kernelPorts, serveConnections, type WorkerScope, } from './worker.ts';
@@ -1,3 +1,3 @@
1
1
  import type { AgentConnection } from './client.ts';
2
- export declare const NEWER_AGENT = "That SLICC runs a newer version of the agent than this one, so this tab can't follow it. Update this SLICC, then reload this page.";
3
- export declare function mismatched(serverId: string): AgentConnection;
2
+ export declare function mismatchNotice(protocol: number): string;
3
+ export declare function mismatched(serverId: string, protocol: number): AgentConnection;