starcite 0.0.15 → 0.0.16
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 +38 -8
- package/dist/index.js +143 -6
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# [starcite](https://starcite.ai) CLI
|
|
2
2
|
|
|
3
|
-
CLI for creating sessions,
|
|
4
|
-
listing sessions from a terminal.
|
|
3
|
+
CLI for creating sessions, inspecting and mutating session headers, appending
|
|
4
|
+
events, tailing session timelines, and listing sessions from a terminal.
|
|
5
5
|
|
|
6
6
|
- Install globally: `npm install -g starcite`
|
|
7
7
|
- Run once with npm: `npx starcite`
|
|
@@ -31,8 +31,9 @@ bunx starcite --help
|
|
|
31
31
|
- An API key JWT with tenant context for the backend-oriented CLI flows
|
|
32
32
|
|
|
33
33
|
The current published CLI resolves a credential from `--token` / env / config,
|
|
34
|
-
then passes that value into the SDK as the client `apiKey`. In practice,
|
|
35
|
-
`create`, `append`, `
|
|
34
|
+
then passes that value into the SDK as the client `apiKey`. In practice, the
|
|
35
|
+
mutating commands (`create`, `append`, `sessions update`, `sessions archive`,
|
|
36
|
+
`sessions unarchive`) are API-key-driven commands.
|
|
36
37
|
|
|
37
38
|
## Resolution Order
|
|
38
39
|
|
|
@@ -57,6 +58,10 @@ starcite config set endpoint https://<your-instance>.starcite.io
|
|
|
57
58
|
starcite config set api-key <YOUR_API_KEY>
|
|
58
59
|
starcite create --id ses_demo --title "Draft contract"
|
|
59
60
|
starcite sessions list --limit 5
|
|
61
|
+
starcite sessions get ses_demo
|
|
62
|
+
starcite sessions update ses_demo --title "Filed contract" --metadata '{"workflow":"legal"}'
|
|
63
|
+
starcite sessions archive ses_demo
|
|
64
|
+
starcite sessions unarchive ses_demo
|
|
60
65
|
starcite append ses_demo --agent researcher --text "Found 8 relevant cases..."
|
|
61
66
|
starcite tail ses_demo --limit 1
|
|
62
67
|
```
|
|
@@ -175,27 +180,52 @@ Behavior:
|
|
|
175
180
|
- Without `--no-follow`, the command keeps following live events until interrupted.
|
|
176
181
|
- With `--no-follow`, the command exits after replay and a short idle window.
|
|
177
182
|
|
|
178
|
-
### `sessions
|
|
183
|
+
### `sessions <subcommand>`
|
|
179
184
|
|
|
180
|
-
|
|
185
|
+
Inspect or mutate session headers from the API catalog.
|
|
181
186
|
|
|
182
187
|
```bash
|
|
183
188
|
starcite sessions list
|
|
184
189
|
starcite sessions list --limit 20
|
|
185
190
|
starcite sessions list --cursor next_page_token
|
|
191
|
+
starcite sessions list --archived all
|
|
186
192
|
starcite sessions list --metadata '{"workflow":"planner"}'
|
|
193
|
+
starcite sessions get ses_demo
|
|
194
|
+
starcite sessions update ses_demo --title "Filed contract"
|
|
195
|
+
starcite sessions patch ses_demo --clear-title
|
|
196
|
+
starcite sessions update ses_demo --metadata '{"workflow":"planner"}' --expected-version 3
|
|
197
|
+
starcite sessions archive ses_demo
|
|
198
|
+
starcite sessions unarchive ses_demo
|
|
187
199
|
```
|
|
188
200
|
|
|
189
|
-
|
|
201
|
+
Subcommands:
|
|
202
|
+
|
|
203
|
+
- `list`
|
|
204
|
+
- `get <sessionId>`
|
|
205
|
+
- `update <sessionId>`
|
|
206
|
+
- `patch <sessionId>`: alias for `update`
|
|
207
|
+
- `archive <sessionId>`
|
|
208
|
+
- `unarchive <sessionId>`
|
|
209
|
+
|
|
210
|
+
`sessions list` flags:
|
|
190
211
|
|
|
191
212
|
- `--limit <positive integer>`
|
|
192
213
|
- `--cursor <cursor>`
|
|
214
|
+
- `--archived <active|archived|all>`
|
|
193
215
|
- `--metadata <json object of string values>`
|
|
194
216
|
|
|
217
|
+
`sessions update` / `sessions patch` flags:
|
|
218
|
+
|
|
219
|
+
- `--title <title>`
|
|
220
|
+
- `--clear-title`
|
|
221
|
+
- `--metadata <json object>`
|
|
222
|
+
- `--expected-version <positive integer>`
|
|
223
|
+
|
|
195
224
|
Notes:
|
|
196
225
|
|
|
197
|
-
- The command requires the literal subcommand `list`.
|
|
198
226
|
- The CLI prints a warning because `sessions list` is not recommended as a production hot path.
|
|
227
|
+
- `sessions get`, `sessions update`, `sessions archive`, and `sessions unarchive` print the session record by default.
|
|
228
|
+
- `sessions update` requires at least one of `--title`, `--clear-title`, or `--metadata`.
|
|
199
229
|
|
|
200
230
|
## Config and State Files
|
|
201
231
|
|
package/dist/index.js
CHANGED
|
@@ -502,16 +502,44 @@ async function runCreateCommand(args, globalOptions, runtime) {
|
|
|
502
502
|
|
|
503
503
|
// src/commands/sessions.ts
|
|
504
504
|
async function runSessionsCommand(args, globalOptions, runtime) {
|
|
505
|
+
const subcommand = `${args[0] ?? ""}`;
|
|
506
|
+
switch (subcommand) {
|
|
507
|
+
case "list":
|
|
508
|
+
await runSessionsListCommand(args.slice(1), globalOptions, runtime);
|
|
509
|
+
return;
|
|
510
|
+
case "get":
|
|
511
|
+
await runSessionsGetCommand(args.slice(1), globalOptions, runtime);
|
|
512
|
+
return;
|
|
513
|
+
case "update":
|
|
514
|
+
case "patch":
|
|
515
|
+
await runSessionsUpdateCommand(args.slice(1), globalOptions, runtime);
|
|
516
|
+
return;
|
|
517
|
+
case "archive":
|
|
518
|
+
await runSessionsArchiveCommand(args.slice(1), globalOptions, runtime);
|
|
519
|
+
return;
|
|
520
|
+
case "unarchive":
|
|
521
|
+
await runSessionsUnarchiveCommand(args.slice(1), globalOptions, runtime);
|
|
522
|
+
return;
|
|
523
|
+
default:
|
|
524
|
+
throw new CliUsageError(
|
|
525
|
+
"sessions requires one of: list, get, update, patch, archive, unarchive"
|
|
526
|
+
);
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
async function runSessionsListCommand(args, globalOptions, runtime) {
|
|
505
530
|
const parsed = parseArgs(
|
|
506
531
|
{
|
|
507
532
|
"--limit": String,
|
|
508
533
|
"--cursor": String,
|
|
509
|
-
"--metadata": String
|
|
534
|
+
"--metadata": String,
|
|
535
|
+
"--archived": String
|
|
510
536
|
},
|
|
511
537
|
args
|
|
512
538
|
);
|
|
513
|
-
if (
|
|
514
|
-
throw new CliUsageError(
|
|
539
|
+
if (parsed._.length > 0) {
|
|
540
|
+
throw new CliUsageError(
|
|
541
|
+
"sessions list does not accept positional arguments"
|
|
542
|
+
);
|
|
515
543
|
}
|
|
516
544
|
const cursor = trimString(parsed["--cursor"]);
|
|
517
545
|
if (parsed["--cursor"] !== void 0 && !cursor) {
|
|
@@ -521,6 +549,7 @@ async function runSessionsCommand(args, globalOptions, runtime) {
|
|
|
521
549
|
const page = await resolved.client.listSessions({
|
|
522
550
|
limit: parsed["--limit"] ? parsePositiveInteger(parsed["--limit"], "--limit") : void 0,
|
|
523
551
|
cursor,
|
|
552
|
+
archived: parseArchivedFilter(parsed["--archived"]),
|
|
524
553
|
metadata: parsed["--metadata"] ? parseSessionMetadataFilters(parsed["--metadata"]) : void 0
|
|
525
554
|
});
|
|
526
555
|
runtime.logger.error(
|
|
@@ -534,16 +563,124 @@ async function runSessionsCommand(args, globalOptions, runtime) {
|
|
|
534
563
|
runtime.logger.info("No sessions found.");
|
|
535
564
|
return;
|
|
536
565
|
}
|
|
537
|
-
runtime.logger.info("id title created_at");
|
|
566
|
+
runtime.logger.info("id title archived created_at");
|
|
538
567
|
for (const session of page.sessions) {
|
|
539
568
|
runtime.logger.info(
|
|
540
|
-
`${session.id} ${session.title ?? ""} ${session.created_at}`
|
|
569
|
+
`${session.id} ${session.title ?? ""} ${formatArchivedValue(session.archived)} ${session.created_at}`
|
|
541
570
|
);
|
|
542
571
|
}
|
|
543
572
|
if (page.next_cursor) {
|
|
544
573
|
runtime.logger.info(`next_cursor=${page.next_cursor}`);
|
|
545
574
|
}
|
|
546
575
|
}
|
|
576
|
+
async function runSessionsGetCommand(args, globalOptions, runtime) {
|
|
577
|
+
const parsed = parseArgs({}, args);
|
|
578
|
+
const sessionId = parseSessionIdArg(parsed._, "sessions get");
|
|
579
|
+
const resolved = await runtime.resolveGlobalOptions(globalOptions);
|
|
580
|
+
const record = await resolved.client.getSession(sessionId);
|
|
581
|
+
writeSessionRecord(record, resolved.json, runtime);
|
|
582
|
+
}
|
|
583
|
+
async function runSessionsUpdateCommand(args, globalOptions, runtime) {
|
|
584
|
+
const parsed = parseArgs(
|
|
585
|
+
{
|
|
586
|
+
"--title": String,
|
|
587
|
+
"--clear-title": Boolean,
|
|
588
|
+
"--metadata": String,
|
|
589
|
+
"--expected-version": String
|
|
590
|
+
},
|
|
591
|
+
args
|
|
592
|
+
);
|
|
593
|
+
const sessionId = parseSessionIdArg(parsed._, "sessions update");
|
|
594
|
+
if (parsed["--clear-title"] && parsed["--title"] !== void 0) {
|
|
595
|
+
throw new CliUsageError("choose one of --title or --clear-title");
|
|
596
|
+
}
|
|
597
|
+
const metadata = parsed["--metadata"] ? parseJsonObject(parsed["--metadata"], "--metadata") : void 0;
|
|
598
|
+
const title = parsed["--clear-title"] === true ? null : parsed["--title"] ?? void 0;
|
|
599
|
+
if (title === void 0 && metadata === void 0) {
|
|
600
|
+
throw new CliUsageError(
|
|
601
|
+
"sessions update requires at least one of --title, --clear-title, or --metadata"
|
|
602
|
+
);
|
|
603
|
+
}
|
|
604
|
+
const resolved = await runtime.resolveGlobalOptions(globalOptions);
|
|
605
|
+
const record = await resolved.client.updateSession(sessionId, {
|
|
606
|
+
title,
|
|
607
|
+
metadata,
|
|
608
|
+
expectedVersion: parsed["--expected-version"] ? parsePositiveInteger(parsed["--expected-version"], "--expected-version") : void 0
|
|
609
|
+
});
|
|
610
|
+
writeSessionRecord(record, resolved.json, runtime);
|
|
611
|
+
}
|
|
612
|
+
async function runSessionsArchiveCommand(args, globalOptions, runtime) {
|
|
613
|
+
const parsed = parseArgs({}, args);
|
|
614
|
+
const sessionId = parseSessionIdArg(parsed._, "sessions archive");
|
|
615
|
+
const resolved = await runtime.resolveGlobalOptions(globalOptions);
|
|
616
|
+
const record = await resolved.client.archiveSession(sessionId);
|
|
617
|
+
writeSessionRecord(record, resolved.json, runtime);
|
|
618
|
+
}
|
|
619
|
+
async function runSessionsUnarchiveCommand(args, globalOptions, runtime) {
|
|
620
|
+
const parsed = parseArgs({}, args);
|
|
621
|
+
const sessionId = parseSessionIdArg(parsed._, "sessions unarchive");
|
|
622
|
+
const resolved = await runtime.resolveGlobalOptions(globalOptions);
|
|
623
|
+
const record = await resolved.client.unarchiveSession(sessionId);
|
|
624
|
+
writeSessionRecord(record, resolved.json, runtime);
|
|
625
|
+
}
|
|
626
|
+
function parseArchivedFilter(value) {
|
|
627
|
+
if (value === void 0) {
|
|
628
|
+
return void 0;
|
|
629
|
+
}
|
|
630
|
+
switch (value.trim().toLowerCase()) {
|
|
631
|
+
case "active":
|
|
632
|
+
case "false":
|
|
633
|
+
return false;
|
|
634
|
+
case "archived":
|
|
635
|
+
case "true":
|
|
636
|
+
return true;
|
|
637
|
+
case "all":
|
|
638
|
+
return "all";
|
|
639
|
+
default:
|
|
640
|
+
throw new CliUsageError(
|
|
641
|
+
"--archived must be one of: active, archived, all"
|
|
642
|
+
);
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
function parseSessionIdArg(args, usage) {
|
|
646
|
+
if (args.length !== 1) {
|
|
647
|
+
throw new CliUsageError(`${usage} requires <sessionId>`);
|
|
648
|
+
}
|
|
649
|
+
const sessionId = `${args[0] ?? ""}`;
|
|
650
|
+
if (sessionId.length === 0) {
|
|
651
|
+
throw new CliUsageError(`${usage} requires <sessionId>`);
|
|
652
|
+
}
|
|
653
|
+
return sessionId;
|
|
654
|
+
}
|
|
655
|
+
function writeSessionRecord(record, json, runtime) {
|
|
656
|
+
if (json) {
|
|
657
|
+
runtime.writeJsonOutput(record, true);
|
|
658
|
+
return;
|
|
659
|
+
}
|
|
660
|
+
runtime.logger.info(`id=${record.id}`);
|
|
661
|
+
runtime.logger.info(`title=${JSON.stringify(record.title ?? null)}`);
|
|
662
|
+
runtime.logger.info(`archived=${record.archived ?? false}`);
|
|
663
|
+
if (record.last_seq !== void 0) {
|
|
664
|
+
runtime.logger.info(`last_seq=${record.last_seq}`);
|
|
665
|
+
}
|
|
666
|
+
if (record.version !== void 0) {
|
|
667
|
+
runtime.logger.info(`version=${record.version}`);
|
|
668
|
+
}
|
|
669
|
+
if (record.tenant_id) {
|
|
670
|
+
runtime.logger.info(`tenant_id=${record.tenant_id}`);
|
|
671
|
+
}
|
|
672
|
+
runtime.logger.info(`created_at=${record.created_at}`);
|
|
673
|
+
runtime.logger.info(`updated_at=${record.updated_at}`);
|
|
674
|
+
if (record.creator_principal) {
|
|
675
|
+
runtime.logger.info(
|
|
676
|
+
`creator_principal=${JSON.stringify(record.creator_principal)}`
|
|
677
|
+
);
|
|
678
|
+
}
|
|
679
|
+
runtime.logger.info(`metadata=${JSON.stringify(record.metadata)}`);
|
|
680
|
+
}
|
|
681
|
+
function formatArchivedValue(value) {
|
|
682
|
+
return value === void 0 ? "" : `${value}`;
|
|
683
|
+
}
|
|
547
684
|
|
|
548
685
|
// src/commands/tail.ts
|
|
549
686
|
var DEFAULT_CREATE_AGENT_ID3 = "starcite-cli";
|
|
@@ -781,7 +918,7 @@ function buildProgram(deps = {}) {
|
|
|
781
918
|
const parsed = parseGlobalArgs(normalizeArgv(argv, context));
|
|
782
919
|
const command = parsed.rest[0];
|
|
783
920
|
if (parsed.version) {
|
|
784
|
-
output.writeOut(`${"0.0.
|
|
921
|
+
output.writeOut(`${"0.0.16"}
|
|
785
922
|
`);
|
|
786
923
|
if (throwOnEarlyExit) {
|
|
787
924
|
throw new EarlyExit("cli.versionDisplayed", "Version displayed");
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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\";\nimport { trimString } from \"./runtime\";\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 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 try {\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 } finally {\n session.disconnect();\n }\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 type { StarciteSession } from \"@starcite/sdk\";\nimport {\n type CliRuntime,\n CliUsageError,\n type GlobalOptions,\n parseArgs,\n parseNonNegativeInteger,\n} from \"../runtime\";\n\nconst DEFAULT_CREATE_AGENT_ID = \"starcite-cli\";\nconst NO_FOLLOW_IDLE_MS = 1000;\n\nfunction parseTailCursorArg(input: string, flagName: string): number {\n const parsedSeq = Number(input);\n if (!Number.isInteger(parsedSeq) || parsedSeq < 0) {\n throw new CliUsageError(\n `${flagName} must be a non-negative integer sequence number`\n );\n }\n\n return parsedSeq;\n}\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 ? parseTailCursorArg(parsed[\"--cursor\"], \"--cursor\")\n : undefined;\n const limit = parsed[\"--limit\"]\n ? parseNonNegativeInteger(parsed[\"--limit\"], \"--limit\")\n : undefined;\n\n process.once(\"SIGINT\", onSigint);\n\n try {\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 cursorSeq: cursor,\n follow: parsed[\"--no-follow\"] !== true,\n limit,\n json: resolved.json,\n runtime,\n signal: abortController.signal,\n });\n } finally {\n session.disconnect();\n }\n } finally {\n process.removeListener(\"SIGINT\", onSigint);\n }\n}\n\nasync function emitTailEvents({\n session,\n agent,\n cursorSeq,\n follow,\n limit,\n json,\n runtime,\n signal,\n}: {\n session: StarciteSession;\n agent?: string;\n cursorSeq: number | undefined;\n follow: boolean;\n limit: number | undefined;\n json: boolean;\n runtime: CliRuntime;\n signal: AbortSignal;\n}): Promise<void> {\n if (limit !== undefined && limit <= 0) {\n return;\n }\n\n return await new Promise<void>((resolve, reject) => {\n let emitted = 0;\n let idleTimer: ReturnType<typeof setTimeout> | undefined;\n let settled = false;\n\n const cleanup = () => {\n stopEvents();\n stopError();\n signal.removeEventListener(\"abort\", handleAbort);\n if (idleTimer) {\n clearTimeout(idleTimer);\n }\n };\n\n const finish = () => {\n if (settled) {\n return;\n }\n\n settled = true;\n cleanup();\n resolve();\n };\n\n const fail = (error: unknown) => {\n if (settled) {\n return;\n }\n\n settled = true;\n cleanup();\n reject(error);\n };\n\n const resetIdleTimer = () => {\n if (follow) {\n return;\n }\n\n if (idleTimer) {\n clearTimeout(idleTimer);\n }\n\n idleTimer = setTimeout(() => {\n finish();\n }, NO_FOLLOW_IDLE_MS);\n };\n\n const handleAbort = () => {\n finish();\n };\n\n const stopError = session.on(\"error\", (error) => {\n fail(error);\n });\n const stopEvents = session.on(\n \"event\",\n (event) => {\n resetIdleTimer();\n\n if (cursorSeq !== undefined && event.seq < cursorSeq) {\n return;\n }\n\n if (limit !== undefined && emitted >= limit) {\n finish();\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 finish();\n }\n },\n { agent }\n );\n\n signal.addEventListener(\"abort\", handleAbort, { once: true });\n resetIdleTimer();\n });\n}\n","import { run } from \"./cli\";\n\nrun();\n"],"mappings":"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","names":["Conf","TRAILING_SLASHES_REGEX","TRAILING_SLASHES_REGEX","DEFAULT_CREATE_AGENT_ID","DEFAULT_CREATE_AGENT_ID","resolve"]}
|
|
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\";\nimport { trimString } from \"./runtime\";\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 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 try {\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 } finally {\n session.disconnect();\n }\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 type { SessionArchivedFilter, SessionRecord } from \"@starcite/sdk\";\nimport {\n type CliRuntime,\n CliUsageError,\n type GlobalOptions,\n parseArgs,\n parseJsonObject,\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 subcommand = `${args[0] ?? \"\"}`;\n\n switch (subcommand) {\n case \"list\":\n await runSessionsListCommand(args.slice(1), globalOptions, runtime);\n return;\n case \"get\":\n await runSessionsGetCommand(args.slice(1), globalOptions, runtime);\n return;\n case \"update\":\n case \"patch\":\n await runSessionsUpdateCommand(args.slice(1), globalOptions, runtime);\n return;\n case \"archive\":\n await runSessionsArchiveCommand(args.slice(1), globalOptions, runtime);\n return;\n case \"unarchive\":\n await runSessionsUnarchiveCommand(args.slice(1), globalOptions, runtime);\n return;\n default:\n throw new CliUsageError(\n \"sessions requires one of: list, get, update, patch, archive, unarchive\"\n );\n }\n}\n\nasync function runSessionsListCommand(\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 \"--archived\": String,\n },\n args\n );\n\n if (parsed._.length > 0) {\n throw new CliUsageError(\n \"sessions list does not accept positional arguments\"\n );\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 archived: parseArchivedFilter(parsed[\"--archived\"]),\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\\tarchived\\tcreated_at\");\n for (const session of page.sessions) {\n runtime.logger.info(\n `${session.id}\\t${session.title ?? \"\"}\\t${formatArchivedValue(session.archived)}\\t${session.created_at}`\n );\n }\n\n if (page.next_cursor) {\n runtime.logger.info(`next_cursor=${page.next_cursor}`);\n }\n}\n\nasync function runSessionsGetCommand(\n args: string[],\n globalOptions: GlobalOptions,\n runtime: CliRuntime\n): Promise<void> {\n const parsed = parseArgs({}, args);\n const sessionId = parseSessionIdArg(parsed._, \"sessions get\");\n const resolved = await runtime.resolveGlobalOptions(globalOptions);\n const record = await resolved.client.getSession(sessionId);\n writeSessionRecord(record, resolved.json, runtime);\n}\n\nasync function runSessionsUpdateCommand(\n args: string[],\n globalOptions: GlobalOptions,\n runtime: CliRuntime\n): Promise<void> {\n const parsed = parseArgs(\n {\n \"--title\": String,\n \"--clear-title\": Boolean,\n \"--metadata\": String,\n \"--expected-version\": String,\n },\n args\n );\n const sessionId = parseSessionIdArg(parsed._, \"sessions update\");\n\n if (parsed[\"--clear-title\"] && parsed[\"--title\"] !== undefined) {\n throw new CliUsageError(\"choose one of --title or --clear-title\");\n }\n\n const metadata = parsed[\"--metadata\"]\n ? parseJsonObject(parsed[\"--metadata\"], \"--metadata\")\n : undefined;\n const title =\n parsed[\"--clear-title\"] === true ? null : (parsed[\"--title\"] ?? undefined);\n\n if (title === undefined && metadata === undefined) {\n throw new CliUsageError(\n \"sessions update requires at least one of --title, --clear-title, or --metadata\"\n );\n }\n\n const resolved = await runtime.resolveGlobalOptions(globalOptions);\n const record = await resolved.client.updateSession(sessionId, {\n title,\n metadata,\n expectedVersion: parsed[\"--expected-version\"]\n ? parsePositiveInteger(parsed[\"--expected-version\"], \"--expected-version\")\n : undefined,\n });\n writeSessionRecord(record, resolved.json, runtime);\n}\n\nasync function runSessionsArchiveCommand(\n args: string[],\n globalOptions: GlobalOptions,\n runtime: CliRuntime\n): Promise<void> {\n const parsed = parseArgs({}, args);\n const sessionId = parseSessionIdArg(parsed._, \"sessions archive\");\n const resolved = await runtime.resolveGlobalOptions(globalOptions);\n const record = await resolved.client.archiveSession(sessionId);\n writeSessionRecord(record, resolved.json, runtime);\n}\n\nasync function runSessionsUnarchiveCommand(\n args: string[],\n globalOptions: GlobalOptions,\n runtime: CliRuntime\n): Promise<void> {\n const parsed = parseArgs({}, args);\n const sessionId = parseSessionIdArg(parsed._, \"sessions unarchive\");\n const resolved = await runtime.resolveGlobalOptions(globalOptions);\n const record = await resolved.client.unarchiveSession(sessionId);\n writeSessionRecord(record, resolved.json, runtime);\n}\n\nfunction parseArchivedFilter(\n value: string | undefined\n): SessionArchivedFilter | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n switch (value.trim().toLowerCase()) {\n case \"active\":\n case \"false\":\n return false;\n case \"archived\":\n case \"true\":\n return true;\n case \"all\":\n return \"all\";\n default:\n throw new CliUsageError(\n \"--archived must be one of: active, archived, all\"\n );\n }\n}\n\nfunction parseSessionIdArg(args: readonly unknown[], usage: string): string {\n if (args.length !== 1) {\n throw new CliUsageError(`${usage} requires <sessionId>`);\n }\n\n const sessionId = `${args[0] ?? \"\"}`;\n if (sessionId.length === 0) {\n throw new CliUsageError(`${usage} requires <sessionId>`);\n }\n\n return sessionId;\n}\n\nfunction writeSessionRecord(\n record: SessionRecord,\n json: boolean,\n runtime: CliRuntime\n): void {\n if (json) {\n runtime.writeJsonOutput(record, true);\n return;\n }\n\n runtime.logger.info(`id=${record.id}`);\n runtime.logger.info(`title=${JSON.stringify(record.title ?? null)}`);\n runtime.logger.info(`archived=${record.archived ?? false}`);\n if (record.last_seq !== undefined) {\n runtime.logger.info(`last_seq=${record.last_seq}`);\n }\n if (record.version !== undefined) {\n runtime.logger.info(`version=${record.version}`);\n }\n if (record.tenant_id) {\n runtime.logger.info(`tenant_id=${record.tenant_id}`);\n }\n runtime.logger.info(`created_at=${record.created_at}`);\n runtime.logger.info(`updated_at=${record.updated_at}`);\n if (record.creator_principal) {\n runtime.logger.info(\n `creator_principal=${JSON.stringify(record.creator_principal)}`\n );\n }\n runtime.logger.info(`metadata=${JSON.stringify(record.metadata)}`);\n}\n\nfunction formatArchivedValue(value: boolean | undefined): string {\n return value === undefined ? \"\" : `${value}`;\n}\n","import type { StarciteSession } from \"@starcite/sdk\";\nimport {\n type CliRuntime,\n CliUsageError,\n type GlobalOptions,\n parseArgs,\n parseNonNegativeInteger,\n} from \"../runtime\";\n\nconst DEFAULT_CREATE_AGENT_ID = \"starcite-cli\";\nconst NO_FOLLOW_IDLE_MS = 1000;\n\nfunction parseTailCursorArg(input: string, flagName: string): number {\n const parsedSeq = Number(input);\n if (!Number.isInteger(parsedSeq) || parsedSeq < 0) {\n throw new CliUsageError(\n `${flagName} must be a non-negative integer sequence number`\n );\n }\n\n return parsedSeq;\n}\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 ? parseTailCursorArg(parsed[\"--cursor\"], \"--cursor\")\n : undefined;\n const limit = parsed[\"--limit\"]\n ? parseNonNegativeInteger(parsed[\"--limit\"], \"--limit\")\n : undefined;\n\n process.once(\"SIGINT\", onSigint);\n\n try {\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 cursorSeq: cursor,\n follow: parsed[\"--no-follow\"] !== true,\n limit,\n json: resolved.json,\n runtime,\n signal: abortController.signal,\n });\n } finally {\n session.disconnect();\n }\n } finally {\n process.removeListener(\"SIGINT\", onSigint);\n }\n}\n\nasync function emitTailEvents({\n session,\n agent,\n cursorSeq,\n follow,\n limit,\n json,\n runtime,\n signal,\n}: {\n session: StarciteSession;\n agent?: string;\n cursorSeq: number | undefined;\n follow: boolean;\n limit: number | undefined;\n json: boolean;\n runtime: CliRuntime;\n signal: AbortSignal;\n}): Promise<void> {\n if (limit !== undefined && limit <= 0) {\n return;\n }\n\n return await new Promise<void>((resolve, reject) => {\n let emitted = 0;\n let idleTimer: ReturnType<typeof setTimeout> | undefined;\n let settled = false;\n\n const cleanup = () => {\n stopEvents();\n stopError();\n signal.removeEventListener(\"abort\", handleAbort);\n if (idleTimer) {\n clearTimeout(idleTimer);\n }\n };\n\n const finish = () => {\n if (settled) {\n return;\n }\n\n settled = true;\n cleanup();\n resolve();\n };\n\n const fail = (error: unknown) => {\n if (settled) {\n return;\n }\n\n settled = true;\n cleanup();\n reject(error);\n };\n\n const resetIdleTimer = () => {\n if (follow) {\n return;\n }\n\n if (idleTimer) {\n clearTimeout(idleTimer);\n }\n\n idleTimer = setTimeout(() => {\n finish();\n }, NO_FOLLOW_IDLE_MS);\n };\n\n const handleAbort = () => {\n finish();\n };\n\n const stopError = session.on(\"error\", (error) => {\n fail(error);\n });\n const stopEvents = session.on(\n \"event\",\n (event) => {\n resetIdleTimer();\n\n if (cursorSeq !== undefined && event.seq < cursorSeq) {\n return;\n }\n\n if (limit !== undefined && emitted >= limit) {\n finish();\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 finish();\n }\n },\n { agent }\n );\n\n signal.addEventListener(\"abort\", handleAbort, { once: true });\n resetIdleTimer();\n });\n}\n","import { run } from \"./cli\";\n\nrun();\n"],"mappings":"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","names":["Conf","TRAILING_SLASHES_REGEX","TRAILING_SLASHES_REGEX","DEFAULT_CREATE_AGENT_ID","DEFAULT_CREATE_AGENT_ID","resolve"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "starcite",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.16",
|
|
4
4
|
"description": "CLI for Starcite",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"homepage": "https://starcite.ai",
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
"check": "bun run lint && bun run typecheck && bun run test"
|
|
43
43
|
},
|
|
44
44
|
"dependencies": {
|
|
45
|
-
"@starcite/sdk": "^0.0.
|
|
45
|
+
"@starcite/sdk": "^0.0.16",
|
|
46
46
|
"arg": "^5.0.2",
|
|
47
47
|
"conf": "^15.1.0",
|
|
48
48
|
"toml": "^3.0.0",
|