starcite 0.0.1 → 0.0.3
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/README.md +9 -0
- package/dist/index.js +70 -2
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -70,6 +70,7 @@ starcite config set api-key <YOUR_KEY>
|
|
|
70
70
|
- `-k, --token <token>`: Starcite API key / service JWT (highest precedence)
|
|
71
71
|
- `--config-dir <path>`: Starcite CLI config directory (defaults to `~/.starcite`)
|
|
72
72
|
- `--json`: machine-readable JSON output
|
|
73
|
+
- `-v, --version`: show CLI version and exit
|
|
73
74
|
- `-h, --help`: show help text
|
|
74
75
|
|
|
75
76
|
Base URL resolution order:
|
|
@@ -87,6 +88,14 @@ API key resolution order:
|
|
|
87
88
|
|
|
88
89
|
## Commands
|
|
89
90
|
|
|
91
|
+
### `version`
|
|
92
|
+
|
|
93
|
+
Print the installed CLI version.
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
starcite version
|
|
97
|
+
```
|
|
98
|
+
|
|
90
99
|
### `create`
|
|
91
100
|
|
|
92
101
|
Create a session.
|
package/dist/index.js
CHANGED
|
@@ -10,6 +10,69 @@ import { Command, InvalidArgumentError } from "commander";
|
|
|
10
10
|
import { createConsola } from "consola";
|
|
11
11
|
import { z as z2 } from "zod";
|
|
12
12
|
|
|
13
|
+
// package.json
|
|
14
|
+
var package_default = {
|
|
15
|
+
name: "starcite",
|
|
16
|
+
version: "0.0.3",
|
|
17
|
+
description: "CLI for Starcite",
|
|
18
|
+
license: "Apache-2.0",
|
|
19
|
+
homepage: "https://starcite.ai",
|
|
20
|
+
repository: {
|
|
21
|
+
type: "git",
|
|
22
|
+
url: "https://github.com/fastpaca/starcite-clients.git",
|
|
23
|
+
directory: "packages/starcite-cli"
|
|
24
|
+
},
|
|
25
|
+
bugs: {
|
|
26
|
+
url: "https://github.com/fastpaca/starcite-clients/issues"
|
|
27
|
+
},
|
|
28
|
+
keywords: [
|
|
29
|
+
"starcite",
|
|
30
|
+
"ai",
|
|
31
|
+
"sessions",
|
|
32
|
+
"event-log",
|
|
33
|
+
"cli"
|
|
34
|
+
],
|
|
35
|
+
type: "module",
|
|
36
|
+
bin: {
|
|
37
|
+
starcite: "./dist/index.js"
|
|
38
|
+
},
|
|
39
|
+
files: [
|
|
40
|
+
"dist"
|
|
41
|
+
],
|
|
42
|
+
scripts: {
|
|
43
|
+
clean: "rm -rf dist",
|
|
44
|
+
build: "tsup",
|
|
45
|
+
dev: "bun run src/index.ts",
|
|
46
|
+
compile: "bun run --cwd ../typescript-sdk build && bun build --compile src/index.ts --outfile dist/starcite",
|
|
47
|
+
test: "vitest run && bun run test:dist",
|
|
48
|
+
typecheck: "tsc -p tsconfig.json --noEmit",
|
|
49
|
+
prepublishOnly: "bun run clean && bun run build",
|
|
50
|
+
"publish:dry": "bun publish --dry-run --access public",
|
|
51
|
+
"test:dist": "bun run --cwd ../typescript-sdk build && bun run clean && bun run build && node dist/index.js --help > /dev/null",
|
|
52
|
+
lint: "ultracite check src test package.json tsconfig.json tsup.config.ts vitest.config.ts README.md",
|
|
53
|
+
format: "ultracite fix src test package.json tsconfig.json tsup.config.ts vitest.config.ts README.md",
|
|
54
|
+
check: "bun run lint && bun run typecheck && bun run test"
|
|
55
|
+
},
|
|
56
|
+
dependencies: {
|
|
57
|
+
"@clack/prompts": "^1.0.1",
|
|
58
|
+
"@starcite/sdk": "^0.0.2",
|
|
59
|
+
commander: "^13.1.0",
|
|
60
|
+
conf: "^15.1.0",
|
|
61
|
+
consola: "^3.4.2",
|
|
62
|
+
cosmiconfig: "^9.0.0",
|
|
63
|
+
"proper-lockfile": "^4.1.2",
|
|
64
|
+
toml: "^3.0.0",
|
|
65
|
+
zod: "^3.25.76"
|
|
66
|
+
},
|
|
67
|
+
devDependencies: {
|
|
68
|
+
"@types/node": "^22.15.30",
|
|
69
|
+
"@types/proper-lockfile": "^4.1.4",
|
|
70
|
+
tsup: "^8.5.0",
|
|
71
|
+
typescript: "^5.8.3",
|
|
72
|
+
vitest: "^2.1.9"
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
|
|
13
76
|
// src/store.ts
|
|
14
77
|
import { randomUUID } from "crypto";
|
|
15
78
|
import { mkdir, writeFile } from "fs/promises";
|
|
@@ -563,6 +626,7 @@ var defaultCommandRunner = (command, args, options) => new Promise((resolve2) =>
|
|
|
563
626
|
|
|
564
627
|
// src/cli.ts
|
|
565
628
|
var defaultLogger = createConsola();
|
|
629
|
+
var cliVersion = package_default.version;
|
|
566
630
|
var nonNegativeIntegerSchema = z2.coerce.number().int().nonnegative();
|
|
567
631
|
var positiveIntegerSchema = z2.coerce.number().int().positive();
|
|
568
632
|
var jsonObjectSchema = z2.record(z2.unknown());
|
|
@@ -708,10 +772,13 @@ function buildProgram(deps = {}) {
|
|
|
708
772
|
const prompt = deps.prompt ?? createDefaultPrompt();
|
|
709
773
|
const runCommand = deps.runCommand ?? defaultCommandRunner;
|
|
710
774
|
const program = new Command();
|
|
711
|
-
program.name("starcite").description("Starcite CLI").showHelpAfterError().option("-u, --base-url <url>", "Starcite API base URL").option("-k, --token <token>", "Starcite API key / service JWT").option(
|
|
775
|
+
program.name("starcite").description("Starcite CLI").showHelpAfterError().version(cliVersion, "-v, --version", "Print current CLI version").option("-u, --base-url <url>", "Starcite API base URL").option("-k, --token <token>", "Starcite API key / service JWT").option(
|
|
712
776
|
"--config-dir <path>",
|
|
713
777
|
"Starcite CLI config directory (default: ~/.starcite)"
|
|
714
778
|
).option("--json", "Output JSON");
|
|
779
|
+
program.command("version").description("Print current CLI version").action(() => {
|
|
780
|
+
logger.info(cliVersion);
|
|
781
|
+
});
|
|
715
782
|
program.command("init").description("Initialize Starcite CLI config for a remote instance").option("--endpoint <url>", "Starcite endpoint URL").option("--api-key <key>", "API key to store").option("-y, --yes", "Skip prompts and only use provided options").action(async function initAction(options) {
|
|
716
783
|
const { baseUrl, json, store } = await resolveGlobalOptions(this);
|
|
717
784
|
const defaultEndpoint = parseEndpoint(baseUrl, "endpoint");
|
|
@@ -979,7 +1046,7 @@ function buildProgram(deps = {}) {
|
|
|
979
1046
|
"--limit <count>",
|
|
980
1047
|
"Stop after N events",
|
|
981
1048
|
(value) => parseNonNegativeInteger(value, "--limit")
|
|
982
|
-
).action(async function tailAction(sessionId, options) {
|
|
1049
|
+
).option("--no-follow", "Exit after replaying stored events").action(async function tailAction(sessionId, options) {
|
|
983
1050
|
const { baseUrl, apiKey, json } = await resolveGlobalOptions(this);
|
|
984
1051
|
const client = apiKey ? createClient(baseUrl, apiKey) : createClient(baseUrl);
|
|
985
1052
|
const session = client.session(sessionId);
|
|
@@ -993,6 +1060,7 @@ function buildProgram(deps = {}) {
|
|
|
993
1060
|
for await (const event of session.tail({
|
|
994
1061
|
cursor: options.cursor ?? 0,
|
|
995
1062
|
agent: options.agent,
|
|
1063
|
+
follow: options.follow,
|
|
996
1064
|
signal: abortController.signal
|
|
997
1065
|
})) {
|
|
998
1066
|
if (json) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/store.ts","../src/up.ts","../src/index.ts"],"sourcesContent":["import {\n createStarciteClient,\n normalizeBaseUrl,\n type SessionEvent,\n StarciteApiError,\n type StarciteClient,\n} from \"@starcite/sdk\";\nimport { Command, InvalidArgumentError } from \"commander\";\nimport { createConsola } from \"consola\";\nimport { z } from \"zod\";\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 CliDependencies {\n createClient?: (baseUrl: string, apiKey?: string) => StarciteClient;\n logger?: LoggerLike;\n prompt?: PromptAdapter;\n runCommand?: CommandRunner;\n}\n\ntype CliJsonObject = Record<string, unknown>;\n\nconst defaultLogger: LoggerLike = createConsola();\n\nconst nonNegativeIntegerSchema = z.coerce.number().int().nonnegative();\nconst positiveIntegerSchema = z.coerce.number().int().positive();\nconst jsonObjectSchema = z.record(z.unknown());\nconst TRAILING_SLASHES_REGEX = /\\/+$/;\n\ntype ConfigSetKey = \"endpoint\" | \"producer-id\" | \"api-key\";\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 parseJsonOption<T>(\n value: string,\n schema: z.ZodType<T>,\n optionName: string,\n invalidShapeMessage: string\n): T {\n let parsed: unknown;\n\n try {\n parsed = JSON.parse(value);\n } catch {\n throw new InvalidArgumentError(`${optionName} must be valid JSON`);\n }\n\n const result = schema.safeParse(parsed);\n\n if (!result.success) {\n throw new InvalidArgumentError(\n `${optionName} must be ${invalidShapeMessage}`\n );\n }\n\n return result.data;\n}\n\nfunction parseJsonObject(value: string, optionName: string): CliJsonObject {\n return parseJsonOption(value, jsonObjectSchema, optionName, \"a JSON object\");\n}\n\nfunction parseEventRefs(value: string): CliJsonObject {\n return parseJsonObject(value, \"--refs\");\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 return command.optsWithGlobals() as GlobalOptions;\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\nasync function promptForEndpoint(\n prompt: PromptAdapter,\n defaultEndpoint: string\n): Promise<string> {\n while (true) {\n const answer = await prompt.input(\"Starcite endpoint URL\", defaultEndpoint);\n\n try {\n return parseEndpoint(answer, \"endpoint\");\n } catch {\n // keep asking until valid\n }\n }\n}\n\nasync function promptForApiKey(prompt: PromptAdapter): Promise<string> {\n const message = \"Paste your Starcite API key\";\n const answer = prompt.password\n ? await prompt.password(message)\n : await prompt.input(message, \"\");\n\n return trimString(answer) ?? \"\";\n}\n\nfunction formatTailEvent(event: SessionEvent): string {\n const actorLabel = event.agent ?? event.actor;\n\n if (event.text) {\n return `[${actorLabel}] ${event.text}`;\n }\n\n return `[${actorLabel}] ${JSON.stringify(event.payload)}`;\n}\n\nexport function buildProgram(deps: CliDependencies = {}): Command {\n const createClient =\n deps.createClient ??\n ((baseUrl: string, apiKey?: string) =>\n createStarciteClient({\n baseUrl,\n apiKey,\n }));\n const logger = deps.logger ?? defaultLogger;\n const prompt = deps.prompt ?? createDefaultPrompt();\n const runCommand = deps.runCommand ?? defaultCommandRunner;\n\n const program = new Command();\n\n program\n .name(\"starcite\")\n .description(\"Starcite CLI\")\n .showHelpAfterError()\n .option(\"-u, --base-url <url>\", \"Starcite API base URL\")\n .option(\"-k, --token <token>\", \"Starcite API key / service JWT\")\n .option(\n \"--config-dir <path>\",\n \"Starcite CLI config directory (default: ~/.starcite)\"\n )\n .option(\"--json\", \"Output JSON\");\n\n program\n .command(\"init\")\n .description(\"Initialize Starcite CLI config for a remote instance\")\n .option(\"--endpoint <url>\", \"Starcite endpoint URL\")\n .option(\"--api-key <key>\", \"API key to store\")\n .option(\"-y, --yes\", \"Skip prompts and only use provided options\")\n .action(async function initAction(options: {\n endpoint?: string;\n apiKey?: string;\n yes?: boolean;\n }) {\n const { baseUrl, json, store } = await resolveGlobalOptions(this);\n\n const defaultEndpoint = parseEndpoint(baseUrl, \"endpoint\");\n let endpoint = defaultEndpoint;\n\n if (options.endpoint) {\n endpoint = parseEndpoint(options.endpoint, \"--endpoint\");\n } else if (!options.yes) {\n endpoint = await promptForEndpoint(prompt, defaultEndpoint);\n }\n\n await store.updateConfig({ baseUrl: endpoint });\n\n let apiKey = trimString(options.apiKey);\n\n if (!(apiKey || options.yes)) {\n apiKey = await promptForApiKey(prompt);\n }\n\n if (apiKey) {\n await store.saveApiKey(apiKey);\n await store.updateConfig({ apiKey: undefined });\n }\n\n if (json) {\n logger.info(\n JSON.stringify(\n {\n configDir: store.directory,\n endpoint,\n apiKeySaved: Boolean(apiKey),\n },\n null,\n 2\n )\n );\n return;\n }\n\n logger.info(`Initialized Starcite CLI in ${store.directory}`);\n logger.info(`Endpoint set to ${endpoint}`);\n if (apiKey) {\n logger.info(\"API key saved. You can now run create/append/tail.\");\n } else {\n logger.info(\"API key not set. Run `starcite auth login` when ready.\");\n }\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 configSetAction(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 configShowAction() {\n const { baseUrl, 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 logger.info(\n JSON.stringify(\n {\n endpoint: config.baseUrl ?? baseUrl,\n producerId: config.producerId ?? null,\n apiKey: apiKey ? \"***\" : null,\n apiKeySource,\n configDir: store.directory,\n },\n null,\n 2\n )\n );\n })\n );\n\n program\n .command(\"auth\")\n .description(\"Manage API key authentication\")\n .addCommand(\n new Command(\"login\")\n .description(\"Save an API key for authenticated requests\")\n .option(\"--api-key <key>\", \"API key to store\")\n .action(async function authLoginAction(options: { apiKey?: string }) {\n const { store } = await resolveGlobalOptions(this);\n let apiKey = trimString(options.apiKey);\n\n if (!apiKey) {\n apiKey = await promptForApiKey(prompt);\n }\n\n if (!apiKey) {\n throw new Error(\"API key cannot be empty\");\n }\n\n await store.saveApiKey(apiKey);\n await store.updateConfig({ apiKey: undefined });\n logger.info(\"API key saved.\");\n })\n )\n .addCommand(\n new Command(\"logout\")\n .description(\"Remove the saved API key\")\n .action(async function authLogoutAction() {\n const { store } = await resolveGlobalOptions(this);\n await store.clearApiKey();\n logger.info(\"Saved API key removed.\");\n })\n )\n .addCommand(\n new Command(\"status\")\n .description(\"Show authentication status\")\n .action(async function authStatusAction() {\n const { store } = await resolveGlobalOptions(this);\n const apiKey = await store.readApiKey();\n const fromEnv = trimString(process.env.STARCITE_API_KEY);\n\n if (fromEnv) {\n logger.info(\"Authenticated via STARCITE_API_KEY.\");\n return;\n }\n\n if (apiKey) {\n logger.info(\"Authenticated via saved API key.\");\n return;\n }\n\n logger.info(\"No API key configured. Run `starcite auth login`.\");\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 sessionsListAction(options: {\n limit?: number;\n cursor?: string;\n metadata?: string;\n }) {\n const { baseUrl, apiKey, json } = await resolveGlobalOptions(this);\n const client = apiKey\n ? createClient(baseUrl, apiKey)\n : createClient(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 logger.info(JSON.stringify(page, null, 2));\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 upAction(options: {\n yes?: boolean;\n port?: number;\n dbPort?: number;\n image?: string;\n }) {\n const { baseUrl, store } = await resolveGlobalOptions(this);\n\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 downAction(options: {\n yes?: boolean;\n volumes?: boolean;\n }) {\n const { store } = await resolveGlobalOptions(this);\n\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 createAction(options: {\n id?: string;\n title?: string;\n metadata?: string;\n }) {\n const { baseUrl, apiKey, json } = await resolveGlobalOptions(this);\n const client = apiKey\n ? createClient(baseUrl, apiKey)\n : createClient(baseUrl);\n const metadata = options.metadata\n ? parseJsonObject(options.metadata, \"--metadata\")\n : undefined;\n\n const session = await client.create({\n id: options.id,\n title: options.title,\n metadata,\n });\n\n if (json) {\n logger.info(\n JSON.stringify(session.record ?? { id: session.id }, null, 2)\n );\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 appendAction(\n sessionId: string,\n options: {\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 ) {\n const { baseUrl, apiKey, json, store } = await resolveGlobalOptions(this);\n const client = apiKey\n ? createClient(baseUrl, apiKey)\n : createClient(baseUrl);\n const session = client.session(sessionId);\n\n const metadata = options.metadata\n ? parseJsonObject(options.metadata, \"--metadata\")\n : undefined;\n const refs = options.refs ? parseEventRefs(options.refs) : undefined;\n\n const highLevelMode =\n options.agent !== undefined || options.text !== undefined;\n const rawMode =\n options.actor !== undefined || options.payload !== undefined;\n\n if (highLevelMode && rawMode) {\n throw new Error(\n \"Choose either high-level mode (--agent and --text) or raw mode (--actor and --payload), not both\"\n );\n }\n\n const producerId = await store.resolveProducerId(options.producerId);\n const normalizedBaseUrl = normalizeBaseUrl(baseUrl);\n const contextKey = buildSeqContextKey(\n normalizedBaseUrl,\n sessionId,\n producerId\n );\n\n const response = await store.withStateLock(async () => {\n const producerSeq =\n options.producerSeq ?? (await store.readNextSeq(contextKey));\n const appendOptions = {\n ...options,\n producerId,\n producerSeq,\n };\n\n const appendResponse = highLevelMode\n ? await appendHighLevel(session, appendOptions, metadata, refs)\n : await appendRaw(session, appendOptions, metadata, refs);\n\n await store.bumpNextSeq(contextKey, producerSeq);\n return appendResponse;\n });\n\n if (json) {\n logger.info(JSON.stringify(response, null, 2));\n return;\n }\n\n logger.info(\n `seq=${response.seq} last_seq=${response.last_seq} deduped=${response.deduped}`\n );\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 .action(async function tailAction(\n sessionId: string,\n options: {\n cursor?: number;\n agent?: string;\n limit?: number;\n }\n ) {\n const { baseUrl, apiKey, json } = await resolveGlobalOptions(this);\n const client = apiKey\n ? createClient(baseUrl, apiKey)\n : createClient(baseUrl);\n const session = client.session(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 agent: options.agent,\n signal: abortController.signal,\n })) {\n if (json) {\n logger.info(JSON.stringify(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 break;\n }\n }\n } finally {\n process.removeListener(\"SIGINT\", onSigint);\n }\n });\n\n return program;\n}\n\nfunction appendHighLevel(\n session: ReturnType<StarciteClient[\"session\"]>,\n options: {\n agent?: string;\n text?: string;\n type: string;\n source?: string;\n producerId: string;\n producerSeq: number;\n idempotencyKey?: string;\n expectedSeq?: number;\n },\n metadata?: CliJsonObject,\n refs?: CliJsonObject\n) {\n if (!(options.agent && options.text)) {\n throw new Error(\n \"--agent and --text are required for high-level append mode\"\n );\n }\n return session.append({\n agent: options.agent,\n producerId: options.producerId,\n producerSeq: options.producerSeq,\n text: options.text,\n type: options.type,\n source: options.source,\n metadata,\n refs,\n idempotencyKey: options.idempotencyKey,\n expectedSeq: options.expectedSeq,\n });\n}\n\nfunction appendRaw(\n session: ReturnType<StarciteClient[\"session\"]>,\n options: {\n actor?: string;\n payload?: string;\n type: string;\n source?: string;\n producerId: string;\n producerSeq: number;\n idempotencyKey?: string;\n expectedSeq?: number;\n },\n metadata?: CliJsonObject,\n refs?: CliJsonObject\n) {\n if (!(options.actor && options.payload)) {\n throw new Error(\n \"Raw append mode requires --actor and --payload, or use --agent and --text\"\n );\n }\n return session.appendRaw({\n type: options.type,\n payload: parseJsonObject(options.payload, \"--payload\"),\n actor: options.actor,\n producer_id: options.producerId,\n producer_seq: options.producerSeq,\n source: options.source,\n metadata,\n refs,\n idempotency_key: options.idempotencyKey,\n expected_seq: options.expectedSeq,\n });\n}\n\nexport async function run(\n argv = process.argv,\n deps: CliDependencies = {}\n): Promise<void> {\n const program = buildProgram(deps);\n\n try {\n await program.parseAsync(argv);\n } catch (error) {\n if (error instanceof StarciteApiError) {\n const logger = deps.logger ?? defaultLogger;\n logger.error(`${error.code} (${error.status}): ${error.message}`);\n process.exitCode = 1;\n return;\n }\n\n if (error instanceof Error) {\n const logger = deps.logger ?? defaultLogger;\n logger.error(error.message);\n process.exitCode = 1;\n return;\n }\n\n const logger = deps.logger ?? defaultLogger;\n logger.error(\"Unknown error\");\n process.exitCode = 1;\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":"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","names":["z","mkdir","writeFile","join","resolve","z","parsePort","trimString","logger"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../package.json","../src/store.ts","../src/up.ts","../src/index.ts"],"sourcesContent":["import {\n createStarciteClient,\n normalizeBaseUrl,\n type SessionEvent,\n StarciteApiError,\n type StarciteClient,\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 CliDependencies {\n createClient?: (baseUrl: string, apiKey?: string) => StarciteClient;\n logger?: LoggerLike;\n prompt?: PromptAdapter;\n runCommand?: CommandRunner;\n}\n\ntype CliJsonObject = Record<string, unknown>;\n\nconst defaultLogger: LoggerLike = createConsola();\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 TRAILING_SLASHES_REGEX = /\\/+$/;\n\ntype ConfigSetKey = \"endpoint\" | \"producer-id\" | \"api-key\";\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 parseJsonOption<T>(\n value: string,\n schema: z.ZodType<T>,\n optionName: string,\n invalidShapeMessage: string\n): T {\n let parsed: unknown;\n\n try {\n parsed = JSON.parse(value);\n } catch {\n throw new InvalidArgumentError(`${optionName} must be valid JSON`);\n }\n\n const result = schema.safeParse(parsed);\n\n if (!result.success) {\n throw new InvalidArgumentError(\n `${optionName} must be ${invalidShapeMessage}`\n );\n }\n\n return result.data;\n}\n\nfunction parseJsonObject(value: string, optionName: string): CliJsonObject {\n return parseJsonOption(value, jsonObjectSchema, optionName, \"a JSON object\");\n}\n\nfunction parseEventRefs(value: string): CliJsonObject {\n return parseJsonObject(value, \"--refs\");\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 return command.optsWithGlobals() as GlobalOptions;\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\nasync function promptForEndpoint(\n prompt: PromptAdapter,\n defaultEndpoint: string\n): Promise<string> {\n while (true) {\n const answer = await prompt.input(\"Starcite endpoint URL\", defaultEndpoint);\n\n try {\n return parseEndpoint(answer, \"endpoint\");\n } catch {\n // keep asking until valid\n }\n }\n}\n\nasync function promptForApiKey(prompt: PromptAdapter): Promise<string> {\n const message = \"Paste your Starcite API key\";\n const answer = prompt.password\n ? await prompt.password(message)\n : await prompt.input(message, \"\");\n\n return trimString(answer) ?? \"\";\n}\n\nfunction formatTailEvent(event: SessionEvent): string {\n const actorLabel = event.agent ?? event.actor;\n\n if (event.text) {\n return `[${actorLabel}] ${event.text}`;\n }\n\n return `[${actorLabel}] ${JSON.stringify(event.payload)}`;\n}\n\nexport function buildProgram(deps: CliDependencies = {}): Command {\n const createClient =\n deps.createClient ??\n ((baseUrl: string, apiKey?: string) =>\n createStarciteClient({\n baseUrl,\n apiKey,\n }));\n const logger = deps.logger ?? defaultLogger;\n const prompt = deps.prompt ?? createDefaultPrompt();\n const runCommand = deps.runCommand ?? defaultCommandRunner;\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 / service JWT\")\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(\"init\")\n .description(\"Initialize Starcite CLI config for a remote instance\")\n .option(\"--endpoint <url>\", \"Starcite endpoint URL\")\n .option(\"--api-key <key>\", \"API key to store\")\n .option(\"-y, --yes\", \"Skip prompts and only use provided options\")\n .action(async function initAction(options: {\n endpoint?: string;\n apiKey?: string;\n yes?: boolean;\n }) {\n const { baseUrl, json, store } = await resolveGlobalOptions(this);\n\n const defaultEndpoint = parseEndpoint(baseUrl, \"endpoint\");\n let endpoint = defaultEndpoint;\n\n if (options.endpoint) {\n endpoint = parseEndpoint(options.endpoint, \"--endpoint\");\n } else if (!options.yes) {\n endpoint = await promptForEndpoint(prompt, defaultEndpoint);\n }\n\n await store.updateConfig({ baseUrl: endpoint });\n\n let apiKey = trimString(options.apiKey);\n\n if (!(apiKey || options.yes)) {\n apiKey = await promptForApiKey(prompt);\n }\n\n if (apiKey) {\n await store.saveApiKey(apiKey);\n await store.updateConfig({ apiKey: undefined });\n }\n\n if (json) {\n logger.info(\n JSON.stringify(\n {\n configDir: store.directory,\n endpoint,\n apiKeySaved: Boolean(apiKey),\n },\n null,\n 2\n )\n );\n return;\n }\n\n logger.info(`Initialized Starcite CLI in ${store.directory}`);\n logger.info(`Endpoint set to ${endpoint}`);\n if (apiKey) {\n logger.info(\"API key saved. You can now run create/append/tail.\");\n } else {\n logger.info(\"API key not set. Run `starcite auth login` when ready.\");\n }\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 configSetAction(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 configShowAction() {\n const { baseUrl, 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 logger.info(\n JSON.stringify(\n {\n endpoint: config.baseUrl ?? baseUrl,\n producerId: config.producerId ?? null,\n apiKey: apiKey ? \"***\" : null,\n apiKeySource,\n configDir: store.directory,\n },\n null,\n 2\n )\n );\n })\n );\n\n program\n .command(\"auth\")\n .description(\"Manage API key authentication\")\n .addCommand(\n new Command(\"login\")\n .description(\"Save an API key for authenticated requests\")\n .option(\"--api-key <key>\", \"API key to store\")\n .action(async function authLoginAction(options: { apiKey?: string }) {\n const { store } = await resolveGlobalOptions(this);\n let apiKey = trimString(options.apiKey);\n\n if (!apiKey) {\n apiKey = await promptForApiKey(prompt);\n }\n\n if (!apiKey) {\n throw new Error(\"API key cannot be empty\");\n }\n\n await store.saveApiKey(apiKey);\n await store.updateConfig({ apiKey: undefined });\n logger.info(\"API key saved.\");\n })\n )\n .addCommand(\n new Command(\"logout\")\n .description(\"Remove the saved API key\")\n .action(async function authLogoutAction() {\n const { store } = await resolveGlobalOptions(this);\n await store.clearApiKey();\n logger.info(\"Saved API key removed.\");\n })\n )\n .addCommand(\n new Command(\"status\")\n .description(\"Show authentication status\")\n .action(async function authStatusAction() {\n const { store } = await resolveGlobalOptions(this);\n const apiKey = await store.readApiKey();\n const fromEnv = trimString(process.env.STARCITE_API_KEY);\n\n if (fromEnv) {\n logger.info(\"Authenticated via STARCITE_API_KEY.\");\n return;\n }\n\n if (apiKey) {\n logger.info(\"Authenticated via saved API key.\");\n return;\n }\n\n logger.info(\"No API key configured. Run `starcite auth login`.\");\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 sessionsListAction(options: {\n limit?: number;\n cursor?: string;\n metadata?: string;\n }) {\n const { baseUrl, apiKey, json } = await resolveGlobalOptions(this);\n const client = apiKey\n ? createClient(baseUrl, apiKey)\n : createClient(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 logger.info(JSON.stringify(page, null, 2));\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 upAction(options: {\n yes?: boolean;\n port?: number;\n dbPort?: number;\n image?: string;\n }) {\n const { baseUrl, store } = await resolveGlobalOptions(this);\n\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 downAction(options: {\n yes?: boolean;\n volumes?: boolean;\n }) {\n const { store } = await resolveGlobalOptions(this);\n\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 createAction(options: {\n id?: string;\n title?: string;\n metadata?: string;\n }) {\n const { baseUrl, apiKey, json } = await resolveGlobalOptions(this);\n const client = apiKey\n ? createClient(baseUrl, apiKey)\n : createClient(baseUrl);\n const metadata = options.metadata\n ? parseJsonObject(options.metadata, \"--metadata\")\n : undefined;\n\n const session = await client.create({\n id: options.id,\n title: options.title,\n metadata,\n });\n\n if (json) {\n logger.info(\n JSON.stringify(session.record ?? { id: session.id }, null, 2)\n );\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 appendAction(\n sessionId: string,\n options: {\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 ) {\n const { baseUrl, apiKey, json, store } = await resolveGlobalOptions(this);\n const client = apiKey\n ? createClient(baseUrl, apiKey)\n : createClient(baseUrl);\n const session = client.session(sessionId);\n\n const metadata = options.metadata\n ? parseJsonObject(options.metadata, \"--metadata\")\n : undefined;\n const refs = options.refs ? parseEventRefs(options.refs) : undefined;\n\n const highLevelMode =\n options.agent !== undefined || options.text !== undefined;\n const rawMode =\n options.actor !== undefined || options.payload !== undefined;\n\n if (highLevelMode && rawMode) {\n throw new Error(\n \"Choose either high-level mode (--agent and --text) or raw mode (--actor and --payload), not both\"\n );\n }\n\n const producerId = await store.resolveProducerId(options.producerId);\n const normalizedBaseUrl = normalizeBaseUrl(baseUrl);\n const contextKey = buildSeqContextKey(\n normalizedBaseUrl,\n sessionId,\n producerId\n );\n\n const response = await store.withStateLock(async () => {\n const producerSeq =\n options.producerSeq ?? (await store.readNextSeq(contextKey));\n const appendOptions = {\n ...options,\n producerId,\n producerSeq,\n };\n\n const appendResponse = highLevelMode\n ? await appendHighLevel(session, appendOptions, metadata, refs)\n : await appendRaw(session, appendOptions, metadata, refs);\n\n await store.bumpNextSeq(contextKey, producerSeq);\n return appendResponse;\n });\n\n if (json) {\n logger.info(JSON.stringify(response, null, 2));\n return;\n }\n\n logger.info(\n `seq=${response.seq} last_seq=${response.last_seq} deduped=${response.deduped}`\n );\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 tailAction(\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 = client.session(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 agent: options.agent,\n follow: options.follow,\n signal: abortController.signal,\n })) {\n if (json) {\n logger.info(JSON.stringify(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 break;\n }\n }\n } finally {\n process.removeListener(\"SIGINT\", onSigint);\n }\n });\n\n return program;\n}\n\nfunction appendHighLevel(\n session: ReturnType<StarciteClient[\"session\"]>,\n options: {\n agent?: string;\n text?: string;\n type: string;\n source?: string;\n producerId: string;\n producerSeq: number;\n idempotencyKey?: string;\n expectedSeq?: number;\n },\n metadata?: CliJsonObject,\n refs?: CliJsonObject\n) {\n if (!(options.agent && options.text)) {\n throw new Error(\n \"--agent and --text are required for high-level append mode\"\n );\n }\n return session.append({\n agent: options.agent,\n producerId: options.producerId,\n producerSeq: options.producerSeq,\n text: options.text,\n type: options.type,\n source: options.source,\n metadata,\n refs,\n idempotencyKey: options.idempotencyKey,\n expectedSeq: options.expectedSeq,\n });\n}\n\nfunction appendRaw(\n session: ReturnType<StarciteClient[\"session\"]>,\n options: {\n actor?: string;\n payload?: string;\n type: string;\n source?: string;\n producerId: string;\n producerSeq: number;\n idempotencyKey?: string;\n expectedSeq?: number;\n },\n metadata?: CliJsonObject,\n refs?: CliJsonObject\n) {\n if (!(options.actor && options.payload)) {\n throw new Error(\n \"Raw append mode requires --actor and --payload, or use --agent and --text\"\n );\n }\n return session.appendRaw({\n type: options.type,\n payload: parseJsonObject(options.payload, \"--payload\"),\n actor: options.actor,\n producer_id: options.producerId,\n producer_seq: options.producerSeq,\n source: options.source,\n metadata,\n refs,\n idempotency_key: options.idempotencyKey,\n expected_seq: options.expectedSeq,\n });\n}\n\nexport async function run(\n argv = process.argv,\n deps: CliDependencies = {}\n): Promise<void> {\n const program = buildProgram(deps);\n\n try {\n await program.parseAsync(argv);\n } catch (error) {\n if (error instanceof StarciteApiError) {\n const logger = deps.logger ?? defaultLogger;\n logger.error(`${error.code} (${error.status}): ${error.message}`);\n process.exitCode = 1;\n return;\n }\n\n if (error instanceof Error) {\n const logger = deps.logger ?? defaultLogger;\n logger.error(error.message);\n process.exitCode = 1;\n return;\n }\n\n const logger = deps.logger ?? defaultLogger;\n logger.error(\"Unknown error\");\n process.exitCode = 1;\n }\n}\n","{\n \"name\": \"starcite\",\n \"version\": \"0.0.3\",\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 \"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.2\",\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":"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","names":["z","mkdir","writeFile","join","resolve","z","parsePort","trimString","logger"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "starcite",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.3",
|
|
4
4
|
"description": "CLI for Starcite",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"homepage": "https://starcite.ai",
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
44
|
"@clack/prompts": "^1.0.1",
|
|
45
|
-
"@starcite/sdk": "^0.0.
|
|
45
|
+
"@starcite/sdk": "^0.0.2",
|
|
46
46
|
"commander": "^13.1.0",
|
|
47
47
|
"conf": "^15.1.0",
|
|
48
48
|
"consola": "^3.4.2",
|