@ai-ecoverse/slicc-agent 6.15.2 → 6.16.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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/providers.ts"],
4
- "sourcesContent": ["import type { Provider } from '@earendil-works/pi-ai';\nimport { antLingProvider } from '@earendil-works/pi-ai/providers/ant-ling';\nimport { anthropicProvider } from '@earendil-works/pi-ai/providers/anthropic';\nimport { azureProvider } from '@earendil-works/pi-ai/providers/azure';\nimport { basetenProvider } from '@earendil-works/pi-ai/providers/baseten';\nimport { cerebrasProvider } from '@earendil-works/pi-ai/providers/cerebras';\nimport { cloudflareAIGatewayProvider } from '@earendil-works/pi-ai/providers/cloudflare-ai-gateway';\nimport { cloudflareWorkersAIProvider } from '@earendil-works/pi-ai/providers/cloudflare-workers-ai';\nimport { deepseekProvider } from '@earendil-works/pi-ai/providers/deepseek';\nimport { fireworksProvider } from '@earendil-works/pi-ai/providers/fireworks';\nimport { groqProvider } from '@earendil-works/pi-ai/providers/groq';\nimport { huggingfaceProvider } from '@earendil-works/pi-ai/providers/huggingface';\nimport { kimiCodingProvider } from '@earendil-works/pi-ai/providers/kimi-coding';\nimport { metaProvider } from '@earendil-works/pi-ai/providers/meta';\nimport { minimaxProvider } from '@earendil-works/pi-ai/providers/minimax';\nimport { minimaxCnProvider } from '@earendil-works/pi-ai/providers/minimax-cn';\nimport { mistralProvider } from '@earendil-works/pi-ai/providers/mistral';\nimport { moonshotaiProvider } from '@earendil-works/pi-ai/providers/moonshotai';\nimport { moonshotaiCnProvider } from '@earendil-works/pi-ai/providers/moonshotai-cn';\nimport { nvidiaProvider } from '@earendil-works/pi-ai/providers/nvidia';\nimport { openaiProvider } from '@earendil-works/pi-ai/providers/openai';\nimport { opencodeProvider } from '@earendil-works/pi-ai/providers/opencode';\nimport { opencodeGoProvider } from '@earendil-works/pi-ai/providers/opencode-go';\nimport { openrouterProvider } from '@earendil-works/pi-ai/providers/openrouter';\nimport { qwenTokenPlanProvider } from '@earendil-works/pi-ai/providers/qwen-token-plan';\nimport { qwenTokenPlanCnProvider } from '@earendil-works/pi-ai/providers/qwen-token-plan-cn';\nimport { qwenTokenPlanIndividualProvider } from '@earendil-works/pi-ai/providers/qwen-token-plan-individual';\nimport { togetherProvider } from '@earendil-works/pi-ai/providers/together';\nimport { vercelAIGatewayProvider } from '@earendil-works/pi-ai/providers/vercel-ai-gateway';\nimport { xaiProvider } from '@earendil-works/pi-ai/providers/xai';\nimport { xiaomiProvider } from '@earendil-works/pi-ai/providers/xiaomi';\nimport { xiaomiTokenPlanAmsProvider } from '@earendil-works/pi-ai/providers/xiaomi-token-plan-ams';\nimport { xiaomiTokenPlanCnProvider } from '@earendil-works/pi-ai/providers/xiaomi-token-plan-cn';\nimport { xiaomiTokenPlanSgpProvider } from '@earendil-works/pi-ai/providers/xiaomi-token-plan-sgp';\nimport { zaiProvider } from '@earendil-works/pi-ai/providers/zai';\nimport { zaiCodingCnProvider } from '@earendil-works/pi-ai/providers/zai-coding-cn';\n\nexport interface FieldOption {\n value: string;\n label: string;\n}\n\nexport interface FieldInput {\n name: string;\n label: string;\n required?: boolean;\n placeholder?: string;\n help?: string;\n customBase?: true;\n vaultSetting?: string;\n options?: readonly FieldOption[];\n value?: string;\n}\n\nexport interface FieldSpec extends FieldInput {\n env(value: string): Record<string, string> | string;\n}\n\nexport interface KeyProvider {\n id: string;\n make: () => Provider;\n env: string;\n description: string;\n keyUrl: string;\n cors: boolean;\n fields?: readonly FieldSpec[];\n}\n\nconst RESOURCE = /^[a-z0-9][a-z0-9-]{0,62}$/i;\nconst DEPLOYMENTS = /^[^=,\\s]+\\s*=\\s*[^=,\\s]+(\\s*,\\s*[^=,\\s]+\\s*=\\s*[^=,\\s]+)*$/;\n\nexport function httpsBase(value: string): URL | undefined {\n const url = URL.parse(value);\n if (url?.protocol !== 'https:' || url.username || url.password) return undefined;\n return url.port === '' || url.port === '443' ? url : undefined;\n}\n\nfunction azureEndpoint(value: string): Record<string, string> | string {\n if (RESOURCE.test(value)) return { AZURE_OPENAI_RESOURCE_NAME: value };\n const url = httpsBase(value);\n if (!url)\n return 'Enter your Azure resource name, or its endpoint as an https:// address without a port or a user name.';\n return { AZURE_OPENAI_BASE_URL: url.href.replace(/\\/+$/, '') };\n}\n\nexport const AZURE = 'azure';\n\nexport function azureBase(env: Readonly<Record<string, string>>): string | undefined {\n if (env.AZURE_OPENAI_BASE_URL) return env.AZURE_OPENAI_BASE_URL;\n const name = env.AZURE_OPENAI_RESOURCE_NAME;\n return name ? `https://${name}.openai.azure.com/openai/v1` : undefined;\n}\n\nconst REGION = /^[a-z]{2,}(-[a-z]+)+-\\d{1,2}$/;\nconst ACCOUNT = /^[0-9a-f]{32}$/i;\nconst GATEWAY = /^[A-Za-z0-9_-]{1,64}$/;\n\nconst checked =\n (pattern: RegExp, env: string, problem: string) =>\n (value: string): Record<string, string> | string =>\n pattern.test(value) ? { [env]: value } : problem;\n\nconst BEDROCK_REGIONS: readonly (readonly [string, string])[] = [\n ['ap-northeast-1', 'Asia Pacific (Tokyo)'],\n ['ap-northeast-2', 'Asia Pacific (Seoul)'],\n ['ap-northeast-3', 'Asia Pacific (Osaka)'],\n ['ap-south-1', 'Asia Pacific (Mumbai)'],\n ['ap-south-2', 'Asia Pacific (Hyderabad)'],\n ['ap-southeast-1', 'Asia Pacific (Singapore)'],\n ['ap-southeast-2', 'Asia Pacific (Sydney)'],\n ['ca-central-1', 'Canada (Central)'],\n ['eu-central-1', 'Europe (Frankfurt)'],\n ['eu-central-2', 'Europe (Zurich)'],\n ['eu-north-1', 'Europe (Stockholm)'],\n ['eu-south-1', 'Europe (Milan)'],\n ['eu-south-2', 'Europe (Spain)'],\n ['eu-west-1', 'Europe (Ireland)'],\n ['eu-west-2', 'Europe (London)'],\n ['eu-west-3', 'Europe (Paris)'],\n ['sa-east-1', 'South America (S\u00E3o Paulo)'],\n ['us-east-1', 'US East (N. Virginia)'],\n ['us-gov-east-1', 'AWS GovCloud (US-East)'],\n ['us-gov-west-1', 'AWS GovCloud (US-West)'],\n ['us-west-2', 'US West (Oregon)'],\n];\n\nexport const DEFAULT_REGION = 'us-west-2';\n\nexport const REGION_FIELD: FieldSpec = {\n name: 'region',\n label: 'Region',\n help: 'The AWS region your Bedrock models run in.',\n options: BEDROCK_REGIONS.map(([value, label]) => ({ value, label: `${label}, ${value}` })),\n value: DEFAULT_REGION,\n env: checked(REGION, 'AWS_REGION', 'Enter an AWS region such as us-west-2.'),\n};\n\nconst ACCOUNT_FIELD: FieldSpec = {\n name: 'account',\n label: 'Account ID',\n required: true,\n placeholder: '0123456789abcdef0123456789abcdef',\n help: 'The 32-character ID on your Cloudflare dashboard\u2019s account overview.',\n vaultSetting: 'CLOUDFLARE_ACCOUNT_ID',\n env: checked(\n ACCOUNT,\n 'CLOUDFLARE_ACCOUNT_ID',\n 'A Cloudflare account ID is 32 characters of 0\u20139 and a\u2013f.'\n ),\n};\n\nexport const KEY_PROVIDERS: readonly KeyProvider[] = [\n {\n id: 'azure',\n make: azureProvider,\n env: 'AZURE_OPENAI_API_KEY',\n description: 'OpenAI models deployed in your own Azure OpenAI or AI Foundry resource.',\n keyUrl: 'https://portal.azure.com',\n cors: true,\n fields: [\n {\n name: 'endpoint',\n label: 'Endpoint',\n required: true,\n placeholder: 'my-resource or https://my-resource.openai.azure.com',\n help: 'Your resource\u2019s name, or its endpoint address from Keys and Endpoint.',\n customBase: true,\n vaultSetting: 'AZURE_OPENAI_RESOURCE_NAME',\n env: azureEndpoint,\n },\n {\n name: 'deployments',\n label: 'Deployments',\n placeholder: 'gpt-5.4=my-gpt',\n help: 'Only for deployments named differently from their model, as model=deployment, separated by commas.',\n env: (value) =>\n DEPLOYMENTS.test(value)\n ? { AZURE_OPENAI_DEPLOYMENT_NAME_MAP: value }\n : 'Write each deployment as model=deployment, separated by commas.',\n },\n ],\n },\n {\n id: 'cloudflare-workers-ai',\n make: cloudflareWorkersAIProvider,\n env: 'CLOUDFLARE_API_KEY',\n description: 'Open models on Cloudflare Workers AI, in your Cloudflare account.',\n keyUrl: 'https://dash.cloudflare.com/profile/api-tokens',\n cors: false,\n fields: [ACCOUNT_FIELD],\n },\n {\n id: 'cloudflare-ai-gateway',\n make: cloudflareAIGatewayProvider,\n env: 'CLOUDFLARE_API_KEY',\n description: 'Models from many labs through your Cloudflare AI Gateway.',\n keyUrl: 'https://dash.cloudflare.com/profile/api-tokens',\n cors: false,\n fields: [\n ACCOUNT_FIELD,\n {\n name: 'gateway',\n label: 'Gateway ID',\n required: true,\n placeholder: 'my-gateway',\n help: 'The name of your gateway under AI \u203A AI Gateway.',\n vaultSetting: 'CLOUDFLARE_GATEWAY_ID',\n env: checked(\n GATEWAY,\n 'CLOUDFLARE_GATEWAY_ID',\n 'A gateway ID is letters, digits, - and _, up to 64 characters.'\n ),\n },\n ],\n },\n {\n id: 'anthropic',\n make: anthropicProvider,\n env: 'ANTHROPIC_API_KEY',\n description: 'Claude models, with an API key from the Claude Console.',\n keyUrl: 'https://console.anthropic.com/settings/keys',\n cors: true,\n },\n {\n id: 'openai',\n make: openaiProvider,\n env: 'OPENAI_API_KEY',\n description: 'GPT models, with an API key from the OpenAI platform.',\n keyUrl: 'https://platform.openai.com/api-keys',\n cors: true,\n },\n {\n id: 'mistral',\n make: mistralProvider,\n env: 'MISTRAL_API_KEY',\n description: 'Mistral and Devstral models from La Plateforme.',\n keyUrl: 'https://console.mistral.ai/api-keys',\n cors: true,\n },\n {\n id: 'groq',\n make: groqProvider,\n env: 'GROQ_API_KEY',\n description: 'Open models on Groq\u2019s fast inference.',\n keyUrl: 'https://console.groq.com/keys',\n cors: true,\n },\n {\n id: 'deepseek',\n make: deepseekProvider,\n env: 'DEEPSEEK_API_KEY',\n description: 'DeepSeek\u2019s own models.',\n keyUrl: 'https://platform.deepseek.com/api_keys',\n cors: true,\n },\n {\n id: 'together',\n make: togetherProvider,\n env: 'TOGETHER_API_KEY',\n description: 'Open models hosted by Together AI.',\n keyUrl: 'https://api.together.ai/settings/api-keys',\n cors: true,\n },\n {\n id: 'huggingface',\n make: huggingfaceProvider,\n env: 'HF_TOKEN',\n description: 'Open models through Hugging Face\u2019s inference router.',\n keyUrl: 'https://huggingface.co/settings/tokens',\n cors: true,\n },\n {\n id: 'xiaomi',\n make: xiaomiProvider,\n env: 'XIAOMI_API_KEY',\n description: 'Xiaomi\u2019s MiMo models.',\n keyUrl: 'https://platform.xiaomimimo.com/#/console/api-keys',\n cors: true,\n },\n {\n id: 'xiaomi-token-plan-ams',\n make: xiaomiTokenPlanAmsProvider,\n env: 'XIAOMI_TOKEN_PLAN_AMS_API_KEY',\n description: 'MiMo models on a Xiaomi token plan, served from Amsterdam.',\n keyUrl: 'https://platform.xiaomimimo.com/#/console/api-keys',\n cors: true,\n },\n {\n id: 'xiaomi-token-plan-cn',\n make: xiaomiTokenPlanCnProvider,\n env: 'XIAOMI_TOKEN_PLAN_CN_API_KEY',\n description: 'MiMo models on a Xiaomi token plan, served from China.',\n keyUrl: 'https://platform.xiaomimimo.com/#/console/api-keys',\n cors: true,\n },\n {\n id: 'xiaomi-token-plan-sgp',\n make: xiaomiTokenPlanSgpProvider,\n env: 'XIAOMI_TOKEN_PLAN_SGP_API_KEY',\n description: 'MiMo models on a Xiaomi token plan, served from Singapore.',\n keyUrl: 'https://platform.xiaomimimo.com/#/console/api-keys',\n cors: true,\n },\n {\n id: 'cerebras',\n make: cerebrasProvider,\n env: 'CEREBRAS_API_KEY',\n description: 'Open models on Cerebras inference.',\n keyUrl: 'https://cloud.cerebras.ai',\n cors: false,\n },\n {\n id: 'openrouter',\n make: openrouterProvider,\n env: 'OPENROUTER_API_KEY',\n description: 'Hundreds of models from many labs through one key.',\n keyUrl: 'https://openrouter.ai/settings/keys',\n cors: false,\n },\n {\n id: 'fireworks',\n make: fireworksProvider,\n env: 'FIREWORKS_API_KEY',\n description: 'Open models hosted by Fireworks AI.',\n keyUrl: 'https://app.fireworks.ai/settings/users/api-keys',\n cors: false,\n },\n {\n id: 'baseten',\n make: basetenProvider,\n env: 'BASETEN_API_KEY',\n description: 'Open models hosted by Baseten.',\n keyUrl: 'https://app.baseten.co/settings/api_keys',\n cors: true,\n },\n {\n id: 'moonshotai',\n make: moonshotaiProvider,\n env: 'MOONSHOT_API_KEY',\n description: 'Kimi models from Moonshot AI.',\n keyUrl: 'https://platform.moonshot.ai/console/api-keys',\n cors: true,\n },\n {\n id: 'moonshotai-cn',\n make: moonshotaiCnProvider,\n env: 'MOONSHOT_API_KEY',\n description: 'Kimi models from Moonshot AI\u2019s China platform.',\n keyUrl: 'https://platform.moonshot.cn/console/api-keys',\n cors: true,\n },\n {\n id: 'xai',\n make: xaiProvider,\n env: 'XAI_API_KEY',\n description: 'Grok models from xAI.',\n keyUrl: 'https://console.x.ai',\n cors: true,\n },\n {\n id: 'meta',\n make: metaProvider,\n env: 'META_API_KEY',\n description: 'Meta\u2019s Muse models.',\n keyUrl: 'https://developer.meta.ai',\n cors: true,\n },\n {\n id: 'vercel-ai-gateway',\n make: vercelAIGatewayProvider,\n env: 'AI_GATEWAY_API_KEY',\n description: 'Models from many labs through Vercel\u2019s AI Gateway.',\n keyUrl: 'https://vercel.com/docs/ai-gateway/authentication',\n cors: false,\n },\n {\n id: 'minimax',\n make: minimaxProvider,\n env: 'MINIMAX_API_KEY',\n description: 'MiniMax\u2019s models.',\n keyUrl: 'https://platform.minimax.io/user-center/basic-information/interface-key',\n cors: false,\n },\n {\n id: 'minimax-cn',\n make: minimaxCnProvider,\n env: 'MINIMAX_CN_API_KEY',\n description: 'MiniMax\u2019s models from its China platform.',\n keyUrl: 'https://platform.minimaxi.com/user-center/basic-information/interface-key',\n cors: false,\n },\n {\n id: 'zai',\n make: zaiProvider,\n env: 'ZAI_API_KEY',\n description: 'GLM models on Z.AI\u2019s coding plan.',\n keyUrl: 'https://z.ai/manage-apikey/apikey-list',\n cors: false,\n },\n {\n id: 'zai-coding-cn',\n make: zaiCodingCnProvider,\n env: 'ZAI_CODING_CN_API_KEY',\n description: 'GLM models on Zhipu\u2019s coding plan in China.',\n keyUrl: 'https://open.bigmodel.cn/usercenter/apikeys',\n cors: false,\n },\n {\n id: 'nvidia',\n make: nvidiaProvider,\n env: 'NVIDIA_API_KEY',\n description: 'Open models on NVIDIA\u2019s API catalog.',\n keyUrl: 'https://build.nvidia.com/settings/api-keys',\n cors: false,\n },\n {\n id: 'kimi-coding',\n make: kimiCodingProvider,\n env: 'KIMI_API_KEY',\n description: 'Kimi models on the Kimi Code subscription.',\n keyUrl: 'https://www.kimi.com/code/console',\n cors: false,\n },\n {\n id: 'ant-ling',\n make: antLingProvider,\n env: 'ANT_LING_API_KEY',\n description: 'Ling and Ring models from Ant Group.',\n keyUrl: 'https://www.ant-ling.com',\n cors: false,\n },\n {\n id: 'opencode',\n make: opencodeProvider,\n env: 'OPENCODE_API_KEY',\n description:\n 'Models curated for coding agents by OpenCode Zen. Needs seven\u2019s vault 1.12.2 or later.',\n keyUrl: 'https://opencode.ai/auth',\n cors: false,\n },\n {\n id: 'opencode-go',\n make: opencodeGoProvider,\n env: 'OPENCODE_API_KEY',\n description:\n 'Open models on the OpenCode Go subscription. Needs seven\u2019s vault 1.12.2 or later.',\n keyUrl: 'https://opencode.ai/auth',\n cors: false,\n },\n {\n id: 'qwen-token-plan',\n make: qwenTokenPlanProvider,\n env: 'QWEN_TOKEN_PLAN_API_KEY',\n description: 'Qwen models on an Alibaba Cloud token plan.',\n keyUrl: 'https://modelstudio.console.alibabacloud.com',\n cors: false,\n },\n {\n id: 'qwen-token-plan-cn',\n make: qwenTokenPlanCnProvider,\n env: 'QWEN_TOKEN_PLAN_CN_API_KEY',\n description: 'Qwen models on an Alibaba Cloud token plan in China.',\n keyUrl: 'https://bailian.console.aliyun.com',\n cors: false,\n },\n {\n id: 'qwen-token-plan-individual',\n make: qwenTokenPlanIndividualProvider,\n env: 'QWEN_TOKEN_PLAN_API_KEY',\n description: 'Qwen models on an individual Alibaba Cloud token plan.',\n keyUrl: 'https://modelstudio.console.alibabacloud.com',\n cors: false,\n },\n];\n\nexport type ProviderAuth = 'api-key' | 'oauth' | 'fields' | 'local';\n\nexport interface Listing {\n description: string;\n keyUrl?: string;\n auth: ProviderAuth;\n corsFree: boolean;\n vaultName: string;\n fields?: readonly FieldSpec[];\n}\n\nconst upper = (text: string) => text.toUpperCase().replace(/[^A-Z0-9]/g, '_');\n\nfunction vaultNames(entries: readonly KeyProvider[]): Map<string, string> {\n const uses = Map.groupBy(entries, (entry) => entry.env);\n return new Map(\n entries.map((entry) => [\n entry.id,\n (uses.get(entry.env) as KeyProvider[]).length > 1 ? `${upper(entry.id)}_API_KEY` : entry.env,\n ])\n );\n}\n\nconst named = vaultNames(KEY_PROVIDERS);\n\nexport const LISTINGS: ReadonlyMap<string, Listing> = new Map<string, Listing>([\n [\n 'amazon-bedrock',\n {\n description: 'Claude and other models on AWS, with a Bedrock API key.',\n keyUrl: 'https://console.aws.amazon.com/bedrock/home#/api-keys',\n auth: 'fields',\n corsFree: false,\n vaultName: 'AWS_BEARER_TOKEN_BEDROCK',\n fields: [REGION_FIELD],\n },\n ],\n [\n 'adobe',\n {\n description: 'Models through Adobe\u2019s LLM proxy, with your Adobe ID.',\n auth: 'oauth',\n corsFree: false,\n vaultName: 'ADOBE_IMS_TOKEN',\n },\n ],\n ...KEY_PROVIDERS.map((entry): [string, Listing] => [\n entry.id,\n {\n description: entry.description,\n keyUrl: entry.keyUrl,\n auth: entry.fields ? 'fields' : 'api-key',\n corsFree: !entry.cors,\n vaultName: named.get(entry.id) as string,\n ...(entry.fields ? { fields: entry.fields } : {}),\n },\n ]),\n]);\n\nexport const ADDED_FIRST: readonly string[] = ['amazon-bedrock', 'adobe'];\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { Provider } from '@earendil-works/pi-ai';\nimport { antLingProvider } from '@earendil-works/pi-ai/providers/ant-ling';\nimport { anthropicProvider } from '@earendil-works/pi-ai/providers/anthropic';\nimport { azureProvider } from '@earendil-works/pi-ai/providers/azure';\nimport { basetenProvider } from '@earendil-works/pi-ai/providers/baseten';\nimport { cerebrasProvider } from '@earendil-works/pi-ai/providers/cerebras';\nimport { cloudflareAIGatewayProvider } from '@earendil-works/pi-ai/providers/cloudflare-ai-gateway';\nimport { cloudflareWorkersAIProvider } from '@earendil-works/pi-ai/providers/cloudflare-workers-ai';\nimport { deepseekProvider } from '@earendil-works/pi-ai/providers/deepseek';\nimport { fireworksProvider } from '@earendil-works/pi-ai/providers/fireworks';\nimport { groqProvider } from '@earendil-works/pi-ai/providers/groq';\nimport { huggingfaceProvider } from '@earendil-works/pi-ai/providers/huggingface';\nimport { kimiCodingProvider } from '@earendil-works/pi-ai/providers/kimi-coding';\nimport { metaProvider } from '@earendil-works/pi-ai/providers/meta';\nimport { minimaxProvider } from '@earendil-works/pi-ai/providers/minimax';\nimport { minimaxCnProvider } from '@earendil-works/pi-ai/providers/minimax-cn';\nimport { mistralProvider } from '@earendil-works/pi-ai/providers/mistral';\nimport { moonshotaiProvider } from '@earendil-works/pi-ai/providers/moonshotai';\nimport { moonshotaiCnProvider } from '@earendil-works/pi-ai/providers/moonshotai-cn';\nimport { nvidiaProvider } from '@earendil-works/pi-ai/providers/nvidia';\nimport { openaiProvider } from '@earendil-works/pi-ai/providers/openai';\nimport { opencodeProvider } from '@earendil-works/pi-ai/providers/opencode';\nimport { opencodeGoProvider } from '@earendil-works/pi-ai/providers/opencode-go';\nimport { openrouterProvider } from '@earendil-works/pi-ai/providers/openrouter';\nimport { qwenTokenPlanProvider } from '@earendil-works/pi-ai/providers/qwen-token-plan';\nimport { qwenTokenPlanCnProvider } from '@earendil-works/pi-ai/providers/qwen-token-plan-cn';\nimport { qwenTokenPlanIndividualProvider } from '@earendil-works/pi-ai/providers/qwen-token-plan-individual';\nimport { togetherProvider } from '@earendil-works/pi-ai/providers/together';\nimport { vercelAIGatewayProvider } from '@earendil-works/pi-ai/providers/vercel-ai-gateway';\nimport { xaiProvider } from '@earendil-works/pi-ai/providers/xai';\nimport { xiaomiProvider } from '@earendil-works/pi-ai/providers/xiaomi';\nimport { xiaomiTokenPlanAmsProvider } from '@earendil-works/pi-ai/providers/xiaomi-token-plan-ams';\nimport { xiaomiTokenPlanCnProvider } from '@earendil-works/pi-ai/providers/xiaomi-token-plan-cn';\nimport { xiaomiTokenPlanSgpProvider } from '@earendil-works/pi-ai/providers/xiaomi-token-plan-sgp';\nimport { zaiProvider } from '@earendil-works/pi-ai/providers/zai';\nimport { zaiCodingCnProvider } from '@earendil-works/pi-ai/providers/zai-coding-cn';\nimport { CODEX } from './sign-ins.ts';\n\nexport interface FieldOption {\n value: string;\n label: string;\n}\n\nexport interface FieldInput {\n name: string;\n label: string;\n required?: boolean;\n placeholder?: string;\n help?: string;\n customBase?: true;\n vaultSetting?: string;\n options?: readonly FieldOption[];\n value?: string;\n}\n\nexport interface FieldSpec extends FieldInput {\n env(value: string): Record<string, string> | string;\n}\n\nexport interface KeyProvider {\n id: string;\n make: () => Provider;\n env: string;\n description: string;\n keyUrl: string;\n cors: boolean;\n signIn?: true;\n fields?: readonly FieldSpec[];\n}\n\nconst RESOURCE = /^[a-z0-9][a-z0-9-]{0,62}$/i;\nconst DEPLOYMENTS = /^[^=,\\s]+\\s*=\\s*[^=,\\s]+(\\s*,\\s*[^=,\\s]+\\s*=\\s*[^=,\\s]+)*$/;\n\nexport function httpsBase(value: string): URL | undefined {\n const url = URL.parse(value);\n if (url?.protocol !== 'https:' || url.username || url.password) return undefined;\n return url.port === '' || url.port === '443' ? url : undefined;\n}\n\nfunction azureEndpoint(value: string): Record<string, string> | string {\n if (RESOURCE.test(value)) return { AZURE_OPENAI_RESOURCE_NAME: value };\n const url = httpsBase(value);\n if (!url)\n return 'Enter your Azure resource name, or its endpoint as an https:// address without a port or a user name.';\n return { AZURE_OPENAI_BASE_URL: url.href.replace(/\\/+$/, '') };\n}\n\nexport const AZURE = 'azure';\n\nexport function azureBase(env: Readonly<Record<string, string>>): string | undefined {\n if (env.AZURE_OPENAI_BASE_URL) return env.AZURE_OPENAI_BASE_URL;\n const name = env.AZURE_OPENAI_RESOURCE_NAME;\n return name ? `https://${name}.openai.azure.com/openai/v1` : undefined;\n}\n\nconst REGION = /^[a-z]{2,}(-[a-z]+)+-\\d{1,2}$/;\nconst ACCOUNT = /^[0-9a-f]{32}$/i;\nconst GATEWAY = /^[A-Za-z0-9_-]{1,64}$/;\n\nconst checked =\n (pattern: RegExp, env: string, problem: string) =>\n (value: string): Record<string, string> | string =>\n pattern.test(value) ? { [env]: value } : problem;\n\nconst BEDROCK_REGIONS: readonly (readonly [string, string])[] = [\n ['ap-northeast-1', 'Asia Pacific (Tokyo)'],\n ['ap-northeast-2', 'Asia Pacific (Seoul)'],\n ['ap-northeast-3', 'Asia Pacific (Osaka)'],\n ['ap-south-1', 'Asia Pacific (Mumbai)'],\n ['ap-south-2', 'Asia Pacific (Hyderabad)'],\n ['ap-southeast-1', 'Asia Pacific (Singapore)'],\n ['ap-southeast-2', 'Asia Pacific (Sydney)'],\n ['ca-central-1', 'Canada (Central)'],\n ['eu-central-1', 'Europe (Frankfurt)'],\n ['eu-central-2', 'Europe (Zurich)'],\n ['eu-north-1', 'Europe (Stockholm)'],\n ['eu-south-1', 'Europe (Milan)'],\n ['eu-south-2', 'Europe (Spain)'],\n ['eu-west-1', 'Europe (Ireland)'],\n ['eu-west-2', 'Europe (London)'],\n ['eu-west-3', 'Europe (Paris)'],\n ['sa-east-1', 'South America (S\u00E3o Paulo)'],\n ['us-east-1', 'US East (N. Virginia)'],\n ['us-gov-east-1', 'AWS GovCloud (US-East)'],\n ['us-gov-west-1', 'AWS GovCloud (US-West)'],\n ['us-west-2', 'US West (Oregon)'],\n];\n\nexport const DEFAULT_REGION = 'us-west-2';\n\nexport const REGION_FIELD: FieldSpec = {\n name: 'region',\n label: 'Region',\n help: 'The AWS region your Bedrock models run in.',\n options: BEDROCK_REGIONS.map(([value, label]) => ({ value, label: `${label}, ${value}` })),\n value: DEFAULT_REGION,\n env: checked(REGION, 'AWS_REGION', 'Enter an AWS region such as us-west-2.'),\n};\n\nconst ACCOUNT_FIELD: FieldSpec = {\n name: 'account',\n label: 'Account ID',\n required: true,\n placeholder: '0123456789abcdef0123456789abcdef',\n help: 'The 32-character ID on your Cloudflare dashboard\u2019s account overview.',\n vaultSetting: 'CLOUDFLARE_ACCOUNT_ID',\n env: checked(\n ACCOUNT,\n 'CLOUDFLARE_ACCOUNT_ID',\n 'A Cloudflare account ID is 32 characters of 0\u20139 and a\u2013f.'\n ),\n};\n\nexport const KEY_PROVIDERS: readonly KeyProvider[] = [\n {\n id: 'azure',\n make: azureProvider,\n env: 'AZURE_OPENAI_API_KEY',\n description: 'OpenAI models deployed in your own Azure OpenAI or AI Foundry resource.',\n keyUrl: 'https://portal.azure.com',\n cors: true,\n fields: [\n {\n name: 'endpoint',\n label: 'Endpoint',\n required: true,\n placeholder: 'my-resource or https://my-resource.openai.azure.com',\n help: 'Your resource\u2019s name, or its endpoint address from Keys and Endpoint.',\n customBase: true,\n vaultSetting: 'AZURE_OPENAI_RESOURCE_NAME',\n env: azureEndpoint,\n },\n {\n name: 'deployments',\n label: 'Deployments',\n placeholder: 'gpt-5.4=my-gpt',\n help: 'Only for deployments named differently from their model, as model=deployment, separated by commas.',\n env: (value) =>\n DEPLOYMENTS.test(value)\n ? { AZURE_OPENAI_DEPLOYMENT_NAME_MAP: value }\n : 'Write each deployment as model=deployment, separated by commas.',\n },\n ],\n },\n {\n id: 'cloudflare-workers-ai',\n make: cloudflareWorkersAIProvider,\n env: 'CLOUDFLARE_API_KEY',\n description: 'Open models on Cloudflare Workers AI, in your Cloudflare account.',\n keyUrl: 'https://dash.cloudflare.com/profile/api-tokens',\n cors: false,\n fields: [ACCOUNT_FIELD],\n },\n {\n id: 'cloudflare-ai-gateway',\n make: cloudflareAIGatewayProvider,\n env: 'CLOUDFLARE_API_KEY',\n description: 'Models from many labs through your Cloudflare AI Gateway.',\n keyUrl: 'https://dash.cloudflare.com/profile/api-tokens',\n cors: false,\n fields: [\n ACCOUNT_FIELD,\n {\n name: 'gateway',\n label: 'Gateway ID',\n required: true,\n placeholder: 'my-gateway',\n help: 'The name of your gateway under AI \u203A AI Gateway.',\n vaultSetting: 'CLOUDFLARE_GATEWAY_ID',\n env: checked(\n GATEWAY,\n 'CLOUDFLARE_GATEWAY_ID',\n 'A gateway ID is letters, digits, - and _, up to 64 characters.'\n ),\n },\n ],\n },\n {\n id: 'anthropic',\n make: anthropicProvider,\n env: 'ANTHROPIC_API_KEY',\n description: 'Claude models, with an API key from the Claude Console.',\n keyUrl: 'https://console.anthropic.com/settings/keys',\n cors: true,\n },\n {\n id: 'openai',\n make: openaiProvider,\n env: 'OPENAI_API_KEY',\n description: 'GPT models, with an API key from the OpenAI platform.',\n keyUrl: 'https://platform.openai.com/api-keys',\n cors: true,\n },\n {\n id: 'mistral',\n make: mistralProvider,\n env: 'MISTRAL_API_KEY',\n description: 'Mistral and Devstral models from La Plateforme.',\n keyUrl: 'https://console.mistral.ai/api-keys',\n cors: true,\n },\n {\n id: 'groq',\n make: groqProvider,\n env: 'GROQ_API_KEY',\n description: 'Open models on Groq\u2019s fast inference.',\n keyUrl: 'https://console.groq.com/keys',\n cors: true,\n },\n {\n id: 'deepseek',\n make: deepseekProvider,\n env: 'DEEPSEEK_API_KEY',\n description: 'DeepSeek\u2019s own models.',\n keyUrl: 'https://platform.deepseek.com/api_keys',\n cors: true,\n },\n {\n id: 'together',\n make: togetherProvider,\n env: 'TOGETHER_API_KEY',\n description: 'Open models hosted by Together AI.',\n keyUrl: 'https://api.together.ai/settings/api-keys',\n cors: true,\n },\n {\n id: 'huggingface',\n make: huggingfaceProvider,\n env: 'HF_TOKEN',\n description: 'Open models through Hugging Face\u2019s inference router.',\n keyUrl: 'https://huggingface.co/settings/tokens',\n cors: true,\n },\n {\n id: 'xiaomi',\n make: xiaomiProvider,\n env: 'XIAOMI_API_KEY',\n description: 'Xiaomi\u2019s MiMo models.',\n keyUrl: 'https://platform.xiaomimimo.com/#/console/api-keys',\n cors: true,\n },\n {\n id: 'xiaomi-token-plan-ams',\n make: xiaomiTokenPlanAmsProvider,\n env: 'XIAOMI_TOKEN_PLAN_AMS_API_KEY',\n description: 'MiMo models on a Xiaomi token plan, served from Amsterdam.',\n keyUrl: 'https://platform.xiaomimimo.com/#/console/api-keys',\n cors: true,\n },\n {\n id: 'xiaomi-token-plan-cn',\n make: xiaomiTokenPlanCnProvider,\n env: 'XIAOMI_TOKEN_PLAN_CN_API_KEY',\n description: 'MiMo models on a Xiaomi token plan, served from China.',\n keyUrl: 'https://platform.xiaomimimo.com/#/console/api-keys',\n cors: true,\n },\n {\n id: 'xiaomi-token-plan-sgp',\n make: xiaomiTokenPlanSgpProvider,\n env: 'XIAOMI_TOKEN_PLAN_SGP_API_KEY',\n description: 'MiMo models on a Xiaomi token plan, served from Singapore.',\n keyUrl: 'https://platform.xiaomimimo.com/#/console/api-keys',\n cors: true,\n },\n {\n id: 'cerebras',\n make: cerebrasProvider,\n env: 'CEREBRAS_API_KEY',\n description: 'Open models on Cerebras inference.',\n keyUrl: 'https://cloud.cerebras.ai',\n cors: false,\n },\n {\n id: 'openrouter',\n make: openrouterProvider,\n env: 'OPENROUTER_API_KEY',\n description: 'Hundreds of models from many labs through one key.',\n keyUrl: 'https://openrouter.ai/settings/keys',\n cors: false,\n },\n {\n id: 'fireworks',\n make: fireworksProvider,\n env: 'FIREWORKS_API_KEY',\n description: 'Open models hosted by Fireworks AI.',\n keyUrl: 'https://app.fireworks.ai/settings/users/api-keys',\n cors: false,\n },\n {\n id: 'baseten',\n make: basetenProvider,\n env: 'BASETEN_API_KEY',\n description: 'Open models hosted by Baseten.',\n keyUrl: 'https://app.baseten.co/settings/api_keys',\n cors: true,\n },\n {\n id: 'moonshotai',\n make: moonshotaiProvider,\n env: 'MOONSHOT_API_KEY',\n description: 'Kimi models from Moonshot AI.',\n keyUrl: 'https://platform.moonshot.ai/console/api-keys',\n cors: true,\n },\n {\n id: 'moonshotai-cn',\n make: moonshotaiCnProvider,\n env: 'MOONSHOT_API_KEY',\n description: 'Kimi models from Moonshot AI\u2019s China platform.',\n keyUrl: 'https://platform.moonshot.cn/console/api-keys',\n cors: true,\n },\n {\n id: 'xai',\n make: xaiProvider,\n env: 'XAI_API_KEY',\n description: 'Grok models from xAI.',\n keyUrl: 'https://console.x.ai',\n cors: true,\n signIn: true,\n },\n {\n id: 'meta',\n make: metaProvider,\n env: 'META_API_KEY',\n description: 'Meta\u2019s Muse models.',\n keyUrl: 'https://developer.meta.ai',\n cors: true,\n },\n {\n id: 'vercel-ai-gateway',\n make: vercelAIGatewayProvider,\n env: 'AI_GATEWAY_API_KEY',\n description: 'Models from many labs through Vercel\u2019s AI Gateway.',\n keyUrl: 'https://vercel.com/docs/ai-gateway/authentication',\n cors: false,\n },\n {\n id: 'minimax',\n make: minimaxProvider,\n env: 'MINIMAX_API_KEY',\n description: 'MiniMax\u2019s models.',\n keyUrl: 'https://platform.minimax.io/user-center/basic-information/interface-key',\n cors: false,\n },\n {\n id: 'minimax-cn',\n make: minimaxCnProvider,\n env: 'MINIMAX_CN_API_KEY',\n description: 'MiniMax\u2019s models from its China platform.',\n keyUrl: 'https://platform.minimaxi.com/user-center/basic-information/interface-key',\n cors: false,\n },\n {\n id: 'zai',\n make: zaiProvider,\n env: 'ZAI_API_KEY',\n description: 'GLM models on Z.AI\u2019s coding plan.',\n keyUrl: 'https://z.ai/manage-apikey/apikey-list',\n cors: false,\n },\n {\n id: 'zai-coding-cn',\n make: zaiCodingCnProvider,\n env: 'ZAI_CODING_CN_API_KEY',\n description: 'GLM models on Zhipu\u2019s coding plan in China.',\n keyUrl: 'https://open.bigmodel.cn/usercenter/apikeys',\n cors: false,\n },\n {\n id: 'nvidia',\n make: nvidiaProvider,\n env: 'NVIDIA_API_KEY',\n description: 'Open models on NVIDIA\u2019s API catalog.',\n keyUrl: 'https://build.nvidia.com/settings/api-keys',\n cors: false,\n },\n {\n id: 'kimi-coding',\n make: kimiCodingProvider,\n env: 'KIMI_API_KEY',\n description: 'Kimi models on the Kimi Code subscription.',\n keyUrl: 'https://www.kimi.com/code/console',\n cors: false,\n signIn: true,\n },\n {\n id: 'ant-ling',\n make: antLingProvider,\n env: 'ANT_LING_API_KEY',\n description: 'Ling and Ring models from Ant Group.',\n keyUrl: 'https://www.ant-ling.com',\n cors: false,\n },\n {\n id: 'opencode',\n make: opencodeProvider,\n env: 'OPENCODE_API_KEY',\n description:\n 'Models curated for coding agents by OpenCode Zen. Needs seven\u2019s vault 1.12.2 or later.',\n keyUrl: 'https://opencode.ai/auth',\n cors: false,\n },\n {\n id: 'opencode-go',\n make: opencodeGoProvider,\n env: 'OPENCODE_API_KEY',\n description:\n 'Open models on the OpenCode Go subscription. Needs seven\u2019s vault 1.12.2 or later.',\n keyUrl: 'https://opencode.ai/auth',\n cors: false,\n },\n {\n id: 'qwen-token-plan',\n make: qwenTokenPlanProvider,\n env: 'QWEN_TOKEN_PLAN_API_KEY',\n description: 'Qwen models on an Alibaba Cloud token plan.',\n keyUrl: 'https://modelstudio.console.alibabacloud.com',\n cors: false,\n },\n {\n id: 'qwen-token-plan-cn',\n make: qwenTokenPlanCnProvider,\n env: 'QWEN_TOKEN_PLAN_CN_API_KEY',\n description: 'Qwen models on an Alibaba Cloud token plan in China.',\n keyUrl: 'https://bailian.console.aliyun.com',\n cors: false,\n },\n {\n id: 'qwen-token-plan-individual',\n make: qwenTokenPlanIndividualProvider,\n env: 'QWEN_TOKEN_PLAN_API_KEY',\n description: 'Qwen models on an individual Alibaba Cloud token plan.',\n keyUrl: 'https://modelstudio.console.alibabacloud.com',\n cors: false,\n },\n];\n\nexport type ProviderAuth = 'api-key' | 'oauth' | 'fields' | 'local';\n\nexport interface Listing {\n description: string;\n keyUrl?: string;\n auth: ProviderAuth;\n corsFree: boolean;\n vaultName: string;\n fields?: readonly FieldSpec[];\n}\n\nconst upper = (text: string) => text.toUpperCase().replace(/[^A-Z0-9]/g, '_');\n\nfunction vaultNames(entries: readonly KeyProvider[]): Map<string, string> {\n const uses = Map.groupBy(entries, (entry) => entry.env);\n return new Map(\n entries.map((entry) => [\n entry.id,\n (uses.get(entry.env) as KeyProvider[]).length > 1 ? `${upper(entry.id)}_API_KEY` : entry.env,\n ])\n );\n}\n\nconst named = vaultNames(KEY_PROVIDERS);\n\nexport const LISTINGS: ReadonlyMap<string, Listing> = new Map<string, Listing>([\n [\n 'amazon-bedrock',\n {\n description: 'Claude and other models on AWS, with a Bedrock API key.',\n keyUrl: 'https://console.aws.amazon.com/bedrock/home#/api-keys',\n auth: 'fields',\n corsFree: false,\n vaultName: 'AWS_BEARER_TOKEN_BEDROCK',\n fields: [REGION_FIELD],\n },\n ],\n [\n 'adobe',\n {\n description: 'Models through Adobe\u2019s LLM proxy, with your Adobe ID.',\n auth: 'oauth',\n corsFree: false,\n vaultName: 'ADOBE_IMS_TOKEN',\n },\n ],\n ...KEY_PROVIDERS.map((entry): [string, Listing] => [\n entry.id,\n {\n description: entry.description,\n keyUrl: entry.keyUrl,\n auth: entry.signIn ? 'oauth' : entry.fields ? 'fields' : 'api-key',\n corsFree: !entry.cors,\n vaultName: named.get(entry.id) as string,\n ...(entry.fields ? { fields: entry.fields } : {}),\n },\n ]),\n [\n CODEX,\n {\n description: 'GPT models on your ChatGPT Plus or Pro plan, with your ChatGPT account.',\n auth: 'oauth',\n corsFree: true,\n vaultName: 'OPENAI_CODEX_TOKEN',\n },\n ],\n]);\n\nexport const ADDED_FIRST: readonly string[] = ['amazon-bedrock', 'adobe'];\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,14 +1,22 @@
1
+ import { CODEX_ACCOUNT } from "../sign-ins.js";
2
+ const RECORD_ENV = [CODEX_ACCOUNT];
1
3
  const KEYS_IN_VAULT = "model keys are kept in seven's vault: enter them in Settings \u203A Accounts";
2
4
  function vaultCredentials(records, env = () => void 0, ready = () => true) {
3
5
  return {
4
6
  async read(providerId) {
5
7
  const record = records.model(providerId);
6
8
  if (!record || !ready(providerId)) return void 0;
7
- const extra = env(providerId);
9
+ const carried = Object.fromEntries(
10
+ RECORD_ENV.flatMap((name) => {
11
+ const value = record.settings?.[name];
12
+ return value ? [[name, value]] : [];
13
+ })
14
+ );
15
+ const extra = { ...carried, ...env(providerId) };
8
16
  return {
9
17
  type: "api_key",
10
18
  key: record.placeholder,
11
- ...extra && Object.keys(extra).length ? { env: { ...extra } } : {}
19
+ ...Object.keys(extra).length ? { env: extra } : {}
12
20
  };
13
21
  },
14
22
  async list() {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/secrets/credentials.ts"],
4
- "sourcesContent": ["import type { Credential, CredentialInfo, CredentialStore } from '@earendil-works/pi-ai';\nimport type { VaultRecords } from './records.ts';\n\nexport const KEYS_IN_VAULT =\n \"model keys are kept in seven's vault: enter them in Settings \u203A Accounts\";\n\nexport type FieldsOf = (providerId: string) => Readonly<Record<string, string>> | undefined;\n\nexport function vaultCredentials(\n records: Pick<VaultRecords, 'model' | 'state'>,\n env: FieldsOf = () => undefined,\n ready: (providerId: string) => boolean = () => true\n): CredentialStore {\n return {\n async read(providerId) {\n const record = records.model(providerId);\n if (!record || !ready(providerId)) return undefined;\n const extra = env(providerId);\n return {\n type: 'api_key',\n key: record.placeholder,\n ...(extra && Object.keys(extra).length ? { env: { ...extra } } : {}),\n } satisfies Credential;\n },\n async list() {\n const providers = records.state.value\n .filter((record) => record.kind === 'model' && record.provider !== undefined)\n .map((record) => record.provider as string)\n .filter(ready);\n return [...new Set(providers)].map(\n (providerId): CredentialInfo => ({ providerId, type: 'api_key' })\n );\n },\n async modify() {\n throw new Error(KEYS_IN_VAULT);\n },\n async delete() {\n throw new Error(KEYS_IN_VAULT);\n },\n };\n}\n"],
5
- "mappings": "AAGO,MAAM,gBACX;AAIK,SAAS,iBACd,SACA,MAAgB,MAAM,QACtB,QAAyC,MAAM,MAC9B;AACjB,SAAO;AAAA,IACL,MAAM,KAAK,YAAY;AACrB,YAAM,SAAS,QAAQ,MAAM,UAAU;AACvC,UAAI,CAAC,UAAU,CAAC,MAAM,UAAU,EAAG,QAAO;AAC1C,YAAM,QAAQ,IAAI,UAAU;AAC5B,aAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK,OAAO;AAAA,QACZ,GAAI,SAAS,OAAO,KAAK,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,MAAM,EAAE,IAAI,CAAC;AAAA,MACpE;AAAA,IACF;AAAA,IACA,MAAM,OAAO;AACX,YAAM,YAAY,QAAQ,MAAM,MAC7B,OAAO,CAAC,WAAW,OAAO,SAAS,WAAW,OAAO,aAAa,MAAS,EAC3E,IAAI,CAAC,WAAW,OAAO,QAAkB,EACzC,OAAO,KAAK;AACf,aAAO,CAAC,GAAG,IAAI,IAAI,SAAS,CAAC,EAAE;AAAA,QAC7B,CAAC,gBAAgC,EAAE,YAAY,MAAM,UAAU;AAAA,MACjE;AAAA,IACF;AAAA,IACA,MAAM,SAAS;AACb,YAAM,IAAI,MAAM,aAAa;AAAA,IAC/B;AAAA,IACA,MAAM,SAAS;AACb,YAAM,IAAI,MAAM,aAAa;AAAA,IAC/B;AAAA,EACF;AACF;",
4
+ "sourcesContent": ["import type { Credential, CredentialInfo, CredentialStore } from '@earendil-works/pi-ai';\nimport { CODEX_ACCOUNT } from '../sign-ins.ts';\nimport type { VaultRecords } from './records.ts';\n\nconst RECORD_ENV: readonly string[] = [CODEX_ACCOUNT];\n\nexport const KEYS_IN_VAULT =\n \"model keys are kept in seven's vault: enter them in Settings \u203A Accounts\";\n\nexport type FieldsOf = (providerId: string) => Readonly<Record<string, string>> | undefined;\n\nexport function vaultCredentials(\n records: Pick<VaultRecords, 'model' | 'state'>,\n env: FieldsOf = () => undefined,\n ready: (providerId: string) => boolean = () => true\n): CredentialStore {\n return {\n async read(providerId) {\n const record = records.model(providerId);\n if (!record || !ready(providerId)) return undefined;\n const carried = Object.fromEntries(\n RECORD_ENV.flatMap((name) => {\n const value = record.settings?.[name];\n return value ? [[name, value]] : [];\n })\n );\n const extra = { ...carried, ...env(providerId) };\n return {\n type: 'api_key',\n key: record.placeholder,\n ...(Object.keys(extra).length ? { env: extra } : {}),\n } satisfies Credential;\n },\n async list() {\n const providers = records.state.value\n .filter((record) => record.kind === 'model' && record.provider !== undefined)\n .map((record) => record.provider as string)\n .filter(ready);\n return [...new Set(providers)].map(\n (providerId): CredentialInfo => ({ providerId, type: 'api_key' })\n );\n },\n async modify() {\n throw new Error(KEYS_IN_VAULT);\n },\n async delete() {\n throw new Error(KEYS_IN_VAULT);\n },\n };\n}\n"],
5
+ "mappings": "AACA,SAAS,qBAAqB;AAG9B,MAAM,aAAgC,CAAC,aAAa;AAE7C,MAAM,gBACX;AAIK,SAAS,iBACd,SACA,MAAgB,MAAM,QACtB,QAAyC,MAAM,MAC9B;AACjB,SAAO;AAAA,IACL,MAAM,KAAK,YAAY;AACrB,YAAM,SAAS,QAAQ,MAAM,UAAU;AACvC,UAAI,CAAC,UAAU,CAAC,MAAM,UAAU,EAAG,QAAO;AAC1C,YAAM,UAAU,OAAO;AAAA,QACrB,WAAW,QAAQ,CAAC,SAAS;AAC3B,gBAAM,QAAQ,OAAO,WAAW,IAAI;AACpC,iBAAO,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC;AAAA,QACpC,CAAC;AAAA,MACH;AACA,YAAM,QAAQ,EAAE,GAAG,SAAS,GAAG,IAAI,UAAU,EAAE;AAC/C,aAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK,OAAO;AAAA,QACZ,GAAI,OAAO,KAAK,KAAK,EAAE,SAAS,EAAE,KAAK,MAAM,IAAI,CAAC;AAAA,MACpD;AAAA,IACF;AAAA,IACA,MAAM,OAAO;AACX,YAAM,YAAY,QAAQ,MAAM,MAC7B,OAAO,CAAC,WAAW,OAAO,SAAS,WAAW,OAAO,aAAa,MAAS,EAC3E,IAAI,CAAC,WAAW,OAAO,QAAkB,EACzC,OAAO,KAAK;AACf,aAAO,CAAC,GAAG,IAAI,IAAI,SAAS,CAAC,EAAE;AAAA,QAC7B,CAAC,gBAAgC,EAAE,YAAY,MAAM,UAAU;AAAA,MACjE;AAAA,IACF;AAAA,IACA,MAAM,SAAS;AACb,YAAM,IAAI,MAAM,aAAa;AAAA,IAC/B;AAAA,IACA,MAAM,SAAS;AACb,YAAM,IAAI,MAAM,aAAa;AAAA,IAC/B;AAAA,EACF;AACF;",
6
6
  "names": []
7
7
  }
@@ -85,6 +85,10 @@ class Vault {
85
85
  const { response: shown, records, expiresAt } = await this.#call("grant", fields);
86
86
  return { response: shown, records, ...expiresAt === void 0 ? {} : { expiresAt } };
87
87
  }
88
+ async grantProvider(grant) {
89
+ const { records, expiresAt } = await this.#call("grant", { ...grant });
90
+ return { records, ...expiresAt === void 0 ? {} : { expiresAt } };
91
+ }
88
92
  async refresh(target, name) {
89
93
  const fields = { ...target, ...name === void 0 ? {} : { name } };
90
94
  return (await this.#call("refresh", fields)).state;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/secrets/vault.ts"],
4
- "sourcesContent": ["import type { Hit } from '@ai-ecoverse/slicc-scrub';\nimport type {\n AgentRecord,\n ErrorCode,\n McpServerEntry,\n OAuthConfig,\n OutgoingRequest,\n} from '@ai-ecoverse/slicc-vault';\nimport { type MutableReplicatedState, replicatedState } from '@earendil-works/chord';\nimport { BACKGROUND_CONTEXT } from '@earendil-works/chord/context';\nimport type { Scrub, Scrubbable, ScrubStream } from './scrub.ts';\nimport { vaultHold } from './view.ts';\n\nexport type ScrubPair = { needed: boolean; version: number };\nexport type Locked = 'no' | 'scrubbing' | 'passkey';\n\nexport interface VaultState {\n port: 'none' | 'ready' | 'waiting';\n needed: boolean;\n version: number;\n locked: Locked;\n held: number;\n}\n\nexport const WAITING_MS = 2000;\nexport const WAITING = 'waiting for the vault';\n\ntype Message = Record<string, unknown> & { v: 1; id: number; op: string };\n\nexport class VaultRefusal extends Error {\n readonly code: ErrorCode | undefined;\n\n constructor(code: ErrorCode | undefined, message: string) {\n super(message);\n this.name = 'VaultRefusal';\n this.code = code;\n }\n}\n\nexport type RefreshTarget = { server: string } | { provider: string };\n\nexport interface Granted {\n response: string | Uint8Array;\n records: { kind: string; name: string; placeholder: string }[];\n expiresAt?: number;\n}\n\nexport interface EndpointSet {\n mcp: McpServerEntry[];\n}\n\ninterface Pending {\n message: Message;\n at: number;\n resolve(value: unknown): void;\n reject(error: Error): void;\n}\n\ntype Answer = Record<string, unknown> & {\n id?: unknown;\n error?: { code?: ErrorCode; message?: string };\n scrub?: unknown;\n locked?: unknown;\n version?: unknown;\n};\n\nconst LOCKS: readonly unknown[] = ['no', 'scrubbing', 'passkey'];\n\nconst EMPTY = new Uint8Array();\n\nfunction pairOf(value: unknown): ScrubPair | undefined {\n const pair = value as Partial<ScrubPair> | null;\n if (pair === null) return { needed: false, version: 0 };\n if (typeof pair?.needed !== 'boolean' || typeof pair.version !== 'number') return undefined;\n return { needed: pair.needed, version: pair.version };\n}\n\nexport class Vault implements Scrub {\n readonly state: MutableReplicatedState<VaultState>;\n readonly #pending = new Map<number, Pending>();\n readonly #streams = new Set<string>();\n readonly #waiters = new Set<() => void>();\n readonly #now: () => number;\n #port: MessagePort | undefined;\n #pair: ScrubPair = { needed: false, version: 0 };\n #locked: Locked = 'no';\n #seen = 0;\n #serial = 0;\n #streamSerial = 0;\n readonly #tag = Math.random().toString(36).slice(2, 10);\n\n constructor(now: () => number = Date.now) {\n this.#now = now;\n this.state = replicatedState<VaultState>(this.#snapshot());\n }\n\n get needed(): boolean {\n return this.#pair.needed || this.#seen > this.#pair.version;\n }\n\n get connected(): boolean {\n return this.#port !== undefined;\n }\n\n connect(port: MessagePort | undefined, scrub: unknown, locked?: unknown): void {\n const pair = scrub === undefined ? undefined : pairOf(scrub);\n if (pair) this.#pair = pair;\n if (typeof locked === 'boolean') this.#locked = locked ? 'passkey' : 'no';\n if (port && port !== this.#port) {\n if (this.#port) this.#port.onmessage = null;\n this.#port = port;\n port.onmessage = (event) => this.#answer(event.data as Answer);\n port.start?.();\n const resend = [...this.#pending.values()];\n const opening = new Set(\n resend\n .filter((item) => item.message.op === 'redactStream')\n .map((item) => item.message.stream)\n );\n for (const stream of this.#streams)\n if (!opening.has(stream)) void this.#call('redactStream', { stream });\n for (const item of resend) port.postMessage(item.message);\n }\n this.#refresh();\n }\n\n ready(): Promise<void> {\n if (!this.#holding()) return Promise.resolve();\n return new Promise((resolve) => this.#waiters.add(resolve));\n }\n\n async texts<T extends Scrubbable>(texts: readonly T[]): Promise<T[]> {\n if (!this.needed) return [...texts];\n const answer = (await this.#call('redact', { texts: [...texts] })) as {\n texts: T[];\n hits: Hit[];\n version: number;\n };\n return answer.texts;\n }\n\n async model(provider: string | undefined, request: OutgoingRequest): Promise<OutgoingRequest> {\n const fields = provider === undefined ? { request } : { provider, request };\n return ((await this.#call('model', fields)) as { request: OutgoingRequest }).request;\n }\n\n async mcp(server: string, request: OutgoingRequest): Promise<OutgoingRequest> {\n return ((await this.#call('mcp', { server, request })) as { request: OutgoingRequest }).request;\n }\n\n async records(): Promise<AgentRecord[]> {\n return ((await this.#call('records', {})) as { records: AgentRecord[] }).records;\n }\n\n async grant(\n server: string,\n response: string | Uint8Array,\n oauth: OAuthConfig,\n name?: string\n ): Promise<Granted> {\n const fields = { server, response, oauth, ...(name === undefined ? {} : { name }) };\n const { response: shown, records, expiresAt } = (await this.#call('grant', fields)) as Granted;\n return { response: shown, records, ...(expiresAt === undefined ? {} : { expiresAt }) };\n }\n\n async refresh(target: RefreshTarget, name?: string): Promise<string> {\n const fields = { ...target, ...(name === undefined ? {} : { name }) };\n return ((await this.#call('refresh', fields)) as { state: string }).state;\n }\n\n async endpoints(set: EndpointSet): Promise<void> {\n await this.#call('endpoints', { mcp: set.mcp });\n }\n\n stream(): ScrubStream {\n let stream: string | undefined;\n return {\n push: (chunk) => {\n if (stream === undefined && !this.needed) return Promise.resolve(chunk);\n if (stream === undefined) {\n stream = `${this.#tag}-${++this.#streamSerial}`;\n this.#streams.add(stream);\n void this.#call('redactStream', { stream });\n }\n return this.#call('push', { stream, chunk }).then(\n (answer) => (answer as { chunk: Uint8Array }).chunk\n );\n },\n end: async () => {\n if (stream === undefined) return EMPTY;\n const { chunk: tail } = (await this.#call('end', { stream })) as { chunk: Uint8Array };\n this.#streams.delete(stream);\n return tail;\n },\n drop: () => {\n if (stream === undefined) return;\n const dropped = stream;\n this.#streams.delete(dropped);\n for (const [id, item] of this.#pending)\n if (item.message.stream === dropped && item.message.op !== 'redactStream') {\n this.#pending.delete(id);\n item.resolve({ chunk: EMPTY });\n }\n void this.#call('drop', { stream: dropped });\n },\n };\n }\n\n #call(op: string, fields: Record<string, unknown>): Promise<unknown> {\n const message: Message = { v: 1, id: ++this.#serial, op, ...fields };\n const result = new Promise((resolve, reject) => {\n this.#pending.set(message.id, { message, at: this.#now(), resolve, reject });\n });\n this.#port?.postMessage(message);\n setTimeout(() => this.#refresh(), WAITING_MS);\n this.#refresh();\n return result;\n }\n\n #answer(data: Answer): void {\n if (!data || typeof data !== 'object') return;\n const pair = 'scrub' in data ? pairOf(data.scrub) : undefined;\n if (pair) this.#pair = pair;\n if (LOCKS.includes(data.locked)) this.#locked = data.locked as Locked;\n if (data.op === 'welcome') this.#welcome(data.status);\n const item = typeof data.id === 'number' ? this.#pending.get(data.id) : undefined;\n if (item) {\n this.#pending.delete(data.id as number);\n if (typeof data.version === 'number') this.#seen = Math.max(this.#seen, data.version);\n if (data.error)\n item.reject(new VaultRefusal(data.error.code, data.error.message ?? 'the vault refused'));\n else item.resolve(data);\n }\n this.#refresh();\n }\n\n #welcome(status: unknown): void {\n const given = status as { scrub?: unknown; locked?: unknown } | null;\n const pair = given && 'scrub' in given ? pairOf(given.scrub) : undefined;\n if (pair) this.#pair = pair;\n if (typeof given?.locked === 'boolean') this.#locked = given.locked ? 'passkey' : 'no';\n }\n\n #waiting(): boolean {\n const now = this.#now();\n return [...this.#pending.values()].some((item) => now - item.at >= WAITING_MS);\n }\n\n #holding(): boolean {\n return this.needed && (!this.#port || this.#waiting() || this.#locked === 'passkey');\n }\n\n #snapshot(): VaultState {\n return {\n port: !this.#port ? 'none' : this.#waiting() ? 'waiting' : 'ready',\n needed: this.needed,\n version: this.#pair.version,\n locked: this.#locked,\n held: this.#pending.size,\n };\n }\n\n #refresh(): void {\n const next = this.#snapshot();\n const before = this.state.value;\n if (Object.entries(next).some(([key, value]) => before[key as keyof VaultState] !== value))\n this.state.replace(BACKGROUND_CONTEXT, next);\n if (this.#holding()) return;\n for (const resolve of this.#waiters) resolve();\n this.#waiters.clear();\n }\n}\n\nexport function holdText(state: VaultState): string | undefined {\n const hold = vaultHold(state);\n if (!hold) return undefined;\n return hold.reason === 'locked' ? 'unlock the vault to continue' : WAITING;\n}\n\nexport function listenVault(\n scope: { addEventListener(type: 'message', listener: (event: MessageEvent) => void): void },\n vault: Vault\n): void {\n scope.addEventListener('message', ({ data }) => {\n const message = data as { vault?: MessagePort; scrub?: unknown; locked?: unknown } | null;\n if (!message || typeof message !== 'object') return;\n if (!('vault' in message || 'scrub' in message || 'locked' in message)) return;\n vault.connect(message.vault, message.scrub, message.locked);\n });\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { Hit } from '@ai-ecoverse/slicc-scrub';\nimport type {\n AgentRecord,\n ErrorCode,\n McpServerEntry,\n OAuthConfig,\n OutgoingRequest,\n} from '@ai-ecoverse/slicc-vault';\nimport { type MutableReplicatedState, replicatedState } from '@earendil-works/chord';\nimport { BACKGROUND_CONTEXT } from '@earendil-works/chord/context';\nimport type { Scrub, Scrubbable, ScrubStream } from './scrub.ts';\nimport { vaultHold } from './view.ts';\n\nexport type ScrubPair = { needed: boolean; version: number };\nexport type Locked = 'no' | 'scrubbing' | 'passkey';\n\nexport interface VaultState {\n port: 'none' | 'ready' | 'waiting';\n needed: boolean;\n version: number;\n locked: Locked;\n held: number;\n}\n\nexport const WAITING_MS = 2000;\nexport const WAITING = 'waiting for the vault';\n\ntype Message = Record<string, unknown> & { v: 1; id: number; op: string };\n\nexport class VaultRefusal extends Error {\n readonly code: ErrorCode | undefined;\n\n constructor(code: ErrorCode | undefined, message: string) {\n super(message);\n this.name = 'VaultRefusal';\n this.code = code;\n }\n}\n\nexport type RefreshTarget = { server: string } | { provider: string };\n\nexport interface Granted {\n response: string | Uint8Array;\n records: { kind: string; name: string; placeholder: string }[];\n expiresAt?: number;\n}\n\nexport interface EndpointSet {\n mcp: McpServerEntry[];\n}\n\ninterface Pending {\n message: Message;\n at: number;\n resolve(value: unknown): void;\n reject(error: Error): void;\n}\n\ntype Answer = Record<string, unknown> & {\n id?: unknown;\n error?: { code?: ErrorCode; message?: string };\n scrub?: unknown;\n locked?: unknown;\n version?: unknown;\n};\n\nconst LOCKS: readonly unknown[] = ['no', 'scrubbing', 'passkey'];\n\nconst EMPTY = new Uint8Array();\n\nfunction pairOf(value: unknown): ScrubPair | undefined {\n const pair = value as Partial<ScrubPair> | null;\n if (pair === null) return { needed: false, version: 0 };\n if (typeof pair?.needed !== 'boolean' || typeof pair.version !== 'number') return undefined;\n return { needed: pair.needed, version: pair.version };\n}\n\nexport class Vault implements Scrub {\n readonly state: MutableReplicatedState<VaultState>;\n readonly #pending = new Map<number, Pending>();\n readonly #streams = new Set<string>();\n readonly #waiters = new Set<() => void>();\n readonly #now: () => number;\n #port: MessagePort | undefined;\n #pair: ScrubPair = { needed: false, version: 0 };\n #locked: Locked = 'no';\n #seen = 0;\n #serial = 0;\n #streamSerial = 0;\n readonly #tag = Math.random().toString(36).slice(2, 10);\n\n constructor(now: () => number = Date.now) {\n this.#now = now;\n this.state = replicatedState<VaultState>(this.#snapshot());\n }\n\n get needed(): boolean {\n return this.#pair.needed || this.#seen > this.#pair.version;\n }\n\n get connected(): boolean {\n return this.#port !== undefined;\n }\n\n connect(port: MessagePort | undefined, scrub: unknown, locked?: unknown): void {\n const pair = scrub === undefined ? undefined : pairOf(scrub);\n if (pair) this.#pair = pair;\n if (typeof locked === 'boolean') this.#locked = locked ? 'passkey' : 'no';\n if (port && port !== this.#port) {\n if (this.#port) this.#port.onmessage = null;\n this.#port = port;\n port.onmessage = (event) => this.#answer(event.data as Answer);\n port.start?.();\n const resend = [...this.#pending.values()];\n const opening = new Set(\n resend\n .filter((item) => item.message.op === 'redactStream')\n .map((item) => item.message.stream)\n );\n for (const stream of this.#streams)\n if (!opening.has(stream)) void this.#call('redactStream', { stream });\n for (const item of resend) port.postMessage(item.message);\n }\n this.#refresh();\n }\n\n ready(): Promise<void> {\n if (!this.#holding()) return Promise.resolve();\n return new Promise((resolve) => this.#waiters.add(resolve));\n }\n\n async texts<T extends Scrubbable>(texts: readonly T[]): Promise<T[]> {\n if (!this.needed) return [...texts];\n const answer = (await this.#call('redact', { texts: [...texts] })) as {\n texts: T[];\n hits: Hit[];\n version: number;\n };\n return answer.texts;\n }\n\n async model(provider: string | undefined, request: OutgoingRequest): Promise<OutgoingRequest> {\n const fields = provider === undefined ? { request } : { provider, request };\n return ((await this.#call('model', fields)) as { request: OutgoingRequest }).request;\n }\n\n async mcp(server: string, request: OutgoingRequest): Promise<OutgoingRequest> {\n return ((await this.#call('mcp', { server, request })) as { request: OutgoingRequest }).request;\n }\n\n async records(): Promise<AgentRecord[]> {\n return ((await this.#call('records', {})) as { records: AgentRecord[] }).records;\n }\n\n async grant(\n server: string,\n response: string | Uint8Array,\n oauth: OAuthConfig,\n name?: string\n ): Promise<Granted> {\n const fields = { server, response, oauth, ...(name === undefined ? {} : { name }) };\n const { response: shown, records, expiresAt } = (await this.#call('grant', fields)) as Granted;\n return { response: shown, records, ...(expiresAt === undefined ? {} : { expiresAt }) };\n }\n\n async grantProvider(grant: {\n provider: string;\n name: string;\n response: Uint8Array;\n settings?: Record<string, string>;\n }): Promise<Omit<Granted, 'response'>> {\n const { records, expiresAt } = (await this.#call('grant', { ...grant })) as Granted;\n return { records, ...(expiresAt === undefined ? {} : { expiresAt }) };\n }\n\n async refresh(target: RefreshTarget, name?: string): Promise<string> {\n const fields = { ...target, ...(name === undefined ? {} : { name }) };\n return ((await this.#call('refresh', fields)) as { state: string }).state;\n }\n\n async endpoints(set: EndpointSet): Promise<void> {\n await this.#call('endpoints', { mcp: set.mcp });\n }\n\n stream(): ScrubStream {\n let stream: string | undefined;\n return {\n push: (chunk) => {\n if (stream === undefined && !this.needed) return Promise.resolve(chunk);\n if (stream === undefined) {\n stream = `${this.#tag}-${++this.#streamSerial}`;\n this.#streams.add(stream);\n void this.#call('redactStream', { stream });\n }\n return this.#call('push', { stream, chunk }).then(\n (answer) => (answer as { chunk: Uint8Array }).chunk\n );\n },\n end: async () => {\n if (stream === undefined) return EMPTY;\n const { chunk: tail } = (await this.#call('end', { stream })) as { chunk: Uint8Array };\n this.#streams.delete(stream);\n return tail;\n },\n drop: () => {\n if (stream === undefined) return;\n const dropped = stream;\n this.#streams.delete(dropped);\n for (const [id, item] of this.#pending)\n if (item.message.stream === dropped && item.message.op !== 'redactStream') {\n this.#pending.delete(id);\n item.resolve({ chunk: EMPTY });\n }\n void this.#call('drop', { stream: dropped });\n },\n };\n }\n\n #call(op: string, fields: Record<string, unknown>): Promise<unknown> {\n const message: Message = { v: 1, id: ++this.#serial, op, ...fields };\n const result = new Promise((resolve, reject) => {\n this.#pending.set(message.id, { message, at: this.#now(), resolve, reject });\n });\n this.#port?.postMessage(message);\n setTimeout(() => this.#refresh(), WAITING_MS);\n this.#refresh();\n return result;\n }\n\n #answer(data: Answer): void {\n if (!data || typeof data !== 'object') return;\n const pair = 'scrub' in data ? pairOf(data.scrub) : undefined;\n if (pair) this.#pair = pair;\n if (LOCKS.includes(data.locked)) this.#locked = data.locked as Locked;\n if (data.op === 'welcome') this.#welcome(data.status);\n const item = typeof data.id === 'number' ? this.#pending.get(data.id) : undefined;\n if (item) {\n this.#pending.delete(data.id as number);\n if (typeof data.version === 'number') this.#seen = Math.max(this.#seen, data.version);\n if (data.error)\n item.reject(new VaultRefusal(data.error.code, data.error.message ?? 'the vault refused'));\n else item.resolve(data);\n }\n this.#refresh();\n }\n\n #welcome(status: unknown): void {\n const given = status as { scrub?: unknown; locked?: unknown } | null;\n const pair = given && 'scrub' in given ? pairOf(given.scrub) : undefined;\n if (pair) this.#pair = pair;\n if (typeof given?.locked === 'boolean') this.#locked = given.locked ? 'passkey' : 'no';\n }\n\n #waiting(): boolean {\n const now = this.#now();\n return [...this.#pending.values()].some((item) => now - item.at >= WAITING_MS);\n }\n\n #holding(): boolean {\n return this.needed && (!this.#port || this.#waiting() || this.#locked === 'passkey');\n }\n\n #snapshot(): VaultState {\n return {\n port: !this.#port ? 'none' : this.#waiting() ? 'waiting' : 'ready',\n needed: this.needed,\n version: this.#pair.version,\n locked: this.#locked,\n held: this.#pending.size,\n };\n }\n\n #refresh(): void {\n const next = this.#snapshot();\n const before = this.state.value;\n if (Object.entries(next).some(([key, value]) => before[key as keyof VaultState] !== value))\n this.state.replace(BACKGROUND_CONTEXT, next);\n if (this.#holding()) return;\n for (const resolve of this.#waiters) resolve();\n this.#waiters.clear();\n }\n}\n\nexport function holdText(state: VaultState): string | undefined {\n const hold = vaultHold(state);\n if (!hold) return undefined;\n return hold.reason === 'locked' ? 'unlock the vault to continue' : WAITING;\n}\n\nexport function listenVault(\n scope: { addEventListener(type: 'message', listener: (event: MessageEvent) => void): void },\n vault: Vault\n): void {\n scope.addEventListener('message', ({ data }) => {\n const message = data as { vault?: MessagePort; scrub?: unknown; locked?: unknown } | null;\n if (!message || typeof message !== 'object') return;\n if (!('vault' in message || 'scrub' in message || 'locked' in message)) return;\n vault.connect(message.vault, message.scrub, message.locked);\n });\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/services.ts"],
4
- "sourcesContent": ["import type { Context, JsonValue, RemoteContract, ReplicatedState } from '@earendil-works/chord';\nimport type { ConversationView } from '@earendil-works/pi-durable';\nimport type { Approval, ApprovalAnswer, ApprovalDecided } from './approvals/index.ts';\nimport type {\n ApprovalPolicy,\n ApprovalPolicyChange,\n ApprovalPolicySet,\n} from './approvals/policy.ts';\nimport type { AgentSudo } from './approvals/sudo.ts';\nimport type { SendAttachment, ShownAttachment } from './attachments.ts';\nimport type { ChangesView } from './changes/git.ts';\nimport type { FrozenCone } from './freezer/index.ts';\nimport type { ImportProgress, ImportResult } from './freezer/v6.ts';\nimport type { GuestOpened, Proposed, ProposeRequest } from './guests/index.ts';\nimport type { GuestDraft, GuestGates, GuestSeat } from './guests/seats.ts';\nimport type { MemoryEntry, MemoryScope, MemoryTag } from './memory/format.ts';\nimport type { AgentRemote } from './remote/host.ts';\nimport type { AgentPages } from './remote/pages.ts';\nimport type { VaultState } from './secrets/vault.ts';\nimport { contract } from './serving.ts';\nimport type { SkillPackage, SkillSource } from './skills/skills.ts';\nimport type { Sprinkle } from './sprinkles/kind.ts';\n\nexport type SendMode = 'steer' | 'followUp' | 'reject';\n\nexport interface SendRequest {\n text: string;\n whenBusy: SendMode;\n requestId: string | null;\n agentId?: string | null;\n attachments?: SendAttachment[];\n}\n\nexport interface OperationError {\n code: string;\n message: string;\n}\n\nexport type SendResponse =\n | { accepted: true; submissionId: string; error: null }\n | { accepted: false; submissionId: null; error: OperationError };\n\nexport type PromptResult =\n | { status: 'done'; text: string; reason: null }\n | { status: 'unanswered'; text: null; reason: string };\n\nexport interface AgentControl {\n send(request: SendRequest, context: Context): Promise<SendResponse>;\n wait(submissionId: string, context: Context): Promise<PromptResult>;\n withdraw(\n submissionId: string,\n context: Context\n ): Promise<{ outcome: 'withdrawn' | 'already_placed' | 'not_found' }>;\n abort(context: Context): Promise<void>;\n compact(instructions: string | null, context: Context): Promise<SendResponse>;\n compactAgent(\n agentId: string,\n instructions: string | null,\n context: Context\n ): Promise<SendResponse>;\n reset(handoff: string | null, context: Context): Promise<void>;\n configure(change: AgentSettingsChange, context: Context): Promise<void>;\n rewind(messageId: string | null, context: Context): Promise<Rewound>;\n rewindAgent(agentId: string, messageId: string | null, context: Context): Promise<Rewound>;\n resolveLick(\n lickId: string,\n state: 'confirmed' | 'dismissed',\n context: Context\n ): Promise<LickResolved>;\n resolveAgentLick(\n agentId: string,\n lickId: string,\n state: 'confirmed' | 'dismissed',\n context: Context\n ): Promise<LickResolved>;\n webhook(\n name: string,\n delivery: WebhookRequest,\n context: Context\n ): Promise<{ delivered: boolean }>;\n stopAgent(agentId: string, context: Context): Promise<void>;\n selectCone(agentId: string, context: Context): Promise<void>;\n createCone(name: string, context: Context): Promise<Created>;\n createScoop(parentId: string, name: string, context: Context): Promise<Created>;\n drop(agentId: string, context: Context): Promise<Created>;\n unqueue(\n agentId: string | null,\n submissionId: string,\n context: Context\n ): Promise<{ outcome: 'withdrawn' | 'already_placed' | 'not_found' }>;\n sprinkleSend(\n sprinkleId: string,\n payload: { action: string; data: JsonValue | null; target: string | null },\n context: Context\n ): Promise<{ delivered: boolean }>;\n sprinkleCall(\n sprinkleId: string,\n method: string,\n args: JsonValue[],\n context: Context\n ): Promise<JsonValue>;\n memorySave(draft: MemoryDraft, context: Context): Promise<MemoryEntry>;\n memoryRemove(id: string, context: Context): Promise<{ removed: boolean }>;\n freeze(agentId: string, context: Context): Promise<Created>;\n newChat(agentId: string, context: Context): Promise<Created>;\n thaw(frozenId: string, context: Context): Promise<Created>;\n discard(frozenId: string, context: Context): Promise<Created>;\n importProfile(request: ImportRequest, context: Context): Promise<ImportResult>;\n importCancel(context: Context): Promise<void>;\n changesOpen(context: Context): Promise<void>;\n changeAccept(path: string, context: Context): Promise<Created>;\n changeRevert(path: string, context: Context): Promise<Created>;\n monitorOpen(lease: string | null, resync: boolean, context: Context): Promise<MonitorLease>;\n monitorClose(lease: string, context: Context): Promise<void>;\n image(ref: ImageRef, context: Context): Promise<StoredImage>;\n agentCommands(agentId: string, context: Context): Promise<Command[]>;\n toolLabel(agentId: string, callIds: string[], context: Context): Promise<string | null>;\n guestOpen(draft: GuestDraft, context: Context): Promise<GuestOpened>;\n guestRevoke(id: string, context: Context): Promise<{ revoked: boolean }>;\n guestAlwaysForget(\n seat: string,\n approval: string,\n context: Context\n ): Promise<{ removed: boolean }>;\n approvalPolicySet(change: ApprovalPolicyChange, context: Context): Promise<ApprovalPolicySet>;\n decide(\n id: string,\n decision: ApprovalAnswer,\n reason: string | null,\n context: Context\n ): Promise<ApprovalDecided>;\n}\n\nexport interface ImportRequest {\n upload: string | null;\n data: string | null;\n again: boolean;\n preview: boolean;\n}\n\nexport interface ImageRef {\n entry: number;\n message: number;\n part: number;\n}\n\nexport type StoredImage = { data: string; mimeType: string } | { data: null; mimeType: null };\n\nexport interface MonitorLease {\n lease: string;\n ttlMs: number;\n}\n\nexport interface MonitorAgent {\n id: string;\n name: string;\n kind: 'cone' | 'scoop';\n parentId: string | null;\n model: string | null;\n running: boolean;\n queued: number;\n tool: string | null;\n retry: { attempt: number; since: number; error: string } | null;\n failed: string | null;\n context: number | null;\n cpu?: number | null;\n}\n\nexport interface MonitorTask {\n id: string;\n kind: string;\n detail: string | null;\n agentId: string | null;\n owner: string | null;\n status: 'pending' | 'running' | 'waiting' | 'completing';\n phase: string;\n background: boolean;\n aborting: number | null;\n since: number;\n waits: number;\n}\n\nexport interface MonitorProcess {\n pid: number;\n ppid: number;\n pgid: number;\n user: string | null;\n agentId: string | null;\n command: string;\n state: 'S' | 'Z';\n started: number;\n zombie: number | null;\n tty: boolean;\n rss: number | null;\n utime?: number;\n stime?: number;\n cpu?: number | null;\n}\n\nexport interface MonitorProblem {\n id: string;\n at: number;\n agentId: string | null;\n kind: 'task' | 'retry' | 'turn';\n message: string;\n}\n\nexport interface MonitorFeed {\n open: boolean;\n at: number;\n usage: { tokens: number; cost: number; free: boolean } | null;\n agents: MonitorAgent[];\n tasks: MonitorTask[];\n processes: MonitorProcess[] | null;\n kernel: 'checking' | 'ok' | 'unreachable';\n problems: MonitorProblem[];\n paused: boolean;\n}\n\nexport interface MemoryDraft {\n id: string | null;\n scope: string;\n section: string;\n title: string;\n body: string;\n tag: MemoryTag | null;\n}\n\nexport type Created = { id: string; error: null } | { id: null; error: string };\n\nexport interface AgentSummary {\n id: string;\n name: string;\n kind: 'cone' | 'scoop';\n parentId: string | null;\n role: string | null;\n}\n\nexport interface AgentsSummary {\n active: string;\n agents: AgentSummary[];\n}\n\nexport type LickResolved =\n | { done: true; text: string; error: null }\n | { done: false; text: null; error: string };\n\nexport interface WebhookRequest {\n id: string | null;\n headers: Record<string, string>;\n body: string;\n}\n\nexport type Rewound =\n | { done: true; text: string; reason: null; attachments?: ShownAttachment[] }\n | { done: false; text: null; reason: 'busy' | 'no-turn' };\n\nexport interface AgentSettingsChange {\n model: { provider: string; modelId: string } | null;\n thinkingLevel: 'off' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | 'max' | null;\n agentId?: string | null;\n}\n\nconst keys = <T>(record: Record<keyof T, true>) => Object.keys(record) as (keyof T & string)[];\n\nexport const CONTROL_METHODS = keys<AgentControl>({\n send: true,\n wait: true,\n withdraw: true,\n abort: true,\n compact: true,\n compactAgent: true,\n reset: true,\n configure: true,\n rewind: true,\n rewindAgent: true,\n resolveLick: true,\n resolveAgentLick: true,\n webhook: true,\n stopAgent: true,\n selectCone: true,\n createCone: true,\n createScoop: true,\n drop: true,\n unqueue: true,\n sprinkleSend: true,\n sprinkleCall: true,\n memorySave: true,\n memoryRemove: true,\n freeze: true,\n newChat: true,\n thaw: true,\n discard: true,\n importProfile: true,\n importCancel: true,\n changesOpen: true,\n changeAccept: true,\n changeRevert: true,\n monitorOpen: true,\n monitorClose: true,\n image: true,\n agentCommands: true,\n toolLabel: true,\n guestOpen: true,\n guestRevoke: true,\n guestAlwaysForget: true,\n approvalPolicySet: true,\n decide: true,\n});\n\nexport const OWNER_DEVICE_METHODS: readonly (keyof AgentControl & string)[] = [\n 'decide',\n 'guestOpen',\n 'guestRevoke',\n 'guestAlwaysForget',\n 'approvalPolicySet',\n];\n\nexport const CONTROL_READS: readonly (keyof AgentControl & string)[] = [\n 'wait',\n 'changesOpen',\n 'monitorOpen',\n 'monitorClose',\n 'image',\n 'toolLabel',\n];\n\nexport const AgentControl: RemoteContract = contract('slicc.agent.control', {\n control: { methods: CONTROL_METHODS },\n view: { methods: [...CONTROL_READS, ...OWNER_DEVICE_METHODS] },\n});\n\nexport type Delivered = 'run' | 'steer' | 'follow-up';\n\nexport interface AgentTranscript {\n readonly state: ReplicatedState<ConversationView>;\n readonly deliveries: ReplicatedState<Record<string, Delivered>>;\n readonly agents: ReplicatedState<AgentsSummary>;\n readonly views: ReplicatedState<Record<string, ConversationView>>;\n readonly commands: ReplicatedState<Command[]>;\n readonly privateRevision: ReplicatedState<PrivateRevision>;\n readonly sprinkles: ReplicatedState<Sprinkle[]>;\n readonly memories: ReplicatedState<MemoryEntry[]>;\n readonly memoryScopes: ReplicatedState<MemoryScope[]>;\n readonly frozen: ReplicatedState<FrozenCone[]>;\n readonly importing: ReplicatedState<ImportProgress>;\n readonly changes: ReplicatedState<ChangesView>;\n readonly monitor: ReplicatedState<MonitorFeed>;\n readonly vault: ReplicatedState<VaultState>;\n readonly labels: ReplicatedState<Record<string, string>>;\n readonly guests: ReplicatedState<GuestSeat[]>;\n readonly approvals: ReplicatedState<Approval[]>;\n readonly approvalPolicy: ReplicatedState<ApprovalPolicy>;\n}\n\nexport interface PrivateRevision {\n revision: number;\n}\n\nexport interface Command {\n name: string;\n description: string;\n kind: 'prompt' | 'skill' | 'action';\n source?: SkillSource;\n package?: SkillPackage;\n}\n\nexport const TRANSCRIPT_STATES = keys<AgentTranscript>({\n state: true,\n deliveries: true,\n agents: true,\n views: true,\n commands: true,\n privateRevision: true,\n sprinkles: true,\n memories: true,\n memoryScopes: true,\n frozen: true,\n importing: true,\n changes: true,\n monitor: true,\n vault: true,\n labels: true,\n guests: true,\n approvals: true,\n approvalPolicy: true,\n});\n\nexport const AgentTranscript: RemoteContract = contract('slicc.agent.transcript', {\n transcript: { state: TRANSCRIPT_STATES },\n});\n\nexport const REMOTE_METHODS = keys<AgentRemote>({\n prompt: true,\n watch: true,\n next: true,\n close: true,\n abort: true,\n});\n\nexport const REMOTE_READS: readonly (keyof AgentRemote & string)[] = ['watch', 'next', 'close'];\n\nexport interface GuestShown {\n id: string;\n label: string;\n agentId: string;\n name: string;\n expiresAt: number | null;\n gates: GuestGates;\n}\n\nexport interface GuestProposal {\n id: string;\n text: string;\n state: 'queued' | 'pending' | 'approved' | 'rejected' | 'unanswered' | 'withdrawn';\n reason: string | null;\n createdAt: number;\n decidedAt: number | null;\n}\n\nexport interface AgentGuest {\n readonly transcript: ReplicatedState<ConversationView>;\n readonly seat: ReplicatedState<GuestShown>;\n readonly proposals: ReplicatedState<GuestProposal[]>;\n propose(request: ProposeRequest, context: Context): Promise<Proposed>;\n guestOpen(draft: GuestDraft, context: Context): Promise<GuestOpened>;\n guestRevoke(id: string, context: Context): Promise<{ revoked: boolean }>;\n}\n\nexport const GUEST_STATES = ['transcript', 'seat', 'proposals'] as const;\n\nexport const GUEST_METHODS = ['propose', 'guestOpen', 'guestRevoke'] as const;\n\nexport const AgentGuestService: RemoteContract = contract('slicc.agent.guest', {\n guest: { state: GUEST_STATES, methods: GUEST_METHODS },\n none: {},\n});\n\nexport const AgentRemoteService: RemoteContract = contract('slicc.agent.remote', {\n remote: { methods: REMOTE_METHODS },\n watch: { methods: REMOTE_READS },\n});\n\nexport const PAGE_METHODS = keys<AgentPages>({\n open: true,\n report: true,\n next: true,\n answer: true,\n close: true,\n});\n\nexport const AgentPagesService: RemoteContract = contract('slicc.agent.pages', {\n pages: { methods: PAGE_METHODS },\n none: {},\n});\n\nexport const SUDO_METHODS = keys<Omit<AgentSudo, 'approvals'>>({\n request: true,\n withdraw: true,\n});\n\nexport const AgentSudoService: RemoteContract = contract('slicc.agent.sudo', {\n sudo: { state: ['approvals'], methods: SUDO_METHODS },\n none: {},\n});\n\nexport interface ModelChoice {\n id: string;\n label: string;\n provider: string;\n kind: 'chat' | 'classifier';\n reasoning: boolean;\n images?: boolean;\n contextWindow: number;\n}\n\nexport interface AccountState {\n id: string;\n provider: string;\n identity: string;\n status: 'connected' | 'disconnected' | 'expired';\n auth: 'api-key' | 'oauth';\n needs: 'cors-free-transport' | null;\n blocked?: 'cors-free-transport';\n group?: 'providers' | 'mcp';\n secret?: 'api-key' | 'token';\n store?: 'vault';\n fields?: AccountField[];\n description?: string;\n keyUrl?: string;\n vaultName?: string;\n}\n\nexport interface AccountField {\n name: string;\n label: string;\n required?: boolean;\n placeholder?: string;\n help?: string;\n customBase?: true;\n vaultSetting?: string;\n options?: readonly { value: string; label: string }[];\n value?: string;\n}\n\nexport interface ProviderOption {\n id: string;\n name: string;\n description?: string;\n auth: 'api-key' | 'oauth' | 'fields' | 'local';\n fields?: AccountField[];\n keyUrl?: string;\n needs?: 'cors-free-transport';\n blocked?: 'cors-free-transport';\n vaultName?: string;\n}\n\nexport interface BudgetState {\n provider: string;\n percent: number;\n window: 'weekly';\n resets: string;\n}\n\nexport interface SignIn {\n clientId: string;\n scopes: string;\n imsEnvironment: string;\n}\n\nexport interface McpSignIn {\n url: string;\n state: string;\n}\n\nexport interface SettingsState {\n models: ModelChoice[];\n accounts: AccountState[];\n providers?: ProviderOption[];\n budget?: BudgetState | null;\n moved?: { kind: 'model' | 'mcp'; label: string }[];\n labels?: Record<string, string>;\n}\n\nexport interface AgentSettings {\n readonly state: ReplicatedState<SettingsState>;\n connect(\n providerId: string,\n secret: string | null,\n fields: Record<string, string> | null,\n context: Context\n ): Promise<void>;\n disconnect(providerId: string, context: Context): Promise<void>;\n remove(providerId: string, context: Context): Promise<void>;\n serverUrl(providerId: string, context: Context): Promise<string | null>;\n signIn(providerId: string, context: Context): Promise<SignIn | McpSignIn | null>;\n dismissMoved(context: Context): Promise<void>;\n}\n\nexport const SETTINGS_METHODS = keys<Omit<AgentSettings, 'state'>>({\n connect: true,\n disconnect: true,\n remove: true,\n serverUrl: true,\n signIn: true,\n dismissMoved: true,\n});\n\nexport const AgentSettings: RemoteContract = contract('slicc.agent.settings', {\n settings: { state: ['state'], methods: SETTINGS_METHODS },\n view: { state: ['state'] },\n});\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { Context, JsonValue, RemoteContract, ReplicatedState } from '@earendil-works/chord';\nimport type { ConversationView } from '@earendil-works/pi-durable';\nimport type { Approval, ApprovalAnswer, ApprovalDecided } from './approvals/index.ts';\nimport type {\n ApprovalPolicy,\n ApprovalPolicyChange,\n ApprovalPolicySet,\n} from './approvals/policy.ts';\nimport type { AgentSudo } from './approvals/sudo.ts';\nimport type { SendAttachment, ShownAttachment } from './attachments.ts';\nimport type { ChangesView } from './changes/git.ts';\nimport type { FrozenCone } from './freezer/index.ts';\nimport type { ImportProgress, ImportResult } from './freezer/v6.ts';\nimport type { GuestOpened, Proposed, ProposeRequest } from './guests/index.ts';\nimport type { GuestDraft, GuestGates, GuestSeat } from './guests/seats.ts';\nimport type { MemoryEntry, MemoryScope, MemoryTag } from './memory/format.ts';\nimport type { AgentRemote } from './remote/host.ts';\nimport type { AgentPages } from './remote/pages.ts';\nimport type { VaultState } from './secrets/vault.ts';\nimport { contract } from './serving.ts';\nimport type { DeviceSignIn } from './sign-ins.ts';\nimport type { SkillPackage, SkillSource } from './skills/skills.ts';\nimport type { Sprinkle } from './sprinkles/kind.ts';\n\nexport type SendMode = 'steer' | 'followUp' | 'reject';\n\nexport interface SendRequest {\n text: string;\n whenBusy: SendMode;\n requestId: string | null;\n agentId?: string | null;\n attachments?: SendAttachment[];\n}\n\nexport interface OperationError {\n code: string;\n message: string;\n}\n\nexport type SendResponse =\n | { accepted: true; submissionId: string; error: null }\n | { accepted: false; submissionId: null; error: OperationError };\n\nexport type PromptResult =\n | { status: 'done'; text: string; reason: null }\n | { status: 'unanswered'; text: null; reason: string };\n\nexport interface AgentControl {\n send(request: SendRequest, context: Context): Promise<SendResponse>;\n wait(submissionId: string, context: Context): Promise<PromptResult>;\n withdraw(\n submissionId: string,\n context: Context\n ): Promise<{ outcome: 'withdrawn' | 'already_placed' | 'not_found' }>;\n abort(context: Context): Promise<void>;\n compact(instructions: string | null, context: Context): Promise<SendResponse>;\n compactAgent(\n agentId: string,\n instructions: string | null,\n context: Context\n ): Promise<SendResponse>;\n reset(handoff: string | null, context: Context): Promise<void>;\n configure(change: AgentSettingsChange, context: Context): Promise<void>;\n rewind(messageId: string | null, context: Context): Promise<Rewound>;\n rewindAgent(agentId: string, messageId: string | null, context: Context): Promise<Rewound>;\n resolveLick(\n lickId: string,\n state: 'confirmed' | 'dismissed',\n context: Context\n ): Promise<LickResolved>;\n resolveAgentLick(\n agentId: string,\n lickId: string,\n state: 'confirmed' | 'dismissed',\n context: Context\n ): Promise<LickResolved>;\n webhook(\n name: string,\n delivery: WebhookRequest,\n context: Context\n ): Promise<{ delivered: boolean }>;\n stopAgent(agentId: string, context: Context): Promise<void>;\n selectCone(agentId: string, context: Context): Promise<void>;\n createCone(name: string, context: Context): Promise<Created>;\n createScoop(parentId: string, name: string, context: Context): Promise<Created>;\n drop(agentId: string, context: Context): Promise<Created>;\n unqueue(\n agentId: string | null,\n submissionId: string,\n context: Context\n ): Promise<{ outcome: 'withdrawn' | 'already_placed' | 'not_found' }>;\n sprinkleSend(\n sprinkleId: string,\n payload: { action: string; data: JsonValue | null; target: string | null },\n context: Context\n ): Promise<{ delivered: boolean }>;\n sprinkleCall(\n sprinkleId: string,\n method: string,\n args: JsonValue[],\n context: Context\n ): Promise<JsonValue>;\n memorySave(draft: MemoryDraft, context: Context): Promise<MemoryEntry>;\n memoryRemove(id: string, context: Context): Promise<{ removed: boolean }>;\n freeze(agentId: string, context: Context): Promise<Created>;\n newChat(agentId: string, context: Context): Promise<Created>;\n thaw(frozenId: string, context: Context): Promise<Created>;\n discard(frozenId: string, context: Context): Promise<Created>;\n importProfile(request: ImportRequest, context: Context): Promise<ImportResult>;\n importCancel(context: Context): Promise<void>;\n changesOpen(context: Context): Promise<void>;\n changeAccept(path: string, context: Context): Promise<Created>;\n changeRevert(path: string, context: Context): Promise<Created>;\n monitorOpen(lease: string | null, resync: boolean, context: Context): Promise<MonitorLease>;\n monitorClose(lease: string, context: Context): Promise<void>;\n image(ref: ImageRef, context: Context): Promise<StoredImage>;\n agentCommands(agentId: string, context: Context): Promise<Command[]>;\n toolLabel(agentId: string, callIds: string[], context: Context): Promise<string | null>;\n guestOpen(draft: GuestDraft, context: Context): Promise<GuestOpened>;\n guestRevoke(id: string, context: Context): Promise<{ revoked: boolean }>;\n guestAlwaysForget(\n seat: string,\n approval: string,\n context: Context\n ): Promise<{ removed: boolean }>;\n approvalPolicySet(change: ApprovalPolicyChange, context: Context): Promise<ApprovalPolicySet>;\n decide(\n id: string,\n decision: ApprovalAnswer,\n reason: string | null,\n context: Context\n ): Promise<ApprovalDecided>;\n}\n\nexport interface ImportRequest {\n upload: string | null;\n data: string | null;\n again: boolean;\n preview: boolean;\n}\n\nexport interface ImageRef {\n entry: number;\n message: number;\n part: number;\n}\n\nexport type StoredImage = { data: string; mimeType: string } | { data: null; mimeType: null };\n\nexport interface MonitorLease {\n lease: string;\n ttlMs: number;\n}\n\nexport interface MonitorAgent {\n id: string;\n name: string;\n kind: 'cone' | 'scoop';\n parentId: string | null;\n model: string | null;\n running: boolean;\n queued: number;\n tool: string | null;\n retry: { attempt: number; since: number; error: string } | null;\n failed: string | null;\n context: number | null;\n cpu?: number | null;\n}\n\nexport interface MonitorTask {\n id: string;\n kind: string;\n detail: string | null;\n agentId: string | null;\n owner: string | null;\n status: 'pending' | 'running' | 'waiting' | 'completing';\n phase: string;\n background: boolean;\n aborting: number | null;\n since: number;\n waits: number;\n}\n\nexport interface MonitorProcess {\n pid: number;\n ppid: number;\n pgid: number;\n user: string | null;\n agentId: string | null;\n command: string;\n state: 'S' | 'Z';\n started: number;\n zombie: number | null;\n tty: boolean;\n rss: number | null;\n utime?: number;\n stime?: number;\n cpu?: number | null;\n}\n\nexport interface MonitorProblem {\n id: string;\n at: number;\n agentId: string | null;\n kind: 'task' | 'retry' | 'turn';\n message: string;\n}\n\nexport interface MonitorFeed {\n open: boolean;\n at: number;\n usage: { tokens: number; cost: number; free: boolean } | null;\n agents: MonitorAgent[];\n tasks: MonitorTask[];\n processes: MonitorProcess[] | null;\n kernel: 'checking' | 'ok' | 'unreachable';\n problems: MonitorProblem[];\n paused: boolean;\n}\n\nexport interface MemoryDraft {\n id: string | null;\n scope: string;\n section: string;\n title: string;\n body: string;\n tag: MemoryTag | null;\n}\n\nexport type Created = { id: string; error: null } | { id: null; error: string };\n\nexport interface AgentSummary {\n id: string;\n name: string;\n kind: 'cone' | 'scoop';\n parentId: string | null;\n role: string | null;\n}\n\nexport interface AgentsSummary {\n active: string;\n agents: AgentSummary[];\n}\n\nexport type LickResolved =\n | { done: true; text: string; error: null }\n | { done: false; text: null; error: string };\n\nexport interface WebhookRequest {\n id: string | null;\n headers: Record<string, string>;\n body: string;\n}\n\nexport type Rewound =\n | { done: true; text: string; reason: null; attachments?: ShownAttachment[] }\n | { done: false; text: null; reason: 'busy' | 'no-turn' };\n\nexport interface AgentSettingsChange {\n model: { provider: string; modelId: string } | null;\n thinkingLevel: 'off' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | 'max' | null;\n agentId?: string | null;\n}\n\nconst keys = <T>(record: Record<keyof T, true>) => Object.keys(record) as (keyof T & string)[];\n\nexport const CONTROL_METHODS = keys<AgentControl>({\n send: true,\n wait: true,\n withdraw: true,\n abort: true,\n compact: true,\n compactAgent: true,\n reset: true,\n configure: true,\n rewind: true,\n rewindAgent: true,\n resolveLick: true,\n resolveAgentLick: true,\n webhook: true,\n stopAgent: true,\n selectCone: true,\n createCone: true,\n createScoop: true,\n drop: true,\n unqueue: true,\n sprinkleSend: true,\n sprinkleCall: true,\n memorySave: true,\n memoryRemove: true,\n freeze: true,\n newChat: true,\n thaw: true,\n discard: true,\n importProfile: true,\n importCancel: true,\n changesOpen: true,\n changeAccept: true,\n changeRevert: true,\n monitorOpen: true,\n monitorClose: true,\n image: true,\n agentCommands: true,\n toolLabel: true,\n guestOpen: true,\n guestRevoke: true,\n guestAlwaysForget: true,\n approvalPolicySet: true,\n decide: true,\n});\n\nexport const OWNER_DEVICE_METHODS: readonly (keyof AgentControl & string)[] = [\n 'decide',\n 'guestOpen',\n 'guestRevoke',\n 'guestAlwaysForget',\n 'approvalPolicySet',\n];\n\nexport const CONTROL_READS: readonly (keyof AgentControl & string)[] = [\n 'wait',\n 'changesOpen',\n 'monitorOpen',\n 'monitorClose',\n 'image',\n 'toolLabel',\n];\n\nexport const AgentControl: RemoteContract = contract('slicc.agent.control', {\n control: { methods: CONTROL_METHODS },\n view: { methods: [...CONTROL_READS, ...OWNER_DEVICE_METHODS] },\n});\n\nexport type Delivered = 'run' | 'steer' | 'follow-up';\n\nexport interface AgentTranscript {\n readonly state: ReplicatedState<ConversationView>;\n readonly deliveries: ReplicatedState<Record<string, Delivered>>;\n readonly agents: ReplicatedState<AgentsSummary>;\n readonly views: ReplicatedState<Record<string, ConversationView>>;\n readonly commands: ReplicatedState<Command[]>;\n readonly privateRevision: ReplicatedState<PrivateRevision>;\n readonly sprinkles: ReplicatedState<Sprinkle[]>;\n readonly memories: ReplicatedState<MemoryEntry[]>;\n readonly memoryScopes: ReplicatedState<MemoryScope[]>;\n readonly frozen: ReplicatedState<FrozenCone[]>;\n readonly importing: ReplicatedState<ImportProgress>;\n readonly changes: ReplicatedState<ChangesView>;\n readonly monitor: ReplicatedState<MonitorFeed>;\n readonly vault: ReplicatedState<VaultState>;\n readonly labels: ReplicatedState<Record<string, string>>;\n readonly guests: ReplicatedState<GuestSeat[]>;\n readonly approvals: ReplicatedState<Approval[]>;\n readonly approvalPolicy: ReplicatedState<ApprovalPolicy>;\n}\n\nexport interface PrivateRevision {\n revision: number;\n}\n\nexport interface Command {\n name: string;\n description: string;\n kind: 'prompt' | 'skill' | 'action';\n source?: SkillSource;\n package?: SkillPackage;\n}\n\nexport const TRANSCRIPT_STATES = keys<AgentTranscript>({\n state: true,\n deliveries: true,\n agents: true,\n views: true,\n commands: true,\n privateRevision: true,\n sprinkles: true,\n memories: true,\n memoryScopes: true,\n frozen: true,\n importing: true,\n changes: true,\n monitor: true,\n vault: true,\n labels: true,\n guests: true,\n approvals: true,\n approvalPolicy: true,\n});\n\nexport const AgentTranscript: RemoteContract = contract('slicc.agent.transcript', {\n transcript: { state: TRANSCRIPT_STATES },\n});\n\nexport const REMOTE_METHODS = keys<AgentRemote>({\n prompt: true,\n watch: true,\n next: true,\n close: true,\n abort: true,\n});\n\nexport const REMOTE_READS: readonly (keyof AgentRemote & string)[] = ['watch', 'next', 'close'];\n\nexport interface GuestShown {\n id: string;\n label: string;\n agentId: string;\n name: string;\n expiresAt: number | null;\n gates: GuestGates;\n}\n\nexport interface GuestProposal {\n id: string;\n text: string;\n state: 'queued' | 'pending' | 'approved' | 'rejected' | 'unanswered' | 'withdrawn';\n reason: string | null;\n createdAt: number;\n decidedAt: number | null;\n}\n\nexport interface AgentGuest {\n readonly transcript: ReplicatedState<ConversationView>;\n readonly seat: ReplicatedState<GuestShown>;\n readonly proposals: ReplicatedState<GuestProposal[]>;\n propose(request: ProposeRequest, context: Context): Promise<Proposed>;\n guestOpen(draft: GuestDraft, context: Context): Promise<GuestOpened>;\n guestRevoke(id: string, context: Context): Promise<{ revoked: boolean }>;\n}\n\nexport const GUEST_STATES = ['transcript', 'seat', 'proposals'] as const;\n\nexport const GUEST_METHODS = ['propose', 'guestOpen', 'guestRevoke'] as const;\n\nexport const AgentGuestService: RemoteContract = contract('slicc.agent.guest', {\n guest: { state: GUEST_STATES, methods: GUEST_METHODS },\n none: {},\n});\n\nexport const AgentRemoteService: RemoteContract = contract('slicc.agent.remote', {\n remote: { methods: REMOTE_METHODS },\n watch: { methods: REMOTE_READS },\n});\n\nexport const PAGE_METHODS = keys<AgentPages>({\n open: true,\n report: true,\n next: true,\n answer: true,\n close: true,\n});\n\nexport const AgentPagesService: RemoteContract = contract('slicc.agent.pages', {\n pages: { methods: PAGE_METHODS },\n none: {},\n});\n\nexport const SUDO_METHODS = keys<Omit<AgentSudo, 'approvals'>>({\n request: true,\n withdraw: true,\n});\n\nexport const AgentSudoService: RemoteContract = contract('slicc.agent.sudo', {\n sudo: { state: ['approvals'], methods: SUDO_METHODS },\n none: {},\n});\n\nexport interface ModelChoice {\n id: string;\n label: string;\n provider: string;\n kind: 'chat' | 'classifier';\n reasoning: boolean;\n images?: boolean;\n contextWindow: number;\n}\n\nexport interface AccountState {\n id: string;\n provider: string;\n identity: string;\n status: 'connected' | 'disconnected' | 'expired';\n auth: 'api-key' | 'oauth';\n needs: 'cors-free-transport' | null;\n blocked?: 'cors-free-transport';\n group?: 'providers' | 'mcp';\n secret?: 'api-key' | 'token';\n store?: 'vault';\n fields?: AccountField[];\n description?: string;\n keyUrl?: string;\n vaultName?: string;\n}\n\nexport interface AccountField {\n name: string;\n label: string;\n required?: boolean;\n placeholder?: string;\n help?: string;\n customBase?: true;\n vaultSetting?: string;\n options?: readonly { value: string; label: string }[];\n value?: string;\n}\n\nexport interface ProviderOption {\n id: string;\n name: string;\n description?: string;\n auth: 'api-key' | 'oauth' | 'fields' | 'local';\n fields?: AccountField[];\n keyUrl?: string;\n needs?: 'cors-free-transport';\n blocked?: 'cors-free-transport';\n vaultName?: string;\n}\n\nexport interface BudgetState {\n provider: string;\n percent: number;\n window: 'weekly';\n resets: string;\n}\n\nexport interface SignIn {\n clientId: string;\n scopes: string;\n imsEnvironment: string;\n}\n\nexport interface McpSignIn {\n url: string;\n state: string;\n}\n\nexport interface SettingsState {\n models: ModelChoice[];\n accounts: AccountState[];\n providers?: ProviderOption[];\n budget?: BudgetState | null;\n moved?: { kind: 'model' | 'mcp'; label: string }[];\n labels?: Record<string, string>;\n}\n\nexport interface AgentSettings {\n readonly state: ReplicatedState<SettingsState>;\n connect(\n providerId: string,\n secret: string | null,\n fields: Record<string, string> | null,\n context: Context\n ): Promise<void>;\n disconnect(providerId: string, context: Context): Promise<void>;\n remove(providerId: string, context: Context): Promise<void>;\n serverUrl(providerId: string, context: Context): Promise<string | null>;\n signIn(providerId: string, context: Context): Promise<SignIn | McpSignIn | DeviceSignIn | null>;\n dismissMoved(context: Context): Promise<void>;\n}\n\nexport const SETTINGS_METHODS = keys<Omit<AgentSettings, 'state'>>({\n connect: true,\n disconnect: true,\n remove: true,\n serverUrl: true,\n signIn: true,\n dismissMoved: true,\n});\n\nexport const AgentSettings: RemoteContract = contract('slicc.agent.settings', {\n settings: { state: ['state'], methods: SETTINGS_METHODS },\n view: { state: ['state'] },\n});\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/dist/settings.js CHANGED
@@ -11,6 +11,8 @@ import {
11
11
  adobeUsage
12
12
  } from "./adobe.js";
13
13
  import { abortableBedrock } from "./bedrock.js";
14
+ import { codexProvider } from "./codex.js";
15
+ import { deviceFlows } from "./device.js";
14
16
  import { MCP_ACCOUNT } from "./mcp/label.js";
15
17
  import { BEDROCK, preferredModel } from "./preferred.js";
16
18
  import {
@@ -19,6 +21,8 @@ import {
19
21
  KEY_PROVIDERS,
20
22
  LISTINGS
21
23
  } from "./providers.js";
24
+ import { absent } from "./secrets/fetch.js";
25
+ import { DEVICE_NEEDS_VAULT, DEVICE_SIGN_INS } from "./sign-ins.js";
22
26
  import { BEDROCK as BEDROCK2, PREFERRED_MODELS, preferredModel as preferredModel2 } from "./preferred.js";
23
27
  const DEFAULT_MODEL = { provider: BEDROCK, modelId: "us.anthropic.claude-sonnet-5-5" };
24
28
  const DEFAULT_REGIONS = { [BEDROCK]: DEFAULT_REGION };
@@ -41,12 +45,15 @@ async function resolveDefaultModel(credentials, providers, models) {
41
45
  return DEFAULT_MODEL;
42
46
  }
43
47
  const signIn = /* @__PURE__ */ new Set([ADOBE]);
48
+ const oauth = (providerId) => signIn.has(providerId) || DEVICE_SIGN_INS.has(providerId);
49
+ const SIGN_IN_CORS_FREE = /* @__PURE__ */ new Set(["xai"]);
44
50
  const BUDGET_EVERY = 5 * 60 * 1e3;
45
51
  function sliccProviders(version) {
46
52
  return [
47
53
  amazonBedrockProvider(),
48
54
  adobeProvider({ version }),
49
- ...KEY_PROVIDERS.map((entry) => entry.make())
55
+ ...KEY_PROVIDERS.map((entry) => entry.make()),
56
+ codexProvider()
50
57
  ];
51
58
  }
52
59
  function withDefaultRegions(credentials) {
@@ -122,9 +129,10 @@ function accounts(records, providers, given, blocked) {
122
129
  return {
123
130
  id: provider.id,
124
131
  provider: provider.name ?? provider.id,
125
- identity: record ? signIn.has(provider.id) ? "Adobe ID" : "API key" : "",
132
+ identity: record ? identityOf(provider.id, record) : "",
126
133
  status: !record ? "disconnected" : record.state === "expired" ? "expired" : "connected",
127
- auth: signIn.has(provider.id) ? "oauth" : "api-key",
134
+ auth: oauth(provider.id) ? "oauth" : "api-key",
135
+ ...DEVICE_SIGN_INS.has(provider.id) && listing?.keyUrl ? { secret: "api-key" } : {},
128
136
  needs: listing?.corsFree ? "cors-free-transport" : null,
129
137
  ...blocked(provider.id) ? { blocked: "cors-free-transport" } : {},
130
138
  group: "providers",
@@ -134,6 +142,10 @@ function accounts(records, providers, given, blocked) {
134
142
  };
135
143
  });
136
144
  }
145
+ function identityOf(providerId, record) {
146
+ if (signIn.has(providerId)) return "Adobe ID";
147
+ return DEVICE_SIGN_INS.has(providerId) && record.expiresAt !== void 0 ? "Signed in" : "API key";
148
+ }
137
149
  function about(listing) {
138
150
  if (!listing) return {};
139
151
  return {
@@ -236,8 +248,18 @@ function blockedBy(reach) {
236
248
  return (providerId) => Boolean(LISTINGS.get(providerId)?.corsFree) && reach?.free() === false;
237
249
  }
238
250
  async function createAgentSettings(models, sources, providers = sliccProviders(), options = {}) {
239
- const { mcp, moved, reach } = options;
251
+ const { mcp, moved, reach, vault } = options;
240
252
  const blocked = blockedBy(reach);
253
+ const flows = options.flows ?? deviceFlows((grant) => vault.grantProvider(grant));
254
+ const device = (providerId, context) => {
255
+ const provider = providers.find((candidate) => candidate.id === providerId);
256
+ const name = LISTINGS.get(providerId)?.vaultName;
257
+ if (!provider || !name) return Promise.resolve(null);
258
+ if (!vault || absent(vault)) return Promise.reject(new Error(DEVICE_NEEDS_VAULT));
259
+ if (blocked(providerId) || SIGN_IN_CORS_FREE.has(providerId) && reach?.free() === false)
260
+ return Promise.reject(new Error(`${provider.name} sign-in needs the cors-free transport.`));
261
+ return fields.add(providerId).then(() => refresh(context)).then(() => flows.start(provider, name, context));
262
+ };
241
263
  const { records, fields } = sources;
242
264
  const routed = (providerId) => providerId.startsWith(MCP_ACCOUNT) ? mcp : void 0;
243
265
  const adobe = providers.find((provider) => provider.id === ADOBE);
@@ -302,6 +324,7 @@ async function createAgentSettings(models, sources, providers = sliccProviders()
302
324
  }
303
325
  if (secret !== null)
304
326
  throw new Error(signIn.has(providerId) ? SIGN_IN_NEEDS_VAULT : KEY_NEEDS_VAULT);
327
+ if (flows.has(providerId)) await flows.finish(providerId, context);
305
328
  if (given !== null) await fields.set(providerId, given);
306
329
  if (LISTINGS.has(providerId)) await fields.add(providerId);
307
330
  records.reconnected(providerId);
@@ -309,9 +332,10 @@ async function createAgentSettings(models, sources, providers = sliccProviders()
309
332
  if (signIn.has(providerId)) await discover([providerId]);
310
333
  await refresh(context);
311
334
  },
312
- async signIn(providerId) {
335
+ async signIn(providerId, context) {
313
336
  const server = routed(providerId);
314
337
  if (server) return server.signIn(providerId);
338
+ if (DEVICE_SIGN_INS.has(providerId)) return device(providerId, context);
315
339
  if (providerId !== ADOBE) return null;
316
340
  const { clientId, scopes, imsEnvironment } = await adobeConfig(
317
341
  endpoint,
@@ -325,6 +349,7 @@ async function createAgentSettings(models, sources, providers = sliccProviders()
325
349
  await refresh(context);
326
350
  },
327
351
  async disconnect(providerId, context) {
352
+ flows.stop(providerId);
328
353
  const server = routed(providerId);
329
354
  if (server) await server.disconnect(providerId);
330
355
  else if (LISTINGS.has(providerId)) await fields.add(providerId);
@@ -336,6 +361,7 @@ async function createAgentSettings(models, sources, providers = sliccProviders()
336
361
  return await routed(providerId)?.serverUrl(providerId) ?? null;
337
362
  },
338
363
  async remove(providerId, context) {
364
+ flows.stop(providerId);
339
365
  const server = routed(providerId);
340
366
  if (server) await server.disconnect(providerId);
341
367
  else await fields.forget(providerId);