starcite 0.0.7 → 0.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../package.json","../src/store.ts","../src/up.ts","../src/index.ts"],"sourcesContent":["import {\n Starcite,\n StarciteApiError,\n StarciteIdentity,\n type TailEvent,\n} from \"@starcite/sdk\";\nimport { Command, InvalidArgumentError } from \"commander\";\nimport { createConsola } from \"consola\";\nimport { z } from \"zod\";\nimport starciteCliPackage from \"../package.json\";\nimport {\n buildSeqContextKey,\n resolveConfigDir,\n type StarciteCliConfig,\n StarciteCliStore,\n} from \"./store\";\nimport {\n type CommandRunner,\n createDefaultPrompt,\n DEFAULT_API_PORT,\n defaultCommandRunner,\n type PromptAdapter,\n parsePortOption,\n runDownWizard,\n runUpWizard,\n} from \"./up\";\n\ninterface GlobalOptions {\n baseUrl?: string;\n configDir?: string;\n token?: string;\n json: boolean;\n}\n\ninterface ResolvedGlobalOptions {\n baseUrl: string;\n apiKey?: string;\n json: boolean;\n store: StarciteCliStore;\n}\n\nexport interface LoggerLike {\n info(message: string): void;\n error(message: string): void;\n}\n\ninterface StdoutLike {\n write(message: string): void;\n}\n\ninterface CliDependencies {\n createClient?: (baseUrl: string, apiKey?: string) => Starcite;\n logger?: LoggerLike;\n stdout?: StdoutLike;\n prompt?: PromptAdapter;\n runCommand?: CommandRunner;\n}\n\ntype CliJsonObject = Record<string, unknown>;\n\nconst defaultLogger: LoggerLike = createConsola();\nconst defaultStdout: StdoutLike = {\n write(message: string) {\n process.stdout.write(message);\n },\n};\nconst cliVersion = starciteCliPackage.version;\n\nconst nonNegativeIntegerSchema = z.coerce.number().int().nonnegative();\nconst positiveIntegerSchema = z.coerce.number().int().positive();\nconst jsonObjectSchema = z.record(z.unknown());\nconst GlobalOptionsSchema = z.object({\n baseUrl: z.string().optional(),\n configDir: z.string().optional(),\n token: z.string().optional(),\n json: z.boolean().optional().default(false),\n});\nconst TRAILING_SLASHES_REGEX = /\\/+$/;\nconst DEFAULT_TAIL_BATCH_SIZE = 256;\nconst DEFAULT_CREATE_AGENT_ID = \"starcite-cli\";\n\ntype ConfigSetKey = \"endpoint\" | \"producer-id\" | \"api-key\";\n\ninterface AppendCommandOptions {\n agent?: string;\n text?: string;\n type: string;\n source?: string;\n producerId?: string;\n producerSeq?: number;\n actor?: string;\n payload?: string;\n metadata?: string;\n refs?: string;\n idempotencyKey?: string;\n expectedSeq?: number;\n}\n\ntype ResolvedAppendMode =\n | { kind: \"high-level\"; agent: string; text: string }\n | { kind: \"raw\"; actor: string; payload: string };\n\nfunction parseNonNegativeInteger(value: string, optionName: string): number {\n const parsed = nonNegativeIntegerSchema.safeParse(value);\n\n if (!parsed.success) {\n throw new InvalidArgumentError(\n `${optionName} must be a non-negative integer`\n );\n }\n\n return parsed.data;\n}\n\nfunction parsePositiveInteger(value: string, optionName: string): number {\n const parsed = positiveIntegerSchema.safeParse(value);\n\n if (!parsed.success) {\n throw new InvalidArgumentError(`${optionName} must be a positive integer`);\n }\n\n return parsed.data;\n}\n\nfunction parsePort(value: string, optionName: string): number {\n return parsePortOption(value, optionName);\n}\n\nfunction parseEndpoint(value: string, optionName: string): string {\n const endpoint = trimString(value);\n if (!endpoint) {\n throw new InvalidArgumentError(`${optionName} cannot be empty`);\n }\n\n let parsed: URL;\n try {\n parsed = new URL(endpoint);\n } catch {\n throw new InvalidArgumentError(`${optionName} must be a valid URL`);\n }\n\n if (!(parsed.protocol === \"http:\" || parsed.protocol === \"https:\")) {\n throw new InvalidArgumentError(\n `${optionName} must use http:// or https://`\n );\n }\n\n return endpoint.replace(TRAILING_SLASHES_REGEX, \"\");\n}\n\nfunction parseConfigSetKey(value: string): ConfigSetKey {\n const normalized = value.trim().toLowerCase();\n\n if ([\"endpoint\", \"base-url\", \"base_url\"].includes(normalized)) {\n return \"endpoint\";\n }\n\n if ([\"producer-id\", \"producer_id\"].includes(normalized)) {\n return \"producer-id\";\n }\n\n if ([\"api-key\", \"api_key\"].includes(normalized)) {\n return \"api-key\";\n }\n\n throw new InvalidArgumentError(\n \"config key must be one of: endpoint, producer-id, api-key\"\n );\n}\n\nfunction parseJsonObject(value: string, optionName: string): CliJsonObject {\n let parsed: unknown;\n try {\n parsed = JSON.parse(value);\n } catch {\n throw new InvalidArgumentError(`${optionName} must be valid JSON`);\n }\n\n const result = jsonObjectSchema.safeParse(parsed);\n if (!result.success) {\n throw new InvalidArgumentError(`${optionName} must be a JSON object`);\n }\n\n return result.data;\n}\n\nfunction parseSessionMetadataFilters(value: string): Record<string, string> {\n const parsed = parseJsonObject(value, \"--metadata\");\n const filters: Record<string, string> = {};\n\n for (const [key, rawValue] of Object.entries(parsed)) {\n if (key.trim().length === 0) {\n throw new InvalidArgumentError(\"--metadata keys must be non-empty\");\n }\n\n if (typeof rawValue !== \"string\") {\n throw new InvalidArgumentError(\"--metadata values must be strings\");\n }\n\n filters[key] = rawValue;\n }\n\n return filters;\n}\n\nfunction getGlobalOptions(command: Command): GlobalOptions {\n const parsed = GlobalOptionsSchema.safeParse(command.optsWithGlobals());\n if (!parsed.success) {\n const issue = parsed.error.issues[0]?.message ?? \"invalid global options\";\n throw new InvalidArgumentError(`Failed to parse global options: ${issue}`);\n }\n\n return parsed.data;\n}\n\nfunction trimString(value?: string): string | undefined {\n const trimmed = value?.trim();\n return trimmed && trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction resolveBaseUrl(\n config: StarciteCliConfig,\n options: GlobalOptions\n): string {\n const defaultBaseUrl = `http://localhost:${DEFAULT_API_PORT}`;\n return (\n trimString(options.baseUrl) ??\n trimString(process.env.STARCITE_BASE_URL) ??\n trimString(config.baseUrl) ??\n defaultBaseUrl\n );\n}\n\nasync function resolveGlobalOptions(\n command: Command\n): Promise<ResolvedGlobalOptions> {\n const options = getGlobalOptions(command);\n const configDir = resolveConfigDir(options.configDir);\n const store = new StarciteCliStore(configDir);\n const config = await store.readConfig();\n const apiKey = trimString(options.token) ?? (await store.readApiKey());\n\n return {\n baseUrl: resolveBaseUrl(config, options),\n apiKey,\n json: options.json,\n store,\n };\n}\n\nfunction formatTailEvent(event: TailEvent): string {\n const actorLabel = event.actor.startsWith(\"agent:\")\n ? event.actor.slice(\"agent:\".length)\n : event.actor;\n const maybeText = event.payload?.text;\n\n if (typeof maybeText === \"string\") {\n return `[${actorLabel}] ${maybeText}`;\n }\n\n return `[${actorLabel}] ${JSON.stringify(event.payload)}`;\n}\n\nfunction parseJwtClaims(token: string): Record<string, unknown> | undefined {\n const parts = token.split(\".\");\n if (parts.length < 2) {\n return undefined;\n }\n\n const payload = parts[1];\n if (!payload) {\n return undefined;\n }\n\n try {\n const decoded = Buffer.from(payload, \"base64url\").toString(\"utf8\");\n const parsed = JSON.parse(decoded);\n return typeof parsed === \"object\" && parsed !== null\n ? (parsed as Record<string, unknown>)\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction tokenTenantId(token: string | undefined): string | undefined {\n if (!token) {\n return undefined;\n }\n\n const claims = parseJwtClaims(token);\n const tenantId = claims?.tenant_id;\n if (typeof tenantId !== \"string\") {\n return undefined;\n }\n\n const trimmed = tenantId.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction tokenScopes(token: string): Set<string> {\n const claims = parseJwtClaims(token);\n if (!claims) {\n return new Set();\n }\n\n const scopes = new Set<string>();\n const scopeClaim = claims.scope;\n if (typeof scopeClaim === \"string\") {\n for (const scope of scopeClaim.split(\" \")) {\n if (scope.length > 0) {\n scopes.add(scope);\n }\n }\n }\n\n const scopesClaim = claims.scopes;\n if (Array.isArray(scopesClaim)) {\n for (const scope of scopesClaim) {\n if (typeof scope === \"string\" && scope.length > 0) {\n scopes.add(scope);\n }\n }\n }\n\n return scopes;\n}\n\nfunction shouldAutoIssueSessionToken(token: string): boolean {\n const scopes = tokenScopes(token);\n return scopes.has(\"auth:issue\");\n}\n\nfunction resolveAppendMode(options: AppendCommandOptions): ResolvedAppendMode {\n const highLevelMode =\n options.agent !== undefined || options.text !== undefined;\n const rawMode = options.actor !== undefined || options.payload !== undefined;\n\n if (highLevelMode && rawMode) {\n throw new InvalidArgumentError(\n \"Choose either high-level mode (--agent and --text) or raw mode (--actor and --payload), not both\"\n );\n }\n\n if (highLevelMode) {\n const agent = trimString(options.agent);\n const text = trimString(options.text);\n if (!(agent && text)) {\n throw new InvalidArgumentError(\n \"--agent and --text are required for high-level append mode\"\n );\n }\n\n return { kind: \"high-level\", agent, text };\n }\n\n if (rawMode) {\n const actor = trimString(options.actor);\n const payload = trimString(options.payload);\n if (!(actor && payload)) {\n throw new InvalidArgumentError(\n \"Raw append mode requires --actor and --payload, or use --agent and --text\"\n );\n }\n\n return { kind: \"raw\", actor, payload };\n }\n\n throw new InvalidArgumentError(\n \"append requires either high-level mode (--agent and --text) or raw mode (--actor and --payload)\"\n );\n}\n\nfunction toApiBaseUrlForContext(baseUrl: string): string {\n const parsed = new URL(baseUrl);\n if (!(parsed.protocol === \"http:\" || parsed.protocol === \"https:\")) {\n throw new InvalidArgumentError(\"base URL must use http:// or https://\");\n }\n\n const normalized = parsed.toString().replace(TRAILING_SLASHES_REGEX, \"\");\n return normalized.endsWith(\"/v1\") ? normalized : `${normalized}/v1`;\n}\n\nfunction writeJsonOutput(\n stdout: StdoutLike,\n value: unknown,\n pretty = false\n): void {\n const serialized = JSON.stringify(value, null, pretty ? 2 : undefined);\n if (serialized === undefined) {\n throw new Error(\"Failed to serialize JSON output\");\n }\n\n stdout.write(`${serialized}\\n`);\n}\n\nasync function resolveSession(\n client: Starcite,\n apiKey: string | undefined,\n sessionId: string\n) {\n if (!apiKey) {\n throw new InvalidArgumentError(\n \"append/tail require --token or a saved API key\"\n );\n }\n\n if (shouldAutoIssueSessionToken(apiKey)) {\n return await client.session({\n identity: resolveCreateIdentity(apiKey),\n id: sessionId,\n });\n }\n\n const session = client.session({ token: apiKey });\n if (session.id !== sessionId) {\n throw new InvalidArgumentError(\n `session token is bound to '${session.id}', expected '${sessionId}'`\n );\n }\n\n return session;\n}\n\nfunction resolveCreateIdentity(\n apiKey: string | undefined,\n agentId = DEFAULT_CREATE_AGENT_ID\n): StarciteIdentity {\n const tenantId = tokenTenantId(apiKey);\n if (!tenantId) {\n throw new InvalidArgumentError(\n \"session identity binding requires an API key with tenant_id claims\"\n );\n }\n\n return new StarciteIdentity({\n tenantId,\n id: agentId,\n type: \"agent\",\n });\n}\n\nclass StarciteCliApp {\n private readonly createClient: (baseUrl: string, apiKey?: string) => Starcite;\n private readonly logger: LoggerLike;\n private readonly stdout: StdoutLike;\n private readonly prompt: PromptAdapter;\n private readonly runCommand: CommandRunner;\n\n constructor(deps: CliDependencies = {}) {\n this.createClient =\n deps.createClient ??\n ((baseUrl: string, apiKey?: string) =>\n new Starcite({\n baseUrl,\n apiKey,\n }));\n this.logger = deps.logger ?? defaultLogger;\n this.stdout = deps.stdout ?? defaultStdout;\n this.prompt = deps.prompt ?? createDefaultPrompt();\n this.runCommand = deps.runCommand ?? defaultCommandRunner;\n }\n\n buildProgram(): Command {\n const createClient = this.createClient;\n const logger = this.logger;\n const stdout = this.stdout;\n const prompt = this.prompt;\n const runCommand = this.runCommand;\n\n const program = new Command();\n\n program\n .name(\"starcite\")\n .description(\"Starcite CLI\")\n .showHelpAfterError()\n .version(cliVersion, \"-v, --version\", \"Print current CLI version\")\n .option(\"-u, --base-url <url>\", \"Starcite API base URL\")\n .option(\"-k, --token <token>\", \"Starcite API key\")\n .option(\n \"--config-dir <path>\",\n \"Starcite CLI config directory (default: ~/.starcite)\"\n )\n .option(\"--json\", \"Output JSON\");\n\n program\n .command(\"version\")\n .description(\"Print current CLI version\")\n .action(() => {\n logger.info(cliVersion);\n });\n\n program\n .command(\"config\")\n .description(\"Manage CLI configuration\")\n .addCommand(\n new Command(\"set\")\n .description(\"Set a configuration value\")\n .argument(\"<key>\", \"endpoint | producer-id | api-key\")\n .argument(\"<value>\", \"value to store\")\n .action(async function (this: Command, key: string, value: string) {\n const { store } = await resolveGlobalOptions(this);\n const parsedKey = parseConfigSetKey(key);\n\n if (parsedKey === \"endpoint\") {\n const endpoint = parseEndpoint(value, \"endpoint\");\n await store.updateConfig({ baseUrl: endpoint });\n logger.info(`Endpoint set to ${endpoint}`);\n return;\n }\n\n if (parsedKey === \"producer-id\") {\n const producerId = trimString(value);\n if (!producerId) {\n throw new InvalidArgumentError(\"producer-id cannot be empty\");\n }\n\n await store.updateConfig({ producerId });\n logger.info(`Producer ID set to ${producerId}`);\n return;\n }\n\n await store.saveApiKey(value);\n await store.updateConfig({ apiKey: undefined });\n logger.info(\"API key saved.\");\n })\n )\n .addCommand(\n new Command(\"show\")\n .description(\"Show current configuration\")\n .action(async function (this: Command) {\n const { baseUrl, json, store } = await resolveGlobalOptions(this);\n const config = await store.readConfig();\n const apiKey = await store.readApiKey();\n const fromEnv = trimString(process.env.STARCITE_API_KEY);\n let apiKeySource = \"unset\";\n\n if (fromEnv) {\n apiKeySource = \"env\";\n } else if (apiKey) {\n apiKeySource = \"stored\";\n }\n\n const output = {\n endpoint: config.baseUrl ?? baseUrl,\n producerId: config.producerId ?? null,\n apiKey: apiKey ? \"***\" : null,\n apiKeySource,\n configDir: store.directory,\n };\n\n if (json) {\n writeJsonOutput(stdout, output, true);\n return;\n }\n\n logger.info(JSON.stringify(output, null, 2));\n })\n );\n\n program\n .command(\"sessions\")\n .description(\"Manage sessions\")\n .addCommand(\n new Command(\"list\")\n .description(\"List sessions\")\n .option(\"--limit <count>\", \"Maximum sessions to return\", (value) =>\n parsePositiveInteger(value, \"--limit\")\n )\n .option(\"--cursor <cursor>\", \"Pagination cursor\")\n .option(\"--metadata <json>\", \"Metadata filter JSON object\")\n .action(async function (\n this: Command,\n options: {\n limit?: number;\n cursor?: string;\n metadata?: string;\n }\n ) {\n const resolved = await resolveGlobalOptions(this);\n const { json } = resolved;\n const client = resolved.apiKey\n ? createClient(resolved.baseUrl, resolved.apiKey)\n : createClient(resolved.baseUrl);\n\n const metadata = options.metadata\n ? parseSessionMetadataFilters(options.metadata)\n : undefined;\n\n const cursor = options.cursor?.trim();\n if (options.cursor !== undefined && !cursor) {\n throw new InvalidArgumentError(\"--cursor must be non-empty\");\n }\n\n const page = await client.listSessions({\n limit: options.limit,\n cursor,\n metadata,\n });\n\n if (json) {\n writeJsonOutput(stdout, page, true);\n return;\n }\n\n if (page.sessions.length === 0) {\n logger.info(\"No sessions found.\");\n return;\n }\n\n logger.info(\"id\\ttitle\\tcreated_at\");\n for (const session of page.sessions) {\n logger.info(\n `${session.id}\\t${session.title ?? \"\"}\\t${session.created_at}`\n );\n }\n\n if (page.next_cursor) {\n logger.info(`next_cursor=${page.next_cursor}`);\n }\n })\n );\n\n program\n .command(\"up\")\n .description(\"Start local Starcite services with Docker\")\n .option(\"-y, --yes\", \"Skip confirmation prompts and use defaults\")\n .option(\"--port <port>\", \"Starcite API port\", (value) =>\n parsePort(value, \"--port\")\n )\n .option(\"--db-port <port>\", \"Postgres port\", (value) =>\n parsePort(value, \"--db-port\")\n )\n .option(\"--image <image>\", \"Override Starcite image\")\n .action(async function (\n this: Command,\n options: {\n yes?: boolean;\n port?: number;\n dbPort?: number;\n image?: string;\n }\n ) {\n const { baseUrl, store } = await resolveGlobalOptions(this);\n await runUpWizard({\n baseUrl,\n logger,\n options,\n prompt,\n runCommand,\n store,\n });\n });\n\n program\n .command(\"down\")\n .description(\"Stop and remove local Starcite services\")\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .option(\"--no-volumes\", \"Keep Postgres volume data\")\n .action(async function (\n this: Command,\n options: { yes?: boolean; volumes?: boolean }\n ) {\n const { store } = await resolveGlobalOptions(this);\n await runDownWizard({\n logger,\n options,\n prompt,\n runCommand,\n store,\n });\n });\n\n program\n .command(\"create\")\n .description(\"Create a session\")\n .option(\"--id <id>\", \"Session ID\")\n .option(\"--title <title>\", \"Session title\")\n .option(\"--metadata <json>\", \"Session metadata JSON object\")\n .action(async function (\n this: Command,\n options: {\n id?: string;\n title?: string;\n metadata?: string;\n }\n ) {\n const resolved = await resolveGlobalOptions(this);\n const { json } = resolved;\n const client = resolved.apiKey\n ? createClient(resolved.baseUrl, resolved.apiKey)\n : createClient(resolved.baseUrl);\n const metadata = options.metadata\n ? parseJsonObject(options.metadata, \"--metadata\")\n : undefined;\n const session = await client.session({\n identity: resolveCreateIdentity(resolved.apiKey),\n id: options.id,\n title: options.title,\n metadata,\n });\n\n if (json) {\n writeJsonOutput(stdout, session.record ?? { id: session.id }, true);\n return;\n }\n\n logger.info(session.id);\n });\n\n program\n .command(\"append <sessionId>\")\n .description(\"Append an event\")\n .option(\"--agent <agent>\", \"Agent name (high-level mode)\")\n .option(\"--text <text>\", \"Text content (high-level mode)\")\n .option(\"--type <type>\", \"Event type\", \"content\")\n .option(\"--source <source>\", \"Event source\")\n .option(\n \"--producer-id <id>\",\n \"Producer identity (auto-generated if omitted)\"\n )\n .option(\n \"--producer-seq <seq>\",\n \"Producer sequence (defaults to persisted state, starting at 1)\",\n (value) => parsePositiveInteger(value, \"--producer-seq\")\n )\n .option(\"--actor <actor>\", \"Raw actor field (raw mode)\")\n .option(\"--payload <json>\", \"Raw payload JSON object (raw mode)\")\n .option(\"--metadata <json>\", \"Event metadata JSON object\")\n .option(\"--refs <json>\", \"Event refs JSON object\")\n .option(\"--idempotency-key <key>\", \"Idempotency key\")\n .option(\"--expected-seq <seq>\", \"Expected sequence\", (value) =>\n parseNonNegativeInteger(value, \"--expected-seq\")\n )\n .action(async function (\n this: Command,\n sessionId: string,\n options: AppendCommandOptions\n ) {\n const { baseUrl, apiKey, json, store } =\n await resolveGlobalOptions(this);\n const client = apiKey\n ? createClient(baseUrl, apiKey)\n : createClient(baseUrl);\n\n const metadata = options.metadata\n ? parseJsonObject(options.metadata, \"--metadata\")\n : undefined;\n const refs = options.refs\n ? parseJsonObject(options.refs, \"--refs\")\n : undefined;\n const mode = resolveAppendMode(options);\n const session =\n mode.kind === \"high-level\" &&\n apiKey !== undefined &&\n shouldAutoIssueSessionToken(apiKey)\n ? await client.session({\n identity: resolveCreateIdentity(apiKey, mode.agent),\n id: sessionId,\n })\n : await resolveSession(client, apiKey, sessionId);\n\n const response =\n mode.kind === \"high-level\"\n ? await session.append({\n type: options.type,\n text: mode.text,\n source: options.source,\n metadata,\n refs,\n idempotencyKey: options.idempotencyKey,\n expectedSeq: options.expectedSeq,\n })\n : await store.withStateLock(async () => {\n const producerId = await store.resolveProducerId(\n options.producerId\n );\n const normalizedBaseUrl = toApiBaseUrlForContext(baseUrl);\n const contextKey = buildSeqContextKey(\n normalizedBaseUrl,\n sessionId,\n producerId\n );\n const producerSeq =\n options.producerSeq ?? (await store.readNextSeq(contextKey));\n const appendResponse = await session.appendRaw({\n type: options.type,\n payload: parseJsonObject(mode.payload, \"--payload\"),\n actor: mode.actor,\n producer_id: producerId,\n producer_seq: producerSeq,\n source: options.source,\n metadata,\n refs,\n idempotency_key: options.idempotencyKey,\n expected_seq: options.expectedSeq,\n });\n\n await store.bumpNextSeq(contextKey, producerSeq);\n return appendResponse;\n });\n\n if (json) {\n writeJsonOutput(stdout, response, true);\n return;\n }\n\n logger.info(`seq=${response.seq} deduped=${response.deduped}`);\n });\n\n program\n .command(\"tail <sessionId>\")\n .description(\"Tail events from a session\")\n .option(\"--cursor <cursor>\", \"Replay cursor\", (value) =>\n parseNonNegativeInteger(value, \"--cursor\")\n )\n .option(\"--agent <agent>\", \"Filter by agent name\")\n .option(\"--limit <count>\", \"Stop after N events\", (value) =>\n parseNonNegativeInteger(value, \"--limit\")\n )\n .option(\"--no-follow\", \"Exit after replaying stored events\")\n .action(async function (\n this: Command,\n sessionId: string,\n options: {\n cursor?: number;\n agent?: string;\n limit?: number;\n follow: boolean;\n }\n ) {\n const { baseUrl, apiKey, json } = await resolveGlobalOptions(this);\n const client = apiKey\n ? createClient(baseUrl, apiKey)\n : createClient(baseUrl);\n const session = await resolveSession(client, apiKey, sessionId);\n\n const abortController = new AbortController();\n const onSigint = () => {\n abortController.abort();\n };\n\n process.once(\"SIGINT\", onSigint);\n\n try {\n let emitted = 0;\n\n for await (const { event } of session.tail({\n cursor: options.cursor ?? 0,\n batchSize: DEFAULT_TAIL_BATCH_SIZE,\n agent: options.agent,\n follow: options.follow,\n signal: abortController.signal,\n })) {\n if (options.limit !== undefined && emitted >= options.limit) {\n abortController.abort();\n break;\n }\n\n if (json) {\n writeJsonOutput(stdout, event);\n } else {\n logger.info(formatTailEvent(event));\n }\n\n emitted += 1;\n\n if (options.limit !== undefined && emitted >= options.limit) {\n abortController.abort();\n }\n }\n } finally {\n process.removeListener(\"SIGINT\", onSigint);\n }\n });\n\n return program;\n }\n\n async run(argv = process.argv): Promise<void> {\n const program = this.buildProgram();\n\n try {\n await program.parseAsync(argv);\n } catch (error) {\n if (error instanceof StarciteApiError) {\n this.logger.error(`${error.code} (${error.status}): ${error.message}`);\n process.exitCode = 1;\n return;\n }\n\n if (error instanceof Error) {\n this.logger.error(error.message);\n process.exitCode = 1;\n return;\n }\n\n this.logger.error(\"Unknown error\");\n process.exitCode = 1;\n }\n }\n}\n\nexport function buildProgram(deps: CliDependencies = {}): Command {\n return new StarciteCliApp(deps).buildProgram();\n}\n\nexport async function run(\n argv = process.argv,\n deps: CliDependencies = {}\n): Promise<void> {\n await new StarciteCliApp(deps).run(argv);\n}\n","{\n \"name\": \"starcite\",\n \"version\": \"0.0.7\",\n \"description\": \"CLI for Starcite\",\n \"license\": \"Apache-2.0\",\n \"homepage\": \"https://starcite.ai\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/fastpaca/starcite-clients.git\",\n \"directory\": \"packages/starcite-cli\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/fastpaca/starcite-clients/issues\"\n },\n \"keywords\": [\n \"starcite\",\n \"ai\",\n \"sessions\",\n \"event-log\",\n \"cli\"\n ],\n \"type\": \"module\",\n \"bin\": {\n \"starcite\": \"./dist/index.js\"\n },\n \"files\": [\n \"dist\"\n ],\n \"scripts\": {\n \"clean\": \"rm -rf dist\",\n \"build\": \"tsup\",\n \"dev\": \"bun run src/index.ts\",\n \"compile\": \"bun run --cwd ../typescript-sdk build && bun build --compile src/index.ts --outfile dist/starcite\",\n \"test\": \"vitest run && bun run test:dist\",\n \"test:live\": \"vitest run test/live.api.integration.test.ts\",\n \"typecheck\": \"tsc -p tsconfig.json --noEmit\",\n \"prepublishOnly\": \"bun run clean && bun run build\",\n \"publish:dry\": \"bun publish --dry-run --access public\",\n \"test:dist\": \"bun run --cwd ../typescript-sdk build && bun run clean && bun run build && node dist/index.js --help > /dev/null\",\n \"lint\": \"ultracite check src test package.json tsconfig.json tsup.config.ts vitest.config.ts README.md\",\n \"format\": \"ultracite fix src test package.json tsconfig.json tsup.config.ts vitest.config.ts README.md\",\n \"check\": \"bun run lint && bun run typecheck && bun run test\"\n },\n \"dependencies\": {\n \"@clack/prompts\": \"^1.0.1\",\n \"@starcite/sdk\": \"^0.0.7\",\n \"commander\": \"^13.1.0\",\n \"conf\": \"^15.1.0\",\n \"consola\": \"^3.4.2\",\n \"cosmiconfig\": \"^9.0.0\",\n \"proper-lockfile\": \"^4.1.2\",\n \"toml\": \"^3.0.0\",\n \"zod\": \"^3.25.76\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^22.15.30\",\n \"@types/proper-lockfile\": \"^4.1.4\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"^5.8.3\",\n \"vitest\": \"^2.1.9\"\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { homedir, hostname } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport Conf from \"conf\";\nimport { cosmiconfig, defaultLoaders } from \"cosmiconfig\";\nimport { lock } from \"proper-lockfile\";\nimport { parse as parseToml } from \"toml\";\nimport { z } from \"zod\";\n\nconst DEFAULT_CONFIG_DIRECTORY_NAME = \".starcite\";\nconst CONFIG_JSON_FILENAME = \"config.json\";\nconst CONFIG_TOML_FILENAME = \"config.toml\";\nconst CREDENTIALS_FILENAME = \"credentials\";\nconst IDENTITY_FILENAME = \"identity\";\nconst STATE_FILENAME = \"state\";\nconst STATE_LOCK_FILENAME = \".state.lock\";\nconst TILDE_PREFIX_REGEX = /^~(?=\\/|$)/;\n\nconst ConfigFileSchema = z\n .object({\n baseUrl: z.string().optional(),\n base_url: z.string().optional(),\n producerId: z.string().optional(),\n producer_id: z.string().optional(),\n apiKey: z.string().optional(),\n api_key: z.string().optional(),\n })\n .passthrough();\n\nconst IdentityFileSchema = z.object({\n producerId: z.string().trim().min(1),\n hostname: z.string().trim().min(1),\n uuid: z.string().uuid(),\n createdAt: z.string(),\n});\n\nconst StateFileSchema = z.object({\n nextSeqByContext: z.record(z.number().int().positive()).default({}),\n});\n\nconst CredentialsFileSchema = z.object({\n apiKey: z.string().trim().min(1).optional(),\n});\n\ntype IdentityFile = z.infer<typeof IdentityFileSchema>;\ntype StateFile = z.infer<typeof StateFileSchema>;\ntype CredentialsFile = z.infer<typeof CredentialsFileSchema>;\n\nexport interface StarciteCliConfig {\n baseUrl?: string;\n producerId?: string;\n apiKey?: string;\n}\n\nfunction trimString(value?: string): string | undefined {\n const trimmed = value?.trim();\n return trimmed && trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction normalizeConfig(input: unknown): StarciteCliConfig {\n const parsed = ConfigFileSchema.safeParse(input);\n\n if (!parsed.success) {\n return {};\n }\n\n return {\n baseUrl: trimString(parsed.data.baseUrl ?? parsed.data.base_url),\n producerId: trimString(parsed.data.producerId ?? parsed.data.producer_id),\n apiKey: trimString(parsed.data.apiKey ?? parsed.data.api_key),\n };\n}\n\nfunction defaultConfigDirectory(): string {\n const home = homedir();\n if (home.trim().length > 0) {\n return join(home, DEFAULT_CONFIG_DIRECTORY_NAME);\n }\n\n return resolve(DEFAULT_CONFIG_DIRECTORY_NAME);\n}\n\nexport function resolveConfigDir(input?: string): string {\n const configured = trimString(input) ?? trimString(process.env.STARCITE_HOME);\n const withTilde = configured?.startsWith(\"~\")\n ? configured.replace(TILDE_PREFIX_REGEX, homedir())\n : configured;\n\n return resolve(withTilde ?? defaultConfigDirectory());\n}\n\nexport function buildSeqContextKey(\n baseUrl: string,\n sessionId: string,\n producerId: string\n): string {\n return `${baseUrl}::${sessionId}::${producerId}`;\n}\n\nexport class StarciteCliStore {\n readonly directory: string;\n private readonly lockPath: string;\n private readonly configExplorer = cosmiconfig(\"starcite\", {\n cache: false,\n searchStrategy: \"none\",\n searchPlaces: [CONFIG_JSON_FILENAME, CONFIG_TOML_FILENAME],\n loaders: {\n ...defaultLoaders,\n \".toml\": (_filepath, content) => parseToml(content) as unknown,\n },\n });\n private readonly identityStore: Conf<IdentityFile>;\n private readonly credentialsStore: Conf<CredentialsFile>;\n private readonly stateStore: Conf<StateFile>;\n\n constructor(directory: string) {\n this.directory = directory;\n this.lockPath = join(directory, STATE_LOCK_FILENAME);\n this.identityStore = new Conf<IdentityFile>({\n cwd: directory,\n clearInvalidConfig: true,\n configName: IDENTITY_FILENAME,\n fileExtension: \"json\",\n });\n this.credentialsStore = new Conf<CredentialsFile>({\n cwd: directory,\n clearInvalidConfig: true,\n configName: CREDENTIALS_FILENAME,\n fileExtension: \"json\",\n defaults: {},\n });\n this.stateStore = new Conf<StateFile>({\n cwd: directory,\n clearInvalidConfig: true,\n configName: STATE_FILENAME,\n fileExtension: \"json\",\n defaults: { nextSeqByContext: {} },\n });\n }\n\n async readConfig(): Promise<StarciteCliConfig> {\n await this.ensureConfigDirectory();\n const result = await this.configExplorer.search(this.directory);\n\n if (!result) {\n return {};\n }\n\n return normalizeConfig(result.config);\n }\n\n async writeConfig(config: StarciteCliConfig): Promise<void> {\n await this.ensureConfigDirectory();\n\n const normalized = normalizeConfig(config);\n const serialized: StarciteCliConfig = {};\n\n if (normalized.baseUrl) {\n serialized.baseUrl = normalized.baseUrl;\n }\n\n if (normalized.producerId) {\n serialized.producerId = normalized.producerId;\n }\n\n if (normalized.apiKey) {\n serialized.apiKey = normalized.apiKey;\n }\n\n await writeFile(\n join(this.directory, CONFIG_JSON_FILENAME),\n `${JSON.stringify(serialized, null, 2)}\\n`,\n \"utf8\"\n );\n }\n\n async updateConfig(\n patch: Partial<StarciteCliConfig>\n ): Promise<StarciteCliConfig> {\n const current = await this.readConfig();\n const merged = normalizeConfig({\n ...current,\n ...patch,\n });\n\n await this.writeConfig(merged);\n return merged;\n }\n\n async readApiKey(): Promise<string | undefined> {\n const fromEnv = trimString(process.env.STARCITE_API_KEY);\n if (fromEnv) {\n return fromEnv;\n }\n\n const parsed = CredentialsFileSchema.safeParse(this.credentialsStore.store);\n const fromCredentials = parsed.success\n ? trimString(parsed.data.apiKey)\n : undefined;\n if (fromCredentials) {\n return fromCredentials;\n }\n\n const config = await this.readConfig();\n return trimString(config.apiKey);\n }\n\n async saveApiKey(apiKey: string): Promise<void> {\n await this.ensureConfigDirectory();\n\n const normalized = trimString(apiKey);\n if (!normalized) {\n throw new Error(\"API key cannot be empty\");\n }\n\n this.credentialsStore.set(\"apiKey\", normalized);\n }\n\n async clearApiKey(): Promise<void> {\n await this.ensureConfigDirectory();\n this.credentialsStore.delete(\"apiKey\");\n }\n\n async resolveProducerId(explicitProducerId?: string): Promise<string> {\n const explicit = trimString(explicitProducerId);\n if (explicit) {\n return explicit;\n }\n\n const fromEnv = trimString(process.env.STARCITE_PRODUCER_ID);\n if (fromEnv) {\n return fromEnv;\n }\n\n const config = await this.readConfig();\n const fromConfig = trimString(config.producerId);\n if (fromConfig) {\n return fromConfig;\n }\n\n const identity = await this.readOrCreateIdentity();\n return identity.producerId;\n }\n\n async withStateLock<T>(action: () => Promise<T>): Promise<T> {\n await this.ensureConfigDirectory();\n const release = await lock(this.directory, {\n lockfilePath: this.lockPath,\n realpath: false,\n retries: {\n retries: 50,\n minTimeout: 20,\n maxTimeout: 60,\n },\n });\n\n try {\n return await action();\n } finally {\n await release();\n }\n }\n\n readNextSeq(contextKey: string): Promise<number> {\n const state = this.readState();\n return Promise.resolve(state.nextSeqByContext[contextKey] ?? 1);\n }\n\n bumpNextSeq(contextKey: string, usedSeq: number): Promise<void> {\n const state = this.readState();\n const nextSeqByContext = {\n ...state.nextSeqByContext,\n [contextKey]: Math.max(\n state.nextSeqByContext[contextKey] ?? 1,\n usedSeq + 1\n ),\n };\n\n this.stateStore.set(\"nextSeqByContext\", nextSeqByContext);\n return Promise.resolve();\n }\n\n private readState(): StateFile {\n const parsed = StateFileSchema.safeParse(this.stateStore.store);\n\n if (parsed.success) {\n return parsed.data;\n }\n\n this.stateStore.clear();\n return { nextSeqByContext: {} };\n }\n\n private readOrCreateIdentity(): IdentityFile {\n const parsed = IdentityFileSchema.safeParse(this.identityStore.store);\n if (parsed.success) {\n return parsed.data;\n }\n\n const host = hostname();\n const uuid = randomUUID();\n const identity: IdentityFile = {\n producerId: `cli:${host}:${uuid}`,\n hostname: host,\n uuid,\n createdAt: new Date().toISOString(),\n };\n\n this.identityStore.store = identity;\n return identity;\n }\n\n private async ensureConfigDirectory(): Promise<void> {\n await mkdir(this.directory, { recursive: true });\n }\n}\n","import { spawn } from \"node:child_process\";\nimport { mkdir, stat, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport {\n cancel as clackCancel,\n confirm as clackConfirm,\n password as clackPassword,\n text as clackText,\n isCancel,\n} from \"@clack/prompts\";\nimport type { LoggerLike } from \"./cli\";\nimport type { StarciteCliStore } from \"./store\";\n\nexport const DEFAULT_API_PORT = 45_187;\nconst DEFAULT_DB_PORT = 5433;\nconst MIN_PORT = 1;\nconst MAX_PORT = 65_535;\nconst RUNTIME_DIRECTORY_NAME = \"runtime\";\n\nconst DEFAULT_COMPOSE_FILE = `services:\n app:\n image: \\${STARCITE_IMAGE:-ghcr.io/fastpaca/starcite:latest}\n depends_on:\n db:\n condition: service_healthy\n environment:\n SECRET_KEY_BASE: \\${SECRET_KEY_BASE:-xuQnOFm6sH5Qdd7x4WJv5smuG2Xf2nG0BL8rJ4yX6HnKGeTjo6n8r5hQKsxNkZWz}\n PHX_HOST: \\${PHX_HOST:-localhost}\n PORT: 4000\n DATABASE_URL: \\${DATABASE_URL:-ecto://postgres:postgres@db:5432/starcite_dev}\n MIGRATE_ON_BOOT: \\${MIGRATE_ON_BOOT:-true}\n DNS_CLUSTER_QUERY: \\${DNS_CLUSTER_QUERY:-}\n DNS_CLUSTER_NODE_BASENAME: \\${DNS_CLUSTER_NODE_BASENAME:-starcite}\n DNS_POLL_INTERVAL_MS: \\${DNS_POLL_INTERVAL_MS:-5000}\n ports:\n - \"\\${STARCITE_API_PORT:-45187}:4000\"\n restart: unless-stopped\n\n db:\n image: postgres:15\n environment:\n POSTGRES_DB: starcite_dev\n POSTGRES_USER: postgres\n POSTGRES_PASSWORD: postgres\n healthcheck:\n test: [\"CMD\", \"pg_isready\", \"-U\", \"postgres\"]\n interval: 10s\n timeout: 5s\n retries: 5\n ports:\n - \"\\${STARCITE_DB_PORT:-5433}:5432\"\n volumes:\n - db-data:/var/lib/postgresql/data\n restart: unless-stopped\n\nvolumes:\n db-data:\n`;\n\ninterface CommandRunOptions {\n cwd?: string;\n}\n\nexport interface CommandResult {\n code: number;\n stdout: string;\n stderr: string;\n}\n\nexport type CommandRunner = (\n command: string,\n args: string[],\n options?: CommandRunOptions\n) => Promise<CommandResult>;\n\nexport interface PromptAdapter {\n confirm(message: string, defaultValue?: boolean): Promise<boolean>;\n input(message: string, defaultValue?: string): Promise<string>;\n password?(message: string): Promise<string>;\n}\n\nexport interface UpOptions {\n yes?: boolean;\n port?: number;\n dbPort?: number;\n image?: string;\n}\n\nexport interface DownOptions {\n yes?: boolean;\n volumes?: boolean;\n}\n\ninterface UpWizardInput {\n baseUrl: string;\n logger: LoggerLike;\n options: UpOptions;\n prompt: PromptAdapter;\n runCommand: CommandRunner;\n store: StarciteCliStore;\n}\n\ninterface DownWizardInput {\n logger: LoggerLike;\n options: DownOptions;\n prompt: PromptAdapter;\n runCommand: CommandRunner;\n store: StarciteCliStore;\n}\n\nfunction parsePort(value: string, optionName: string): number {\n const parsed = Number(value);\n\n if (!Number.isInteger(parsed) || parsed < MIN_PORT || parsed > MAX_PORT) {\n throw new Error(\n `${optionName} must be an integer between ${MIN_PORT} and ${MAX_PORT}`\n );\n }\n\n return parsed;\n}\n\nfunction baseUrlPort(baseUrl: string): number {\n try {\n const parsed = new URL(baseUrl);\n\n if (parsed.port) {\n return parsePort(parsed.port, \"base URL port\");\n }\n } catch {\n return DEFAULT_API_PORT;\n }\n\n return DEFAULT_API_PORT;\n}\n\nasync function ensureSuccess(\n runCommand: CommandRunner,\n command: string,\n args: string[]\n): Promise<boolean> {\n const result = await runCommand(command, args);\n return result.code === 0;\n}\n\nasync function ensureDockerReady(\n logger: LoggerLike,\n runCommand: CommandRunner\n): Promise<void> {\n const hasDocker = await ensureSuccess(runCommand, \"docker\", [\"--version\"]);\n if (!hasDocker) {\n logger.error(\"You don't have Docker installed, please install it.\");\n throw new Error(\"Docker is required to run this command.\");\n }\n\n const hasDockerCompose = await ensureSuccess(runCommand, \"docker\", [\n \"compose\",\n \"version\",\n ]);\n if (!hasDockerCompose) {\n logger.error(\n \"Docker Compose is not available. Install Docker Compose and retry.\"\n );\n throw new Error(\"Docker Compose is required to run this command.\");\n }\n\n const daemonRunning = await ensureSuccess(runCommand, \"docker\", [\"info\"]);\n if (!daemonRunning) {\n logger.error(\"Docker is installed but the daemon is not running.\");\n throw new Error(\"Start Docker and retry.\");\n }\n}\n\nasync function selectApiPort(\n baseUrl: string,\n options: UpOptions,\n prompt: PromptAdapter\n): Promise<number> {\n if (options.port !== undefined) {\n return options.port;\n }\n\n const fallbackPort = baseUrlPort(baseUrl);\n\n if (options.yes) {\n return fallbackPort;\n }\n\n while (true) {\n const answer = await prompt.input(\n \"What port do you want it on?\",\n `${fallbackPort}`\n );\n\n try {\n return parsePort(answer, \"port\");\n } catch (error) {\n if (error instanceof Error) {\n // keep asking until valid\n }\n }\n }\n}\n\nfunction runtimeDirectory(store: StarciteCliStore): string {\n return join(store.directory, RUNTIME_DIRECTORY_NAME);\n}\n\nasync function runtimeDirectoryExists(\n store: StarciteCliStore\n): Promise<boolean> {\n try {\n const result = await stat(runtimeDirectory(store));\n return result.isDirectory();\n } catch {\n return false;\n }\n}\n\nasync function writeComposeFiles(\n store: StarciteCliStore,\n options: { apiPort: number; dbPort: number; image?: string }\n): Promise<string> {\n const directory = runtimeDirectory(store);\n await mkdir(directory, { recursive: true });\n\n await writeFile(\n join(directory, \"docker-compose.yml\"),\n DEFAULT_COMPOSE_FILE,\n \"utf8\"\n );\n\n const envLines = [\n `STARCITE_API_PORT=${options.apiPort}`,\n `STARCITE_DB_PORT=${options.dbPort}`,\n ];\n\n if (options.image?.trim()) {\n envLines.push(`STARCITE_IMAGE=${options.image.trim()}`);\n }\n\n await writeFile(join(directory, \".env\"), `${envLines.join(\"\\n\")}\\n`, \"utf8\");\n return directory;\n}\n\nexport function parsePortOption(value: string, optionName: string): number {\n try {\n return parsePort(value, optionName);\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(error.message);\n }\n\n throw error;\n }\n}\n\nexport async function runUpWizard(input: UpWizardInput): Promise<void> {\n const { baseUrl, logger, options, prompt, runCommand, store } = input;\n\n await ensureDockerReady(logger, runCommand);\n\n const confirmed = options.yes\n ? true\n : await prompt.confirm(\n \"Are you sure you want to create the docker containers?\",\n true\n );\n\n if (!confirmed) {\n logger.info(\"Cancelled.\");\n return;\n }\n\n const apiPort = await selectApiPort(baseUrl, options, prompt);\n const dbPort = options.dbPort ?? DEFAULT_DB_PORT;\n const composeDirectory = await writeComposeFiles(store, {\n apiPort,\n dbPort,\n image: options.image,\n });\n\n const result = await runCommand(\"docker\", [\"compose\", \"up\", \"-d\"], {\n cwd: composeDirectory,\n });\n\n if (result.code !== 0) {\n const message =\n result.stderr || result.stdout || \"docker compose up failed\";\n throw new Error(message.trim());\n }\n\n logger.info(`Starcite is starting on http://localhost:${apiPort}`);\n logger.info(`Compose files are in ${composeDirectory}`);\n}\n\nexport async function runDownWizard(input: DownWizardInput): Promise<void> {\n const { logger, options, prompt, runCommand, store } = input;\n\n await ensureDockerReady(logger, runCommand);\n\n const hasRuntimeDirectory = await runtimeDirectoryExists(store);\n if (!hasRuntimeDirectory) {\n logger.info(\n `No Starcite runtime found at ${runtimeDirectory(\n store\n )}. Nothing to tear down.`\n );\n return;\n }\n\n const removeVolumes = options.volumes ?? true;\n const confirmed = options.yes\n ? true\n : await prompt.confirm(\n removeVolumes\n ? \"Are you sure you want to stop and delete Starcite containers and volumes?\"\n : \"Are you sure you want to stop Starcite containers?\",\n false\n );\n\n if (!confirmed) {\n logger.info(\"Cancelled.\");\n return;\n }\n\n const args = [\"compose\", \"down\", \"--remove-orphans\"];\n if (removeVolumes) {\n args.push(\"-v\");\n }\n\n const result = await runCommand(\"docker\", args, {\n cwd: runtimeDirectory(store),\n });\n\n if (result.code !== 0) {\n const message =\n result.stderr || result.stdout || \"docker compose down failed\";\n throw new Error(message.trim());\n }\n\n logger.info(\"Starcite containers stopped.\");\n if (removeVolumes) {\n logger.info(\"Starcite volumes removed.\");\n }\n}\n\nexport function createDefaultPrompt(): PromptAdapter {\n const assertInteractive = (): void => {\n if (!(process.stdin.isTTY && process.stdout.isTTY)) {\n throw new Error(\n \"Interactive mode requires a TTY. Re-run with explicit options (for example: --yes, --endpoint, --api-key).\"\n );\n }\n };\n\n return {\n async confirm(message: string, defaultValue = true): Promise<boolean> {\n assertInteractive();\n\n const answer = await clackConfirm({\n message,\n initialValue: defaultValue,\n input: process.stdin,\n output: process.stdout,\n });\n\n if (isCancel(answer)) {\n clackCancel(\"Cancelled.\");\n return false;\n }\n\n return answer;\n },\n async input(message: string, defaultValue = \"\"): Promise<string> {\n assertInteractive();\n\n const answer = await clackText({\n message,\n defaultValue,\n placeholder: defaultValue || undefined,\n input: process.stdin,\n output: process.stdout,\n });\n\n if (isCancel(answer)) {\n clackCancel(\"Cancelled.\");\n throw new Error(\"Cancelled.\");\n }\n\n const normalized = answer.trim();\n return normalized || defaultValue;\n },\n async password(message: string): Promise<string> {\n assertInteractive();\n\n const answer = await clackPassword({\n message,\n input: process.stdin,\n output: process.stdout,\n });\n\n if (isCancel(answer)) {\n clackCancel(\"Cancelled.\");\n throw new Error(\"Cancelled.\");\n }\n\n return answer.trim();\n },\n };\n}\n\nexport const defaultCommandRunner: CommandRunner = (command, args, options) =>\n new Promise((resolve) => {\n const child = spawn(command, args, {\n cwd: options?.cwd,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n let stdout = \"\";\n let stderr = \"\";\n\n child.stdout?.on(\"data\", (chunk: Buffer) => {\n stdout += chunk.toString();\n });\n\n child.stderr?.on(\"data\", (chunk: Buffer) => {\n stderr += chunk.toString();\n });\n\n child.on(\"error\", (error: NodeJS.ErrnoException) => {\n const message = error.message || \"command failed to start\";\n resolve({ code: 127, stdout, stderr: `${stderr}${message}` });\n });\n\n child.on(\"close\", (code) => {\n resolve({ code: code ?? 1, stdout, stderr });\n });\n });\n","import { run } from \"./cli\";\n\nrun();\n"],"mappings":";;;AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP,SAAS,SAAS,4BAA4B;AAC9C,SAAS,qBAAqB;AAC9B,SAAS,KAAAA,UAAS;;;ACRlB;AAAA,EACE,MAAQ;AAAA,EACR,SAAW;AAAA,EACX,aAAe;AAAA,EACf,SAAW;AAAA,EACX,UAAY;AAAA,EACZ,YAAc;AAAA,IACZ,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,WAAa;AAAA,EACf;AAAA,EACA,MAAQ;AAAA,IACN,KAAO;AAAA,EACT;AAAA,EACA,UAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,MAAQ;AAAA,EACR,KAAO;AAAA,IACL,UAAY;AAAA,EACd;AAAA,EACA,OAAS;AAAA,IACP;AAAA,EACF;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,OAAS;AAAA,IACT,KAAO;AAAA,IACP,SAAW;AAAA,IACX,MAAQ;AAAA,IACR,aAAa;AAAA,IACb,WAAa;AAAA,IACb,gBAAkB;AAAA,IAClB,eAAe;AAAA,IACf,aAAa;AAAA,IACb,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,OAAS;AAAA,EACX;AAAA,EACA,cAAgB;AAAA,IACd,kBAAkB;AAAA,IAClB,iBAAiB;AAAA,IACjB,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,SAAW;AAAA,IACX,aAAe;AAAA,IACf,mBAAmB;AAAA,IACnB,MAAQ;AAAA,IACR,KAAO;AAAA,EACT;AAAA,EACA,iBAAmB;AAAA,IACjB,eAAe;AAAA,IACf,0BAA0B;AAAA,IAC1B,MAAQ;AAAA,IACR,YAAc;AAAA,IACd,QAAU;AAAA,EACZ;AACF;;;AC7DA,SAAS,kBAAkB;AAC3B,SAAS,OAAO,iBAAiB;AACjC,SAAS,SAAS,gBAAgB;AAClC,SAAS,MAAM,eAAe;AAC9B,OAAO,UAAU;AACjB,SAAS,aAAa,sBAAsB;AAC5C,SAAS,YAAY;AACrB,SAAS,SAAS,iBAAiB;AACnC,SAAS,SAAS;AAElB,IAAM,gCAAgC;AACtC,IAAM,uBAAuB;AAC7B,IAAM,uBAAuB;AAC7B,IAAM,uBAAuB;AAC7B,IAAM,oBAAoB;AAC1B,IAAM,iBAAiB;AACvB,IAAM,sBAAsB;AAC5B,IAAM,qBAAqB;AAE3B,IAAM,mBAAmB,EACtB,OAAO;AAAA,EACN,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA,EAChC,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACjC,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,SAAS,EAAE,OAAO,EAAE,SAAS;AAC/B,CAAC,EACA,YAAY;AAEf,IAAM,qBAAqB,EAAE,OAAO;AAAA,EAClC,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC;AAAA,EACnC,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC;AAAA,EACjC,MAAM,EAAE,OAAO,EAAE,KAAK;AAAA,EACtB,WAAW,EAAE,OAAO;AACtB,CAAC;AAED,IAAM,kBAAkB,EAAE,OAAO;AAAA,EAC/B,kBAAkB,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,EAAE,QAAQ,CAAC,CAAC;AACpE,CAAC;AAED,IAAM,wBAAwB,EAAE,OAAO;AAAA,EACrC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS;AAC5C,CAAC;AAYD,SAAS,WAAW,OAAoC;AACtD,QAAM,UAAU,OAAO,KAAK;AAC5B,SAAO,WAAW,QAAQ,SAAS,IAAI,UAAU;AACnD;AAEA,SAAS,gBAAgB,OAAmC;AAC1D,QAAM,SAAS,iBAAiB,UAAU,KAAK;AAE/C,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO,CAAC;AAAA,EACV;AAEA,SAAO;AAAA,IACL,SAAS,WAAW,OAAO,KAAK,WAAW,OAAO,KAAK,QAAQ;AAAA,IAC/D,YAAY,WAAW,OAAO,KAAK,cAAc,OAAO,KAAK,WAAW;AAAA,IACxE,QAAQ,WAAW,OAAO,KAAK,UAAU,OAAO,KAAK,OAAO;AAAA,EAC9D;AACF;AAEA,SAAS,yBAAiC;AACxC,QAAM,OAAO,QAAQ;AACrB,MAAI,KAAK,KAAK,EAAE,SAAS,GAAG;AAC1B,WAAO,KAAK,MAAM,6BAA6B;AAAA,EACjD;AAEA,SAAO,QAAQ,6BAA6B;AAC9C;AAEO,SAAS,iBAAiB,OAAwB;AACvD,QAAM,aAAa,WAAW,KAAK,KAAK,WAAW,QAAQ,IAAI,aAAa;AAC5E,QAAM,YAAY,YAAY,WAAW,GAAG,IACxC,WAAW,QAAQ,oBAAoB,QAAQ,CAAC,IAChD;AAEJ,SAAO,QAAQ,aAAa,uBAAuB,CAAC;AACtD;AAEO,SAAS,mBACd,SACA,WACA,YACQ;AACR,SAAO,GAAG,OAAO,KAAK,SAAS,KAAK,UAAU;AAChD;AAEO,IAAM,mBAAN,MAAuB;AAAA,EACnB;AAAA,EACQ;AAAA,EACA,iBAAiB,YAAY,YAAY;AAAA,IACxD,OAAO;AAAA,IACP,gBAAgB;AAAA,IAChB,cAAc,CAAC,sBAAsB,oBAAoB;AAAA,IACzD,SAAS;AAAA,MACP,GAAG;AAAA,MACH,SAAS,CAAC,WAAW,YAAY,UAAU,OAAO;AAAA,IACpD;AAAA,EACF,CAAC;AAAA,EACgB;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,WAAmB;AAC7B,SAAK,YAAY;AACjB,SAAK,WAAW,KAAK,WAAW,mBAAmB;AACnD,SAAK,gBAAgB,IAAI,KAAmB;AAAA,MAC1C,KAAK;AAAA,MACL,oBAAoB;AAAA,MACpB,YAAY;AAAA,MACZ,eAAe;AAAA,IACjB,CAAC;AACD,SAAK,mBAAmB,IAAI,KAAsB;AAAA,MAChD,KAAK;AAAA,MACL,oBAAoB;AAAA,MACpB,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,UAAU,CAAC;AAAA,IACb,CAAC;AACD,SAAK,aAAa,IAAI,KAAgB;AAAA,MACpC,KAAK;AAAA,MACL,oBAAoB;AAAA,MACpB,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,UAAU,EAAE,kBAAkB,CAAC,EAAE;AAAA,IACnC,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,aAAyC;AAC7C,UAAM,KAAK,sBAAsB;AACjC,UAAM,SAAS,MAAM,KAAK,eAAe,OAAO,KAAK,SAAS;AAE9D,QAAI,CAAC,QAAQ;AACX,aAAO,CAAC;AAAA,IACV;AAEA,WAAO,gBAAgB,OAAO,MAAM;AAAA,EACtC;AAAA,EAEA,MAAM,YAAY,QAA0C;AAC1D,UAAM,KAAK,sBAAsB;AAEjC,UAAM,aAAa,gBAAgB,MAAM;AACzC,UAAM,aAAgC,CAAC;AAEvC,QAAI,WAAW,SAAS;AACtB,iBAAW,UAAU,WAAW;AAAA,IAClC;AAEA,QAAI,WAAW,YAAY;AACzB,iBAAW,aAAa,WAAW;AAAA,IACrC;AAEA,QAAI,WAAW,QAAQ;AACrB,iBAAW,SAAS,WAAW;AAAA,IACjC;AAEA,UAAM;AAAA,MACJ,KAAK,KAAK,WAAW,oBAAoB;AAAA,MACzC,GAAG,KAAK,UAAU,YAAY,MAAM,CAAC,CAAC;AAAA;AAAA,MACtC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,aACJ,OAC4B;AAC5B,UAAM,UAAU,MAAM,KAAK,WAAW;AACtC,UAAM,SAAS,gBAAgB;AAAA,MAC7B,GAAG;AAAA,MACH,GAAG;AAAA,IACL,CAAC;AAED,UAAM,KAAK,YAAY,MAAM;AAC7B,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,aAA0C;AAC9C,UAAM,UAAU,WAAW,QAAQ,IAAI,gBAAgB;AACvD,QAAI,SAAS;AACX,aAAO;AAAA,IACT;AAEA,UAAM,SAAS,sBAAsB,UAAU,KAAK,iBAAiB,KAAK;AAC1E,UAAM,kBAAkB,OAAO,UAC3B,WAAW,OAAO,KAAK,MAAM,IAC7B;AACJ,QAAI,iBAAiB;AACnB,aAAO;AAAA,IACT;AAEA,UAAM,SAAS,MAAM,KAAK,WAAW;AACrC,WAAO,WAAW,OAAO,MAAM;AAAA,EACjC;AAAA,EAEA,MAAM,WAAW,QAA+B;AAC9C,UAAM,KAAK,sBAAsB;AAEjC,UAAM,aAAa,WAAW,MAAM;AACpC,QAAI,CAAC,YAAY;AACf,YAAM,IAAI,MAAM,yBAAyB;AAAA,IAC3C;AAEA,SAAK,iBAAiB,IAAI,UAAU,UAAU;AAAA,EAChD;AAAA,EAEA,MAAM,cAA6B;AACjC,UAAM,KAAK,sBAAsB;AACjC,SAAK,iBAAiB,OAAO,QAAQ;AAAA,EACvC;AAAA,EAEA,MAAM,kBAAkB,oBAA8C;AACpE,UAAM,WAAW,WAAW,kBAAkB;AAC9C,QAAI,UAAU;AACZ,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,WAAW,QAAQ,IAAI,oBAAoB;AAC3D,QAAI,SAAS;AACX,aAAO;AAAA,IACT;AAEA,UAAM,SAAS,MAAM,KAAK,WAAW;AACrC,UAAM,aAAa,WAAW,OAAO,UAAU;AAC/C,QAAI,YAAY;AACd,aAAO;AAAA,IACT;AAEA,UAAM,WAAW,MAAM,KAAK,qBAAqB;AACjD,WAAO,SAAS;AAAA,EAClB;AAAA,EAEA,MAAM,cAAiB,QAAsC;AAC3D,UAAM,KAAK,sBAAsB;AACjC,UAAM,UAAU,MAAM,KAAK,KAAK,WAAW;AAAA,MACzC,cAAc,KAAK;AAAA,MACnB,UAAU;AAAA,MACV,SAAS;AAAA,QACP,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,YAAY;AAAA,MACd;AAAA,IACF,CAAC;AAED,QAAI;AACF,aAAO,MAAM,OAAO;AAAA,IACtB,UAAE;AACA,YAAM,QAAQ;AAAA,IAChB;AAAA,EACF;AAAA,EAEA,YAAY,YAAqC;AAC/C,UAAM,QAAQ,KAAK,UAAU;AAC7B,WAAO,QAAQ,QAAQ,MAAM,iBAAiB,UAAU,KAAK,CAAC;AAAA,EAChE;AAAA,EAEA,YAAY,YAAoB,SAAgC;AAC9D,UAAM,QAAQ,KAAK,UAAU;AAC7B,UAAM,mBAAmB;AAAA,MACvB,GAAG,MAAM;AAAA,MACT,CAAC,UAAU,GAAG,KAAK;AAAA,QACjB,MAAM,iBAAiB,UAAU,KAAK;AAAA,QACtC,UAAU;AAAA,MACZ;AAAA,IACF;AAEA,SAAK,WAAW,IAAI,oBAAoB,gBAAgB;AACxD,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAAA,EAEQ,YAAuB;AAC7B,UAAM,SAAS,gBAAgB,UAAU,KAAK,WAAW,KAAK;AAE9D,QAAI,OAAO,SAAS;AAClB,aAAO,OAAO;AAAA,IAChB;AAEA,SAAK,WAAW,MAAM;AACtB,WAAO,EAAE,kBAAkB,CAAC,EAAE;AAAA,EAChC;AAAA,EAEQ,uBAAqC;AAC3C,UAAM,SAAS,mBAAmB,UAAU,KAAK,cAAc,KAAK;AACpE,QAAI,OAAO,SAAS;AAClB,aAAO,OAAO;AAAA,IAChB;AAEA,UAAM,OAAO,SAAS;AACtB,UAAM,OAAO,WAAW;AACxB,UAAM,WAAyB;AAAA,MAC7B,YAAY,OAAO,IAAI,IAAI,IAAI;AAAA,MAC/B,UAAU;AAAA,MACV;AAAA,MACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC;AAEA,SAAK,cAAc,QAAQ;AAC3B,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,wBAAuC;AACnD,UAAM,MAAM,KAAK,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,EACjD;AACF;;;AC5TA,SAAS,aAAa;AACtB,SAAS,SAAAC,QAAO,MAAM,aAAAC,kBAAiB;AACvC,SAAS,QAAAC,aAAY;AACrB;AAAA,EACE,UAAU;AAAA,EACV,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR;AAAA,OACK;AAIA,IAAM,mBAAmB;AAChC,IAAM,kBAAkB;AACxB,IAAM,WAAW;AACjB,IAAM,WAAW;AACjB,IAAM,yBAAyB;AAE/B,IAAM,uBAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2F7B,SAAS,UAAU,OAAe,YAA4B;AAC5D,QAAM,SAAS,OAAO,KAAK;AAE3B,MAAI,CAAC,OAAO,UAAU,MAAM,KAAK,SAAS,YAAY,SAAS,UAAU;AACvE,UAAM,IAAI;AAAA,MACR,GAAG,UAAU,+BAA+B,QAAQ,QAAQ,QAAQ;AAAA,IACtE;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,YAAY,SAAyB;AAC5C,MAAI;AACF,UAAM,SAAS,IAAI,IAAI,OAAO;AAE9B,QAAI,OAAO,MAAM;AACf,aAAO,UAAU,OAAO,MAAM,eAAe;AAAA,IAC/C;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,eAAe,cACb,YACA,SACA,MACkB;AAClB,QAAM,SAAS,MAAM,WAAW,SAAS,IAAI;AAC7C,SAAO,OAAO,SAAS;AACzB;AAEA,eAAe,kBACb,QACA,YACe;AACf,QAAM,YAAY,MAAM,cAAc,YAAY,UAAU,CAAC,WAAW,CAAC;AACzE,MAAI,CAAC,WAAW;AACd,WAAO,MAAM,qDAAqD;AAClE,UAAM,IAAI,MAAM,yCAAyC;AAAA,EAC3D;AAEA,QAAM,mBAAmB,MAAM,cAAc,YAAY,UAAU;AAAA,IACjE;AAAA,IACA;AAAA,EACF,CAAC;AACD,MAAI,CAAC,kBAAkB;AACrB,WAAO;AAAA,MACL;AAAA,IACF;AACA,UAAM,IAAI,MAAM,iDAAiD;AAAA,EACnE;AAEA,QAAM,gBAAgB,MAAM,cAAc,YAAY,UAAU,CAAC,MAAM,CAAC;AACxE,MAAI,CAAC,eAAe;AAClB,WAAO,MAAM,oDAAoD;AACjE,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC3C;AACF;AAEA,eAAe,cACb,SACA,SACA,QACiB;AACjB,MAAI,QAAQ,SAAS,QAAW;AAC9B,WAAO,QAAQ;AAAA,EACjB;AAEA,QAAM,eAAe,YAAY,OAAO;AAExC,MAAI,QAAQ,KAAK;AACf,WAAO;AAAA,EACT;AAEA,SAAO,MAAM;AACX,UAAM,SAAS,MAAM,OAAO;AAAA,MAC1B;AAAA,MACA,GAAG,YAAY;AAAA,IACjB;AAEA,QAAI;AACF,aAAO,UAAU,QAAQ,MAAM;AAAA,IACjC,SAAS,OAAO;AACd,UAAI,iBAAiB,OAAO;AAAA,MAE5B;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,OAAiC;AACzD,SAAOA,MAAK,MAAM,WAAW,sBAAsB;AACrD;AAEA,eAAe,uBACb,OACkB;AAClB,MAAI;AACF,UAAM,SAAS,MAAM,KAAK,iBAAiB,KAAK,CAAC;AACjD,WAAO,OAAO,YAAY;AAAA,EAC5B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,kBACb,OACA,SACiB;AACjB,QAAM,YAAY,iBAAiB,KAAK;AACxC,QAAMF,OAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAE1C,QAAMC;AAAA,IACJC,MAAK,WAAW,oBAAoB;AAAA,IACpC;AAAA,IACA;AAAA,EACF;AAEA,QAAM,WAAW;AAAA,IACf,qBAAqB,QAAQ,OAAO;AAAA,IACpC,oBAAoB,QAAQ,MAAM;AAAA,EACpC;AAEA,MAAI,QAAQ,OAAO,KAAK,GAAG;AACzB,aAAS,KAAK,kBAAkB,QAAQ,MAAM,KAAK,CAAC,EAAE;AAAA,EACxD;AAEA,QAAMD,WAAUC,MAAK,WAAW,MAAM,GAAG,GAAG,SAAS,KAAK,IAAI,CAAC;AAAA,GAAM,MAAM;AAC3E,SAAO;AACT;AAEO,SAAS,gBAAgB,OAAe,YAA4B;AACzE,MAAI;AACF,WAAO,UAAU,OAAO,UAAU;AAAA,EACpC,SAAS,OAAO;AACd,QAAI,iBAAiB,OAAO;AAC1B,YAAM,IAAI,MAAM,MAAM,OAAO;AAAA,IAC/B;AAEA,UAAM;AAAA,EACR;AACF;AAEA,eAAsB,YAAY,OAAqC;AACrE,QAAM,EAAE,SAAS,QAAQ,SAAS,QAAQ,YAAY,MAAM,IAAI;AAEhE,QAAM,kBAAkB,QAAQ,UAAU;AAE1C,QAAM,YAAY,QAAQ,MACtB,OACA,MAAM,OAAO;AAAA,IACX;AAAA,IACA;AAAA,EACF;AAEJ,MAAI,CAAC,WAAW;AACd,WAAO,KAAK,YAAY;AACxB;AAAA,EACF;AAEA,QAAM,UAAU,MAAM,cAAc,SAAS,SAAS,MAAM;AAC5D,QAAM,SAAS,QAAQ,UAAU;AACjC,QAAM,mBAAmB,MAAM,kBAAkB,OAAO;AAAA,IACtD;AAAA,IACA;AAAA,IACA,OAAO,QAAQ;AAAA,EACjB,CAAC;AAED,QAAM,SAAS,MAAM,WAAW,UAAU,CAAC,WAAW,MAAM,IAAI,GAAG;AAAA,IACjE,KAAK;AAAA,EACP,CAAC;AAED,MAAI,OAAO,SAAS,GAAG;AACrB,UAAM,UACJ,OAAO,UAAU,OAAO,UAAU;AACpC,UAAM,IAAI,MAAM,QAAQ,KAAK,CAAC;AAAA,EAChC;AAEA,SAAO,KAAK,4CAA4C,OAAO,EAAE;AACjE,SAAO,KAAK,wBAAwB,gBAAgB,EAAE;AACxD;AAEA,eAAsB,cAAc,OAAuC;AACzE,QAAM,EAAE,QAAQ,SAAS,QAAQ,YAAY,MAAM,IAAI;AAEvD,QAAM,kBAAkB,QAAQ,UAAU;AAE1C,QAAM,sBAAsB,MAAM,uBAAuB,KAAK;AAC9D,MAAI,CAAC,qBAAqB;AACxB,WAAO;AAAA,MACL,gCAAgC;AAAA,QAC9B;AAAA,MACF,CAAC;AAAA,IACH;AACA;AAAA,EACF;AAEA,QAAM,gBAAgB,QAAQ,WAAW;AACzC,QAAM,YAAY,QAAQ,MACtB,OACA,MAAM,OAAO;AAAA,IACX,gBACI,8EACA;AAAA,IACJ;AAAA,EACF;AAEJ,MAAI,CAAC,WAAW;AACd,WAAO,KAAK,YAAY;AACxB;AAAA,EACF;AAEA,QAAM,OAAO,CAAC,WAAW,QAAQ,kBAAkB;AACnD,MAAI,eAAe;AACjB,SAAK,KAAK,IAAI;AAAA,EAChB;AAEA,QAAM,SAAS,MAAM,WAAW,UAAU,MAAM;AAAA,IAC9C,KAAK,iBAAiB,KAAK;AAAA,EAC7B,CAAC;AAED,MAAI,OAAO,SAAS,GAAG;AACrB,UAAM,UACJ,OAAO,UAAU,OAAO,UAAU;AACpC,UAAM,IAAI,MAAM,QAAQ,KAAK,CAAC;AAAA,EAChC;AAEA,SAAO,KAAK,8BAA8B;AAC1C,MAAI,eAAe;AACjB,WAAO,KAAK,2BAA2B;AAAA,EACzC;AACF;AAEO,SAAS,sBAAqC;AACnD,QAAM,oBAAoB,MAAY;AACpC,QAAI,EAAE,QAAQ,MAAM,SAAS,QAAQ,OAAO,QAAQ;AAClD,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM,QAAQ,SAAiB,eAAe,MAAwB;AACpE,wBAAkB;AAElB,YAAM,SAAS,MAAM,aAAa;AAAA,QAChC;AAAA,QACA,cAAc;AAAA,QACd,OAAO,QAAQ;AAAA,QACf,QAAQ,QAAQ;AAAA,MAClB,CAAC;AAED,UAAI,SAAS,MAAM,GAAG;AACpB,oBAAY,YAAY;AACxB,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,IACT;AAAA,IACA,MAAM,MAAM,SAAiB,eAAe,IAAqB;AAC/D,wBAAkB;AAElB,YAAM,SAAS,MAAM,UAAU;AAAA,QAC7B;AAAA,QACA;AAAA,QACA,aAAa,gBAAgB;AAAA,QAC7B,OAAO,QAAQ;AAAA,QACf,QAAQ,QAAQ;AAAA,MAClB,CAAC;AAED,UAAI,SAAS,MAAM,GAAG;AACpB,oBAAY,YAAY;AACxB,cAAM,IAAI,MAAM,YAAY;AAAA,MAC9B;AAEA,YAAM,aAAa,OAAO,KAAK;AAC/B,aAAO,cAAc;AAAA,IACvB;AAAA,IACA,MAAM,SAAS,SAAkC;AAC/C,wBAAkB;AAElB,YAAM,SAAS,MAAM,cAAc;AAAA,QACjC;AAAA,QACA,OAAO,QAAQ;AAAA,QACf,QAAQ,QAAQ;AAAA,MAClB,CAAC;AAED,UAAI,SAAS,MAAM,GAAG;AACpB,oBAAY,YAAY;AACxB,cAAM,IAAI,MAAM,YAAY;AAAA,MAC9B;AAEA,aAAO,OAAO,KAAK;AAAA,IACrB;AAAA,EACF;AACF;AAEO,IAAM,uBAAsC,CAAC,SAAS,MAAM,YACjE,IAAI,QAAQ,CAACC,aAAY;AACvB,QAAM,QAAQ,MAAM,SAAS,MAAM;AAAA,IACjC,KAAK,SAAS;AAAA,IACd,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,EAClC,CAAC;AAED,MAAI,SAAS;AACb,MAAI,SAAS;AAEb,QAAM,QAAQ,GAAG,QAAQ,CAAC,UAAkB;AAC1C,cAAU,MAAM,SAAS;AAAA,EAC3B,CAAC;AAED,QAAM,QAAQ,GAAG,QAAQ,CAAC,UAAkB;AAC1C,cAAU,MAAM,SAAS;AAAA,EAC3B,CAAC;AAED,QAAM,GAAG,SAAS,CAAC,UAAiC;AAClD,UAAM,UAAU,MAAM,WAAW;AACjC,IAAAA,SAAQ,EAAE,MAAM,KAAK,QAAQ,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,CAAC;AAAA,EAC9D,CAAC;AAED,QAAM,GAAG,SAAS,CAAC,SAAS;AAC1B,IAAAA,SAAQ,EAAE,MAAM,QAAQ,GAAG,QAAQ,OAAO,CAAC;AAAA,EAC7C,CAAC;AACH,CAAC;;;AH1XH,IAAM,gBAA4B,cAAc;AAChD,IAAM,gBAA4B;AAAA,EAChC,MAAM,SAAiB;AACrB,YAAQ,OAAO,MAAM,OAAO;AAAA,EAC9B;AACF;AACA,IAAM,aAAa,gBAAmB;AAEtC,IAAM,2BAA2BC,GAAE,OAAO,OAAO,EAAE,IAAI,EAAE,YAAY;AACrE,IAAM,wBAAwBA,GAAE,OAAO,OAAO,EAAE,IAAI,EAAE,SAAS;AAC/D,IAAM,mBAAmBA,GAAE,OAAOA,GAAE,QAAQ,CAAC;AAC7C,IAAM,sBAAsBA,GAAE,OAAO;AAAA,EACnC,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,WAAWA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,MAAMA,GAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,KAAK;AAC5C,CAAC;AACD,IAAM,yBAAyB;AAC/B,IAAM,0BAA0B;AAChC,IAAM,0BAA0B;AAuBhC,SAAS,wBAAwB,OAAe,YAA4B;AAC1E,QAAM,SAAS,yBAAyB,UAAU,KAAK;AAEvD,MAAI,CAAC,OAAO,SAAS;AACnB,UAAM,IAAI;AAAA,MACR,GAAG,UAAU;AAAA,IACf;AAAA,EACF;AAEA,SAAO,OAAO;AAChB;AAEA,SAAS,qBAAqB,OAAe,YAA4B;AACvE,QAAM,SAAS,sBAAsB,UAAU,KAAK;AAEpD,MAAI,CAAC,OAAO,SAAS;AACnB,UAAM,IAAI,qBAAqB,GAAG,UAAU,6BAA6B;AAAA,EAC3E;AAEA,SAAO,OAAO;AAChB;AAEA,SAASC,WAAU,OAAe,YAA4B;AAC5D,SAAO,gBAAgB,OAAO,UAAU;AAC1C;AAEA,SAAS,cAAc,OAAe,YAA4B;AAChE,QAAM,WAAWC,YAAW,KAAK;AACjC,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,qBAAqB,GAAG,UAAU,kBAAkB;AAAA,EAChE;AAEA,MAAI;AACJ,MAAI;AACF,aAAS,IAAI,IAAI,QAAQ;AAAA,EAC3B,QAAQ;AACN,UAAM,IAAI,qBAAqB,GAAG,UAAU,sBAAsB;AAAA,EACpE;AAEA,MAAI,EAAE,OAAO,aAAa,WAAW,OAAO,aAAa,WAAW;AAClE,UAAM,IAAI;AAAA,MACR,GAAG,UAAU;AAAA,IACf;AAAA,EACF;AAEA,SAAO,SAAS,QAAQ,wBAAwB,EAAE;AACpD;AAEA,SAAS,kBAAkB,OAA6B;AACtD,QAAM,aAAa,MAAM,KAAK,EAAE,YAAY;AAE5C,MAAI,CAAC,YAAY,YAAY,UAAU,EAAE,SAAS,UAAU,GAAG;AAC7D,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,eAAe,aAAa,EAAE,SAAS,UAAU,GAAG;AACvD,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,WAAW,SAAS,EAAE,SAAS,UAAU,GAAG;AAC/C,WAAO;AAAA,EACT;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,OAAe,YAAmC;AACzE,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,KAAK;AAAA,EAC3B,QAAQ;AACN,UAAM,IAAI,qBAAqB,GAAG,UAAU,qBAAqB;AAAA,EACnE;AAEA,QAAM,SAAS,iBAAiB,UAAU,MAAM;AAChD,MAAI,CAAC,OAAO,SAAS;AACnB,UAAM,IAAI,qBAAqB,GAAG,UAAU,wBAAwB;AAAA,EACtE;AAEA,SAAO,OAAO;AAChB;AAEA,SAAS,4BAA4B,OAAuC;AAC1E,QAAM,SAAS,gBAAgB,OAAO,YAAY;AAClD,QAAM,UAAkC,CAAC;AAEzC,aAAW,CAAC,KAAK,QAAQ,KAAK,OAAO,QAAQ,MAAM,GAAG;AACpD,QAAI,IAAI,KAAK,EAAE,WAAW,GAAG;AAC3B,YAAM,IAAI,qBAAqB,mCAAmC;AAAA,IACpE;AAEA,QAAI,OAAO,aAAa,UAAU;AAChC,YAAM,IAAI,qBAAqB,mCAAmC;AAAA,IACpE;AAEA,YAAQ,GAAG,IAAI;AAAA,EACjB;AAEA,SAAO;AACT;AAEA,SAAS,iBAAiB,SAAiC;AACzD,QAAM,SAAS,oBAAoB,UAAU,QAAQ,gBAAgB,CAAC;AACtE,MAAI,CAAC,OAAO,SAAS;AACnB,UAAM,QAAQ,OAAO,MAAM,OAAO,CAAC,GAAG,WAAW;AACjD,UAAM,IAAI,qBAAqB,mCAAmC,KAAK,EAAE;AAAA,EAC3E;AAEA,SAAO,OAAO;AAChB;AAEA,SAASA,YAAW,OAAoC;AACtD,QAAM,UAAU,OAAO,KAAK;AAC5B,SAAO,WAAW,QAAQ,SAAS,IAAI,UAAU;AACnD;AAEA,SAAS,eACP,QACA,SACQ;AACR,QAAM,iBAAiB,oBAAoB,gBAAgB;AAC3D,SACEA,YAAW,QAAQ,OAAO,KAC1BA,YAAW,QAAQ,IAAI,iBAAiB,KACxCA,YAAW,OAAO,OAAO,KACzB;AAEJ;AAEA,eAAe,qBACb,SACgC;AAChC,QAAM,UAAU,iBAAiB,OAAO;AACxC,QAAM,YAAY,iBAAiB,QAAQ,SAAS;AACpD,QAAM,QAAQ,IAAI,iBAAiB,SAAS;AAC5C,QAAM,SAAS,MAAM,MAAM,WAAW;AACtC,QAAM,SAASA,YAAW,QAAQ,KAAK,KAAM,MAAM,MAAM,WAAW;AAEpE,SAAO;AAAA,IACL,SAAS,eAAe,QAAQ,OAAO;AAAA,IACvC;AAAA,IACA,MAAM,QAAQ;AAAA,IACd;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,OAA0B;AACjD,QAAM,aAAa,MAAM,MAAM,WAAW,QAAQ,IAC9C,MAAM,MAAM,MAAM,SAAS,MAAM,IACjC,MAAM;AACV,QAAM,YAAY,MAAM,SAAS;AAEjC,MAAI,OAAO,cAAc,UAAU;AACjC,WAAO,IAAI,UAAU,KAAK,SAAS;AAAA,EACrC;AAEA,SAAO,IAAI,UAAU,KAAK,KAAK,UAAU,MAAM,OAAO,CAAC;AACzD;AAEA,SAAS,eAAe,OAAoD;AAC1E,QAAM,QAAQ,MAAM,MAAM,GAAG;AAC7B,MAAI,MAAM,SAAS,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,MAAM,CAAC;AACvB,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,UAAU,OAAO,KAAK,SAAS,WAAW,EAAE,SAAS,MAAM;AACjE,UAAM,SAAS,KAAK,MAAM,OAAO;AACjC,WAAO,OAAO,WAAW,YAAY,WAAW,OAC3C,SACD;AAAA,EACN,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,cAAc,OAA+C;AACpE,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,eAAe,KAAK;AACnC,QAAM,WAAW,QAAQ;AACzB,MAAI,OAAO,aAAa,UAAU;AAChC,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,SAAS,KAAK;AAC9B,SAAO,QAAQ,SAAS,IAAI,UAAU;AACxC;AAEA,SAAS,YAAY,OAA4B;AAC/C,QAAM,SAAS,eAAe,KAAK;AACnC,MAAI,CAAC,QAAQ;AACX,WAAO,oBAAI,IAAI;AAAA,EACjB;AAEA,QAAM,SAAS,oBAAI,IAAY;AAC/B,QAAM,aAAa,OAAO;AAC1B,MAAI,OAAO,eAAe,UAAU;AAClC,eAAW,SAAS,WAAW,MAAM,GAAG,GAAG;AACzC,UAAI,MAAM,SAAS,GAAG;AACpB,eAAO,IAAI,KAAK;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,cAAc,OAAO;AAC3B,MAAI,MAAM,QAAQ,WAAW,GAAG;AAC9B,eAAW,SAAS,aAAa;AAC/B,UAAI,OAAO,UAAU,YAAY,MAAM,SAAS,GAAG;AACjD,eAAO,IAAI,KAAK;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,4BAA4B,OAAwB;AAC3D,QAAM,SAAS,YAAY,KAAK;AAChC,SAAO,OAAO,IAAI,YAAY;AAChC;AAEA,SAAS,kBAAkB,SAAmD;AAC5E,QAAM,gBACJ,QAAQ,UAAU,UAAa,QAAQ,SAAS;AAClD,QAAM,UAAU,QAAQ,UAAU,UAAa,QAAQ,YAAY;AAEnE,MAAI,iBAAiB,SAAS;AAC5B,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MAAI,eAAe;AACjB,UAAM,QAAQA,YAAW,QAAQ,KAAK;AACtC,UAAM,OAAOA,YAAW,QAAQ,IAAI;AACpC,QAAI,EAAE,SAAS,OAAO;AACpB,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,WAAO,EAAE,MAAM,cAAc,OAAO,KAAK;AAAA,EAC3C;AAEA,MAAI,SAAS;AACX,UAAM,QAAQA,YAAW,QAAQ,KAAK;AACtC,UAAM,UAAUA,YAAW,QAAQ,OAAO;AAC1C,QAAI,EAAE,SAAS,UAAU;AACvB,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,WAAO,EAAE,MAAM,OAAO,OAAO,QAAQ;AAAA,EACvC;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,EACF;AACF;AAEA,SAAS,uBAAuB,SAAyB;AACvD,QAAM,SAAS,IAAI,IAAI,OAAO;AAC9B,MAAI,EAAE,OAAO,aAAa,WAAW,OAAO,aAAa,WAAW;AAClE,UAAM,IAAI,qBAAqB,uCAAuC;AAAA,EACxE;AAEA,QAAM,aAAa,OAAO,SAAS,EAAE,QAAQ,wBAAwB,EAAE;AACvE,SAAO,WAAW,SAAS,KAAK,IAAI,aAAa,GAAG,UAAU;AAChE;AAEA,SAAS,gBACP,QACA,OACA,SAAS,OACH;AACN,QAAM,aAAa,KAAK,UAAU,OAAO,MAAM,SAAS,IAAI,MAAS;AACrE,MAAI,eAAe,QAAW;AAC5B,UAAM,IAAI,MAAM,iCAAiC;AAAA,EACnD;AAEA,SAAO,MAAM,GAAG,UAAU;AAAA,CAAI;AAChC;AAEA,eAAe,eACb,QACA,QACA,WACA;AACA,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MAAI,4BAA4B,MAAM,GAAG;AACvC,WAAO,MAAM,OAAO,QAAQ;AAAA,MAC1B,UAAU,sBAAsB,MAAM;AAAA,MACtC,IAAI;AAAA,IACN,CAAC;AAAA,EACH;AAEA,QAAM,UAAU,OAAO,QAAQ,EAAE,OAAO,OAAO,CAAC;AAChD,MAAI,QAAQ,OAAO,WAAW;AAC5B,UAAM,IAAI;AAAA,MACR,8BAA8B,QAAQ,EAAE,gBAAgB,SAAS;AAAA,IACnE;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,sBACP,QACA,UAAU,yBACQ;AAClB,QAAM,WAAW,cAAc,MAAM;AACrC,MAAI,CAAC,UAAU;AACb,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO,IAAI,iBAAiB;AAAA,IAC1B;AAAA,IACA,IAAI;AAAA,IACJ,MAAM;AAAA,EACR,CAAC;AACH;AAEA,IAAM,iBAAN,MAAqB;AAAA,EACF;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,OAAwB,CAAC,GAAG;AACtC,SAAK,eACH,KAAK,iBACJ,CAAC,SAAiB,WACjB,IAAI,SAAS;AAAA,MACX;AAAA,MACA;AAAA,IACF,CAAC;AACL,SAAK,SAAS,KAAK,UAAU;AAC7B,SAAK,SAAS,KAAK,UAAU;AAC7B,SAAK,SAAS,KAAK,UAAU,oBAAoB;AACjD,SAAK,aAAa,KAAK,cAAc;AAAA,EACvC;AAAA,EAEA,eAAwB;AACtB,UAAM,eAAe,KAAK;AAC1B,UAAM,SAAS,KAAK;AACpB,UAAM,SAAS,KAAK;AACpB,UAAM,SAAS,KAAK;AACpB,UAAM,aAAa,KAAK;AAExB,UAAM,UAAU,IAAI,QAAQ;AAE5B,YACG,KAAK,UAAU,EACf,YAAY,cAAc,EAC1B,mBAAmB,EACnB,QAAQ,YAAY,iBAAiB,2BAA2B,EAChE,OAAO,wBAAwB,uBAAuB,EACtD,OAAO,uBAAuB,kBAAkB,EAChD;AAAA,MACC;AAAA,MACA;AAAA,IACF,EACC,OAAO,UAAU,aAAa;AAEjC,YACG,QAAQ,SAAS,EACjB,YAAY,2BAA2B,EACvC,OAAO,MAAM;AACZ,aAAO,KAAK,UAAU;AAAA,IACxB,CAAC;AAEH,YACG,QAAQ,QAAQ,EAChB,YAAY,0BAA0B,EACtC;AAAA,MACC,IAAI,QAAQ,KAAK,EACd,YAAY,2BAA2B,EACvC,SAAS,SAAS,kCAAkC,EACpD,SAAS,WAAW,gBAAgB,EACpC,OAAO,eAA+B,KAAa,OAAe;AACjE,cAAM,EAAE,MAAM,IAAI,MAAM,qBAAqB,IAAI;AACjD,cAAM,YAAY,kBAAkB,GAAG;AAEvC,YAAI,cAAc,YAAY;AAC5B,gBAAM,WAAW,cAAc,OAAO,UAAU;AAChD,gBAAM,MAAM,aAAa,EAAE,SAAS,SAAS,CAAC;AAC9C,iBAAO,KAAK,mBAAmB,QAAQ,EAAE;AACzC;AAAA,QACF;AAEA,YAAI,cAAc,eAAe;AAC/B,gBAAM,aAAaA,YAAW,KAAK;AACnC,cAAI,CAAC,YAAY;AACf,kBAAM,IAAI,qBAAqB,6BAA6B;AAAA,UAC9D;AAEA,gBAAM,MAAM,aAAa,EAAE,WAAW,CAAC;AACvC,iBAAO,KAAK,sBAAsB,UAAU,EAAE;AAC9C;AAAA,QACF;AAEA,cAAM,MAAM,WAAW,KAAK;AAC5B,cAAM,MAAM,aAAa,EAAE,QAAQ,OAAU,CAAC;AAC9C,eAAO,KAAK,gBAAgB;AAAA,MAC9B,CAAC;AAAA,IACL,EACC;AAAA,MACC,IAAI,QAAQ,MAAM,EACf,YAAY,4BAA4B,EACxC,OAAO,iBAA+B;AACrC,cAAM,EAAE,SAAS,MAAM,MAAM,IAAI,MAAM,qBAAqB,IAAI;AAChE,cAAM,SAAS,MAAM,MAAM,WAAW;AACtC,cAAM,SAAS,MAAM,MAAM,WAAW;AACtC,cAAM,UAAUA,YAAW,QAAQ,IAAI,gBAAgB;AACvD,YAAI,eAAe;AAEnB,YAAI,SAAS;AACX,yBAAe;AAAA,QACjB,WAAW,QAAQ;AACjB,yBAAe;AAAA,QACjB;AAEA,cAAM,SAAS;AAAA,UACb,UAAU,OAAO,WAAW;AAAA,UAC5B,YAAY,OAAO,cAAc;AAAA,UACjC,QAAQ,SAAS,QAAQ;AAAA,UACzB;AAAA,UACA,WAAW,MAAM;AAAA,QACnB;AAEA,YAAI,MAAM;AACR,0BAAgB,QAAQ,QAAQ,IAAI;AACpC;AAAA,QACF;AAEA,eAAO,KAAK,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,MAC7C,CAAC;AAAA,IACL;AAEF,YACG,QAAQ,UAAU,EAClB,YAAY,iBAAiB,EAC7B;AAAA,MACC,IAAI,QAAQ,MAAM,EACf,YAAY,eAAe,EAC3B;AAAA,QAAO;AAAA,QAAmB;AAAA,QAA8B,CAAC,UACxD,qBAAqB,OAAO,SAAS;AAAA,MACvC,EACC,OAAO,qBAAqB,mBAAmB,EAC/C,OAAO,qBAAqB,6BAA6B,EACzD,OAAO,eAEN,SAKA;AACA,cAAM,WAAW,MAAM,qBAAqB,IAAI;AAChD,cAAM,EAAE,KAAK,IAAI;AACjB,cAAM,SAAS,SAAS,SACpB,aAAa,SAAS,SAAS,SAAS,MAAM,IAC9C,aAAa,SAAS,OAAO;AAEjC,cAAM,WAAW,QAAQ,WACrB,4BAA4B,QAAQ,QAAQ,IAC5C;AAEJ,cAAM,SAAS,QAAQ,QAAQ,KAAK;AACpC,YAAI,QAAQ,WAAW,UAAa,CAAC,QAAQ;AAC3C,gBAAM,IAAI,qBAAqB,4BAA4B;AAAA,QAC7D;AAEA,cAAM,OAAO,MAAM,OAAO,aAAa;AAAA,UACrC,OAAO,QAAQ;AAAA,UACf;AAAA,UACA;AAAA,QACF,CAAC;AAED,YAAI,MAAM;AACR,0BAAgB,QAAQ,MAAM,IAAI;AAClC;AAAA,QACF;AAEA,YAAI,KAAK,SAAS,WAAW,GAAG;AAC9B,iBAAO,KAAK,oBAAoB;AAChC;AAAA,QACF;AAEA,eAAO,KAAK,qBAAuB;AACnC,mBAAW,WAAW,KAAK,UAAU;AACnC,iBAAO;AAAA,YACL,GAAG,QAAQ,EAAE,IAAK,QAAQ,SAAS,EAAE,IAAK,QAAQ,UAAU;AAAA,UAC9D;AAAA,QACF;AAEA,YAAI,KAAK,aAAa;AACpB,iBAAO,KAAK,eAAe,KAAK,WAAW,EAAE;AAAA,QAC/C;AAAA,MACF,CAAC;AAAA,IACL;AAEF,YACG,QAAQ,IAAI,EACZ,YAAY,2CAA2C,EACvD,OAAO,aAAa,4CAA4C,EAChE;AAAA,MAAO;AAAA,MAAiB;AAAA,MAAqB,CAAC,UAC7CD,WAAU,OAAO,QAAQ;AAAA,IAC3B,EACC;AAAA,MAAO;AAAA,MAAoB;AAAA,MAAiB,CAAC,UAC5CA,WAAU,OAAO,WAAW;AAAA,IAC9B,EACC,OAAO,mBAAmB,yBAAyB,EACnD,OAAO,eAEN,SAMA;AACA,YAAM,EAAE,SAAS,MAAM,IAAI,MAAM,qBAAqB,IAAI;AAC1D,YAAM,YAAY;AAAA,QAChB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAEH,YACG,QAAQ,MAAM,EACd,YAAY,yCAAyC,EACrD,OAAO,aAAa,0BAA0B,EAC9C,OAAO,gBAAgB,2BAA2B,EAClD,OAAO,eAEN,SACA;AACA,YAAM,EAAE,MAAM,IAAI,MAAM,qBAAqB,IAAI;AACjD,YAAM,cAAc;AAAA,QAClB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAEH,YACG,QAAQ,QAAQ,EAChB,YAAY,kBAAkB,EAC9B,OAAO,aAAa,YAAY,EAChC,OAAO,mBAAmB,eAAe,EACzC,OAAO,qBAAqB,8BAA8B,EAC1D,OAAO,eAEN,SAKA;AACA,YAAM,WAAW,MAAM,qBAAqB,IAAI;AAChD,YAAM,EAAE,KAAK,IAAI;AACjB,YAAM,SAAS,SAAS,SACpB,aAAa,SAAS,SAAS,SAAS,MAAM,IAC9C,aAAa,SAAS,OAAO;AACjC,YAAM,WAAW,QAAQ,WACrB,gBAAgB,QAAQ,UAAU,YAAY,IAC9C;AACJ,YAAM,UAAU,MAAM,OAAO,QAAQ;AAAA,QACnC,UAAU,sBAAsB,SAAS,MAAM;AAAA,QAC/C,IAAI,QAAQ;AAAA,QACZ,OAAO,QAAQ;AAAA,QACf;AAAA,MACF,CAAC;AAED,UAAI,MAAM;AACR,wBAAgB,QAAQ,QAAQ,UAAU,EAAE,IAAI,QAAQ,GAAG,GAAG,IAAI;AAClE;AAAA,MACF;AAEA,aAAO,KAAK,QAAQ,EAAE;AAAA,IACxB,CAAC;AAEH,YACG,QAAQ,oBAAoB,EAC5B,YAAY,iBAAiB,EAC7B,OAAO,mBAAmB,8BAA8B,EACxD,OAAO,iBAAiB,gCAAgC,EACxD,OAAO,iBAAiB,cAAc,SAAS,EAC/C,OAAO,qBAAqB,cAAc,EAC1C;AAAA,MACC;AAAA,MACA;AAAA,IACF,EACC;AAAA,MACC;AAAA,MACA;AAAA,MACA,CAAC,UAAU,qBAAqB,OAAO,gBAAgB;AAAA,IACzD,EACC,OAAO,mBAAmB,4BAA4B,EACtD,OAAO,oBAAoB,oCAAoC,EAC/D,OAAO,qBAAqB,4BAA4B,EACxD,OAAO,iBAAiB,wBAAwB,EAChD,OAAO,2BAA2B,iBAAiB,EACnD;AAAA,MAAO;AAAA,MAAwB;AAAA,MAAqB,CAAC,UACpD,wBAAwB,OAAO,gBAAgB;AAAA,IACjD,EACC,OAAO,eAEN,WACA,SACA;AACA,YAAM,EAAE,SAAS,QAAQ,MAAM,MAAM,IACnC,MAAM,qBAAqB,IAAI;AACjC,YAAM,SAAS,SACX,aAAa,SAAS,MAAM,IAC5B,aAAa,OAAO;AAExB,YAAM,WAAW,QAAQ,WACrB,gBAAgB,QAAQ,UAAU,YAAY,IAC9C;AACJ,YAAM,OAAO,QAAQ,OACjB,gBAAgB,QAAQ,MAAM,QAAQ,IACtC;AACJ,YAAM,OAAO,kBAAkB,OAAO;AACtC,YAAM,UACJ,KAAK,SAAS,gBACd,WAAW,UACX,4BAA4B,MAAM,IAC9B,MAAM,OAAO,QAAQ;AAAA,QACnB,UAAU,sBAAsB,QAAQ,KAAK,KAAK;AAAA,QAClD,IAAI;AAAA,MACN,CAAC,IACD,MAAM,eAAe,QAAQ,QAAQ,SAAS;AAEpD,YAAM,WACJ,KAAK,SAAS,eACV,MAAM,QAAQ,OAAO;AAAA,QACnB,MAAM,QAAQ;AAAA,QACd,MAAM,KAAK;AAAA,QACX,QAAQ,QAAQ;AAAA,QAChB;AAAA,QACA;AAAA,QACA,gBAAgB,QAAQ;AAAA,QACxB,aAAa,QAAQ;AAAA,MACvB,CAAC,IACD,MAAM,MAAM,cAAc,YAAY;AACpC,cAAM,aAAa,MAAM,MAAM;AAAA,UAC7B,QAAQ;AAAA,QACV;AACA,cAAM,oBAAoB,uBAAuB,OAAO;AACxD,cAAM,aAAa;AAAA,UACjB;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,cAAM,cACJ,QAAQ,eAAgB,MAAM,MAAM,YAAY,UAAU;AAC5D,cAAM,iBAAiB,MAAM,QAAQ,UAAU;AAAA,UAC7C,MAAM,QAAQ;AAAA,UACd,SAAS,gBAAgB,KAAK,SAAS,WAAW;AAAA,UAClD,OAAO,KAAK;AAAA,UACZ,aAAa;AAAA,UACb,cAAc;AAAA,UACd,QAAQ,QAAQ;AAAA,UAChB;AAAA,UACA;AAAA,UACA,iBAAiB,QAAQ;AAAA,UACzB,cAAc,QAAQ;AAAA,QACxB,CAAC;AAED,cAAM,MAAM,YAAY,YAAY,WAAW;AAC/C,eAAO;AAAA,MACT,CAAC;AAEP,UAAI,MAAM;AACR,wBAAgB,QAAQ,UAAU,IAAI;AACtC;AAAA,MACF;AAEA,aAAO,KAAK,OAAO,SAAS,GAAG,YAAY,SAAS,OAAO,EAAE;AAAA,IAC/D,CAAC;AAEH,YACG,QAAQ,kBAAkB,EAC1B,YAAY,4BAA4B,EACxC;AAAA,MAAO;AAAA,MAAqB;AAAA,MAAiB,CAAC,UAC7C,wBAAwB,OAAO,UAAU;AAAA,IAC3C,EACC,OAAO,mBAAmB,sBAAsB,EAChD;AAAA,MAAO;AAAA,MAAmB;AAAA,MAAuB,CAAC,UACjD,wBAAwB,OAAO,SAAS;AAAA,IAC1C,EACC,OAAO,eAAe,oCAAoC,EAC1D,OAAO,eAEN,WACA,SAMA;AACA,YAAM,EAAE,SAAS,QAAQ,KAAK,IAAI,MAAM,qBAAqB,IAAI;AACjE,YAAM,SAAS,SACX,aAAa,SAAS,MAAM,IAC5B,aAAa,OAAO;AACxB,YAAM,UAAU,MAAM,eAAe,QAAQ,QAAQ,SAAS;AAE9D,YAAM,kBAAkB,IAAI,gBAAgB;AAC5C,YAAM,WAAW,MAAM;AACrB,wBAAgB,MAAM;AAAA,MACxB;AAEA,cAAQ,KAAK,UAAU,QAAQ;AAE/B,UAAI;AACF,YAAI,UAAU;AAEd,yBAAiB,EAAE,MAAM,KAAK,QAAQ,KAAK;AAAA,UACzC,QAAQ,QAAQ,UAAU;AAAA,UAC1B,WAAW;AAAA,UACX,OAAO,QAAQ;AAAA,UACf,QAAQ,QAAQ;AAAA,UAChB,QAAQ,gBAAgB;AAAA,QAC1B,CAAC,GAAG;AACF,cAAI,QAAQ,UAAU,UAAa,WAAW,QAAQ,OAAO;AAC3D,4BAAgB,MAAM;AACtB;AAAA,UACF;AAEA,cAAI,MAAM;AACR,4BAAgB,QAAQ,KAAK;AAAA,UAC/B,OAAO;AACL,mBAAO,KAAK,gBAAgB,KAAK,CAAC;AAAA,UACpC;AAEA,qBAAW;AAEX,cAAI,QAAQ,UAAU,UAAa,WAAW,QAAQ,OAAO;AAC3D,4BAAgB,MAAM;AAAA,UACxB;AAAA,QACF;AAAA,MACF,UAAE;AACA,gBAAQ,eAAe,UAAU,QAAQ;AAAA,MAC3C;AAAA,IACF,CAAC;AAEH,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,IAAI,OAAO,QAAQ,MAAqB;AAC5C,UAAM,UAAU,KAAK,aAAa;AAElC,QAAI;AACF,YAAM,QAAQ,WAAW,IAAI;AAAA,IAC/B,SAAS,OAAO;AACd,UAAI,iBAAiB,kBAAkB;AACrC,aAAK,OAAO,MAAM,GAAG,MAAM,IAAI,KAAK,MAAM,MAAM,MAAM,MAAM,OAAO,EAAE;AACrE,gBAAQ,WAAW;AACnB;AAAA,MACF;AAEA,UAAI,iBAAiB,OAAO;AAC1B,aAAK,OAAO,MAAM,MAAM,OAAO;AAC/B,gBAAQ,WAAW;AACnB;AAAA,MACF;AAEA,WAAK,OAAO,MAAM,eAAe;AACjC,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF;AACF;AAMA,eAAsB,IACpB,OAAO,QAAQ,MACf,OAAwB,CAAC,GACV;AACf,QAAM,IAAI,eAAe,IAAI,EAAE,IAAI,IAAI;AACzC;;;AI94BA,IAAI;","names":["z","mkdir","writeFile","join","resolve","z","parsePort","trimString"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/runtime.ts","../src/config.ts","../src/store.ts","../src/commands/append.ts","../src/commands/config.ts","../src/commands/create.ts","../src/commands/sessions.ts","../src/commands/tail.ts","../src/index.ts"],"sourcesContent":["import { StarciteApiError } from \"@starcite/sdk\";\nimport { runAppendCommand } from \"./commands/append\";\nimport { runConfigCommand } from \"./commands/config\";\nimport { runCreateCommand } from \"./commands/create\";\nimport { runSessionsCommand } from \"./commands/sessions\";\nimport { runTailCommand } from \"./commands/tail\";\nimport {\n type CliDependencies,\n CliRuntime,\n CliUsageError,\n type GlobalOptions,\n parseArgs,\n} from \"./runtime\";\n\ndeclare const __CLI_VERSION__: string;\n\nconst HELP_TEXT = `Usage: starcite [options] <command>\n\nCommands:\n config\n create\n append\n tail\n sessions\n\nOptions:\n -u, --base-url <url> Starcite API base URL\n -k, --token <token> Starcite API key\n --config-dir <path>\n --json\n -h, --help\n -v, --version\n`;\n\nconst COMMANDS: Record<\n string,\n (args: string[], options: GlobalOptions, runtime: CliRuntime) => Promise<void>\n> = {\n config: runConfigCommand,\n create: runCreateCommand,\n append: runAppendCommand,\n tail: runTailCommand,\n sessions: runSessionsCommand,\n};\n\ninterface ParseContext {\n from?: \"user\";\n}\n\ninterface OutputHandlers {\n writeOut(text: string): void;\n writeErr(text: string): void;\n}\n\nexport interface CliProgram {\n parseAsync(argv: string[], context?: ParseContext): Promise<void>;\n exitOverride(): void;\n configureOutput(output: Partial<OutputHandlers>): void;\n}\n\nclass EarlyExit extends Error {\n readonly code: string;\n\n constructor(code: string, message: string) {\n super(message);\n this.code = code;\n }\n}\n\nfunction normalizeArgv(argv: string[], context?: ParseContext): string[] {\n const args = context?.from === \"user\" ? [...argv] : argv.slice(2);\n\n if (\n args[0] === \"node\" &&\n typeof args[1] === \"string\" &&\n args[1].includes(\"starcite\")\n ) {\n return args.slice(2);\n }\n\n return args;\n}\n\nfunction parseGlobalArgs(args: string[]) {\n const parsed = parseArgs(\n {\n \"--base-url\": String,\n \"-u\": \"--base-url\",\n \"--token\": String,\n \"-k\": \"--token\",\n \"--config-dir\": String,\n \"--json\": Boolean,\n \"--help\": Boolean,\n \"-h\": \"--help\",\n \"--version\": Boolean,\n \"-v\": \"--version\",\n },\n args,\n true\n );\n\n return {\n help: parsed[\"--help\"] === true,\n version: parsed[\"--version\"] === true,\n options: {\n baseUrl: parsed[\"--base-url\"],\n configDir: parsed[\"--config-dir\"],\n token: parsed[\"--token\"],\n json: parsed[\"--json\"] === true,\n },\n rest: parsed._.map((value: unknown) => `${value}`),\n };\n}\n\nexport function buildProgram(deps: CliDependencies = {}): CliProgram {\n const runtime = new CliRuntime(deps);\n let throwOnEarlyExit = false;\n let output: OutputHandlers = {\n writeOut(text: string) {\n process.stdout.write(text);\n },\n writeErr(text: string) {\n process.stderr.write(text);\n },\n };\n\n return {\n exitOverride() {\n throwOnEarlyExit = true;\n },\n\n configureOutput(next) {\n output = {\n writeOut: next.writeOut ?? output.writeOut,\n writeErr: next.writeErr ?? output.writeErr,\n };\n },\n\n async parseAsync(argv, context) {\n const parsed = parseGlobalArgs(normalizeArgv(argv, context));\n const command = parsed.rest[0];\n\n if (parsed.version) {\n output.writeOut(`${__CLI_VERSION__}\\n`);\n if (throwOnEarlyExit) {\n throw new EarlyExit(\"cli.versionDisplayed\", \"Version displayed\");\n }\n return;\n }\n\n if (parsed.help || !command) {\n output.writeOut(`${HELP_TEXT}\\n`);\n if (throwOnEarlyExit) {\n throw new EarlyExit(\"cli.helpDisplayed\", \"Help displayed\");\n }\n return;\n }\n\n const handler = COMMANDS[command];\n if (!handler) {\n throw new CliUsageError(`Unknown command: ${command}`);\n }\n\n await handler(parsed.rest.slice(1), parsed.options, runtime);\n },\n };\n}\n\nexport async function run(\n argv = process.argv,\n deps: CliDependencies = {}\n): Promise<void> {\n const runtime = new CliRuntime(deps);\n const program = buildProgram(deps);\n\n try {\n await program.parseAsync(argv);\n } catch (error) {\n if (error instanceof StarciteApiError) {\n runtime.logger.error(`${error.code} (${error.status}): ${error.message}`);\n process.exitCode = 1;\n return;\n }\n\n if (error instanceof Error) {\n runtime.logger.error(error.message);\n process.exitCode = 1;\n return;\n }\n\n runtime.logger.error(\"Unknown error\");\n process.exitCode = 1;\n }\n}\n","import { Starcite, type TailEvent } from \"@starcite/sdk\";\nimport arg from \"arg\";\nimport {\n resolveConfigDir,\n type StarciteCliConfig,\n StarciteCliConfigStore,\n} from \"./config\";\nimport { StarciteCliStore } from \"./store\";\n\nconst DEFAULT_API_PORT = 45_187;\nconst DEFAULT_TAIL_BATCH_SIZE = 256;\nconst TRAILING_SLASHES_REGEX = /\\/+$/;\n\nexport { DEFAULT_TAIL_BATCH_SIZE };\n\nexport class CliUsageError extends Error {}\n\nexport interface LoggerLike {\n info(message: string): void;\n error(message: string): void;\n}\n\nexport interface StdoutLike {\n write(message: string): void;\n}\n\nexport interface GlobalOptions {\n baseUrl?: string;\n configDir?: string;\n token?: string;\n json: boolean;\n}\n\nexport interface CliDependencies {\n createClient?: (\n baseUrl: string,\n apiKey: string | undefined,\n store: StarciteCliStore\n ) => Starcite;\n logger?: LoggerLike;\n stdout?: StdoutLike;\n}\n\nexport interface ResolvedGlobalOptions {\n baseUrl: string;\n json: boolean;\n config: StarciteCliConfigStore;\n store: StarciteCliStore;\n client: Starcite;\n}\n\nexport type CliJsonObject = Record<string, unknown>;\nexport type ParsedArgs = ReturnType<typeof arg>;\n\nconst defaultLogger: LoggerLike = {\n info(message: string) {\n console.log(message);\n },\n error(message: string) {\n console.error(message);\n },\n};\n\nconst defaultStdout: StdoutLike = {\n write(message: string) {\n process.stdout.write(message);\n },\n};\n\nexport function trimString(value?: string): string | undefined {\n const trimmed = value?.trim();\n return trimmed && trimmed.length > 0 ? trimmed : undefined;\n}\n\nexport function parseArgs(\n spec: Parameters<typeof arg>[0],\n argv: string[],\n stopAtPositional = false\n): ParsedArgs {\n try {\n return arg(spec, {\n argv,\n permissive: false,\n stopAtPositional,\n });\n } catch (error) {\n if (error instanceof Error) {\n throw new CliUsageError(error.message);\n }\n\n throw error;\n }\n}\n\nexport function resolveConfiguredBaseUrl(\n config: StarciteCliConfig,\n options: GlobalOptions\n): string {\n return (\n trimString(options.baseUrl) ??\n trimString(process.env.STARCITE_BASE_URL) ??\n trimString(config.baseUrl) ??\n `http://localhost:${DEFAULT_API_PORT}`\n );\n}\n\nexport function parseNonNegativeInteger(\n value: string,\n optionName: string\n): number {\n const parsed = Number(value);\n\n if (!Number.isInteger(parsed) || parsed < 0) {\n throw new CliUsageError(`${optionName} must be a non-negative integer`);\n }\n\n return parsed;\n}\n\nexport function parsePositiveInteger(\n value: string,\n optionName: string\n): number {\n const parsed = Number(value);\n\n if (!Number.isInteger(parsed) || parsed <= 0) {\n throw new CliUsageError(`${optionName} must be a positive integer`);\n }\n\n return parsed;\n}\n\nexport function parseEndpoint(value: string, optionName: string): string {\n const endpoint = trimString(value);\n if (!endpoint) {\n throw new CliUsageError(`${optionName} cannot be empty`);\n }\n\n let parsed: URL;\n try {\n parsed = new URL(endpoint);\n } catch {\n throw new CliUsageError(`${optionName} must be a valid URL`);\n }\n\n if (!(parsed.protocol === \"http:\" || parsed.protocol === \"https:\")) {\n throw new CliUsageError(`${optionName} must use http:// or https://`);\n }\n\n return endpoint.replace(TRAILING_SLASHES_REGEX, \"\");\n}\n\nexport function parseConfigSetKey(value: string): \"endpoint\" | \"api-key\" {\n const normalized = value.trim().toLowerCase();\n\n if (normalized === \"endpoint\" || normalized === \"base-url\") {\n return \"endpoint\";\n }\n\n if (normalized === \"api-key\") {\n return \"api-key\";\n }\n\n throw new CliUsageError(\"config key must be one of: endpoint, api-key\");\n}\n\nexport function parseJsonObject(\n value: string,\n optionName: string\n): CliJsonObject {\n let parsed: unknown;\n\n try {\n parsed = JSON.parse(value);\n } catch {\n throw new CliUsageError(`${optionName} must be valid JSON`);\n }\n\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n throw new CliUsageError(`${optionName} must be a JSON object`);\n }\n\n return parsed as CliJsonObject;\n}\n\nexport function parseSessionMetadataFilters(\n value: string\n): Record<string, string> {\n const filters: Record<string, string> = {};\n\n for (const [key, rawValue] of Object.entries(\n parseJsonObject(value, \"--metadata\")\n )) {\n if (key.trim().length === 0) {\n throw new CliUsageError(\"--metadata keys must be non-empty\");\n }\n\n if (typeof rawValue !== \"string\") {\n throw new CliUsageError(\"--metadata values must be strings\");\n }\n\n filters[key] = rawValue;\n }\n\n return filters;\n}\n\nexport class CliRuntime {\n readonly logger: LoggerLike;\n readonly stdout: StdoutLike;\n private readonly createClient: CliDependencies[\"createClient\"];\n\n constructor(deps: CliDependencies = {}) {\n this.logger = deps.logger ?? defaultLogger;\n this.stdout = deps.stdout ?? defaultStdout;\n this.createClient = deps.createClient;\n }\n\n async resolveGlobalOptions(\n options: GlobalOptions\n ): Promise<ResolvedGlobalOptions> {\n const config = new StarciteCliConfigStore(\n resolveConfigDir(options.configDir)\n );\n const store = new StarciteCliStore(config.directory);\n const baseUrl = resolveConfiguredBaseUrl(\n await config.readConfig(),\n options\n );\n const apiKey = trimString(options.token) ?? (await config.readApiKey());\n const client =\n this.createClient?.(baseUrl, apiKey, store) ??\n new Starcite({\n baseUrl,\n apiKey,\n store: store.sessionStore(baseUrl),\n });\n\n return {\n baseUrl,\n json: options.json,\n config,\n store,\n client,\n };\n }\n\n writeJsonOutput(value: unknown, pretty = false): void {\n const serialized = JSON.stringify(value, null, pretty ? 2 : undefined);\n if (serialized === undefined) {\n throw new Error(\"Failed to serialize JSON output\");\n }\n\n this.stdout.write(`${serialized}\\n`);\n }\n\n formatTailEvent(event: TailEvent): string {\n const actor = event.actor.startsWith(\"agent:\")\n ? event.actor.slice(\"agent:\".length)\n : event.actor;\n const text = event.payload?.text;\n\n return typeof text === \"string\"\n ? `[${actor}] ${text}`\n : `[${actor}] ${JSON.stringify(event.payload)}`;\n }\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport Conf from \"conf\";\nimport { parse as parseToml } from \"toml\";\nimport { z } from \"zod\";\n\nconst DEFAULT_CONFIG_DIRECTORY_NAME = \".starcite\";\nconst CONFIG_JSON_FILENAME = \"config.json\";\nconst CONFIG_TOML_FILENAME = \"config.toml\";\nconst CREDENTIALS_FILENAME = \"credentials\";\nconst TILDE_PREFIX_REGEX = /^~(?=\\/|$)/;\n\nconst ConfigFileSchema = z\n .object({\n baseUrl: z.string().optional(),\n base_url: z.string().optional(),\n apiKey: z.string().optional(),\n api_key: z.string().optional(),\n })\n .passthrough();\n\nconst CredentialsFileSchema = z.object({\n apiKey: z.string().trim().min(1).optional(),\n});\n\ntype CredentialsFile = z.infer<typeof CredentialsFileSchema>;\n\nexport interface StarciteCliConfig {\n baseUrl?: string;\n apiKey?: string;\n}\n\nfunction trimString(value?: string): string | undefined {\n const trimmed = value?.trim();\n return trimmed && trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction normalizeConfig(input: unknown): StarciteCliConfig {\n const parsed = ConfigFileSchema.safeParse(input);\n\n if (!parsed.success) {\n return {};\n }\n\n return {\n baseUrl: trimString(parsed.data.baseUrl ?? parsed.data.base_url),\n apiKey: trimString(parsed.data.apiKey ?? parsed.data.api_key),\n };\n}\n\nfunction defaultConfigDirectory(): string {\n const home = homedir();\n return home.trim().length > 0\n ? join(home, DEFAULT_CONFIG_DIRECTORY_NAME)\n : resolve(DEFAULT_CONFIG_DIRECTORY_NAME);\n}\n\nexport function resolveConfigDir(input?: string): string {\n const configured = trimString(input) ?? trimString(process.env.STARCITE_HOME);\n const withTilde = configured?.startsWith(\"~\")\n ? configured.replace(TILDE_PREFIX_REGEX, homedir())\n : configured;\n\n return resolve(withTilde ?? defaultConfigDirectory());\n}\n\nexport class StarciteCliConfigStore {\n readonly directory: string;\n private readonly credentialsStore: Conf<CredentialsFile>;\n\n constructor(directory: string) {\n this.directory = directory;\n this.credentialsStore = new Conf<CredentialsFile>({\n cwd: directory,\n clearInvalidConfig: true,\n configName: CREDENTIALS_FILENAME,\n fileExtension: \"json\",\n });\n }\n\n async readConfig(): Promise<StarciteCliConfig> {\n await this.ensureDirectory();\n\n for (const filename of [CONFIG_JSON_FILENAME, CONFIG_TOML_FILENAME]) {\n const parsed = await this.readConfigFile(filename);\n if (parsed !== undefined) {\n return normalizeConfig(parsed);\n }\n }\n\n return {};\n }\n\n async writeConfig(config: StarciteCliConfig): Promise<void> {\n await this.ensureDirectory();\n\n const normalized = normalizeConfig(config);\n await writeFile(\n join(this.directory, CONFIG_JSON_FILENAME),\n `${JSON.stringify(normalized, null, 2)}\\n`,\n \"utf8\"\n );\n }\n\n async updateConfig(\n patch: Partial<StarciteCliConfig>\n ): Promise<StarciteCliConfig> {\n const config = normalizeConfig({\n ...(await this.readConfig()),\n ...patch,\n });\n\n await this.writeConfig(config);\n return config;\n }\n\n async readApiKey(): Promise<string | undefined> {\n const fromEnv = trimString(process.env.STARCITE_API_KEY);\n if (fromEnv) {\n return fromEnv;\n }\n\n const fromCredentials = trimString(this.readCredentials().apiKey);\n if (fromCredentials) {\n return fromCredentials;\n }\n\n return trimString((await this.readConfig()).apiKey);\n }\n\n async saveApiKey(apiKey: string): Promise<void> {\n await this.ensureDirectory();\n\n const normalized = trimString(apiKey);\n if (!normalized) {\n throw new Error(\"API key cannot be empty\");\n }\n\n this.credentialsStore.set(\"apiKey\", normalized);\n }\n\n private async readConfigFile(filename: string): Promise<unknown | undefined> {\n const path = join(this.directory, filename);\n\n try {\n const content = await readFile(path, \"utf8\");\n return filename.endsWith(\".toml\")\n ? parseToml(content)\n : JSON.parse(content);\n } catch (error) {\n if (\n error &&\n typeof error === \"object\" &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n return undefined;\n }\n\n throw error;\n }\n }\n\n private readCredentials(): CredentialsFile {\n const parsed = CredentialsFileSchema.safeParse(this.credentialsStore.store);\n\n if (parsed.success) {\n return parsed.data;\n }\n\n this.credentialsStore.clear();\n return {};\n }\n\n private async ensureDirectory(): Promise<void> {\n await mkdir(this.directory, { recursive: true });\n }\n}\n","import {\n type SessionStore,\n type SessionStoreState,\n type TailEvent,\n WebStorageSessionStore,\n} from \"@starcite/sdk\";\nimport Conf from \"conf\";\n\nconst STATE_FILENAME = \"state\";\nconst TRAILING_SLASHES_REGEX = /\\/+$/;\nconst STORE_VERSION_KEY = \"__starciteCliStoreVersion\";\nconst CURRENT_STORE_VERSION = \"2\";\n\nexport function buildSessionStoreContextKey(\n baseUrl: string,\n sessionId: string\n): string {\n return `${baseUrl}::${sessionId}`;\n}\n\nfunction normalizeStoreBaseUrl(baseUrl: string): string {\n if (baseUrl.length === 0) {\n return \"\";\n }\n\n const normalized = baseUrl.replace(TRAILING_SLASHES_REGEX, \"\");\n return normalized.endsWith(\"/v1\") ? normalized : `${normalized}/v1`;\n}\n\nexport class StarciteCliStore implements SessionStore<TailEvent> {\n private readonly storage: Conf<Record<string, string>>;\n\n constructor(directory: string) {\n this.storage = new Conf<Record<string, string>>({\n cwd: directory,\n clearInvalidConfig: true,\n configName: STATE_FILENAME,\n fileExtension: \"json\",\n defaults: {},\n });\n\n this.resetOnStoreVersionMismatch();\n }\n\n sessionStore(baseUrl: string): SessionStore<TailEvent> {\n return new WebStorageSessionStore<TailEvent>(this.storageAdapter(), {\n keyForSession: (sessionId) =>\n buildSessionStoreContextKey(normalizeStoreBaseUrl(baseUrl), sessionId),\n });\n }\n\n load(sessionId: string): SessionStoreState<TailEvent> | undefined {\n return this.sessionStore(\"\").load(sessionId);\n }\n\n save(sessionId: string, state: SessionStoreState<TailEvent>): void {\n this.sessionStore(\"\").save(sessionId, state);\n }\n\n clear(sessionId: string): void {\n this.sessionStore(\"\").clear?.(sessionId);\n }\n\n clearSession(baseUrl: string, sessionId: string): void {\n this.sessionStore(baseUrl).clear?.(sessionId);\n }\n\n private storageAdapter() {\n return {\n getItem: (key: string): string | null => this.storage.get(key) ?? null,\n setItem: (key: string, value: string): void => {\n this.storage.set(key, value);\n },\n removeItem: (key: string): void => {\n this.storage.delete(key);\n },\n };\n }\n\n private resetOnStoreVersionMismatch(): void {\n const storedVersion = this.storage.get(STORE_VERSION_KEY);\n if (storedVersion === CURRENT_STORE_VERSION) {\n return;\n }\n\n this.storage.clear();\n this.storage.set(STORE_VERSION_KEY, CURRENT_STORE_VERSION);\n }\n}\n","import type { StarciteIdentity } from \"@starcite/sdk\";\nimport {\n type CliRuntime,\n CliUsageError,\n type GlobalOptions,\n parseArgs,\n parseJsonObject,\n parseNonNegativeInteger,\n trimString,\n} from \"../runtime\";\n\nconst DEFAULT_CREATE_AGENT_ID = \"starcite-cli\";\n\ninterface AppendIdentitySelection {\n type: \"agent\" | \"user\";\n id: string;\n}\n\nfunction resolveAppendIdentity(\n selection: AppendIdentitySelection | undefined,\n client: {\n agent(input: { id: string }): StarciteIdentity;\n user(input: { id: string }): StarciteIdentity;\n }\n): StarciteIdentity {\n if (!selection) {\n return client.agent({ id: DEFAULT_CREATE_AGENT_ID });\n }\n\n return selection.type === \"agent\"\n ? client.agent({ id: selection.id })\n : client.user({ id: selection.id });\n}\n\nexport async function runAppendCommand(\n args: string[],\n globalOptions: GlobalOptions,\n runtime: CliRuntime\n): Promise<void> {\n const parsed = parseArgs(\n {\n \"--agent\": String,\n \"--user\": String,\n \"--text\": String,\n \"--type\": String,\n \"--source\": String,\n \"--payload\": String,\n \"--metadata\": String,\n \"--refs\": String,\n \"--idempotency-key\": String,\n \"--expected-seq\": String,\n },\n args\n );\n const sessionId = `${parsed._[0] ?? \"\"}`;\n\n if (!sessionId) {\n throw new CliUsageError(\"append requires <sessionId>\");\n }\n\n const agent = trimString(parsed[\"--agent\"]);\n const user = trimString(parsed[\"--user\"]);\n const text = trimString(parsed[\"--text\"]);\n const payload = parsed[\"--payload\"]\n ? parseJsonObject(parsed[\"--payload\"], \"--payload\")\n : undefined;\n\n if (agent && user) {\n throw new CliUsageError(\"Choose either --agent or --user, not both\");\n }\n\n if (text && payload) {\n throw new CliUsageError(\"Choose either --text or --payload, not both\");\n }\n\n if (!(text || payload)) {\n throw new CliUsageError(\"append requires either --text or --payload\");\n }\n\n let identity: AppendIdentitySelection | undefined;\n if (agent) {\n identity = { type: \"agent\", id: agent };\n } else if (user) {\n identity = { type: \"user\", id: user };\n }\n\n const resolved = await runtime.resolveGlobalOptions(globalOptions);\n const session = await resolved.client.session({\n identity: resolveAppendIdentity(identity, resolved.client),\n id: sessionId,\n });\n const response = await session.append({\n type: parsed[\"--type\"] ?? \"content\",\n payload: payload ?? { text },\n source: parsed[\"--source\"],\n metadata: parsed[\"--metadata\"]\n ? parseJsonObject(parsed[\"--metadata\"], \"--metadata\")\n : undefined,\n refs: parsed[\"--refs\"]\n ? parseJsonObject(parsed[\"--refs\"], \"--refs\")\n : undefined,\n idempotencyKey: parsed[\"--idempotency-key\"],\n expectedSeq: parsed[\"--expected-seq\"]\n ? parseNonNegativeInteger(parsed[\"--expected-seq\"], \"--expected-seq\")\n : undefined,\n });\n\n if (resolved.json) {\n runtime.writeJsonOutput(response, true);\n return;\n }\n\n runtime.logger.info(`seq=${response.seq} deduped=${response.deduped}`);\n}\n","import { resolveConfigDir, StarciteCliConfigStore } from \"../config\";\nimport {\n type CliRuntime,\n CliUsageError,\n type GlobalOptions,\n parseConfigSetKey,\n parseEndpoint,\n resolveConfiguredBaseUrl,\n trimString,\n} from \"../runtime\";\n\nexport async function runConfigCommand(\n args: string[],\n globalOptions: GlobalOptions,\n runtime: CliRuntime\n): Promise<void> {\n const action = args[0];\n const config = new StarciteCliConfigStore(\n resolveConfigDir(globalOptions.configDir)\n );\n\n if (action === \"set\") {\n const key = args[1];\n const value = args[2];\n\n if (!(key && value)) {\n throw new CliUsageError(\"config set requires <key> and <value>\");\n }\n\n if (parseConfigSetKey(key) === \"endpoint\") {\n const endpoint = parseEndpoint(value, \"endpoint\");\n await config.updateConfig({ baseUrl: endpoint });\n runtime.logger.info(`Endpoint set to ${endpoint}`);\n return;\n }\n\n await config.saveApiKey(value);\n await config.updateConfig({ apiKey: undefined });\n runtime.logger.info(\"API key saved.\");\n return;\n }\n\n if (action === \"show\") {\n const fileConfig = await config.readConfig();\n const apiKey = await config.readApiKey();\n const fromEnv = trimString(process.env.STARCITE_API_KEY);\n let apiKeySource = \"unset\";\n\n if (fromEnv) {\n apiKeySource = \"env\";\n } else if (apiKey) {\n apiKeySource = \"stored\";\n }\n\n const output = {\n endpoint: resolveConfiguredBaseUrl(fileConfig, globalOptions),\n apiKey: apiKey ? \"***\" : null,\n apiKeySource,\n configDir: config.directory,\n };\n\n if (globalOptions.json) {\n runtime.writeJsonOutput(output, true);\n return;\n }\n\n runtime.logger.info(JSON.stringify(output, null, 2));\n return;\n }\n\n throw new CliUsageError(\"config requires `set` or `show`\");\n}\n","import {\n type CliRuntime,\n type GlobalOptions,\n parseArgs,\n parseJsonObject,\n} from \"../runtime\";\n\nconst DEFAULT_CREATE_AGENT_ID = \"starcite-cli\";\n\nexport async function runCreateCommand(\n args: string[],\n globalOptions: GlobalOptions,\n runtime: CliRuntime\n): Promise<void> {\n const parsed = parseArgs(\n {\n \"--id\": String,\n \"--title\": String,\n \"--metadata\": String,\n },\n args\n );\n const metadata = parsed[\"--metadata\"]\n ? parseJsonObject(parsed[\"--metadata\"], \"--metadata\")\n : undefined;\n const resolved = await runtime.resolveGlobalOptions(globalOptions);\n const session = await resolved.client.session({\n identity: resolved.client.agent({ id: DEFAULT_CREATE_AGENT_ID }),\n id: parsed[\"--id\"],\n title: parsed[\"--title\"],\n metadata,\n });\n\n if (resolved.json) {\n runtime.writeJsonOutput(session.record ?? { id: session.id }, true);\n return;\n }\n\n runtime.logger.info(session.id);\n}\n","import {\n type CliRuntime,\n CliUsageError,\n type GlobalOptions,\n parseArgs,\n parsePositiveInteger,\n parseSessionMetadataFilters,\n trimString,\n} from \"../runtime\";\n\nexport async function runSessionsCommand(\n args: string[],\n globalOptions: GlobalOptions,\n runtime: CliRuntime\n): Promise<void> {\n const parsed = parseArgs(\n {\n \"--limit\": String,\n \"--cursor\": String,\n \"--metadata\": String,\n },\n args\n );\n\n if (`${parsed._[0] ?? \"\"}` !== \"list\") {\n throw new CliUsageError(\"sessions requires `list`\");\n }\n\n const cursor = trimString(parsed[\"--cursor\"]);\n if (parsed[\"--cursor\"] !== undefined && !cursor) {\n throw new CliUsageError(\"--cursor must be non-empty\");\n }\n\n const resolved = await runtime.resolveGlobalOptions(globalOptions);\n const page = await resolved.client.listSessions({\n limit: parsed[\"--limit\"]\n ? parsePositiveInteger(parsed[\"--limit\"], \"--limit\")\n : undefined,\n cursor,\n metadata: parsed[\"--metadata\"]\n ? parseSessionMetadataFilters(parsed[\"--metadata\"])\n : undefined,\n });\n\n runtime.logger.error(\n \"Warning: `sessions list` is a bad call to use in production.\"\n );\n\n if (resolved.json) {\n runtime.writeJsonOutput(page, true);\n return;\n }\n\n if (page.sessions.length === 0) {\n runtime.logger.info(\"No sessions found.\");\n return;\n }\n\n runtime.logger.info(\"id\\ttitle\\tcreated_at\");\n for (const session of page.sessions) {\n runtime.logger.info(\n `${session.id}\\t${session.title ?? \"\"}\\t${session.created_at}`\n );\n }\n\n if (page.next_cursor) {\n runtime.logger.info(`next_cursor=${page.next_cursor}`);\n }\n}\n","import {\n SessionLogConflictError,\n SessionLogGapError,\n type StarciteSession,\n} from \"@starcite/sdk\";\nimport {\n type CliRuntime,\n CliUsageError,\n DEFAULT_TAIL_BATCH_SIZE,\n type GlobalOptions,\n parseArgs,\n parseNonNegativeInteger,\n} from \"../runtime\";\n\nconst DEFAULT_CREATE_AGENT_ID = \"starcite-cli\";\n\nexport async function runTailCommand(\n args: string[],\n globalOptions: GlobalOptions,\n runtime: CliRuntime\n): Promise<void> {\n const parsed = parseArgs(\n {\n \"--cursor\": String,\n \"--agent\": String,\n \"--limit\": String,\n \"--no-follow\": Boolean,\n },\n args\n );\n const sessionId = `${parsed._[0] ?? \"\"}`;\n\n if (!sessionId) {\n throw new CliUsageError(\"tail requires <sessionId>\");\n }\n\n const resolved = await runtime.resolveGlobalOptions(globalOptions);\n const abortController = new AbortController();\n const onSigint = () => {\n abortController.abort();\n };\n const cursor = parsed[\"--cursor\"]\n ? parseNonNegativeInteger(parsed[\"--cursor\"], \"--cursor\")\n : 0;\n const limit = parsed[\"--limit\"]\n ? parseNonNegativeInteger(parsed[\"--limit\"], \"--limit\")\n : undefined;\n\n process.once(\"SIGINT\", onSigint);\n\n try {\n let retriedAfterStoreReset = false;\n\n while (true) {\n const session = await resolved.client.session({\n identity: resolved.client.agent({ id: DEFAULT_CREATE_AGENT_ID }),\n id: sessionId,\n });\n\n try {\n await emitTailEvents({\n session,\n agent: parsed[\"--agent\"],\n cursor,\n follow: parsed[\"--no-follow\"] !== true,\n limit,\n json: resolved.json,\n runtime,\n signal: abortController.signal,\n });\n return;\n } catch (error) {\n const isStaleStoreConflict =\n error instanceof SessionLogConflictError ||\n error instanceof SessionLogGapError;\n\n if (!(isStaleStoreConflict && !retriedAfterStoreReset)) {\n throw error;\n }\n\n retriedAfterStoreReset = true;\n resolved.store.clearSession(resolved.baseUrl, sessionId);\n runtime.logger.error(\n `Warning: cleared stale local session cache for '${sessionId}' and retried tail.`\n );\n }\n }\n } finally {\n process.removeListener(\"SIGINT\", onSigint);\n }\n}\n\nasync function emitTailEvents({\n session,\n agent,\n cursor,\n follow,\n limit,\n json,\n runtime,\n signal,\n}: {\n session: StarciteSession;\n agent?: string;\n cursor: number;\n follow: boolean;\n limit: number | undefined;\n json: boolean;\n runtime: CliRuntime;\n signal: AbortSignal;\n}): Promise<void> {\n let emitted = 0;\n\n for await (const { event } of session.tail({\n cursor,\n batchSize: DEFAULT_TAIL_BATCH_SIZE,\n agent,\n follow,\n signal,\n })) {\n if (limit !== undefined && emitted >= limit) {\n return;\n }\n\n if (json) {\n runtime.writeJsonOutput(event);\n } else {\n runtime.logger.info(runtime.formatTailEvent(event));\n }\n\n emitted += 1;\n\n if (limit !== undefined && emitted >= limit) {\n return;\n }\n }\n}\n","import { run } from \"./cli\";\n\nrun();\n"],"mappings":"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","names":["Conf","TRAILING_SLASHES_REGEX","trimString","TRAILING_SLASHES_REGEX","trimString","trimString","DEFAULT_CREATE_AGENT_ID","trimString","DEFAULT_CREATE_AGENT_ID"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "starcite",
3
- "version": "0.0.7",
3
+ "version": "0.0.9",
4
4
  "description": "CLI for Starcite",
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://starcite.ai",
@@ -42,19 +42,14 @@
42
42
  "check": "bun run lint && bun run typecheck && bun run test"
43
43
  },
44
44
  "dependencies": {
45
- "@clack/prompts": "^1.0.1",
46
- "@starcite/sdk": "^0.0.7",
47
- "commander": "^13.1.0",
45
+ "@starcite/sdk": "^0.0.9",
46
+ "arg": "^5.0.2",
48
47
  "conf": "^15.1.0",
49
- "consola": "^3.4.2",
50
- "cosmiconfig": "^9.0.0",
51
- "proper-lockfile": "^4.1.2",
52
48
  "toml": "^3.0.0",
53
49
  "zod": "^3.25.76"
54
50
  },
55
51
  "devDependencies": {
56
52
  "@types/node": "^22.15.30",
57
- "@types/proper-lockfile": "^4.1.4",
58
53
  "tsup": "^8.5.0",
59
54
  "typescript": "^5.8.3",
60
55
  "vitest": "^2.1.9"