From 78830b4f4c0586c3338cb1e79f9ffd9bcf26c700 Mon Sep 17 00:00:00 2001 From: packs-sdk-sync-bot Date: Wed, 21 Oct 2026 11:21:36 -0700 Subject: [PATCH] Packs SDK internal development snapshot. - 7ca247f2b4d379cda903d19b5b49f131d83599eb by packs-sdk-sync-bot - 6a65c58cd6e5a26d47c375ce19490acdc82c777b by packs-sdk-sync-bot - 66434cf548654f3277ec4af9c4144922a0a51cda by packs-sdk-sync-bot - 7efa716f90dc3732042e00bd42f34143bb6f419b by packs-sdk-sync-bot - bc7bc181af088a84401a53bc4e4360accb7bb72b by packs-sdk-sync-bot - 52802f3bc0f32a3b339ad03fc6d25151a1986e71 by packs-sdk-sync-bot - 8900c1395c68577fc8fedd96f9f3f744f6ec9b93 by packs-sdk-sync-bot - 8e18c427f68c6dd8f280984146d0a7fe10dea040 by packs-sdk-sync-bot - db9b0fbdac2b216edb221c36a460a8223fc57ca2 by packs-sdk-sync-bot - 914de6a091e55584152be91494148b32f43058e2 by packs-sdk-sync-bot - 223116c16c28e6dbe505281cf82054617f1f8434 by packs-sdk-sync-bot - a2c5f4a7926c4ab3d68f7e3d6a4f1b96241d3cd2 by packs-sdk-sync-bot - fcfc98d35a839528ece12a613670920fbb82018b by packs-sdk-sync-bot - f24cd62c9bc7a7449c5672aa73ca20b16089ab49 by packs-sdk-sync-bot - f0d1783fb904fada12bc11cd14f912b939a49b8f by packs-sdk-sync-bot GitOrigin-RevId: 7ca247f2b4d379cda903d19b5b49f131d83599eb --- .claude/skills/create-agent-pack/SKILL.md | 15 +- CHANGELOG.md | 7 +- api.ts | 15 + builder.ts | 39 +- cli/agent_api.ts | 109 +++ cli/agent_chat.ts | 107 ++- cli/agent_install.ts | 7 - cli/agent_logs.ts | 19 +- cli/config_storage.ts | 94 +-- cli/index.ts | 50 +- cli/init.ts | 1 - compiled_types.ts | 29 + dist/api.d.ts | 13 + dist/builder.d.ts | 23 +- dist/builder.js | 31 + dist/bundle.d.ts | 92 ++- dist/bundle.js | 4 +- dist/cli/agent_api.d.ts | 25 + dist/cli/agent_api.js | 89 ++- dist/cli/agent_chat.d.ts | 5 +- dist/cli/agent_chat.js | 101 ++- dist/cli/agent_install.js | 30 - dist/cli/agent_logs.js | 23 +- dist/cli/config_storage.d.ts | 16 +- dist/cli/config_storage.js | 70 +- dist/cli/index.d.ts | 2 + dist/cli/index.js | 52 +- dist/cli/init.js | 1 - dist/compiled_types.d.ts | 28 +- dist/index.d.ts | 5 + dist/testing/upload_validation.d.ts | 7 + dist/testing/upload_validation.js | 226 +++++- dist/types.d.ts | 22 + .../blocks/sync-tables/indexing/schema.md | 88 +- docs/images/sync_table_indexing_citation.png | Bin 0 -> 57990 bytes .../sync_table_indexing_citation_2x.png | Bin 0 -> 106792 bytes .../sdk/core/classes/PackDefinitionBuilder.md | 2 +- docs/reference/sdk/core/functions/newPack.md | 2 +- index.ts | 5 + package.json | 1 + pnpm-lock.yaml | 16 + test/builder_test.ts | 92 +++ test/cli_headless_test.ts | 54 +- test/cli_test.ts | 249 +++++- test/config_storage_test.ts | 75 ++ test/upload_validation_test.ts | 754 +++++++++++++++++- testing/upload_validation.ts | 259 +++++- types.ts | 23 + 48 files changed, 2576 insertions(+), 401 deletions(-) create mode 100644 docs/images/sync_table_indexing_citation.png create mode 100644 docs/images/sync_table_indexing_citation_2x.png diff --git a/.claude/skills/create-agent-pack/SKILL.md b/.claude/skills/create-agent-pack/SKILL.md index 5cbe39114..26d6d0b75 100644 --- a/.claude/skills/create-agent-pack/SKILL.md +++ b/.claude/skills/create-agent-pack/SKILL.md @@ -121,17 +121,22 @@ there is no separate "save" step. Proceed when upload succeeds and reports the n ```bash npx packs validate pack.ts # single pre-upload check: schema, instructions, triggers, connector warnings -npx packs agent install pack.ts # binds the latest upload and saves the instance id +npx packs agent install pack.ts # binds the latest upload npx packs agent chat pack.ts "what can you do?" # remote run ``` Run `validate` after any edit, before uploading. For agent packs it also warns about connector pack IDs that don't resolve (when you're logged in; pass `--no-checkConnectors` to skip). Run `agent install` after uploading. It prints the agent instance id and tenant -id and saves them in `.coda-agent.json` for this directory. Run `agent chat` after that. -It uses the saved instance and polls until the reply lands (or `--timeout` expires). -Pass `--agentInstanceId` or `--tenantId` only to override. The command checks the instance -belongs to this pack. Multi-turn threads are not supported yet: every chat starts a new run. +id. Run `agent chat` after that. Chat looks up the install for this pack and polls until +the reply lands (or `--timeout` expires). Pass `--agentInstanceId` or `--tenantId` only to +override. The command checks the instance belongs to this pack. + +Consecutive prompts share one thread. Chat saves the chat id in `~/.coda-agent-chats.json` +(per user, per pack directory, never committed) and sends it on the next prompt, so a follow-up sees earlier turns. Chat prints which chat it continues and when it was last used. A chat idle for more than a day is not continued by default: chat starts a new one and prints the old id. Pass `--new` to +start a fresh thread, or `--chatId ` to continue a specific chat (its agent runs unless you +also pass `--agentInstanceId`). A chat id that is missing, not yours, or on another agent fails +with "That chat is gone"; run again with `--new`. ### 6. Set the listing name/description (UI) diff --git a/CHANGELOG.md b/CHANGELOG.md index dc6fc977f..3da115751 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,11 +4,16 @@ This changelog keeps track of all changes to the Packs SDK. We follow convention ## [Unreleased] +### Added + +- `packs agent chat` now continues the previous thread, so consecutive prompts share one chat. It saves the chat id per user in `~/.coda-agent-chats.json`, so nothing is added to your repo. Pass `--new` to start a fresh thread, or `--chatId` to continue a specific chat. A chat that no longer exists fails with a message telling you to rerun with `--new`. Requires a server that accepts `chatId`; an older server starts a new chat each time. +- `packs agent chat` now says which chat it is continuing and when it was last used. A saved chat idle for more than 24 hours is no longer continued by default. Chat starts a new one and prints `--chatId ` to go back to the old one. + ## [1.18.3] - 2026-10-15 ### Added -- `packs agent install` prints the agent instance id and tenant id, and saves them in `.coda-agent.json` for that directory. The next `packs agent chat` and `packs agent logs` in the directory use the saved ids, so you no longer copy them out of the builder URL. Pass `--agentInstanceId`, `--tenantId`, `--tenant`, or `--instance` to override. New `packs init` scaffolds ignore `.coda-agent.json`. Add that filename to `.gitignore` in directories created before this change. +- `packs agent chat` and `packs agent logs` look up the caller's install for this pack, including the tenant id. Pass `--agentInstanceId`, `--tenantId`, `--tenant`, or `--instance` only to override. `packs agent install` still prints those ids and no longer writes them to a file. `packs agent install --version` selects the uploaded pack version. - `addSuggestedPrompt()` on agents, so an agent can declare up to 3 starter prompts that show as buttons on its chat landing. Agents no longer fail validation when they define `suggestedPrompts`. ## [1.18.2] - 2026-10-14 diff --git a/api.ts b/api.ts index bda171870..def515cad 100644 --- a/api.ts +++ b/api.ts @@ -1112,12 +1112,27 @@ type V2PackFormula; + +/** + * UI configuration carried in top-level formula metadata. + * @hidden + */ +export interface PackFormulaUi { + /** References a resource descriptor's key. */ + resourceKey: string; +} + /** @hidden */ export type PackFormulaMetadata = Omit< TypedPackFormula, 'execute' | 'executeUpdate' | 'executeGetPermissions' | 'validateParameters' > & { validateParameters?: MetadataFormulaMetadata; + /** + * UI configuration for this top-level formula. + * @hidden + */ + ui?: PackFormulaUi; }; /** @hidden */ export type ObjectPackFormulaMetadata = Omit & { diff --git a/builder.ts b/builder.ts index f03a7aba6..2927ae80f 100644 --- a/builder.ts +++ b/builder.ts @@ -1,6 +1,7 @@ import type {AdminAuthentication} from './types'; import type {AdminAuthenticationDef} from './types'; import type {AgentDefinition} from './types'; +import type {AgentRoutineDefinition} from './types'; import type {AgentTool} from './types'; import type {AgentToolsDef} from './types'; import type {AllowedAuthentication} from './types'; @@ -67,7 +68,7 @@ import {wrapMetadataFunction} from './api'; * ``` */ export function newPack( - definition?: Partial>, + definition?: Partial>, ): PackDefinitionBuilder { return new PackDefinitionBuilder(definition); } @@ -196,7 +197,7 @@ export class PackDefinitionBuilder extends BaseDefinitionBuilder implements Basi * Constructs a {@link PackDefinitionBuilder}. However, `sdk.newPack()` should be used instead * rather than constructing a builder directly. */ - constructor(definition?: Partial>) { + constructor(definition?: Partial>) { super(); const { formulas, @@ -669,6 +670,7 @@ interface AgentBuilderState { agent: Partial; defaultTriggers?: DefaultTriggerDefinition[]; suggestedPrompts?: SuggestedPrompt[]; + defaultRoutines?: AgentRoutineDefinition[]; } // Off the instance: an own property leaks into the metadata, and `#private` breaks pre-ES2015 .d.ts consumers. @@ -699,6 +701,8 @@ export class AgentDefinitionBuilder extends BaseDefinitionBuilder { * See {@link PackVersionDefinition.suggestedPrompts}. Set via {@link addSuggestedPrompt}. */ declare readonly suggestedPrompts?: DeepReadonly; + /** See {@link PackVersionDefinition.defaultRoutines}. Set via {@link addDefaultRoutine}. */ + declare readonly defaultRoutines?: DeepReadonly; constructor() { super(); @@ -708,6 +712,37 @@ export class AgentDefinitionBuilder extends BaseDefinitionBuilder { Object.defineProperty(this, 'agent', {enumerable: true, get: () => state.agent}); Object.defineProperty(this, 'defaultTriggers', {enumerable: true, get: () => state.defaultTriggers}); Object.defineProperty(this, 'suggestedPrompts', {enumerable: true, get: () => state.suggestedPrompts}); + Object.defineProperty(this, 'defaultRoutines', {enumerable: true, get: () => state.defaultRoutines}); + } + + /** + * Adds a routine with its own name or instructions and one trigger. + * + * @example + * ``` + * pack.addDefaultRoutine({ + * name: 'Daily brief', + * instructions: 'Summarize overnight changes. Include source links.', + * trigger: { + * kind: sdk.DefaultTriggerKind.Schedule, + * rruleString: 'DTSTART;TZID=America/New_York:20261012T090000\nRRULE:FREQ=DAILY', + * }, + * }); + * ``` + */ + addDefaultRoutine(routine: AgentRoutineDefinition): this { + if (!routine.name?.trim() && !routine.instructions?.trim()) { + throw new Error('A routine needs a name or instructions containing non-whitespace text.'); + } + if (routine.trigger.kind === DefaultTriggerKind.Schedule) { + const message = validateRRuleString(routine.trigger.rruleString); + if (message) { + throw new Error(message); + } + } + const state = stateOf(this); + state.defaultRoutines = frozenCopy([...(state.defaultRoutines ?? []), routine]); + return this; } /** diff --git a/cli/agent_api.ts b/cli/agent_api.ts index 05215c0df..e7d0f32fb 100644 --- a/cli/agent_api.ts +++ b/cli/agent_api.ts @@ -117,3 +117,112 @@ export async function postAgentRoute(route: string, args: PostAgentRouteArgs, bo } return response; } + +export interface InstalledAgent { + agentInstanceId: string; + tenantId: string; +} + +export type InstalledAgentLookup = + | {status: 'found'; agent: InstalledAgent} + | {status: 'missing'} + | {status: 'unavailable'} + | {status: 'error'; message: string}; + +export function buildInstalledAgentUrl(apiEndpoint: string, packId: number): string { + return `${formatEndpoint(apiEndpoint)}/apis/v1/packs/${packId}/agentInstance`; +} + +export function codaTypeOf(bodyText: string): string | undefined { + let parsed: unknown; + try { + parsed = JSON.parse(bodyText); + } catch { + return undefined; + } + if (typeof parsed !== 'object' || parsed === null) { + return undefined; + } + const codaType = (parsed as {codaType?: unknown}).codaType; + return typeof codaType === 'string' ? codaType : undefined; +} + +function lookupError(message: string): InstalledAgentLookup { + return {status: 'error', message}; +} + +export async function lookupInstalledAgent(args: { + apiToken: string; + apiEndpoint: string; + packId: number; +}): Promise { + const url = buildInstalledAgentUrl(args.apiEndpoint, args.packId); + let response: Response; + try { + response = await fetch(url, { + method: 'GET', + headers: {Authorization: `Bearer ${args.apiToken}`}, + signal: AbortSignal.timeout(30000), + }); + } catch (err: any) { + const errors = [`Error while looking up the installed agent: ${err}`, tryParseSystemError(err)]; + return lookupError(errors.join('\n')); + } + + const bodyText = await response.text(); + if (response.status === 404 && !isApiErrorBody(bodyText)) { + return {status: 'unavailable'}; + } + if (response.status === 404 && codaTypeOf(bodyText) === 'AgentInstanceNotFound') { + return {status: 'missing'}; + } + if (response.status === 404) { + return lookupError('Could not look up the installed agent.'); + } + if (!response.ok) { + return lookupError(`Could not look up the installed agent: ${response.status} ${response.statusText}`); + } + + let parsed: unknown; + try { + parsed = JSON.parse(bodyText); + } catch (err: any) { + return lookupError(`Installed agent lookup failed: the server response was not JSON. ${err}`); + } + const record = parsed as {agentInstanceId?: unknown; tenantId?: unknown}; + if (typeof record.agentInstanceId !== 'string' || record.agentInstanceId.trim() === '') { + return lookupError('Installed agent lookup failed: the server response did not include an agent instance id.'); + } + if (typeof record.tenantId !== 'string' || record.tenantId.trim() === '') { + return lookupError('Installed agent lookup failed: the server response did not include a tenant id.'); + } + return { + status: 'found', + agent: {agentInstanceId: record.agentInstanceId, tenantId: record.tenantId}, + }; +} + +export function installedAgentLookupError( + lookup: Exclude, + kind: 'chat' | 'logs', +): string { + if (lookup.status === 'error') { + return lookup.message; + } + if (lookup.status === 'unavailable') { + const override = kind === 'chat' ? '--agentInstanceId' : '--tenant and --instance'; + return `The installed-agent lookup is not available on this server yet.\n Pass ${override}.`; + } + if (kind === 'chat') { + return ( + 'Error: agent chat needs an installed agent instance.\n' + + ' packs agent install pack.ts\n' + + ' Or pass --agentInstanceId.' + ); + } + return ( + 'Error: agent logs need a tenant and an agent instance.\n' + + ' packs agent install pack.ts\n' + + ' Or pass --tenant and --instance.' + ); +} diff --git a/cli/agent_chat.ts b/cli/agent_chat.ts index 606dded91..a8f3c70d5 100644 --- a/cli/agent_chat.ts +++ b/cli/agent_chat.ts @@ -1,11 +1,16 @@ import type {ArgumentsCamelCase} from 'yargs'; import {assertApiToken} from './helpers'; import {assertPackId} from './helpers'; +import {clearAgentChat} from './config_storage'; +import {codaTypeOf} from './agent_api'; import {formatEndpoint} from './helpers'; -import {getAgentInstall} from './config_storage'; +import {getAgentChat} from './config_storage'; +import {installedAgentLookupError} from './agent_api'; +import {lookupInstalledAgent} from './agent_api'; import * as path from 'path'; import {print} from '../testing/helpers'; import {printAndExit} from '../testing/helpers'; +import {storeAgentChat} from './config_storage'; import {tryParseSystemError} from './errors'; export interface AgentChatArgs { @@ -13,6 +18,8 @@ export interface AgentChatArgs { prompt: string; agentInstanceId?: string; tenantId?: string; + chatId?: string; + new?: boolean; timeout?: number; apiToken?: string; apiEndpoint: string; @@ -43,6 +50,8 @@ interface StatusResponse { } const DEFAULT_TIMEOUT_SECS = 120; +// A saved chat idle longer than this is not continued unless asked for with --chatId. +const STALE_CHAT_MS = 24 * 60 * 60 * 1000; const POLL_INTERVAL_MS = 2000; const MAX_BACKOFF_MS = 10000; @@ -112,16 +121,35 @@ export function describeRunReason(status: 'failed' | 'needs_input', reason: stri } } -// Every completed assistant text, oldest first. A run that writes, calls a -// tool, then wraps up reads like the browser transcript, not just the tail. +// Every completed assistant text of the latest turn, oldest first. A run that writes, calls a +// tool, then wraps up reads like the browser transcript. Messages carry no execution id, so the +// turn starts after the last user message. minimal: if that message fell outside the fetched tail, all of it is used. export function joinAssistantTexts(messages: AgentChatMessage[]): string | undefined { - const texts = messages + const ordered = [...messages].sort((left, right) => + left.createdAt < right.createdAt ? -1 : left.createdAt > right.createdAt ? 1 : 0, + ); + const lastUser = ordered.map(message => message.messageType).lastIndexOf('user'); + const texts = ordered + .slice(lastUser + 1) .filter(message => message.messageType === 'assistant' && message.isComplete && message.text) - .sort((left, right) => (left.createdAt < right.createdAt ? -1 : left.createdAt > right.createdAt ? 1 : 0)) .map(message => message.text); return texts.length > 0 ? texts.join('\n\n') : undefined; } +export function describeAge(ms: number): string { + const minutes = Math.floor(ms / 60000); + if (minutes < 1) { + return 'just now'; + } + const [value, unit] = + minutes < 60 + ? [minutes, 'minute'] + : minutes < 60 * 24 + ? [Math.floor(minutes / 60), 'hour'] + : [Math.floor(minutes / (60 * 24)), 'day']; + return `${value} ${unit}${value === 1 ? '' : 's'} ago`; +} + export function nextBackoffMs(failedAttempts: number): number { return Math.min(1000 * 2 ** failedAttempts, MAX_BACKOFF_MS); } @@ -181,6 +209,8 @@ export async function handleAgentChat({ prompt, agentInstanceId: agentInstanceIdFlag, tenantId: tenantIdFlag, + chatId: chatIdFlag, + new: startNewChat, timeout, apiToken, apiEndpoint, @@ -189,13 +219,40 @@ export async function handleAgentChat({ const formattedEndpoint = formatEndpoint(apiEndpoint); apiToken = assertApiToken(apiEndpoint, apiToken); const packId = assertPackId(manifestDir, apiEndpoint); - const agentInstanceId = agentInstanceIdFlag || getAgentInstall(manifestDir, apiEndpoint)?.agentInstanceId; - if (!agentInstanceId) { - return printAndExit( - 'Error: agent chat needs an installed agent instance.\n' + - ' packs agent install pack.ts\n' + - ' Or pass --agentInstanceId.', - ); + if (startNewChat && chatIdFlag) { + return printAndExit('Pass --new or --chatId, not both.'); + } + let agentInstanceId = agentInstanceIdFlag; + // An explicit chat id names its own agent on the server, so it needs no install lookup. + if (!agentInstanceId && !chatIdFlag) { + const lookup = await lookupInstalledAgent({apiToken, apiEndpoint, packId}); + if (lookup.status !== 'found') { + return printAndExit(installedAgentLookupError(lookup, 'chat')); + } + agentInstanceId = lookup.agent.agentInstanceId; + } + // Continue the last thread for this install unless asked to start over or to use another chat. + let resumeChatId = chatIdFlag; + let resumingSavedChat = false; + let resumeNotice = resumeChatId ? `Continuing chat ${resumeChatId}.` : undefined; + if (!resumeChatId && !startNewChat) { + const saved = getAgentChat(manifestDir, apiEndpoint); + if (saved && saved.agentInstanceId === agentInstanceId) { + const idleMs = saved.lastUsedAt ? Date.now() - Date.parse(saved.lastUsedAt) : undefined; + if (idleMs !== undefined && idleMs > STALE_CHAT_MS) { + print( + `Your last chat was used ${describeAge(idleMs)}, so this starts a new one. ` + + `Pass --chatId ${saved.chatId} to continue the old chat.`, + ); + } else { + resumeChatId = saved.chatId; + resumingSavedChat = true; + resumeNotice = + `Continuing chat ${saved.chatId}` + + (idleMs === undefined ? '' : `, last used ${describeAge(idleMs)}`) + + '. Pass --new to start a new chat.'; + } + } } const headers = {Authorization: `Bearer ${apiToken}`, 'Content-Type': 'application/json'}; const timeoutSecs = timeout ?? DEFAULT_TIMEOUT_SECS; @@ -205,7 +262,11 @@ export async function handleAgentChat({ const triggerResponse = await fetch(buildTriggerAgentUrl(apiEndpoint), { method: 'POST', headers, - body: JSON.stringify({input: prompt, agentInstanceId}), + body: JSON.stringify({ + input: prompt, + ...(agentInstanceId ? {agentInstanceId} : {}), + ...(resumeChatId ? {chatId: resumeChatId} : {}), + }), signal: AbortSignal.timeout(30000), }); if (!triggerResponse.ok) { @@ -216,6 +277,16 @@ export async function handleAgentChat({ 'It ships with the agent runtime API — upgrade the server or verify in the browser agent directory.', ); } + if (triggerResponse.status === 404 && codaTypeOf(bodyText) === 'ChatNotFound') { + if (resumingSavedChat) { + clearAgentChat(manifestDir, apiEndpoint); + } + return printAndExit( + 'That chat is gone, or it is not yours or not on this agent.\n' + + (resumingSavedChat ? ' The saved chat was cleared. ' : ' ') + + 'Start a new one with --new.', + ); + } if (triggerResponse.status === 404) { return printAndExit( 'Agent not found or agent triggering is not enabled.\n' + @@ -233,6 +304,8 @@ export async function handleAgentChat({ return printAndExit(errors.join('\n')); } const {executionId, chatId} = triggerBody; + // The server names the agent when only a chat id was sent. + agentInstanceId = triggerBody.agentInstanceId; if (triggerBody.packId !== packId) { return printAndExit( `Agent instance ${agentInstanceId} belongs to pack ${triggerBody.packId}, not pack ${packId}.\n` + @@ -242,6 +315,14 @@ export async function handleAgentChat({ ); } const tenantId = tenantIdFlag ?? triggerBody.tenantId; + try { + storeAgentChat(manifestDir, apiEndpoint, {agentInstanceId, chatId}); + } catch (err: unknown) { + print(`Note: could not save the chat id, so the next prompt starts a new chat. ${err}`); + } + if (resumeNotice) { + print(resumeNotice); + } print(`Run queued for pack ${packId} (execution ${executionId}). Waiting for a reply…`); const deadlineMs = Date.now() + timeoutSecs * 1000; diff --git a/cli/agent_install.ts b/cli/agent_install.ts index f3ae62482..8ec79c7a0 100644 --- a/cli/agent_install.ts +++ b/cli/agent_install.ts @@ -1,12 +1,10 @@ import type {ArgumentsCamelCase} from 'yargs'; import {buildAgentRouteUrl} from './agent_api'; import {confirmOrFail} from './confirm'; -import * as path from 'path'; import {postAgentRoute} from './agent_api'; import {print} from '../testing/helpers'; import {printAndExit} from '../testing/helpers'; import {resolveAgentContext} from './agent_api'; -import {storeAgentInstall} from './config_storage'; export interface AgentInstallArgs { manifestPath: string; @@ -145,11 +143,6 @@ export async function handleAgentInstall({ return printAndExit('Agent install failed: the server response did not include an agent instance id.'); } - storeAgentInstall(path.dirname(manifestPath), apiEndpoint, { - packId, - agentInstanceId: install.agentInstanceId, - ...(install.tenantId ? {tenantId: install.tenantId} : {}), - }); print( formatInstallResult({ reinstall: reinstall ?? false, diff --git a/cli/agent_logs.ts b/cli/agent_logs.ts index 516550851..6519676ed 100644 --- a/cli/agent_logs.ts +++ b/cli/agent_logs.ts @@ -6,8 +6,9 @@ import {assertPackId} from './helpers'; import {createCodaClient} from './helpers'; import {formatEndpoint} from './helpers'; import {formatResponseError} from './errors'; -import {getAgentInstall} from './config_storage'; +import {installedAgentLookupError} from './agent_api'; import {isResponseError} from '../helpers/external-api/coda'; +import {lookupInstalledAgent} from './agent_api'; import * as path from 'path'; import {print} from '../testing/helpers'; import {printAndExit} from '../testing/helpers'; @@ -92,9 +93,19 @@ export async function handleAgentLogs({ const formattedEndpoint = formatEndpoint(apiEndpoint); apiToken = assertApiToken(apiEndpoint, apiToken); const packId = assertPackId(manifestDir, apiEndpoint); - const saved = tenant && instance ? undefined : getAgentInstall(manifestDir, apiEndpoint); - const tenantId = tenant || saved?.tenantId; - const instanceId = instance || saved?.agentInstanceId; + if (Boolean(tenant) !== Boolean(instance)) { + return missingIdentityError(); + } + let tenantId = tenant; + let instanceId = instance; + if (!tenantId && !instanceId) { + const lookup = await lookupInstalledAgent({apiToken, apiEndpoint, packId}); + if (lookup.status !== 'found') { + return printAndExit(installedAgentLookupError(lookup, 'logs')); + } + tenantId = lookup.agent.tenantId; + instanceId = lookup.agent.agentInstanceId; + } if (!tenantId || !instanceId) { return missingIdentityError(); } diff --git a/cli/config_storage.ts b/cli/config_storage.ts index 7b6a68ceb..8045cb86f 100644 --- a/cli/config_storage.ts +++ b/cli/config_storage.ts @@ -1,4 +1,5 @@ import {TimerShimStrategy} from '../testing/compile'; +import * as os from 'os'; import * as path from 'path'; import {readJSONFile} from '../testing/helpers'; import urlParse from 'url-parse'; @@ -10,7 +11,7 @@ export const DEFAULT_GIT_TAG = false; const API_KEY_FILE_NAME = '.coda.json'; export const PACK_ID_FILE_NAME = '.coda-pack.json'; -export const AGENT_INSTALL_FILE_NAME = '.coda-agent.json'; +const AGENT_CHATS_FILE_NAME = '.coda-agent-chats.json'; export interface ApiKeyFile { apiKey: string; @@ -38,6 +39,13 @@ export interface PackOptions { [DeprecatedPackOptionKey.enableGitTags]?: boolean; } +export interface AgentChatState { + agentInstanceId: string; + chatId: string; + // ISO time of the last prompt. Entries saved before this field existed have none. + lastUsedAt?: string; +} + export interface PackIdFile { packId: number; options?: PackOptions; @@ -45,18 +53,6 @@ export interface PackIdFile { environmentPackIds?: {[host: string]: number}; } -export interface StoredAgentInstall { - packId: number; - agentInstanceId: string; - tenantId?: string; -} - -interface AgentInstallFile { - agentInstall?: StoredAgentInstall; - // Codan-only overrides for storing installs against other environments. - environmentAgentInstalls?: {[host: string]: StoredAgentInstall}; -} - function isDefaultApiEndpoint(apiEndpoint: string): boolean { return apiEndpoint === DEFAULT_API_ENDPOINT; } @@ -125,37 +121,6 @@ export function getPackId(manifestDir: string, codaApiEndpoint: string): number } } -export function storeAgentInstall(manifestDir: string, codaApiEndpoint: string, install: StoredAgentInstall): void { - const fileContents: AgentInstallFile = readAgentInstallFile(manifestDir) || {}; - if (isDefaultApiEndpoint(codaApiEndpoint)) { - fileContents.agentInstall = install; - } else { - const {host} = urlParse(codaApiEndpoint); - fileContents.environmentAgentInstalls = fileContents.environmentAgentInstalls || {}; - fileContents.environmentAgentInstalls[host] = install; - } - writeAgentInstallFile(manifestDir, fileContents); -} - -// Returns the install only when it belongs to the pack id stored for this directory -// and endpoint. A later `create` in the same directory must not reuse a stale instance. -export function getAgentInstall(manifestDir: string, codaApiEndpoint: string): StoredAgentInstall | undefined { - const fileContents = readAgentInstallFile(manifestDir); - if (!fileContents) { - return; - } - const install = isDefaultApiEndpoint(codaApiEndpoint) - ? fileContents.agentInstall - : fileContents.environmentAgentInstalls?.[urlParse(codaApiEndpoint).host]; - if (!install?.agentInstanceId) { - return; - } - if (getPackId(manifestDir, codaApiEndpoint) !== install.packId) { - return; - } - return install; -} - // Merges new options with existing ones, if any. export function storePackOptions(manifestDir: string, options: PackOptions): void { const fileContents: PackIdFile = readPackIdFile(manifestDir) || {packId: -1}; @@ -168,6 +133,39 @@ export function getPackOptions(manifestDir: string): PackOptions | undefined { return fileContents?.options; } +// Chat ids are per-user state, so they live in the home directory. .coda-pack.json is committed with the pack. +function agentChatsFile(): string { + return path.join(os.homedir(), AGENT_CHATS_FILE_NAME); +} + +function agentChatKey(manifestDir: string, codaApiEndpoint: string): string { + return `${urlParse(codaApiEndpoint).host}|${path.resolve(manifestDir)}`; +} + +function readAgentChats(): {[key: string]: AgentChatState} { + return readJSONFile(agentChatsFile()) || {}; +} + +export function getAgentChat(manifestDir: string, codaApiEndpoint: string): AgentChatState | undefined { + return readAgentChats()[agentChatKey(manifestDir, codaApiEndpoint)]; +} + +export function storeAgentChat( + manifestDir: string, + codaApiEndpoint: string, + chat: Omit, +): void { + const entry: AgentChatState = {...chat, lastUsedAt: new Date().toISOString()}; + writeJSONFile(agentChatsFile(), {...readAgentChats(), [agentChatKey(manifestDir, codaApiEndpoint)]: entry}, 0o600); +} + +export function clearAgentChat(manifestDir: string, codaApiEndpoint: string): void { + const {[agentChatKey(manifestDir, codaApiEndpoint)]: removed, ...rest} = readAgentChats(); + if (removed) { + writeJSONFile(agentChatsFile(), rest, 0o600); + } +} + function readPackIdFile(manifestDir: string): PackIdFile | undefined { const filename = path.join(manifestDir, PACK_ID_FILE_NAME); return readJSONFile(filename); @@ -177,11 +175,3 @@ function writePacksFile(manifestDir: string, fileContents: PackIdFile): void { const filename = path.join(manifestDir, PACK_ID_FILE_NAME); writeJSONFile(filename, fileContents); } - -function readAgentInstallFile(manifestDir: string): AgentInstallFile | undefined { - return readJSONFile(path.join(manifestDir, AGENT_INSTALL_FILE_NAME)); -} - -function writeAgentInstallFile(manifestDir: string, fileContents: AgentInstallFile): void { - writeJSONFile(path.join(manifestDir, AGENT_INSTALL_FILE_NAME), fileContents); -} diff --git a/cli/index.ts b/cli/index.ts index 2e4366a8f..338c03dec 100644 --- a/cli/index.ts +++ b/cli/index.ts @@ -75,6 +75,7 @@ const CommandExamples: Record> = { whoami: [['$0 whoami', 'Print the account and token currently registered.']], agent: [ ['$0 agent chat pack.ts "what can you do?"', 'Run your installed agent and print its reply.'], + ['$0 agent chat pack.ts --new "start over"', 'Start a new chat instead of continuing the last one.'], ['$0 agent install pack.ts', 'Install the latest uploaded agent version to your account.'], ['$0 agent logs pack.ts', 'Show recent logs for the installed agent.'], ], @@ -106,6 +107,24 @@ const CommandExamples: Record> = { ], }; +export function buildAgentInstallCommand(argv: Argv): Argv { + // `--version` is the pack version. yargs treats that name as its own version flag unless this runs first. + return argv.version(false).options({ + version: { + string: true, + desc: 'Agent version to install. Defaults to the latest upload.', + }, + reinstall: { + boolean: true, + default: false, + desc: 'Rebind even if already installed. Needed after changing tools or triggers.', + }, + yes: YesArg, + apiToken: ApiTokenArg, + apiEndpoint: ApiEndpointArg, + }); +} + function withExamples(argv: Argv, examples: Array<[string, string]>): Argv { for (const [command, description] of examples) { argv.example(command, description); @@ -243,12 +262,22 @@ export const commands: yargs.CommandModule[] = [ builder: { agentInstanceId: { string: true, - desc: 'Installed agent instance to run. Defaults to the instance saved by packs agent install.', + desc: "Installed agent instance to run. Defaults to this pack's install for the caller.", }, tenantId: { string: true, desc: 'Brain tenant id for the agent install. Defaults to the trigger response.', }, + chatId: { + string: true, + conflicts: 'new', + desc: 'Continue this chat instead of the last one. Its agent runs unless --agentInstanceId is set.', + }, + new: { + boolean: true, + conflicts: 'chatId', + desc: 'Start a new chat instead of continuing the last one.', + }, timeout: { number: true, default: 120, @@ -262,20 +291,7 @@ export const commands: yargs.CommandModule[] = [ .command({ command: 'install ', describe: 'Install an uploaded agent version to your account', - builder: { - version: { - string: true, - desc: 'Agent version to install. Defaults to the latest upload.', - }, - reinstall: { - boolean: true, - default: false, - desc: 'Rebind even if already installed. Needed after changing tools or triggers.', - }, - yes: YesArg, - apiToken: ApiTokenArg, - apiEndpoint: ApiEndpointArg, - }, + builder: buildAgentInstallCommand, handler: handleAgentInstall as any, }) .command({ @@ -284,11 +300,11 @@ export const commands: yargs.CommandModule[] = [ builder: { tenant: { string: true, - desc: 'Tenant id owning the agent instance. Defaults to the install saved by packs agent install.', + desc: "Tenant id owning the agent instance. Defaults to the caller's tenant for this pack.", }, instance: { string: true, - desc: 'Agent instance id. Defaults to the instance saved by packs agent install.', + desc: "Agent instance id. Defaults to this pack's install for the caller.", }, session: { string: true, diff --git a/cli/init.ts b/cli/init.ts index ebbfd34bc..fb23f3c85 100644 --- a/cli/init.ts +++ b/cli/init.ts @@ -10,7 +10,6 @@ const PacksExamplesDirectory = 'node_modules/@codahq/packs-examples'; const GitIgnore = `.coda.json .coda-credentials.json -.coda-agent.json `; function updateMoldSourceMap() { diff --git a/compiled_types.ts b/compiled_types.ts index 1ae24d307..aeeaa44b6 100644 --- a/compiled_types.ts +++ b/compiled_types.ts @@ -111,6 +111,24 @@ export interface AuthenticationMetadataTypeMap { [AuthenticationType.EntraCertificate]: AuthenticationToMetadata; } +/** + * Resource descriptor carried in versioned Pack metadata. + * @hidden + */ +export interface PackResource { + key: string; + mimeType: 'text/html;profile=mcp-app'; +} + +/** + * Resource body submitted separately from metadata. + * @hidden + */ +export interface PackResourceArtifact { + resourceKey: string; + content: string; +} + // Stripped-down version of `PackVersionDefinition` that doesn't contain formula definitions. /** @hidden */ export type PackVersionMetadata = Omit< @@ -118,6 +136,11 @@ export type PackVersionMetadata = Omit< 'formulas' | 'formats' | 'defaultAuthentication' | 'syncTables' > & { formulas: PackFormulaMetadata[]; + /** + * Shared resources for top-level formula UIs. + * @hidden + */ + resources?: PackResource[]; formats: PackFormatMetadata[]; syncTables: PackSyncTable[]; defaultAuthentication?: AuthenticationMetadata; @@ -172,6 +195,7 @@ type BasePackVersionMetadata = Omit< | 'skills' | 'agent' | 'defaultTriggers' + | 'defaultRoutines' >; // Further stripped-down version of `PackVersionMetadata` that contains only what the browser needs. @@ -227,6 +251,11 @@ export interface PackUpload { // all the feature's we're relying on from legacy pack defs like quotas // have been migrated or retired. metadata: PackVersionMetadata | PackMetadata; + /** + * Resource bodies submitted separately from metadata. + * @hidden + */ + resourceArtifacts?: PackResourceArtifact[]; sdkVersion: string; bundle: string; sourceMap: string; diff --git a/dist/api.d.ts b/dist/api.d.ts index 496445ecf..d6f04c478 100644 --- a/dist/api.d.ts +++ b/dist/api.d.ts @@ -616,9 +616,22 @@ export type Formula; +/** + * UI configuration carried in top-level formula metadata. + * @hidden + */ +export interface PackFormulaUi { + /** References a resource descriptor's key. */ + resourceKey: string; +} /** @hidden */ export type PackFormulaMetadata = Omit & { validateParameters?: MetadataFormulaMetadata; + /** + * UI configuration for this top-level formula. + * @hidden + */ + ui?: PackFormulaUi; }; /** @hidden */ export type ObjectPackFormulaMetadata = Omit & { diff --git a/dist/builder.d.ts b/dist/builder.d.ts index 8cccaae52..db10185e0 100644 --- a/dist/builder.d.ts +++ b/dist/builder.d.ts @@ -1,6 +1,7 @@ import type { AdminAuthentication } from './types'; import type { AdminAuthenticationDef } from './types'; import type { AgentDefinition } from './types'; +import type { AgentRoutineDefinition } from './types'; import type { AgentToolsDef } from './types'; import type { Authentication } from './types'; import type { BasicPackDefinition } from './types'; @@ -45,7 +46,7 @@ import type { WhileWritingTriggerDefinition } from './types'; * pack.setUserAuthentication({type: AuthenticationType.HeaderBearerToken}); * ``` */ -export declare function newPack(definition?: Partial>): PackDefinitionBuilder; +export declare function newPack(definition?: Partial>): PackDefinitionBuilder; /** * Creates a new skeleton agent definition that can be added to. * @@ -157,7 +158,7 @@ export declare class PackDefinitionBuilder extends BaseDefinitionBuilder impleme * Constructs a {@link PackDefinitionBuilder}. However, `sdk.newPack()` should be used instead * rather than constructing a builder directly. */ - constructor(definition?: Partial>); + constructor(definition?: Partial>); /** * Adds a formula definition to this pack. * @@ -441,7 +442,25 @@ export declare class AgentDefinitionBuilder extends BaseDefinitionBuilder { * See {@link PackVersionDefinition.suggestedPrompts}. Set via {@link addSuggestedPrompt}. */ readonly suggestedPrompts?: DeepReadonly; + /** See {@link PackVersionDefinition.defaultRoutines}. Set via {@link addDefaultRoutine}. */ + readonly defaultRoutines?: DeepReadonly; constructor(); + /** + * Adds a routine with its own name or instructions and one trigger. + * + * @example + * ``` + * pack.addDefaultRoutine({ + * name: 'Daily brief', + * instructions: 'Summarize overnight changes. Include source links.', + * trigger: { + * kind: sdk.DefaultTriggerKind.Schedule, + * rruleString: 'DTSTART;TZID=America/New_York:20261012T090000\nRRULE:FREQ=DAILY', + * }, + * }); + * ``` + */ + addDefaultRoutine(routine: AgentRoutineDefinition): this; /** * Sets this agent's instructions. * diff --git a/dist/builder.js b/dist/builder.js index 6fa69d589..f91d929e8 100644 --- a/dist/builder.js +++ b/dist/builder.js @@ -510,6 +510,37 @@ class AgentDefinitionBuilder extends BaseDefinitionBuilder { Object.defineProperty(this, 'agent', { enumerable: true, get: () => state.agent }); Object.defineProperty(this, 'defaultTriggers', { enumerable: true, get: () => state.defaultTriggers }); Object.defineProperty(this, 'suggestedPrompts', { enumerable: true, get: () => state.suggestedPrompts }); + Object.defineProperty(this, 'defaultRoutines', { enumerable: true, get: () => state.defaultRoutines }); + } + /** + * Adds a routine with its own name or instructions and one trigger. + * + * @example + * ``` + * pack.addDefaultRoutine({ + * name: 'Daily brief', + * instructions: 'Summarize overnight changes. Include source links.', + * trigger: { + * kind: sdk.DefaultTriggerKind.Schedule, + * rruleString: 'DTSTART;TZID=America/New_York:20261012T090000\nRRULE:FREQ=DAILY', + * }, + * }); + * ``` + */ + addDefaultRoutine(routine) { + var _a, _b, _c; + if (!((_a = routine.name) === null || _a === void 0 ? void 0 : _a.trim()) && !((_b = routine.instructions) === null || _b === void 0 ? void 0 : _b.trim())) { + throw new Error('A routine needs a name or instructions containing non-whitespace text.'); + } + if (routine.trigger.kind === types_2.DefaultTriggerKind.Schedule) { + const message = (0, rrule_validation_1.validateRRuleString)(routine.trigger.rruleString); + if (message) { + throw new Error(message); + } + } + const state = stateOf(this); + state.defaultRoutines = frozenCopy([...((_c = state.defaultRoutines) !== null && _c !== void 0 ? _c : []), routine]); + return this; } /** * Sets this agent's instructions. diff --git a/dist/bundle.d.ts b/dist/bundle.d.ts index 7580a9f2e..479f521d3 100644 --- a/dist/bundle.d.ts +++ b/dist/bundle.d.ts @@ -3621,9 +3621,22 @@ export type Formula; +/** + * UI configuration carried in top-level formula metadata. + * @hidden + */ +export interface PackFormulaUi { + /** References a resource descriptor's key. */ + resourceKey: string; +} /** @hidden */ export type PackFormulaMetadata = Omit & { validateParameters?: MetadataFormulaMetadata; + /** + * UI configuration for this top-level formula. + * @hidden + */ + ui?: PackFormulaUi; }; /** @hidden */ export type ObjectPackFormulaMetadata = Omit & { @@ -6631,6 +6644,21 @@ export type EventTriggerDefinition = MailEventTriggerDefinition | NotetakerEvent * @hidden */ export type DefaultTriggerDefinition = EventTriggerDefinition | ScheduleTriggerDefinition | WhileWritingTriggerDefinition; +/** + * A named action or instruction that runs when its trigger fires. + * At least one of `name` or `instructions` must contain non-whitespace text. + * + * @internal + * @hidden + */ +export interface AgentRoutineDefinition { + /** The routine's label in the agent builder. Max 80 characters. */ + name?: string; + /** Instructions added to the agent's base instructions for this routine's run. Max 20,000 characters. */ + instructions?: string; + /** The single trigger this routine runs on. Shares limits with plain default triggers. */ + trigger: DefaultTriggerDefinition; +} /** * The definition of the contents of a Pack at a specific version. This is the * heart of the implementation of a Pack. @@ -6744,6 +6772,13 @@ export interface PackVersionDefinition { * @hidden */ defaultTriggers?: DefaultTriggerDefinition[]; + /** + * The routines this agent ships with. Authored via `sdk.newAgent().addDefaultRoutine()`. + * + * @internal + * @hidden + */ + defaultRoutines?: AgentRoutineDefinition[]; } /** * @deprecated use `#PackVersionDefinition` @@ -6811,7 +6846,7 @@ export declare enum HttpStatusCode { * pack.setUserAuthentication({type: AuthenticationType.HeaderBearerToken}); * ``` */ -export declare function newPack(definition?: Partial>): PackDefinitionBuilder; +export declare function newPack(definition?: Partial>): PackDefinitionBuilder; /** * Creates a new skeleton agent definition that can be added to. * @@ -6917,7 +6952,7 @@ export declare class PackDefinitionBuilder extends BaseDefinitionBuilder impleme * Constructs a {@link PackDefinitionBuilder}. However, `sdk.newPack()` should be used instead * rather than constructing a builder directly. */ - constructor(definition?: Partial>); + constructor(definition?: Partial>); /** * Adds a formula definition to this pack. * @@ -7195,7 +7230,25 @@ declare class AgentDefinitionBuilder extends BaseDefinitionBuilder { * See {@link PackVersionDefinition.suggestedPrompts}. Set via {@link addSuggestedPrompt}. */ readonly suggestedPrompts?: DeepReadonly; + /** See {@link PackVersionDefinition.defaultRoutines}. Set via {@link addDefaultRoutine}. */ + readonly defaultRoutines?: DeepReadonly; constructor(); + /** + * Adds a routine with its own name or instructions and one trigger. + * + * @example + * ``` + * pack.addDefaultRoutine({ + * name: 'Daily brief', + * instructions: 'Summarize overnight changes. Include source links.', + * trigger: { + * kind: sdk.DefaultTriggerKind.Schedule, + * rruleString: 'DTSTART;TZID=America/New_York:20261012T090000\nRRULE:FREQ=DAILY', + * }, + * }); + * ``` + */ + addDefaultRoutine(routine: AgentRoutineDefinition): this; /** * Sets this agent's instructions. * @@ -7340,9 +7393,30 @@ export type AuthenticationMetadata = DistributiveOmit & { formulas: PackFormulaMetadata[]; + /** + * Shared resources for top-level formula UIs. + * @hidden + */ + resources?: PackResource[]; formats: PackFormatMetadata[]; syncTables: PackSyncTable[]; defaultAuthentication?: AuthenticationMetadata; @@ -7367,7 +7441,7 @@ export type ExternalPackFormatMetadata = PackFormatMetadata; export type ExternalSyncTable = PackSyncTable; /** @hidden */ export type ExternalSkill = SkillMetadata; -export type BasePackVersionMetadata = Omit; +export type BasePackVersionMetadata = Omit; /** @hidden */ export interface ExternalPackVersionMetadata extends BasePackVersionMetadata { authentication: { @@ -7396,6 +7470,18 @@ export interface ExternalPackVersionMetadata extends BasePackVersionMetadata { } /** @hidden */ export type ExternalPackMetadata = ExternalPackVersionMetadata & Pick; +/** @hidden */ +export interface PackUpload { + metadata: PackVersionMetadata | PackMetadata; + /** + * Resource bodies submitted separately from metadata. + * @hidden + */ + resourceArtifacts?: PackResourceArtifact[]; + sdkVersion: string; + bundle: string; + sourceMap: string; +} /** * Helper to create a new URL by appending parameters to a base URL. * diff --git a/dist/bundle.js b/dist/bundle.js index 50f1a2fec..92ada0ff8 100644 --- a/dist/bundle.js +++ b/dist/bundle.js @@ -1,7 +1,7 @@ -"use strict";var ki=Object.create;var ke=Object.defineProperty;var wi=Object.getOwnPropertyDescriptor;var Ri=Object.getOwnPropertyNames;var Mi=Object.getPrototypeOf,Ii=Object.prototype.hasOwnProperty;var i=(t,e)=>ke(t,"name",{value:e,configurable:!0});var P=(t,e)=>()=>{try{return e||t((e={exports:{}}).exports,e),e.exports}catch(r){throw e=0,r}},_i=(t,e)=>{for(var r in e)ke(t,r,{get:e[r],enumerable:!0})},Dn=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of Ri(e))!Ii.call(t,a)&&a!==r&&ke(t,a,{get:()=>e[a],enumerable:!(n=wi(e,a))||n.enumerable});return t};var Ze=(t,e,r)=>(r=t!=null?ki(Mi(t)):{},Dn(e||!t||!t.__esModule?ke(r,"default",{value:t,enumerable:!0}):r,t)),Ni=t=>Dn(ke({},"__esModule",{value:!0}),t);var wn=P((cm,kn)=>{var Ui=i(t=>t[0].toLocaleUpperCase()+t.slice(1),"titlecase");kn.exports=t=>{if(t==null||typeof t.toString!="function")return"";let e=t.toString().trim();if(e==="")return"";if(e.length===1)return e.toLocaleUpperCase();let r=e.match(/[a-zA-Z0-9]+/g);return r?r.map(n=>Ui(n)).join(""):e}});var Vn=P((Sm,mt)=>{var Gi=(function(){"use strict";function t(y,c){return c!=null&&y instanceof c}i(t,"_instanceof");var e;try{e=Map}catch{e=i(function(){},"nativeMap")}var r;try{r=Set}catch{r=i(function(){},"nativeSet")}var n;try{n=Promise}catch{n=i(function(){},"nativePromise")}function a(y,c,f,l,T){typeof c=="object"&&(f=c.depth,l=c.prototype,T=c.includeNonEnumerable,c=c.circular);var b=[],x=[],g=typeof Buffer<"u";typeof c>"u"&&(c=!0),typeof f>"u"&&(f=1/0);function v(d,S){if(d===null)return null;if(S===0)return d;var h,D;if(typeof d!="object")return d;if(t(d,e))h=new e;else if(t(d,r))h=new r;else if(t(d,n))h=new n(function(A,N){d.then(function(M){A(v(M,S-1))},function(M){N(v(M,S-1))})});else if(a.__isArray(d))h=[];else if(a.__isRegExp(d))h=new RegExp(d.source,u(d)),d.lastIndex&&(h.lastIndex=d.lastIndex);else if(a.__isDate(d))h=new Date(d.getTime());else{if(g&&Buffer.isBuffer(d))return Buffer.allocUnsafe?h=Buffer.allocUnsafe(d.length):h=new Buffer(d.length),d.copy(h),h;t(d,Error)?h=Object.create(d):typeof l>"u"?(D=Object.getPrototypeOf(d),h=Object.create(D)):(h=Object.create(l),D=l)}if(c){var R=b.indexOf(d);if(R!=-1)return x[R];b.push(d),x.push(h)}t(d,e)&&d.forEach(function(A,N){var M=v(N,S-1),W=v(A,S-1);h.set(M,W)}),t(d,r)&&d.forEach(function(A){var N=v(A,S-1);h.add(N)});for(var F in d){var _;D&&(_=Object.getOwnPropertyDescriptor(D,F)),!(_&&_.set==null)&&(h[F]=v(d[F],S-1))}if(Object.getOwnPropertySymbols)for(var H=Object.getOwnPropertySymbols(d),F=0;F{"use strict";Kn.exports=TypeError});var qn=P(()=>{});var Be=P((Om,ca)=>{var Lr=typeof Map=="function"&&Map.prototype,wr=Object.getOwnPropertyDescriptor&&Lr?Object.getOwnPropertyDescriptor(Map.prototype,"size"):null,ut=Lr&&wr&&typeof wr.get=="function"?wr.get:null,Hn=Lr&&Map.prototype.forEach,Vr=typeof Set=="function"&&Set.prototype,Rr=Object.getOwnPropertyDescriptor&&Vr?Object.getOwnPropertyDescriptor(Set.prototype,"size"):null,lt=Vr&&Rr&&typeof Rr.get=="function"?Rr.get:null,Wn=Vr&&Set.prototype.forEach,$i=typeof WeakMap=="function"&&WeakMap.prototype,Ie=$i?WeakMap.prototype.has:null,zi=typeof WeakSet=="function"&&WeakSet.prototype,_e=zi?WeakSet.prototype.has:null,Qi=typeof WeakRef=="function"&&WeakRef.prototype,Gn=Qi?WeakRef.prototype.deref:null,Yi=Boolean.prototype.valueOf,Ji=Object.prototype.toString,Zi=Function.prototype.toString,Xi=String.prototype.match,Kr=String.prototype.slice,se=String.prototype.replace,es=String.prototype.toUpperCase,$n=String.prototype.toLowerCase,ra=RegExp.prototype.test,zn=Array.prototype.concat,Q=Array.prototype.join,ts=Array.prototype.slice,Qn=Math.floor,_r=typeof BigInt=="function"?BigInt.prototype.valueOf:null,Mr=Object.getOwnPropertySymbols,Nr=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?Symbol.prototype.toString:null,Ae=typeof Symbol=="function"&&typeof Symbol.iterator=="object",Ne=typeof Symbol=="function"&&Symbol.toStringTag&&(typeof Symbol.toStringTag===Ae||!0)?Symbol.toStringTag:null,na=Object.prototype.propertyIsEnumerable,Yn=(typeof Reflect=="function"?Reflect.getPrototypeOf:Object.getPrototypeOf)||([].__proto__===Array.prototype?function(t){return t.__proto__}:null);function Jn(t,e){if(t===1/0||t===-1/0||t!==t||t&&t>-1e3&&t<1e3||ra.call(/e/,e))return e;var r=/[0-9](?=(?:[0-9]{3})+(?![0-9]))/g;if(typeof t=="number"){var n=t<0?-Qn(-t):Qn(t);if(n!==t){var a=String(n),o=Kr.call(e,a.length+1);return se.call(a,r,"$&_")+"."+se.call(se.call(o,/([0-9]{3})/g,"$&_"),/_$/,"")}}return se.call(e,r,"$&_")}i(Jn,"addNumericSeparator");var Br=qn(),Zn=Br.custom,Xn=ia(Zn)?Zn:null,aa={__proto__:null,double:'"',single:"'"},rs={__proto__:null,double:/(["\\])/g,single:/(['\\])/g};ca.exports=i(function t(e,r,n,a){var o=r||{};if(ne(o,"quoteStyle")&&!ne(aa,o.quoteStyle))throw new TypeError('option "quoteStyle" must be "single" or "double"');if(ne(o,"maxStringLength")&&(typeof o.maxStringLength=="number"?o.maxStringLength<0&&o.maxStringLength!==1/0:o.maxStringLength!==null))throw new TypeError('option "maxStringLength", if provided, must be a positive integer, Infinity, or `null`');var s=ne(o,"customInspect")?o.customInspect:!0;if(typeof s!="boolean"&&s!=="symbol")throw new TypeError("option \"customInspect\", if provided, must be `true`, `false`, or `'symbol'`");if(ne(o,"indent")&&o.indent!==null&&o.indent!==" "&&!(parseInt(o.indent,10)===o.indent&&o.indent>0))throw new TypeError('option "indent" must be "\\t", an integer > 0, or `null`');if(ne(o,"numericSeparator")&&typeof o.numericSeparator!="boolean")throw new TypeError('option "numericSeparator", if provided, must be `true` or `false`');var p=o.numericSeparator;if(typeof e>"u")return"undefined";if(e===null)return"null";if(typeof e=="boolean")return e?"true":"false";if(typeof e=="string")return pa(e,o);if(typeof e=="number"){if(e===0)return 1/0/e>0?"0":"-0";var m=String(e);return p?Jn(e,m):m}if(typeof e=="bigint"){var u=String(e)+"n";return p?Jn(e,u):u}var y=typeof o.depth>"u"?5:o.depth;if(typeof n>"u"&&(n=0),n>=y&&y>0&&typeof e=="object")return jr(e)?"[Array]":"[Object]";var c=Ss(o,n);if(typeof a>"u")a=[];else if(sa(a,e)>=0)return"[Circular]";function f(L,U,A){if(U&&(a=ts.call(a),a.push(U)),A){var N={depth:o.depth};return ne(o,"quoteStyle")&&(N.quoteStyle=o.quoteStyle),t(L,N,n+1,a)}return t(L,o,n+1,a)}if(i(f,"inspect"),typeof e=="function"&&!ea(e)){var l=ys(e),T=yt(e,f);return"[Function"+(l?": "+l:" (anonymous)")+"]"+(T.length>0?" { "+Q.call(T,", ")+" }":"")}if(ia(e)){var b=Ae?se.call(String(e),/^(Symbol\(.*\))_[^)]*$/,"$1"):Nr.call(e);return typeof e=="object"&&!Ae?Me(b):b}if(gs(e)){for(var x="<"+$n.call(String(e.nodeName)),g=e.attributes||[],v=0;v",x}if(jr(e)){if(e.length===0)return"[]";var d=yt(e,f);return c&&!xs(d)?"["+Ur(d,c)+"]":"[ "+Q.call(d,", ")+" ]"}if(os(e)){var S=yt(e,f);return!("cause"in Error.prototype)&&"cause"in e&&!na.call(e,"cause")?"{ ["+String(e)+"] "+Q.call(zn.call("[cause]: "+f(e.cause),S),", ")+" }":S.length===0?"["+String(e)+"]":"{ ["+String(e)+"] "+Q.call(S,", ")+" }"}if(typeof e=="object"&&s){if(Xn&&typeof e[Xn]=="function"&&Br)return Br(e,{depth:y-n});if(s!=="symbol"&&typeof e.inspect=="function")return e.inspect()}if(us(e)){var h=[];return Hn&&Hn.call(e,function(L,U){h.push(f(U,e,!0)+" => "+f(L,e))}),ta("Map",ut.call(e),h,c)}if(ds(e)){var D=[];return Wn&&Wn.call(e,function(L){D.push(f(L,e))}),ta("Set",lt.call(e),D,c)}if(ls(e))return Ir("WeakMap");if(hs(e))return Ir("WeakSet");if(fs(e))return Ir("WeakRef");if(ss(e))return Me(f(Number(e)));if(cs(e))return Me(f(_r.call(e)));if(ps(e))return Me(Yi.call(e));if(is(e))return Me(f(String(e)));if(typeof window<"u"&&e===window)return"{ [object Window] }";if(typeof globalThis<"u"&&e===globalThis||typeof global<"u"&&e===global)return"{ [object globalThis] }";if(!as(e)&&!ea(e)){var R=yt(e,f),F=Yn?Yn(e)===Object.prototype:e instanceof Object||e.constructor===Object,_=e instanceof Object?"":"null prototype",H=!F&&Ne&&Object(e)===e&&Ne in e?Kr.call(pe(e),8,-1):_?"Object":"",O=F||typeof e.constructor!="function"?"":e.constructor.name?e.constructor.name+" ":"",k=O+(H||_?"["+Q.call(zn.call([],H||[],_||[]),": ")+"] ":"");return R.length===0?k+"{}":c?k+"{"+Ur(R,c)+"}":k+"{ "+Q.call(R,", ")+" }"}return String(e)},"inspect_");function oa(t,e,r){var n=r.quoteStyle||e,a=aa[n];return a+t+a}i(oa,"wrapQuotes");function ns(t){return se.call(String(t),/"/g,""")}i(ns,"quote");function le(t){return!Ne||!(typeof t=="object"&&(Ne in t||typeof t[Ne]<"u"))}i(le,"canTrustToString");function jr(t){return pe(t)==="[object Array]"&&le(t)}i(jr,"isArray");function as(t){return pe(t)==="[object Date]"&&le(t)}i(as,"isDate");function ea(t){return pe(t)==="[object RegExp]"&&le(t)}i(ea,"isRegExp");function os(t){return pe(t)==="[object Error]"&&le(t)}i(os,"isError");function is(t){return pe(t)==="[object String]"&&le(t)}i(is,"isString");function ss(t){return pe(t)==="[object Number]"&&le(t)}i(ss,"isNumber");function ps(t){return pe(t)==="[object Boolean]"&&le(t)}i(ps,"isBoolean");function ia(t){if(Ae)return t&&typeof t=="object"&&t instanceof Symbol;if(typeof t=="symbol")return!0;if(!t||typeof t!="object"||!Nr)return!1;try{return Nr.call(t),!0}catch{}return!1}i(ia,"isSymbol");function cs(t){if(!t||typeof t!="object"||!_r)return!1;try{return _r.call(t),!0}catch{}return!1}i(cs,"isBigInt");var ms=Object.prototype.hasOwnProperty||function(t){return t in this};function ne(t,e){return ms.call(t,e)}i(ne,"has");function pe(t){return Ji.call(t)}i(pe,"toStr");function ys(t){if(t.name)return t.name;var e=Xi.call(Zi.call(t),/^function\s*([\w$]+)/);return e?e[1]:null}i(ys,"nameOf");function sa(t,e){if(t.indexOf)return t.indexOf(e);for(var r=0,n=t.length;re.maxStringLength){var r=t.length-e.maxStringLength,n="... "+r+" more character"+(r>1?"s":"");return pa(Kr.call(t,0,e.maxStringLength),e)+n}var a=rs[e.quoteStyle||"single"];a.lastIndex=0;var o=se.call(se.call(t,a,"\\$1"),/[\x00-\x1f]/g,Ts);return oa(o,"single",e)}i(pa,"inspectString");function Ts(t){var e=t.charCodeAt(0),r={8:"b",9:"t",10:"n",12:"f",13:"r"}[e];return r?"\\"+r:"\\x"+(e<16?"0":"")+es.call(e.toString(16))}i(Ts,"lowbyte");function Me(t){return"Object("+t+")"}i(Me,"markBoxed");function Ir(t){return t+" { ? }"}i(Ir,"weakCollectionOf");function ta(t,e,r,n){var a=n?Ur(r,n):Q.call(r,", ");return t+" ("+e+") {"+a+"}"}i(ta,"collectionOf");function xs(t){for(var e=0;eke(t,"name",{value:e,configurable:!0});var P=(t,e)=>()=>{try{return e||t((e={exports:{}}).exports,e),e.exports}catch(r){throw e=0,r}},_i=(t,e)=>{for(var r in e)ke(t,r,{get:e[r],enumerable:!0})},On=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of Ri(e))!Ii.call(t,a)&&a!==r&&ke(t,a,{get:()=>e[a],enumerable:!(n=wi(e,a))||n.enumerable});return t};var Ze=(t,e,r)=>(r=t!=null?ki(Mi(t)):{},On(e||!t||!t.__esModule?ke(r,"default",{value:t,enumerable:!0}):r,t)),Ni=t=>On(ke({},"__esModule",{value:!0}),t);var Rn=P((cm,wn)=>{var Ui=i(t=>t[0].toLocaleUpperCase()+t.slice(1),"titlecase");wn.exports=t=>{if(t==null||typeof t.toString!="function")return"";let e=t.toString().trim();if(e==="")return"";if(e.length===1)return e.toLocaleUpperCase();let r=e.match(/[a-zA-Z0-9]+/g);return r?r.map(n=>Ui(n)).join(""):e}});var Kn=P((Sm,mt)=>{var Gi=(function(){"use strict";function t(u,c){return c!=null&&u instanceof c}i(t,"_instanceof");var e;try{e=Map}catch{e=i(function(){},"nativeMap")}var r;try{r=Set}catch{r=i(function(){},"nativeSet")}var n;try{n=Promise}catch{n=i(function(){},"nativePromise")}function a(u,c,f,l,T){typeof c=="object"&&(f=c.depth,l=c.prototype,T=c.includeNonEnumerable,c=c.circular);var b=[],x=[],g=typeof Buffer<"u";typeof c>"u"&&(c=!0),typeof f>"u"&&(f=1/0);function v(d,S){if(d===null)return null;if(S===0)return d;var h,D;if(typeof d!="object")return d;if(t(d,e))h=new e;else if(t(d,r))h=new r;else if(t(d,n))h=new n(function(A,N){d.then(function(M){A(v(M,S-1))},function(M){N(v(M,S-1))})});else if(a.__isArray(d))h=[];else if(a.__isRegExp(d))h=new RegExp(d.source,y(d)),d.lastIndex&&(h.lastIndex=d.lastIndex);else if(a.__isDate(d))h=new Date(d.getTime());else{if(g&&Buffer.isBuffer(d))return Buffer.allocUnsafe?h=Buffer.allocUnsafe(d.length):h=new Buffer(d.length),d.copy(h),h;t(d,Error)?h=Object.create(d):typeof l>"u"?(D=Object.getPrototypeOf(d),h=Object.create(D)):(h=Object.create(l),D=l)}if(c){var R=b.indexOf(d);if(R!=-1)return x[R];b.push(d),x.push(h)}t(d,e)&&d.forEach(function(A,N){var M=v(N,S-1),W=v(A,S-1);h.set(M,W)}),t(d,r)&&d.forEach(function(A){var N=v(A,S-1);h.add(N)});for(var F in d){var _;D&&(_=Object.getOwnPropertyDescriptor(D,F)),!(_&&_.set==null)&&(h[F]=v(d[F],S-1))}if(Object.getOwnPropertySymbols)for(var H=Object.getOwnPropertySymbols(d),F=0;F{"use strict";qn.exports=TypeError});var Hn=P(()=>{});var Be=P((Om,ma)=>{var Lr=typeof Map=="function"&&Map.prototype,wr=Object.getOwnPropertyDescriptor&&Lr?Object.getOwnPropertyDescriptor(Map.prototype,"size"):null,yt=Lr&&wr&&typeof wr.get=="function"?wr.get:null,Wn=Lr&&Map.prototype.forEach,Vr=typeof Set=="function"&&Set.prototype,Rr=Object.getOwnPropertyDescriptor&&Vr?Object.getOwnPropertyDescriptor(Set.prototype,"size"):null,lt=Vr&&Rr&&typeof Rr.get=="function"?Rr.get:null,Gn=Vr&&Set.prototype.forEach,$i=typeof WeakMap=="function"&&WeakMap.prototype,Ie=$i?WeakMap.prototype.has:null,zi=typeof WeakSet=="function"&&WeakSet.prototype,_e=zi?WeakSet.prototype.has:null,Qi=typeof WeakRef=="function"&&WeakRef.prototype,$n=Qi?WeakRef.prototype.deref:null,Yi=Boolean.prototype.valueOf,Ji=Object.prototype.toString,Zi=Function.prototype.toString,Xi=String.prototype.match,Kr=String.prototype.slice,se=String.prototype.replace,es=String.prototype.toUpperCase,zn=String.prototype.toLowerCase,na=RegExp.prototype.test,Qn=Array.prototype.concat,Q=Array.prototype.join,ts=Array.prototype.slice,Yn=Math.floor,_r=typeof BigInt=="function"?BigInt.prototype.valueOf:null,Mr=Object.getOwnPropertySymbols,Nr=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?Symbol.prototype.toString:null,be=typeof Symbol=="function"&&typeof Symbol.iterator=="object",Ne=typeof Symbol=="function"&&Symbol.toStringTag&&(typeof Symbol.toStringTag===be||!0)?Symbol.toStringTag:null,aa=Object.prototype.propertyIsEnumerable,Jn=(typeof Reflect=="function"?Reflect.getPrototypeOf:Object.getPrototypeOf)||([].__proto__===Array.prototype?function(t){return t.__proto__}:null);function Zn(t,e){if(t===1/0||t===-1/0||t!==t||t&&t>-1e3&&t<1e3||na.call(/e/,e))return e;var r=/[0-9](?=(?:[0-9]{3})+(?![0-9]))/g;if(typeof t=="number"){var n=t<0?-Yn(-t):Yn(t);if(n!==t){var a=String(n),o=Kr.call(e,a.length+1);return se.call(a,r,"$&_")+"."+se.call(se.call(o,/([0-9]{3})/g,"$&_"),/_$/,"")}}return se.call(e,r,"$&_")}i(Zn,"addNumericSeparator");var Br=Hn(),Xn=Br.custom,ea=sa(Xn)?Xn:null,oa={__proto__:null,double:'"',single:"'"},rs={__proto__:null,double:/(["\\])/g,single:/(['\\])/g};ma.exports=i(function t(e,r,n,a){var o=r||{};if(ne(o,"quoteStyle")&&!ne(oa,o.quoteStyle))throw new TypeError('option "quoteStyle" must be "single" or "double"');if(ne(o,"maxStringLength")&&(typeof o.maxStringLength=="number"?o.maxStringLength<0&&o.maxStringLength!==1/0:o.maxStringLength!==null))throw new TypeError('option "maxStringLength", if provided, must be a positive integer, Infinity, or `null`');var s=ne(o,"customInspect")?o.customInspect:!0;if(typeof s!="boolean"&&s!=="symbol")throw new TypeError("option \"customInspect\", if provided, must be `true`, `false`, or `'symbol'`");if(ne(o,"indent")&&o.indent!==null&&o.indent!==" "&&!(parseInt(o.indent,10)===o.indent&&o.indent>0))throw new TypeError('option "indent" must be "\\t", an integer > 0, or `null`');if(ne(o,"numericSeparator")&&typeof o.numericSeparator!="boolean")throw new TypeError('option "numericSeparator", if provided, must be `true` or `false`');var p=o.numericSeparator;if(typeof e>"u")return"undefined";if(e===null)return"null";if(typeof e=="boolean")return e?"true":"false";if(typeof e=="string")return ca(e,o);if(typeof e=="number"){if(e===0)return 1/0/e>0?"0":"-0";var m=String(e);return p?Zn(e,m):m}if(typeof e=="bigint"){var y=String(e)+"n";return p?Zn(e,y):y}var u=typeof o.depth>"u"?5:o.depth;if(typeof n>"u"&&(n=0),n>=u&&u>0&&typeof e=="object")return jr(e)?"[Array]":"[Object]";var c=Ss(o,n);if(typeof a>"u")a=[];else if(pa(a,e)>=0)return"[Circular]";function f(L,U,A){if(U&&(a=ts.call(a),a.push(U)),A){var N={depth:o.depth};return ne(o,"quoteStyle")&&(N.quoteStyle=o.quoteStyle),t(L,N,n+1,a)}return t(L,o,n+1,a)}if(i(f,"inspect"),typeof e=="function"&&!ta(e)){var l=us(e),T=ut(e,f);return"[Function"+(l?": "+l:" (anonymous)")+"]"+(T.length>0?" { "+Q.call(T,", ")+" }":"")}if(sa(e)){var b=be?se.call(String(e),/^(Symbol\(.*\))_[^)]*$/,"$1"):Nr.call(e);return typeof e=="object"&&!be?Me(b):b}if(gs(e)){for(var x="<"+zn.call(String(e.nodeName)),g=e.attributes||[],v=0;v",x}if(jr(e)){if(e.length===0)return"[]";var d=ut(e,f);return c&&!xs(d)?"["+Ur(d,c)+"]":"[ "+Q.call(d,", ")+" ]"}if(os(e)){var S=ut(e,f);return!("cause"in Error.prototype)&&"cause"in e&&!aa.call(e,"cause")?"{ ["+String(e)+"] "+Q.call(Qn.call("[cause]: "+f(e.cause),S),", ")+" }":S.length===0?"["+String(e)+"]":"{ ["+String(e)+"] "+Q.call(S,", ")+" }"}if(typeof e=="object"&&s){if(ea&&typeof e[ea]=="function"&&Br)return Br(e,{depth:u-n});if(s!=="symbol"&&typeof e.inspect=="function")return e.inspect()}if(ys(e)){var h=[];return Wn&&Wn.call(e,function(L,U){h.push(f(U,e,!0)+" => "+f(L,e))}),ra("Map",yt.call(e),h,c)}if(ds(e)){var D=[];return Gn&&Gn.call(e,function(L){D.push(f(L,e))}),ra("Set",lt.call(e),D,c)}if(ls(e))return Ir("WeakMap");if(hs(e))return Ir("WeakSet");if(fs(e))return Ir("WeakRef");if(ss(e))return Me(f(Number(e)));if(cs(e))return Me(f(_r.call(e)));if(ps(e))return Me(Yi.call(e));if(is(e))return Me(f(String(e)));if(typeof window<"u"&&e===window)return"{ [object Window] }";if(typeof globalThis<"u"&&e===globalThis||typeof global<"u"&&e===global)return"{ [object globalThis] }";if(!as(e)&&!ta(e)){var R=ut(e,f),F=Jn?Jn(e)===Object.prototype:e instanceof Object||e.constructor===Object,_=e instanceof Object?"":"null prototype",H=!F&&Ne&&Object(e)===e&&Ne in e?Kr.call(pe(e),8,-1):_?"Object":"",O=F||typeof e.constructor!="function"?"":e.constructor.name?e.constructor.name+" ":"",k=O+(H||_?"["+Q.call(Qn.call([],H||[],_||[]),": ")+"] ":"");return R.length===0?k+"{}":c?k+"{"+Ur(R,c)+"}":k+"{ "+Q.call(R,", ")+" }"}return String(e)},"inspect_");function ia(t,e,r){var n=r.quoteStyle||e,a=oa[n];return a+t+a}i(ia,"wrapQuotes");function ns(t){return se.call(String(t),/"/g,""")}i(ns,"quote");function fe(t){return!Ne||!(typeof t=="object"&&(Ne in t||typeof t[Ne]<"u"))}i(fe,"canTrustToString");function jr(t){return pe(t)==="[object Array]"&&fe(t)}i(jr,"isArray");function as(t){return pe(t)==="[object Date]"&&fe(t)}i(as,"isDate");function ta(t){return pe(t)==="[object RegExp]"&&fe(t)}i(ta,"isRegExp");function os(t){return pe(t)==="[object Error]"&&fe(t)}i(os,"isError");function is(t){return pe(t)==="[object String]"&&fe(t)}i(is,"isString");function ss(t){return pe(t)==="[object Number]"&&fe(t)}i(ss,"isNumber");function ps(t){return pe(t)==="[object Boolean]"&&fe(t)}i(ps,"isBoolean");function sa(t){if(be)return t&&typeof t=="object"&&t instanceof Symbol;if(typeof t=="symbol")return!0;if(!t||typeof t!="object"||!Nr)return!1;try{return Nr.call(t),!0}catch{}return!1}i(sa,"isSymbol");function cs(t){if(!t||typeof t!="object"||!_r)return!1;try{return _r.call(t),!0}catch{}return!1}i(cs,"isBigInt");var ms=Object.prototype.hasOwnProperty||function(t){return t in this};function ne(t,e){return ms.call(t,e)}i(ne,"has");function pe(t){return Ji.call(t)}i(pe,"toStr");function us(t){if(t.name)return t.name;var e=Xi.call(Zi.call(t),/^function\s*([\w$]+)/);return e?e[1]:null}i(us,"nameOf");function pa(t,e){if(t.indexOf)return t.indexOf(e);for(var r=0,n=t.length;re.maxStringLength){var r=t.length-e.maxStringLength,n="... "+r+" more character"+(r>1?"s":"");return ca(Kr.call(t,0,e.maxStringLength),e)+n}var a=rs[e.quoteStyle||"single"];a.lastIndex=0;var o=se.call(se.call(t,a,"\\$1"),/[\x00-\x1f]/g,Ts);return ia(o,"single",e)}i(ca,"inspectString");function Ts(t){var e=t.charCodeAt(0),r={8:"b",9:"t",10:"n",12:"f",13:"r"}[e];return r?"\\"+r:"\\x"+(e<16?"0":"")+es.call(e.toString(16))}i(Ts,"lowbyte");function Me(t){return"Object("+t+")"}i(Me,"markBoxed");function Ir(t){return t+" { ? }"}i(Ir,"weakCollectionOf");function ra(t,e,r,n){var a=n?Ur(r,n):Q.call(r,", ");return t+" ("+e+") {"+a+"}"}i(ra,"collectionOf");function xs(t){for(var e=0;e=0)return!1;return!0}i(xs,"singleLineValues");function Ss(t,e){var r;if(t.indent===" ")r=" ";else if(typeof t.indent=="number"&&t.indent>0)r=Q.call(Array(t.indent+1)," ");else return null;return{base:r,prev:Q.call(Array(e+1),r)}}i(Ss,"getIndent");function Ur(t,e){if(t.length===0)return"";var r=` `+e.prev+e.base;return r+Q.call(t,","+r)+` -`+e.prev}i(Ur,"indentedJoin");function yt(t,e){var r=jr(t),n=[];if(r){n.length=t.length;for(var a=0;a{"use strict";var Ps=Be(),As=ue(),ft=i(function(t,e,r){for(var n=t,a;(a=n.next)!=null;n=a)if(a.key===e)return n.next=a.next,r||(a.next=t.next,t.next=a),a},"listGetNode"),bs=i(function(t,e){if(t){var r=ft(t,e);return r&&r.value}},"listGet"),Ds=i(function(t,e,r){var n=ft(t,e);n?n.value=r:t.next={key:e,next:t.next,value:r}},"listSet"),Os=i(function(t,e){return t?!!ft(t,e):!1},"listHas"),vs=i(function(t,e){if(t)return ft(t,e,!0)},"listDelete");ma.exports=i(function(){var e,r={assert:i(function(n){if(!r.has(n))throw new As("Side channel does not contain "+Ps(n))},"assert"),delete:i(function(n){var a=vs(e,n);return a&&e&&!e.next&&(e=void 0),!!a},"delete"),get:i(function(n){return bs(e,n)},"get"),has:i(function(n){return Os(e,n)},"has"),set:i(function(n,a){e||(e={next:void 0}),Ds(e,n,a)},"set")};return r},"getSideChannelList")});var qr=P((Fm,ua)=>{"use strict";ua.exports=Object});var fa=P((km,la)=>{"use strict";la.exports=Error});var ha=P((wm,da)=>{"use strict";da.exports=EvalError});var Ta=P((Rm,ga)=>{"use strict";ga.exports=RangeError});var Sa=P((Mm,xa)=>{"use strict";xa.exports=ReferenceError});var Aa=P((Im,Pa)=>{"use strict";Pa.exports=SyntaxError});var Da=P((_m,ba)=>{"use strict";ba.exports=URIError});var va=P((Nm,Oa)=>{"use strict";Oa.exports=Math.abs});var Ea=P((Bm,Ca)=>{"use strict";Ca.exports=Math.floor});var ka=P((jm,Fa)=>{"use strict";Fa.exports=Math.max});var Ra=P((Um,wa)=>{"use strict";wa.exports=Math.min});var Ia=P((Lm,Ma)=>{"use strict";Ma.exports=Math.pow});var Na=P((Vm,_a)=>{"use strict";_a.exports=Math.round});var ja=P((Km,Ba)=>{"use strict";Ba.exports=Number.isNaN||i(function(e){return e!==e},"isNaN")});var La=P((Hm,Ua)=>{"use strict";var Cs=ja();Ua.exports=i(function(e){return Cs(e)||e===0?e:e<0?-1:1},"sign")});var Ka=P((Gm,Va)=>{"use strict";Va.exports=Object.getOwnPropertyDescriptor});var Hr=P(($m,qa)=>{"use strict";var dt=Ka();if(dt)try{dt([],"length")}catch{dt=null}qa.exports=dt});var Wr=P((zm,Ha)=>{"use strict";var ht=Object.defineProperty||!1;if(ht)try{ht({},"a",{value:1})}catch{ht=!1}Ha.exports=ht});var Ga=P((Qm,Wa)=>{"use strict";Wa.exports=i(function(){if(typeof Symbol!="function"||typeof Object.getOwnPropertySymbols!="function")return!1;if(typeof Symbol.iterator=="symbol")return!0;var e={},r=Symbol("test"),n=Object(r);if(typeof r=="string"||Object.prototype.toString.call(r)!=="[object Symbol]"||Object.prototype.toString.call(n)!=="[object Symbol]")return!1;var a=42;e[r]=a;for(var o in e)return!1;if(typeof Object.keys=="function"&&Object.keys(e).length!==0||typeof Object.getOwnPropertyNames=="function"&&Object.getOwnPropertyNames(e).length!==0)return!1;var s=Object.getOwnPropertySymbols(e);if(s.length!==1||s[0]!==r||!Object.prototype.propertyIsEnumerable.call(e,r))return!1;if(typeof Object.getOwnPropertyDescriptor=="function"){var p=Object.getOwnPropertyDescriptor(e,r);if(p.value!==a||p.enumerable!==!0)return!1}return!0},"hasSymbols")});var Qa=P((Jm,za)=>{"use strict";var $a=typeof Symbol<"u"&&Symbol,Es=Ga();za.exports=i(function(){return typeof $a!="function"||typeof Symbol!="function"||typeof $a("foo")!="symbol"||typeof Symbol("bar")!="symbol"?!1:Es()},"hasNativeSymbols")});var Gr=P((Xm,Ya)=>{"use strict";Ya.exports=typeof Reflect<"u"&&Reflect.getPrototypeOf||null});var $r=P((ey,Ja)=>{"use strict";var Fs=qr();Ja.exports=Fs.getPrototypeOf||null});var eo=P((ty,Xa)=>{"use strict";var ks="Function.prototype.bind called on incompatible ",ws=Object.prototype.toString,Rs=Math.max,Ms="[object Function]",Za=i(function(e,r){for(var n=[],a=0;a{"use strict";var Ns=eo();to.exports=Function.prototype.bind||Ns});var gt=P((ay,ro)=>{"use strict";ro.exports=Function.prototype.call});var zr=P((oy,no)=>{"use strict";no.exports=Function.prototype.apply});var oo=P((iy,ao)=>{"use strict";ao.exports=typeof Reflect<"u"&&Reflect&&Reflect.apply});var so=P((sy,io)=>{"use strict";var Bs=je(),js=zr(),Us=gt(),Ls=oo();io.exports=Ls||Bs.call(Us,js)});var Qr=P((py,po)=>{"use strict";var Vs=je(),Ks=ue(),qs=gt(),Hs=so();po.exports=i(function(e){if(e.length<1||typeof e[0]!="function")throw new Ks("a function is required");return Hs(Vs,qs,e)},"callBindBasic")});var fo=P((my,lo)=>{"use strict";var Ws=Qr(),co=Hr(),yo;try{yo=[].__proto__===Array.prototype}catch(t){if(!t||typeof t!="object"||!("code"in t)||t.code!=="ERR_PROTO_ACCESS")throw t}var Yr=!!yo&&co&&co(Object.prototype,"__proto__"),uo=Object,mo=uo.getPrototypeOf;lo.exports=Yr&&typeof Yr.get=="function"?Ws([Yr.get]):typeof mo=="function"?i(function(e){return mo(e==null?e:uo(e))},"getDunder"):!1});var So=P((uy,xo)=>{"use strict";var ho=Gr(),go=$r(),To=fo();xo.exports=ho?i(function(e){return ho(e)},"getProto"):go?i(function(e){if(!e||typeof e!="object"&&typeof e!="function")throw new TypeError("getProto: not an object");return go(e)},"getProto"):To?i(function(e){return To(e)},"getProto"):null});var Ao=P((fy,Po)=>{"use strict";var Gs=Function.prototype.call,$s=Object.prototype.hasOwnProperty,zs=je();Po.exports=zs.call(Gs,$s)});var St=P((dy,Eo)=>{"use strict";var C,Qs=qr(),Ys=fa(),Js=ha(),Zs=Ta(),Xs=Sa(),ve=Aa(),Oe=ue(),ep=Da(),tp=va(),rp=Ea(),np=ka(),ap=Ra(),op=Ia(),ip=Na(),sp=La(),vo=Function,Jr=i(function(t){try{return vo('"use strict"; return ('+t+").constructor;")()}catch{}},"getEvalledConstructor"),Ue=Hr(),pp=Wr(),Zr=i(function(){throw new Oe},"throwTypeError"),cp=Ue?(function(){try{return arguments.callee,Zr}catch{try{return Ue(arguments,"callee").get}catch{return Zr}}})():Zr,be=Qa()(),K=So(),mp=$r(),yp=Gr(),Co=zr(),Le=gt(),De={},up=typeof Uint8Array>"u"||!K?C:K(Uint8Array),fe={__proto__:null,"%AggregateError%":typeof AggregateError>"u"?C:AggregateError,"%Array%":Array,"%ArrayBuffer%":typeof ArrayBuffer>"u"?C:ArrayBuffer,"%ArrayIteratorPrototype%":be&&K?K([][Symbol.iterator]()):C,"%AsyncFromSyncIteratorPrototype%":C,"%AsyncFunction%":De,"%AsyncGenerator%":De,"%AsyncGeneratorFunction%":De,"%AsyncIteratorPrototype%":De,"%Atomics%":typeof Atomics>"u"?C:Atomics,"%BigInt%":typeof BigInt>"u"?C:BigInt,"%BigInt64Array%":typeof BigInt64Array>"u"?C:BigInt64Array,"%BigUint64Array%":typeof BigUint64Array>"u"?C:BigUint64Array,"%Boolean%":Boolean,"%DataView%":typeof DataView>"u"?C:DataView,"%Date%":Date,"%decodeURI%":decodeURI,"%decodeURIComponent%":decodeURIComponent,"%encodeURI%":encodeURI,"%encodeURIComponent%":encodeURIComponent,"%Error%":Ys,"%eval%":eval,"%EvalError%":Js,"%Float16Array%":typeof Float16Array>"u"?C:Float16Array,"%Float32Array%":typeof Float32Array>"u"?C:Float32Array,"%Float64Array%":typeof Float64Array>"u"?C:Float64Array,"%FinalizationRegistry%":typeof FinalizationRegistry>"u"?C:FinalizationRegistry,"%Function%":vo,"%GeneratorFunction%":De,"%Int8Array%":typeof Int8Array>"u"?C:Int8Array,"%Int16Array%":typeof Int16Array>"u"?C:Int16Array,"%Int32Array%":typeof Int32Array>"u"?C:Int32Array,"%isFinite%":isFinite,"%isNaN%":isNaN,"%IteratorPrototype%":be&&K?K(K([][Symbol.iterator]())):C,"%JSON%":typeof JSON=="object"?JSON:C,"%Map%":typeof Map>"u"?C:Map,"%MapIteratorPrototype%":typeof Map>"u"||!be||!K?C:K(new Map()[Symbol.iterator]()),"%Math%":Math,"%Number%":Number,"%Object%":Qs,"%Object.getOwnPropertyDescriptor%":Ue,"%parseFloat%":parseFloat,"%parseInt%":parseInt,"%Promise%":typeof Promise>"u"?C:Promise,"%Proxy%":typeof Proxy>"u"?C:Proxy,"%RangeError%":Zs,"%ReferenceError%":Xs,"%Reflect%":typeof Reflect>"u"?C:Reflect,"%RegExp%":RegExp,"%Set%":typeof Set>"u"?C:Set,"%SetIteratorPrototype%":typeof Set>"u"||!be||!K?C:K(new Set()[Symbol.iterator]()),"%SharedArrayBuffer%":typeof SharedArrayBuffer>"u"?C:SharedArrayBuffer,"%String%":String,"%StringIteratorPrototype%":be&&K?K(""[Symbol.iterator]()):C,"%Symbol%":be?Symbol:C,"%SyntaxError%":ve,"%ThrowTypeError%":cp,"%TypedArray%":up,"%TypeError%":Oe,"%Uint8Array%":typeof Uint8Array>"u"?C:Uint8Array,"%Uint8ClampedArray%":typeof Uint8ClampedArray>"u"?C:Uint8ClampedArray,"%Uint16Array%":typeof Uint16Array>"u"?C:Uint16Array,"%Uint32Array%":typeof Uint32Array>"u"?C:Uint32Array,"%URIError%":ep,"%WeakMap%":typeof WeakMap>"u"?C:WeakMap,"%WeakRef%":typeof WeakRef>"u"?C:WeakRef,"%WeakSet%":typeof WeakSet>"u"?C:WeakSet,"%Function.prototype.call%":Le,"%Function.prototype.apply%":Co,"%Object.defineProperty%":pp,"%Object.getPrototypeOf%":mp,"%Math.abs%":tp,"%Math.floor%":rp,"%Math.max%":np,"%Math.min%":ap,"%Math.pow%":op,"%Math.round%":ip,"%Math.sign%":sp,"%Reflect.getPrototypeOf%":yp};if(K)try{null.error}catch(t){bo=K(K(t)),fe["%Error.prototype%"]=bo}var bo,lp=i(function t(e){var r;if(e==="%AsyncFunction%")r=Jr("async function () {}");else if(e==="%GeneratorFunction%")r=Jr("function* () {}");else if(e==="%AsyncGeneratorFunction%")r=Jr("async function* () {}");else if(e==="%AsyncGenerator%"){var n=t("%AsyncGeneratorFunction%");n&&(r=n.prototype)}else if(e==="%AsyncIteratorPrototype%"){var a=t("%AsyncGenerator%");a&&K&&(r=K(a.prototype))}return fe[e]=r,r},"doEval"),Do={__proto__:null,"%ArrayBufferPrototype%":["ArrayBuffer","prototype"],"%ArrayPrototype%":["Array","prototype"],"%ArrayProto_entries%":["Array","prototype","entries"],"%ArrayProto_forEach%":["Array","prototype","forEach"],"%ArrayProto_keys%":["Array","prototype","keys"],"%ArrayProto_values%":["Array","prototype","values"],"%AsyncFunctionPrototype%":["AsyncFunction","prototype"],"%AsyncGenerator%":["AsyncGeneratorFunction","prototype"],"%AsyncGeneratorPrototype%":["AsyncGeneratorFunction","prototype","prototype"],"%BooleanPrototype%":["Boolean","prototype"],"%DataViewPrototype%":["DataView","prototype"],"%DatePrototype%":["Date","prototype"],"%ErrorPrototype%":["Error","prototype"],"%EvalErrorPrototype%":["EvalError","prototype"],"%Float32ArrayPrototype%":["Float32Array","prototype"],"%Float64ArrayPrototype%":["Float64Array","prototype"],"%FunctionPrototype%":["Function","prototype"],"%Generator%":["GeneratorFunction","prototype"],"%GeneratorPrototype%":["GeneratorFunction","prototype","prototype"],"%Int8ArrayPrototype%":["Int8Array","prototype"],"%Int16ArrayPrototype%":["Int16Array","prototype"],"%Int32ArrayPrototype%":["Int32Array","prototype"],"%JSONParse%":["JSON","parse"],"%JSONStringify%":["JSON","stringify"],"%MapPrototype%":["Map","prototype"],"%NumberPrototype%":["Number","prototype"],"%ObjectPrototype%":["Object","prototype"],"%ObjProto_toString%":["Object","prototype","toString"],"%ObjProto_valueOf%":["Object","prototype","valueOf"],"%PromisePrototype%":["Promise","prototype"],"%PromiseProto_then%":["Promise","prototype","then"],"%Promise_all%":["Promise","all"],"%Promise_reject%":["Promise","reject"],"%Promise_resolve%":["Promise","resolve"],"%RangeErrorPrototype%":["RangeError","prototype"],"%ReferenceErrorPrototype%":["ReferenceError","prototype"],"%RegExpPrototype%":["RegExp","prototype"],"%SetPrototype%":["Set","prototype"],"%SharedArrayBufferPrototype%":["SharedArrayBuffer","prototype"],"%StringPrototype%":["String","prototype"],"%SymbolPrototype%":["Symbol","prototype"],"%SyntaxErrorPrototype%":["SyntaxError","prototype"],"%TypedArrayPrototype%":["TypedArray","prototype"],"%TypeErrorPrototype%":["TypeError","prototype"],"%Uint8ArrayPrototype%":["Uint8Array","prototype"],"%Uint8ClampedArrayPrototype%":["Uint8ClampedArray","prototype"],"%Uint16ArrayPrototype%":["Uint16Array","prototype"],"%Uint32ArrayPrototype%":["Uint32Array","prototype"],"%URIErrorPrototype%":["URIError","prototype"],"%WeakMapPrototype%":["WeakMap","prototype"],"%WeakSetPrototype%":["WeakSet","prototype"]},Ve=je(),Tt=Ao(),fp=Ve.call(Le,Array.prototype.concat),dp=Ve.call(Co,Array.prototype.splice),Oo=Ve.call(Le,String.prototype.replace),xt=Ve.call(Le,String.prototype.slice),hp=Ve.call(Le,RegExp.prototype.exec),gp=/[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g,Tp=/\\(\\)?/g,xp=i(function(e){var r=xt(e,0,1),n=xt(e,-1);if(r==="%"&&n!=="%")throw new ve("invalid intrinsic syntax, expected closing `%`");if(n==="%"&&r!=="%")throw new ve("invalid intrinsic syntax, expected opening `%`");var a=[];return Oo(e,gp,function(o,s,p,m){a[a.length]=p?Oo(m,Tp,"$1"):s||o}),a},"stringToPath"),Sp=i(function(e,r){var n=e,a;if(Tt(Do,n)&&(a=Do[n],n="%"+a[0]+"%"),Tt(fe,n)){var o=fe[n];if(o===De&&(o=lp(n)),typeof o>"u"&&!r)throw new Oe("intrinsic "+e+" exists, but is not available. Please file an issue!");return{alias:a,name:n,value:o}}throw new ve("intrinsic "+e+" does not exist!")},"getBaseIntrinsic");Eo.exports=i(function(e,r){if(typeof e!="string"||e.length===0)throw new Oe("intrinsic name must be a non-empty string");if(arguments.length>1&&typeof r!="boolean")throw new Oe('"allowMissing" argument must be a boolean');if(hp(/^%?[^%]*%?$/,e)===null)throw new ve("`%` may not be present anywhere but at the beginning and end of the intrinsic name");var n=xp(e),a=n.length>0?n[0]:"",o=Sp("%"+a+"%",r),s=o.name,p=o.value,m=!1,u=o.alias;u&&(a=u[0],dp(n,fp([0,1],u)));for(var y=1,c=!0;y=n.length){var b=Ue(p,f);c=!!b,c&&"get"in b&&!("originalValue"in b.get)?p=b.get:p=p[f]}else c=Tt(p,f),p=p[f];c&&!m&&(fe[s]=p)}}return p},"GetIntrinsic")});var Xr=P((gy,wo)=>{"use strict";var Fo=St(),ko=Qr(),Pp=ko([Fo("%String.prototype.indexOf%")]);wo.exports=i(function(e,r){var n=Fo(e,!!r);return typeof n=="function"&&Pp(e,".prototype.")>-1?ko([n]):n},"callBoundIntrinsic")});var en=P((xy,Mo)=>{"use strict";var Ap=St(),Ke=Xr(),bp=Be(),Dp=ue(),Ro=Ap("%Map%",!0),Op=Ke("Map.prototype.get",!0),vp=Ke("Map.prototype.set",!0),Cp=Ke("Map.prototype.has",!0),Ep=Ke("Map.prototype.delete",!0),Fp=Ke("Map.prototype.size",!0);Mo.exports=!!Ro&&i(function(){var e,r={assert:i(function(n){if(!r.has(n))throw new Dp("Side channel does not contain "+bp(n))},"assert"),delete:i(function(n){if(e){var a=Ep(e,n);return Fp(e)===0&&(e=void 0),a}return!1},"delete"),get:i(function(n){if(e)return Op(e,n)},"get"),has:i(function(n){return e?Cp(e,n):!1},"has"),set:i(function(n,a){e||(e=new Ro),vp(e,n,a)},"set")};return r},"getSideChannelMap")});var _o=P((Py,Io)=>{"use strict";var kp=St(),At=Xr(),wp=Be(),Pt=en(),Rp=ue(),Ce=kp("%WeakMap%",!0),Mp=At("WeakMap.prototype.get",!0),Ip=At("WeakMap.prototype.set",!0),_p=At("WeakMap.prototype.has",!0),Np=At("WeakMap.prototype.delete",!0);Io.exports=Ce?i(function(){var e,r,n={assert:i(function(a){if(!n.has(a))throw new Rp("Side channel does not contain "+wp(a))},"assert"),delete:i(function(a){if(Ce&&a&&(typeof a=="object"||typeof a=="function")){if(e)return Np(e,a)}else if(Pt&&r)return r.delete(a);return!1},"delete"),get:i(function(a){return Ce&&a&&(typeof a=="object"||typeof a=="function")&&e?Mp(e,a):r&&r.get(a)},"get"),has:i(function(a){return Ce&&a&&(typeof a=="object"||typeof a=="function")&&e?_p(e,a):!!r&&r.has(a)},"has"),set:i(function(a,o){Ce&&a&&(typeof a=="object"||typeof a=="function")?(e||(e=new Ce),Ip(e,a,o)):Pt&&(r||(r=Pt()),r.set(a,o))},"set")};return n},"getSideChannelWeakMap"):Pt});var tn=P((by,No)=>{"use strict";var Bp=ue(),jp=Be(),Up=ya(),Lp=en(),Vp=_o(),Kp=Vp||Lp||Up;No.exports=i(function(){var e,r={assert:i(function(n){if(!r.has(n)){var a=n&&Object(n)===n?"the given object key":jp(n);throw new Bp("Side channel does not contain "+a)}},"assert"),delete:i(function(n){return!!e&&e.delete(n)},"delete"),get:i(function(n){return e&&e.get(n)},"get"),has:i(function(n){return!!e&&e.has(n)},"has"),set:i(function(n,a){e||(e=Kp()),e.set(n,a)},"set")};return r},"getSideChannel")});var bt=P((Oy,Bo)=>{"use strict";var qp=String.prototype.replace,Hp=/%20/g,rn={RFC1738:"RFC1738",RFC3986:"RFC3986"};Bo.exports={default:rn.RFC3986,formatters:{RFC1738:i(function(t){return qp.call(t,Hp,"+")},"RFC1738"),RFC3986:i(function(t){return String(t)},"RFC3986")},RFC1738:rn.RFC1738,RFC3986:rn.RFC3986}});var sn=P((Cy,Lo)=>{"use strict";var Wp=bt(),Uo=tn(),jo=Wr(),nn=Object.prototype.hasOwnProperty,ce=Array.isArray,Ot=Uo(),de=i(function(e,r){return Ot.set(e,r),e},"markOverflow"),he=i(function(e){return Ot.has(e)},"isOverflow"),qe=i(function(e){return Ot.get(e)},"getMaxIndex"),an=i(function(e,r){Ot.set(e,r)},"setMaxIndex"),Y=(function(){for(var t=[],e=0;e<256;++e)t[t.length]="%"+((e<16?"0":"")+e.toString(16)).toUpperCase();return t})(),Gp=i(function(e){for(;e.length>1;){var r=e.pop(),n=r.obj[r.prop];if(ce(n)){for(var a=[],o=0;o=n.arrayLimit){if(n.throwOnLimitExceeded)throw new RangeError("Array limit exceeded. Only "+n.arrayLimit+" element"+(n.arrayLimit===1?"":"s")+" allowed in an array.");return de(Ee(e.concat(r),n),a)}e[a]=r}else if(e&&typeof e=="object")if(he(e)){var o=qe(e)+1;e[o]=r,an(e,o)}else{if(n&&n.strictMerge)return[e,r];(n&&(n.plainObjects||n.allowPrototypes)||!nn.call(Object.prototype,r))&&(e[r]=!0)}else return[e,r];return e}if(!e||typeof e!="object"){if(he(r)){for(var s=Object.keys(r),p=n&&n.plainObjects?{__proto__:null,0:e}:{0:e},m=0;mn.arrayLimit){if(n.throwOnLimitExceeded)throw new RangeError("Array limit exceeded. Only "+n.arrayLimit+" element"+(n.arrayLimit===1?"":"s")+" allowed in an array.");return de(Ee(y,n),y.length-1)}return y}var c=e;if(ce(e)&&!ce(r)&&(c=Ee(e,n)),ce(e)&&ce(r)){if(r.forEach(function(f,l){if(nn.call(e,l)){var T=e[l];T&&typeof T=="object"&&f&&typeof f=="object"?e[l]=t(T,f,n):e[e.length]=f}else e[l]=f}),n&&typeof n.arrayLimit=="number"&&e.length>n.arrayLimit){if(n.throwOnLimitExceeded)throw new RangeError("Array limit exceeded. Only "+n.arrayLimit+" element"+(n.arrayLimit===1?"":"s")+" allowed in an array.");return de(Ee(e,n),e.length-1)}return e}return Object.keys(r).reduce(function(f,l){var T=r[l];if(nn.call(f,l)?on(f,l,t(f[l],T,n)):on(f,l,T),he(r)&&!he(f)&&de(f,qe(r)),he(f)){var b=parseInt(l,10);String(b)===l&&b>=0&&b>qe(f)&&an(f,b)}return f},c)},"merge"),zp=i(function(e,r){return Object.keys(r).reduce(function(n,a){return on(n,a,r[a]),n},e)},"assignSingleSource"),Qp=i(function(t,e,r){var n=t.replace(/\+/g," ");if(r==="iso-8859-1")return n.replace(/%[0-9a-f]{2}/gi,unescape);try{return decodeURIComponent(n)}catch{return n}},"decode"),Dt=1024,Yp=i(function(e,r,n,a,o){if(e.length===0)return e;var s=e;if(typeof e=="symbol"?s=Symbol.prototype.toString.call(e):typeof e!="string"&&(s=String(e)),n==="iso-8859-1")return escape(s).replace(/%u[0-9a-f]{4}/gi,function(T){return"%26%23"+parseInt(T.slice(2),16)+"%3B"});for(var p="",m=0;m=Dt?s.slice(m,m+Dt):s;if(m+Dt=55296&&y<=56319&&(u=u.slice(0,-1),m-=1)}for(var c=[],f=0;f=48&&l<=57||l>=65&&l<=90||l>=97&&l<=122||o===Wp.RFC1738&&(l===40||l===41)){c[c.length]=u.charAt(f);continue}if(l<128){c[c.length]=Y[l];continue}if(l<2048){c[c.length]=Y[192|l>>6]+Y[128|l&63];continue}if(l<55296||l>=57344){c[c.length]=Y[224|l>>12]+Y[128|l>>6&63]+Y[128|l&63];continue}f+=1,l=65536+((l&1023)<<10|u.charCodeAt(f)&1023),c[c.length]=Y[240|l>>18]+Y[128|l>>12&63]+Y[128|l>>6&63]+Y[128|l&63]}p+=c.join("")}return p},"encode"),Jp=i(function(e){for(var r=[{obj:{o:e},prop:"o"}],n=Uo(),a=0;an){if(o)throw new RangeError("Array limit exceeded. Only "+n+" element"+(n===1?"":"s")+" allowed in an array.");return de(Ee(u,{plainObjects:a}),u.length-1)}return u},"combine"),tc=i(function(e,r){if(ce(e)){for(var n=[],a=0;a{"use strict";var Ko=tn(),vt=sn(),He=bt(),rc=Object.prototype.hasOwnProperty,qo={brackets:i(function(e){return e+"[]"},"brackets"),comma:"comma",indices:i(function(e,r){return e+"["+r+"]"},"indices"),repeat:i(function(e){return e},"repeat")},J=Array.isArray,nc=Array.prototype.push,Ho=i(function(t,e){nc.apply(t,J(e)?e:[e])},"pushToArray"),ac=Date.prototype.toISOString,Vo=He.default,B={addQueryPrefix:!1,allowDots:!1,allowEmptyArrays:!1,arrayFormat:"indices",charset:"utf-8",charsetSentinel:!1,commaRoundTrip:!1,delimiter:"&",depth:1/0,encode:!0,encodeDotInKeys:!1,encoder:vt.encode,encodeValuesOnly:!1,filter:void 0,format:Vo,formatter:He.formatters[Vo],indices:!1,serializeDate:i(function(e){return ac.call(e)},"serializeDate"),skipNulls:!1,strictNullHandling:!1},oc=i(function(e){return typeof e=="string"||typeof e=="number"||typeof e=="boolean"||typeof e=="symbol"||typeof e=="bigint"},"isNonNullishPrimitive"),pn={},ic=i(function t(e,r,n,a,o,s,p,m,u,y,c,f,l,T,b,x,g,v,d,S){var h=e;if(S>d)throw new RangeError("Input depth exceeded depth option of "+d);for(var D=v,R=0,F=!1;(D=D.get(pn))!==void 0&&!F;){var _=D.get(e);if(R+=1,typeof _<"u"){if(_===R)throw new RangeError("Cyclic object value");F=!0}typeof D.get(pn)>"u"&&(R=0)}if(h=typeof y=="function"?y(r,h):h,h instanceof Date?h=l(h):n==="comma"&&J(h)&&(h=vt.maybeMap(h,function(G){return G instanceof Date?l(G):G})),h===null){if(s)return b(u&&!x?u(r,B.encoder,g,"key",T):r);h=""}if(oc(h)||vt.isBuffer(h)){if(u){var H=x?r:u(r,B.encoder,g,"key",T);return[b(H)+"="+b(u(h,B.encoder,g,"value",T))]}return[b(r)+"="+b(String(h))]}var O=[];if(typeof h>"u")return O;var k;if(n==="comma"&&J(h))x&&u&&(h=vt.maybeMap(h,function(G){return G==null?G:u(G)})),k=[{value:h.length>0?h.join(",")||null:void 0}];else if(J(y))k=y;else{var L=Object.keys(h);k=c?L.sort(c):L}var U=m?String(r).replace(/\./g,"%2E"):String(r),A=a&&J(h)&&h.length===1?U+"[]":U;if(o&&J(h)&&h.length===0&&Object.keys(h).length===0)return A+"[]";for(var N=0;N"u"?e.encodeDotInKeys===!0?!0:B.allowDots:!!e.allowDots;return{addQueryPrefix:typeof e.addQueryPrefix=="boolean"?e.addQueryPrefix:B.addQueryPrefix,allowDots:p,allowEmptyArrays:typeof e.allowEmptyArrays=="boolean"?!!e.allowEmptyArrays:B.allowEmptyArrays,arrayFormat:s,charset:r,charsetSentinel:typeof e.charsetSentinel=="boolean"?e.charsetSentinel:B.charsetSentinel,commaRoundTrip:!!e.commaRoundTrip,delimiter:typeof e.delimiter>"u"?B.delimiter:e.delimiter,depth:typeof e.depth=="number"?e.depth:B.depth,encode:typeof e.encode=="boolean"?e.encode:B.encode,encodeDotInKeys:typeof e.encodeDotInKeys=="boolean"?e.encodeDotInKeys:B.encodeDotInKeys,encoder:typeof e.encoder=="function"?e.encoder:B.encoder,encodeValuesOnly:typeof e.encodeValuesOnly=="boolean"?e.encodeValuesOnly:B.encodeValuesOnly,filter:o,format:n,formatter:a,serializeDate:typeof e.serializeDate=="function"?e.serializeDate:B.serializeDate,skipNulls:typeof e.skipNulls=="boolean"?e.skipNulls:B.skipNulls,sort:typeof e.sort=="function"?e.sort:null,strictNullHandling:typeof e.strictNullHandling=="boolean"?e.strictNullHandling:B.strictNullHandling}},"normalizeStringifyOptions");Wo.exports=function(t,e){var r=t,n=sc(e),a,o;typeof n.filter=="function"?(o=n.filter,r=o("",r)):J(n.filter)&&(o=n.filter,a=o);var s=[];if(typeof r!="object"||r===null)return"";var p=qo[n.arrayFormat],m=p==="comma"&&n.commaRoundTrip;a||(a=Object.keys(r)),n.sort&&a.sort(n.sort);for(var u=Ko(),y=0;y"u"||c===null)){var f=r[c];if(!(n.skipNulls&&f===null)){var l=n.encodeDotInKeys?String(c).replace(/\./g,"%2E"):String(c);Ho(s,ic(f,l,p,m,n.allowEmptyArrays,n.strictNullHandling,n.skipNulls,n.encodeDotInKeys,n.encode?n.encoder:null,n.filter,n.sort,n.allowDots,n.serializeDate,n.format,n.formatter,n.encodeValuesOnly,n.charset,u,n.depth,0))}}}var T=s.join(n.delimiter),b=n.addQueryPrefix===!0?"?":"";return n.charsetSentinel&&(n.charset==="iso-8859-1"?b+="utf8=%26%2310003%3B"+n.delimiter:b+="utf8=%E2%9C%93"+n.delimiter),T.length>0?b+T:""}});var Qo=P((wy,zo)=>{"use strict";var Z=sn(),Ct=Object.prototype.hasOwnProperty,cn=Array.isArray,w={allowDots:!1,allowEmptyArrays:!1,allowPrototypes:!1,allowSparse:!1,arrayLimit:20,charset:"utf-8",charsetSentinel:!1,comma:!1,decodeDotInKeys:!1,decoder:Z.decode,delimiter:"&",depth:5,duplicates:"combine",ignoreQueryPrefix:!1,interpretNumericEntities:!1,parameterLimit:1e3,parseArrays:!0,plainObjects:!1,strictDepth:!1,strictMerge:!0,strictNullHandling:!1,throwOnLimitExceeded:!1},pc=i(function(t){return t.replace(/&#(\d+);/g,function(e,r){return String.fromCharCode(parseInt(r,10))})},"interpretNumericEntities"),$o=i(function(t,e,r){if(t&&typeof t=="string"&&e.comma&&t.indexOf(",")>-1){if(e.throwOnLimitExceeded)for(var n=0,a=t.indexOf(",");a>-1;){if(n+=1,n>=e.arrayLimit)throw new RangeError("Array limit exceeded. Only "+e.arrayLimit+" element"+(e.arrayLimit===1?"":"s")+" allowed in an array.");a=t.indexOf(",",a+1)}return t.split(",")}if(e.throwOnLimitExceeded&&r>=e.arrayLimit)throw new RangeError("Array limit exceeded. Only "+e.arrayLimit+" element"+(e.arrayLimit===1?"":"s")+" allowed in an array.");return t},"parseArrayValue"),cc="utf8=%26%2310003%3B",mc="utf8=%E2%9C%93",yc=i(function(e,r){var n={__proto__:null},a=r.ignoreQueryPrefix?e.replace(/^\?/,""):e;a=a.replace(/%5B/gi,"[").replace(/%5D/gi,"]");var o=r.parameterLimit===1/0?void 0:r.parameterLimit,s=a.split(r.delimiter,r.throwOnLimitExceeded&&typeof o<"u"?o+1:o);if(r.throwOnLimitExceeded&&typeof o<"u"&&s.length>o)throw new RangeError("Parameter limit exceeded. Only "+o+" parameter"+(o===1?"":"s")+" allowed.");var p=-1,m,u=r.charset;if(r.charsetSentinel)for(m=0;m-1&&(T=cn(T)?[T]:T),r.comma&&cn(T)&&T.length>r.arrayLimit&&(T=Z.combine([],T,r.arrayLimit,r.plainObjects,r.throwOnLimitExceeded)),l!==null){var b=Ct.call(n,l);b&&(r.duplicates==="combine"||y.indexOf("[]=")>-1)?n[l]=Z.combine(n[l],T,r.arrayLimit,r.plainObjects,r.throwOnLimitExceeded):(!b||r.duplicates==="last")&&(n[l]=T)}}return n},"parseQueryStringValues"),uc=i(function(t,e,r,n){var a=0;if(t.length>0&&t[t.length-1]==="[]"){var o=t.slice(0,-1).join("");a=Array.isArray(e)&&e[o]?e[o].length:0}for(var s=n?e:$o(e,r,a),p=t.length-1;p>=0;--p){var m,u=t[p];if(u==="[]"&&r.parseArrays)Z.isOverflow(s)?m=s:m=r.allowEmptyArrays&&(s===""||r.strictNullHandling&&s===null)?[]:Z.combine([],s,r.arrayLimit,r.plainObjects,r.throwOnLimitExceeded);else{m=r.plainObjects?{__proto__:null}:{};var y=u.charAt(0)==="["&&u.charAt(u.length-1)==="]"?u.slice(1,-1):u,c=r.decodeDotInKeys?y.replace(/%2E/g,"."):y,f=parseInt(c,10),l=!isNaN(f)&&u!==c&&String(f)===c&&f>=0&&r.parseArrays;if(!r.parseArrays&&c==="")m={0:s};else if(l&&f=0?n.slice(0,o):n;if(s){if(!r.plainObjects&&Ct.call(Object.prototype,s)&&!r.allowPrototypes)return;a[a.length]=s}for(var p=n.length,m=o,u=0;m>=0&&u=0){if(r.strictDepth===!0)throw new RangeError("Input depth exceeded depth option of "+r.depth+" and strictDepth is true");a[a.length]="["+n.slice(m)+"]"}return a},"splitKeyIntoSegments"),fc=i(function(e,r,n,a){if(e){var o=lc(e,n);if(o)return uc(o,r,n,a)}},"parseQueryStringKeys"),dc=i(function(e){if(!e)return w;if(typeof e.allowEmptyArrays<"u"&&typeof e.allowEmptyArrays!="boolean")throw new TypeError("`allowEmptyArrays` option can only be `true` or `false`, when provided");if(typeof e.decodeDotInKeys<"u"&&typeof e.decodeDotInKeys!="boolean")throw new TypeError("`decodeDotInKeys` option can only be `true` or `false`, when provided");if(e.decoder!==null&&typeof e.decoder<"u"&&typeof e.decoder!="function")throw new TypeError("Decoder has to be a function.");if(typeof e.charset<"u"&&e.charset!=="utf-8"&&e.charset!=="iso-8859-1")throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");if(typeof e.throwOnLimitExceeded<"u"&&typeof e.throwOnLimitExceeded!="boolean")throw new TypeError("`throwOnLimitExceeded` option must be a boolean");var r=typeof e.charset>"u"?w.charset:e.charset,n=typeof e.duplicates>"u"?w.duplicates:e.duplicates;if(n!=="combine"&&n!=="first"&&n!=="last")throw new TypeError("The duplicates option must be either combine, first, or last");var a=typeof e.allowDots>"u"?e.decodeDotInKeys===!0?!0:w.allowDots:!!e.allowDots;return{allowDots:a,allowEmptyArrays:typeof e.allowEmptyArrays=="boolean"?!!e.allowEmptyArrays:w.allowEmptyArrays,allowPrototypes:typeof e.allowPrototypes=="boolean"?e.allowPrototypes:w.allowPrototypes,allowSparse:typeof e.allowSparse=="boolean"?e.allowSparse:w.allowSparse,arrayLimit:typeof e.arrayLimit=="number"?e.arrayLimit:w.arrayLimit,charset:r,charsetSentinel:typeof e.charsetSentinel=="boolean"?e.charsetSentinel:w.charsetSentinel,comma:typeof e.comma=="boolean"?e.comma:w.comma,decodeDotInKeys:typeof e.decodeDotInKeys=="boolean"?e.decodeDotInKeys:w.decodeDotInKeys,decoder:typeof e.decoder=="function"?e.decoder:w.decoder,delimiter:typeof e.delimiter=="string"||Z.isRegExp(e.delimiter)?e.delimiter:w.delimiter,depth:typeof e.depth=="number"||e.depth===!1?+e.depth:w.depth,duplicates:n,ignoreQueryPrefix:e.ignoreQueryPrefix===!0,interpretNumericEntities:typeof e.interpretNumericEntities=="boolean"?e.interpretNumericEntities:w.interpretNumericEntities,parameterLimit:typeof e.parameterLimit=="number"?e.parameterLimit:w.parameterLimit,parseArrays:e.parseArrays!==!1,plainObjects:typeof e.plainObjects=="boolean"?e.plainObjects:w.plainObjects,strictDepth:typeof e.strictDepth=="boolean"?!!e.strictDepth:w.strictDepth,strictMerge:typeof e.strictMerge=="boolean"?!!e.strictMerge:w.strictMerge,strictNullHandling:typeof e.strictNullHandling=="boolean"?e.strictNullHandling:w.strictNullHandling,throwOnLimitExceeded:typeof e.throwOnLimitExceeded=="boolean"?e.throwOnLimitExceeded:!1}},"normalizeParseOptions");zo.exports=function(t,e){var r=dc(e);if(t===""||t===null||typeof t>"u")return r.plainObjects?{__proto__:null}:{};for(var n=typeof t=="string"?yc(t,r):t,a=r.plainObjects?{__proto__:null}:{},o=Object.keys(n),s=0;s{"use strict";var hc=Go(),gc=Qo(),Tc=bt();Yo.exports={formats:Tc,parse:gc,stringify:hc}});var Xo=P((Iy,Zo)=>{"use strict";Zo.exports=i(function(e,r){if(r=r.split(":")[0],e=+e,!e)return!1;switch(r){case"http":case"ws":return e!==80;case"https":case"wss":return e!==443;case"ftp":return e!==21;case"gopher":return e!==70;case"file":return!1}return e!==0},"required")});var ri=P(mn=>{"use strict";var xc=Object.prototype.hasOwnProperty,Sc;function ei(t){try{return decodeURIComponent(t.replace(/\+/g," "))}catch{return null}}i(ei,"decode");function ti(t){try{return encodeURIComponent(t)}catch{return null}}i(ti,"encode");function Pc(t){for(var e=/([^=?#&]+)=?([^&]*)/g,r={},n;n=e.exec(t);){var a=ei(n[1]),o=ei(n[2]);a===null||o===null||a in r||(r[a]=o)}return r}i(Pc,"querystring");function Ac(t,e){e=e||"";var r=[],n,a;typeof e!="string"&&(e="?");for(a in t)if(xc.call(t,a)){if(n=t[a],!n&&(n===null||n===Sc||isNaN(n))&&(n=""),a=ti(a),n=ti(n),a===null||n===null)continue;r.push(a+"="+n)}return r.length?e+r.join("&"):""}i(Ac,"querystringify");mn.stringify=Ac;mn.parse=Pc});var mi=P((jy,ci)=>{"use strict";var ai=Xo(),Et=ri(),bc=/^[\x00-\x20\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]+/,oi=/[\n\r\t]/g,Dc=/^[A-Za-z][A-Za-z0-9+-.]*:\/\//,ii=/:\d+$/,Oc=/^([a-z][a-z0-9.+-]*:)?(\/\/)?([\\/]+)?([\S\s]*)/i,vc=/^[a-zA-Z]:/;function un(t){return(t||"").toString().replace(bc,"")}i(un,"trimLeft");var yn=[["#","hash"],["?","query"],i(function(e,r){return X(r.protocol)?e.replace(/\\/g,"/"):e},"sanitize"),["/","pathname"],["@","auth",1],[NaN,"host",void 0,1,1],[/:(\d*)$/,"port",void 0,1],[NaN,"hostname",void 0,1,1]],ni={hash:1,query:1};function si(t){var e;typeof window<"u"?e=window:typeof global<"u"?e=global:typeof self<"u"?e=self:e={};var r=e.location||{};t=t||r;var n={},a=typeof t,o;if(t.protocol==="blob:")n=new ee(unescape(t.pathname),{});else if(a==="string"){n=new ee(t,{});for(o in ni)delete n[o]}else if(a==="object"){for(o in t)o in ni||(n[o]=t[o]);n.slashes===void 0&&(n.slashes=Dc.test(t.href))}return n}i(si,"lolcation");function X(t){return t==="file:"||t==="ftp:"||t==="http:"||t==="https:"||t==="ws:"||t==="wss:"}i(X,"isSpecial");function pi(t,e){t=un(t),t=t.replace(oi,""),e=e||{};var r=Oc.exec(t),n=r[1]?r[1].toLowerCase():"",a=!!r[2],o=!!r[3],s=0,p;return a?o?(p=r[2]+r[3]+r[4],s=r[2].length+r[3].length):(p=r[2]+r[4],s=r[2].length):o?(p=r[3]+r[4],s=r[3].length):p=r[4],n==="file:"?s>=2&&(p=p.slice(2)):X(n)?p=r[4]:n?a&&(p=p.slice(2)):s>=2&&X(e.protocol)&&(p=r[4]),{protocol:n,slashes:a||X(n),slashesCount:s,rest:p}}i(pi,"extractProtocol");function Cc(t,e){if(t==="")return e;for(var r=(e||"/").split("/").slice(0,-1).concat(t.split("/")),n=r.length,a=r[n-1],o=!1,s=0;n--;)r[n]==="."?r.splice(n,1):r[n]===".."?(r.splice(n,1),s++):s&&(n===0&&(o=!0),r.splice(n,1),s--);return o&&r.unshift(""),(a==="."||a==="..")&&r.push(""),r.join("/")}i(Cc,"resolve");function ee(t,e,r){if(t=un(t),t=t.replace(oi,""),!(this instanceof ee))return new ee(t,e,r);var n,a,o,s,p,m,u=yn.slice(),y=typeof e,c=this,f=0;for(y!=="object"&&y!=="string"&&(r=e,e=null),r&&typeof r!="function"&&(r=Et.parse),e=si(e),a=pi(t||"",e),n=!a.protocol&&!a.slashes,c.slashes=a.slashes||n&&e.slashes,c.protocol=a.protocol||e.protocol||"",t=a.rest,(a.protocol==="file:"&&(a.slashesCount!==2||vc.test(t))||!a.slashes&&(a.protocol||a.slashesCount<2||!X(c.protocol)))&&(u[3]=[/(.*)/,"pathname"]);fFr,AuthenticationType:()=>Xe,ConnectionRequirement:()=>we,ContextualTriggerAssistMode:()=>Jt,ContextualTriggerDecorationStyle:()=>Xt,ContextualTriggerSuggestionColor:()=>Zt,ContextualTriggerSurface:()=>er,CurrencyFormat:()=>Sr,DataIndexing:()=>ur,DefaultTriggerKind:()=>tt,DurationUnit:()=>Cr,EmailDisplayType:()=>Ar,EmbeddedContentType:()=>Qt,EventTriggerType:()=>rt,FilterCombinator:()=>rr,FilterOperator:()=>tr,ImageCornerStyle:()=>Or,ImageOutline:()=>Dr,ImageShapeStyle:()=>vr,IndexingStrategy:()=>Er,InvocationSource:()=>mr,KnowledgeToolSourceType:()=>$t,LinkDisplayType:()=>br,MailEventType:()=>nr,MailFilterField:()=>ar,MissingScopesError:()=>Mt,NetworkConnection:()=>pr,NotetakerEventType:()=>ir,NotetakerFilterField:()=>sr,OptionsType:()=>ot,PackDefinitionBuilder:()=>$e,ParameterType:()=>at,PermissionSyncMode:()=>cr,PostSetupType:()=>Wt,PrecannedDateRange:()=>yr,PropertyLabelValueTemplate:()=>In,ResponseSizeTooLargeError:()=>It,ScaleIconSet:()=>Pr,ScreenAnnotationType:()=>zt,SkillModel:()=>Yt,SlackEventType:()=>or,StatusCodeError:()=>Rt,SvgConstants:()=>Ht,TokenExchangeCredentialsLocation:()=>Gt,ToolType:()=>et,Type:()=>nt,UpdateOutcome:()=>dn,UserVisibleError:()=>xe,ValidFetchMethods:()=>vn,ValueHintType:()=>ct,ValueType:()=>Re,assertCondition:()=>re,autocompleteSearchObjects:()=>Ti,ensureExists:()=>V,ensureNonEmptyString:()=>Te,ensureUnreachable:()=>me,generateSchema:()=>pt,getEffectivePropertyKeysFromSchema:()=>Ei,getQueryParams:()=>yi,joinUrl:()=>ui,makeAttributionNode:()=>_n,makeDynamicSyncTable:()=>Vt,makeEmptyFormula:()=>Si,makeFormula:()=>We,makeMetadataFormula:()=>Ut,makeObjectSchema:()=>ye,makeParameter:()=>_t,makePropertyOptionsFormula:()=>Lt,makeReferenceSchemaFromObjectSchema:()=>Un,makeSchema:()=>Bn,makeSimpleAutocompleteMetadataFormula:()=>gn,makeSyncTable:()=>Ge,makeTranslateObjectFormula:()=>xi,newAgent:()=>vi,newPack:()=>Oi,simpleAutocomplete:()=>hn,withIdentity:()=>Ln,withQueryParams:()=>kt});module.exports=Ni($c);var Xe=(g=>(g.None="None",g.HeaderBearerToken="HeaderBearerToken",g.CustomHeaderToken="CustomHeaderToken",g.MultiHeaderToken="MultiHeaderToken",g.QueryParamToken="QueryParamToken",g.MultiQueryParamToken="MultiQueryParamToken",g.OAuth2="OAuth2",g.OAuth2ClientCredentials="OAuth2ClientCredentials",g.WebBasic="WebBasic",g.Custom="Custom",g.AWSAccessKey="AWSAccessKey",g.AWSAssumeRole="AWSAssumeRole",g.CodaApiHeaderBearerToken="CodaApiHeaderBearerToken",g.GoogleDomainWideDelegation="GoogleDomainWideDelegation",g.GoogleServiceAccount="GoogleServiceAccount",g.EntraCertificate="EntraCertificate",g.Various="Various",g))(Xe||{}),Wt=(e=>(e.SetEndpoint="SetEndPoint",e))(Wt||{}),Gt=(n=>(n.Automatic="Automatic",n.Body="Body",n.AuthorizationHeader="AuthorizationHeader",n))(Gt||{});var et=(u=>(u.Pack="Pack",u.Knowledge="Knowledge",u.ScreenAnnotation="ScreenAnnotation",u.MCP="MCP",u.ContactResolution="ContactResolution",u.CodaDocsAndTables="CodaDocsAndTables",u.WebSearch="WebSearch",u.EmbeddedContent="EmbeddedContent",u.MailAndCalendar="MailAndCalendar",u))(et||{}),$t=(r=>(r.Global="Global",r.Pack="Pack",r))($t||{}),zt=(r=>(r.Rewrite="Rewrite",r.Guide="Guide",r))(zt||{}),Qt=(n=>(n.CopyableBlock="CopyableBlock",n.CarouselView="CarouselView",n.TabView="TabView",n))(Qt||{}),Yt=(r=>(r.OpenAIGPT4="OpenAIGPT4",r.OpenAIGPT5="OpenAIGPT5",r))(Yt||{}),Jt=(r=>(r.OnDemand="on_demand",r.Proactive="proactive",r))(Jt||{}),Zt=(m=>(m.Blue="blue",m.Green="green",m.Mulberry="mulberry",m.Neutral="neutral",m.Orange="orange",m.Purple="purple",m.Red="red",m.Yellow="yellow",m))(Zt||{}),Xt=(r=>(r.Auto="auto",r.Underline="underline",r))(Xt||{}),er=(p=>(p.ChatAndMessages="chat_messages",p.CodingEnvironment="coding_environment",p.CustomerService="customer_service",p.Docs="docs",p.Email="email",p.SearchAndBrowser="search_browser",p.SocialMedia="social_media",p))(er||{}),tt=(n=>(n.Event="event",n.Schedule="schedule",n.WhileWriting="whileWriting",n))(tt||{}),rt=(n=>(n.Mail="mail",n.Notetaker="notetaker",n.Slack="slack",n))(rt||{}),tr=(p=>(p.NumberAtLeast="numberAtLeast",p.NumberAtMost="numberAtMost",p.NumberEquals="numberEquals",p.TextContains="textContains",p.TextDoesNotContain="textDoesNotContain",p.TextDoesNotEqual="textDoesNotEqual",p.TextEquals="textEquals",p))(tr||{}),rr=(r=>(r.And="and",r.Or="or",r))(rr||{}),nr=(r=>(r.MessageReceived="message_received",r.MessageSent="message_sent",r))(nr||{}),ar=(a=>(a.Body="body",a.From="from",a.Subject="subject",a.To="to",a))(ar||{}),or=(e=>(e.MessageKeyword="message_keyword",e))(or||{}),ir=(e=>(e.MeetingSummaryCompleted="meeting.summary.completed",e))(ir||{}),sr=(p=>(p.DurationMinutes="durationMinutes",p.HasExternalAttendees="hasExternalAttendees",p.IsRecurring="isRecurring",p.MeetingType="meetingType",p.Participant="participant",p.ParticipantCount="participantCount",p.ProjectTag="projectTag",p))(sr||{});var nt=(y=>(y[y.string=0]="string",y[y.number=1]="number",y[y.object=2]="object",y[y.boolean=3]="boolean",y[y.date=4]="date",y[y.html=5]="html",y[y.image=6]="image",y[y.file=7]="file",y[y.markdown=8]="markdown",y[y.email=9]="email",y))(nt||{});var at=(O=>(O.String="string",O.Number="number",O.Boolean="boolean",O.Date="date",O.Html="html",O.Image="image",O.File="file",O.Markdown="markdown",O.Email="email",O.StringArray="stringArray",O.SparseStringArray="sparseStringArray",O.NumberArray="numberArray",O.SparseNumberArray="sparseNumberArray",O.BooleanArray="booleanArray",O.SparseBooleanArray="sparseBooleanArray",O.EmailArray="emailArray",O.SparseEmailArray="sparseEmailArray",O.DateArray="dateArray",O.SparseDateArray="sparseDateArray",O.HtmlArray="htmlArray`",O.SparseHtmlArray="sparseHtmlArray",O.ImageArray="imageArray",O.SparseImageArray="sparseImageArray",O.FileArray="fileArray",O.SparseFileArray="sparseFileArray",O.MarkdownArray="markdownArray`",O.SparseMarkdownArray="sparseMarkdownArray",O))(at||{}),On={string:0,number:1,boolean:3,date:4,html:5,image:6,file:7,markdown:8,email:9,stringArray:{type:"array",items:0},numberArray:{type:"array",items:1},booleanArray:{type:"array",items:3},dateArray:{type:"array",items:4},"htmlArray`":{type:"array",items:5},imageArray:{type:"array",items:6},fileArray:{type:"array",items:7},"markdownArray`":{type:"array",items:8},emailArray:{type:"array",items:9},sparseStringArray:{type:"array",items:0,allowEmpty:!0},sparseNumberArray:{type:"array",items:1,allowEmpty:!0},sparseBooleanArray:{type:"array",items:3,allowEmpty:!0},sparseDateArray:{type:"array",items:4,allowEmpty:!0},sparseHtmlArray:{type:"array",items:5,allowEmpty:!0},sparseImageArray:{type:"array",items:6,allowEmpty:!0},sparseFileArray:{type:"array",items:7,allowEmpty:!0},sparseMarkdownArray:{type:"array",items:8,allowEmpty:!0},sparseEmailArray:{type:"array",items:9,allowEmpty:!0}};var we=(n=>(n.None="none",n.Optional="optional",n.Required="required",n))(we||{}),pr=(n=>(n.None="none",n.Optional="optional",n.Required="required",n))(pr||{}),vn=["GET","PATCH","POST","PUT","DELETE","HEAD"],cr=(r=>(r.Personal="Personal",r.PermissionAware="PermissionAware",r))(cr||{});var mr=(a=>(a.Brain="Brain",a.Doc="Doc",a.Go="Go",a.NativeIntegration="NativeIntegration",a))(mr||{});var yr=(A=>(A.Yesterday="yesterday",A.Last7Days="last_7_days",A.Last30Days="last_30_days",A.Last90Days="last_90_days",A.Last180Days="last_180_days",A.Last365Days="last_365_days",A.LastWeek="last_week",A.LastMonth="last_month",A.Last3Months="last_3_months",A.Last6Months="last_6_months",A.LastYear="last_year",A.Today="today",A.ThisWeek="this_week",A.ThisMonth="this_month",A.YearToDate="year_to_date",A.ThisYear="this_year",A.Last7AndNext7Days="last_7_and_next_7_days",A.Last30AndNext30Days="last_30_and_next_30_days",A.Last90AndNext90Days="last_90_and_next_90_days",A.Tomorrow="tomorrow",A.Next7Days="next_7_days",A.Next30Days="next_30_days",A.Next90Days="next_90_days",A.Next180Days="next_180_days",A.Next365Days="next_365_days",A.NextWeek="next_week",A.NextMonth="next_month",A.Next3Months="next_3_months",A.Next6Months="next_6_months",A.NextYear="next_year",A.Everything="everything",A))(yr||{}),Bi=["today","last_7_days","last_30_days","last_90_days","last_180_days","last_365_days","year_to_date"],Yc=[...Bi,"yesterday","last_week","last_month","last_year","this_week","this_month","this_year","everything"];var Cn=(l=>(l.Today="today",l.Yesterday="yesterday",l.Tomorrow="tomorrow",l.DaysAgo7="7_days_ago",l.DaysAgo30="30_days_ago",l.DaysAgo90="90_days_ago",l.DaysAgo180="180_days_ago",l.DaysAgo365="365_days_ago",l.DaysAhead7="7_days_ahead",l.DaysAhead30="30_days_ahead",l.DaysAhead90="90_days_ahead",l.DaysAhead180="180_days_ahead",l.DaysAhead365="365_days_ahead",l))(Cn||{}),Jc=Object.values(Cn);var ot=(e=>(e.Dynamic="__coda_dynamic__",e))(ot||{});var ur=(r=>(r.Include="include",r.Exclude="exclude",r))(ur||{});function lr(t){Object.freeze(t);for(let e of Object.keys(t)){let n=t[e];n!==null&&(typeof n=="object"||typeof n=="function")&&!Object.isFrozen(n)&&lr(n)}return t}i(lr,"deepFreeze");function z(t){return JSON.parse(JSON.stringify(t))}i(z,"deepCopy");function En(t){return t&&typeof t=="object"&&"then"in t}i(En,"isPromise");function me(t,e){throw new Error(e||`Unreachable code hit with value ${String(t)}`)}i(me,"ensureUnreachable");function Te(t,e){if(typeof t!="string"||t.length===0)throw new(fr(e))(e||`Expected non-empty string for ${String(t)}`);return t}i(Te,"ensureNonEmptyString");function V(t,e){if(typeof t>"u"||t===null)throw new(fr(e))(e||`Expected value for ${String(t)}`);return t}i(V,"ensureExists");function fr(t){return t?xe:Error}i(fr,"getErrorConstructor");function re(t,e){if(!t)throw new(fr(e))(e||"Assertion failed")}i(re,"assertCondition");function Se(t){return new dr(t)}i(Se,"objectSchemaHelper");var gr=class gr{constructor(e){this._schema=e,this._checkAgainstAllProperties(e)}_checkAgainstAllProperties(e){let{id:r,idProperty:n,primary:a,displayProperty:o,featuredProperties:s,featured:p,identity:m,options:u,properties:y,type:c,attribution:f,codaType:l,requireForUpdates:T,includeUnknownProperties:b,titleProperty:x,linkProperty:g,subtitleProperties:v,snippetProperty:d,imageProperty:S,description:h,createdAtProperty:D,createdByProperty:R,modifiedAtProperty:F,modifiedByProperty:_,userEmailProperty:H,userIdProperty:O,groupIdProperty:k,memberGroupIdProperty:L,versionProperty:U,index:A,parent:N,...M}=e;}get id(){return this._schema.idProperty??this._schema.id}get primary(){return this._schema.displayProperty??this._schema.primary}get featured(){return this._schema.featuredProperties??this._schema.featured}get identity(){return this._schema.identity}get options(){return this._schema.options}get properties(){return this._schema.properties}get type(){return this._schema.type}get attribution(){return this._schema.attribution??this._schema.identity?.attribution}get codaType(){return this._schema.codaType}get requireForUpdates(){return this._schema.requireForUpdates}get titleProperty(){return this._schema.titleProperty??this._schema.displayProperty}};i(gr,"ObjectSchemaHelper");var dr=gr;function Fn(t){return new hr(t)}i(Fn,"setEndpointDefHelper");var Tr=class Tr{constructor(e){this._step=e}get getOptions(){return V(this._step.getOptions??this._step.getOptionsFormula)}};i(Tr,"SetEndpointDefHelper");var hr=Tr;var Mn=Ze(wn());var Re=(o=>(o.Boolean="boolean",o.Number="number",o.String="string",o.Array="array",o.Object="object",o))(Re||{}),ct=(D=>(D.Date="date",D.Time="time",D.DateTime="datetime",D.Duration="duration",D.Email="email",D.Person="person",D.Percent="percent",D.Currency="currency",D.ImageReference="image",D.ImageAttachment="imageAttachment",D.Url="url",D.Markdown="markdown",D.Html="html",D.Embed="embed",D.Reference="reference",D.Attachment="attachment",D.Slider="slider",D.Scale="scale",D.ProgressBar="progressBar",D.Toggle="toggle",D.CodaInternalRichText="codaInternalRichText",D.SelectList="selectList",D))(ct||{});var Sr=(n=>(n.Currency="currency",n.Accounting="accounting",n.Financial="financial",n))(Sr||{}),Pr=(S=>(S.Star="star",S.Circle="circle",S.Fire="fire",S.Bug="bug",S.Diamond="diamond",S.Bell="bell",S.ThumbsUp="thumbsup",S.Heart="heart",S.Chili="chili",S.Smiley="smiley",S.Lightning="lightning",S.Currency="currency",S.Coffee="coffee",S.Person="person",S.Battery="battery",S.Cocktail="cocktail",S.Cloud="cloud",S.Sun="sun",S.Checkmark="checkmark",S.LightBulb="lightbulb",S))(Pr||{}),Ar=(n=>(n.IconAndEmail="iconAndEmail",n.IconOnly="iconOnly",n.EmailOnly="emailOnly",n))(Ar||{}),br=(o=>(o.IconOnly="iconOnly",o.Url="url",o.Title="title",o.Card="card",o.Embed="embed",o))(br||{}),Dr=(r=>(r.Disabled="disabled",r.Solid="solid",r))(Dr||{}),Or=(r=>(r.Rounded="rounded",r.Square="square",r))(Or||{}),vr=(r=>(r.Auto="auto",r.Circle="circle",r))(vr||{}),Cr=(a=>(a.Days="days",a.Hours="hours",a.Minutes="minutes",a.Seconds="seconds",a))(Cr||{});var In="{VALUE}",Er=(r=>(r.Standard="standard",r.Raw="raw",r))(Er||{});var Fr=(n=>(n[n.Text=1]="Text",n[n.Link=2]="Link",n[n.Image=3]="Image",n))(Fr||{});function _n(t){return t}i(_n,"makeAttributionNode");function Nn(t){return!!(t&&t.type==="object")}i(Nn,"isObject");function st(t){return!!(t&&t.type==="array")}i(st,"isArray");function kr(t){return!!t?.codaType&&["selectList","reference"].includes(t.codaType)}i(kr,"unwrappedSchemaSupportsOptions");function Pe(t){if(!st(t))return t;if(!st(t.items))return t.items}i(Pe,"maybeUnwrapArraySchema");function pt(t){if(Array.isArray(t)){if(t.length===0)throw new Error("Must have representative value.");return{type:"array",items:pt(t[0])}}if(typeof t=="object"){let e={};if(t===null)return{type:"string"};for(let r in t)t.hasOwnProperty(r)&&(e[r]=pt(t[r]));return{type:"object",properties:e}}else{if(typeof t=="string")return{type:"string"};if(typeof t=="boolean")return{type:"boolean"};if(typeof t=="number")return{type:"number"}}return me(t)}i(pt,"generateSchema");function Bn(t){return t}i(Bn,"makeSchema");function ye(t){let e={...t,type:"object"};for(let r of Object.keys(e.properties))if(r!=="type"){let n=r,o=Pe(e.properties[r])?.options,s=typeof o=="function"?o:void 0;if(e.properties[n]=z(e.properties[r]),s){let p=Pe(e.properties[n]);V(p,"deepCopy() broke maybeUnwrapArraySchema?..."),p.options=s}}return jn(e),e}i(ye,"makeObjectSchema");function jn(t){if(t.codaType==="reference"){let{id:e,identity:r,primary:n}=Se(t);it(e,"idProperty",t.codaType),it(r,"identity",t.codaType),it(n,"displayProperty",t.codaType),xr(V(e),t,"idProperty"),xr(V(n),t,"displayProperty")}if(t.codaType==="person"){let{id:e}=Se(t);it(e,"idProperty",t.codaType),xr(V(e),t,"idProperty")}for(let[e,r]of Object.entries(t.properties))r.type==="object"&&jn(r)}i(jn,"validateObjectSchema");function it(t,e,r){V(t,`Objects with codaType "${r}" require a "${e}" property in the schema definition.`)}i(it,"checkRequiredFieldInObjectSchema");function xr(t,e,r){let{properties:n,codaType:a}=e;re(n[t],`${r} set to undefined field "${t}"`),re(n[t].required,`Field "${t}" must be marked as required in schema with codaType "${a}".`)}i(xr,"checkSchemaPropertyIsRequired");function $(t){return(0,Mn.default)(t).replace(/:/g,"_")}i($,"normalizeSchemaKey");function Rn(t,e){return e.hasOwnProperty($(t))?$(t):t.split(".").map(r=>{let n=r,a="";return r.includes("[")&&(n=r.substring(0,r.indexOf("[")),a=r.substring(r.indexOf("["))),$(n)+a}).join(".")}i(Rn,"normalizeSchemaKeyPath");function E(t,e){if(typeof t=="string")return Rn(t,e);let{label:r,property:n,placeholder:a,...o}=t;return{property:Rn(n,e),label:r,placeholder:a}}i(E,"normalizeSchemaPropertyIdentifier");function Li(t,e){if(typeof t=="object"&&"strategy"in t){let{property:r,strategy:n,...a}=t;return{property:E(r,e),strategy:n}}return E(t,e)}i(Li,"normalizeIndexProperty");function Vi(t,e){switch(t.type){case"Messaging":case"Document":case"Comment":{let{type:r,...n}=t;return{type:r}}case"Email":{let{type:r,toProperty:n,fromProperty:a,subjectProperty:o,htmlBodyProperty:s,plainTextBodyProperty:p,...m}=t;return{type:r,toProperty:E(n,e),fromProperty:E(a,e),subjectProperty:E(o,e),htmlBodyProperty:E(s,e),plainTextBodyProperty:E(p,e)}}default:return me(t)}}i(Vi,"normalizeContentCategorization");function Ki(t){return"contentCategorization"in t}i(Ki,"isCategorizationIndexDefinition");function qi(t,e){if(Ki(t)){let{contentCategorization:m,authorityNormProperty:u,popularityNormProperty:y,filterableProperties:c,...f}=t;return{contentCategorization:Vi(m,e),authorityNormProperty:u?E(u,e):void 0,popularityNormProperty:y?E(y,e):void 0,filterableProperties:c?.map(l=>E(l,e))}}let{properties:r,contextProperties:n,authorityNormProperty:a,popularityNormProperty:o,filterableProperties:s,...p}=t;return{properties:r.map(m=>Li(m,e)),contextProperties:n?n.map(m=>E(m,e)):void 0,authorityNormProperty:a?E(a,e):void 0,popularityNormProperty:o?E(o,e):void 0,filterableProperties:s?.map(m=>E(m,e))}}i(qi,"normalizeIndexDefinition");function Hi(t,e){return{parentIdProperty:E(t.parentIdProperty,e),permissions:t.permissions,lifecycle:t.lifecycle}}i(Hi,"normalizeParentDefinition");function ie(t){return st(t)?{...t,type:"array",items:ie(t.items)}:Nn(t)?Wi(t):{...t}}i(ie,"normalizeSchema");function Wi(t){let e={},{attribution:r,options:n,requireForUpdates:a,codaType:o,description:s,displayProperty:p,featured:m,featuredProperties:u,id:y,identity:c,idProperty:f,imageProperty:l,includeUnknownProperties:T,linkProperty:b,primary:x,properties:g,snippetProperty:v,subtitleProperties:d,titleProperty:S,type:h,__packId:D,createdAtProperty:R,createdByProperty:F,modifiedAtProperty:_,modifiedByProperty:H,userEmailProperty:O,userIdProperty:k,groupIdProperty:L,memberGroupIdProperty:U,versionProperty:A,index:N,parent:M,...W}=t;for(let q of Object.keys(g)){let ae=$(q),oe=g[q],{displayName:G,fixedId:ze,fromKey:Qe,mutable:Ye,originalKey:te,required:Je}=oe;if(te)throw new Error("Original key is only for internal use.");let Fi={displayName:G,fixedId:ze,fromKey:Qe||(ae!==q?q:void 0),mutable:Ye,originalKey:q,required:Je};e[ae]=Object.assign(ie(oe),Fi)}return{attribution:r,options:n,requireForUpdates:a,codaType:o,description:s,displayProperty:p?$(p):void 0,featured:m?m.map($):void 0,featuredProperties:u?u.map($):void 0,id:y?$(y):void 0,identity:c,idProperty:f?$(f):void 0,imageProperty:l?E(l,e):void 0,includeUnknownProperties:T,linkProperty:b?E(b,e):void 0,primary:x?$(x):void 0,properties:e,snippetProperty:v?E(v,e):void 0,subtitleProperties:d?d.map(q=>E(q,e)):void 0,titleProperty:S?E(S,e):void 0,createdAtProperty:R?E(R,e):void 0,createdByProperty:F?E(F,e):void 0,modifiedAtProperty:_?E(_,e):void 0,modifiedByProperty:H?E(H,e):void 0,userEmailProperty:O?E(O,e):void 0,userIdProperty:k?E(k,e):void 0,groupIdProperty:L?E(L,e):void 0,memberGroupIdProperty:U?E(U,e):void 0,versionProperty:A?E(A,e):void 0,index:N?qi(N,e):void 0,parent:M?Hi(M,e):void 0,type:"object"}}i(Wi,"normalizeObjectSchema");function Un(t,e){let{type:r,id:n,primary:a,identity:o,properties:s,options:p,requireForUpdates:m}=Se(t),{mutable:u}=t;V(o||e,"Source schema must have an identity field, or you must provide an identity name for the reference.");let y=V(n),c={[y]:s[y]};a&&a!==n&&(V(s[a],`Display property "${a}" must refer to a valid property schema.`),c[a]=s[a]);let f={codaType:"reference",displayProperty:a,identity:o||{name:V(e)},idProperty:n,options:p,properties:c,type:r,requireForUpdates:m};return{...ye(f),mutable:u}}i(Un,"makeReferenceSchemaFromObjectSchema");function Ln(t,e){return{...z(t),identity:{name:Te(e)}}}i(Ln,"withIdentity");var fi=Ze(Vn());var Ft=Ze(Jo()),ln=Ze(mi());function kt(t,e){if(!e)return t;let r=(0,ln.default)(t),n=Object.assign({},Ft.default.parse(r.query,{ignoreQueryPrefix:!0}),e);return r.set("query",Ft.default.stringify(JSON.parse(JSON.stringify(n)),{addQueryPrefix:!0})),r.toString()}i(kt,"withQueryParams");function yi(t){let e=(0,ln.default)(t);return Ft.default.parse(e.query,{ignoreQueryPrefix:!0})}i(yi,"getQueryParams");function ui(...t){if(!t||!t.length)return"";let e=[];for(let n of t)Te(n),e.length===0?e.push(n):e.push(n.replace(/^\/+/,"")),n.endsWith("/")||e.push("/");let r=e.join("");return t[t.length-1].endsWith("/")?r:r.slice(0,r.length-1)}i(ui,"join");function kc(t,e,r){let n={};return t.forEach(a=>{let o=e[a];if(typeof o>"u"){if(r&&r.has(a))return;o=""}n[a]=o}),n}i(kc,"generateParamMap");function li(t,e,r){let n={};return t.forEach(a=>{let o=e[a];if(typeof o>"u"){if(r&&r.has(a))return;o=""}n[a]=encodeURIComponent(String(o))}),n}i(li,"generateQueryParamMap");function wc(t,e){let r=t;for(let[n,a]of Object.entries(e))r=r.replace(`{${n}}`,a);return r}i(wc,"formatString");function fn(t,e){let{url:r,queryParams:n,nameMapping:a,bodyTemplate:o,bodyParams:s,method:p,headers:m,transforms:u}=t,y=new Map,c=new Set,f=new Set;e.forEach((b,x)=>{let g=a&&a[b.name]||b.name;if(c.has(g))throw new Error(`Duplicate name ${g} detected`);c.add(g),b.optional&&f.add(g),y.set(x,g)});let l=!!(n&&n.length),T=!!(s&&s.length);return i(function(x){let g={};x.forEach((h,D)=>{let R=V(y.get(D)),F=u?u[R]:void 0;if(F){let _=F(h);_&&typeof _=="object"?Object.assign(g,_):g[R]=_}else g[R]=h});let v=wc(r,li(Object.keys(g),g)),d=l?kt(v,li(V(n),g,f)):v,S;if(o&&(S=(0,fi.default)(o)),T){let h=kc(V(s),g,f);S=S?{...S,...h}:h}return{url:d,method:p,headers:{Accept:"application/json","Content-Type":"application/json",...m},body:S?JSON.stringify(S):void 0}},"requestHandler")}i(fn,"generateRequestHandler");function wt(t){let{projectKey:e}=t;return i(function(n){let{body:a}=n;return typeof a!="object"?a:e?a[e]:a},"objectResponseHandler")}i(wt,"generateObjectResponseHandler");var Tn=class Tn extends Error{constructor(r,n){super(r);this.isUserVisible=!0;this.internalError=n}};i(Tn,"UserVisibleError");var xe=Tn,Nt=class Nt extends Error{constructor(r,n,a,o){super(`${r} - ${JSON.stringify(n)}`);this.name="StatusCodeError";this.statusCode=r,this.body=n,this.error=n,this.options=a;let s=o?.body;typeof s=="object"&&(s=JSON.stringify(s)),this.response={...o,body:s}}static isStatusCodeError(r){return"name"in r&&r.name===Nt.name}};i(Nt,"StatusCodeError");var Rt=Nt,Bt=class Bt extends Error{constructor(r){super(r||"Additional permissions are required");this.name="MissingScopesError"}static isMissingScopesError(r){return"name"in r&&r.name===Bt.name}};i(Bt,"MissingScopesError");var Mt=Bt;var jt=class jt extends Error{constructor(r){super(r||"Response size too large");this.name="ResponseSizeTooLargeError"}static isResponseSizeTooLargeError(r){return"name"in r&&r.name===jt.name}};i(jt,"ResponseSizeTooLargeError");var It=jt;function gi(t){return"isDynamic"in t}i(gi,"isDynamicSyncTable");function I(t){return typeof t=="function"?Ut(t):t}i(I,"wrapMetadataFunction");function di(t){return t?.type==="array"?t:{type:"array",items:t}}i(di,"transformToArraySchema");function Rc(t){if(t)return{...t,execute(e,r){let n=t.execute(e,r);return En(n)?n.then(a=>di(a)):di(n)}}}i(Rc,"wrapGetSchema");function _t(t){let{type:e,autocomplete:r,crawlStrategy:n,allowManualInput:a,...o}=t,s=On[e],p;if(Array.isArray(r)){let y=gn(r);p=I(y)}else p=I(r);let m;if(n)if(n.parentTable){let{tableName:y,propertyKey:c,inheritPermissions:f}=n.parentTable;m={parentTable:{tableName:y,propertyKey:$(c),inheritPermissions:f}}}else m=n;return Object.freeze({...o,allowManualInput:a!==!1,autocomplete:p,type:s,crawlStrategy:m})}i(_t,"makeParameter");var dn=(r=>(r.Success="success",r.Error="error",r))(dn||{});function We(t){let e;switch(t.resultType){case"string":{let n={...t,codaType:"codaType"in t?t.codaType:void 0,formulaSchema:"schema"in t?t.schema:void 0,validateParameters:I(t.validateParameters)},{onError:a,resultType:o,codaType:s,formulaSchema:p,...m}=n;re(s!=="selectList","ValueHintType.SelectList is not supported for formula result types."),e={...m,resultType:0,schema:p||(s?{type:"string",codaType:s}:void 0)};break}case"number":{let n={...t,codaType:"codaType"in t?t.codaType:void 0,formulaSchema:"schema"in t?t.schema:void 0,validateParameters:I(t.validateParameters)},{onError:a,resultType:o,codaType:s,formulaSchema:p,...m}=n;e={...m,resultType:1,schema:p||(s?{type:"number",codaType:s}:void 0)};break}case"boolean":{let{onError:n,resultType:a,...o}=t;e={...o,resultType:3,validateParameters:I(t.validateParameters)};break}case"array":{let{onError:n,resultType:a,items:o,...s}=t;e={...s,resultType:2,schema:z(ie({type:"array",items:o})),validateParameters:I(t.validateParameters)};break}case"object":{let{onError:n,resultType:a,schema:o,...s}=t;e={...s,resultType:2,schema:z(ie(o)),validateParameters:I(t.validateParameters)};break}default:return me(t)}let r=t.onError;if(r){let n=e.execute;e.execute=async function(a,o){try{return await n(a,o)}catch(s){return r(s)}}}return j(e,t.connectionRequirement)}i(We,"makeFormula");function Ut(t,e){return Ic({name:"getMetadata",description:"Gets metadata",execute([r,n],a){let o={};try{o=JSON.parse(n||"")}catch{}return t(a,r,o)},parameters:[_t({type:"string",name:"search",description:"Metadata to search for.",optional:!0}),_t({type:"string",name:"formulaContext",description:"Serialized JSON for metadata.",optional:!0})],examples:[],connectionRequirement:e?.connectionRequirement||"optional"})}i(Ut,"makeMetadataFormula");function Lt({execute:t,schema:e,name:r}){if(!(t instanceof Function))throw new Error("Value for execute must be a function");let n=t,a=i(async([],p)=>n(p),"innerExecute"),o={connectionRequirement:"optional",execute:a,name:r,description:`A property options function for ${r}`,parameters:[],resultType:"array",items:e};return We(o)}i(Lt,"makePropertyOptionsFormula");function hn(t,e){let r=(t||"").toLowerCase(),n=e.filter(o=>(typeof o=="string"||typeof o=="number"?o:o.display).toString().toLowerCase().includes(r)),a=[];for(let o of n)typeof o=="string"?a.push({value:o,display:o}):typeof o=="number"?a.push({value:o,display:o.toString()}):a.push(o);return Promise.resolve(a)}i(hn,"simpleAutocomplete");async function Ti(t,e,r,n){if(typeof t!="string")throw new TypeError(`Expecting a string for "search" parameter but received ${t}`);let a=t.toLowerCase(),o=[];for(let s of e){let p=s[r];if(!p.toLowerCase().includes(a))continue;let m=s[n];o.push({display:p,value:m})}return o}i(Ti,"autocompleteSearchObjects");function gn(t){return Ut((e,r)=>hn(r,t),{connectionRequirement:"optional"})}i(gn,"makeSimpleAutocompleteMetadataFormula");function hi(t){return t&&t.schema}i(hi,"isResponseHandlerTemplate");function Mc(t){return t&&t.example}i(Mc,"isResponseExampleTemplate");function Ic({response:t,...e}){let r;if(t)if(hi(t)&&t.schema){let a=z(t.schema);t.schema=ie(a),r=t.schema}else Mc(t);let n=e.execute;if(hi(t)){let{onError:a}=t,o=n,s=wt(t);n=i(async function(m,u){let y;try{y=await o(m,u)}catch(c){if(a)y=a(c);else throw c}return s({body:y||{},status:200,headers:{}})},"exec")}return Object.assign({},e,{resultType:2,execute:n,schema:r,validateParameters:I(e.validateParameters)})}i(Ic,"makeObjectFormula");function Ge({name:t,displayName:e,description:r,instructions:n,identityName:a,schema:o,formula:s,connectionRequirement:p,dynamicOptions:m={},role:u,indexing:y}){let{getSchema:c,entityName:f,defaultAddDynamicColumns:l}=m,{execute:T,executeUpdate:b,executeGetPermissions:x,onError:g,...v}=j(s,p),d=z(o);if(!a)throw new Error("Sync table schemas must set an identityName");if(d.identity){if(d.identity.name&&d.identity.name!==a)throw new Error(`Identity name mismatch for sync table ${t}. Either remove the schema's identity.name (${d.identity.name}) or ensure it matches the table's identityName (${a}).`);d.identity={...d.identity,name:a}}else d.identity={name:a};if(u==="users"){if(!d.userEmailProperty)throw new Error("Sync table schemas with role users must set a userEmailProperty");if(!d.userIdProperty)throw new Error("Sync table schemas with role users must set a userIdProperty")}if(u==="groupMembers"){if(!d.groupIdProperty)throw new Error("Sync table schemas with role groupMembers must set a groupIdProperty");if(!d.userIdProperty&&!d.memberGroupIdProperty)throw new Error("Sync table schemas with role groupMembers must set a userIdProperty or memberGroupIdProperty")}let S=Rc(I(c)),h=ye(d),D=Nc({inputSchema:o,schema:h,identityName:a});m.propertyOptions&&(D??(D={}),D.__coda_dynamic__=Lt({execute:m.propertyOptions,schema:ye({properties:{}}),name:`${a}.DynamicPropertyOptions`}));let R=ie(h),F=S?void 0:{type:"array",items:R},{identity:_,id:H,primary:O}=Se(h);if(!(O&&H))throw new Error("Sync table schemas should have defined properties for idProperty and displayProperty");if(!_)throw new Error("Unknown error creating sync table identity");if(t.includes(" "))throw new Error("Sync table name should not include spaces");let k=wt({schema:F}),L=i(async function(N,M){let W;try{W=await T(N,M)||{}}catch(Je){throw g?.(Je),Je}let q=M.sync.schema,ae=k({body:W.result||[],status:200,headers:{}},q),{continuation:oe,completion:G,deletedItemIds:ze,deletedRowIds:Qe,permissionsContext:Ye}=W,te={result:ae};return oe&&(te.continuation=oe),G&&(te.completion=G),(Qe??ze)&&(te.deletedRowIds=Qe??ze,te.deletedItemIds=te.deletedRowIds),Ye&&(te.permissionsContext=Ye),te},"exec"),U=b?i(async function(N,M,W){let{result:q}=await b(N,M,W)||{},ae=W.sync.schema;return{result:k({body:q||[],status:200,headers:{}},ae)}},"execUpdate"):void 0;return{name:t,displayName:e,description:r,instructions:n,schema:R,identityName:a,getter:{...v,cacheTtlSecs:0,execute:L,executeUpdate:U,schema:F,isSyncFormula:!0,supportsUpdates:!!U,supportsGetPermissions:!!x,connectionRequirement:v.connectionRequirement||p,resultType:2,executeGetPermissions:x,validateParameters:I(v.validateParameters)},getSchema:j(S,p),entityName:f,defaultAddDynamicColumns:l,namedPropertyOptions:Kt(D,p),role:u,indexing:y}}i(Ge,"makeSyncTable");function Vt({name:t,displayName:e,description:r,getName:n,getSchema:a,identityName:o,getDisplayUrl:s,formula:p,listDynamicUrls:m,searchDynamicUrls:u,entityName:y,connectionRequirement:c,defaultAddDynamicColumns:f,placeholderSchema:l,propertyOptions:T,indexing:b}){let x=l||ye({type:"object",idProperty:"id",displayProperty:"id",identity:{name:o},properties:{id:{type:"string"}}}),g=I(n),v=I(a),d=I(s),S=I(m),h=I(u);return{...Ge({name:t,displayName:e,description:r,identityName:o,schema:x,formula:p,connectionRequirement:c,dynamicOptions:{getSchema:v,entityName:y,defaultAddDynamicColumns:f,propertyOptions:T},indexing:b}),isDynamic:!0,getDisplayUrl:j(d,c),listDynamicUrls:j(S,c),searchDynamicUrls:j(h,c),getName:j(g,c)}}i(Vt,"makeDynamicSyncTable");function xi({response:t,...e}){let{request:r,...n}=e,{parameters:a}=n;t.schema=t.schema?ie(t.schema):void 0;let{onError:o}=t,s=fn(r,a),p=wt(t);function m(u,y){return y.fetcher.fetch(s(u)).catch(c=>{throw o?.(c),c}).then(p)}return i(m,"execute"),Object.assign({},n,{execute:m,resultType:2,schema:t.schema,validateParameters:I(e.validateParameters)})}i(xi,"makeTranslateObjectFormula");function Si(t){let{request:e,...r}=t,{parameters:n}=r,a=fn(e,n);function o(s,p){return p.fetcher.fetch(a(s)).then(()=>"")}return i(o,"execute"),Object.assign({},r,{execute:o,resultType:0,validateParameters:I(t.validateParameters)})}i(Si,"makeEmptyFormula");function Kt(t,e){if(!t)return t;let r={};for(let n of Object.keys(t))r[n]=j(t[n],e);return r}i(Kt,"maybeRewriteConnectionForNamedPropertyOptions");function j(t,e){return t&&e?{...t,parameters:t.parameters.map(r=>({...r,autocomplete:r.autocomplete?j(r.autocomplete,e):void 0})),varargParameters:t.varargParameters?.map(r=>({...r,autocomplete:r.autocomplete?j(r.autocomplete,e):void 0})),connectionRequirement:e}:t}i(j,"maybeRewriteConnectionForFormula");function _c(t){let e=[];for(let r of Object.keys(t.properties)){let n=Pe(t.properties[r]);if(!n||!("options"in n))continue;let{options:a}=n;a&&typeof a=="function"&&e.push(r)}return e}i(_c,"listPropertiesWithOptionsFunctions");function Nc({inputSchema:t,schema:e,identityName:r}){let n={},a=_c(t);if(a.length){for(let o of a){let s=Pe(t.properties[o]),p=Pe(e.properties[o]);re(kr(s),`Property "${o}" must have codaType of ValueHintType.SelectList or ValueHintType.Reference to configure property options`),re(kr(p),`Property "${o}" lost codaType on deep copy?...`),p.options=o,n[o]=Lt({execute:s.options,schema:e.properties[o],name:`${r}.${o}.Options`})}return n}}i(Nc,"moveJsPropertyOptionsFunctionsToFormulas");var Bc=["HOURLY","DAILY","WEEKLY","MONTHLY","YEARLY"],jc=["MINUTELY","SECONDLY"],bi=["MO","TU","WE","TH","FR","SA","SU"],Uc=["FREQ","INTERVAL","COUNT","UNTIL","WKST","BYDAY","BYHOUR","BYMINUTE","BYMONTH","BYMONTHDAY","BYSETPOS"],Lc=[["BYHOUR",[0,23]],["BYMINUTE",[0,59]],["BYMONTH",[1,12]],["BYMONTHDAY",[-31,-1],[1,31]],["BYSETPOS",[-366,-1],[1,366]]],Vc=/^(\d{4})(\d{2})(\d{2})$/,Kc=/^(\d{2})(\d{2})(\d{2})Z?$/,qc="TZID=",Hc=new RegExp(`^([+-]?([1-9]|[1-4]\\d|5[0-3]))?(${bi.join("|")})$`),Pi=60,xn="A schedule trigger must not run more frequently than once per hour.";function Di(t){let e=t.split(/\r?\n/).map(x=>x.trim()).filter(Boolean),r,n=[],a;for(let x of e){let g=x.indexOf(":"),v=g<0?[""]:x.slice(0,g).split(";"),d=v[0].toUpperCase();if(d==="DTSTART"&&r===void 0)r=x.slice(g+1).toUpperCase(),n=v.slice(1);else if((d==="RRULE"||d==="")&&a===void 0)a=g<0?x:x.slice(g+1);else return"A schedule trigger takes one DTSTART line and one RRULE line."}if(a===void 0)return"A schedule trigger must have an RRULE.";if(r===void 0)return"A schedule trigger must have a DTSTART.";if(!Ai(r))return"A schedule trigger has an invalid DTSTART.";let o=n.find(x=>x.toUpperCase().startsWith(qc));if(o!==void 0){let x=o.slice(o.indexOf("=")+1).replace(/^"(.*)"$/,"$1");if(!Wc(x))return"A schedule trigger has an invalid DTSTART timezone.";if(r?.endsWith("Z"))return"A schedule trigger cannot set both a DTSTART timezone and a UTC time."}let s=new Map;for(let x of a.split(";")){let[g,v]=x.split("="),d=g.toUpperCase();if(!Uc.includes(d)||!v)return`A schedule trigger does not support "${x}".`;if(s.has(d))return`A schedule trigger can only set ${d} once.`;s.set(d,v.toUpperCase())}let p=s.get("FREQ");if(p===void 0)return"A schedule trigger must set FREQ.";if(jc.includes(p))return xn;if(!Bc.includes(p))return`A schedule trigger does not support FREQ=${p}.`;for(let x of["INTERVAL","COUNT"]){let g=s.get(x);if(g!==void 0&&!/^[1-9]\d*$/.test(g))return`A schedule trigger has an invalid ${x}.`}let m=s.get("UNTIL");if(m!==void 0&&!Ai(m))return"A schedule trigger has an invalid UNTIL.";if(m!==void 0&&r!==void 0&&o===void 0&&m.slice(0,8)Hc.test(x)))return"A schedule trigger has an invalid BYDAY.";let c=new Map;for(let[x,...g]of Lc){let v=s.get(x);if(v===void 0)continue;let d=Gc(v,g);if(!d)return`A schedule trigger has an invalid ${x}.`;c.set(x,d)}let f=c.get("BYHOUR")??[0],l=c.get("BYMINUTE")??[0];if(p==="HOURLY")return l.length>1?xn:void 0;let T=[...new Set(f.flatMap(x=>l.map(g=>x*Pi+g)))].sort((x,g)=>x-g);return T.slice(1).map((x,g)=>x-T[g]).some(x=>x/^-?\d+$/.test(a)?Number(a):NaN),n=i(a=>e.some(([o,s])=>a>=o&&a<=s),"inRange");return r.every(n)?r:void 0}i(Gc,"parseNumberList");function Oi(t){return new $e(t)}i(Oi,"newPack");function vi(){return new Sn}i(vi,"newAgent");var Pn=class Pn{setVersion(e){return this.version=e,this}};i(Pn,"BaseDefinitionBuilder");var qt=Pn,An=class An extends qt{constructor(e){super();let{formulas:r,formats:n,syncTables:a,skills:o,chatSkill:s,benchInitializationSkill:p,networkDomains:m,defaultAuthentication:u,systemConnectionAuthentication:y,version:c,formulaNamespace:f,skillEntrypoints:l,suggestedPrompts:T,mcpServers:b}=e||{};this.formulas=r||[],this.formats=n||[],this.syncTables=a||[],this.skills=o||[],this.skillEntrypoints=l,this.chatSkill=s,this.benchInitializationSkill=p,this.suggestedPrompts=T||[],this.networkDomains=m||[],this.mcpServers=b||[],this.defaultAuthentication=u,this.systemConnectionAuthentication=y,this.version=c,this.formulaNamespace=f||"Deprecated"}addFormula(e){let r=We({...e,connectionRequirement:e.connectionRequirement||this._defaultConnectionRequirement});return this.formulas.push(r),this}addSyncTable(e){let r=e.connectionRequirement||this._defaultConnectionRequirement,n=Ge({...e,connectionRequirement:r});return this.syncTables.push(n),this}addDynamicSyncTable(e){let r=Vt({...e,connectionRequirement:e.connectionRequirement||this._defaultConnectionRequirement});return this.syncTables.push(r),this}addColumnFormat(e){return this.formats.push(e),this}addSkill(e){return this.skills.push(e),this}addMCPServer(e){return this.mcpServers.push(e),this}setChatSkill(e){return this.chatSkill=e,this}setBenchInitializationSkill(e){return this.benchInitializationSkill=e,this}setSkillEntrypoints(e){return this.skillEntrypoints=e,this}addSuggestedPrompt(e){return this.suggestedPrompts.push(e),this}_wrapAuthenticationFunctions(e){let{getConnectionName:r,getConnectionUserId:n,postSetup:a,...o}=e,s=I(r),p=I(n),m=a?.map(u=>{let y=I(Fn(u).getOptions),c=I(u.getOptionsFormula);return{...u,getOptions:y,getOptionsFormula:c}});return{...o,getConnectionName:s,getConnectionUserId:p,postSetup:m}}setUserAuthentication(e){let{defaultConnectionRequirement:r="required",...n}=e;return n.type==="None"||n.type==="Various"?this.defaultAuthentication=n:this.defaultAuthentication=this._wrapAuthenticationFunctions(n),n.type!=="None"&&this._setDefaultConnectionRequirement(r),this}setSystemAuthentication(e){return this.systemConnectionAuthentication=this._wrapAuthenticationFunctions(e),this}addAdminAuthentication(e){return this.adminAuthentications||(this.adminAuthentications=[]),this.adminAuthentications.push({...e,authentication:this._wrapAuthenticationFunctions(e.authentication)}),this}addNetworkDomain(...e){return this.networkDomains.push(...e),this}_setDefaultConnectionRequirement(e){return this._defaultConnectionRequirement=e,this.formulas=this.formulas.map(r=>r.connectionRequirement?r:j(r,e)),this.syncTables=this.syncTables.map(r=>r.getter.connectionRequirement?r:gi(r)?{...r,getter:j(r.getter,e),getName:j(r.getName,e),getDisplayUrl:j(r.getDisplayUrl,e),getSchema:j(r.getSchema,e),listDynamicUrls:j(r.listDynamicUrls,e),searchDynamicUrls:j(r.searchDynamicUrls,e),namedPropertyOptions:Kt(r.namedPropertyOptions,e)}:{...r,getter:j(r.getter,e),getSchema:j(r.getSchema,e),namedPropertyOptions:Kt(r.namedPropertyOptions,e)}),this}};i(An,"PackDefinitionBuilder");var $e=An;function ge(t){return lr(z(t))}i(ge,"frozenCopy");var Ci=new WeakMap;function Fe(t){return Ci.get(t)}i(Fe,"stateOf");var bn=class bn extends qt{constructor(){super();let e={agent:ge({tools:[]})};Ci.set(this,e),Object.defineProperty(this,"agent",{enumerable:!0,get:i(()=>e.agent,"get")}),Object.defineProperty(this,"defaultTriggers",{enumerable:!0,get:i(()=>e.defaultTriggers,"get")}),Object.defineProperty(this,"suggestedPrompts",{enumerable:!0,get:i(()=>e.suggestedPrompts,"get")})}setInstructions(e){let r=Fe(this);return r.agent=ge({...r.agent,instructions:e}),this}setTools({docs:e,mail:r,webSearch:n,connectors:a}){let o=[];if(n){let p=typeof n=="object"?n.allowedDomains:void 0;o.push({type:"WebSearch",...p?{allowedDomains:p}:{}})}e&&o.push({type:"CodaDocsAndTables"}),r&&o.push({type:"MailAndCalendar"});for(let p of a||[])o.push({type:"Pack",packId:p.packId,...p.formulas?{formulas:p.formulas}:{}});let s=Fe(this);return s.agent=ge({...s.agent,tools:o}),this}addSuggestedPrompt(e){let r=Fe(this);return r.suggestedPrompts=ge([...r.suggestedPrompts??[],e]),this}setDefaultWhileWritingTrigger(e){let r=Fe(this),n=(r.defaultTriggers??[]).filter(a=>a.kind!=="whileWriting");return r.defaultTriggers=ge([...n,{kind:"whileWriting",...e}]),this}addDefaultMailEventTrigger(e){return this._addDefaultEventTrigger({type:"mail",...e})}addDefaultSlackEventTrigger(e){return this._addDefaultEventTrigger({type:"slack",...e})}addDefaultNotetakerEventTrigger(e){return this._addDefaultEventTrigger({type:"notetaker",...e})}_addDefaultEventTrigger(e){let r=Fe(this);return r.defaultTriggers=ge([...r.defaultTriggers??[],{kind:"event",...e}]),this}setDefaultScheduleTrigger(e){let r=Di(e.rruleString);if(r)throw new Error(r);let n=Fe(this),a=(n.defaultTriggers??[]).filter(o=>o.kind!=="schedule");return n.defaultTriggers=ge([...a,{kind:"schedule",...e}]),this}};i(bn,"AgentDefinitionBuilder");var Sn=bn;function Ei(t){if(t.type==="array"&&(t=t.items),t.type==="object")return[...new Set(Object.entries(t.properties).map(([e,r])=>r.fromKey||e))]}i(Ei,"getEffectivePropertyKeysFromSchema");var Ht;(n=>(n.DarkModeFragmentId="DarkMode",n.DataUrlPrefix="data:image/svg+xml;base64,",n.DataUrlPrefixWithDarkModeSupport="data:image/svg+xml;supportsDarkMode=1;base64,"))(Ht||(Ht={})); +`+e.prev}i(Ur,"indentedJoin");function ut(t,e){var r=jr(t),n=[];if(r){n.length=t.length;for(var a=0;a{"use strict";var Ps=Be(),As=le(),ft=i(function(t,e,r){for(var n=t,a;(a=n.next)!=null;n=a)if(a.key===e)return n.next=a.next,r||(a.next=t.next,t.next=a),a},"listGetNode"),bs=i(function(t,e){if(t){var r=ft(t,e);return r&&r.value}},"listGet"),Ds=i(function(t,e,r){var n=ft(t,e);n?n.value=r:t.next={key:e,next:t.next,value:r}},"listSet"),Os=i(function(t,e){return t?!!ft(t,e):!1},"listHas"),vs=i(function(t,e){if(t)return ft(t,e,!0)},"listDelete");ua.exports=i(function(){var e,r={assert:i(function(n){if(!r.has(n))throw new As("Side channel does not contain "+Ps(n))},"assert"),delete:i(function(n){var a=vs(e,n);return a&&e&&!e.next&&(e=void 0),!!a},"delete"),get:i(function(n){return bs(e,n)},"get"),has:i(function(n){return Os(e,n)},"has"),set:i(function(n,a){e||(e={next:void 0}),Ds(e,n,a)},"set")};return r},"getSideChannelList")});var qr=P((Fm,la)=>{"use strict";la.exports=Object});var da=P((km,fa)=>{"use strict";fa.exports=Error});var ga=P((wm,ha)=>{"use strict";ha.exports=EvalError});var xa=P((Rm,Ta)=>{"use strict";Ta.exports=RangeError});var Pa=P((Mm,Sa)=>{"use strict";Sa.exports=ReferenceError});var ba=P((Im,Aa)=>{"use strict";Aa.exports=SyntaxError});var Oa=P((_m,Da)=>{"use strict";Da.exports=URIError});var Ca=P((Nm,va)=>{"use strict";va.exports=Math.abs});var Fa=P((Bm,Ea)=>{"use strict";Ea.exports=Math.floor});var wa=P((jm,ka)=>{"use strict";ka.exports=Math.max});var Ma=P((Um,Ra)=>{"use strict";Ra.exports=Math.min});var _a=P((Lm,Ia)=>{"use strict";Ia.exports=Math.pow});var Ba=P((Vm,Na)=>{"use strict";Na.exports=Math.round});var Ua=P((Km,ja)=>{"use strict";ja.exports=Number.isNaN||i(function(e){return e!==e},"isNaN")});var Va=P((Hm,La)=>{"use strict";var Cs=Ua();La.exports=i(function(e){return Cs(e)||e===0?e:e<0?-1:1},"sign")});var qa=P((Gm,Ka)=>{"use strict";Ka.exports=Object.getOwnPropertyDescriptor});var Hr=P(($m,Ha)=>{"use strict";var dt=qa();if(dt)try{dt([],"length")}catch{dt=null}Ha.exports=dt});var Wr=P((zm,Wa)=>{"use strict";var ht=Object.defineProperty||!1;if(ht)try{ht({},"a",{value:1})}catch{ht=!1}Wa.exports=ht});var $a=P((Qm,Ga)=>{"use strict";Ga.exports=i(function(){if(typeof Symbol!="function"||typeof Object.getOwnPropertySymbols!="function")return!1;if(typeof Symbol.iterator=="symbol")return!0;var e={},r=Symbol("test"),n=Object(r);if(typeof r=="string"||Object.prototype.toString.call(r)!=="[object Symbol]"||Object.prototype.toString.call(n)!=="[object Symbol]")return!1;var a=42;e[r]=a;for(var o in e)return!1;if(typeof Object.keys=="function"&&Object.keys(e).length!==0||typeof Object.getOwnPropertyNames=="function"&&Object.getOwnPropertyNames(e).length!==0)return!1;var s=Object.getOwnPropertySymbols(e);if(s.length!==1||s[0]!==r||!Object.prototype.propertyIsEnumerable.call(e,r))return!1;if(typeof Object.getOwnPropertyDescriptor=="function"){var p=Object.getOwnPropertyDescriptor(e,r);if(p.value!==a||p.enumerable!==!0)return!1}return!0},"hasSymbols")});var Ya=P((Jm,Qa)=>{"use strict";var za=typeof Symbol<"u"&&Symbol,Es=$a();Qa.exports=i(function(){return typeof za!="function"||typeof Symbol!="function"||typeof za("foo")!="symbol"||typeof Symbol("bar")!="symbol"?!1:Es()},"hasNativeSymbols")});var Gr=P((Xm,Ja)=>{"use strict";Ja.exports=typeof Reflect<"u"&&Reflect.getPrototypeOf||null});var $r=P((eu,Za)=>{"use strict";var Fs=qr();Za.exports=Fs.getPrototypeOf||null});var to=P((tu,eo)=>{"use strict";var ks="Function.prototype.bind called on incompatible ",ws=Object.prototype.toString,Rs=Math.max,Ms="[object Function]",Xa=i(function(e,r){for(var n=[],a=0;a{"use strict";var Ns=to();ro.exports=Function.prototype.bind||Ns});var gt=P((au,no)=>{"use strict";no.exports=Function.prototype.call});var zr=P((ou,ao)=>{"use strict";ao.exports=Function.prototype.apply});var io=P((iu,oo)=>{"use strict";oo.exports=typeof Reflect<"u"&&Reflect&&Reflect.apply});var po=P((su,so)=>{"use strict";var Bs=je(),js=zr(),Us=gt(),Ls=io();so.exports=Ls||Bs.call(Us,js)});var Qr=P((pu,co)=>{"use strict";var Vs=je(),Ks=le(),qs=gt(),Hs=po();co.exports=i(function(e){if(e.length<1||typeof e[0]!="function")throw new Ks("a function is required");return Hs(Vs,qs,e)},"callBindBasic")});var ho=P((mu,fo)=>{"use strict";var Ws=Qr(),mo=Hr(),yo;try{yo=[].__proto__===Array.prototype}catch(t){if(!t||typeof t!="object"||!("code"in t)||t.code!=="ERR_PROTO_ACCESS")throw t}var Yr=!!yo&&mo&&mo(Object.prototype,"__proto__"),lo=Object,uo=lo.getPrototypeOf;fo.exports=Yr&&typeof Yr.get=="function"?Ws([Yr.get]):typeof uo=="function"?i(function(e){return uo(e==null?e:lo(e))},"getDunder"):!1});var Po=P((yu,So)=>{"use strict";var go=Gr(),To=$r(),xo=ho();So.exports=go?i(function(e){return go(e)},"getProto"):To?i(function(e){if(!e||typeof e!="object"&&typeof e!="function")throw new TypeError("getProto: not an object");return To(e)},"getProto"):xo?i(function(e){return xo(e)},"getProto"):null});var bo=P((fu,Ao)=>{"use strict";var Gs=Function.prototype.call,$s=Object.prototype.hasOwnProperty,zs=je();Ao.exports=zs.call(Gs,$s)});var St=P((du,Fo)=>{"use strict";var C,Qs=qr(),Ys=da(),Js=ga(),Zs=xa(),Xs=Pa(),Ce=ba(),ve=le(),ep=Oa(),tp=Ca(),rp=Fa(),np=wa(),ap=Ma(),op=_a(),ip=Ba(),sp=Va(),Co=Function,Jr=i(function(t){try{return Co('"use strict"; return ('+t+").constructor;")()}catch{}},"getEvalledConstructor"),Ue=Hr(),pp=Wr(),Zr=i(function(){throw new ve},"throwTypeError"),cp=Ue?(function(){try{return arguments.callee,Zr}catch{try{return Ue(arguments,"callee").get}catch{return Zr}}})():Zr,De=Ya()(),K=Po(),mp=$r(),up=Gr(),Eo=zr(),Le=gt(),Oe={},yp=typeof Uint8Array>"u"||!K?C:K(Uint8Array),de={__proto__:null,"%AggregateError%":typeof AggregateError>"u"?C:AggregateError,"%Array%":Array,"%ArrayBuffer%":typeof ArrayBuffer>"u"?C:ArrayBuffer,"%ArrayIteratorPrototype%":De&&K?K([][Symbol.iterator]()):C,"%AsyncFromSyncIteratorPrototype%":C,"%AsyncFunction%":Oe,"%AsyncGenerator%":Oe,"%AsyncGeneratorFunction%":Oe,"%AsyncIteratorPrototype%":Oe,"%Atomics%":typeof Atomics>"u"?C:Atomics,"%BigInt%":typeof BigInt>"u"?C:BigInt,"%BigInt64Array%":typeof BigInt64Array>"u"?C:BigInt64Array,"%BigUint64Array%":typeof BigUint64Array>"u"?C:BigUint64Array,"%Boolean%":Boolean,"%DataView%":typeof DataView>"u"?C:DataView,"%Date%":Date,"%decodeURI%":decodeURI,"%decodeURIComponent%":decodeURIComponent,"%encodeURI%":encodeURI,"%encodeURIComponent%":encodeURIComponent,"%Error%":Ys,"%eval%":eval,"%EvalError%":Js,"%Float16Array%":typeof Float16Array>"u"?C:Float16Array,"%Float32Array%":typeof Float32Array>"u"?C:Float32Array,"%Float64Array%":typeof Float64Array>"u"?C:Float64Array,"%FinalizationRegistry%":typeof FinalizationRegistry>"u"?C:FinalizationRegistry,"%Function%":Co,"%GeneratorFunction%":Oe,"%Int8Array%":typeof Int8Array>"u"?C:Int8Array,"%Int16Array%":typeof Int16Array>"u"?C:Int16Array,"%Int32Array%":typeof Int32Array>"u"?C:Int32Array,"%isFinite%":isFinite,"%isNaN%":isNaN,"%IteratorPrototype%":De&&K?K(K([][Symbol.iterator]())):C,"%JSON%":typeof JSON=="object"?JSON:C,"%Map%":typeof Map>"u"?C:Map,"%MapIteratorPrototype%":typeof Map>"u"||!De||!K?C:K(new Map()[Symbol.iterator]()),"%Math%":Math,"%Number%":Number,"%Object%":Qs,"%Object.getOwnPropertyDescriptor%":Ue,"%parseFloat%":parseFloat,"%parseInt%":parseInt,"%Promise%":typeof Promise>"u"?C:Promise,"%Proxy%":typeof Proxy>"u"?C:Proxy,"%RangeError%":Zs,"%ReferenceError%":Xs,"%Reflect%":typeof Reflect>"u"?C:Reflect,"%RegExp%":RegExp,"%Set%":typeof Set>"u"?C:Set,"%SetIteratorPrototype%":typeof Set>"u"||!De||!K?C:K(new Set()[Symbol.iterator]()),"%SharedArrayBuffer%":typeof SharedArrayBuffer>"u"?C:SharedArrayBuffer,"%String%":String,"%StringIteratorPrototype%":De&&K?K(""[Symbol.iterator]()):C,"%Symbol%":De?Symbol:C,"%SyntaxError%":Ce,"%ThrowTypeError%":cp,"%TypedArray%":yp,"%TypeError%":ve,"%Uint8Array%":typeof Uint8Array>"u"?C:Uint8Array,"%Uint8ClampedArray%":typeof Uint8ClampedArray>"u"?C:Uint8ClampedArray,"%Uint16Array%":typeof Uint16Array>"u"?C:Uint16Array,"%Uint32Array%":typeof Uint32Array>"u"?C:Uint32Array,"%URIError%":ep,"%WeakMap%":typeof WeakMap>"u"?C:WeakMap,"%WeakRef%":typeof WeakRef>"u"?C:WeakRef,"%WeakSet%":typeof WeakSet>"u"?C:WeakSet,"%Function.prototype.call%":Le,"%Function.prototype.apply%":Eo,"%Object.defineProperty%":pp,"%Object.getPrototypeOf%":mp,"%Math.abs%":tp,"%Math.floor%":rp,"%Math.max%":np,"%Math.min%":ap,"%Math.pow%":op,"%Math.round%":ip,"%Math.sign%":sp,"%Reflect.getPrototypeOf%":up};if(K)try{null.error}catch(t){Do=K(K(t)),de["%Error.prototype%"]=Do}var Do,lp=i(function t(e){var r;if(e==="%AsyncFunction%")r=Jr("async function () {}");else if(e==="%GeneratorFunction%")r=Jr("function* () {}");else if(e==="%AsyncGeneratorFunction%")r=Jr("async function* () {}");else if(e==="%AsyncGenerator%"){var n=t("%AsyncGeneratorFunction%");n&&(r=n.prototype)}else if(e==="%AsyncIteratorPrototype%"){var a=t("%AsyncGenerator%");a&&K&&(r=K(a.prototype))}return de[e]=r,r},"doEval"),Oo={__proto__:null,"%ArrayBufferPrototype%":["ArrayBuffer","prototype"],"%ArrayPrototype%":["Array","prototype"],"%ArrayProto_entries%":["Array","prototype","entries"],"%ArrayProto_forEach%":["Array","prototype","forEach"],"%ArrayProto_keys%":["Array","prototype","keys"],"%ArrayProto_values%":["Array","prototype","values"],"%AsyncFunctionPrototype%":["AsyncFunction","prototype"],"%AsyncGenerator%":["AsyncGeneratorFunction","prototype"],"%AsyncGeneratorPrototype%":["AsyncGeneratorFunction","prototype","prototype"],"%BooleanPrototype%":["Boolean","prototype"],"%DataViewPrototype%":["DataView","prototype"],"%DatePrototype%":["Date","prototype"],"%ErrorPrototype%":["Error","prototype"],"%EvalErrorPrototype%":["EvalError","prototype"],"%Float32ArrayPrototype%":["Float32Array","prototype"],"%Float64ArrayPrototype%":["Float64Array","prototype"],"%FunctionPrototype%":["Function","prototype"],"%Generator%":["GeneratorFunction","prototype"],"%GeneratorPrototype%":["GeneratorFunction","prototype","prototype"],"%Int8ArrayPrototype%":["Int8Array","prototype"],"%Int16ArrayPrototype%":["Int16Array","prototype"],"%Int32ArrayPrototype%":["Int32Array","prototype"],"%JSONParse%":["JSON","parse"],"%JSONStringify%":["JSON","stringify"],"%MapPrototype%":["Map","prototype"],"%NumberPrototype%":["Number","prototype"],"%ObjectPrototype%":["Object","prototype"],"%ObjProto_toString%":["Object","prototype","toString"],"%ObjProto_valueOf%":["Object","prototype","valueOf"],"%PromisePrototype%":["Promise","prototype"],"%PromiseProto_then%":["Promise","prototype","then"],"%Promise_all%":["Promise","all"],"%Promise_reject%":["Promise","reject"],"%Promise_resolve%":["Promise","resolve"],"%RangeErrorPrototype%":["RangeError","prototype"],"%ReferenceErrorPrototype%":["ReferenceError","prototype"],"%RegExpPrototype%":["RegExp","prototype"],"%SetPrototype%":["Set","prototype"],"%SharedArrayBufferPrototype%":["SharedArrayBuffer","prototype"],"%StringPrototype%":["String","prototype"],"%SymbolPrototype%":["Symbol","prototype"],"%SyntaxErrorPrototype%":["SyntaxError","prototype"],"%TypedArrayPrototype%":["TypedArray","prototype"],"%TypeErrorPrototype%":["TypeError","prototype"],"%Uint8ArrayPrototype%":["Uint8Array","prototype"],"%Uint8ClampedArrayPrototype%":["Uint8ClampedArray","prototype"],"%Uint16ArrayPrototype%":["Uint16Array","prototype"],"%Uint32ArrayPrototype%":["Uint32Array","prototype"],"%URIErrorPrototype%":["URIError","prototype"],"%WeakMapPrototype%":["WeakMap","prototype"],"%WeakSetPrototype%":["WeakSet","prototype"]},Ve=je(),Tt=bo(),fp=Ve.call(Le,Array.prototype.concat),dp=Ve.call(Eo,Array.prototype.splice),vo=Ve.call(Le,String.prototype.replace),xt=Ve.call(Le,String.prototype.slice),hp=Ve.call(Le,RegExp.prototype.exec),gp=/[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g,Tp=/\\(\\)?/g,xp=i(function(e){var r=xt(e,0,1),n=xt(e,-1);if(r==="%"&&n!=="%")throw new Ce("invalid intrinsic syntax, expected closing `%`");if(n==="%"&&r!=="%")throw new Ce("invalid intrinsic syntax, expected opening `%`");var a=[];return vo(e,gp,function(o,s,p,m){a[a.length]=p?vo(m,Tp,"$1"):s||o}),a},"stringToPath"),Sp=i(function(e,r){var n=e,a;if(Tt(Oo,n)&&(a=Oo[n],n="%"+a[0]+"%"),Tt(de,n)){var o=de[n];if(o===Oe&&(o=lp(n)),typeof o>"u"&&!r)throw new ve("intrinsic "+e+" exists, but is not available. Please file an issue!");return{alias:a,name:n,value:o}}throw new Ce("intrinsic "+e+" does not exist!")},"getBaseIntrinsic");Fo.exports=i(function(e,r){if(typeof e!="string"||e.length===0)throw new ve("intrinsic name must be a non-empty string");if(arguments.length>1&&typeof r!="boolean")throw new ve('"allowMissing" argument must be a boolean');if(hp(/^%?[^%]*%?$/,e)===null)throw new Ce("`%` may not be present anywhere but at the beginning and end of the intrinsic name");var n=xp(e),a=n.length>0?n[0]:"",o=Sp("%"+a+"%",r),s=o.name,p=o.value,m=!1,y=o.alias;y&&(a=y[0],dp(n,fp([0,1],y)));for(var u=1,c=!0;u=n.length){var b=Ue(p,f);c=!!b,c&&"get"in b&&!("originalValue"in b.get)?p=b.get:p=p[f]}else c=Tt(p,f),p=p[f];c&&!m&&(de[s]=p)}}return p},"GetIntrinsic")});var Xr=P((gu,Ro)=>{"use strict";var ko=St(),wo=Qr(),Pp=wo([ko("%String.prototype.indexOf%")]);Ro.exports=i(function(e,r){var n=ko(e,!!r);return typeof n=="function"&&Pp(e,".prototype.")>-1?wo([n]):n},"callBoundIntrinsic")});var en=P((xu,Io)=>{"use strict";var Ap=St(),Ke=Xr(),bp=Be(),Dp=le(),Mo=Ap("%Map%",!0),Op=Ke("Map.prototype.get",!0),vp=Ke("Map.prototype.set",!0),Cp=Ke("Map.prototype.has",!0),Ep=Ke("Map.prototype.delete",!0),Fp=Ke("Map.prototype.size",!0);Io.exports=!!Mo&&i(function(){var e,r={assert:i(function(n){if(!r.has(n))throw new Dp("Side channel does not contain "+bp(n))},"assert"),delete:i(function(n){if(e){var a=Ep(e,n);return Fp(e)===0&&(e=void 0),a}return!1},"delete"),get:i(function(n){if(e)return Op(e,n)},"get"),has:i(function(n){return e?Cp(e,n):!1},"has"),set:i(function(n,a){e||(e=new Mo),vp(e,n,a)},"set")};return r},"getSideChannelMap")});var No=P((Pu,_o)=>{"use strict";var kp=St(),At=Xr(),wp=Be(),Pt=en(),Rp=le(),Ee=kp("%WeakMap%",!0),Mp=At("WeakMap.prototype.get",!0),Ip=At("WeakMap.prototype.set",!0),_p=At("WeakMap.prototype.has",!0),Np=At("WeakMap.prototype.delete",!0);_o.exports=Ee?i(function(){var e,r,n={assert:i(function(a){if(!n.has(a))throw new Rp("Side channel does not contain "+wp(a))},"assert"),delete:i(function(a){if(Ee&&a&&(typeof a=="object"||typeof a=="function")){if(e)return Np(e,a)}else if(Pt&&r)return r.delete(a);return!1},"delete"),get:i(function(a){return Ee&&a&&(typeof a=="object"||typeof a=="function")&&e?Mp(e,a):r&&r.get(a)},"get"),has:i(function(a){return Ee&&a&&(typeof a=="object"||typeof a=="function")&&e?_p(e,a):!!r&&r.has(a)},"has"),set:i(function(a,o){Ee&&a&&(typeof a=="object"||typeof a=="function")?(e||(e=new Ee),Ip(e,a,o)):Pt&&(r||(r=Pt()),r.set(a,o))},"set")};return n},"getSideChannelWeakMap"):Pt});var tn=P((bu,Bo)=>{"use strict";var Bp=le(),jp=Be(),Up=ya(),Lp=en(),Vp=No(),Kp=Vp||Lp||Up;Bo.exports=i(function(){var e,r={assert:i(function(n){if(!r.has(n)){var a=n&&Object(n)===n?"the given object key":jp(n);throw new Bp("Side channel does not contain "+a)}},"assert"),delete:i(function(n){return!!e&&e.delete(n)},"delete"),get:i(function(n){return e&&e.get(n)},"get"),has:i(function(n){return!!e&&e.has(n)},"has"),set:i(function(n,a){e||(e=Kp()),e.set(n,a)},"set")};return r},"getSideChannel")});var bt=P((Ou,jo)=>{"use strict";var qp=String.prototype.replace,Hp=/%20/g,rn={RFC1738:"RFC1738",RFC3986:"RFC3986"};jo.exports={default:rn.RFC3986,formatters:{RFC1738:i(function(t){return qp.call(t,Hp,"+")},"RFC1738"),RFC3986:i(function(t){return String(t)},"RFC3986")},RFC1738:rn.RFC1738,RFC3986:rn.RFC3986}});var sn=P((Cu,Vo)=>{"use strict";var Wp=bt(),Lo=tn(),Uo=Wr(),nn=Object.prototype.hasOwnProperty,ce=Array.isArray,Ot=Lo(),he=i(function(e,r){return Ot.set(e,r),e},"markOverflow"),ge=i(function(e){return Ot.has(e)},"isOverflow"),qe=i(function(e){return Ot.get(e)},"getMaxIndex"),an=i(function(e,r){Ot.set(e,r)},"setMaxIndex"),Y=(function(){for(var t=[],e=0;e<256;++e)t[t.length]="%"+((e<16?"0":"")+e.toString(16)).toUpperCase();return t})(),Gp=i(function(e){for(;e.length>1;){var r=e.pop(),n=r.obj[r.prop];if(ce(n)){for(var a=[],o=0;o=n.arrayLimit){if(n.throwOnLimitExceeded)throw new RangeError("Array limit exceeded. Only "+n.arrayLimit+" element"+(n.arrayLimit===1?"":"s")+" allowed in an array.");return he(Fe(e.concat(r),n),a)}e[a]=r}else if(e&&typeof e=="object")if(ge(e)){var o=qe(e)+1;e[o]=r,an(e,o)}else{if(n&&n.strictMerge)return[e,r];(n&&(n.plainObjects||n.allowPrototypes)||!nn.call(Object.prototype,r))&&(e[r]=!0)}else return[e,r];return e}if(!e||typeof e!="object"){if(ge(r)){for(var s=Object.keys(r),p=n&&n.plainObjects?{__proto__:null,0:e}:{0:e},m=0;mn.arrayLimit){if(n.throwOnLimitExceeded)throw new RangeError("Array limit exceeded. Only "+n.arrayLimit+" element"+(n.arrayLimit===1?"":"s")+" allowed in an array.");return he(Fe(u,n),u.length-1)}return u}var c=e;if(ce(e)&&!ce(r)&&(c=Fe(e,n)),ce(e)&&ce(r)){if(r.forEach(function(f,l){if(nn.call(e,l)){var T=e[l];T&&typeof T=="object"&&f&&typeof f=="object"?e[l]=t(T,f,n):e[e.length]=f}else e[l]=f}),n&&typeof n.arrayLimit=="number"&&e.length>n.arrayLimit){if(n.throwOnLimitExceeded)throw new RangeError("Array limit exceeded. Only "+n.arrayLimit+" element"+(n.arrayLimit===1?"":"s")+" allowed in an array.");return he(Fe(e,n),e.length-1)}return e}return Object.keys(r).reduce(function(f,l){var T=r[l];if(nn.call(f,l)?on(f,l,t(f[l],T,n)):on(f,l,T),ge(r)&&!ge(f)&&he(f,qe(r)),ge(f)){var b=parseInt(l,10);String(b)===l&&b>=0&&b>qe(f)&&an(f,b)}return f},c)},"merge"),zp=i(function(e,r){return Object.keys(r).reduce(function(n,a){return on(n,a,r[a]),n},e)},"assignSingleSource"),Qp=i(function(t,e,r){var n=t.replace(/\+/g," ");if(r==="iso-8859-1")return n.replace(/%[0-9a-f]{2}/gi,unescape);try{return decodeURIComponent(n)}catch{return n}},"decode"),Dt=1024,Yp=i(function(e,r,n,a,o){if(e.length===0)return e;var s=e;if(typeof e=="symbol"?s=Symbol.prototype.toString.call(e):typeof e!="string"&&(s=String(e)),n==="iso-8859-1")return escape(s).replace(/%u[0-9a-f]{4}/gi,function(T){return"%26%23"+parseInt(T.slice(2),16)+"%3B"});for(var p="",m=0;m=Dt?s.slice(m,m+Dt):s;if(m+Dt=55296&&u<=56319&&(y=y.slice(0,-1),m-=1)}for(var c=[],f=0;f=48&&l<=57||l>=65&&l<=90||l>=97&&l<=122||o===Wp.RFC1738&&(l===40||l===41)){c[c.length]=y.charAt(f);continue}if(l<128){c[c.length]=Y[l];continue}if(l<2048){c[c.length]=Y[192|l>>6]+Y[128|l&63];continue}if(l<55296||l>=57344){c[c.length]=Y[224|l>>12]+Y[128|l>>6&63]+Y[128|l&63];continue}f+=1,l=65536+((l&1023)<<10|y.charCodeAt(f)&1023),c[c.length]=Y[240|l>>18]+Y[128|l>>12&63]+Y[128|l>>6&63]+Y[128|l&63]}p+=c.join("")}return p},"encode"),Jp=i(function(e){for(var r=[{obj:{o:e},prop:"o"}],n=Lo(),a=0;an){if(o)throw new RangeError("Array limit exceeded. Only "+n+" element"+(n===1?"":"s")+" allowed in an array.");return he(Fe(y,{plainObjects:a}),y.length-1)}return y},"combine"),tc=i(function(e,r){if(ce(e)){for(var n=[],a=0;a{"use strict";var qo=tn(),vt=sn(),He=bt(),rc=Object.prototype.hasOwnProperty,Ho={brackets:i(function(e){return e+"[]"},"brackets"),comma:"comma",indices:i(function(e,r){return e+"["+r+"]"},"indices"),repeat:i(function(e){return e},"repeat")},J=Array.isArray,nc=Array.prototype.push,Wo=i(function(t,e){nc.apply(t,J(e)?e:[e])},"pushToArray"),ac=Date.prototype.toISOString,Ko=He.default,B={addQueryPrefix:!1,allowDots:!1,allowEmptyArrays:!1,arrayFormat:"indices",charset:"utf-8",charsetSentinel:!1,commaRoundTrip:!1,delimiter:"&",depth:1/0,encode:!0,encodeDotInKeys:!1,encoder:vt.encode,encodeValuesOnly:!1,filter:void 0,format:Ko,formatter:He.formatters[Ko],indices:!1,serializeDate:i(function(e){return ac.call(e)},"serializeDate"),skipNulls:!1,strictNullHandling:!1},oc=i(function(e){return typeof e=="string"||typeof e=="number"||typeof e=="boolean"||typeof e=="symbol"||typeof e=="bigint"},"isNonNullishPrimitive"),pn={},ic=i(function t(e,r,n,a,o,s,p,m,y,u,c,f,l,T,b,x,g,v,d,S){var h=e;if(S>d)throw new RangeError("Input depth exceeded depth option of "+d);for(var D=v,R=0,F=!1;(D=D.get(pn))!==void 0&&!F;){var _=D.get(e);if(R+=1,typeof _<"u"){if(_===R)throw new RangeError("Cyclic object value");F=!0}typeof D.get(pn)>"u"&&(R=0)}if(h=typeof u=="function"?u(r,h):h,h instanceof Date?h=l(h):n==="comma"&&J(h)&&(h=vt.maybeMap(h,function(G){return G instanceof Date?l(G):G})),h===null){if(s)return b(y&&!x?y(r,B.encoder,g,"key",T):r);h=""}if(oc(h)||vt.isBuffer(h)){if(y){var H=x?r:y(r,B.encoder,g,"key",T);return[b(H)+"="+b(y(h,B.encoder,g,"value",T))]}return[b(r)+"="+b(String(h))]}var O=[];if(typeof h>"u")return O;var k;if(n==="comma"&&J(h))x&&y&&(h=vt.maybeMap(h,function(G){return G==null?G:y(G)})),k=[{value:h.length>0?h.join(",")||null:void 0}];else if(J(u))k=u;else{var L=Object.keys(h);k=c?L.sort(c):L}var U=m?String(r).replace(/\./g,"%2E"):String(r),A=a&&J(h)&&h.length===1?U+"[]":U;if(o&&J(h)&&h.length===0&&Object.keys(h).length===0)return A+"[]";for(var N=0;N"u"?e.encodeDotInKeys===!0?!0:B.allowDots:!!e.allowDots;return{addQueryPrefix:typeof e.addQueryPrefix=="boolean"?e.addQueryPrefix:B.addQueryPrefix,allowDots:p,allowEmptyArrays:typeof e.allowEmptyArrays=="boolean"?!!e.allowEmptyArrays:B.allowEmptyArrays,arrayFormat:s,charset:r,charsetSentinel:typeof e.charsetSentinel=="boolean"?e.charsetSentinel:B.charsetSentinel,commaRoundTrip:!!e.commaRoundTrip,delimiter:typeof e.delimiter>"u"?B.delimiter:e.delimiter,depth:typeof e.depth=="number"?e.depth:B.depth,encode:typeof e.encode=="boolean"?e.encode:B.encode,encodeDotInKeys:typeof e.encodeDotInKeys=="boolean"?e.encodeDotInKeys:B.encodeDotInKeys,encoder:typeof e.encoder=="function"?e.encoder:B.encoder,encodeValuesOnly:typeof e.encodeValuesOnly=="boolean"?e.encodeValuesOnly:B.encodeValuesOnly,filter:o,format:n,formatter:a,serializeDate:typeof e.serializeDate=="function"?e.serializeDate:B.serializeDate,skipNulls:typeof e.skipNulls=="boolean"?e.skipNulls:B.skipNulls,sort:typeof e.sort=="function"?e.sort:null,strictNullHandling:typeof e.strictNullHandling=="boolean"?e.strictNullHandling:B.strictNullHandling}},"normalizeStringifyOptions");Go.exports=function(t,e){var r=t,n=sc(e),a,o;typeof n.filter=="function"?(o=n.filter,r=o("",r)):J(n.filter)&&(o=n.filter,a=o);var s=[];if(typeof r!="object"||r===null)return"";var p=Ho[n.arrayFormat],m=p==="comma"&&n.commaRoundTrip;a||(a=Object.keys(r)),n.sort&&a.sort(n.sort);for(var y=qo(),u=0;u"u"||c===null)){var f=r[c];if(!(n.skipNulls&&f===null)){var l=n.encodeDotInKeys?String(c).replace(/\./g,"%2E"):String(c);Wo(s,ic(f,l,p,m,n.allowEmptyArrays,n.strictNullHandling,n.skipNulls,n.encodeDotInKeys,n.encode?n.encoder:null,n.filter,n.sort,n.allowDots,n.serializeDate,n.format,n.formatter,n.encodeValuesOnly,n.charset,y,n.depth,0))}}}var T=s.join(n.delimiter),b=n.addQueryPrefix===!0?"?":"";return n.charsetSentinel&&(n.charset==="iso-8859-1"?b+="utf8=%26%2310003%3B"+n.delimiter:b+="utf8=%E2%9C%93"+n.delimiter),T.length>0?b+T:""}});var Yo=P((wu,Qo)=>{"use strict";var Z=sn(),Ct=Object.prototype.hasOwnProperty,cn=Array.isArray,w={allowDots:!1,allowEmptyArrays:!1,allowPrototypes:!1,allowSparse:!1,arrayLimit:20,charset:"utf-8",charsetSentinel:!1,comma:!1,decodeDotInKeys:!1,decoder:Z.decode,delimiter:"&",depth:5,duplicates:"combine",ignoreQueryPrefix:!1,interpretNumericEntities:!1,parameterLimit:1e3,parseArrays:!0,plainObjects:!1,strictDepth:!1,strictMerge:!0,strictNullHandling:!1,throwOnLimitExceeded:!1},pc=i(function(t){return t.replace(/&#(\d+);/g,function(e,r){return String.fromCharCode(parseInt(r,10))})},"interpretNumericEntities"),zo=i(function(t,e,r){if(t&&typeof t=="string"&&e.comma&&t.indexOf(",")>-1){if(e.throwOnLimitExceeded)for(var n=0,a=t.indexOf(",");a>-1;){if(n+=1,n>=e.arrayLimit)throw new RangeError("Array limit exceeded. Only "+e.arrayLimit+" element"+(e.arrayLimit===1?"":"s")+" allowed in an array.");a=t.indexOf(",",a+1)}return t.split(",")}if(e.throwOnLimitExceeded&&r>=e.arrayLimit)throw new RangeError("Array limit exceeded. Only "+e.arrayLimit+" element"+(e.arrayLimit===1?"":"s")+" allowed in an array.");return t},"parseArrayValue"),cc="utf8=%26%2310003%3B",mc="utf8=%E2%9C%93",uc=i(function(e,r){var n={__proto__:null},a=r.ignoreQueryPrefix?e.replace(/^\?/,""):e;a=a.replace(/%5B/gi,"[").replace(/%5D/gi,"]");var o=r.parameterLimit===1/0?void 0:r.parameterLimit,s=a.split(r.delimiter,r.throwOnLimitExceeded&&typeof o<"u"?o+1:o);if(r.throwOnLimitExceeded&&typeof o<"u"&&s.length>o)throw new RangeError("Parameter limit exceeded. Only "+o+" parameter"+(o===1?"":"s")+" allowed.");var p=-1,m,y=r.charset;if(r.charsetSentinel)for(m=0;m-1&&(T=cn(T)?[T]:T),r.comma&&cn(T)&&T.length>r.arrayLimit&&(T=Z.combine([],T,r.arrayLimit,r.plainObjects,r.throwOnLimitExceeded)),l!==null){var b=Ct.call(n,l);b&&(r.duplicates==="combine"||u.indexOf("[]=")>-1)?n[l]=Z.combine(n[l],T,r.arrayLimit,r.plainObjects,r.throwOnLimitExceeded):(!b||r.duplicates==="last")&&(n[l]=T)}}return n},"parseQueryStringValues"),yc=i(function(t,e,r,n){var a=0;if(t.length>0&&t[t.length-1]==="[]"){var o=t.slice(0,-1).join("");a=Array.isArray(e)&&e[o]?e[o].length:0}for(var s=n?e:zo(e,r,a),p=t.length-1;p>=0;--p){var m,y=t[p];if(y==="[]"&&r.parseArrays)Z.isOverflow(s)?m=s:m=r.allowEmptyArrays&&(s===""||r.strictNullHandling&&s===null)?[]:Z.combine([],s,r.arrayLimit,r.plainObjects,r.throwOnLimitExceeded);else{m=r.plainObjects?{__proto__:null}:{};var u=y.charAt(0)==="["&&y.charAt(y.length-1)==="]"?y.slice(1,-1):y,c=r.decodeDotInKeys?u.replace(/%2E/g,"."):u,f=parseInt(c,10),l=!isNaN(f)&&y!==c&&String(f)===c&&f>=0&&r.parseArrays;if(!r.parseArrays&&c==="")m={0:s};else if(l&&f=0?n.slice(0,o):n;if(s){if(!r.plainObjects&&Ct.call(Object.prototype,s)&&!r.allowPrototypes)return;a[a.length]=s}for(var p=n.length,m=o,y=0;m>=0&&y=0){if(r.strictDepth===!0)throw new RangeError("Input depth exceeded depth option of "+r.depth+" and strictDepth is true");a[a.length]="["+n.slice(m)+"]"}return a},"splitKeyIntoSegments"),fc=i(function(e,r,n,a){if(e){var o=lc(e,n);if(o)return yc(o,r,n,a)}},"parseQueryStringKeys"),dc=i(function(e){if(!e)return w;if(typeof e.allowEmptyArrays<"u"&&typeof e.allowEmptyArrays!="boolean")throw new TypeError("`allowEmptyArrays` option can only be `true` or `false`, when provided");if(typeof e.decodeDotInKeys<"u"&&typeof e.decodeDotInKeys!="boolean")throw new TypeError("`decodeDotInKeys` option can only be `true` or `false`, when provided");if(e.decoder!==null&&typeof e.decoder<"u"&&typeof e.decoder!="function")throw new TypeError("Decoder has to be a function.");if(typeof e.charset<"u"&&e.charset!=="utf-8"&&e.charset!=="iso-8859-1")throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");if(typeof e.throwOnLimitExceeded<"u"&&typeof e.throwOnLimitExceeded!="boolean")throw new TypeError("`throwOnLimitExceeded` option must be a boolean");var r=typeof e.charset>"u"?w.charset:e.charset,n=typeof e.duplicates>"u"?w.duplicates:e.duplicates;if(n!=="combine"&&n!=="first"&&n!=="last")throw new TypeError("The duplicates option must be either combine, first, or last");var a=typeof e.allowDots>"u"?e.decodeDotInKeys===!0?!0:w.allowDots:!!e.allowDots;return{allowDots:a,allowEmptyArrays:typeof e.allowEmptyArrays=="boolean"?!!e.allowEmptyArrays:w.allowEmptyArrays,allowPrototypes:typeof e.allowPrototypes=="boolean"?e.allowPrototypes:w.allowPrototypes,allowSparse:typeof e.allowSparse=="boolean"?e.allowSparse:w.allowSparse,arrayLimit:typeof e.arrayLimit=="number"?e.arrayLimit:w.arrayLimit,charset:r,charsetSentinel:typeof e.charsetSentinel=="boolean"?e.charsetSentinel:w.charsetSentinel,comma:typeof e.comma=="boolean"?e.comma:w.comma,decodeDotInKeys:typeof e.decodeDotInKeys=="boolean"?e.decodeDotInKeys:w.decodeDotInKeys,decoder:typeof e.decoder=="function"?e.decoder:w.decoder,delimiter:typeof e.delimiter=="string"||Z.isRegExp(e.delimiter)?e.delimiter:w.delimiter,depth:typeof e.depth=="number"||e.depth===!1?+e.depth:w.depth,duplicates:n,ignoreQueryPrefix:e.ignoreQueryPrefix===!0,interpretNumericEntities:typeof e.interpretNumericEntities=="boolean"?e.interpretNumericEntities:w.interpretNumericEntities,parameterLimit:typeof e.parameterLimit=="number"?e.parameterLimit:w.parameterLimit,parseArrays:e.parseArrays!==!1,plainObjects:typeof e.plainObjects=="boolean"?e.plainObjects:w.plainObjects,strictDepth:typeof e.strictDepth=="boolean"?!!e.strictDepth:w.strictDepth,strictMerge:typeof e.strictMerge=="boolean"?!!e.strictMerge:w.strictMerge,strictNullHandling:typeof e.strictNullHandling=="boolean"?e.strictNullHandling:w.strictNullHandling,throwOnLimitExceeded:typeof e.throwOnLimitExceeded=="boolean"?e.throwOnLimitExceeded:!1}},"normalizeParseOptions");Qo.exports=function(t,e){var r=dc(e);if(t===""||t===null||typeof t>"u")return r.plainObjects?{__proto__:null}:{};for(var n=typeof t=="string"?uc(t,r):t,a=r.plainObjects?{__proto__:null}:{},o=Object.keys(n),s=0;s{"use strict";var hc=$o(),gc=Yo(),Tc=bt();Jo.exports={formats:Tc,parse:gc,stringify:hc}});var ei=P((Iu,Xo)=>{"use strict";Xo.exports=i(function(e,r){if(r=r.split(":")[0],e=+e,!e)return!1;switch(r){case"http":case"ws":return e!==80;case"https":case"wss":return e!==443;case"ftp":return e!==21;case"gopher":return e!==70;case"file":return!1}return e!==0},"required")});var ni=P(mn=>{"use strict";var xc=Object.prototype.hasOwnProperty,Sc;function ti(t){try{return decodeURIComponent(t.replace(/\+/g," "))}catch{return null}}i(ti,"decode");function ri(t){try{return encodeURIComponent(t)}catch{return null}}i(ri,"encode");function Pc(t){for(var e=/([^=?#&]+)=?([^&]*)/g,r={},n;n=e.exec(t);){var a=ti(n[1]),o=ti(n[2]);a===null||o===null||a in r||(r[a]=o)}return r}i(Pc,"querystring");function Ac(t,e){e=e||"";var r=[],n,a;typeof e!="string"&&(e="?");for(a in t)if(xc.call(t,a)){if(n=t[a],!n&&(n===null||n===Sc||isNaN(n))&&(n=""),a=ri(a),n=ri(n),a===null||n===null)continue;r.push(a+"="+n)}return r.length?e+r.join("&"):""}i(Ac,"querystringify");mn.stringify=Ac;mn.parse=Pc});var ui=P((ju,mi)=>{"use strict";var oi=ei(),Et=ni(),bc=/^[\x00-\x20\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]+/,ii=/[\n\r\t]/g,Dc=/^[A-Za-z][A-Za-z0-9+-.]*:\/\//,si=/:\d+$/,Oc=/^([a-z][a-z0-9.+-]*:)?(\/\/)?([\\/]+)?([\S\s]*)/i,vc=/^[a-zA-Z]:/;function yn(t){return(t||"").toString().replace(bc,"")}i(yn,"trimLeft");var un=[["#","hash"],["?","query"],i(function(e,r){return X(r.protocol)?e.replace(/\\/g,"/"):e},"sanitize"),["/","pathname"],["@","auth",1],[NaN,"host",void 0,1,1],[/:(\d*)$/,"port",void 0,1],[NaN,"hostname",void 0,1,1]],ai={hash:1,query:1};function pi(t){var e;typeof window<"u"?e=window:typeof global<"u"?e=global:typeof self<"u"?e=self:e={};var r=e.location||{};t=t||r;var n={},a=typeof t,o;if(t.protocol==="blob:")n=new ee(unescape(t.pathname),{});else if(a==="string"){n=new ee(t,{});for(o in ai)delete n[o]}else if(a==="object"){for(o in t)o in ai||(n[o]=t[o]);n.slashes===void 0&&(n.slashes=Dc.test(t.href))}return n}i(pi,"lolcation");function X(t){return t==="file:"||t==="ftp:"||t==="http:"||t==="https:"||t==="ws:"||t==="wss:"}i(X,"isSpecial");function ci(t,e){t=yn(t),t=t.replace(ii,""),e=e||{};var r=Oc.exec(t),n=r[1]?r[1].toLowerCase():"",a=!!r[2],o=!!r[3],s=0,p;return a?o?(p=r[2]+r[3]+r[4],s=r[2].length+r[3].length):(p=r[2]+r[4],s=r[2].length):o?(p=r[3]+r[4],s=r[3].length):p=r[4],n==="file:"?s>=2&&(p=p.slice(2)):X(n)?p=r[4]:n?a&&(p=p.slice(2)):s>=2&&X(e.protocol)&&(p=r[4]),{protocol:n,slashes:a||X(n),slashesCount:s,rest:p}}i(ci,"extractProtocol");function Cc(t,e){if(t==="")return e;for(var r=(e||"/").split("/").slice(0,-1).concat(t.split("/")),n=r.length,a=r[n-1],o=!1,s=0;n--;)r[n]==="."?r.splice(n,1):r[n]===".."?(r.splice(n,1),s++):s&&(n===0&&(o=!0),r.splice(n,1),s--);return o&&r.unshift(""),(a==="."||a==="..")&&r.push(""),r.join("/")}i(Cc,"resolve");function ee(t,e,r){if(t=yn(t),t=t.replace(ii,""),!(this instanceof ee))return new ee(t,e,r);var n,a,o,s,p,m,y=un.slice(),u=typeof e,c=this,f=0;for(u!=="object"&&u!=="string"&&(r=e,e=null),r&&typeof r!="function"&&(r=Et.parse),e=pi(e),a=ci(t||"",e),n=!a.protocol&&!a.slashes,c.slashes=a.slashes||n&&e.slashes,c.protocol=a.protocol||e.protocol||"",t=a.rest,(a.protocol==="file:"&&(a.slashesCount!==2||vc.test(t))||!a.slashes&&(a.protocol||a.slashesCount<2||!X(c.protocol)))&&(y[3]=[/(.*)/,"pathname"]);fFr,AuthenticationType:()=>Xe,ConnectionRequirement:()=>we,ContextualTriggerAssistMode:()=>Jt,ContextualTriggerDecorationStyle:()=>Xt,ContextualTriggerSuggestionColor:()=>Zt,ContextualTriggerSurface:()=>er,CurrencyFormat:()=>Sr,DataIndexing:()=>yr,DefaultTriggerKind:()=>tt,DurationUnit:()=>Cr,EmailDisplayType:()=>Ar,EmbeddedContentType:()=>Qt,EventTriggerType:()=>rt,FilterCombinator:()=>rr,FilterOperator:()=>tr,ImageCornerStyle:()=>Or,ImageOutline:()=>Dr,ImageShapeStyle:()=>vr,IndexingStrategy:()=>Er,InvocationSource:()=>mr,KnowledgeToolSourceType:()=>$t,LinkDisplayType:()=>br,MailEventType:()=>nr,MailFilterField:()=>ar,MissingScopesError:()=>Mt,NetworkConnection:()=>pr,NotetakerEventType:()=>ir,NotetakerFilterField:()=>sr,OptionsType:()=>ot,PackDefinitionBuilder:()=>$e,ParameterType:()=>at,PermissionSyncMode:()=>cr,PostSetupType:()=>Wt,PrecannedDateRange:()=>ur,PropertyLabelValueTemplate:()=>_n,ResponseSizeTooLargeError:()=>It,ScaleIconSet:()=>Pr,ScreenAnnotationType:()=>zt,SkillModel:()=>Yt,SlackEventType:()=>or,StatusCodeError:()=>Rt,SvgConstants:()=>Ht,TokenExchangeCredentialsLocation:()=>Gt,ToolType:()=>et,Type:()=>nt,UpdateOutcome:()=>dn,UserVisibleError:()=>Se,ValidFetchMethods:()=>Cn,ValueHintType:()=>ct,ValueType:()=>Re,assertCondition:()=>re,autocompleteSearchObjects:()=>xi,ensureExists:()=>V,ensureNonEmptyString:()=>xe,ensureUnreachable:()=>ue,generateSchema:()=>pt,getEffectivePropertyKeysFromSchema:()=>Ei,getQueryParams:()=>yi,joinUrl:()=>li,makeAttributionNode:()=>Nn,makeDynamicSyncTable:()=>Vt,makeEmptyFormula:()=>Pi,makeFormula:()=>We,makeMetadataFormula:()=>Ut,makeObjectSchema:()=>ye,makeParameter:()=>_t,makePropertyOptionsFormula:()=>Lt,makeReferenceSchemaFromObjectSchema:()=>Ln,makeSchema:()=>jn,makeSimpleAutocompleteMetadataFormula:()=>gn,makeSyncTable:()=>Ge,makeTranslateObjectFormula:()=>Si,newAgent:()=>vi,newPack:()=>Oi,simpleAutocomplete:()=>hn,withIdentity:()=>Vn,withQueryParams:()=>kt});module.exports=Ni($c);var Xe=(g=>(g.None="None",g.HeaderBearerToken="HeaderBearerToken",g.CustomHeaderToken="CustomHeaderToken",g.MultiHeaderToken="MultiHeaderToken",g.QueryParamToken="QueryParamToken",g.MultiQueryParamToken="MultiQueryParamToken",g.OAuth2="OAuth2",g.OAuth2ClientCredentials="OAuth2ClientCredentials",g.WebBasic="WebBasic",g.Custom="Custom",g.AWSAccessKey="AWSAccessKey",g.AWSAssumeRole="AWSAssumeRole",g.CodaApiHeaderBearerToken="CodaApiHeaderBearerToken",g.GoogleDomainWideDelegation="GoogleDomainWideDelegation",g.GoogleServiceAccount="GoogleServiceAccount",g.EntraCertificate="EntraCertificate",g.Various="Various",g))(Xe||{}),Wt=(e=>(e.SetEndpoint="SetEndPoint",e))(Wt||{}),Gt=(n=>(n.Automatic="Automatic",n.Body="Body",n.AuthorizationHeader="AuthorizationHeader",n))(Gt||{});var et=(y=>(y.Pack="Pack",y.Knowledge="Knowledge",y.ScreenAnnotation="ScreenAnnotation",y.MCP="MCP",y.ContactResolution="ContactResolution",y.CodaDocsAndTables="CodaDocsAndTables",y.WebSearch="WebSearch",y.EmbeddedContent="EmbeddedContent",y.MailAndCalendar="MailAndCalendar",y))(et||{}),$t=(r=>(r.Global="Global",r.Pack="Pack",r))($t||{}),zt=(r=>(r.Rewrite="Rewrite",r.Guide="Guide",r))(zt||{}),Qt=(n=>(n.CopyableBlock="CopyableBlock",n.CarouselView="CarouselView",n.TabView="TabView",n))(Qt||{}),Yt=(r=>(r.OpenAIGPT4="OpenAIGPT4",r.OpenAIGPT5="OpenAIGPT5",r))(Yt||{}),Jt=(r=>(r.OnDemand="on_demand",r.Proactive="proactive",r))(Jt||{}),Zt=(m=>(m.Blue="blue",m.Green="green",m.Mulberry="mulberry",m.Neutral="neutral",m.Orange="orange",m.Purple="purple",m.Red="red",m.Yellow="yellow",m))(Zt||{}),Xt=(r=>(r.Auto="auto",r.Underline="underline",r))(Xt||{}),er=(p=>(p.ChatAndMessages="chat_messages",p.CodingEnvironment="coding_environment",p.CustomerService="customer_service",p.Docs="docs",p.Email="email",p.SearchAndBrowser="search_browser",p.SocialMedia="social_media",p))(er||{}),tt=(n=>(n.Event="event",n.Schedule="schedule",n.WhileWriting="whileWriting",n))(tt||{}),rt=(n=>(n.Mail="mail",n.Notetaker="notetaker",n.Slack="slack",n))(rt||{}),tr=(p=>(p.NumberAtLeast="numberAtLeast",p.NumberAtMost="numberAtMost",p.NumberEquals="numberEquals",p.TextContains="textContains",p.TextDoesNotContain="textDoesNotContain",p.TextDoesNotEqual="textDoesNotEqual",p.TextEquals="textEquals",p))(tr||{}),rr=(r=>(r.And="and",r.Or="or",r))(rr||{}),nr=(r=>(r.MessageReceived="message_received",r.MessageSent="message_sent",r))(nr||{}),ar=(a=>(a.Body="body",a.From="from",a.Subject="subject",a.To="to",a))(ar||{}),or=(e=>(e.MessageKeyword="message_keyword",e))(or||{}),ir=(e=>(e.MeetingSummaryCompleted="meeting.summary.completed",e))(ir||{}),sr=(p=>(p.DurationMinutes="durationMinutes",p.HasExternalAttendees="hasExternalAttendees",p.IsRecurring="isRecurring",p.MeetingType="meetingType",p.Participant="participant",p.ParticipantCount="participantCount",p.ProjectTag="projectTag",p))(sr||{});var nt=(u=>(u[u.string=0]="string",u[u.number=1]="number",u[u.object=2]="object",u[u.boolean=3]="boolean",u[u.date=4]="date",u[u.html=5]="html",u[u.image=6]="image",u[u.file=7]="file",u[u.markdown=8]="markdown",u[u.email=9]="email",u))(nt||{});var at=(O=>(O.String="string",O.Number="number",O.Boolean="boolean",O.Date="date",O.Html="html",O.Image="image",O.File="file",O.Markdown="markdown",O.Email="email",O.StringArray="stringArray",O.SparseStringArray="sparseStringArray",O.NumberArray="numberArray",O.SparseNumberArray="sparseNumberArray",O.BooleanArray="booleanArray",O.SparseBooleanArray="sparseBooleanArray",O.EmailArray="emailArray",O.SparseEmailArray="sparseEmailArray",O.DateArray="dateArray",O.SparseDateArray="sparseDateArray",O.HtmlArray="htmlArray`",O.SparseHtmlArray="sparseHtmlArray",O.ImageArray="imageArray",O.SparseImageArray="sparseImageArray",O.FileArray="fileArray",O.SparseFileArray="sparseFileArray",O.MarkdownArray="markdownArray`",O.SparseMarkdownArray="sparseMarkdownArray",O))(at||{}),vn={string:0,number:1,boolean:3,date:4,html:5,image:6,file:7,markdown:8,email:9,stringArray:{type:"array",items:0},numberArray:{type:"array",items:1},booleanArray:{type:"array",items:3},dateArray:{type:"array",items:4},"htmlArray`":{type:"array",items:5},imageArray:{type:"array",items:6},fileArray:{type:"array",items:7},"markdownArray`":{type:"array",items:8},emailArray:{type:"array",items:9},sparseStringArray:{type:"array",items:0,allowEmpty:!0},sparseNumberArray:{type:"array",items:1,allowEmpty:!0},sparseBooleanArray:{type:"array",items:3,allowEmpty:!0},sparseDateArray:{type:"array",items:4,allowEmpty:!0},sparseHtmlArray:{type:"array",items:5,allowEmpty:!0},sparseImageArray:{type:"array",items:6,allowEmpty:!0},sparseFileArray:{type:"array",items:7,allowEmpty:!0},sparseMarkdownArray:{type:"array",items:8,allowEmpty:!0},sparseEmailArray:{type:"array",items:9,allowEmpty:!0}};var we=(n=>(n.None="none",n.Optional="optional",n.Required="required",n))(we||{}),pr=(n=>(n.None="none",n.Optional="optional",n.Required="required",n))(pr||{}),Cn=["GET","PATCH","POST","PUT","DELETE","HEAD"],cr=(r=>(r.Personal="Personal",r.PermissionAware="PermissionAware",r))(cr||{});var mr=(a=>(a.Brain="Brain",a.Doc="Doc",a.Go="Go",a.NativeIntegration="NativeIntegration",a))(mr||{});var ur=(A=>(A.Yesterday="yesterday",A.Last7Days="last_7_days",A.Last30Days="last_30_days",A.Last90Days="last_90_days",A.Last180Days="last_180_days",A.Last365Days="last_365_days",A.LastWeek="last_week",A.LastMonth="last_month",A.Last3Months="last_3_months",A.Last6Months="last_6_months",A.LastYear="last_year",A.Today="today",A.ThisWeek="this_week",A.ThisMonth="this_month",A.YearToDate="year_to_date",A.ThisYear="this_year",A.Last7AndNext7Days="last_7_and_next_7_days",A.Last30AndNext30Days="last_30_and_next_30_days",A.Last90AndNext90Days="last_90_and_next_90_days",A.Tomorrow="tomorrow",A.Next7Days="next_7_days",A.Next30Days="next_30_days",A.Next90Days="next_90_days",A.Next180Days="next_180_days",A.Next365Days="next_365_days",A.NextWeek="next_week",A.NextMonth="next_month",A.Next3Months="next_3_months",A.Next6Months="next_6_months",A.NextYear="next_year",A.Everything="everything",A))(ur||{}),Bi=["today","last_7_days","last_30_days","last_90_days","last_180_days","last_365_days","year_to_date"],Yc=[...Bi,"yesterday","last_week","last_month","last_year","this_week","this_month","this_year","everything"];var En=(l=>(l.Today="today",l.Yesterday="yesterday",l.Tomorrow="tomorrow",l.DaysAgo7="7_days_ago",l.DaysAgo30="30_days_ago",l.DaysAgo90="90_days_ago",l.DaysAgo180="180_days_ago",l.DaysAgo365="365_days_ago",l.DaysAhead7="7_days_ahead",l.DaysAhead30="30_days_ahead",l.DaysAhead90="90_days_ahead",l.DaysAhead180="180_days_ahead",l.DaysAhead365="365_days_ahead",l))(En||{}),Jc=Object.values(En);var ot=(e=>(e.Dynamic="__coda_dynamic__",e))(ot||{});var yr=(r=>(r.Include="include",r.Exclude="exclude",r))(yr||{});function lr(t){Object.freeze(t);for(let e of Object.keys(t)){let n=t[e];n!==null&&(typeof n=="object"||typeof n=="function")&&!Object.isFrozen(n)&&lr(n)}return t}i(lr,"deepFreeze");function z(t){return JSON.parse(JSON.stringify(t))}i(z,"deepCopy");function Fn(t){return t&&typeof t=="object"&&"then"in t}i(Fn,"isPromise");function ue(t,e){throw new Error(e||`Unreachable code hit with value ${String(t)}`)}i(ue,"ensureUnreachable");function xe(t,e){if(typeof t!="string"||t.length===0)throw new(fr(e))(e||`Expected non-empty string for ${String(t)}`);return t}i(xe,"ensureNonEmptyString");function V(t,e){if(typeof t>"u"||t===null)throw new(fr(e))(e||`Expected value for ${String(t)}`);return t}i(V,"ensureExists");function fr(t){return t?Se:Error}i(fr,"getErrorConstructor");function re(t,e){if(!t)throw new(fr(e))(e||"Assertion failed")}i(re,"assertCondition");function Pe(t){return new dr(t)}i(Pe,"objectSchemaHelper");var gr=class gr{constructor(e){this._schema=e,this._checkAgainstAllProperties(e)}_checkAgainstAllProperties(e){let{id:r,idProperty:n,primary:a,displayProperty:o,featuredProperties:s,featured:p,identity:m,options:y,properties:u,type:c,attribution:f,codaType:l,requireForUpdates:T,includeUnknownProperties:b,titleProperty:x,linkProperty:g,subtitleProperties:v,snippetProperty:d,imageProperty:S,description:h,createdAtProperty:D,createdByProperty:R,modifiedAtProperty:F,modifiedByProperty:_,userEmailProperty:H,userIdProperty:O,groupIdProperty:k,memberGroupIdProperty:L,versionProperty:U,index:A,parent:N,...M}=e;}get id(){return this._schema.idProperty??this._schema.id}get primary(){return this._schema.displayProperty??this._schema.primary}get featured(){return this._schema.featuredProperties??this._schema.featured}get identity(){return this._schema.identity}get options(){return this._schema.options}get properties(){return this._schema.properties}get type(){return this._schema.type}get attribution(){return this._schema.attribution??this._schema.identity?.attribution}get codaType(){return this._schema.codaType}get requireForUpdates(){return this._schema.requireForUpdates}get titleProperty(){return this._schema.titleProperty??this._schema.displayProperty}};i(gr,"ObjectSchemaHelper");var dr=gr;function kn(t){return new hr(t)}i(kn,"setEndpointDefHelper");var Tr=class Tr{constructor(e){this._step=e}get getOptions(){return V(this._step.getOptions??this._step.getOptionsFormula)}};i(Tr,"SetEndpointDefHelper");var hr=Tr;var In=Ze(Rn());var Re=(o=>(o.Boolean="boolean",o.Number="number",o.String="string",o.Array="array",o.Object="object",o))(Re||{}),ct=(D=>(D.Date="date",D.Time="time",D.DateTime="datetime",D.Duration="duration",D.Email="email",D.Person="person",D.Percent="percent",D.Currency="currency",D.ImageReference="image",D.ImageAttachment="imageAttachment",D.Url="url",D.Markdown="markdown",D.Html="html",D.Embed="embed",D.Reference="reference",D.Attachment="attachment",D.Slider="slider",D.Scale="scale",D.ProgressBar="progressBar",D.Toggle="toggle",D.CodaInternalRichText="codaInternalRichText",D.SelectList="selectList",D))(ct||{});var Sr=(n=>(n.Currency="currency",n.Accounting="accounting",n.Financial="financial",n))(Sr||{}),Pr=(S=>(S.Star="star",S.Circle="circle",S.Fire="fire",S.Bug="bug",S.Diamond="diamond",S.Bell="bell",S.ThumbsUp="thumbsup",S.Heart="heart",S.Chili="chili",S.Smiley="smiley",S.Lightning="lightning",S.Currency="currency",S.Coffee="coffee",S.Person="person",S.Battery="battery",S.Cocktail="cocktail",S.Cloud="cloud",S.Sun="sun",S.Checkmark="checkmark",S.LightBulb="lightbulb",S))(Pr||{}),Ar=(n=>(n.IconAndEmail="iconAndEmail",n.IconOnly="iconOnly",n.EmailOnly="emailOnly",n))(Ar||{}),br=(o=>(o.IconOnly="iconOnly",o.Url="url",o.Title="title",o.Card="card",o.Embed="embed",o))(br||{}),Dr=(r=>(r.Disabled="disabled",r.Solid="solid",r))(Dr||{}),Or=(r=>(r.Rounded="rounded",r.Square="square",r))(Or||{}),vr=(r=>(r.Auto="auto",r.Circle="circle",r))(vr||{}),Cr=(a=>(a.Days="days",a.Hours="hours",a.Minutes="minutes",a.Seconds="seconds",a))(Cr||{});var _n="{VALUE}",Er=(r=>(r.Standard="standard",r.Raw="raw",r))(Er||{});var Fr=(n=>(n[n.Text=1]="Text",n[n.Link=2]="Link",n[n.Image=3]="Image",n))(Fr||{});function Nn(t){return t}i(Nn,"makeAttributionNode");function Bn(t){return!!(t&&t.type==="object")}i(Bn,"isObject");function st(t){return!!(t&&t.type==="array")}i(st,"isArray");function kr(t){return!!t?.codaType&&["selectList","reference"].includes(t.codaType)}i(kr,"unwrappedSchemaSupportsOptions");function Ae(t){if(!st(t))return t;if(!st(t.items))return t.items}i(Ae,"maybeUnwrapArraySchema");function pt(t){if(Array.isArray(t)){if(t.length===0)throw new Error("Must have representative value.");return{type:"array",items:pt(t[0])}}if(typeof t=="object"){let e={};if(t===null)return{type:"string"};for(let r in t)t.hasOwnProperty(r)&&(e[r]=pt(t[r]));return{type:"object",properties:e}}else{if(typeof t=="string")return{type:"string"};if(typeof t=="boolean")return{type:"boolean"};if(typeof t=="number")return{type:"number"}}return ue(t)}i(pt,"generateSchema");function jn(t){return t}i(jn,"makeSchema");function ye(t){let e={...t,type:"object"};for(let r of Object.keys(e.properties))if(r!=="type"){let n=r,o=Ae(e.properties[r])?.options,s=typeof o=="function"?o:void 0;if(e.properties[n]=z(e.properties[r]),s){let p=Ae(e.properties[n]);V(p,"deepCopy() broke maybeUnwrapArraySchema?..."),p.options=s}}return Un(e),e}i(ye,"makeObjectSchema");function Un(t){if(t.codaType==="reference"){let{id:e,identity:r,primary:n}=Pe(t);it(e,"idProperty",t.codaType),it(r,"identity",t.codaType),it(n,"displayProperty",t.codaType),xr(V(e),t,"idProperty"),xr(V(n),t,"displayProperty")}if(t.codaType==="person"){let{id:e}=Pe(t);it(e,"idProperty",t.codaType),xr(V(e),t,"idProperty")}for(let[e,r]of Object.entries(t.properties))r.type==="object"&&Un(r)}i(Un,"validateObjectSchema");function it(t,e,r){V(t,`Objects with codaType "${r}" require a "${e}" property in the schema definition.`)}i(it,"checkRequiredFieldInObjectSchema");function xr(t,e,r){let{properties:n,codaType:a}=e;re(n[t],`${r} set to undefined field "${t}"`),re(n[t].required,`Field "${t}" must be marked as required in schema with codaType "${a}".`)}i(xr,"checkSchemaPropertyIsRequired");function $(t){return(0,In.default)(t).replace(/:/g,"_")}i($,"normalizeSchemaKey");function Mn(t,e){return e.hasOwnProperty($(t))?$(t):t.split(".").map(r=>{let n=r,a="";return r.includes("[")&&(n=r.substring(0,r.indexOf("[")),a=r.substring(r.indexOf("["))),$(n)+a}).join(".")}i(Mn,"normalizeSchemaKeyPath");function E(t,e){if(typeof t=="string")return Mn(t,e);let{label:r,property:n,placeholder:a,...o}=t;return{property:Mn(n,e),label:r,placeholder:a}}i(E,"normalizeSchemaPropertyIdentifier");function Li(t,e){if(typeof t=="object"&&"strategy"in t){let{property:r,strategy:n,...a}=t;return{property:E(r,e),strategy:n}}return E(t,e)}i(Li,"normalizeIndexProperty");function Vi(t,e){switch(t.type){case"Messaging":case"Document":case"Comment":{let{type:r,...n}=t;return{type:r}}case"Email":{let{type:r,toProperty:n,fromProperty:a,subjectProperty:o,htmlBodyProperty:s,plainTextBodyProperty:p,...m}=t;return{type:r,toProperty:E(n,e),fromProperty:E(a,e),subjectProperty:E(o,e),htmlBodyProperty:E(s,e),plainTextBodyProperty:E(p,e)}}default:return ue(t)}}i(Vi,"normalizeContentCategorization");function Ki(t){return"contentCategorization"in t}i(Ki,"isCategorizationIndexDefinition");function qi(t,e){if(Ki(t)){let{contentCategorization:m,authorityNormProperty:y,popularityNormProperty:u,filterableProperties:c,...f}=t;return{contentCategorization:Vi(m,e),authorityNormProperty:y?E(y,e):void 0,popularityNormProperty:u?E(u,e):void 0,filterableProperties:c?.map(l=>E(l,e))}}let{properties:r,contextProperties:n,authorityNormProperty:a,popularityNormProperty:o,filterableProperties:s,...p}=t;return{properties:r.map(m=>Li(m,e)),contextProperties:n?n.map(m=>E(m,e)):void 0,authorityNormProperty:a?E(a,e):void 0,popularityNormProperty:o?E(o,e):void 0,filterableProperties:s?.map(m=>E(m,e))}}i(qi,"normalizeIndexDefinition");function Hi(t,e){return{parentIdProperty:E(t.parentIdProperty,e),permissions:t.permissions,lifecycle:t.lifecycle}}i(Hi,"normalizeParentDefinition");function ie(t){return st(t)?{...t,type:"array",items:ie(t.items)}:Bn(t)?Wi(t):{...t}}i(ie,"normalizeSchema");function Wi(t){let e={},{attribution:r,options:n,requireForUpdates:a,codaType:o,description:s,displayProperty:p,featured:m,featuredProperties:y,id:u,identity:c,idProperty:f,imageProperty:l,includeUnknownProperties:T,linkProperty:b,primary:x,properties:g,snippetProperty:v,subtitleProperties:d,titleProperty:S,type:h,__packId:D,createdAtProperty:R,createdByProperty:F,modifiedAtProperty:_,modifiedByProperty:H,userEmailProperty:O,userIdProperty:k,groupIdProperty:L,memberGroupIdProperty:U,versionProperty:A,index:N,parent:M,...W}=t;for(let q of Object.keys(g)){let ae=$(q),oe=g[q],{displayName:G,fixedId:ze,fromKey:Qe,mutable:Ye,originalKey:te,required:Je}=oe;if(te)throw new Error("Original key is only for internal use.");let Fi={displayName:G,fixedId:ze,fromKey:Qe||(ae!==q?q:void 0),mutable:Ye,originalKey:q,required:Je};e[ae]=Object.assign(ie(oe),Fi)}return{attribution:r,options:n,requireForUpdates:a,codaType:o,description:s,displayProperty:p?$(p):void 0,featured:m?m.map($):void 0,featuredProperties:y?y.map($):void 0,id:u?$(u):void 0,identity:c,idProperty:f?$(f):void 0,imageProperty:l?E(l,e):void 0,includeUnknownProperties:T,linkProperty:b?E(b,e):void 0,primary:x?$(x):void 0,properties:e,snippetProperty:v?E(v,e):void 0,subtitleProperties:d?d.map(q=>E(q,e)):void 0,titleProperty:S?E(S,e):void 0,createdAtProperty:R?E(R,e):void 0,createdByProperty:F?E(F,e):void 0,modifiedAtProperty:_?E(_,e):void 0,modifiedByProperty:H?E(H,e):void 0,userEmailProperty:O?E(O,e):void 0,userIdProperty:k?E(k,e):void 0,groupIdProperty:L?E(L,e):void 0,memberGroupIdProperty:U?E(U,e):void 0,versionProperty:A?E(A,e):void 0,index:N?qi(N,e):void 0,parent:M?Hi(M,e):void 0,type:"object"}}i(Wi,"normalizeObjectSchema");function Ln(t,e){let{type:r,id:n,primary:a,identity:o,properties:s,options:p,requireForUpdates:m}=Pe(t),{mutable:y}=t;V(o||e,"Source schema must have an identity field, or you must provide an identity name for the reference.");let u=V(n),c={[u]:s[u]};a&&a!==n&&(V(s[a],`Display property "${a}" must refer to a valid property schema.`),c[a]=s[a]);let f={codaType:"reference",displayProperty:a,identity:o||{name:V(e)},idProperty:n,options:p,properties:c,type:r,requireForUpdates:m};return{...ye(f),mutable:y}}i(Ln,"makeReferenceSchemaFromObjectSchema");function Vn(t,e){return{...z(t),identity:{name:xe(e)}}}i(Vn,"withIdentity");var di=Ze(Kn());var Ft=Ze(Zo()),ln=Ze(ui());function kt(t,e){if(!e)return t;let r=(0,ln.default)(t),n=Object.assign({},Ft.default.parse(r.query,{ignoreQueryPrefix:!0}),e);return r.set("query",Ft.default.stringify(JSON.parse(JSON.stringify(n)),{addQueryPrefix:!0})),r.toString()}i(kt,"withQueryParams");function yi(t){let e=(0,ln.default)(t);return Ft.default.parse(e.query,{ignoreQueryPrefix:!0})}i(yi,"getQueryParams");function li(...t){if(!t||!t.length)return"";let e=[];for(let n of t)xe(n),e.length===0?e.push(n):e.push(n.replace(/^\/+/,"")),n.endsWith("/")||e.push("/");let r=e.join("");return t[t.length-1].endsWith("/")?r:r.slice(0,r.length-1)}i(li,"join");function kc(t,e,r){let n={};return t.forEach(a=>{let o=e[a];if(typeof o>"u"){if(r&&r.has(a))return;o=""}n[a]=o}),n}i(kc,"generateParamMap");function fi(t,e,r){let n={};return t.forEach(a=>{let o=e[a];if(typeof o>"u"){if(r&&r.has(a))return;o=""}n[a]=encodeURIComponent(String(o))}),n}i(fi,"generateQueryParamMap");function wc(t,e){let r=t;for(let[n,a]of Object.entries(e))r=r.replace(`{${n}}`,a);return r}i(wc,"formatString");function fn(t,e){let{url:r,queryParams:n,nameMapping:a,bodyTemplate:o,bodyParams:s,method:p,headers:m,transforms:y}=t,u=new Map,c=new Set,f=new Set;e.forEach((b,x)=>{let g=a&&a[b.name]||b.name;if(c.has(g))throw new Error(`Duplicate name ${g} detected`);c.add(g),b.optional&&f.add(g),u.set(x,g)});let l=!!(n&&n.length),T=!!(s&&s.length);return i(function(x){let g={};x.forEach((h,D)=>{let R=V(u.get(D)),F=y?y[R]:void 0;if(F){let _=F(h);_&&typeof _=="object"?Object.assign(g,_):g[R]=_}else g[R]=h});let v=wc(r,fi(Object.keys(g),g)),d=l?kt(v,fi(V(n),g,f)):v,S;if(o&&(S=(0,di.default)(o)),T){let h=kc(V(s),g,f);S=S?{...S,...h}:h}return{url:d,method:p,headers:{Accept:"application/json","Content-Type":"application/json",...m},body:S?JSON.stringify(S):void 0}},"requestHandler")}i(fn,"generateRequestHandler");function wt(t){let{projectKey:e}=t;return i(function(n){let{body:a}=n;return typeof a!="object"?a:e?a[e]:a},"objectResponseHandler")}i(wt,"generateObjectResponseHandler");var Tn=class Tn extends Error{constructor(r,n){super(r);this.isUserVisible=!0;this.internalError=n}};i(Tn,"UserVisibleError");var Se=Tn,Nt=class Nt extends Error{constructor(r,n,a,o){super(`${r} - ${JSON.stringify(n)}`);this.name="StatusCodeError";this.statusCode=r,this.body=n,this.error=n,this.options=a;let s=o?.body;typeof s=="object"&&(s=JSON.stringify(s)),this.response={...o,body:s}}static isStatusCodeError(r){return"name"in r&&r.name===Nt.name}};i(Nt,"StatusCodeError");var Rt=Nt,Bt=class Bt extends Error{constructor(r){super(r||"Additional permissions are required");this.name="MissingScopesError"}static isMissingScopesError(r){return"name"in r&&r.name===Bt.name}};i(Bt,"MissingScopesError");var Mt=Bt;var jt=class jt extends Error{constructor(r){super(r||"Response size too large");this.name="ResponseSizeTooLargeError"}static isResponseSizeTooLargeError(r){return"name"in r&&r.name===jt.name}};i(jt,"ResponseSizeTooLargeError");var It=jt;function Ti(t){return"isDynamic"in t}i(Ti,"isDynamicSyncTable");function I(t){return typeof t=="function"?Ut(t):t}i(I,"wrapMetadataFunction");function hi(t){return t?.type==="array"?t:{type:"array",items:t}}i(hi,"transformToArraySchema");function Rc(t){if(t)return{...t,execute(e,r){let n=t.execute(e,r);return Fn(n)?n.then(a=>hi(a)):hi(n)}}}i(Rc,"wrapGetSchema");function _t(t){let{type:e,autocomplete:r,crawlStrategy:n,allowManualInput:a,...o}=t,s=vn[e],p;if(Array.isArray(r)){let u=gn(r);p=I(u)}else p=I(r);let m;if(n)if(n.parentTable){let{tableName:u,propertyKey:c,inheritPermissions:f}=n.parentTable;m={parentTable:{tableName:u,propertyKey:$(c),inheritPermissions:f}}}else m=n;return Object.freeze({...o,allowManualInput:a!==!1,autocomplete:p,type:s,crawlStrategy:m})}i(_t,"makeParameter");var dn=(r=>(r.Success="success",r.Error="error",r))(dn||{});function We(t){let e;switch(t.resultType){case"string":{let n={...t,codaType:"codaType"in t?t.codaType:void 0,formulaSchema:"schema"in t?t.schema:void 0,validateParameters:I(t.validateParameters)},{onError:a,resultType:o,codaType:s,formulaSchema:p,...m}=n;re(s!=="selectList","ValueHintType.SelectList is not supported for formula result types."),e={...m,resultType:0,schema:p||(s?{type:"string",codaType:s}:void 0)};break}case"number":{let n={...t,codaType:"codaType"in t?t.codaType:void 0,formulaSchema:"schema"in t?t.schema:void 0,validateParameters:I(t.validateParameters)},{onError:a,resultType:o,codaType:s,formulaSchema:p,...m}=n;e={...m,resultType:1,schema:p||(s?{type:"number",codaType:s}:void 0)};break}case"boolean":{let{onError:n,resultType:a,...o}=t;e={...o,resultType:3,validateParameters:I(t.validateParameters)};break}case"array":{let{onError:n,resultType:a,items:o,...s}=t;e={...s,resultType:2,schema:z(ie({type:"array",items:o})),validateParameters:I(t.validateParameters)};break}case"object":{let{onError:n,resultType:a,schema:o,...s}=t;e={...s,resultType:2,schema:z(ie(o)),validateParameters:I(t.validateParameters)};break}default:return ue(t)}let r=t.onError;if(r){let n=e.execute;e.execute=async function(a,o){try{return await n(a,o)}catch(s){return r(s)}}}return j(e,t.connectionRequirement)}i(We,"makeFormula");function Ut(t,e){return Ic({name:"getMetadata",description:"Gets metadata",execute([r,n],a){let o={};try{o=JSON.parse(n||"")}catch{}return t(a,r,o)},parameters:[_t({type:"string",name:"search",description:"Metadata to search for.",optional:!0}),_t({type:"string",name:"formulaContext",description:"Serialized JSON for metadata.",optional:!0})],examples:[],connectionRequirement:e?.connectionRequirement||"optional"})}i(Ut,"makeMetadataFormula");function Lt({execute:t,schema:e,name:r}){if(!(t instanceof Function))throw new Error("Value for execute must be a function");let n=t,a=i(async([],p)=>n(p),"innerExecute"),o={connectionRequirement:"optional",execute:a,name:r,description:`A property options function for ${r}`,parameters:[],resultType:"array",items:e};return We(o)}i(Lt,"makePropertyOptionsFormula");function hn(t,e){let r=(t||"").toLowerCase(),n=e.filter(o=>(typeof o=="string"||typeof o=="number"?o:o.display).toString().toLowerCase().includes(r)),a=[];for(let o of n)typeof o=="string"?a.push({value:o,display:o}):typeof o=="number"?a.push({value:o,display:o.toString()}):a.push(o);return Promise.resolve(a)}i(hn,"simpleAutocomplete");async function xi(t,e,r,n){if(typeof t!="string")throw new TypeError(`Expecting a string for "search" parameter but received ${t}`);let a=t.toLowerCase(),o=[];for(let s of e){let p=s[r];if(!p.toLowerCase().includes(a))continue;let m=s[n];o.push({display:p,value:m})}return o}i(xi,"autocompleteSearchObjects");function gn(t){return Ut((e,r)=>hn(r,t),{connectionRequirement:"optional"})}i(gn,"makeSimpleAutocompleteMetadataFormula");function gi(t){return t&&t.schema}i(gi,"isResponseHandlerTemplate");function Mc(t){return t&&t.example}i(Mc,"isResponseExampleTemplate");function Ic({response:t,...e}){let r;if(t)if(gi(t)&&t.schema){let a=z(t.schema);t.schema=ie(a),r=t.schema}else Mc(t);let n=e.execute;if(gi(t)){let{onError:a}=t,o=n,s=wt(t);n=i(async function(m,y){let u;try{u=await o(m,y)}catch(c){if(a)u=a(c);else throw c}return s({body:u||{},status:200,headers:{}})},"exec")}return Object.assign({},e,{resultType:2,execute:n,schema:r,validateParameters:I(e.validateParameters)})}i(Ic,"makeObjectFormula");function Ge({name:t,displayName:e,description:r,instructions:n,identityName:a,schema:o,formula:s,connectionRequirement:p,dynamicOptions:m={},role:y,indexing:u}){let{getSchema:c,entityName:f,defaultAddDynamicColumns:l}=m,{execute:T,executeUpdate:b,executeGetPermissions:x,onError:g,...v}=j(s,p),d=z(o);if(!a)throw new Error("Sync table schemas must set an identityName");if(d.identity){if(d.identity.name&&d.identity.name!==a)throw new Error(`Identity name mismatch for sync table ${t}. Either remove the schema's identity.name (${d.identity.name}) or ensure it matches the table's identityName (${a}).`);d.identity={...d.identity,name:a}}else d.identity={name:a};if(y==="users"){if(!d.userEmailProperty)throw new Error("Sync table schemas with role users must set a userEmailProperty");if(!d.userIdProperty)throw new Error("Sync table schemas with role users must set a userIdProperty")}if(y==="groupMembers"){if(!d.groupIdProperty)throw new Error("Sync table schemas with role groupMembers must set a groupIdProperty");if(!d.userIdProperty&&!d.memberGroupIdProperty)throw new Error("Sync table schemas with role groupMembers must set a userIdProperty or memberGroupIdProperty")}let S=Rc(I(c)),h=ye(d),D=Nc({inputSchema:o,schema:h,identityName:a});m.propertyOptions&&(D??(D={}),D.__coda_dynamic__=Lt({execute:m.propertyOptions,schema:ye({properties:{}}),name:`${a}.DynamicPropertyOptions`}));let R=ie(h),F=S?void 0:{type:"array",items:R},{identity:_,id:H,primary:O}=Pe(h);if(!(O&&H))throw new Error("Sync table schemas should have defined properties for idProperty and displayProperty");if(!_)throw new Error("Unknown error creating sync table identity");if(t.includes(" "))throw new Error("Sync table name should not include spaces");let k=wt({schema:F}),L=i(async function(N,M){let W;try{W=await T(N,M)||{}}catch(Je){throw g?.(Je),Je}let q=M.sync.schema,ae=k({body:W.result||[],status:200,headers:{}},q),{continuation:oe,completion:G,deletedItemIds:ze,deletedRowIds:Qe,permissionsContext:Ye}=W,te={result:ae};return oe&&(te.continuation=oe),G&&(te.completion=G),(Qe??ze)&&(te.deletedRowIds=Qe??ze,te.deletedItemIds=te.deletedRowIds),Ye&&(te.permissionsContext=Ye),te},"exec"),U=b?i(async function(N,M,W){let{result:q}=await b(N,M,W)||{},ae=W.sync.schema;return{result:k({body:q||[],status:200,headers:{}},ae)}},"execUpdate"):void 0;return{name:t,displayName:e,description:r,instructions:n,schema:R,identityName:a,getter:{...v,cacheTtlSecs:0,execute:L,executeUpdate:U,schema:F,isSyncFormula:!0,supportsUpdates:!!U,supportsGetPermissions:!!x,connectionRequirement:v.connectionRequirement||p,resultType:2,executeGetPermissions:x,validateParameters:I(v.validateParameters)},getSchema:j(S,p),entityName:f,defaultAddDynamicColumns:l,namedPropertyOptions:Kt(D,p),role:y,indexing:u}}i(Ge,"makeSyncTable");function Vt({name:t,displayName:e,description:r,getName:n,getSchema:a,identityName:o,getDisplayUrl:s,formula:p,listDynamicUrls:m,searchDynamicUrls:y,entityName:u,connectionRequirement:c,defaultAddDynamicColumns:f,placeholderSchema:l,propertyOptions:T,indexing:b}){let x=l||ye({type:"object",idProperty:"id",displayProperty:"id",identity:{name:o},properties:{id:{type:"string"}}}),g=I(n),v=I(a),d=I(s),S=I(m),h=I(y);return{...Ge({name:t,displayName:e,description:r,identityName:o,schema:x,formula:p,connectionRequirement:c,dynamicOptions:{getSchema:v,entityName:u,defaultAddDynamicColumns:f,propertyOptions:T},indexing:b}),isDynamic:!0,getDisplayUrl:j(d,c),listDynamicUrls:j(S,c),searchDynamicUrls:j(h,c),getName:j(g,c)}}i(Vt,"makeDynamicSyncTable");function Si({response:t,...e}){let{request:r,...n}=e,{parameters:a}=n;t.schema=t.schema?ie(t.schema):void 0;let{onError:o}=t,s=fn(r,a),p=wt(t);function m(y,u){return u.fetcher.fetch(s(y)).catch(c=>{throw o?.(c),c}).then(p)}return i(m,"execute"),Object.assign({},n,{execute:m,resultType:2,schema:t.schema,validateParameters:I(e.validateParameters)})}i(Si,"makeTranslateObjectFormula");function Pi(t){let{request:e,...r}=t,{parameters:n}=r,a=fn(e,n);function o(s,p){return p.fetcher.fetch(a(s)).then(()=>"")}return i(o,"execute"),Object.assign({},r,{execute:o,resultType:0,validateParameters:I(t.validateParameters)})}i(Pi,"makeEmptyFormula");function Kt(t,e){if(!t)return t;let r={};for(let n of Object.keys(t))r[n]=j(t[n],e);return r}i(Kt,"maybeRewriteConnectionForNamedPropertyOptions");function j(t,e){return t&&e?{...t,parameters:t.parameters.map(r=>({...r,autocomplete:r.autocomplete?j(r.autocomplete,e):void 0})),varargParameters:t.varargParameters?.map(r=>({...r,autocomplete:r.autocomplete?j(r.autocomplete,e):void 0})),connectionRequirement:e}:t}i(j,"maybeRewriteConnectionForFormula");function _c(t){let e=[];for(let r of Object.keys(t.properties)){let n=Ae(t.properties[r]);if(!n||!("options"in n))continue;let{options:a}=n;a&&typeof a=="function"&&e.push(r)}return e}i(_c,"listPropertiesWithOptionsFunctions");function Nc({inputSchema:t,schema:e,identityName:r}){let n={},a=_c(t);if(a.length){for(let o of a){let s=Ae(t.properties[o]),p=Ae(e.properties[o]);re(kr(s),`Property "${o}" must have codaType of ValueHintType.SelectList or ValueHintType.Reference to configure property options`),re(kr(p),`Property "${o}" lost codaType on deep copy?...`),p.options=o,n[o]=Lt({execute:s.options,schema:e.properties[o],name:`${r}.${o}.Options`})}return n}}i(Nc,"moveJsPropertyOptionsFunctionsToFormulas");var Bc=["HOURLY","DAILY","WEEKLY","MONTHLY","YEARLY"],jc=["MINUTELY","SECONDLY"],Di=["MO","TU","WE","TH","FR","SA","SU"],Uc=["FREQ","INTERVAL","COUNT","UNTIL","WKST","BYDAY","BYHOUR","BYMINUTE","BYMONTH","BYMONTHDAY","BYSETPOS"],Lc=[["BYHOUR",[0,23]],["BYMINUTE",[0,59]],["BYMONTH",[1,12]],["BYMONTHDAY",[-31,-1],[1,31]],["BYSETPOS",[-366,-1],[1,366]]],Vc=/^(\d{4})(\d{2})(\d{2})$/,Kc=/^(\d{2})(\d{2})(\d{2})Z?$/,qc="TZID=",Hc=new RegExp(`^([+-]?([1-9]|[1-4]\\d|5[0-3]))?(${Di.join("|")})$`),Ai=60,xn="A schedule trigger must not run more frequently than once per hour.";function Sn(t){let e=t.split(/\r?\n/).map(x=>x.trim()).filter(Boolean),r,n=[],a;for(let x of e){let g=x.indexOf(":"),v=g<0?[""]:x.slice(0,g).split(";"),d=v[0].toUpperCase();if(d==="DTSTART"&&r===void 0)r=x.slice(g+1).toUpperCase(),n=v.slice(1);else if((d==="RRULE"||d==="")&&a===void 0)a=g<0?x:x.slice(g+1);else return"A schedule trigger takes one DTSTART line and one RRULE line."}if(a===void 0)return"A schedule trigger must have an RRULE.";if(r===void 0)return"A schedule trigger must have a DTSTART.";if(!bi(r))return"A schedule trigger has an invalid DTSTART.";let o=n.find(x=>x.toUpperCase().startsWith(qc));if(o!==void 0){let x=o.slice(o.indexOf("=")+1).replace(/^"(.*)"$/,"$1");if(!Wc(x))return"A schedule trigger has an invalid DTSTART timezone.";if(r?.endsWith("Z"))return"A schedule trigger cannot set both a DTSTART timezone and a UTC time."}let s=new Map;for(let x of a.split(";")){let[g,v]=x.split("="),d=g.toUpperCase();if(!Uc.includes(d)||!v)return`A schedule trigger does not support "${x}".`;if(s.has(d))return`A schedule trigger can only set ${d} once.`;s.set(d,v.toUpperCase())}let p=s.get("FREQ");if(p===void 0)return"A schedule trigger must set FREQ.";if(jc.includes(p))return xn;if(!Bc.includes(p))return`A schedule trigger does not support FREQ=${p}.`;for(let x of["INTERVAL","COUNT"]){let g=s.get(x);if(g!==void 0&&!/^[1-9]\d*$/.test(g))return`A schedule trigger has an invalid ${x}.`}let m=s.get("UNTIL");if(m!==void 0&&!bi(m))return"A schedule trigger has an invalid UNTIL.";if(m!==void 0&&r!==void 0&&o===void 0&&m.slice(0,8)Hc.test(x)))return"A schedule trigger has an invalid BYDAY.";let c=new Map;for(let[x,...g]of Lc){let v=s.get(x);if(v===void 0)continue;let d=Gc(v,g);if(!d)return`A schedule trigger has an invalid ${x}.`;c.set(x,d)}let f=c.get("BYHOUR")??[0],l=c.get("BYMINUTE")??[0];if(p==="HOURLY")return l.length>1?xn:void 0;let T=[...new Set(f.flatMap(x=>l.map(g=>x*Ai+g)))].sort((x,g)=>x-g);return T.slice(1).map((x,g)=>x-T[g]).some(x=>x/^-?\d+$/.test(a)?Number(a):NaN),n=i(a=>e.some(([o,s])=>a>=o&&a<=s),"inRange");return r.every(n)?r:void 0}i(Gc,"parseNumberList");function Oi(t){return new $e(t)}i(Oi,"newPack");function vi(){return new Pn}i(vi,"newAgent");var An=class An{setVersion(e){return this.version=e,this}};i(An,"BaseDefinitionBuilder");var qt=An,bn=class bn extends qt{constructor(e){super();let{formulas:r,formats:n,syncTables:a,skills:o,chatSkill:s,benchInitializationSkill:p,networkDomains:m,defaultAuthentication:y,systemConnectionAuthentication:u,version:c,formulaNamespace:f,skillEntrypoints:l,suggestedPrompts:T,mcpServers:b}=e||{};this.formulas=r||[],this.formats=n||[],this.syncTables=a||[],this.skills=o||[],this.skillEntrypoints=l,this.chatSkill=s,this.benchInitializationSkill=p,this.suggestedPrompts=T||[],this.networkDomains=m||[],this.mcpServers=b||[],this.defaultAuthentication=y,this.systemConnectionAuthentication=u,this.version=c,this.formulaNamespace=f||"Deprecated"}addFormula(e){let r=We({...e,connectionRequirement:e.connectionRequirement||this._defaultConnectionRequirement});return this.formulas.push(r),this}addSyncTable(e){let r=e.connectionRequirement||this._defaultConnectionRequirement,n=Ge({...e,connectionRequirement:r});return this.syncTables.push(n),this}addDynamicSyncTable(e){let r=Vt({...e,connectionRequirement:e.connectionRequirement||this._defaultConnectionRequirement});return this.syncTables.push(r),this}addColumnFormat(e){return this.formats.push(e),this}addSkill(e){return this.skills.push(e),this}addMCPServer(e){return this.mcpServers.push(e),this}setChatSkill(e){return this.chatSkill=e,this}setBenchInitializationSkill(e){return this.benchInitializationSkill=e,this}setSkillEntrypoints(e){return this.skillEntrypoints=e,this}addSuggestedPrompt(e){return this.suggestedPrompts.push(e),this}_wrapAuthenticationFunctions(e){let{getConnectionName:r,getConnectionUserId:n,postSetup:a,...o}=e,s=I(r),p=I(n),m=a?.map(y=>{let u=I(kn(y).getOptions),c=I(y.getOptionsFormula);return{...y,getOptions:u,getOptionsFormula:c}});return{...o,getConnectionName:s,getConnectionUserId:p,postSetup:m}}setUserAuthentication(e){let{defaultConnectionRequirement:r="required",...n}=e;return n.type==="None"||n.type==="Various"?this.defaultAuthentication=n:this.defaultAuthentication=this._wrapAuthenticationFunctions(n),n.type!=="None"&&this._setDefaultConnectionRequirement(r),this}setSystemAuthentication(e){return this.systemConnectionAuthentication=this._wrapAuthenticationFunctions(e),this}addAdminAuthentication(e){return this.adminAuthentications||(this.adminAuthentications=[]),this.adminAuthentications.push({...e,authentication:this._wrapAuthenticationFunctions(e.authentication)}),this}addNetworkDomain(...e){return this.networkDomains.push(...e),this}_setDefaultConnectionRequirement(e){return this._defaultConnectionRequirement=e,this.formulas=this.formulas.map(r=>r.connectionRequirement?r:j(r,e)),this.syncTables=this.syncTables.map(r=>r.getter.connectionRequirement?r:Ti(r)?{...r,getter:j(r.getter,e),getName:j(r.getName,e),getDisplayUrl:j(r.getDisplayUrl,e),getSchema:j(r.getSchema,e),listDynamicUrls:j(r.listDynamicUrls,e),searchDynamicUrls:j(r.searchDynamicUrls,e),namedPropertyOptions:Kt(r.namedPropertyOptions,e)}:{...r,getter:j(r.getter,e),getSchema:j(r.getSchema,e),namedPropertyOptions:Kt(r.namedPropertyOptions,e)}),this}};i(bn,"PackDefinitionBuilder");var $e=bn;function me(t){return lr(z(t))}i(me,"frozenCopy");var Ci=new WeakMap;function Te(t){return Ci.get(t)}i(Te,"stateOf");var Dn=class Dn extends qt{constructor(){super();let e={agent:me({tools:[]})};Ci.set(this,e),Object.defineProperty(this,"agent",{enumerable:!0,get:i(()=>e.agent,"get")}),Object.defineProperty(this,"defaultTriggers",{enumerable:!0,get:i(()=>e.defaultTriggers,"get")}),Object.defineProperty(this,"suggestedPrompts",{enumerable:!0,get:i(()=>e.suggestedPrompts,"get")}),Object.defineProperty(this,"defaultRoutines",{enumerable:!0,get:i(()=>e.defaultRoutines,"get")})}addDefaultRoutine(e){if(!e.name?.trim()&&!e.instructions?.trim())throw new Error("A routine needs a name or instructions containing non-whitespace text.");if(e.trigger.kind==="schedule"){let n=Sn(e.trigger.rruleString);if(n)throw new Error(n)}let r=Te(this);return r.defaultRoutines=me([...r.defaultRoutines??[],e]),this}setInstructions(e){let r=Te(this);return r.agent=me({...r.agent,instructions:e}),this}setTools({docs:e,mail:r,webSearch:n,connectors:a}){let o=[];if(n){let p=typeof n=="object"?n.allowedDomains:void 0;o.push({type:"WebSearch",...p?{allowedDomains:p}:{}})}e&&o.push({type:"CodaDocsAndTables"}),r&&o.push({type:"MailAndCalendar"});for(let p of a||[])o.push({type:"Pack",packId:p.packId,...p.formulas?{formulas:p.formulas}:{}});let s=Te(this);return s.agent=me({...s.agent,tools:o}),this}addSuggestedPrompt(e){let r=Te(this);return r.suggestedPrompts=me([...r.suggestedPrompts??[],e]),this}setDefaultWhileWritingTrigger(e){let r=Te(this),n=(r.defaultTriggers??[]).filter(a=>a.kind!=="whileWriting");return r.defaultTriggers=me([...n,{kind:"whileWriting",...e}]),this}addDefaultMailEventTrigger(e){return this._addDefaultEventTrigger({type:"mail",...e})}addDefaultSlackEventTrigger(e){return this._addDefaultEventTrigger({type:"slack",...e})}addDefaultNotetakerEventTrigger(e){return this._addDefaultEventTrigger({type:"notetaker",...e})}_addDefaultEventTrigger(e){let r=Te(this);return r.defaultTriggers=me([...r.defaultTriggers??[],{kind:"event",...e}]),this}setDefaultScheduleTrigger(e){let r=Sn(e.rruleString);if(r)throw new Error(r);let n=Te(this),a=(n.defaultTriggers??[]).filter(o=>o.kind!=="schedule");return n.defaultTriggers=me([...a,{kind:"schedule",...e}]),this}};i(Dn,"AgentDefinitionBuilder");var Pn=Dn;function Ei(t){if(t.type==="array"&&(t=t.items),t.type==="object")return[...new Set(Object.entries(t.properties).map(([e,r])=>r.fromKey||e))]}i(Ei,"getEffectivePropertyKeysFromSchema");var Ht;(n=>(n.DarkModeFragmentId="DarkMode",n.DataUrlPrefix="data:image/svg+xml;base64,",n.DataUrlPrefixWithDarkModeSupport="data:image/svg+xml;supportsDarkMode=1;base64,"))(Ht||(Ht={})); /*! Bundled license information: pascalcase/index.js: diff --git a/dist/cli/agent_api.d.ts b/dist/cli/agent_api.d.ts index 0d7ee69db..83a48a010 100644 --- a/dist/cli/agent_api.d.ts +++ b/dist/cli/agent_api.d.ts @@ -26,3 +26,28 @@ export interface PostAgentRouteArgs { signal?: AbortSignal; } export declare function postAgentRoute(route: string, args: PostAgentRouteArgs, body: unknown): Promise; +export interface InstalledAgent { + agentInstanceId: string; + tenantId: string; +} +export type InstalledAgentLookup = { + status: 'found'; + agent: InstalledAgent; +} | { + status: 'missing'; +} | { + status: 'unavailable'; +} | { + status: 'error'; + message: string; +}; +export declare function buildInstalledAgentUrl(apiEndpoint: string, packId: number): string; +export declare function codaTypeOf(bodyText: string): string | undefined; +export declare function lookupInstalledAgent(args: { + apiToken: string; + apiEndpoint: string; + packId: number; +}): Promise; +export declare function installedAgentLookupError(lookup: Exclude, kind: 'chat' | 'logs'): string; diff --git a/dist/cli/agent_api.js b/dist/cli/agent_api.js index d3b20153a..c04848b74 100644 --- a/dist/cli/agent_api.js +++ b/dist/cli/agent_api.js @@ -23,7 +23,7 @@ var __importStar = (this && this.__importStar) || function (mod) { return result; }; Object.defineProperty(exports, "__esModule", { value: true }); -exports.postAgentRoute = exports.isApiErrorBody = exports.buildAgentRouteUrl = exports.resolveAgentContext = exports.resolveAgentVersion = void 0; +exports.installedAgentLookupError = exports.lookupInstalledAgent = exports.codaTypeOf = exports.buildInstalledAgentUrl = exports.postAgentRoute = exports.isApiErrorBody = exports.buildAgentRouteUrl = exports.resolveAgentContext = exports.resolveAgentVersion = void 0; const helpers_1 = require("./helpers"); const helpers_2 = require("./helpers"); const helpers_3 = require("./helpers"); @@ -108,3 +108,90 @@ async function postAgentRoute(route, args, body) { return response; } exports.postAgentRoute = postAgentRoute; +function buildInstalledAgentUrl(apiEndpoint, packId) { + return `${(0, helpers_4.formatEndpoint)(apiEndpoint)}/apis/v1/packs/${packId}/agentInstance`; +} +exports.buildInstalledAgentUrl = buildInstalledAgentUrl; +function codaTypeOf(bodyText) { + let parsed; + try { + parsed = JSON.parse(bodyText); + } + catch { + return undefined; + } + if (typeof parsed !== 'object' || parsed === null) { + return undefined; + } + const codaType = parsed.codaType; + return typeof codaType === 'string' ? codaType : undefined; +} +exports.codaTypeOf = codaTypeOf; +function lookupError(message) { + return { status: 'error', message }; +} +async function lookupInstalledAgent(args) { + const url = buildInstalledAgentUrl(args.apiEndpoint, args.packId); + let response; + try { + response = await fetch(url, { + method: 'GET', + headers: { Authorization: `Bearer ${args.apiToken}` }, + signal: AbortSignal.timeout(30000), + }); + } + catch (err) { + const errors = [`Error while looking up the installed agent: ${err}`, (0, errors_2.tryParseSystemError)(err)]; + return lookupError(errors.join('\n')); + } + const bodyText = await response.text(); + if (response.status === 404 && !isApiErrorBody(bodyText)) { + return { status: 'unavailable' }; + } + if (response.status === 404 && codaTypeOf(bodyText) === 'AgentInstanceNotFound') { + return { status: 'missing' }; + } + if (response.status === 404) { + return lookupError('Could not look up the installed agent.'); + } + if (!response.ok) { + return lookupError(`Could not look up the installed agent: ${response.status} ${response.statusText}`); + } + let parsed; + try { + parsed = JSON.parse(bodyText); + } + catch (err) { + return lookupError(`Installed agent lookup failed: the server response was not JSON. ${err}`); + } + const record = parsed; + if (typeof record.agentInstanceId !== 'string' || record.agentInstanceId.trim() === '') { + return lookupError('Installed agent lookup failed: the server response did not include an agent instance id.'); + } + if (typeof record.tenantId !== 'string' || record.tenantId.trim() === '') { + return lookupError('Installed agent lookup failed: the server response did not include a tenant id.'); + } + return { + status: 'found', + agent: { agentInstanceId: record.agentInstanceId, tenantId: record.tenantId }, + }; +} +exports.lookupInstalledAgent = lookupInstalledAgent; +function installedAgentLookupError(lookup, kind) { + if (lookup.status === 'error') { + return lookup.message; + } + if (lookup.status === 'unavailable') { + const override = kind === 'chat' ? '--agentInstanceId' : '--tenant and --instance'; + return `The installed-agent lookup is not available on this server yet.\n Pass ${override}.`; + } + if (kind === 'chat') { + return ('Error: agent chat needs an installed agent instance.\n' + + ' packs agent install pack.ts\n' + + ' Or pass --agentInstanceId.'); + } + return ('Error: agent logs need a tenant and an agent instance.\n' + + ' packs agent install pack.ts\n' + + ' Or pass --tenant and --instance.'); +} +exports.installedAgentLookupError = installedAgentLookupError; diff --git a/dist/cli/agent_chat.d.ts b/dist/cli/agent_chat.d.ts index 28c60f4bd..a46f87a77 100644 --- a/dist/cli/agent_chat.d.ts +++ b/dist/cli/agent_chat.d.ts @@ -4,6 +4,8 @@ export interface AgentChatArgs { prompt: string; agentInstanceId?: string; tenantId?: string; + chatId?: string; + new?: boolean; timeout?: number; apiToken?: string; apiEndpoint: string; @@ -21,5 +23,6 @@ export declare function buildAgentChatMessagesUrl(apiEndpoint: string, tenantId: export declare function isApiErrorBody(bodyText: string): boolean; export declare function describeRunReason(status: 'failed' | 'needs_input', reason: string | undefined): string; export declare function joinAssistantTexts(messages: AgentChatMessage[]): string | undefined; +export declare function describeAge(ms: number): string; export declare function nextBackoffMs(failedAttempts: number): number; -export declare function handleAgentChat({ manifestPath, prompt, agentInstanceId: agentInstanceIdFlag, tenantId: tenantIdFlag, timeout, apiToken, apiEndpoint, }: ArgumentsCamelCase): Promise; +export declare function handleAgentChat({ manifestPath, prompt, agentInstanceId: agentInstanceIdFlag, tenantId: tenantIdFlag, chatId: chatIdFlag, new: startNewChat, timeout, apiToken, apiEndpoint, }: ArgumentsCamelCase): Promise; diff --git a/dist/cli/agent_chat.js b/dist/cli/agent_chat.js index c681b238e..74543b523 100644 --- a/dist/cli/agent_chat.js +++ b/dist/cli/agent_chat.js @@ -23,16 +23,23 @@ var __importStar = (this && this.__importStar) || function (mod) { return result; }; Object.defineProperty(exports, "__esModule", { value: true }); -exports.handleAgentChat = exports.nextBackoffMs = exports.joinAssistantTexts = exports.describeRunReason = exports.isApiErrorBody = exports.buildAgentChatMessagesUrl = exports.buildAgentRunStatusUrl = exports.buildTriggerAgentUrl = void 0; +exports.handleAgentChat = exports.nextBackoffMs = exports.describeAge = exports.joinAssistantTexts = exports.describeRunReason = exports.isApiErrorBody = exports.buildAgentChatMessagesUrl = exports.buildAgentRunStatusUrl = exports.buildTriggerAgentUrl = void 0; const helpers_1 = require("./helpers"); const helpers_2 = require("./helpers"); -const helpers_3 = require("./helpers"); const config_storage_1 = require("./config_storage"); +const agent_api_1 = require("./agent_api"); +const helpers_3 = require("./helpers"); +const config_storage_2 = require("./config_storage"); +const agent_api_2 = require("./agent_api"); +const agent_api_3 = require("./agent_api"); const path = __importStar(require("path")); const helpers_4 = require("../testing/helpers"); const helpers_5 = require("../testing/helpers"); +const config_storage_3 = require("./config_storage"); const errors_1 = require("./errors"); const DEFAULT_TIMEOUT_SECS = 120; +// A saved chat idle longer than this is not continued unless asked for with --chatId. +const STALE_CHAT_MS = 24 * 60 * 60 * 1000; const POLL_INTERVAL_MS = 2000; const MAX_BACKOFF_MS = 10000; function buildTriggerAgentUrl(apiEndpoint) { @@ -85,16 +92,32 @@ function describeRunReason(status, reason) { } } exports.describeRunReason = describeRunReason; -// Every completed assistant text, oldest first. A run that writes, calls a -// tool, then wraps up reads like the browser transcript, not just the tail. +// Every completed assistant text of the latest turn, oldest first. A run that writes, calls a +// tool, then wraps up reads like the browser transcript. Messages carry no execution id, so the +// turn starts after the last user message. minimal: if that message fell outside the fetched tail, all of it is used. function joinAssistantTexts(messages) { - const texts = messages + const ordered = [...messages].sort((left, right) => left.createdAt < right.createdAt ? -1 : left.createdAt > right.createdAt ? 1 : 0); + const lastUser = ordered.map(message => message.messageType).lastIndexOf('user'); + const texts = ordered + .slice(lastUser + 1) .filter(message => message.messageType === 'assistant' && message.isComplete && message.text) - .sort((left, right) => (left.createdAt < right.createdAt ? -1 : left.createdAt > right.createdAt ? 1 : 0)) .map(message => message.text); return texts.length > 0 ? texts.join('\n\n') : undefined; } exports.joinAssistantTexts = joinAssistantTexts; +function describeAge(ms) { + const minutes = Math.floor(ms / 60000); + if (minutes < 1) { + return 'just now'; + } + const [value, unit] = minutes < 60 + ? [minutes, 'minute'] + : minutes < 60 * 24 + ? [Math.floor(minutes / 60), 'hour'] + : [Math.floor(minutes / (60 * 24)), 'day']; + return `${value} ${unit}${value === 1 ? '' : 's'} ago`; +} +exports.describeAge = describeAge; function nextBackoffMs(failedAttempts) { return Math.min(1000 * 2 ** failedAttempts, MAX_BACKOFF_MS); } @@ -140,17 +163,44 @@ async function readErrorBody(response) { function isTransientStatus(status) { return status === 429 || status >= 500; } -async function handleAgentChat({ manifestPath, prompt, agentInstanceId: agentInstanceIdFlag, tenantId: tenantIdFlag, timeout, apiToken, apiEndpoint, }) { - var _a; +async function handleAgentChat({ manifestPath, prompt, agentInstanceId: agentInstanceIdFlag, tenantId: tenantIdFlag, chatId: chatIdFlag, new: startNewChat, timeout, apiToken, apiEndpoint, }) { const manifestDir = path.dirname(manifestPath); const formattedEndpoint = (0, helpers_3.formatEndpoint)(apiEndpoint); apiToken = (0, helpers_1.assertApiToken)(apiEndpoint, apiToken); const packId = (0, helpers_2.assertPackId)(manifestDir, apiEndpoint); - const agentInstanceId = agentInstanceIdFlag || ((_a = (0, config_storage_1.getAgentInstall)(manifestDir, apiEndpoint)) === null || _a === void 0 ? void 0 : _a.agentInstanceId); - if (!agentInstanceId) { - return (0, helpers_5.printAndExit)('Error: agent chat needs an installed agent instance.\n' + - ' packs agent install pack.ts\n' + - ' Or pass --agentInstanceId.'); + if (startNewChat && chatIdFlag) { + return (0, helpers_5.printAndExit)('Pass --new or --chatId, not both.'); + } + let agentInstanceId = agentInstanceIdFlag; + // An explicit chat id names its own agent on the server, so it needs no install lookup. + if (!agentInstanceId && !chatIdFlag) { + const lookup = await (0, agent_api_3.lookupInstalledAgent)({ apiToken, apiEndpoint, packId }); + if (lookup.status !== 'found') { + return (0, helpers_5.printAndExit)((0, agent_api_2.installedAgentLookupError)(lookup, 'chat')); + } + agentInstanceId = lookup.agent.agentInstanceId; + } + // Continue the last thread for this install unless asked to start over or to use another chat. + let resumeChatId = chatIdFlag; + let resumingSavedChat = false; + let resumeNotice = resumeChatId ? `Continuing chat ${resumeChatId}.` : undefined; + if (!resumeChatId && !startNewChat) { + const saved = (0, config_storage_2.getAgentChat)(manifestDir, apiEndpoint); + if (saved && saved.agentInstanceId === agentInstanceId) { + const idleMs = saved.lastUsedAt ? Date.now() - Date.parse(saved.lastUsedAt) : undefined; + if (idleMs !== undefined && idleMs > STALE_CHAT_MS) { + (0, helpers_4.print)(`Your last chat was used ${describeAge(idleMs)}, so this starts a new one. ` + + `Pass --chatId ${saved.chatId} to continue the old chat.`); + } + else { + resumeChatId = saved.chatId; + resumingSavedChat = true; + resumeNotice = + `Continuing chat ${saved.chatId}` + + (idleMs === undefined ? '' : `, last used ${describeAge(idleMs)}`) + + '. Pass --new to start a new chat.'; + } + } } const headers = { Authorization: `Bearer ${apiToken}`, 'Content-Type': 'application/json' }; const timeoutSecs = timeout !== null && timeout !== void 0 ? timeout : DEFAULT_TIMEOUT_SECS; @@ -159,7 +209,11 @@ async function handleAgentChat({ manifestPath, prompt, agentInstanceId: agentIns const triggerResponse = await fetch(buildTriggerAgentUrl(apiEndpoint), { method: 'POST', headers, - body: JSON.stringify({ input: prompt, agentInstanceId }), + body: JSON.stringify({ + input: prompt, + ...(agentInstanceId ? { agentInstanceId } : {}), + ...(resumeChatId ? { chatId: resumeChatId } : {}), + }), signal: AbortSignal.timeout(30000), }); if (!triggerResponse.ok) { @@ -168,6 +222,14 @@ async function handleAgentChat({ manifestPath, prompt, agentInstanceId: agentIns return (0, helpers_5.printAndExit)('The agent trigger endpoint is not available on this server.\n' + 'It ships with the agent runtime API — upgrade the server or verify in the browser agent directory.'); } + if (triggerResponse.status === 404 && (0, agent_api_1.codaTypeOf)(bodyText) === 'ChatNotFound') { + if (resumingSavedChat) { + (0, config_storage_1.clearAgentChat)(manifestDir, apiEndpoint); + } + return (0, helpers_5.printAndExit)('That chat is gone, or it is not yours or not on this agent.\n' + + (resumingSavedChat ? ' The saved chat was cleared. ' : ' ') + + 'Start a new one with --new.'); + } if (triggerResponse.status === 404) { return (0, helpers_5.printAndExit)('Agent not found or agent triggering is not enabled.\n' + ' Check the agent instance id and that triggering is enabled.'); @@ -184,6 +246,8 @@ async function handleAgentChat({ manifestPath, prompt, agentInstanceId: agentIns return (0, helpers_5.printAndExit)(errors.join('\n')); } const { executionId, chatId } = triggerBody; + // The server names the agent when only a chat id was sent. + agentInstanceId = triggerBody.agentInstanceId; if (triggerBody.packId !== packId) { return (0, helpers_5.printAndExit)(`Agent instance ${agentInstanceId} belongs to pack ${triggerBody.packId}, not pack ${packId}.\n` + ' A run has already been queued on that instance. Check it in the browser agent directory.\n' + @@ -191,6 +255,15 @@ async function handleAgentChat({ manifestPath, prompt, agentInstanceId: agentIns ' Install this pack first, or point --agentInstanceId at its install.'); } const tenantId = tenantIdFlag !== null && tenantIdFlag !== void 0 ? tenantIdFlag : triggerBody.tenantId; + try { + (0, config_storage_3.storeAgentChat)(manifestDir, apiEndpoint, { agentInstanceId, chatId }); + } + catch (err) { + (0, helpers_4.print)(`Note: could not save the chat id, so the next prompt starts a new chat. ${err}`); + } + if (resumeNotice) { + (0, helpers_4.print)(resumeNotice); + } (0, helpers_4.print)(`Run queued for pack ${packId} (execution ${executionId}). Waiting for a reply…`); const deadlineMs = Date.now() + timeoutSecs * 1000; const statusUrl = buildAgentRunStatusUrl(formattedEndpoint, tenantId, agentInstanceId, chatId, executionId); diff --git a/dist/cli/agent_install.js b/dist/cli/agent_install.js index 80dc8000d..46f0be996 100644 --- a/dist/cli/agent_install.js +++ b/dist/cli/agent_install.js @@ -1,37 +1,12 @@ "use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; Object.defineProperty(exports, "__esModule", { value: true }); exports.handleAgentInstall = exports.buildAgentInstallUrl = void 0; const agent_api_1 = require("./agent_api"); const confirm_1 = require("./confirm"); -const path = __importStar(require("path")); const agent_api_2 = require("./agent_api"); const helpers_1 = require("../testing/helpers"); const helpers_2 = require("../testing/helpers"); const agent_api_3 = require("./agent_api"); -const config_storage_1 = require("./config_storage"); function buildAgentInstallUrl(apiEndpoint, packId, version) { return (0, agent_api_1.buildAgentRouteUrl)(apiEndpoint, packId, version, 'agentInstall'); } @@ -111,11 +86,6 @@ async function handleAgentInstall({ manifestPath, version, reinstall, yes, apiTo if (!install) { return (0, helpers_2.printAndExit)('Agent install failed: the server response did not include an agent instance id.'); } - (0, config_storage_1.storeAgentInstall)(path.dirname(manifestPath), apiEndpoint, { - packId, - agentInstanceId: install.agentInstanceId, - ...(install.tenantId ? { tenantId: install.tenantId } : {}), - }); (0, helpers_1.print)(formatInstallResult({ reinstall: reinstall !== null && reinstall !== void 0 ? reinstall : false, alreadyInstalled: install.alreadyInstalled, diff --git a/dist/cli/agent_logs.js b/dist/cli/agent_logs.js index e9198be68..bf521a432 100644 --- a/dist/cli/agent_logs.js +++ b/dist/cli/agent_logs.js @@ -30,12 +30,13 @@ const helpers_2 = require("./helpers"); const helpers_3 = require("./helpers"); const helpers_4 = require("./helpers"); const errors_1 = require("./errors"); -const config_storage_1 = require("./config_storage"); +const agent_api_1 = require("./agent_api"); const coda_1 = require("../helpers/external-api/coda"); +const agent_api_2 = require("./agent_api"); const path = __importStar(require("path")); const helpers_5 = require("../testing/helpers"); const helpers_6 = require("../testing/helpers"); -const agent_api_1 = require("./agent_api"); +const agent_api_3 = require("./agent_api"); const errors_2 = require("./errors"); const TAIL_POLL_INTERVAL_MS = 5000; const TAIL_MAX_POLLS = 60; @@ -92,16 +93,26 @@ async function handleAgentLogs({ manifestPath, tenant, instance, session, limit, const formattedEndpoint = (0, helpers_4.formatEndpoint)(apiEndpoint); apiToken = (0, helpers_1.assertApiToken)(apiEndpoint, apiToken); const packId = (0, helpers_2.assertPackId)(manifestDir, apiEndpoint); - const saved = tenant && instance ? undefined : (0, config_storage_1.getAgentInstall)(manifestDir, apiEndpoint); - const tenantId = tenant || (saved === null || saved === void 0 ? void 0 : saved.tenantId); - const instanceId = instance || (saved === null || saved === void 0 ? void 0 : saved.agentInstanceId); + if (Boolean(tenant) !== Boolean(instance)) { + return missingIdentityError(); + } + let tenantId = tenant; + let instanceId = instance; + if (!tenantId && !instanceId) { + const lookup = await (0, agent_api_2.lookupInstalledAgent)({ apiToken, apiEndpoint, packId }); + if (lookup.status !== 'found') { + return (0, helpers_6.printAndExit)((0, agent_api_1.installedAgentLookupError)(lookup, 'logs')); + } + tenantId = lookup.agent.tenantId; + instanceId = lookup.agent.agentInstanceId; + } if (!tenantId || !instanceId) { return missingIdentityError(); } const client = (0, helpers_3.createCodaClient)(apiToken, formattedEndpoint); let resolvedVersion; try { - resolvedVersion = await (0, agent_api_1.resolveAgentVersion)(client, packId); + resolvedVersion = await (0, agent_api_3.resolveAgentVersion)(client, packId); } catch (err) { if ((0, coda_1.isResponseError)(err)) { diff --git a/dist/cli/config_storage.d.ts b/dist/cli/config_storage.d.ts index 338db1b8c..e5fc4f259 100644 --- a/dist/cli/config_storage.d.ts +++ b/dist/cli/config_storage.d.ts @@ -3,7 +3,6 @@ export declare const DEFAULT_API_ENDPOINT = "https://coda.io"; export declare const DEFAULT_TIMER_STRATEGY = TimerShimStrategy.None; export declare const DEFAULT_GIT_TAG = false; export declare const PACK_ID_FILE_NAME = ".coda-pack.json"; -export declare const AGENT_INSTALL_FILE_NAME = ".coda-agent.json"; export interface ApiKeyFile { apiKey: string; environmentApiKeys?: { @@ -27,6 +26,11 @@ export interface PackOptions { /** @deprecated Kept for reading legacy config files. */ [DeprecatedPackOptionKey.enableGitTags]?: boolean; } +export interface AgentChatState { + agentInstanceId: string; + chatId: string; + lastUsedAt?: string; +} export interface PackIdFile { packId: number; options?: PackOptions; @@ -34,16 +38,12 @@ export interface PackIdFile { [host: string]: number; }; } -export interface StoredAgentInstall { - packId: number; - agentInstanceId: string; - tenantId?: string; -} export declare function getApiKey(codaApiEndpoint: string): string | undefined; export declare function storeCodaApiKey(apiKey: string, projectDir: string | undefined, codaApiEndpoint: string): void; export declare function storePackId(manifestDir: string, packId: number, codaApiEndpoint: string): void; export declare function getPackId(manifestDir: string, codaApiEndpoint: string): number | undefined; -export declare function storeAgentInstall(manifestDir: string, codaApiEndpoint: string, install: StoredAgentInstall): void; -export declare function getAgentInstall(manifestDir: string, codaApiEndpoint: string): StoredAgentInstall | undefined; export declare function storePackOptions(manifestDir: string, options: PackOptions): void; export declare function getPackOptions(manifestDir: string): PackOptions | undefined; +export declare function getAgentChat(manifestDir: string, codaApiEndpoint: string): AgentChatState | undefined; +export declare function storeAgentChat(manifestDir: string, codaApiEndpoint: string, chat: Omit): void; +export declare function clearAgentChat(manifestDir: string, codaApiEndpoint: string): void; diff --git a/dist/cli/config_storage.js b/dist/cli/config_storage.js index 9c3aae83b..462e23a96 100644 --- a/dist/cli/config_storage.js +++ b/dist/cli/config_storage.js @@ -26,8 +26,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); -exports.getPackOptions = exports.storePackOptions = exports.getAgentInstall = exports.storeAgentInstall = exports.getPackId = exports.storePackId = exports.storeCodaApiKey = exports.getApiKey = exports.DeprecatedPackOptionKey = exports.PackOptionKey = exports.AGENT_INSTALL_FILE_NAME = exports.PACK_ID_FILE_NAME = exports.DEFAULT_GIT_TAG = exports.DEFAULT_TIMER_STRATEGY = exports.DEFAULT_API_ENDPOINT = void 0; +exports.clearAgentChat = exports.storeAgentChat = exports.getAgentChat = exports.getPackOptions = exports.storePackOptions = exports.getPackId = exports.storePackId = exports.storeCodaApiKey = exports.getApiKey = exports.DeprecatedPackOptionKey = exports.PackOptionKey = exports.PACK_ID_FILE_NAME = exports.DEFAULT_GIT_TAG = exports.DEFAULT_TIMER_STRATEGY = exports.DEFAULT_API_ENDPOINT = void 0; const compile_1 = require("../testing/compile"); +const os = __importStar(require("os")); const path = __importStar(require("path")); const helpers_1 = require("../testing/helpers"); const url_parse_1 = __importDefault(require("url-parse")); @@ -37,7 +38,7 @@ exports.DEFAULT_TIMER_STRATEGY = compile_1.TimerShimStrategy.None; exports.DEFAULT_GIT_TAG = false; const API_KEY_FILE_NAME = '.coda.json'; exports.PACK_ID_FILE_NAME = '.coda-pack.json'; -exports.AGENT_INSTALL_FILE_NAME = '.coda-agent.json'; +const AGENT_CHATS_FILE_NAME = '.coda-agent-chats.json'; var PackOptionKey; (function (PackOptionKey) { PackOptionKey["timerStrategy"] = "timerStrategy"; @@ -122,39 +123,6 @@ function getPackId(manifestDir, codaApiEndpoint) { } } exports.getPackId = getPackId; -function storeAgentInstall(manifestDir, codaApiEndpoint, install) { - const fileContents = readAgentInstallFile(manifestDir) || {}; - if (isDefaultApiEndpoint(codaApiEndpoint)) { - fileContents.agentInstall = install; - } - else { - const { host } = (0, url_parse_1.default)(codaApiEndpoint); - fileContents.environmentAgentInstalls = fileContents.environmentAgentInstalls || {}; - fileContents.environmentAgentInstalls[host] = install; - } - writeAgentInstallFile(manifestDir, fileContents); -} -exports.storeAgentInstall = storeAgentInstall; -// Returns the install only when it belongs to the pack id stored for this directory -// and endpoint. A later `create` in the same directory must not reuse a stale instance. -function getAgentInstall(manifestDir, codaApiEndpoint) { - var _a; - const fileContents = readAgentInstallFile(manifestDir); - if (!fileContents) { - return; - } - const install = isDefaultApiEndpoint(codaApiEndpoint) - ? fileContents.agentInstall - : (_a = fileContents.environmentAgentInstalls) === null || _a === void 0 ? void 0 : _a[(0, url_parse_1.default)(codaApiEndpoint).host]; - if (!(install === null || install === void 0 ? void 0 : install.agentInstanceId)) { - return; - } - if (getPackId(manifestDir, codaApiEndpoint) !== install.packId) { - return; - } - return install; -} -exports.getAgentInstall = getAgentInstall; // Merges new options with existing ones, if any. function storePackOptions(manifestDir, options) { const fileContents = readPackIdFile(manifestDir) || { packId: -1 }; @@ -167,6 +135,32 @@ function getPackOptions(manifestDir) { return fileContents === null || fileContents === void 0 ? void 0 : fileContents.options; } exports.getPackOptions = getPackOptions; +// Chat ids are per-user state, so they live in the home directory. .coda-pack.json is committed with the pack. +function agentChatsFile() { + return path.join(os.homedir(), AGENT_CHATS_FILE_NAME); +} +function agentChatKey(manifestDir, codaApiEndpoint) { + return `${(0, url_parse_1.default)(codaApiEndpoint).host}|${path.resolve(manifestDir)}`; +} +function readAgentChats() { + return (0, helpers_1.readJSONFile)(agentChatsFile()) || {}; +} +function getAgentChat(manifestDir, codaApiEndpoint) { + return readAgentChats()[agentChatKey(manifestDir, codaApiEndpoint)]; +} +exports.getAgentChat = getAgentChat; +function storeAgentChat(manifestDir, codaApiEndpoint, chat) { + const entry = { ...chat, lastUsedAt: new Date().toISOString() }; + (0, helpers_2.writeJSONFile)(agentChatsFile(), { ...readAgentChats(), [agentChatKey(manifestDir, codaApiEndpoint)]: entry }, 0o600); +} +exports.storeAgentChat = storeAgentChat; +function clearAgentChat(manifestDir, codaApiEndpoint) { + const { [agentChatKey(manifestDir, codaApiEndpoint)]: removed, ...rest } = readAgentChats(); + if (removed) { + (0, helpers_2.writeJSONFile)(agentChatsFile(), rest, 0o600); + } +} +exports.clearAgentChat = clearAgentChat; function readPackIdFile(manifestDir) { const filename = path.join(manifestDir, exports.PACK_ID_FILE_NAME); return (0, helpers_1.readJSONFile)(filename); @@ -175,9 +169,3 @@ function writePacksFile(manifestDir, fileContents) { const filename = path.join(manifestDir, exports.PACK_ID_FILE_NAME); (0, helpers_2.writeJSONFile)(filename, fileContents); } -function readAgentInstallFile(manifestDir) { - return (0, helpers_1.readJSONFile)(path.join(manifestDir, exports.AGENT_INSTALL_FILE_NAME)); -} -function writeAgentInstallFile(manifestDir, fileContents) { - (0, helpers_2.writeJSONFile)(path.join(manifestDir, exports.AGENT_INSTALL_FILE_NAME), fileContents); -} diff --git a/dist/cli/index.d.ts b/dist/cli/index.d.ts index 7f7f0c73a..070198ffe 100644 --- a/dist/cli/index.d.ts +++ b/dist/cli/index.d.ts @@ -1,3 +1,5 @@ #!/usr/bin/env node +import type { Argv } from 'yargs'; import yargs from 'yargs'; +export declare function buildAgentInstallCommand(argv: Argv): Argv; export declare const commands: yargs.CommandModule[]; diff --git a/dist/cli/index.js b/dist/cli/index.js index 7e5f8f118..40afaa655 100755 --- a/dist/cli/index.js +++ b/dist/cli/index.js @@ -4,7 +4,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); -exports.commands = void 0; +exports.commands = exports.buildAgentInstallCommand = void 0; const config_storage_1 = require("./config_storage"); const config_storage_2 = require("./config_storage"); const execution_1 = require("../testing/execution"); @@ -74,6 +74,7 @@ const CommandExamples = { whoami: [['$0 whoami', 'Print the account and token currently registered.']], agent: [ ['$0 agent chat pack.ts "what can you do?"', 'Run your installed agent and print its reply.'], + ['$0 agent chat pack.ts --new "start over"', 'Start a new chat instead of continuing the last one.'], ['$0 agent install pack.ts', 'Install the latest uploaded agent version to your account.'], ['$0 agent logs pack.ts', 'Show recent logs for the installed agent.'], ], @@ -104,6 +105,24 @@ const CommandExamples = { ['$0 setOption pack.ts apiEndpoint https://my-company.coda.io', 'Pin a single-tenant API endpoint.'], ], }; +function buildAgentInstallCommand(argv) { + // `--version` is the pack version. yargs treats that name as its own version flag unless this runs first. + return argv.version(false).options({ + version: { + string: true, + desc: 'Agent version to install. Defaults to the latest upload.', + }, + reinstall: { + boolean: true, + default: false, + desc: 'Rebind even if already installed. Needed after changing tools or triggers.', + }, + yes: YesArg, + apiToken: ApiTokenArg, + apiEndpoint: ApiEndpointArg, + }); +} +exports.buildAgentInstallCommand = buildAgentInstallCommand; function withExamples(argv, examples) { for (const [command, description] of examples) { argv.example(command, description); @@ -237,12 +256,22 @@ exports.commands = [ builder: { agentInstanceId: { string: true, - desc: 'Installed agent instance to run. Defaults to the instance saved by packs agent install.', + desc: "Installed agent instance to run. Defaults to this pack's install for the caller.", }, tenantId: { string: true, desc: 'Brain tenant id for the agent install. Defaults to the trigger response.', }, + chatId: { + string: true, + conflicts: 'new', + desc: 'Continue this chat instead of the last one. Its agent runs unless --agentInstanceId is set.', + }, + new: { + boolean: true, + conflicts: 'chatId', + desc: 'Start a new chat instead of continuing the last one.', + }, timeout: { number: true, default: 120, @@ -256,20 +285,7 @@ exports.commands = [ .command({ command: 'install ', describe: 'Install an uploaded agent version to your account', - builder: { - version: { - string: true, - desc: 'Agent version to install. Defaults to the latest upload.', - }, - reinstall: { - boolean: true, - default: false, - desc: 'Rebind even if already installed. Needed after changing tools or triggers.', - }, - yes: YesArg, - apiToken: ApiTokenArg, - apiEndpoint: ApiEndpointArg, - }, + builder: buildAgentInstallCommand, handler: agent_install_1.handleAgentInstall, }) .command({ @@ -278,11 +294,11 @@ exports.commands = [ builder: { tenant: { string: true, - desc: 'Tenant id owning the agent instance. Defaults to the install saved by packs agent install.', + desc: "Tenant id owning the agent instance. Defaults to the caller's tenant for this pack.", }, instance: { string: true, - desc: 'Agent instance id. Defaults to the instance saved by packs agent install.', + desc: "Agent instance id. Defaults to this pack's install for the caller.", }, session: { string: true, diff --git a/dist/cli/init.js b/dist/cli/init.js index f4164efd5..7f6235bed 100644 --- a/dist/cli/init.js +++ b/dist/cli/init.js @@ -37,7 +37,6 @@ const helpers_3 = require("./helpers"); const PacksExamplesDirectory = 'node_modules/@codahq/packs-examples'; const GitIgnore = `.coda.json .coda-credentials.json -.coda-agent.json `; function updateMoldSourceMap() { // unfortuanately Windows has no grep. diff --git a/dist/compiled_types.d.ts b/dist/compiled_types.d.ts index 3da400a33..3f478483a 100644 --- a/dist/compiled_types.d.ts +++ b/dist/compiled_types.d.ts @@ -88,9 +88,30 @@ export interface AuthenticationMetadataTypeMap { [AuthenticationType.GoogleServiceAccount]: AuthenticationToMetadata; [AuthenticationType.EntraCertificate]: AuthenticationToMetadata; } +/** + * Resource descriptor carried in versioned Pack metadata. + * @hidden + */ +export interface PackResource { + key: string; + mimeType: 'text/html;profile=mcp-app'; +} +/** + * Resource body submitted separately from metadata. + * @hidden + */ +export interface PackResourceArtifact { + resourceKey: string; + content: string; +} /** @hidden */ export type PackVersionMetadata = Omit & { formulas: PackFormulaMetadata[]; + /** + * Shared resources for top-level formula UIs. + * @hidden + */ + resources?: PackResource[]; formats: PackFormatMetadata[]; syncTables: PackSyncTable[]; defaultAuthentication?: AuthenticationMetadata; @@ -115,7 +136,7 @@ export type ExternalPackFormatMetadata = PackFormatMetadata; export type ExternalSyncTable = PackSyncTable; /** @hidden */ export type ExternalSkill = SkillMetadata; -type BasePackVersionMetadata = Omit; +type BasePackVersionMetadata = Omit; /** @hidden */ export interface ExternalPackVersionMetadata extends BasePackVersionMetadata { authentication: { @@ -147,6 +168,11 @@ export type ExternalPackMetadata = ExternalPackVersionMetadata & Pick, sdkVersion: string | undefined, { warningMode }?: { warningMode?: boolean; }): Promise; diff --git a/dist/testing/upload_validation.js b/dist/testing/upload_validation.js index 9ff8090fe..24f4288fe 100644 --- a/dist/testing/upload_validation.js +++ b/dist/testing/upload_validation.js @@ -26,7 +26,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); -exports.zodErrorDetailToValidationError = exports.findDuplicateTools = exports.normalizeTool = exports._hasCycle = exports.validateParents = exports.validateCrawlHierarchy = exports.validateSyncTableSchema = exports.validateVariousAuthenticationMetadata = exports.validatePackVersionMetadata = exports.PackMetadataValidationError = exports.Limits = exports.PACKS_VALID_COLUMN_FORMAT_MATCHER_REGEX = void 0; +exports.zodErrorDetailToValidationError = exports.findDuplicateTools = exports.normalizeTool = exports._hasCycle = exports.validateParents = exports.validateCrawlHierarchy = exports.validateSyncTableSchema = exports.validateVariousAuthenticationMetadata = exports.validatePackVersionMetadata = exports.validatePackResourceArtifacts = exports.PackMetadataValidationError = exports.Limits = exports.PACKS_VALID_COLUMN_FORMAT_MATCHER_REGEX = void 0; const api_types_1 = require("../api_types"); const schema_1 = require("../schema"); const types_1 = require("../types"); @@ -95,6 +95,7 @@ const schema_23 = require("../schema"); const schema_24 = require("../schema"); const schema_25 = require("../schema"); const migration_1 = require("../helpers/migration"); +const parse5_1 = require("parse5"); const semver_1 = __importDefault(require("semver")); const schema_26 = require("../schema"); const rrule_validation_1 = require("./rrule_validation"); @@ -112,8 +113,9 @@ const numberChar = String.raw `\p{N}`; const wordChar = String.raw `${letterChar}${numberChar}_`; const regexLetterChar = String.raw `[${letterChar}]`; const regexWordChar = String.raw `[${wordChar}]`; -const regexFormulaNameStr = String.raw `^${regexLetterChar}(?:${regexWordChar}+)?$`; -const regexFormulaName = new RegExp(regexFormulaNameStr, 'u'); +const regexBuildingBlockNameStr = String.raw `^${regexLetterChar}(?:${regexWordChar}+)?$`; +const regexFormulaName = new RegExp(regexBuildingBlockNameStr, 'u'); +const regexResourceName = new RegExp(regexBuildingBlockNameStr, 'u'); // This is currently the same as the tokenizer's restrictions except stricter // because we don't allow leading underscores. const regexParameterName = regexFormulaName; @@ -141,6 +143,7 @@ exports.Limits = { PermissionsBatchSize: 5000, PromptLength: 20000, RRuleStringLength: 512, + RoutineNameLength: 80, SuggestedPromptText: 500, UpdateBatchSize: 1000, FilterableProperties: 5, @@ -157,6 +160,147 @@ class PackMetadataValidationError extends Error { } } exports.PackMetadataValidationError = PackMetadataValidationError; +const resourceKeySchema = z + .string() + .max(exports.Limits.BuildingBlockName) + .regex(regexResourceName, 'Resource keys must start with a letter and contain only letters, numbers, and underscores.'); +const resourceDescriptorSchema = z.strictObject({ + key: resourceKeySchema, + mimeType: z.literal('text/html;profile=mcp-app'), +}); +const resourceListSchema = z.array(resourceDescriptorSchema).optional(); +const topLevelFormulaUiSchema = z.object({ ui: z.object({ resourceKey: resourceKeySchema }).optional() }); +function validateResourceReferences(data, context) { + const resourceKeys = new Set(); + const normalizedResourceKeys = new Set(); + (data.resources || []).forEach((resource, i) => { + const normalizedKey = resource.key.toUpperCase(); + if (normalizedResourceKeys.has(normalizedKey)) { + context.addIssue({ + code: 'custom', + path: ['resources', i, 'key'], + message: `Resource keys must be unique. Found duplicate key "${resource.key}".`, + }); + } + normalizedResourceKeys.add(normalizedKey); + resourceKeys.add(resource.key); + }); + (data.formulas || []).forEach((formula, i) => { + if (formula.ui !== undefined && !resourceKeys.has(formula.ui.resourceKey)) { + context.addIssue({ + code: 'custom', + path: ['formulas', i, 'ui', 'resourceKey'], + message: `Formula references undeclared resource "${formula.ui.resourceKey}".`, + }); + } + }); +} +const resourceMetadataSchema = z.union([ + z + .object({ + resources: resourceListSchema, + formulas: z.array(topLevelFormulaUiSchema).optional().default([]), + }) + .superRefine(validateResourceReferences), + z + .object({ + resources: z.array(z.never()).optional(), + formulas: z.record(z.string(), z.unknown()).optional(), + }) + .transform(metadata => ({ ...metadata, formulas: [] })), +]); +const resourceArtifactsSchema = z.array(z.strictObject({ resourceKey: z.string(), content: z.string() })); +/** @hidden */ +function validatePackResourceArtifacts(metadata, artifacts, options) { + var _a; + const validatedMetadata = resourceMetadataSchema.safeParse(metadata); + if (!validatedMetadata.success) { + throw new PackMetadataValidationError('Pack App resource metadata failed validation.', validatedMetadata.error, validatedMetadata.error.issues.flatMap(issue => zodErrorDetailToValidationError(issue))); + } + const maxResourceBytes = options === null || options === void 0 ? void 0 : options.maxResourceBytes; + if (!Number.isSafeInteger(maxResourceBytes) || maxResourceBytes < 0) { + throw new PackMetadataValidationError('Pack metadata failed validation.', undefined, [ + { path: 'maxResourceBytes', message: 'maxResourceBytes must be a nonnegative safe integer.' }, + ]); + } + const maxResourceCount = options === null || options === void 0 ? void 0 : options.maxResourceCount; + if (!Number.isSafeInteger(maxResourceCount) || maxResourceCount < 0) { + throw new PackMetadataValidationError('Pack metadata failed validation.', undefined, [ + { path: 'maxResourceCount', message: 'maxResourceCount must be a nonnegative safe integer.' }, + ]); + } + if ((validatedMetadata.data.resources || []).length > maxResourceCount) { + throw new PackMetadataValidationError('Pack metadata failed validation.', undefined, [ + { path: 'resources', message: `Pack Apps may declare at most ${maxResourceCount} resources.` }, + ]); + } + const validatedArtifacts = resourceArtifactsSchema.safeParse(artifacts); + if (!validatedArtifacts.success) { + throw new PackMetadataValidationError('Pack App artifacts failed validation.', validatedArtifacts.error, validatedArtifacts.error.issues.flatMap(issue => zodErrorDetailToValidationError(issue, ['resourceArtifacts']))); + } + const resourceKeys = new Set((validatedMetadata.data.resources || []).map(resource => resource.key)); + const seen = new Set(); + function reject(message) { + throw new PackMetadataValidationError('Pack metadata failed validation.', undefined, [ + { path: 'resourceArtifacts', message }, + ]); + } + for (const [i, artifact] of validatedArtifacts.data.entries()) { + const { resourceKey } = artifact; + if (!resourceKeys.has(resourceKey)) { + reject(`Pack App artifact resource key "${resourceKey}" is not declared in metadata.resources.`); + } + if (seen.has(resourceKey)) { + reject(`Pack App artifact resource keys must be unique. Found duplicate key "${resourceKey}".`); + } + seen.add(resourceKey); + const encoded = Buffer.from(artifact.content, 'utf8'); + if (encoded.byteLength > maxResourceBytes) { + reject('Pack App artifact exceeds size limit'); + } + if (encoded.toString('utf8') !== artifact.content) { + reject(`Pack App artifact "${resourceKey}" must contain valid UTF-8 text.`); + } + try { + validatePackResourceHtml(artifact.content); + } + catch (error) { + if (!(error instanceof PackMetadataValidationError)) { + throw error; + } + throw new PackMetadataValidationError('Pack App artifacts failed validation.', error, (_a = error.validationErrors) === null || _a === void 0 ? void 0 : _a.map(detail => ({ ...detail, path: `resourceArtifacts[${i}].${detail.path}` }))); + } + } + for (const key of resourceKeys) { + if (!seen.has(key)) { + reject(`Missing Pack App artifact for resource key "${key}".`); + } + } + return validatedArtifacts.data; +} +exports.validatePackResourceArtifacts = validatePackResourceArtifacts; +/** + * Reject parser diagnostics without rewriting executable HTML. + */ +function validatePackResourceHtml(content) { + const validated = z.string().safeParse(content); + if (!validated.success) { + throw new PackMetadataValidationError('Pack resource HTML failed validation', validated.error, validated.error.issues.flatMap(issue => zodErrorDetailToValidationError(issue, ['content']))); + } + // parse5 diagnostics check partial HTML conformance, not execution safety. + (0, parse5_1.parse)(validated.data, { + scriptingEnabled: true, + onParseError: diagnostic => { + throw new PackMetadataValidationError('Pack resource HTML failed validation', undefined, [ + { + path: 'content', + message: `Invalid HTML: ${diagnostic.code} at line ${diagnostic.startLine}, column ${diagnostic.startCol}.`, + }, + ]); + }, + }); + return validated.data; +} async function validatePackVersionMetadata(metadata, sdkVersion, { warningMode } = {}) { const { legacyPackMetadataSchema } = buildMetadataSchema({ sdkVersion, warningMode }); let combinedSchema = legacyPackMetadataSchema; @@ -2016,33 +2160,13 @@ ${endpointKey ? 'endpointKey is set' : `requiresEndpointUrl is ${requiresEndpoin scheduleTriggerSchema, whileWritingTriggerSchema, ]); - const defaultTriggersSchema = z - .array(defaultTriggerSchema) - .superRefine((triggers, context) => { - const seen = new Set(); - let eventTriggers = 0; - triggers.forEach((trigger, index) => { - // An agent listens to as many events as the server stores; the other kinds are one apiece. - if (trigger.kind === types_6.DefaultTriggerKind.Event) { - eventTriggers += 1; - if (eventTriggers > exports.Limits.MaxDefaultEventTriggers) { - context.addIssue({ - code: 'custom', - path: [index], - message: `An agent can only declare ${exports.Limits.MaxDefaultEventTriggers} event default triggers.`, - }); - } - return; - } - if (seen.has(trigger.kind)) { - context.addIssue({ - code: 'custom', - path: [index], - message: `An agent can only declare one ${trigger.kind} default trigger.`, - }); - } - seen.add(trigger.kind); - }); + const defaultTriggersSchema = z.array(defaultTriggerSchema); + const routineSchema = zodCompleteStrictObject({ + name: z.string().max(exports.Limits.RoutineNameLength).optional(), + instructions: z.string().max(exports.Limits.PromptLength).optional(), + trigger: defaultTriggerSchema, + }).refine(routine => { var _a, _b; return Boolean(((_a = routine.name) === null || _a === void 0 ? void 0 : _a.trim()) || ((_b = routine.instructions) === null || _b === void 0 ? void 0 : _b.trim())); }, { + message: 'A routine needs a name or instructions containing non-whitespace text.', }); const skillEntrypointConfigSchema = zodCompleteStrictObject({ skillName: z.string(), @@ -2094,6 +2218,7 @@ ${endpointKey ? 'endpointKey is set' : `requiresEndpointUrl is ${requiresEndpoin displayName: z.string().min(1).max(exports.Limits.BuildingBlockName), prompt: z.string().min(1).max(exports.Limits.SuggestedPromptText), }); + const topLevelFormulaMetadataSchema = formulaMetadataSchema.and(topLevelFormulaUiSchema); // Make sure to call the refiners on this after removing legacyPackMetadataSchema. // (Zod doesn't let you call .extends() after you've called .refine(), so we're only refining the top-level // schema we actually use.) @@ -2118,8 +2243,9 @@ ${endpointKey ? 'endpointKey is set' : `requiresEndpointUrl is ${requiresEndpoin }), systemConnectionAuthentication: z.union(zodUnionInput(systemAuthenticationValidators)).optional(), adminAuthentications: z.array(adminAuthenticationValidator).optional(), + resources: resourceListSchema, formulas: z - .array(formulaMetadataSchema) + .array(topLevelFormulaMetadataSchema) .max(exports.Limits.BuildingBlockCountPerType) .optional() .default([]) @@ -2207,6 +2333,7 @@ ${endpointKey ? 'endpointKey is set' : `requiresEndpointUrl is ${requiresEndpoin benchInitializationSkill: chatSkillSchema.optional(), agent: agentSchema.optional(), defaultTriggers: defaultTriggersSchema.optional(), + defaultRoutines: z.array(routineSchema).optional(), mcpServers: z .array(mcpServerSchema) .max(1) @@ -2265,6 +2392,7 @@ ${endpointKey ? 'endpointKey is set' : `requiresEndpointUrl is ${requiresEndpoin } function validateFormulas(schema) { return schema + .superRefine(validateResourceReferences) .refine((data) => { if (data.formulas && data.formulas.length > 0) { return data.formulaNamespace; @@ -2794,8 +2922,42 @@ ${endpointKey ? 'endpointKey is set' : `requiresEndpointUrl is ${requiresEndpoin }); }) .superRefine((data, context) => { + var _a, _b, _c; + const metadata = data; + const triggers = [ + ...((_a = metadata.defaultTriggers) !== null && _a !== void 0 ? _a : []).map((trigger, index) => ({ trigger, path: ['defaultTriggers', index] })), + ...((_b = metadata.defaultRoutines) !== null && _b !== void 0 ? _b : []).map((routine, index) => ({ + trigger: routine.trigger, + path: ['defaultRoutines', index, 'trigger'], + })), + ]; + const seen = new Set(); + let eventTriggers = 0; + for (const { trigger, path } of triggers) { + if (trigger.kind === types_6.DefaultTriggerKind.Event) { + eventTriggers += 1; + if (eventTriggers > exports.Limits.MaxDefaultEventTriggers) { + context.addIssue({ + code: 'custom', + path, + message: `An agent can only declare ${exports.Limits.MaxDefaultEventTriggers} event default triggers.`, + }); + } + } + else if (seen.has(trigger.kind)) { + context.addIssue({ + code: 'custom', + path, + message: `An agent can only declare one ${trigger.kind} default trigger.`, + }); + } + seen.add(trigger.kind); + } // The builder can't add these to an agent, but a hand-written manifest can. - if (!data.agent) { + if (!metadata.agent) { + if ((_c = metadata.defaultRoutines) === null || _c === void 0 ? void 0 : _c.length) { + context.addIssue({ code: 'custom', path: ['defaultRoutines'], message: 'Only an agent can define routines.' }); + } if ((data.defaultTriggers || []).length) { context.addIssue({ code: 'custom', diff --git a/dist/types.d.ts b/dist/types.d.ts index c6f05a76c..d0f60fd40 100644 --- a/dist/types.d.ts +++ b/dist/types.d.ts @@ -2071,6 +2071,21 @@ export type EventTriggerDefinition = MailEventTriggerDefinition | NotetakerEvent * @hidden */ export type DefaultTriggerDefinition = EventTriggerDefinition | ScheduleTriggerDefinition | WhileWritingTriggerDefinition; +/** + * A named action or instruction that runs when its trigger fires. + * At least one of `name` or `instructions` must contain non-whitespace text. + * + * @internal + * @hidden + */ +export interface AgentRoutineDefinition { + /** The routine's label in the agent builder. Max 80 characters. */ + name?: string; + /** Instructions added to the agent's base instructions for this routine's run. Max 20,000 characters. */ + instructions?: string; + /** The single trigger this routine runs on. Shares limits with plain default triggers. */ + trigger: DefaultTriggerDefinition; +} /** * The definition of the contents of a Pack at a specific version. This is the * heart of the implementation of a Pack. @@ -2184,6 +2199,13 @@ export interface PackVersionDefinition { * @hidden */ defaultTriggers?: DefaultTriggerDefinition[]; + /** + * The routines this agent ships with. Authored via `sdk.newAgent().addDefaultRoutine()`. + * + * @internal + * @hidden + */ + defaultRoutines?: AgentRoutineDefinition[]; } /** * @deprecated use `#PackVersionDefinition` diff --git a/docs/guides/blocks/sync-tables/indexing/schema.md b/docs/guides/blocks/sync-tables/indexing/schema.md index 253ba4b21..ab2debeff 100644 --- a/docs/guides/blocks/sync-tables/indexing/schema.md +++ b/docs/guides/blocks/sync-tables/indexing/schema.md @@ -7,60 +7,25 @@ description: Information about the schema metadata needed for indexing. A sync table's schema defines the resulting columns and their types, along with other metadata required by the sync engine. To index that content in the knowledge layer, additional metadata must be provided in the schema. -At a minimum, the schema must specify: +At a minimum, the schema must specify `index.properties`, which is the list of properties containing long-form text to index for search. -- The title property, via `titleProperty` -- The link property, via `linkProperty` -- The properties to split into chunks, via `index.properties` - -Additional fields allow for better index tuning. Most schemas should set: - -- The properties to replicate in each chunk, via `index.contextProperties` -- The properties to use to filter results, via `index.filterableProperties` +Additional fields allow for better index tuning and presentation. Most schemas should set `index.contextProperties`, `index.filterableProperties`, and `linkProperty`. See the sections below for more information. +!!! info "Set `indexing.default` on dynamic sync tables" -## Title property - -Set `titleProperty` to the property that contains the title of the record. This property is indexed and displayed to the user when the LLM provides a citation. - - - -Often, the same property is used for both `displayProperty` and `titleProperty`. However, these may differ for records with both a short and a long identifier, with the former preferred for `displayProperty` and the latter preferred for `titleProperty`. - -```{.ts hl_lines="9"} -const ProductSchema = sdk.makeObjectSchema({ - properties: { - id: { type: sdk.ValueType.String }, - sku: { type: sdk.ValueType.String }, - name: { type: sdk.ValueType.String }, - }, - idProperty: "id", - displayProperty: "sku", - titleProperty: "name", -}); -``` - - -## Link property - -Set `linkProperty` to the property that contains the user-visible link to the record. This link will be used by the LLM when creating citations to the record. + In addition to the schema fields above, for [dynamic sync tables][dynamic_sync_tables] you also need to set [`indexing.default`][indexing] to `Include` on the table definition. - - -The property should contain a deep link to the record in the source application, which a user can open in their browser. - -```{.ts hl_lines="7"} -const ProductSchema = sdk.makeObjectSchema({ - properties: { - // ... - link: { type: sdk.ValueType.String, codaType: sdk.ValueHintType.Url }, - }, - // ... - linkProperty: "link", -}); -``` + ```{.ts hl_lines="4-6"} + pack.addDynamicSyncTable({ + name: "Tasks", + // ... + indexing: { + default: sdk.DataIndexing.Include, + }, + }); + ``` ## Properties to index @@ -192,6 +157,32 @@ const ProductSchema = sdk.makeObjectSchema({ }); ``` + +## Citations + +Set `linkProperty` to the property that contains a deep link to the record in the source application. When this property is set, :superhuman-go: Go shows a citation the user can open in their browser. + +{{screenshot("images/sync_table_indexing_citation.png", "A screenshot of a citation in Superhuman Go")}} + +Set `titleProperty` to customize how that citation is displayed. If you don't set it, the schema's `displayProperty` is shown in the citation. A separate title is useful when you want a short identifier for the row in :superhuman-docs: Docs and a longer name in the citation. + + +```{.ts hl_lines="10-11"} +const ProductSchema = sdk.makeObjectSchema({ + properties: { + id: { type: sdk.ValueType.String }, + sku: { type: sdk.ValueType.String }, + link: { type: sdk.ValueType.String, codaType: sdk.ValueHintType.Url }, + name: { type: sdk.ValueType.String }, + }, + idProperty: "id", + displayProperty: "sku", + linkProperty: "link", + titleProperty: "name", +}); +``` + + ## Additional semantic properties To help with filtering and ranking, set the following fields in your schema, if possible. @@ -285,5 +276,6 @@ If you are upgrading an existing Pack, you'll need to denormalize any data you w [people]: ../../../basics/data-types.md#people [schemas]: ../../../advanced/schemas.md [dynamic_sync_tables]: ../dynamic.md +[indexing]: ../../../../reference/sdk/core/interfaces/DynamicSyncTableOptions.md#indexing [contact_resolution_tool]: ../../skills.md#contacts [person]: ../../../../reference/sdk/core/enumerations/ValueHintType.md#person diff --git a/docs/images/sync_table_indexing_citation.png b/docs/images/sync_table_indexing_citation.png new file mode 100644 index 0000000000000000000000000000000000000000..6481d7b8a313d2e94a23f47e19b344403bc68611 GIT binary patch literal 57990 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 literal 0 HcmV?d00001 diff --git a/docs/images/sync_table_indexing_citation_2x.png b/docs/images/sync_table_indexing_citation_2x.png new file mode 100644 index 0000000000000000000000000000000000000000..bf00cf4cc501297cba883bf05b9672c119770e50 GIT binary patch literal 106792 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 literal 0 HcmV?d00001 diff --git a/docs/reference/sdk/core/classes/PackDefinitionBuilder.md b/docs/reference/sdk/core/classes/PackDefinitionBuilder.md index 33c3dd9a8..13dc561ac 100644 --- a/docs/reference/sdk/core/classes/PackDefinitionBuilder.md +++ b/docs/reference/sdk/core/classes/PackDefinitionBuilder.md @@ -33,7 +33,7 @@ rather than constructing a builder directly. | Parameter | Type | | ------ | ------ | -| `definition?` | `Partial`\<`Omit`\<[`PackVersionDefinition`](../interfaces/PackVersionDefinition.md), `"agent"` \| `"defaultTriggers"`\>\> | +| `definition?` | `Partial`\<`Omit`\<[`PackVersionDefinition`](../interfaces/PackVersionDefinition.md), `"agent"` \| `"defaultTriggers"` \| `"defaultRoutines"`\>\> | #### Returns diff --git a/docs/reference/sdk/core/functions/newPack.md b/docs/reference/sdk/core/functions/newPack.md index 8f52f7191..8a52fee78 100644 --- a/docs/reference/sdk/core/functions/newPack.md +++ b/docs/reference/sdk/core/functions/newPack.md @@ -27,7 +27,7 @@ pack.setUserAuthentication({type: AuthenticationType.HeaderBearerToken}); | Parameter | Type | | ------ | ------ | -| `definition?` | `Partial`\<`Omit`\<[`PackVersionDefinition`](../interfaces/PackVersionDefinition.md), `"agent"` \| `"defaultTriggers"`\>\> | +| `definition?` | `Partial`\<`Omit`\<[`PackVersionDefinition`](../interfaces/PackVersionDefinition.md), `"agent"` \| `"defaultTriggers"` \| `"defaultRoutines"`\>\> | ## Returns diff --git a/index.ts b/index.ts index 183e643ea..3dff90379 100644 --- a/index.ts +++ b/index.ts @@ -59,6 +59,9 @@ export type {PackFormatMetadata} from './compiled_types'; export type {PackSyncTable} from './compiled_types'; export type {PackMetadata} from './compiled_types'; export type {PackVersionMetadata} from './compiled_types'; +export type {PackUpload} from './compiled_types'; +export type {PackResource} from './compiled_types'; +export type {PackResourceArtifact} from './compiled_types'; export type {SkillMetadata} from './compiled_types'; export type {AgentMetadata} from './compiled_types'; @@ -119,6 +122,7 @@ export {NetworkConnection} from './api_types'; export type {PackFormulaDef} from './api'; export type {CommonPackFormulaDef} from './api_types'; export type {PackFormulaMetadata} from './api'; +export type {PackFormulaUi} from './api'; export type {PackFormulaValue} from './api_types'; export type {PackFormulaResult} from './api_types'; export type {ParamDef} from './api_types'; @@ -317,6 +321,7 @@ export type {WebSearchTool} from './types'; export type {MCPServer} from './types'; export type {PartialSkillDef} from './types'; export type {AgentDefinition} from './types'; +export type {AgentRoutineDefinition} from './types'; export type {DefaultTriggerDefinition} from './types'; export {DefaultTriggerKind} from './types'; export type {ScheduleTriggerDefinition} from './types'; diff --git a/package.json b/package.json index c8097e592..a0fcb7ac7 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,7 @@ "mersenne-twister": "1.1.0", "node-fetch": "2.6.13", "open": "8.4.2", + "parse5": "7.3.0", "pascalcase": "1.0.0", "qs": "6.16.0", "readline-sync": "1.4.10", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9bf592018..ba8cdf263 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -109,6 +109,9 @@ importers: open: specifier: 8.4.2 version: 8.4.2 + parse5: + specifier: 7.3.0 + version: 7.3.0 pascalcase: specifier: 1.0.0 version: 1.0.0 @@ -2627,6 +2630,10 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + entities@7.0.1: resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} engines: {node: '>=0.12'} @@ -3984,6 +3991,9 @@ packages: resolution: {integrity: sha512-bCgsFI+GeGWPAvAiUv63ZorMeif3/U0zaXABGJbOWt5OH2KCaPHF6S+0ok4aqM9RuIPGyZdx9tR9l13PsW4AYQ==} engines: {node: '>=14.13.0'} + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} @@ -7554,6 +7564,8 @@ snapshots: entities@4.5.0: {} + entities@6.0.1: {} + entities@7.0.1: {} env-paths@3.0.0: {} @@ -9106,6 +9118,10 @@ snapshots: '@types/parse-path': 7.1.0 parse-path: 7.0.0 + parse5@7.3.0: + dependencies: + entities: 6.0.1 + parseurl@1.3.3: {} pascalcase@1.0.0: {} diff --git a/test/builder_test.ts b/test/builder_test.ts index 243cd6b43..46bc3b0a2 100644 --- a/test/builder_test.ts +++ b/test/builder_test.ts @@ -1,10 +1,12 @@ import './test_helper'; import type {AgentDefinitionBuilder} from '../builder'; +import type {AgentRoutineDefinition} from '../types'; import {AuthenticationType} from '../types'; import {BaseDefinitionBuilder} from '../builder'; import {ConnectionRequirement} from '../api_types'; import {ContextualTriggerAssistMode} from '../types'; import {ContextualTriggerSurface} from '../types'; +import type {DefaultTriggerDefinition} from '../types'; import {DefaultTriggerKind} from '../types'; import type {DynamicSyncTableDef} from '../api'; import type {DynamicSyncTableOptions} from '../api'; @@ -637,6 +639,69 @@ describe('Agent builder', () => { assert.deepEqual(agent.agent, {tools: [], instructions: 'You help a team run async standups.'}); }); + describe('routines', () => { + it('keeps routines separate from plain triggers through JSON compilation', () => { + const routine = { + name: 'Daily brief', + instructions: 'Include source links.', + trigger: {kind: DefaultTriggerKind.WhileWriting, condition: 'When writing statistics'}, + } satisfies AgentRoutineDefinition; + assert.strictEqual(agent.addDefaultRoutine(routine), agent); + agent.addDefaultSlackEventTrigger({eventType: SlackEventType.MessageKeyword, keywords: ['deploy']}); + const metadata = JSON.parse(JSON.stringify(compilePackMetadata(agent as unknown as PackVersionDefinition))); + assert.deepEqual(metadata.defaultRoutines, [routine]); + assert.lengthOf(metadata.defaultTriggers, 1); + }); + + it('copies and freezes nested routine inputs without freezing caller objects', () => { + const routine = { + name: 'Deploy watch', + trigger: { + kind: DefaultTriggerKind.Event, + type: EventTriggerType.Slack, + eventType: SlackEventType.MessageKeyword, + keywords: ['deploy'], + }, + } satisfies AgentRoutineDefinition; + agent.addDefaultRoutine(routine); + routine.trigger.keywords.push('rollback'); + routine.name = 'Changed'; + assert.equal(agent.defaultRoutines?.[0].name, 'Deploy watch'); + assert.isTrue(Object.isFrozen(agent.defaultRoutines)); + assert.isTrue(Object.isFrozen(agent.defaultRoutines?.[0].trigger)); + assert.isFalse(Object.isFrozen(routine)); + }); + + it('appends multiple routines without changing earlier declarations', () => { + const trigger: DefaultTriggerDefinition = { + kind: DefaultTriggerKind.WhileWriting, + condition: 'When writing statistics', + }; + agent.addDefaultRoutine({name: 'First', trigger}); + const first = agent.defaultRoutines; + agent.addDefaultRoutine({instructions: 'Second action.', trigger}); + assert.lengthOf(first!, 1); + assert.lengthOf(agent.defaultRoutines!, 2); + }); + + it('rejects an unsafe schedule before changing builder state', () => { + assert.throws( + () => + agent.addDefaultRoutine({ + name: 'Brief', + trigger: {kind: DefaultTriggerKind.Schedule, rruleString: 'RRULE:FREQ=DAILY'}, + }), + /DTSTART/, + ); + assert.isUndefined(agent.defaultRoutines); + }); + + it('is not available on a connector-only builder', () => { + assert.notProperty(newPack(), 'addDefaultRoutine'); + assert.notProperty(newPack(), 'defaultRoutines'); + }); + }); + it('keeps the last instructions set', () => { agent.setInstructions('First.').setInstructions('Second.'); assert.deepEqual(agent.agent, {tools: [], instructions: 'Second.'}); @@ -976,6 +1041,18 @@ describe('Agent builder', () => { }); }); + it('rejects blank routines before appending them', () => { + const agent = newAgent(); + const trigger = {kind: DefaultTriggerKind.WhileWriting as const, condition: 'x'}; + for (const fields of [{}, {name: ''}, {instructions: ' \n'}, {name: ' ', instructions: ''}]) { + assert.throws( + () => agent.addDefaultRoutine({...fields, trigger}), + /A routine needs a name or instructions containing non-whitespace text/, + ); + assert.equal(agent.defaultRoutines, undefined); + } + }); + describe('withheld surface', () => { it('is not reachable through the types', () => { // Checked by tsc, not at runtime: if one of these stops being an error, the directive @@ -997,6 +1074,21 @@ describe('Agent builder', () => { builder.setTools({mcp: true}); // @ts-expect-error only newAgent() can stamp default triggers newPack({defaultTriggers: {}}); + // @ts-expect-error only newAgent() can stamp routines + newPack({defaultRoutines: []}); + // @ts-expect-error routines are not authorable on a connector builder + newPack().addDefaultRoutine({name: 'Brief'}); + // @ts-expect-error browser-facing metadata must not carry routine instructions + (undefined as unknown as ExternalPackVersionMetadata).defaultRoutines; + // @ts-expect-error routines are reachable only through addDefaultRoutine + builder.defaultRoutines = []; + // @ts-expect-error the routine list is immutable + builder.defaultRoutines?.push({ + name: 'Brief', + trigger: {kind: DefaultTriggerKind.WhileWriting, condition: 'x'}, + }); + // @ts-expect-error nested routine metadata is immutable + builder.defaultRoutines![0].instructions = 'Changed'; // @ts-expect-error the agent is reachable only through its setters builder.agent.instructions = 'x'; // @ts-expect-error as is its tool list diff --git a/test/cli_headless_test.ts b/test/cli_headless_test.ts index 694b69efe..327becaaa 100644 --- a/test/cli_headless_test.ts +++ b/test/cli_headless_test.ts @@ -285,11 +285,7 @@ describe('Headless CLI', () => { assert.include(printedOutput(), 'Installed agent version 3 of pack 1234.'); assert.include(printedOutput(), 'agent instance: ai-1'); assert.include(printedOutput(), 'tenant: bt-1'); - assert.deepEqual(configStorage.getAgentInstall(manifestDir, apiEndpoint), { - packId: 1234, - agentInstanceId: 'ai-1', - tenantId: 'bt-1', - }); + assert.isFalse(fsExtra.existsSync(path.join(manifestDir, '.coda-agent.json'))); }); it('uses an explicit version and skips the version lookup', async () => { @@ -321,7 +317,7 @@ describe('Headless CLI', () => { assert.include(printedOutput(), 'agent instance: ai-1'); }); - it('says the agent is already installed and still saves the ids', async () => { + it('says the agent is already installed', async () => { (global.fetch as unknown as sinon.SinonStub).callsFake(async (url: any, init: any) => { postedUrls.push(String(url)); postedBodies.push(init?.body ? JSON.parse(String(init.body)) : undefined); @@ -332,7 +328,7 @@ describe('Headless CLI', () => { assert.include(printedOutput(), 'Agent version 3 of pack 1234 is already installed.'); assert.notInclude(printedOutput(), 'Installed agent version'); - assert.deepEqual(configStorage.getAgentInstall(manifestDir, apiEndpoint)?.agentInstanceId, 'ai-1'); + assert.isFalse(fsExtra.existsSync(path.join(manifestDir, '.coda-agent.json'))); }); it('exits without saving when the response has no agent instance id', async () => { @@ -346,7 +342,7 @@ describe('Headless CLI', () => { assert.equal(exitCode, 1); assert.include(exitMessage, 'did not include an agent instance id'); - assert.isUndefined(configStorage.getAgentInstall(manifestDir, apiEndpoint)); + assert.isFalse(fsExtra.existsSync(path.join(manifestDir, '.coda-agent.json'))); }); it('prints the attempted URL and browser fallback for a missing route', async () => { @@ -443,13 +439,13 @@ describe('Headless CLI', () => { assert.include(lines.join('\n'), 'Stopped polling after 5 minutes.'); }); - it('uses the saved install when tenant and instance are omitted', async () => { + it('looks up the install when tenant and instance are omitted', async () => { sinon.stub(configStorage, 'getPackId').returns(1234); - sinon.stub(configStorage, 'getAgentInstall').returns({ - packId: 1234, - agentInstanceId: 'ai-saved', - tenantId: 'bt-saved', - }); + sinon.stub(global, 'fetch').resolves( + new Response(JSON.stringify({agentInstanceId: 'ai-saved', tenantId: 'bt-saved', packId: 1234}), { + status: 200, + }), + ); const listAgentSessionIds = sinon.stub().resolves({items: []}); sinon.stub(helpers, 'createCodaClient').returns({ listPackVersions: async () => ({items: []}), @@ -473,9 +469,13 @@ describe('Headless CLI', () => { assert.include(exitMessage, 'No agent runs yet'); }); - it('points at install when no ids are saved', async () => { + it('points at install when this pack has no instance', async () => { sinon.stub(configStorage, 'getPackId').returns(1234); - sinon.stub(configStorage, 'getAgentInstall').returns(undefined); + sinon.stub(global, 'fetch').resolves( + new Response(JSON.stringify({statusCode: 404, message: 'Not Found', codaType: 'AgentInstanceNotFound'}), { + status: 404, + }), + ); const createClient = sinon.stub(helpers, 'createCodaClient'); try { @@ -494,6 +494,28 @@ describe('Headless CLI', () => { sinon.assert.notCalled(createClient); assert.include(exitMessage, 'packs agent install pack.ts'); }); + + it('rejects a lone instance flag instead of pairing it with a looked-up tenant', async () => { + sinon.stub(configStorage, 'getPackId').returns(1234); + const fetchStub = sinon.stub(global, 'fetch'); + + try { + await handleAgentLogs({ + manifestPath: 'pack.ts', + instance: 'agent-1', + apiEndpoint, + apiToken: 'test-token', + $0: '', + _: [], + } as any); + assert.fail('expected printAndExit'); + } catch { + // printAndExit throws + } + + sinon.assert.notCalled(fetchStub); + assert.include(exitMessage, '--tenant and --instance'); + }); }); describe('validate connector check', () => { diff --git a/test/cli_test.ts b/test/cli_test.ts index d1d8efef8..17c01b086 100644 --- a/test/cli_test.ts +++ b/test/cli_test.ts @@ -1,4 +1,5 @@ import type {AgentChatMessage} from '../cli/agent_chat'; +import type {AgentChatState} from '../cli/config_storage'; import type {AgentTool} from '../types'; import type {PackVersionDefinition} from '../types'; import {PublicApiPackLogType} from '../helpers/external-api/v1'; @@ -6,15 +7,18 @@ import {PublicApiType} from '../helpers/external-api/v1'; import {ResponseError} from '../helpers/external-api/coda'; import {ToolType} from '../types'; import {buildAgentChatMessagesUrl} from '../cli/agent_chat'; +import {buildAgentInstallCommand} from '../cli/index'; import {buildAgentInstallUrl} from '../cli/agent_install'; import {buildAgentRouteUrl} from '../cli/agent_api'; import {buildAgentRunStatusUrl} from '../cli/agent_chat'; +import {buildInstalledAgentUrl} from '../cli/agent_api'; import {buildTriggerAgentUrl} from '../cli/agent_chat'; import {checkAgentConnectorListings} from '../cli/validate'; import * as cliHelpers from '../cli/helpers'; import {compilePackBundle} from '../testing/compile'; import {compilePackMetadata} from '../helpers/metadata'; import * as configStorage from '../cli/config_storage'; +import {describeAge} from '../cli/agent_chat'; import {describeRunReason} from '../cli/agent_chat'; import {firstSessionId} from '../cli/agent_logs'; import {formatAgentLog} from '../cli/agent_logs'; @@ -25,13 +29,13 @@ import {getConnectorPackIds} from '../cli/validate'; import {handleAgentChat} from '../cli/agent_chat'; import {importManifest} from '../cli/helpers'; import {joinAssistantTexts} from '../cli/agent_chat'; -import os from 'os'; import {parsePackIdOrUrl} from '../cli/link'; import path from 'path'; import {redactSecrets} from '../cli/agent_logs'; import {renderAgentPackTemplate} from '../cli/agent_template'; import sinon from 'sinon'; import * as testingHelpers from '../testing/helpers'; +import yargs from 'yargs'; describe('CLI', () => { describe('compile pack metadata', () => { @@ -229,6 +233,9 @@ describe('CLI', () => { let fetchStub: sinon.SinonStub; let printStub: sinon.SinonStub; let exitStub: sinon.SinonStub; + let getChatStub: sinon.SinonStub; + let storeChatStub: sinon.SinonStub; + let clearChatStub: sinon.SinonStub; const args = { _: [], $0: 'packs', @@ -264,6 +271,9 @@ describe('CLI', () => { beforeEach(() => { clock = sinon.useFakeTimers({now: 0, toFake: ['Date', 'setTimeout', 'clearTimeout']}); sinon.stub(cliHelpers, 'assertPackId').returns(1234); + getChatStub = sinon.stub(configStorage, 'getAgentChat').returns(undefined); + storeChatStub = sinon.stub(configStorage, 'storeAgentChat'); + clearChatStub = sinon.stub(configStorage, 'clearAgentChat'); fetchStub = sinon.stub(global, 'fetch'); fetchStub.onFirstCall().resolves(jsonResponse(triggerBody)); printStub = sinon.stub(testingHelpers, 'print'); @@ -351,29 +361,178 @@ describe('CLI', () => { assert.include(message, 'chat: chat-1'); }); - it('uses the saved install when --agentInstanceId is omitted', async () => { - sinon.stub(configStorage, 'getAgentInstall').returns({ - packId: 1234, - agentInstanceId: 'agent-1', - tenantId: 'bt-saved', - }); - finishRunAt(1); + it('looks up the installed instance when --agentInstanceId is omitted', async () => { + fetchStub.resetBehavior(); + fetchStub.onCall(0).resolves(jsonResponse({agentInstanceId: 'agent-1', tenantId: 'bt-saved', packId: 1234})); + fetchStub.onCall(1).resolves(jsonResponse(triggerBody)); + finishRunAt(2); const {agentInstanceId: _agentInstanceId, ...withoutFlag} = args; const polling = handleAgentChat(withoutFlag); await clock.runAllAsync(); await polling; - const triggerRequest = JSON.parse(String(fetchStub.firstCall.args[1].body)); + assert.equal(String(fetchStub.firstCall.args[0]), 'https://coda.io/apis/v1/packs/1234/agentInstance'); + assert.instanceOf(fetchStub.firstCall.args[1].signal, AbortSignal); + const triggerRequest = JSON.parse(String(fetchStub.secondCall.args[1].body)); assert.equal(triggerRequest.agentInstanceId, 'agent-1'); sinon.assert.calledWithExactly(printStub, 'reply'); }); - it('tells you to install when no instance is saved', async () => { - sinon.stub(configStorage, 'getAgentInstall').returns(undefined); + describe('chat threads', () => { + const saved: AgentChatState = {agentInstanceId: 'agent-1', chatId: 'chat-saved'}; + + function triggerRequest() { + return JSON.parse(String(fetchStub.firstCall.args[1].body)); + } + + it('saves the chat id so the next prompt can continue it', async () => { + finishRunAt(1); + const polling = handleAgentChat(args); + await clock.runAllAsync(); + await polling; + assert.notProperty(triggerRequest(), 'chatId'); + sinon.assert.calledOnceWithExactly(storeChatStub, '/tmp', 'https://coda.io', { + agentInstanceId: 'agent-1', + chatId: 'chat-1', + }); + }); + + it('sends the saved chat id for the same instance', async () => { + getChatStub.returns(saved); + fetchStub.onFirstCall().resolves(jsonResponse({...triggerBody, chatId: 'chat-saved'})); + finishRunAt(1); + const polling = handleAgentChat(args); + await clock.runAllAsync(); + await polling; + assert.deepInclude(triggerRequest(), {agentInstanceId: 'agent-1', chatId: 'chat-saved'}); + sinon.assert.calledWithExactly(printStub, 'Continuing chat chat-saved. Pass --new to start a new chat.'); + }); + + const hoursAgo = (hours: number) => new Date(-hours * 3600 * 1000).toISOString(); + + it('says how long ago the continued chat was last used', async () => { + getChatStub.returns({...saved, lastUsedAt: hoursAgo(3)}); + finishRunAt(1); + const polling = handleAgentChat(args); + await clock.runAllAsync(); + await polling; + assert.equal(triggerRequest().chatId, 'chat-saved'); + sinon.assert.calledWithExactly( + printStub, + 'Continuing chat chat-saved, last used 3 hours ago. Pass --new to start a new chat.', + ); + }); + + it('starts a new chat when the saved one has been idle over a day', async () => { + getChatStub.returns({...saved, lastUsedAt: hoursAgo(49)}); + finishRunAt(1); + const polling = handleAgentChat(args); + await clock.runAllAsync(); + await polling; + assert.notProperty(triggerRequest(), 'chatId'); + sinon.assert.calledWithExactly( + printStub, + 'Your last chat was used 2 days ago, so this starts a new one. Pass --chatId chat-saved to continue the old chat.', + ); + }); + + it('still continues a chat idle over a day when --chatId names it', async () => { + getChatStub.returns({...saved, lastUsedAt: hoursAgo(49)}); + fetchStub.onFirstCall().resolves(jsonResponse({...triggerBody, chatId: 'chat-saved'})); + finishRunAt(1); + const polling = handleAgentChat({...args, chatId: 'chat-saved'}); + await clock.runAllAsync(); + await polling; + assert.equal(triggerRequest().chatId, 'chat-saved'); + sinon.assert.calledWithExactly(printStub, 'Continuing chat chat-saved.'); + }); + + it('ignores a saved chat that belongs to another instance', async () => { + getChatStub.returns({agentInstanceId: 'agent-old', chatId: 'chat-saved'}); + finishRunAt(1); + const polling = handleAgentChat(args); + await clock.runAllAsync(); + await polling; + assert.notProperty(triggerRequest(), 'chatId'); + }); + + it('starts a new chat with --new even when one is saved', async () => { + getChatStub.returns(saved); + finishRunAt(1); + const polling = handleAgentChat({...args, new: true}); + await clock.runAllAsync(); + await polling; + assert.notProperty(triggerRequest(), 'chatId'); + sinon.assert.calledOnceWithMatch(storeChatStub, '/tmp', 'https://coda.io', {chatId: 'chat-1'}); + }); + + it('sends --chatId alone and lets the server pick the agent', async () => { + const {agentInstanceId: _agentInstanceId, ...withoutFlag} = args; + fetchStub.onFirstCall().resolves(jsonResponse({...triggerBody, chatId: 'chat-explicit'})); + finishRunAt(1); + const polling = handleAgentChat({...withoutFlag, chatId: 'chat-explicit'}); + await clock.runAllAsync(); + await polling; + assert.deepEqual(triggerRequest(), {input: 'hello', chatId: 'chat-explicit'}); + assert.include(String(fetchStub.secondCall.args[0]), '/agentInstances/agent-1/chats/chat-explicit/'); + }); + + it('rejects --new together with --chatId', async () => { + await handleAgentChat({...args, new: true, chatId: 'chat-explicit'}); + sinon.assert.notCalled(fetchStub); + sinon.assert.calledOnceWithMatch(exitStub, 'Pass --new or --chatId, not both.'); + }); + + it('explains a missing chat by codaType and clears the saved one', async () => { + getChatStub.returns(saved); + fetchStub + .onFirstCall() + .resolves( + jsonResponse({statusCode: 404, message: 'Chat not found for this agent.', codaType: 'ChatNotFound'}, 404), + ); + await handleAgentChat(args); + sinon.assert.calledOnceWithExactly(clearChatStub, '/tmp', 'https://coda.io'); + const message = String(exitStub.firstCall.args[0]); + assert.include(message, 'That chat is gone'); + assert.include(message, '--new'); + sinon.assert.notCalled(storeChatStub); + }); + + it('keeps the saved chat when an explicit --chatId is not found', async () => { + getChatStub.returns(saved); + fetchStub.onFirstCall().resolves(jsonResponse({statusCode: 404, message: 'x', codaType: 'ChatNotFound'}, 404)); + await handleAgentChat({...args, chatId: 'chat-other'}); + sinon.assert.notCalled(clearChatStub); + sinon.assert.calledOnceWithMatch(exitStub, 'That chat is gone'); + }); + }); + + it('tells you to install when this pack has no instance', async () => { + fetchStub.resetBehavior(); + fetchStub.resolves(jsonResponse({statusCode: 404, message: 'Not Found', codaType: 'AgentInstanceNotFound'}, 404)); const {agentInstanceId: _agentInstanceId, ...withoutFlag} = args; await handleAgentChat(withoutFlag); - sinon.assert.notCalled(fetchStub); + sinon.assert.calledOnce(fetchStub); sinon.assert.calledOnceWithMatch(exitStub, 'packs agent install pack.ts'); }); + + it('does not suggest install when the lookup 404 is not a missing instance', async () => { + fetchStub.resetBehavior(); + fetchStub.resolves(jsonResponse({statusCode: 404, message: 'Not Found'}, 404)); + const {agentInstanceId: _agentInstanceId, ...withoutFlag} = args; + await handleAgentChat(withoutFlag); + const message = String(exitStub.firstCall.args[0]); + assert.include(message, 'Could not look up the installed agent.'); + assert.notInclude(message, 'packs agent install pack.ts'); + }); + + it('tells you to pass the instance id when lookup is not deployed', async () => { + fetchStub.resetBehavior(); + fetchStub.resolves(new Response('missing', {status: 404, statusText: 'Not Found'})); + const {agentInstanceId: _agentInstanceId, ...withoutFlag} = args; + await handleAgentChat(withoutFlag); + sinon.assert.calledOnce(fetchStub); + sinon.assert.calledOnceWithMatch(exitStub, 'Pass --agentInstanceId.'); + }); }); describe('agent chat reply', () => { @@ -391,7 +550,7 @@ describe('CLI', () => { it('joins completed assistant replies chronologically', () => { const messages = [ message({id: 'last', createdAt: '2026-01-01T00:00:02.000Z', text: 'last reply'}), - message({id: 'user', messageType: 'user', text: 'question'}), + message({id: 'user', messageType: 'user', text: 'question', createdAt: '2026-01-01T00:00:00.000Z'}), message({id: 'empty', text: ''}), message({id: 'incomplete', isComplete: false, text: 'unfinished'}), message({id: 'first', createdAt: '2026-01-01T00:00:01.000Z', text: 'first reply'}), @@ -399,6 +558,25 @@ describe('CLI', () => { assert.equal(joinAssistantTexts(messages), 'first reply\n\nlast reply'); }); + it('returns only the latest turn of a multi-turn transcript', () => { + const at = (second: number) => `2026-01-01T00:00:0${second}.000Z`; + const messages = [ + message({id: 'u1', messageType: 'user', text: 'first question', createdAt: at(0)}), + message({id: 'a1', text: 'first answer', createdAt: at(1)}), + message({id: 'u2', messageType: 'user', text: 'follow-up', createdAt: at(2)}), + message({id: 'a2', text: 'working on it', createdAt: at(3)}), + message({id: 'a3', text: 'follow-up answer', createdAt: at(4)}), + ]; + assert.equal(joinAssistantTexts(messages), 'working on it\n\nfollow-up answer'); + }); + + it('describes idle time in minutes, hours and days', () => { + assert.equal(describeAge(30 * 1000), 'just now'); + assert.equal(describeAge(60 * 1000), '1 minute ago'); + assert.equal(describeAge(5 * 3600 * 1000), '5 hours ago'); + assert.equal(describeAge(2 * 24 * 3600 * 1000), '2 days ago'); + }); + it('returns undefined when no complete assistant text arrived', () => { assert.isUndefined(joinAssistantTexts([])); assert.isUndefined(joinAssistantTexts([message({isComplete: false}), message({text: ''})])); @@ -426,36 +604,29 @@ describe('CLI', () => { 'https://coda.io/apis/v1/packs/1234/versions/3/agentInstall', ); }); + + it('looks up the installed agent by pack id', () => { + assert.equal(buildInstalledAgentUrl('https://coda.io', 1234), 'https://coda.io/apis/v1/packs/1234/agentInstance'); + }); }); - describe('agent install storage', () => { - it('returns the install only for the matching pack and endpoint', () => { - const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'agent-install-storage-')); + describe('agent install version flag', () => { + it('keeps --version as the pack version', () => { + const warnings: string[] = []; + const emitWarning = process.emitWarning; + process.emitWarning = ((warning: string | Error, ...rest: any[]) => { + warnings.push(typeof warning === 'string' ? warning : warning.message); + return emitWarning.call(process, warning as any, ...rest); + }) as typeof process.emitWarning; try { - configStorage.storePackId(dir, 1234, 'https://coda.io'); - configStorage.storeAgentInstall(dir, 'https://coda.io', { - packId: 1234, - agentInstanceId: 'ai-1', - tenantId: 'bt-1', - }); - configStorage.storePackId(dir, 7, 'https://head.coda.io'); - configStorage.storeAgentInstall(dir, 'https://head.coda.io', {packId: 7, agentInstanceId: 'ai-head'}); - - assert.deepEqual(configStorage.getAgentInstall(dir, 'https://coda.io'), { - packId: 1234, - agentInstanceId: 'ai-1', - tenantId: 'bt-1', - }); - assert.deepEqual(configStorage.getAgentInstall(dir, 'https://head.coda.io'), { - packId: 7, - agentInstanceId: 'ai-head', - }); - - configStorage.storePackId(dir, 999, 'https://coda.io'); - assert.isUndefined(configStorage.getAgentInstall(dir, 'https://coda.io')); - assert.equal(configStorage.getAgentInstall(dir, 'https://head.coda.io')?.agentInstanceId, 'ai-head'); + const parsed = buildAgentInstallCommand(yargs().scriptName('packs').exitProcess(false)).parseSync([ + '--version', + '1', + ]); + assert.equal(parsed.version, '1'); + assert.isFalse(warnings.some(warning => warning.includes('reserved word'))); } finally { - fs.removeSync(dir); + process.emitWarning = emitWarning; } }); }); diff --git a/test/config_storage_test.ts b/test/config_storage_test.ts index d4cac1aaf..f2c6ef984 100644 --- a/test/config_storage_test.ts +++ b/test/config_storage_test.ts @@ -5,12 +5,17 @@ import {DeprecatedPackOptionKey} from '../cli/config_storage'; import {PackOptionKey} from '../cli/config_storage'; import {TimerShimStrategy} from '../testing/compile'; import {backfillFromPackConfig} from '../cli/helpers'; +import {clearAgentChat} from '../cli/config_storage'; +import * as fs from 'fs'; +import {getAgentChat} from '../cli/config_storage'; import {getApiKey} from '../cli/config_storage'; import {getPackId} from '../cli/config_storage'; import {getPackOptions} from '../cli/config_storage'; import mockFs from 'mock-fs'; import * as path from 'path'; +import {readJSONFile} from '../testing/helpers'; import sinon from 'sinon'; +import {storeAgentChat} from '../cli/config_storage'; import {storeCodaApiKey} from '../cli/config_storage'; import {storePackId} from '../cli/config_storage'; import {storePackOptions} from '../cli/config_storage'; @@ -114,6 +119,76 @@ describe('Config storage', () => { }); }); + describe('agent chats', () => { + const endpoint = DEFAULT_API_ENDPOINT; + const devEndpoint = 'https://dev.coda.io:8080'; + const chat = {agentInstanceId: 'agent-1', chatId: 'chat-1'}; + + beforeEach(() => { + sinon.stub(process.env, 'HOME').value('/home/me'); + }); + + it('stores and reads the chat for an endpoint', () => { + storeAgentChat(PROJECT_DIR, endpoint, chat); + assert.deepInclude(getAgentChat(PROJECT_DIR, endpoint), chat); + }); + + it('records when the chat was last used', () => { + const clock = sinon.useFakeTimers({now: Date.parse('2026-01-02T03:04:05.000Z'), toFake: ['Date']}); + try { + storeAgentChat(PROJECT_DIR, endpoint, chat); + } finally { + clock.restore(); + } + assert.equal(getAgentChat(PROJECT_DIR, endpoint)?.lastUsedAt, '2026-01-02T03:04:05.000Z'); + }); + + it('reads an entry saved before timestamps existed', () => { + mockFs({'/home/me': {'.coda-agent-chats.json': JSON.stringify({[`coda.io|${PROJECT_DIR}`]: chat})}}); + assert.deepEqual(getAgentChat(PROJECT_DIR, endpoint), chat); + }); + + it('keeps the chat out of the pack directory', () => { + mockFs({[PROJECT_DIR]: {'.coda-pack.json': JSON.stringify({packId: 123})}}); + storeAgentChat(PROJECT_DIR, endpoint, chat); + assert.deepEqual(readJSONFile(path.join(PROJECT_DIR, '.coda-pack.json')), {packId: 123}); + assert.deepEqual(fs.readdirSync(PROJECT_DIR), ['.coda-pack.json']); + assert.deepEqual(fs.readdirSync('/home/me'), ['.coda-agent-chats.json']); + }); + + it('keeps a separate chat per endpoint and per pack directory', () => { + storeAgentChat(PROJECT_DIR, endpoint, chat); + storeAgentChat(PROJECT_DIR, devEndpoint, {agentInstanceId: 'agent-2', chatId: 'chat-2'}); + storeAgentChat('/other', endpoint, {agentInstanceId: 'agent-3', chatId: 'chat-3'}); + assert.deepInclude(getAgentChat(PROJECT_DIR, endpoint), chat); + assert.equal(getAgentChat(PROJECT_DIR, devEndpoint)?.chatId, 'chat-2'); + assert.equal(getAgentChat('/other', endpoint)?.chatId, 'chat-3'); + }); + + it('has no chat until one is stored', () => { + assert.isUndefined(getAgentChat(PROJECT_DIR, endpoint)); + }); + + it('clears only the chat for that endpoint', () => { + storeAgentChat(PROJECT_DIR, endpoint, chat); + storeAgentChat(PROJECT_DIR, devEndpoint, chat); + clearAgentChat(PROJECT_DIR, endpoint); + assert.isUndefined(getAgentChat(PROJECT_DIR, endpoint)); + assert.deepInclude(getAgentChat(PROJECT_DIR, devEndpoint), chat); + }); + + it('ignores chats written into .coda-pack.json by an earlier version', () => { + mockFs({ + [PROJECT_DIR]: { + '.coda-pack.json': JSON.stringify({packId: 123, agentChats: {'coda.io': chat}}), + }, + }); + assert.isUndefined(getAgentChat(PROJECT_DIR, endpoint)); + storePackOptions(PROJECT_DIR, {gitTag: true}); + assert.equal(getPackId(PROJECT_DIR, endpoint), 123); + }); + }); + describe('pack options - apiEndpoint', () => { it('store and get apiEndpoint', () => { storePackOptions(PROJECT_DIR, {[PackOptionKey.apiEndpoint]: 'https://my-env.coda.io'}); diff --git a/test/upload_validation_test.ts b/test/upload_validation_test.ts index 32e945b0a..83a7dbf72 100644 --- a/test/upload_validation_test.ts +++ b/test/upload_validation_test.ts @@ -35,10 +35,12 @@ import {NotetakerFilterField} from '../types'; import type {ObjectSchemaDefinition} from '../schema'; import type {OptionsReference} from '../api_types'; import {OptionsType} from '../api_types'; -import type {PackFormulaMetadata} from '../api'; +import type {PackFormulaMetadata} from '../index'; +import type {PackFormulaUi} from '../index'; import {PackMetadataValidationError} from '../testing/upload_validation'; import type {PackTool} from '../types'; -import type {PackVersionMetadata} from '../compiled_types'; +import type {PackUpload} from '../index'; +import type {PackVersionMetadata} from '../index'; import type {ParamDefs} from '../api_types'; import {ParameterType} from '../api_types'; import {PastLiveDates} from '../api_types'; @@ -95,6 +97,7 @@ import {makeSyncTableLegacy} from '../api'; import {normalizeTool} from '../testing/upload_validation'; import {numberArray} from '../api_types'; import {validateCrawlHierarchy} from '../testing/upload_validation'; +import {validatePackResourceArtifacts} from '../testing/upload_validation'; import {validatePackVersionMetadata} from '../testing/upload_validation'; import {validateSyncTableSchema} from '../testing/upload_validation'; import {validateVariousAuthenticationMetadata} from '../testing/upload_validation'; @@ -155,6 +158,250 @@ describe('Pack metadata Validation', async () => { assert.deepEqual(err.validationErrors, [{path: '', message: 'Invalid input: expected object, received string'}]); }); + it('preserves descriptors and shared top-level formula references', async () => { + const ui: PackFormulaUi = {resourceKey: 'greeting'}; + const metadata = createFakePackVersionMetadata({ + formulaNamespace: 'Resources', + resources: [{key: 'greeting', mimeType: 'text/html;profile=mcp-app'}], + formulas: [ + {...createFakePackFormulaMetadata({name: 'First'}), ui}, + {...createFakePackFormulaMetadata({name: 'Second'}), ui}, + ], + }); + const upload: PackUpload = { + metadata, + sdkVersion: '1.18.3', + bundle: '', + sourceMap: '', + resourceArtifacts: [{resourceKey: 'greeting', content: ''}], + }; + const result = await validateJson(upload.metadata); + assert.deepEqual(result.resources, metadata.resources); + assert.deepEqual( + result.formulas.map(formula => formula.ui), + [{resourceKey: 'greeting'}, {resourceKey: 'greeting'}], + ); + }); + + it('requires supported wire MIME and rejects extra descriptor fields', async () => { + for (const descriptor of [ + {key: 'app'}, + {key: 'app', mimeType: 'text/html'}, + {key: 'app', mimeType: 'application/javascript'}, + {key: 'app', mimeType: 'text/html;profile=mcp-app', entryUrl: 'file:///entry.html'}, + {key: 'app', mimeType: 'text/html;profile=mcp-app', content: ''}, + ]) { + const err = await validateJsonAndAssertFails({...createFakePackVersionMetadata(), resources: [descriptor]}); + const expectedPath = + 'mimeType' in descriptor && descriptor.mimeType === 'text/html;profile=mcp-app' + ? 'resources[0]' + : 'resources[0].mimeType'; + assert.equal(ensureExists(err.validationErrors)[0].path, expectedPath); + } + }); + + it('rejects duplicate resource keys with indexed errors', async () => { + const duplicateError = await validateJsonAndAssertFails( + createFakePackVersionMetadata({ + resources: [ + {key: 'app', mimeType: 'text/html;profile=mcp-app'}, + {key: 'app', mimeType: 'text/html;profile=mcp-app'}, + ], + }), + ); + assert.deepEqual(duplicateError.validationErrors, [ + { + path: 'resources[1].key', + message: 'Resource keys must be unique. Found duplicate key "app".', + }, + ]); + }); + + it('rejects undeclared formula resources with indexed errors', async () => { + const referenceError = await validateJsonAndAssertFails( + createFakePackVersionMetadata({ + formulaNamespace: 'Resources', + formulas: [{...createFakePackFormulaMetadata(), ui: {resourceKey: 'missing'}}], + }), + ); + assert.deepEqual(referenceError.validationErrors, [ + { + path: 'formulas[0].ui.resourceKey', + message: 'Formula references undeclared resource "missing".', + }, + ]); + }); + + it('rejects ASCII and Unicode case-only declaration collisions at their original indexes', async () => { + for (const [first, collision] of [ + ['Greeting', 'greeting'], + ['føø', 'FØØ'], + ]) { + const resources = [first, 'Other', collision, first].map(key => ({ + key, + mimeType: 'text/html;profile=mcp-app' as const, + })); + const metadata = createFakePackVersionMetadata({resources}); + const originalMetadata = deepCopy(metadata); + const expectedErrors = [ + {path: 'resources[2].key', message: `Resource keys must be unique. Found duplicate key "${collision}".`}, + {path: 'resources[3].key', message: `Resource keys must be unique. Found duplicate key "${first}".`}, + ]; + const fullError = await validateJsonAndAssertFails(metadata); + assert.deepEqual(fullError.validationErrors, expectedErrors); + const resourceError = assertResourceValidationFails(() => + validatePackResourceArtifacts(metadata, null, {maxResourceBytes: 1024, maxResourceCount: 20}), + ); + assert.deepEqual(resourceError.validationErrors, expectedErrors); + assert.deepEqual(metadata, originalMetadata); + } + }); + + it('accepts formula-style resource names and preserves their bindings and bodies', async () => { + for (const key of ['Greeting', 'foo_bar', 'føø', '变量', 'é٢', 'a'.repeat(50)]) { + const resources = [{key, mimeType: 'text/html;profile=mcp-app' as const}]; + const metadata = createFakePackVersionMetadata({ + resources, + formulaNamespace: 'Resources', + formulas: [{...createFakePackFormulaMetadata(), ui: {resourceKey: key}}], + }); + const originalMetadata = deepCopy(metadata); + const result = await validateJson(metadata); + assert.deepEqual(result.resources, resources); + assert.deepEqual(result.formulas[0].ui, {resourceKey: key}); + const artifacts = [{resourceKey: key, content: ''}]; + const originalArtifacts = deepCopy(artifacts); + assert.deepEqual( + validatePackResourceArtifacts(metadata, artifacts, {maxResourceBytes: 1024, maxResourceCount: 20}), + originalArtifacts, + ); + assert.deepEqual(metadata, originalMetadata); + assert.deepEqual(artifacts, originalArtifacts); + } + }); + + it('preserves distinct declaration spelling and requires exact reference and artifact keys', async () => { + const resources = ['Greeting', 'foo_bar', 'føø'].map(key => ({ + key, + mimeType: 'text/html;profile=mcp-app' as const, + })); + const metadata = createFakePackVersionMetadata({resources}); + const artifacts = [...resources].reverse().map(({key}) => ({resourceKey: key, content: '

føø'})); + const options = {maxResourceBytes: 1024, maxResourceCount: 20}; + const result = await validateJson(metadata); + assert.deepEqual(result.resources, resources); + assert.deepEqual(validatePackResourceArtifacts(metadata, artifacts, options), artifacts); + for (const resourceKey of ['greeting', 'FØØ']) { + const referencedMetadata = { + ...metadata, + formulaNamespace: 'Resources', + formulas: [{...createFakePackFormulaMetadata(), ui: {resourceKey}}], + }; + const expected = [ + {path: 'formulas[0].ui.resourceKey', message: `Formula references undeclared resource "${resourceKey}".`}, + ]; + const fullError = await validateJsonAndAssertFails(referencedMetadata); + assert.deepEqual(fullError.validationErrors, expected); + const referenceError = assertResourceValidationFails(() => + validatePackResourceArtifacts(referencedMetadata, artifacts, options), + ); + assert.deepEqual(referenceError.validationErrors, expected); + const artifactError = assertResourceValidationFails(() => + validatePackResourceArtifacts(metadata, [{resourceKey, content: ''}], options), + ); + assert.deepEqual(artifactError.validationErrors, [ + { + path: 'resourceArtifacts', + message: `Pack App artifact resource key "${resourceKey}" is not declared in metadata.resources.`, + }, + ]); + } + }); + + it('enforces key grammar on declarations and references', async () => { + for (const key of ['', '../escape', 'with space', '_leading', '2foo', '_foo', 'foo-bar', '٢foo', 'a'.repeat(51)]) { + const metadata = { + ...createFakePackVersionMetadata(), + resources: [{key, mimeType: 'text/html;profile=mcp-app'}], + }; + const descriptorError = await validateJsonAndAssertFails(metadata); + assert.equal(ensureExists(descriptorError.validationErrors)[0].path, 'resources[0].key'); + const options = {maxResourceBytes: 1024, maxResourceCount: 20}; + const descriptorOnlyError = assertResourceValidationFails(() => + validatePackResourceArtifacts(metadata, [], options), + ); + assert.equal(ensureExists(descriptorOnlyError.validationErrors)[0].path, 'resources[0].key'); + const referenceMetadata = createFakePackVersionMetadata({ + formulaNamespace: 'Resources', + formulas: [{...createFakePackFormulaMetadata(), ui: {resourceKey: key}}], + }); + const referenceError = await validateJsonAndAssertFails(referenceMetadata); + assert.equal(ensureExists(referenceError.validationErrors)[0].path, 'formulas[0].ui.resourceKey'); + const referenceOnlyError = assertResourceValidationFails(() => + validatePackResourceArtifacts(referenceMetadata, [], options), + ); + assert.equal(ensureExists(referenceOnlyError.validationErrors)[0].path, 'formulas[0].ui.resourceKey'); + } + }); + + it('requires a resource key when formula UI metadata is present', async () => { + const err = await validateJsonAndAssertFails({ + ...createFakePackVersionMetadata(), + formulaNamespace: 'Resources', + formulas: [{...createFakePackFormulaMetadata(), ui: {}}], + }); + assert.deepEqual(err.validationErrors, [ + { + path: 'formulas[0].ui.resourceKey', + message: 'Missing required field formulas[0].ui.resourceKey.', + }, + ]); + }); + + it('accepts valid unreferenced descriptors above the former fixed ceiling', async () => { + const resources = Array.from({length: 257}, (_, i) => ({ + key: `resource_${i}`, + mimeType: 'text/html;profile=mcp-app' as const, + })); + const result = await validateJson(createFakePackVersionMetadata({resources})); + assert.deepEqual(result.resources, resources); + }); + + it('preserves legacy metadata without requiring resources', async () => { + const metadata = compilePackMetadata(createFakePack()); + const result = await validateJson(metadata); + assert.propertyVal(result, 'id', metadata.id); + assert.propertyVal(result, 'name', metadata.name); + assert.notProperty(result, 'resources'); + }); + + it('strips resource references from nested metadata formulas', async () => { + const table = makeSyncTable({ + name: 'Table', + identityName: 'Row', + schema: makeObjectSchema({ + type: ValueType.Object, + id: 'id', + primary: 'id', + properties: {id: {type: ValueType.String}}, + }), + formula: {name: 'Rows', description: '', parameters: [], execute: async () => ({result: []})}, + }); + const compiled = compileSyncTable(table); + const result = await validateJson({ + ...createFakePackVersionMetadata(), + syncTables: [ + { + ...compiled, + getter: {...compiled.getter, ui: {resourceKey: 'missing'}}, + namedPropertyOptions: {color: {...createFakePackFormulaMetadata(), ui: {resourceKey: 'missing'}}}, + }, + ], + }); + assert.notProperty(result.syncTables[0].getter, 'ui'); + assert.notProperty(result.syncTables[0].namedPropertyOptions!.color, 'ui'); + }); + it('simple valid upload', async () => { const metadata = createFakePackVersionMetadata(); const result = await validateJson(metadata); @@ -9288,6 +9535,137 @@ describe('Pack metadata Validation', async () => { assert.deepEqual(result.defaultTriggers, defaultTriggers); }); + describe('default routines', () => { + const routineAgentMetadata = () => createFakeAgentMetadata({agent: {instructions: 'Base.', tools: []}}); + const schedule: DefaultTriggerDefinition = { + kind: DefaultTriggerKind.Schedule, + rruleString: 'DTSTART;TZID=America/New_York:20261012T090000\nRRULE:FREQ=DAILY', + }; + const writing: DefaultTriggerDefinition = { + kind: DefaultTriggerKind.WhileWriting, + condition: 'When writing statistics', + }; + const slack: DefaultTriggerDefinition = { + kind: DefaultTriggerKind.Event, + type: EventTriggerType.Slack, + eventType: SlackEventType.MessageKeyword, + keywords: ['deploy'], + }; + const mail: DefaultTriggerDefinition = { + kind: DefaultTriggerKind.Event, + type: EventTriggerType.Mail, + mailEventType: MailEventType.MessageReceived, + filters: { + conditions: [{field: MailFilterField.From, operator: FilterOperator.TextContains, value: '@example.com'}], + }, + }; + const notetaker: DefaultTriggerDefinition = { + kind: DefaultTriggerKind.Event, + type: EventTriggerType.Notetaker, + eventType: NotetakerEventType.MeetingSummaryCompleted, + filters: {keywords: ['renewal']}, + }; + for (const trigger of [schedule, writing, slack, mail, notetaker]) { + it(`preserves ${trigger.kind}${'type' in trigger ? `/${trigger.type}` : ''} routines through JSON validation`, async () => { + const routine = {name: 'Routine', instructions: 'Include links.', trigger}; + const metadata = {...routineAgentMetadata(), defaultRoutines: [routine]}; + const validated = await validateJson(JSON.parse(JSON.stringify(metadata))); + assert.deepEqual(validated.defaultRoutines, [routine]); + }); + } + + for (const fields of [{}, {name: ''}, {instructions: ' \n'}, {name: ' ', instructions: ''}]) { + it(`rejects a blank routine wrapper ${JSON.stringify(fields)}`, async () => { + await validateJsonAndAssertFails({ + ...routineAgentMetadata(), + defaultRoutines: [{...fields, trigger: writing}], + }); + }); + } + + it('allows name-only and instruction-only routines without trimming authored text', async () => { + const defaultRoutines = [ + {name: ' Watch ', trigger: slack}, + {instructions: ' Act. ', trigger: slack}, + ]; + const validated = await validateJson({...routineAgentMetadata(), defaultRoutines}); + assert.deepEqual(validated.defaultRoutines, defaultRoutines); + }); + + it('enforces routine name and instruction bounds', async () => { + const routine = {name: 'n'.repeat(80), instructions: 'i'.repeat(20_000), trigger: writing}; + const validated = await validateJson({...routineAgentMetadata(), defaultRoutines: [routine]}); + assert.deepEqual(validated.defaultRoutines, [routine]); + for (const overLimit of [ + {...routine, name: 'n'.repeat(81)}, + {...routine, instructions: 'i'.repeat(20_001)}, + ]) { + await validateJsonAndAssertFails({...routineAgentMetadata(), defaultRoutines: [overLimit]}); + } + }); + + it('validates nested trigger configuration and rejects unknown routine keys', async () => { + for (const routine of [ + {name: 'Brief', trigger: {...schedule, rruleString: 'RRULE:FREQ=DAILY'}}, + {name: 'Watch', trigger: {...slack, keywords: []}}, + {name: 'Brief', instruction: 'Wrong field.', trigger: schedule}, + {name: 'Brief', trigger: {...writing, instruction: 'Wrong level.'}}, + {name: 'Chat', trigger: {kind: 'chat'}}, + ]) { + await validateJsonAndAssertFails({...routineAgentMetadata(), defaultRoutines: [routine]}); + } + }); + + for (const trigger of [schedule, writing]) { + it(`enforces one ${trigger.kind} across plain triggers and routines`, async () => { + const err = await validateJsonAndAssertFails({ + ...routineAgentMetadata(), + defaultTriggers: [trigger], + defaultRoutines: [{name: 'Routine', trigger}], + }); + assert.deepInclude(err.validationErrors!, { + path: 'defaultRoutines[0].trigger', + message: `An agent can only declare one ${trigger.kind} default trigger.`, + }); + await validateJsonAndAssertFails({ + ...routineAgentMetadata(), + defaultRoutines: [ + {name: 'First', trigger}, + {name: 'Second', trigger}, + ], + }); + }); + } + + it('shares the event cap across plain triggers and routines', async () => { + const metadata = { + ...routineAgentMetadata(), + defaultTriggers: Array.from({length: Limits.MaxDefaultEventTriggers - 1}, () => slack), + defaultRoutines: [{name: 'Watch', trigger: mail}], + }; + await validateJson(metadata); + const err = await validateJsonAndAssertFails({ + ...metadata, + defaultRoutines: [...metadata.defaultRoutines, {name: 'Meeting', trigger: notetaker}], + }); + assert.deepInclude(err.validationErrors!, { + path: 'defaultRoutines[1].trigger', + message: `An agent can only declare ${Limits.MaxDefaultEventTriggers} event default triggers.`, + }); + }); + + it('rejects routines on a connector-only manifest', async () => { + const err = await validateJsonAndAssertFails({ + ...createFakeAgentMetadata({agent: undefined}), + defaultRoutines: [{name: 'Brief', trigger: schedule}], + }); + assert.deepInclude(err.validationErrors!, { + path: 'defaultRoutines', + message: 'Only an agent can define routines.', + }); + }); + }); + it('rejects default triggers on a pack that is not an agent', async () => { const err = await validateJsonAndAssertFails( createFakeAgentMetadata({ @@ -10630,3 +11008,375 @@ describe('zodErrorDetailToValidationError', () => { } }); }); + +function assertResourceValidationFails(validate: () => unknown): PackMetadataValidationError { + try { + validate(); + } catch (error) { + if (error instanceof PackMetadataValidationError) { + return error; + } + throw error; + } + throw new Error('Expected resource validation to fail.'); +} + +describe('Pack resource artifact validation', () => { + const resources = [{key: 'app', mimeType: 'text/html;profile=mcp-app'}]; + const content = 'App

Hello'; + const options = {maxResourceBytes: 1024, maxResourceCount: 20}; + + it('preserves a document with omitted optional tags', () => { + const artifacts = [{resourceKey: 'app', content}]; + assert.deepEqual(validatePackResourceArtifacts({resources}, artifacts, options), artifacts); + }); + it('rejects the first parser diagnostic without exposing HTML source', () => { + const error = assertResourceValidationFails(() => + validatePackResourceArtifacts({resources}, [{resourceKey: 'app', content: 'private source'}], options), + ); + assert.deepEqual(error.validationErrors, [ + {path: 'resourceArtifacts[0].content', message: 'Invalid HTML: missing-doctype at line 1, column 1.'}, + ]); + assert.notInclude(error.message, 'private source'); + }); + + it('accepts parser-repaired markup and preserves executable content exactly', () => { + for (const content of [ + '', + 'hello', + '

', + '

é🙂', + '' + + '' + + '', + '

', + ]) { + const artifacts = [{resourceKey: 'app', content}]; + assert.deepEqual(validatePackResourceArtifacts({resources}, artifacts, options), artifacts); + } + }); + + it('rejects missing and nonconforming doctypes and malformed attributes with locations', () => { + for (const [content, message] of [ + ['', 'missing-doctype at line 1, column 1.'], + [' ', 'missing-doctype at line 1, column 2.'], + ['
fragment
', 'missing-doctype at line 1, column 1.'], + ['', 'non-conforming-doctype at line 1, column 1.'], + ['\n

', 'duplicate-attribute at line 2, column 11.'], + ['

{ + const multibyte = 'é'; + assert.deepEqual( + validatePackResourceArtifacts({resources}, [{resourceKey: 'app', content: multibyte}], { + ...options, + maxResourceBytes: 17, + }), + [{resourceKey: 'app', content: multibyte}], + ); + assertArtifactError( + {resources}, + [{resourceKey: 'app', content: multibyte}], + 'resourceArtifacts', + 'Pack App artifact exceeds size limit', + {...options, maxResourceBytes: 16}, + ); + assertArtifactError( + {resources}, + [{resourceKey: 'app', content: 'x'}], + 'resourceArtifacts', + 'Pack App artifact exceeds size limit', + {...options, maxResourceBytes: 0}, + ); + assert.deepEqual(validatePackResourceArtifacts({}, [], {...options, maxResourceBytes: 0}), []); + }); + + it('rejects lossy UTF-8 before parsing', () => { + for (const content of ['\ud800', '\udc00', '\ud800']) { + assertArtifactError( + {resources}, + [{resourceKey: 'app', content}], + 'resourceArtifacts', + 'Pack App artifact "app" must contain valid UTF-8 text.', + ); + } + }); + + it('requires a finite nonnegative safe-integer caller byte cap', () => { + for (const maxResourceBytes of [ + -1, + 0.5, + NaN, + Infinity, + -Infinity, + Number.MAX_SAFE_INTEGER + 1, + undefined, + '1024', + ]) { + const error = assertResourceValidationFails(() => + validatePackResourceArtifacts({}, [], {...options, maxResourceBytes} as typeof options), + ); + assert.deepEqual(error.validationErrors, [ + {path: 'maxResourceBytes', message: 'maxResourceBytes must be a nonnegative safe integer.'}, + ]); + } + const maxLimits = {...options, maxResourceBytes: Number.MAX_SAFE_INTEGER}; + assert.deepEqual(validatePackResourceArtifacts({}, [], maxLimits), []); + }); + + it('indexes HTML errors after earlier bodies and before missing-body checks', () => { + const metadata = { + resources: [ + ...resources, + {key: 'second', mimeType: 'text/html;profile=mcp-app'}, + {key: 'missing', mimeType: 'text/html;profile=mcp-app'}, + ], + }; + assertArtifactError( + metadata, + [ + {resourceKey: 'app', content}, + {resourceKey: 'second', content: 'private source'}, + ], + 'resourceArtifacts[1].content', + 'Invalid HTML: missing-doctype at line 1, column 1.', + ); + assertArtifactError( + {resources}, + [{resourceKey: 'app', content: ''}], + 'resourceArtifacts[0].content', + 'Invalid HTML: missing-doctype at line 1, column 1.', + {...options, maxResourceBytes: 0}, + ); + }); + + it('accepts resource-free legacy formulas and absent formulas without mutating metadata', () => { + for (const metadata of [{}, {formulas: {Namespace: []}}, {resources: [], formulas: {Namespace: []}}]) { + const original = deepCopy(metadata); + assert.deepEqual(validatePackResourceArtifacts(metadata, [], options), []); + assert.deepEqual(metadata, original); + assertArtifactError( + metadata, + [{resourceKey: 'app', content}], + 'resourceArtifacts', + 'Pack App artifact resource key "app" is not declared in metadata.resources.', + ); + } + assert.deepEqual( + validatePackResourceArtifacts({version: false, resources}, [{resourceKey: 'app', content}], options), + [{resourceKey: 'app', content}], + ); + const error = assertResourceValidationFails(() => + validatePackResourceArtifacts({resources, formulas: {Namespace: []}}, [{resourceKey: 'app', content}], options), + ); + assert.deepEqual(error.validationErrors, [ + {path: 'formulas', message: 'Invalid input: expected array, received object'}, + {path: 'resources[0]', message: 'Invalid input: expected never, received object'}, + ]); + }); + + it('shares duplicate descriptor and undeclared reference errors with full metadata validation', async () => { + for (const fragment of [ + {resources: [...resources, ...resources]}, + {formulas: [{...createFakePackFormulaMetadata(), ui: {resourceKey: 'missing'}}]}, + ]) { + const metadata = {...createFakePackVersionMetadata(), formulaNamespace: 'Resources', ...fragment}; + const fullError = (await testHelper.willBeRejectedWith( + validatePackVersionMetadata(metadata, undefined), + /Pack metadata failed validation/, + )) as PackMetadataValidationError; + const resourceError = assertResourceValidationFails(() => validatePackResourceArtifacts(metadata, [], options)); + assert.deepEqual(resourceError.validationErrors, fullError.validationErrors); + } + }); + + it('rejects malformed resource metadata before artifact errors', () => { + for (const [metadata, path] of [ + [{resources: [{key: 'app'}]}, 'resources[0].mimeType'], + [{resources: [{key: 'app', mimeType: 'text/html'}]}, 'resources[0].mimeType'], + [{resources: [{...resources[0], extra: true}]}, 'resources[0]'], + [{resources: [{...resources[0], key: '../escape'}]}, 'resources[0].key'], + [{formulas: [{ui: {}}]}, 'formulas[0].ui.resourceKey'], + [{formulas: [{ui: {resourceKey: 'with space'}}]}, 'formulas[0].ui.resourceKey'], + [{formulas: [null]}, 'formulas[0]'], + [null, ''], + ] as const) { + const error = assertResourceValidationFails(() => validatePackResourceArtifacts(metadata, null, options)); + assert.equal(ensureExists(error.validationErrors)[0].path, path); + } + }); + + it('validates the entire strict artifact shape before checking bodies', () => { + for (const [artifacts, path] of [ + [null, 'resourceArtifacts'], + [{}, 'resourceArtifacts'], + [[{resourceKey: 'app'}], 'resourceArtifacts[0].content'], + [[{resourceKey: 1, content}], 'resourceArtifacts[0].resourceKey'], + [[{resourceKey: 'app', content: 1}], 'resourceArtifacts[0].content'], + [[{resourceKey: 'app', content, mimeType: 'text/html'}], 'resourceArtifacts[0]'], + [ + [ + {resourceKey: 'unknown', content: ''}, + {resourceKey: 'app', content: 1}, + ], + 'resourceArtifacts[1].content', + ], + ] as const) { + const error = assertResourceValidationFails(() => validatePackResourceArtifacts({resources}, artifacts, options)); + assert.equal(ensureExists(error.validationErrors)[0].path, path); + } + }); + + it('returns plain bodies in artifact order and preserves executable multibyte HTML', () => { + const executable = + '' + + ''; + const metadata = {resources: [...resources, {key: 'second', mimeType: 'text/html;profile=mcp-app'}]}; + const artifacts = [ + {resourceKey: 'second', content: executable}, + {resourceKey: 'app', content}, + ]; + assert.deepEqual(validatePackResourceArtifacts(metadata, artifacts, options), artifacts); + assertArtifactError( + {resources: [...resources, {key: 'second', mimeType: 'text/html;profile=mcp-app'}]}, + [], + 'resourceArtifacts', + 'Missing Pack App artifact for resource key "app".', + ); + assertArtifactError( + {resources}, + [{resourceKey: 'app', content: '\ud800'}], + 'resourceArtifacts', + 'Pack App artifact exceeds size limit', + {...options, maxResourceBytes: 0}, + ); + }); +}); diff --git a/testing/upload_validation.ts b/testing/upload_validation.ts index af59b9a41..7ff8ab5ca 100644 --- a/testing/upload_validation.ts +++ b/testing/upload_validation.ts @@ -3,6 +3,7 @@ import type {AWSAssumeRoleAuthentication} from '../types'; import type {AdminAuthentication} from '../types'; import type {AdminAuthenticationTypes} from '../types'; import type {AgentDefinition} from '../types'; +import type {AgentRoutineDefinition} from '../types'; import type {AgentTool} from '../types'; import {AllPrecannedDates} from '../api_types'; import type {ArraySchema} from '../schema'; @@ -106,6 +107,9 @@ import {OptionsType} from '../api_types'; import {PackCategory} from '../types'; import type {PackFormatMetadata} from '../compiled_types'; import type {PackFormulaMetadata} from '../api'; +import type {PackFormulaUi} from '../api'; +import type {PackResource} from '../compiled_types'; +import type {PackResourceArtifact} from '../compiled_types'; import type {PackTool} from '../types'; import type {PackVersionDefinition} from '..'; import type {PackVersionMetadata} from '../compiled_types'; @@ -180,6 +184,7 @@ import {maybeSchemaOptionsValue} from '../schema'; import {maybeUnwrapArraySchema} from '../schema'; import {normalizePropertyValuePathIntoSchemaPath} from '../schema'; import {objectSchemaHelper} from '../helpers/migration'; +import {parse} from 'parse5'; import semver from 'semver'; import {unwrappedSchemaSupportsOptions} from '../schema'; import {validateRRuleString} from './rrule_validation'; @@ -199,8 +204,9 @@ const numberChar = String.raw`\p{N}`; const wordChar = String.raw`${letterChar}${numberChar}_`; const regexLetterChar = String.raw`[${letterChar}]`; const regexWordChar = String.raw`[${wordChar}]`; -const regexFormulaNameStr = String.raw`^${regexLetterChar}(?:${regexWordChar}+)?$`; -const regexFormulaName = new RegExp(regexFormulaNameStr, 'u'); +const regexBuildingBlockNameStr = String.raw`^${regexLetterChar}(?:${regexWordChar}+)?$`; +const regexFormulaName = new RegExp(regexBuildingBlockNameStr, 'u'); +const regexResourceName = new RegExp(regexBuildingBlockNameStr, 'u'); // This is currently the same as the tokenizer's restrictions except stricter // because we don't allow leading underscores. const regexParameterName = regexFormulaName; @@ -229,6 +235,7 @@ export const Limits = { PermissionsBatchSize: 5000, PromptLength: 20000, RRuleStringLength: 512, + RoutineNameLength: 80, SuggestedPromptText: 500, UpdateBatchSize: 1000, FilterableProperties: 5, @@ -251,6 +258,177 @@ export class PackMetadataValidationError extends Error { } } +const resourceKeySchema = z + .string() + .max(Limits.BuildingBlockName) + .regex( + regexResourceName, + 'Resource keys must start with a letter and contain only letters, numbers, and underscores.', + ); +const resourceDescriptorSchema = z.strictObject({ + key: resourceKeySchema, + mimeType: z.literal('text/html;profile=mcp-app'), +}); +const resourceListSchema = z.array(resourceDescriptorSchema).optional(); +const topLevelFormulaUiSchema = z.object({ui: z.object({resourceKey: resourceKeySchema}).optional()}); + +interface PackResourceMetadata { + resources?: PackResource[]; + formulas?: Array<{ui?: PackFormulaUi}>; +} + +function validateResourceReferences(data: PackResourceMetadata, context: z.RefinementCtx) { + const resourceKeys = new Set(); + const normalizedResourceKeys = new Set(); + (data.resources || []).forEach((resource, i) => { + const normalizedKey = resource.key.toUpperCase(); + if (normalizedResourceKeys.has(normalizedKey)) { + context.addIssue({ + code: 'custom', + path: ['resources', i, 'key'], + message: `Resource keys must be unique. Found duplicate key "${resource.key}".`, + }); + } + normalizedResourceKeys.add(normalizedKey); + resourceKeys.add(resource.key); + }); + (data.formulas || []).forEach((formula, i) => { + if (formula.ui !== undefined && !resourceKeys.has(formula.ui.resourceKey)) { + context.addIssue({ + code: 'custom', + path: ['formulas', i, 'ui', 'resourceKey'], + message: `Formula references undeclared resource "${formula.ui.resourceKey}".`, + }); + } + }); +} + +const resourceMetadataSchema = z.union([ + z + .object({ + resources: resourceListSchema, + formulas: z.array(topLevelFormulaUiSchema).optional().default([]), + }) + .superRefine(validateResourceReferences), + z + .object({ + resources: z.array(z.never()).optional(), + formulas: z.record(z.string(), z.unknown()).optional(), + }) + .transform(metadata => ({...metadata, formulas: []})), +]); +const resourceArtifactsSchema = z.array(z.strictObject({resourceKey: z.string(), content: z.string()})); + +/** @hidden */ +export function validatePackResourceArtifacts( + metadata: unknown, + artifacts: unknown, + options: {maxResourceBytes: number; maxResourceCount: number}, +): PackResourceArtifact[] { + const validatedMetadata = resourceMetadataSchema.safeParse(metadata); + if (!validatedMetadata.success) { + throw new PackMetadataValidationError( + 'Pack App resource metadata failed validation.', + validatedMetadata.error, + validatedMetadata.error.issues.flatMap(issue => zodErrorDetailToValidationError(issue)), + ); + } + const maxResourceBytes = options?.maxResourceBytes; + if (!Number.isSafeInteger(maxResourceBytes) || maxResourceBytes < 0) { + throw new PackMetadataValidationError('Pack metadata failed validation.', undefined, [ + {path: 'maxResourceBytes', message: 'maxResourceBytes must be a nonnegative safe integer.'}, + ]); + } + const maxResourceCount = options?.maxResourceCount; + if (!Number.isSafeInteger(maxResourceCount) || maxResourceCount < 0) { + throw new PackMetadataValidationError('Pack metadata failed validation.', undefined, [ + {path: 'maxResourceCount', message: 'maxResourceCount must be a nonnegative safe integer.'}, + ]); + } + if ((validatedMetadata.data.resources || []).length > maxResourceCount) { + throw new PackMetadataValidationError('Pack metadata failed validation.', undefined, [ + {path: 'resources', message: `Pack Apps may declare at most ${maxResourceCount} resources.`}, + ]); + } + const validatedArtifacts = resourceArtifactsSchema.safeParse(artifacts); + if (!validatedArtifacts.success) { + throw new PackMetadataValidationError( + 'Pack App artifacts failed validation.', + validatedArtifacts.error, + validatedArtifacts.error.issues.flatMap(issue => zodErrorDetailToValidationError(issue, ['resourceArtifacts'])), + ); + } + const resourceKeys = new Set((validatedMetadata.data.resources || []).map(resource => resource.key)); + const seen = new Set(); + function reject(message: string): never { + throw new PackMetadataValidationError('Pack metadata failed validation.', undefined, [ + {path: 'resourceArtifacts', message}, + ]); + } + for (const [i, artifact] of validatedArtifacts.data.entries()) { + const {resourceKey} = artifact; + if (!resourceKeys.has(resourceKey)) { + reject(`Pack App artifact resource key "${resourceKey}" is not declared in metadata.resources.`); + } + if (seen.has(resourceKey)) { + reject(`Pack App artifact resource keys must be unique. Found duplicate key "${resourceKey}".`); + } + seen.add(resourceKey); + const encoded = Buffer.from(artifact.content, 'utf8'); + if (encoded.byteLength > maxResourceBytes) { + reject('Pack App artifact exceeds size limit'); + } + if (encoded.toString('utf8') !== artifact.content) { + reject(`Pack App artifact "${resourceKey}" must contain valid UTF-8 text.`); + } + try { + validatePackResourceHtml(artifact.content); + } catch (error) { + if (!(error instanceof PackMetadataValidationError)) { + throw error; + } + throw new PackMetadataValidationError( + 'Pack App artifacts failed validation.', + error, + error.validationErrors?.map(detail => ({...detail, path: `resourceArtifacts[${i}].${detail.path}`})), + ); + } + } + for (const key of resourceKeys) { + if (!seen.has(key)) { + reject(`Missing Pack App artifact for resource key "${key}".`); + } + } + return validatedArtifacts.data; +} + +/** + * Reject parser diagnostics without rewriting executable HTML. + */ +function validatePackResourceHtml(content: unknown): string { + const validated = z.string().safeParse(content); + if (!validated.success) { + throw new PackMetadataValidationError( + 'Pack resource HTML failed validation', + validated.error, + validated.error.issues.flatMap(issue => zodErrorDetailToValidationError(issue, ['content'])), + ); + } + // parse5 diagnostics check partial HTML conformance, not execution safety. + parse(validated.data, { + scriptingEnabled: true, + onParseError: diagnostic => { + throw new PackMetadataValidationError('Pack resource HTML failed validation', undefined, [ + { + path: 'content', + message: `Invalid HTML: ${diagnostic.code} at line ${diagnostic.startLine}, column ${diagnostic.startCol}.`, + }, + ]); + }, + }); + return validated.data; +} + export async function validatePackVersionMetadata( metadata: Record, sdkVersion: string | undefined, @@ -2606,34 +2784,14 @@ ${endpointKey ? 'endpointKey is set' : `requiresEndpointUrl is ${requiresEndpoin whileWritingTriggerSchema, ]); - const defaultTriggersSchema: z.ZodType = z - .array(defaultTriggerSchema) - .superRefine((triggers, context) => { - const seen = new Set(); - let eventTriggers = 0; - triggers.forEach((trigger, index) => { - // An agent listens to as many events as the server stores; the other kinds are one apiece. - if (trigger.kind === DefaultTriggerKind.Event) { - eventTriggers += 1; - if (eventTriggers > Limits.MaxDefaultEventTriggers) { - context.addIssue({ - code: 'custom', - path: [index], - message: `An agent can only declare ${Limits.MaxDefaultEventTriggers} event default triggers.`, - }); - } - return; - } - if (seen.has(trigger.kind)) { - context.addIssue({ - code: 'custom', - path: [index], - message: `An agent can only declare one ${trigger.kind} default trigger.`, - }); - } - seen.add(trigger.kind); - }); - }); + const defaultTriggersSchema: z.ZodType = z.array(defaultTriggerSchema); + const routineSchema = zodCompleteStrictObject({ + name: z.string().max(Limits.RoutineNameLength).optional(), + instructions: z.string().max(Limits.PromptLength).optional(), + trigger: defaultTriggerSchema, + }).refine(routine => Boolean(routine.name?.trim() || routine.instructions?.trim()), { + message: 'A routine needs a name or instructions containing non-whitespace text.', + }); const skillEntrypointConfigSchema = zodCompleteStrictObject({ skillName: z.string(), @@ -2697,6 +2855,8 @@ ${endpointKey ? 'endpointKey is set' : `requiresEndpointUrl is ${requiresEndpoin prompt: z.string().min(1).max(Limits.SuggestedPromptText), }); + const topLevelFormulaMetadataSchema = formulaMetadataSchema.and(topLevelFormulaUiSchema); + // Make sure to call the refiners on this after removing legacyPackMetadataSchema. // (Zod doesn't let you call .extends() after you've called .refine(), so we're only refining the top-level // schema we actually use.) @@ -2728,8 +2888,9 @@ ${endpointKey ? 'endpointKey is set' : `requiresEndpointUrl is ${requiresEndpoin }), systemConnectionAuthentication: z.union(zodUnionInput(systemAuthenticationValidators)).optional(), adminAuthentications: z.array(adminAuthenticationValidator).optional(), + resources: resourceListSchema, formulas: z - .array(formulaMetadataSchema) + .array(topLevelFormulaMetadataSchema) .max(Limits.BuildingBlockCountPerType) .optional() .default([]) @@ -2817,6 +2978,7 @@ ${endpointKey ? 'endpointKey is set' : `requiresEndpointUrl is ${requiresEndpoin benchInitializationSkill: chatSkillSchema.optional(), agent: agentSchema.optional(), defaultTriggers: defaultTriggersSchema.optional(), + defaultRoutines: z.array(routineSchema).optional(), mcpServers: z .array(mcpServerSchema) .max(1) @@ -2880,6 +3042,7 @@ ${endpointKey ? 'endpointKey is set' : `requiresEndpointUrl is ${requiresEndpoin function validateFormulas(schema: z.ZodObject) { return schema + .superRefine(validateResourceReferences) .refine( (data: any) => { if (data.formulas && data.formulas.length > 0) { @@ -3472,8 +3635,40 @@ ${endpointKey ? 'endpointKey is set' : `requiresEndpointUrl is ${requiresEndpoin }); }) .superRefine((data, context) => { + const metadata = data as PackVersionMetadata; + const triggers = [ + ...(metadata.defaultTriggers ?? []).map((trigger, index) => ({trigger, path: ['defaultTriggers', index]})), + ...(metadata.defaultRoutines ?? []).map((routine, index) => ({ + trigger: routine.trigger, + path: ['defaultRoutines', index, 'trigger'], + })), + ]; + const seen = new Set(); + let eventTriggers = 0; + for (const {trigger, path} of triggers) { + if (trigger.kind === DefaultTriggerKind.Event) { + eventTriggers += 1; + if (eventTriggers > Limits.MaxDefaultEventTriggers) { + context.addIssue({ + code: 'custom', + path, + message: `An agent can only declare ${Limits.MaxDefaultEventTriggers} event default triggers.`, + }); + } + } else if (seen.has(trigger.kind)) { + context.addIssue({ + code: 'custom', + path, + message: `An agent can only declare one ${trigger.kind} default trigger.`, + }); + } + seen.add(trigger.kind); + } // The builder can't add these to an agent, but a hand-written manifest can. - if (!(data as PackVersionMetadata).agent) { + if (!metadata.agent) { + if (metadata.defaultRoutines?.length) { + context.addIssue({code: 'custom', path: ['defaultRoutines'], message: 'Only an agent can define routines.'}); + } if (((data as PackVersionMetadata).defaultTriggers || []).length) { context.addIssue({ code: 'custom', diff --git a/types.ts b/types.ts index e97f10d44..4088af263 100644 --- a/types.ts +++ b/types.ts @@ -2312,6 +2312,22 @@ export type DefaultTriggerDefinition = | ScheduleTriggerDefinition | WhileWritingTriggerDefinition; +/** + * A named action or instruction that runs when its trigger fires. + * At least one of `name` or `instructions` must contain non-whitespace text. + * + * @internal + * @hidden + */ +export interface AgentRoutineDefinition { + /** The routine's label in the agent builder. Max 80 characters. */ + name?: string; + /** Instructions added to the agent's base instructions for this routine's run. Max 20,000 characters. */ + instructions?: string; + /** The single trigger this routine runs on. Shares limits with plain default triggers. */ + trigger: DefaultTriggerDefinition; +} + /** * The definition of the contents of a Pack at a specific version. This is the * heart of the implementation of a Pack. @@ -2430,6 +2446,13 @@ export interface PackVersionDefinition { * @hidden */ defaultTriggers?: DefaultTriggerDefinition[]; + /** + * The routines this agent ships with. Authored via `sdk.newAgent().addDefaultRoutine()`. + * + * @internal + * @hidden + */ + defaultRoutines?: AgentRoutineDefinition[]; } /**