@octavus/cli 2.18.0 → 2.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +257 -4
- package/dist/index.js.map +1 -1
- package/package.json +2 -1
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
// src/index.ts
|
|
4
|
-
import
|
|
4
|
+
import dotenv2 from "dotenv";
|
|
5
5
|
import { Command } from "commander";
|
|
6
6
|
|
|
7
7
|
// src/config.ts
|
|
@@ -221,6 +221,14 @@ var archiveResponseSchema = z2.object({
|
|
|
221
221
|
agentId: z2.string(),
|
|
222
222
|
message: z2.string()
|
|
223
223
|
});
|
|
224
|
+
var skillSyncResultSchema = z2.object({
|
|
225
|
+
skillId: z2.string(),
|
|
226
|
+
slug: z2.string(),
|
|
227
|
+
created: z2.boolean()
|
|
228
|
+
});
|
|
229
|
+
var skillSecretsResultSchema = z2.object({
|
|
230
|
+
updated: z2.array(z2.string())
|
|
231
|
+
});
|
|
224
232
|
var CliApi = class {
|
|
225
233
|
constructor(config) {
|
|
226
234
|
this.config = config;
|
|
@@ -271,6 +279,21 @@ var CliApi = class {
|
|
|
271
279
|
const response = await this.request("DELETE", `/api/agents/${slug}?by=slug`);
|
|
272
280
|
return archiveResponseSchema.parse(response);
|
|
273
281
|
}
|
|
282
|
+
/** Upload a skill bundle (create or update) */
|
|
283
|
+
async syncSkill(bundle, visibility) {
|
|
284
|
+
const formData = new FormData();
|
|
285
|
+
formData.append("file", new Blob([bundle]), "skill.zip");
|
|
286
|
+
if (visibility) {
|
|
287
|
+
formData.append("visibility", visibility);
|
|
288
|
+
}
|
|
289
|
+
const response = await this.requestMultipart("POST", "/api/skills", formData);
|
|
290
|
+
return skillSyncResultSchema.parse(response);
|
|
291
|
+
}
|
|
292
|
+
/** Bulk upsert skill secrets */
|
|
293
|
+
async upsertSkillSecrets(skillId, secrets) {
|
|
294
|
+
const response = await this.request("PUT", `/api/skills/${skillId}/secrets`, { secrets });
|
|
295
|
+
return skillSecretsResultSchema.parse(response);
|
|
296
|
+
}
|
|
274
297
|
/** Sync agent (create or update) */
|
|
275
298
|
async syncAgent(definition) {
|
|
276
299
|
const existing = await this.getAgent(definition.settings.slug);
|
|
@@ -281,8 +304,17 @@ var CliApi = class {
|
|
|
281
304
|
const agentId = await this.createAgent(definition);
|
|
282
305
|
return { agentId, created: true };
|
|
283
306
|
}
|
|
284
|
-
async
|
|
285
|
-
const url = `${this.config.baseUrl}${
|
|
307
|
+
async requestMultipart(method, path3, formData) {
|
|
308
|
+
const url = `${this.config.baseUrl}${path3}`;
|
|
309
|
+
const response = await fetch(url, {
|
|
310
|
+
method,
|
|
311
|
+
headers: { Authorization: `Bearer ${this.config.apiKey}` },
|
|
312
|
+
body: formData
|
|
313
|
+
});
|
|
314
|
+
return await this.handleResponse(response);
|
|
315
|
+
}
|
|
316
|
+
async request(method, path3, body) {
|
|
317
|
+
const url = `${this.config.baseUrl}${path3}`;
|
|
286
318
|
const headers = {
|
|
287
319
|
Authorization: `Bearer ${this.config.apiKey}`
|
|
288
320
|
};
|
|
@@ -294,6 +326,9 @@ var CliApi = class {
|
|
|
294
326
|
headers,
|
|
295
327
|
body: body !== void 0 ? JSON.stringify(body) : void 0
|
|
296
328
|
});
|
|
329
|
+
return await this.handleResponse(response);
|
|
330
|
+
}
|
|
331
|
+
async handleResponse(response) {
|
|
297
332
|
const contentType = response.headers.get("content-type");
|
|
298
333
|
const isJson = contentType?.includes("application/json");
|
|
299
334
|
if (!response.ok) {
|
|
@@ -347,6 +382,9 @@ function bold(text) {
|
|
|
347
382
|
function cyan(text) {
|
|
348
383
|
return `${colors.cyan}${text}${colors.reset}`;
|
|
349
384
|
}
|
|
385
|
+
function yellow(text) {
|
|
386
|
+
return `${colors.yellow}${text}${colors.reset}`;
|
|
387
|
+
}
|
|
350
388
|
function gray(text) {
|
|
351
389
|
return `${colors.gray}${text}${colors.reset}`;
|
|
352
390
|
}
|
|
@@ -699,10 +737,223 @@ function handleError5(err, options) {
|
|
|
699
737
|
}
|
|
700
738
|
}
|
|
701
739
|
|
|
740
|
+
// src/skill-files.ts
|
|
741
|
+
import fs2 from "fs/promises";
|
|
742
|
+
import path2 from "path";
|
|
743
|
+
import dotenv from "dotenv";
|
|
744
|
+
import JSZip from "jszip";
|
|
745
|
+
import { parse as parseYaml2 } from "yaml";
|
|
746
|
+
import { z as z3 } from "zod";
|
|
747
|
+
var SkillFileError = class extends Error {
|
|
748
|
+
constructor(message, filePath) {
|
|
749
|
+
super(message);
|
|
750
|
+
this.filePath = filePath;
|
|
751
|
+
this.name = "SkillFileError";
|
|
752
|
+
}
|
|
753
|
+
};
|
|
754
|
+
var FRONTMATTER_REGEX2 = /^---\n([\s\S]*?)\n---/;
|
|
755
|
+
var secretsSchema = z3.array(
|
|
756
|
+
z3.object({
|
|
757
|
+
name: z3.string(),
|
|
758
|
+
description: z3.string().optional(),
|
|
759
|
+
required: z3.boolean().optional()
|
|
760
|
+
})
|
|
761
|
+
);
|
|
762
|
+
function optionalString(value) {
|
|
763
|
+
return typeof value === "string" ? value : void 0;
|
|
764
|
+
}
|
|
765
|
+
var EXCLUDED_PATTERNS = [".env", ".env.", ".git", "node_modules", ".DS_Store"];
|
|
766
|
+
function isExcluded(relativePath) {
|
|
767
|
+
const parts = relativePath.split("/");
|
|
768
|
+
return parts.some(
|
|
769
|
+
(part) => EXCLUDED_PATTERNS.some((pattern) => part === pattern || part.startsWith(pattern))
|
|
770
|
+
);
|
|
771
|
+
}
|
|
772
|
+
async function parseSkillFrontmatter(skillPath) {
|
|
773
|
+
const skillMdPath = path2.join(skillPath, "SKILL.md");
|
|
774
|
+
let content;
|
|
775
|
+
try {
|
|
776
|
+
content = await fs2.readFile(skillMdPath, "utf-8");
|
|
777
|
+
} catch (err) {
|
|
778
|
+
if (err.code === "ENOENT") {
|
|
779
|
+
throw new SkillFileError("SKILL.md not found", skillMdPath);
|
|
780
|
+
}
|
|
781
|
+
throw err;
|
|
782
|
+
}
|
|
783
|
+
const match = FRONTMATTER_REGEX2.exec(content);
|
|
784
|
+
if (!match?.[1]) {
|
|
785
|
+
throw new SkillFileError("SKILL.md is missing YAML frontmatter", skillMdPath);
|
|
786
|
+
}
|
|
787
|
+
const frontmatter = parseYaml2(match[1]);
|
|
788
|
+
if (typeof frontmatter.name !== "string" || frontmatter.name.length === 0) {
|
|
789
|
+
throw new SkillFileError('SKILL.md frontmatter must have a "name" field', skillMdPath);
|
|
790
|
+
}
|
|
791
|
+
const parsedSecrets = secretsSchema.safeParse(frontmatter.secrets);
|
|
792
|
+
return {
|
|
793
|
+
name: frontmatter.name,
|
|
794
|
+
description: optionalString(frontmatter.description),
|
|
795
|
+
version: optionalString(frontmatter.version),
|
|
796
|
+
license: optionalString(frontmatter.license),
|
|
797
|
+
author: optionalString(frontmatter.author),
|
|
798
|
+
secrets: parsedSecrets.success ? parsedSecrets.data : void 0
|
|
799
|
+
};
|
|
800
|
+
}
|
|
801
|
+
async function collectFiles(dir, baseDir) {
|
|
802
|
+
const files = [];
|
|
803
|
+
const entries = await fs2.readdir(dir, { withFileTypes: true });
|
|
804
|
+
for (const entry of entries) {
|
|
805
|
+
const fullPath = path2.join(dir, entry.name);
|
|
806
|
+
const relativePath = path2.relative(baseDir, fullPath);
|
|
807
|
+
if (isExcluded(relativePath)) continue;
|
|
808
|
+
if (entry.isDirectory()) {
|
|
809
|
+
files.push(...await collectFiles(fullPath, baseDir));
|
|
810
|
+
} else if (entry.isFile()) {
|
|
811
|
+
files.push(relativePath);
|
|
812
|
+
}
|
|
813
|
+
}
|
|
814
|
+
return files;
|
|
815
|
+
}
|
|
816
|
+
async function packageSkillBundle(skillPath) {
|
|
817
|
+
const resolvedPath = path2.resolve(skillPath);
|
|
818
|
+
try {
|
|
819
|
+
const stat = await fs2.stat(resolvedPath);
|
|
820
|
+
if (!stat.isDirectory()) {
|
|
821
|
+
throw new SkillFileError(`Not a directory: ${resolvedPath}`);
|
|
822
|
+
}
|
|
823
|
+
} catch (err) {
|
|
824
|
+
if (err.code === "ENOENT") {
|
|
825
|
+
throw new SkillFileError(`Directory not found: ${resolvedPath}`);
|
|
826
|
+
}
|
|
827
|
+
throw err;
|
|
828
|
+
}
|
|
829
|
+
await parseSkillFrontmatter(resolvedPath);
|
|
830
|
+
const files = await collectFiles(resolvedPath, resolvedPath);
|
|
831
|
+
const zip = new JSZip();
|
|
832
|
+
for (const relativePath of files) {
|
|
833
|
+
const fullPath = path2.join(resolvedPath, relativePath);
|
|
834
|
+
const content = await fs2.readFile(fullPath);
|
|
835
|
+
zip.file(relativePath, content);
|
|
836
|
+
}
|
|
837
|
+
return Buffer.from(await zip.generateAsync({ type: "nodebuffer", compression: "DEFLATE" }));
|
|
838
|
+
}
|
|
839
|
+
async function readSkillEnv(skillPath, env) {
|
|
840
|
+
const resolvedPath = path2.resolve(skillPath);
|
|
841
|
+
const candidates = env ? [path2.join(resolvedPath, `.env.${env}`), path2.join(resolvedPath, ".env")] : [path2.join(resolvedPath, ".env")];
|
|
842
|
+
for (const envPath of candidates) {
|
|
843
|
+
try {
|
|
844
|
+
const content = await fs2.readFile(envPath, "utf-8");
|
|
845
|
+
const parsed = dotenv.parse(content);
|
|
846
|
+
return parsed;
|
|
847
|
+
} catch (err) {
|
|
848
|
+
if (err.code === "ENOENT") continue;
|
|
849
|
+
throw err;
|
|
850
|
+
}
|
|
851
|
+
}
|
|
852
|
+
return null;
|
|
853
|
+
}
|
|
854
|
+
|
|
855
|
+
// src/commands/skills/sync.ts
|
|
856
|
+
function registerSkillSyncCommand(program2) {
|
|
857
|
+
program2.command("sync <path>").description("Sync skill to platform (creates or updates)").option("--env <environment>", "Environment for secrets (e.g., staging, production)").option("--json", "Output as JSON").option("--quiet", "Suppress non-essential output").action(async (skillPath, options) => {
|
|
858
|
+
try {
|
|
859
|
+
await runSkillSync(skillPath, options);
|
|
860
|
+
} catch (err) {
|
|
861
|
+
handleError6(err, options);
|
|
862
|
+
process.exit(err instanceof ConfigError ? 2 : 1);
|
|
863
|
+
}
|
|
864
|
+
});
|
|
865
|
+
}
|
|
866
|
+
async function runSkillSync(skillPath, options) {
|
|
867
|
+
const config = loadConfig();
|
|
868
|
+
const api = new CliApi(config);
|
|
869
|
+
if (!options.quiet && !options.json) {
|
|
870
|
+
info(`Reading skill from ${cyan(skillPath)}...`);
|
|
871
|
+
}
|
|
872
|
+
const frontmatter = await parseSkillFrontmatter(skillPath);
|
|
873
|
+
if (!options.quiet && !options.json) {
|
|
874
|
+
info(`Packaging ${bold(frontmatter.name)}...`);
|
|
875
|
+
}
|
|
876
|
+
const bundle = await packageSkillBundle(skillPath);
|
|
877
|
+
const syncResult = await api.syncSkill(bundle);
|
|
878
|
+
if (!options.quiet && !options.json) {
|
|
879
|
+
const action = syncResult.created ? "Created" : "Updated";
|
|
880
|
+
success(`${action}: ${bold(syncResult.slug)}`);
|
|
881
|
+
keyValue("Skill ID", syncResult.skillId);
|
|
882
|
+
}
|
|
883
|
+
let secretCount = 0;
|
|
884
|
+
const envSecrets = await readSkillEnv(skillPath, options.env);
|
|
885
|
+
if (envSecrets && Object.keys(envSecrets).length > 0) {
|
|
886
|
+
if (frontmatter.secrets && !options.quiet && !options.json) {
|
|
887
|
+
const declaredNames = new Set(frontmatter.secrets.map((s) => s.name));
|
|
888
|
+
const envNames = Object.keys(envSecrets);
|
|
889
|
+
for (const name of envNames) {
|
|
890
|
+
if (!declaredNames.has(name)) {
|
|
891
|
+
warning(`Secret ${yellow(name)} in .env but not declared in SKILL.md`);
|
|
892
|
+
}
|
|
893
|
+
}
|
|
894
|
+
for (const declared of frontmatter.secrets) {
|
|
895
|
+
if (declared.required !== false && !envSecrets[declared.name]) {
|
|
896
|
+
warning(
|
|
897
|
+
`Required secret ${yellow(declared.name)} declared in SKILL.md but missing from .env`
|
|
898
|
+
);
|
|
899
|
+
}
|
|
900
|
+
}
|
|
901
|
+
}
|
|
902
|
+
if (!options.quiet && !options.json) {
|
|
903
|
+
info(`Pushing ${Object.keys(envSecrets).length} secret(s)...`);
|
|
904
|
+
}
|
|
905
|
+
const secretsResult = await api.upsertSkillSecrets(syncResult.skillId, envSecrets);
|
|
906
|
+
secretCount = secretsResult.updated.length;
|
|
907
|
+
if (!options.quiet && !options.json) {
|
|
908
|
+
success(`${secretCount} secret(s) updated`);
|
|
909
|
+
}
|
|
910
|
+
}
|
|
911
|
+
if (options.json) {
|
|
912
|
+
json({
|
|
913
|
+
slug: syncResult.slug,
|
|
914
|
+
skillId: syncResult.skillId,
|
|
915
|
+
created: syncResult.created,
|
|
916
|
+
secretsUpdated: secretCount
|
|
917
|
+
});
|
|
918
|
+
}
|
|
919
|
+
}
|
|
920
|
+
function getErrorCode6(err) {
|
|
921
|
+
if (err instanceof ConfigError) return "CONFIG_ERROR";
|
|
922
|
+
if (err instanceof SkillFileError) return "FILE_ERROR";
|
|
923
|
+
if (err instanceof ApiError) return "API_ERROR";
|
|
924
|
+
return "UNKNOWN";
|
|
925
|
+
}
|
|
926
|
+
function handleError6(err, options) {
|
|
927
|
+
if (options.json === true) {
|
|
928
|
+
json({
|
|
929
|
+
error: err instanceof Error ? err.message : "Unknown error",
|
|
930
|
+
code: getErrorCode6(err)
|
|
931
|
+
});
|
|
932
|
+
return;
|
|
933
|
+
}
|
|
934
|
+
if (err instanceof ConfigError) {
|
|
935
|
+
error(err.message);
|
|
936
|
+
} else if (err instanceof SkillFileError) {
|
|
937
|
+
error(err.message);
|
|
938
|
+
if (err.filePath !== void 0) {
|
|
939
|
+
dim(` File: ${err.filePath}`);
|
|
940
|
+
}
|
|
941
|
+
} else if (err instanceof ApiError) {
|
|
942
|
+
error(`API error: ${err.message}`);
|
|
943
|
+
if (err.status !== 0) {
|
|
944
|
+
dim(` Status: ${err.status}`);
|
|
945
|
+
}
|
|
946
|
+
} else if (err instanceof Error) {
|
|
947
|
+
error(err.message);
|
|
948
|
+
} else {
|
|
949
|
+
error("An unknown error occurred");
|
|
950
|
+
}
|
|
951
|
+
}
|
|
952
|
+
|
|
702
953
|
// src/index.ts
|
|
703
954
|
var envIndex = process.argv.indexOf("--env");
|
|
704
955
|
var envFile = envIndex !== -1 && process.argv[envIndex + 1] ? process.argv[envIndex + 1] : ".env";
|
|
705
|
-
|
|
956
|
+
dotenv2.config({ path: envFile });
|
|
706
957
|
var program = new Command();
|
|
707
958
|
program.name("octavus").description("CLI for validating and syncing Octavus agent definitions").version("0.1.0").option("--env <file>", "Load environment from a specific file", ".env");
|
|
708
959
|
registerValidateCommand(program);
|
|
@@ -710,5 +961,7 @@ registerSyncCommand(program);
|
|
|
710
961
|
registerListCommand(program);
|
|
711
962
|
registerGetCommand(program);
|
|
712
963
|
registerArchiveCommand(program);
|
|
964
|
+
var skillsCommand = program.command("skills").description("Manage skills");
|
|
965
|
+
registerSkillSyncCommand(skillsCommand);
|
|
713
966
|
program.parse();
|
|
714
967
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/config.ts","../src/agent-files.ts","../src/api.ts","../src/output.ts","../src/commands/validate.ts","../src/commands/sync.ts","../src/commands/list.ts","../src/commands/get.ts","../src/commands/archive.ts"],"sourcesContent":["/**\n * Octavus CLI - Validate and sync agent definitions\n *\n * Commands:\n * octavus validate <path> - Validate agent definition (dry-run)\n * octavus sync <path> - Sync agent to platform (creates or updates)\n * octavus list - List all agents in the project\n * octavus get <slug> - Get agent details by slug\n * octavus archive <slug> - Archive an agent (soft delete)\n *\n * Global Options:\n * --env <file> - Load environment from a specific file (default: .env)\n *\n * Environment:\n * OCTAVUS_CLI_API_KEY - API key with agent management permissions\n * OCTAVUS_API_KEY - Fallback API key\n * OCTAVUS_API_URL - Optional, defaults to https://octavus.ai\n */\n\nimport dotenv from 'dotenv';\nimport { Command } from 'commander';\nimport { registerValidateCommand } from '@/commands/validate.js';\nimport { registerSyncCommand } from '@/commands/sync.js';\nimport { registerListCommand } from '@/commands/list.js';\nimport { registerGetCommand } from '@/commands/get.js';\nimport { registerArchiveCommand } from '@/commands/archive.js';\n\n// Pre-parse to extract --env option before loading environment\nconst envIndex = process.argv.indexOf('--env');\nconst envFile = envIndex !== -1 && process.argv[envIndex + 1] ? process.argv[envIndex + 1] : '.env';\n\n// Load environment file\ndotenv.config({ path: envFile });\n\nconst program = new Command();\n\nprogram\n .name('octavus')\n .description('CLI for validating and syncing Octavus agent definitions')\n .version('0.1.0')\n .option('--env <file>', 'Load environment from a specific file', '.env');\n\n// Register commands\nregisterValidateCommand(program);\nregisterSyncCommand(program);\nregisterListCommand(program);\nregisterGetCommand(program);\nregisterArchiveCommand(program);\n\n// Parse and run\nprogram.parse();\n","/**\n * Configuration loading for the CLI.\n * Handles environment variables and defaults.\n */\n\nexport interface CliConfig {\n apiKey: string;\n baseUrl: string;\n}\n\nexport class ConfigError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ConfigError';\n }\n}\n\n/**\n * Load CLI configuration from environment variables.\n * API key resolution: OCTAVUS_CLI_API_KEY > OCTAVUS_API_KEY\n */\nexport function loadConfig(): CliConfig {\n const apiKey = process.env.OCTAVUS_CLI_API_KEY ?? process.env.OCTAVUS_API_KEY;\n\n if (!apiKey) {\n throw new ConfigError(\n 'No API key found. Set OCTAVUS_CLI_API_KEY or OCTAVUS_API_KEY environment variable.',\n );\n }\n\n const baseUrl = process.env.OCTAVUS_API_URL ?? 'https://octavus.ai';\n\n return { apiKey, baseUrl };\n}\n","/**\n * Agent file reading from filesystem.\n * Reads settings.json, protocol.yaml, prompts/*.md, and references/*.md files.\n */\n\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { z } from 'zod';\nimport { parse as parseYaml } from 'yaml';\n\n/** Agent settings from settings.json */\nexport interface AgentSettings {\n slug: string;\n name: string;\n description?: string;\n format: 'interactive' | 'worker';\n}\n\n/** Agent prompt from prompts/*.md */\nexport interface AgentPrompt {\n name: string;\n content: string;\n}\n\n/** Agent reference from references/*.md */\nexport interface AgentReference {\n name: string;\n description: string;\n content: string;\n}\n\n/** Complete agent definition read from filesystem */\nexport interface AgentDefinition {\n settings: AgentSettings;\n protocol: string;\n prompts: AgentPrompt[];\n references: AgentReference[];\n}\n\nconst agentSettingsSchema = z.object({\n slug: z.string().min(1, 'Slug is required'),\n name: z.string().min(1, 'Name is required'),\n description: z.string().optional(),\n format: z.enum(['interactive', 'worker']),\n});\n\nexport class AgentFileError extends Error {\n constructor(\n message: string,\n public readonly filePath?: string,\n ) {\n super(message);\n this.name = 'AgentFileError';\n }\n}\n\n/**\n * Read agent definition from a directory.\n * Expects:\n * - settings.json (required)\n * - protocol.yaml (required)\n * - prompts/**\\/*.md (optional, supports nested directories)\n * - references/*.md (optional, YAML frontmatter with description)\n */\nexport async function readAgentDefinition(agentPath: string): Promise<AgentDefinition> {\n const resolvedPath = path.resolve(agentPath);\n\n // Check if directory exists\n try {\n const stat = await fs.stat(resolvedPath);\n if (!stat.isDirectory()) {\n throw new AgentFileError(`Not a directory: ${resolvedPath}`);\n }\n } catch (err) {\n if ((err as { code?: string }).code === 'ENOENT') {\n throw new AgentFileError(`Directory not found: ${resolvedPath}`);\n }\n throw err;\n }\n\n // Read settings.json\n const settingsPath = path.join(resolvedPath, 'settings.json');\n const settings = await readSettings(settingsPath);\n\n // Read protocol.yaml\n const protocolPath = path.join(resolvedPath, 'protocol.yaml');\n const protocol = await readProtocol(protocolPath);\n\n // Read prompts\n const promptsPath = path.join(resolvedPath, 'prompts');\n const prompts = await readPrompts(promptsPath);\n\n // Read references\n const referencesPath = path.join(resolvedPath, 'references');\n const references = await readReferences(referencesPath);\n\n return { settings, protocol, prompts, references };\n}\n\nasync function readSettings(filePath: string): Promise<AgentSettings> {\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n const json: unknown = JSON.parse(content);\n const result = agentSettingsSchema.safeParse(json);\n\n if (!result.success) {\n const issues = result.error.issues.map((i) => i.message).join(', ');\n throw new AgentFileError(`Invalid settings.json: ${issues}`, filePath);\n }\n\n return result.data;\n } catch (err) {\n if ((err as { code?: string }).code === 'ENOENT') {\n throw new AgentFileError('settings.json not found', filePath);\n }\n if (err instanceof SyntaxError) {\n throw new AgentFileError(`Invalid JSON in settings.json: ${err.message}`, filePath);\n }\n throw err;\n }\n}\n\nasync function readProtocol(filePath: string): Promise<string> {\n try {\n return await fs.readFile(filePath, 'utf-8');\n } catch (err) {\n if ((err as { code?: string }).code === 'ENOENT') {\n throw new AgentFileError('protocol.yaml not found', filePath);\n }\n throw err;\n }\n}\n\nasync function readPrompts(promptsDir: string, relativePath = ''): Promise<AgentPrompt[]> {\n const prompts: AgentPrompt[] = [];\n\n try {\n const entries = await fs.readdir(promptsDir, { withFileTypes: true });\n\n for (const entry of entries) {\n const entryRelativePath = relativePath ? `${relativePath}/${entry.name}` : entry.name;\n\n if (entry.isDirectory()) {\n const subPrompts = await readPrompts(path.join(promptsDir, entry.name), entryRelativePath);\n prompts.push(...subPrompts);\n } else if (entry.name.endsWith('.md')) {\n const name = entryRelativePath.replace(/\\.md$/, '');\n const content = await fs.readFile(path.join(promptsDir, entry.name), 'utf-8');\n prompts.push({ name, content });\n }\n }\n } catch (err) {\n if ((err as { code?: string }).code !== 'ENOENT') {\n throw err;\n }\n }\n\n return prompts;\n}\n\nconst FRONTMATTER_REGEX = /^---\\n([\\s\\S]*?)\\n---\\n?([\\s\\S]*)$/;\n\nconst referenceFrontmatterSchema = z.object({\n description: z.string().min(1, 'Description is required'),\n});\n\nasync function readReferences(referencesDir: string): Promise<AgentReference[]> {\n const references: AgentReference[] = [];\n\n try {\n const entries = await fs.readdir(referencesDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isFile() || !entry.name.endsWith('.md')) continue;\n\n const name = entry.name.replace(/\\.md$/, '');\n const raw = await fs.readFile(path.join(referencesDir, entry.name), 'utf-8');\n const match = FRONTMATTER_REGEX.exec(raw);\n\n if (!match) {\n throw new AgentFileError(\n `Reference \"${name}\" is missing YAML frontmatter (---description: ...---)`,\n path.join(referencesDir, entry.name),\n );\n }\n\n const frontmatter = parseYaml(match[1]!) as unknown;\n const result = referenceFrontmatterSchema.safeParse(frontmatter);\n\n if (!result.success) {\n const issues = result.error.issues.map((i) => i.message).join(', ');\n throw new AgentFileError(\n `Invalid frontmatter in reference \"${name}\": ${issues}`,\n path.join(referencesDir, entry.name),\n );\n }\n\n references.push({\n name,\n description: result.data.description,\n content: match[2]!.trim(),\n });\n }\n } catch (err) {\n if ((err as { code?: string }).code !== 'ENOENT') {\n throw err;\n }\n }\n\n return references;\n}\n","/**\n * API client for the CLI.\n * Thin wrapper around fetch for Octavus platform API calls.\n */\n\nimport { z } from 'zod';\nimport type { CliConfig } from '@/config.js';\nimport type { AgentDefinition } from '@/agent-files.js';\n\n/** API error response */\nexport class ApiError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n public readonly code?: string,\n ) {\n super(message);\n this.name = 'ApiError';\n }\n}\n\n/** Agent summary from list endpoint */\nexport interface Agent {\n slug: string;\n id: string;\n name: string;\n description: string | null;\n format: string;\n createdAt: string;\n updatedAt: string;\n projectId: string;\n}\n\n/** Full agent definition from get endpoint */\nexport interface AgentDetails {\n settings: {\n slug: string;\n name: string;\n description?: string;\n format: 'interactive' | 'worker';\n };\n protocol: string;\n prompts: { name: string; content: string }[];\n references: { name: string; description: string; content: string }[];\n id: string;\n}\n\n/** Validation error detail */\nexport interface ValidationErrorDetail {\n message: string;\n path?: string;\n severity: 'error' | 'warning';\n}\n\n/** Validation result from validate endpoint */\nexport interface ValidationResult {\n valid: boolean;\n errors: ValidationErrorDetail[];\n warnings: ValidationErrorDetail[];\n}\n\n/** Sync result from create/update endpoints */\nexport interface SyncResult {\n agentId: string;\n created: boolean;\n}\n\n/** Archive result from delete endpoint */\nexport interface ArchiveResult {\n agentId: string;\n message: string;\n}\n\n// Response schemas for validation\nconst agentSchema = z.object({\n slug: z.string(),\n id: z.string(),\n name: z.string(),\n description: z.string().nullable(),\n format: z.string(),\n createdAt: z.string(),\n updatedAt: z.string(),\n projectId: z.string(),\n});\n\nconst agentsResponseSchema = z.object({\n agents: z.array(agentSchema),\n});\n\nconst agentDefinitionSchema = z.object({\n settings: z.object({\n slug: z.string(),\n name: z.string(),\n description: z.string().optional(),\n format: z.enum(['interactive', 'worker']),\n }),\n protocol: z.string(),\n prompts: z.array(z.object({ name: z.string(), content: z.string() })),\n references: z\n .array(z.object({ name: z.string(), description: z.string(), content: z.string() }))\n .default([]),\n id: z.string(),\n});\n\nconst validationResultSchema = z.object({\n valid: z.boolean(),\n errors: z.array(\n z.object({\n message: z.string(),\n path: z.string().optional(),\n severity: z.enum(['error', 'warning']),\n }),\n ),\n warnings: z.array(\n z.object({\n message: z.string(),\n path: z.string().optional(),\n severity: z.enum(['error', 'warning']),\n }),\n ),\n});\n\nconst createResponseSchema = z.object({\n agentId: z.string(),\n message: z.string(),\n});\n\nconst updateResponseSchema = z.object({\n agentId: z.string(),\n message: z.string(),\n});\n\nconst archiveResponseSchema = z.object({\n agentId: z.string(),\n message: z.string(),\n});\n\nexport class CliApi {\n constructor(private readonly config: CliConfig) {}\n\n /** List all agents in the project */\n async listAgents(): Promise<Agent[]> {\n const response = await this.request('GET', '/api/agents');\n const data = agentsResponseSchema.parse(response);\n return data.agents;\n }\n\n /** Get agent by slug */\n async getAgent(slug: string): Promise<AgentDetails | null> {\n try {\n const response = await this.request('GET', `/api/agents/${slug}?by=slug`);\n return agentDefinitionSchema.parse(response);\n } catch (err) {\n if (err instanceof ApiError && err.status === 404) {\n return null;\n }\n throw err;\n }\n }\n\n /** Validate agent definition (dry-run) */\n async validateAgent(definition: AgentDefinition): Promise<ValidationResult> {\n const response = await this.request('POST', '/api/agents/validate', definition);\n return validationResultSchema.parse(response);\n }\n\n /** Create a new agent */\n async createAgent(definition: AgentDefinition): Promise<string> {\n const response = await this.request('POST', '/api/agents', definition);\n const data = createResponseSchema.parse(response);\n return data.agentId;\n }\n\n /** Update an existing agent by slug */\n async updateAgent(slug: string, definition: AgentDefinition): Promise<string> {\n // Exclude slug from settings (it's the identifier in the URL)\n const { slug: _slug, ...settings } = definition.settings;\n\n const response = await this.request('PATCH', `/api/agents/${slug}?by=slug`, {\n settings,\n protocol: definition.protocol,\n prompts: definition.prompts,\n references: definition.references,\n });\n const data = updateResponseSchema.parse(response);\n return data.agentId;\n }\n\n /** Archive an agent by slug */\n async archiveAgent(slug: string): Promise<ArchiveResult> {\n const response = await this.request('DELETE', `/api/agents/${slug}?by=slug`);\n return archiveResponseSchema.parse(response);\n }\n\n /** Sync agent (create or update) */\n async syncAgent(definition: AgentDefinition): Promise<SyncResult> {\n const existing = await this.getAgent(definition.settings.slug);\n\n if (existing) {\n const agentId = await this.updateAgent(definition.settings.slug, definition);\n return { agentId, created: false };\n }\n\n const agentId = await this.createAgent(definition);\n return { agentId, created: true };\n }\n\n private async request(method: string, path: string, body?: unknown): Promise<unknown> {\n const url = `${this.config.baseUrl}${path}`;\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.config.apiKey}`,\n };\n\n if (body !== undefined) {\n headers['Content-Type'] = 'application/json';\n }\n\n const response = await fetch(url, {\n method,\n headers,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n });\n\n const contentType = response.headers.get('content-type');\n const isJson = contentType?.includes('application/json');\n\n if (!response.ok) {\n if (isJson) {\n const errorData = (await response.json()) as { error?: string; code?: string };\n throw new ApiError(\n errorData.error ?? `Request failed with status ${response.status}`,\n response.status,\n errorData.code,\n );\n }\n throw new ApiError(`Request failed with status ${response.status}`, response.status);\n }\n\n if (!isJson) {\n throw new ApiError('Expected JSON response', response.status);\n }\n\n return await response.json();\n }\n}\n","/* eslint-disable no-console */\n/**\n * Terminal output utilities with colors and formatting.\n * Console statements are intentional for CLI output.\n */\n\n// ANSI color codes\nconst colors = {\n reset: '\\x1b[0m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m',\n gray: '\\x1b[90m',\n bold: '\\x1b[1m',\n};\n\nexport function success(message: string): void {\n console.log(`${colors.green}✓${colors.reset} ${message}`);\n}\n\nexport function error(message: string): void {\n console.error(`${colors.red}✗${colors.reset} ${message}`);\n}\n\nexport function warning(message: string): void {\n console.log(`${colors.yellow}⚠${colors.reset} ${message}`);\n}\n\nexport function info(message: string): void {\n console.log(`${colors.blue}ℹ${colors.reset} ${message}`);\n}\n\nexport function dim(message: string): void {\n console.log(`${colors.gray}${message}${colors.reset}`);\n}\n\nexport function bold(text: string): string {\n return `${colors.bold}${text}${colors.reset}`;\n}\n\nexport function cyan(text: string): string {\n return `${colors.cyan}${text}${colors.reset}`;\n}\n\nexport function green(text: string): string {\n return `${colors.green}${text}${colors.reset}`;\n}\n\nexport function yellow(text: string): string {\n return `${colors.yellow}${text}${colors.reset}`;\n}\n\nexport function red(text: string): string {\n return `${colors.red}${text}${colors.reset}`;\n}\n\nexport function gray(text: string): string {\n return `${colors.gray}${text}${colors.reset}`;\n}\n\n/**\n * Print a key-value pair with formatting\n */\nexport function keyValue(key: string, value: string): void {\n console.log(` ${colors.gray}${key}:${colors.reset} ${value}`);\n}\n\n/**\n * Print a table row\n */\nexport function tableRow(columns: string[], widths: number[]): void {\n const formatted = columns.map((col, i) => col.padEnd(widths[i] ?? 20)).join(' ');\n console.log(formatted);\n}\n\n/**\n * Print a separator line\n */\nexport function separator(): void {\n console.log();\n}\n\n/**\n * JSON output mode for CI/CD\n */\nexport function json(data: unknown): void {\n console.log(JSON.stringify(data, null, 2));\n}\n","/**\n * octavus validate <path>\n * Validate agent definition via API (dry-run, no changes saved)\n */\n\nimport type { Command } from 'commander';\nimport { loadConfig, ConfigError } from '@/config.js';\nimport { readAgentDefinition, AgentFileError } from '@/agent-files.js';\nimport { CliApi, ApiError } from '@/api.js';\nimport * as output from '@/output.js';\n\ninterface ValidateOptions {\n json?: boolean;\n quiet?: boolean;\n}\n\nexport function registerValidateCommand(program: Command): void {\n program\n .command('validate <path>')\n .description('Validate agent definition (dry-run, no changes saved)')\n .option('--json', 'Output as JSON')\n .option('--quiet', 'Suppress non-essential output')\n .action(async (agentPath: string, options: ValidateOptions) => {\n try {\n await runValidate(agentPath, options);\n } catch (err) {\n handleError(err, options);\n process.exit(err instanceof ConfigError ? 2 : 1);\n }\n });\n}\n\nasync function runValidate(agentPath: string, options: ValidateOptions): Promise<void> {\n const config = loadConfig();\n const api = new CliApi(config);\n\n // Read agent files\n if (!options.quiet && !options.json) {\n output.info(`Reading agent from ${output.cyan(agentPath)}...`);\n }\n\n const definition = await readAgentDefinition(agentPath);\n\n if (!options.quiet && !options.json) {\n output.info(`Validating ${output.bold(definition.settings.slug)}...`);\n }\n\n // Validate via API\n const result = await api.validateAgent(definition);\n\n // Output results\n if (options.json) {\n output.json({\n slug: definition.settings.slug,\n valid: result.valid,\n errors: result.errors,\n warnings: result.warnings,\n });\n } else {\n if (result.valid) {\n output.success(`Agent ${output.bold(definition.settings.slug)} is valid`);\n } else {\n output.error(`Agent ${output.bold(definition.settings.slug)} has validation errors`);\n }\n\n // Show errors\n for (const err of result.errors) {\n const location = err.path ? ` (${output.gray(err.path)})` : '';\n output.error(` ${err.message}${location}`);\n }\n\n // Show warnings\n for (const warn of result.warnings) {\n const location = warn.path ? ` (${output.gray(warn.path)})` : '';\n output.warning(` ${warn.message}${location}`);\n }\n }\n\n // Exit with error code if validation failed\n if (!result.valid) {\n process.exit(1);\n }\n}\n\nfunction getErrorCode(err: unknown): string {\n if (err instanceof ConfigError) return 'CONFIG_ERROR';\n if (err instanceof AgentFileError) return 'FILE_ERROR';\n if (err instanceof ApiError) return 'API_ERROR';\n return 'UNKNOWN';\n}\n\nfunction handleError(err: unknown, options: ValidateOptions): void {\n if (options.json === true) {\n output.json({\n error: err instanceof Error ? err.message : 'Unknown error',\n code: getErrorCode(err),\n });\n return;\n }\n\n if (err instanceof ConfigError) {\n output.error(err.message);\n } else if (err instanceof AgentFileError) {\n output.error(err.message);\n if (err.filePath !== undefined) {\n output.dim(` File: ${err.filePath}`);\n }\n } else if (err instanceof ApiError) {\n output.error(`API error: ${err.message}`);\n if (err.status !== 0) {\n output.dim(` Status: ${err.status}`);\n }\n } else if (err instanceof Error) {\n output.error(err.message);\n } else {\n output.error('An unknown error occurred');\n }\n}\n","/**\n * octavus sync <path>\n * Sync agent to platform (creates or updates)\n */\n\nimport type { Command } from 'commander';\nimport { loadConfig, ConfigError } from '@/config.js';\nimport { readAgentDefinition, AgentFileError } from '@/agent-files.js';\nimport { CliApi, ApiError } from '@/api.js';\nimport * as output from '@/output.js';\n\ninterface SyncOptions {\n json?: boolean;\n quiet?: boolean;\n}\n\nexport function registerSyncCommand(program: Command): void {\n program\n .command('sync <path>')\n .description('Sync agent to platform (creates or updates)')\n .option('--json', 'Output as JSON')\n .option('--quiet', 'Suppress non-essential output')\n .action(async (agentPath: string, options: SyncOptions) => {\n try {\n await runSync(agentPath, options);\n } catch (err) {\n handleError(err, options);\n process.exit(err instanceof ConfigError ? 2 : 1);\n }\n });\n}\n\nasync function runSync(agentPath: string, options: SyncOptions): Promise<void> {\n const config = loadConfig();\n const api = new CliApi(config);\n\n // Read agent files\n if (!options.quiet && !options.json) {\n output.info(`Reading agent from ${output.cyan(agentPath)}...`);\n }\n\n const definition = await readAgentDefinition(agentPath);\n\n if (!options.quiet && !options.json) {\n output.info(`Syncing ${output.bold(definition.settings.slug)}...`);\n }\n\n // Sync to platform\n const result = await api.syncAgent(definition);\n\n // Output results\n if (options.json) {\n output.json({\n slug: definition.settings.slug,\n agentId: result.agentId,\n created: result.created,\n });\n } else {\n const action = result.created ? 'Created' : 'Updated';\n output.success(`${action}: ${output.bold(definition.settings.slug)}`);\n output.keyValue('Agent ID', result.agentId);\n }\n}\n\nfunction getErrorCode(err: unknown): string {\n if (err instanceof ConfigError) return 'CONFIG_ERROR';\n if (err instanceof AgentFileError) return 'FILE_ERROR';\n if (err instanceof ApiError) return 'API_ERROR';\n return 'UNKNOWN';\n}\n\nfunction handleError(err: unknown, options: SyncOptions): void {\n if (options.json === true) {\n output.json({\n error: err instanceof Error ? err.message : 'Unknown error',\n code: getErrorCode(err),\n });\n return;\n }\n\n if (err instanceof ConfigError) {\n output.error(err.message);\n } else if (err instanceof AgentFileError) {\n output.error(err.message);\n if (err.filePath !== undefined) {\n output.dim(` File: ${err.filePath}`);\n }\n } else if (err instanceof ApiError) {\n output.error(`API error: ${err.message}`);\n if (err.status !== 0) {\n output.dim(` Status: ${err.status}`);\n }\n } else if (err instanceof Error) {\n output.error(err.message);\n } else {\n output.error('An unknown error occurred');\n }\n}\n","/**\n * octavus list\n * List all agents in the project\n */\n\nimport type { Command } from 'commander';\nimport { loadConfig, ConfigError } from '@/config.js';\nimport { CliApi, ApiError } from '@/api.js';\nimport * as output from '@/output.js';\n\ninterface ListOptions {\n json?: boolean;\n quiet?: boolean;\n}\n\nexport function registerListCommand(program: Command): void {\n program\n .command('list')\n .description('List all agents in the project')\n .option('--json', 'Output as JSON')\n .option('--quiet', 'Suppress non-essential output')\n .action(async (options: ListOptions) => {\n try {\n await runList(options);\n } catch (err) {\n handleError(err, options);\n process.exit(err instanceof ConfigError ? 2 : 1);\n }\n });\n}\n\nasync function runList(options: ListOptions): Promise<void> {\n const config = loadConfig();\n const api = new CliApi(config);\n\n const agents = await api.listAgents();\n\n if (options.json) {\n output.json({ agents });\n return;\n }\n\n if (agents.length === 0) {\n output.info('No agents found');\n return;\n }\n\n // Print header\n output.separator();\n output.tableRow(\n [output.bold('SLUG'), output.bold('NAME'), output.bold('FORMAT'), output.bold('ID')],\n [20, 30, 12, 36],\n );\n output.dim('─'.repeat(100));\n\n // Print agents\n for (const agent of agents) {\n output.tableRow([agent.slug, agent.name, agent.format, agent.id], [20, 30, 12, 36]);\n }\n\n output.separator();\n output.dim(`${agents.length} agent(s)`);\n}\n\nfunction getErrorCode(err: unknown): string {\n if (err instanceof ConfigError) return 'CONFIG_ERROR';\n if (err instanceof ApiError) return 'API_ERROR';\n return 'UNKNOWN';\n}\n\nfunction handleError(err: unknown, options: ListOptions): void {\n if (options.json === true) {\n output.json({\n error: err instanceof Error ? err.message : 'Unknown error',\n code: getErrorCode(err),\n });\n return;\n }\n\n if (err instanceof ConfigError) {\n output.error(err.message);\n } else if (err instanceof ApiError) {\n output.error(`API error: ${err.message}`);\n if (err.status !== 0) {\n output.dim(` Status: ${err.status}`);\n }\n } else if (err instanceof Error) {\n output.error(err.message);\n } else {\n output.error('An unknown error occurred');\n }\n}\n","/**\n * octavus get <slug>\n * Get agent details by slug\n */\n\nimport type { Command } from 'commander';\nimport { loadConfig, ConfigError } from '@/config.js';\nimport { CliApi, ApiError } from '@/api.js';\nimport * as output from '@/output.js';\n\ninterface GetOptions {\n json?: boolean;\n quiet?: boolean;\n}\n\nexport function registerGetCommand(program: Command): void {\n program\n .command('get <slug>')\n .description('Get agent details by slug')\n .option('--json', 'Output as JSON')\n .option('--quiet', 'Suppress non-essential output')\n .action(async (slug: string, options: GetOptions) => {\n try {\n await runGet(slug, options);\n } catch (err) {\n handleError(err, options);\n process.exit(err instanceof ConfigError ? 2 : 1);\n }\n });\n}\n\nasync function runGet(slug: string, options: GetOptions): Promise<void> {\n const config = loadConfig();\n const api = new CliApi(config);\n\n const agent = await api.getAgent(slug);\n\n if (!agent) {\n if (options.json) {\n output.json({ error: `Agent not found: ${slug}`, code: 'NOT_FOUND' });\n } else {\n output.error(`Agent not found: ${slug}`);\n }\n process.exit(1);\n }\n\n if (options.json) {\n output.json(agent);\n return;\n }\n\n // Print agent details\n output.separator();\n output.success(`Agent: ${output.bold(agent.settings.name)}`);\n output.separator();\n output.keyValue('Slug', agent.settings.slug);\n output.keyValue('ID', agent.id);\n output.keyValue('Format', agent.settings.format);\n if (agent.settings.description) {\n output.keyValue('Description', agent.settings.description);\n }\n output.separator();\n output.keyValue(\n 'Prompts',\n agent.prompts.length > 0 ? agent.prompts.map((p) => p.name).join(', ') : '(none)',\n );\n}\n\nfunction getErrorCode(err: unknown): string {\n if (err instanceof ConfigError) return 'CONFIG_ERROR';\n if (err instanceof ApiError) return 'API_ERROR';\n return 'UNKNOWN';\n}\n\nfunction handleError(err: unknown, options: GetOptions): void {\n if (options.json === true) {\n output.json({\n error: err instanceof Error ? err.message : 'Unknown error',\n code: getErrorCode(err),\n });\n return;\n }\n\n if (err instanceof ConfigError) {\n output.error(err.message);\n } else if (err instanceof ApiError) {\n output.error(`API error: ${err.message}`);\n if (err.status !== 0) {\n output.dim(` Status: ${err.status}`);\n }\n } else if (err instanceof Error) {\n output.error(err.message);\n } else {\n output.error('An unknown error occurred');\n }\n}\n","/**\n * octavus archive <slug>\n * Archive an agent (soft delete)\n */\n\nimport type { Command } from 'commander';\nimport { loadConfig, ConfigError } from '@/config.js';\nimport { CliApi, ApiError } from '@/api.js';\nimport * as output from '@/output.js';\n\ninterface ArchiveOptions {\n json?: boolean;\n quiet?: boolean;\n}\n\nexport function registerArchiveCommand(program: Command): void {\n program\n .command('archive <slug>')\n .description('Archive an agent (soft delete)')\n .option('--json', 'Output as JSON')\n .option('--quiet', 'Suppress non-essential output')\n .action(async (slug: string, options: ArchiveOptions) => {\n try {\n await runArchive(slug, options);\n } catch (err) {\n handleError(err, options);\n process.exit(err instanceof ConfigError ? 2 : 1);\n }\n });\n}\n\nasync function runArchive(slug: string, options: ArchiveOptions): Promise<void> {\n const config = loadConfig();\n const api = new CliApi(config);\n\n if (!options.quiet && !options.json) {\n output.info(`Archiving ${output.bold(slug)}...`);\n }\n\n const result = await api.archiveAgent(slug);\n\n if (options.json) {\n output.json({\n slug,\n agentId: result.agentId,\n archived: true,\n });\n } else {\n output.success(`Archived: ${output.bold(slug)}`);\n output.keyValue('Agent ID', result.agentId);\n }\n}\n\nfunction getErrorCode(err: unknown): string {\n if (err instanceof ConfigError) return 'CONFIG_ERROR';\n if (err instanceof ApiError) return 'API_ERROR';\n return 'UNKNOWN';\n}\n\nfunction handleError(err: unknown, options: ArchiveOptions): void {\n if (options.json === true) {\n output.json({\n error: err instanceof Error ? err.message : 'Unknown error',\n code: getErrorCode(err),\n });\n return;\n }\n\n if (err instanceof ConfigError) {\n output.error(err.message);\n } else if (err instanceof ApiError) {\n output.error(`API error: ${err.message}`);\n if (err.status !== 0) {\n output.dim(` Status: ${err.status}`);\n }\n } else if (err instanceof Error) {\n output.error(err.message);\n } else {\n output.error('An unknown error occurred');\n }\n}\n"],"mappings":"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","names":["json","z","agentId","path","program","program","handleError","getErrorCode","program","handleError","getErrorCode","program","handleError","getErrorCode","program","handleError","getErrorCode"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/config.ts","../src/agent-files.ts","../src/api.ts","../src/output.ts","../src/commands/validate.ts","../src/commands/sync.ts","../src/commands/list.ts","../src/commands/get.ts","../src/commands/archive.ts","../src/skill-files.ts","../src/commands/skills/sync.ts"],"sourcesContent":["/**\n * Octavus CLI - Validate and sync agent definitions\n *\n * Commands:\n * octavus validate <path> - Validate agent definition (dry-run)\n * octavus sync <path> - Sync agent to platform (creates or updates)\n * octavus list - List all agents in the project\n * octavus get <slug> - Get agent details by slug\n * octavus archive <slug> - Archive an agent (soft delete)\n *\n * Global Options:\n * --env <file> - Load environment from a specific file (default: .env)\n *\n * Environment:\n * OCTAVUS_CLI_API_KEY - API key with agent management permissions\n * OCTAVUS_API_KEY - Fallback API key\n * OCTAVUS_API_URL - Optional, defaults to https://octavus.ai\n */\n\nimport dotenv from 'dotenv';\nimport { Command } from 'commander';\nimport { registerValidateCommand } from '@/commands/validate.js';\nimport { registerSyncCommand } from '@/commands/sync.js';\nimport { registerListCommand } from '@/commands/list.js';\nimport { registerGetCommand } from '@/commands/get.js';\nimport { registerArchiveCommand } from '@/commands/archive.js';\nimport { registerSkillSyncCommand } from '@/commands/skills/sync.js';\n\n// Pre-parse to extract --env option before loading environment\nconst envIndex = process.argv.indexOf('--env');\nconst envFile = envIndex !== -1 && process.argv[envIndex + 1] ? process.argv[envIndex + 1] : '.env';\n\n// Load environment file\ndotenv.config({ path: envFile });\n\nconst program = new Command();\n\nprogram\n .name('octavus')\n .description('CLI for validating and syncing Octavus agent definitions')\n .version('0.1.0')\n .option('--env <file>', 'Load environment from a specific file', '.env');\n\n// Register agent commands\nregisterValidateCommand(program);\nregisterSyncCommand(program);\nregisterListCommand(program);\nregisterGetCommand(program);\nregisterArchiveCommand(program);\n\n// Register skills command group\nconst skillsCommand = program.command('skills').description('Manage skills');\nregisterSkillSyncCommand(skillsCommand);\n\n// Parse and run\nprogram.parse();\n","/**\n * Configuration loading for the CLI.\n * Handles environment variables and defaults.\n */\n\nexport interface CliConfig {\n apiKey: string;\n baseUrl: string;\n}\n\nexport class ConfigError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ConfigError';\n }\n}\n\n/**\n * Load CLI configuration from environment variables.\n * API key resolution: OCTAVUS_CLI_API_KEY > OCTAVUS_API_KEY\n */\nexport function loadConfig(): CliConfig {\n const apiKey = process.env.OCTAVUS_CLI_API_KEY ?? process.env.OCTAVUS_API_KEY;\n\n if (!apiKey) {\n throw new ConfigError(\n 'No API key found. Set OCTAVUS_CLI_API_KEY or OCTAVUS_API_KEY environment variable.',\n );\n }\n\n const baseUrl = process.env.OCTAVUS_API_URL ?? 'https://octavus.ai';\n\n return { apiKey, baseUrl };\n}\n","/**\n * Agent file reading from filesystem.\n * Reads settings.json, protocol.yaml, prompts/*.md, and references/*.md files.\n */\n\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { z } from 'zod';\nimport { parse as parseYaml } from 'yaml';\n\n/** Agent settings from settings.json */\nexport interface AgentSettings {\n slug: string;\n name: string;\n description?: string;\n format: 'interactive' | 'worker';\n}\n\n/** Agent prompt from prompts/*.md */\nexport interface AgentPrompt {\n name: string;\n content: string;\n}\n\n/** Agent reference from references/*.md */\nexport interface AgentReference {\n name: string;\n description: string;\n content: string;\n}\n\n/** Complete agent definition read from filesystem */\nexport interface AgentDefinition {\n settings: AgentSettings;\n protocol: string;\n prompts: AgentPrompt[];\n references: AgentReference[];\n}\n\nconst agentSettingsSchema = z.object({\n slug: z.string().min(1, 'Slug is required'),\n name: z.string().min(1, 'Name is required'),\n description: z.string().optional(),\n format: z.enum(['interactive', 'worker']),\n});\n\nexport class AgentFileError extends Error {\n constructor(\n message: string,\n public readonly filePath?: string,\n ) {\n super(message);\n this.name = 'AgentFileError';\n }\n}\n\n/**\n * Read agent definition from a directory.\n * Expects:\n * - settings.json (required)\n * - protocol.yaml (required)\n * - prompts/**\\/*.md (optional, supports nested directories)\n * - references/*.md (optional, YAML frontmatter with description)\n */\nexport async function readAgentDefinition(agentPath: string): Promise<AgentDefinition> {\n const resolvedPath = path.resolve(agentPath);\n\n // Check if directory exists\n try {\n const stat = await fs.stat(resolvedPath);\n if (!stat.isDirectory()) {\n throw new AgentFileError(`Not a directory: ${resolvedPath}`);\n }\n } catch (err) {\n if ((err as { code?: string }).code === 'ENOENT') {\n throw new AgentFileError(`Directory not found: ${resolvedPath}`);\n }\n throw err;\n }\n\n // Read settings.json\n const settingsPath = path.join(resolvedPath, 'settings.json');\n const settings = await readSettings(settingsPath);\n\n // Read protocol.yaml\n const protocolPath = path.join(resolvedPath, 'protocol.yaml');\n const protocol = await readProtocol(protocolPath);\n\n // Read prompts\n const promptsPath = path.join(resolvedPath, 'prompts');\n const prompts = await readPrompts(promptsPath);\n\n // Read references\n const referencesPath = path.join(resolvedPath, 'references');\n const references = await readReferences(referencesPath);\n\n return { settings, protocol, prompts, references };\n}\n\nasync function readSettings(filePath: string): Promise<AgentSettings> {\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n const json: unknown = JSON.parse(content);\n const result = agentSettingsSchema.safeParse(json);\n\n if (!result.success) {\n const issues = result.error.issues.map((i) => i.message).join(', ');\n throw new AgentFileError(`Invalid settings.json: ${issues}`, filePath);\n }\n\n return result.data;\n } catch (err) {\n if ((err as { code?: string }).code === 'ENOENT') {\n throw new AgentFileError('settings.json not found', filePath);\n }\n if (err instanceof SyntaxError) {\n throw new AgentFileError(`Invalid JSON in settings.json: ${err.message}`, filePath);\n }\n throw err;\n }\n}\n\nasync function readProtocol(filePath: string): Promise<string> {\n try {\n return await fs.readFile(filePath, 'utf-8');\n } catch (err) {\n if ((err as { code?: string }).code === 'ENOENT') {\n throw new AgentFileError('protocol.yaml not found', filePath);\n }\n throw err;\n }\n}\n\nasync function readPrompts(promptsDir: string, relativePath = ''): Promise<AgentPrompt[]> {\n const prompts: AgentPrompt[] = [];\n\n try {\n const entries = await fs.readdir(promptsDir, { withFileTypes: true });\n\n for (const entry of entries) {\n const entryRelativePath = relativePath ? `${relativePath}/${entry.name}` : entry.name;\n\n if (entry.isDirectory()) {\n const subPrompts = await readPrompts(path.join(promptsDir, entry.name), entryRelativePath);\n prompts.push(...subPrompts);\n } else if (entry.name.endsWith('.md')) {\n const name = entryRelativePath.replace(/\\.md$/, '');\n const content = await fs.readFile(path.join(promptsDir, entry.name), 'utf-8');\n prompts.push({ name, content });\n }\n }\n } catch (err) {\n if ((err as { code?: string }).code !== 'ENOENT') {\n throw err;\n }\n }\n\n return prompts;\n}\n\nconst FRONTMATTER_REGEX = /^---\\n([\\s\\S]*?)\\n---\\n?([\\s\\S]*)$/;\n\nconst referenceFrontmatterSchema = z.object({\n description: z.string().min(1, 'Description is required'),\n});\n\nasync function readReferences(referencesDir: string): Promise<AgentReference[]> {\n const references: AgentReference[] = [];\n\n try {\n const entries = await fs.readdir(referencesDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isFile() || !entry.name.endsWith('.md')) continue;\n\n const name = entry.name.replace(/\\.md$/, '');\n const raw = await fs.readFile(path.join(referencesDir, entry.name), 'utf-8');\n const match = FRONTMATTER_REGEX.exec(raw);\n\n if (!match) {\n throw new AgentFileError(\n `Reference \"${name}\" is missing YAML frontmatter (---description: ...---)`,\n path.join(referencesDir, entry.name),\n );\n }\n\n const frontmatter = parseYaml(match[1]!) as unknown;\n const result = referenceFrontmatterSchema.safeParse(frontmatter);\n\n if (!result.success) {\n const issues = result.error.issues.map((i) => i.message).join(', ');\n throw new AgentFileError(\n `Invalid frontmatter in reference \"${name}\": ${issues}`,\n path.join(referencesDir, entry.name),\n );\n }\n\n references.push({\n name,\n description: result.data.description,\n content: match[2]!.trim(),\n });\n }\n } catch (err) {\n if ((err as { code?: string }).code !== 'ENOENT') {\n throw err;\n }\n }\n\n return references;\n}\n","/**\n * API client for the CLI.\n * Thin wrapper around fetch for Octavus platform API calls.\n */\n\nimport { z } from 'zod';\nimport type { CliConfig } from '@/config.js';\nimport type { AgentDefinition } from '@/agent-files.js';\n\n/** API error response */\nexport class ApiError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n public readonly code?: string,\n ) {\n super(message);\n this.name = 'ApiError';\n }\n}\n\n/** Agent summary from list endpoint */\nexport interface Agent {\n slug: string;\n id: string;\n name: string;\n description: string | null;\n format: string;\n createdAt: string;\n updatedAt: string;\n projectId: string;\n}\n\n/** Full agent definition from get endpoint */\nexport interface AgentDetails {\n settings: {\n slug: string;\n name: string;\n description?: string;\n format: 'interactive' | 'worker';\n };\n protocol: string;\n prompts: { name: string; content: string }[];\n references: { name: string; description: string; content: string }[];\n id: string;\n}\n\n/** Validation error detail */\nexport interface ValidationErrorDetail {\n message: string;\n path?: string;\n severity: 'error' | 'warning';\n}\n\n/** Validation result from validate endpoint */\nexport interface ValidationResult {\n valid: boolean;\n errors: ValidationErrorDetail[];\n warnings: ValidationErrorDetail[];\n}\n\n/** Sync result from create/update endpoints */\nexport interface SyncResult {\n agentId: string;\n created: boolean;\n}\n\n/** Archive result from delete endpoint */\nexport interface ArchiveResult {\n agentId: string;\n message: string;\n}\n\n// Response schemas for validation\nconst agentSchema = z.object({\n slug: z.string(),\n id: z.string(),\n name: z.string(),\n description: z.string().nullable(),\n format: z.string(),\n createdAt: z.string(),\n updatedAt: z.string(),\n projectId: z.string(),\n});\n\nconst agentsResponseSchema = z.object({\n agents: z.array(agentSchema),\n});\n\nconst agentDefinitionSchema = z.object({\n settings: z.object({\n slug: z.string(),\n name: z.string(),\n description: z.string().optional(),\n format: z.enum(['interactive', 'worker']),\n }),\n protocol: z.string(),\n prompts: z.array(z.object({ name: z.string(), content: z.string() })),\n references: z\n .array(z.object({ name: z.string(), description: z.string(), content: z.string() }))\n .default([]),\n id: z.string(),\n});\n\nconst validationResultSchema = z.object({\n valid: z.boolean(),\n errors: z.array(\n z.object({\n message: z.string(),\n path: z.string().optional(),\n severity: z.enum(['error', 'warning']),\n }),\n ),\n warnings: z.array(\n z.object({\n message: z.string(),\n path: z.string().optional(),\n severity: z.enum(['error', 'warning']),\n }),\n ),\n});\n\nconst createResponseSchema = z.object({\n agentId: z.string(),\n message: z.string(),\n});\n\nconst updateResponseSchema = z.object({\n agentId: z.string(),\n message: z.string(),\n});\n\nconst archiveResponseSchema = z.object({\n agentId: z.string(),\n message: z.string(),\n});\n\n/** Skill sync result from POST /api/skills */\nexport interface SkillSyncResult {\n skillId: string;\n slug: string;\n created: boolean;\n}\n\n/** Skill secrets upsert result from PUT /api/skills/:id/secrets */\nexport interface SkillSecretsResult {\n updated: string[];\n}\n\nconst skillSyncResultSchema = z.object({\n skillId: z.string(),\n slug: z.string(),\n created: z.boolean(),\n});\n\nconst skillSecretsResultSchema = z.object({\n updated: z.array(z.string()),\n});\n\nexport class CliApi {\n constructor(private readonly config: CliConfig) {}\n\n /** List all agents in the project */\n async listAgents(): Promise<Agent[]> {\n const response = await this.request('GET', '/api/agents');\n const data = agentsResponseSchema.parse(response);\n return data.agents;\n }\n\n /** Get agent by slug */\n async getAgent(slug: string): Promise<AgentDetails | null> {\n try {\n const response = await this.request('GET', `/api/agents/${slug}?by=slug`);\n return agentDefinitionSchema.parse(response);\n } catch (err) {\n if (err instanceof ApiError && err.status === 404) {\n return null;\n }\n throw err;\n }\n }\n\n /** Validate agent definition (dry-run) */\n async validateAgent(definition: AgentDefinition): Promise<ValidationResult> {\n const response = await this.request('POST', '/api/agents/validate', definition);\n return validationResultSchema.parse(response);\n }\n\n /** Create a new agent */\n async createAgent(definition: AgentDefinition): Promise<string> {\n const response = await this.request('POST', '/api/agents', definition);\n const data = createResponseSchema.parse(response);\n return data.agentId;\n }\n\n /** Update an existing agent by slug */\n async updateAgent(slug: string, definition: AgentDefinition): Promise<string> {\n // Exclude slug from settings (it's the identifier in the URL)\n const { slug: _slug, ...settings } = definition.settings;\n\n const response = await this.request('PATCH', `/api/agents/${slug}?by=slug`, {\n settings,\n protocol: definition.protocol,\n prompts: definition.prompts,\n references: definition.references,\n });\n const data = updateResponseSchema.parse(response);\n return data.agentId;\n }\n\n /** Archive an agent by slug */\n async archiveAgent(slug: string): Promise<ArchiveResult> {\n const response = await this.request('DELETE', `/api/agents/${slug}?by=slug`);\n return archiveResponseSchema.parse(response);\n }\n\n /** Upload a skill bundle (create or update) */\n async syncSkill(bundle: Buffer, visibility?: string): Promise<SkillSyncResult> {\n const formData = new FormData();\n formData.append('file', new Blob([bundle]), 'skill.zip');\n if (visibility) {\n formData.append('visibility', visibility);\n }\n const response = await this.requestMultipart('POST', '/api/skills', formData);\n return skillSyncResultSchema.parse(response);\n }\n\n /** Bulk upsert skill secrets */\n async upsertSkillSecrets(\n skillId: string,\n secrets: Record<string, string>,\n ): Promise<SkillSecretsResult> {\n const response = await this.request('PUT', `/api/skills/${skillId}/secrets`, { secrets });\n return skillSecretsResultSchema.parse(response);\n }\n\n /** Sync agent (create or update) */\n async syncAgent(definition: AgentDefinition): Promise<SyncResult> {\n const existing = await this.getAgent(definition.settings.slug);\n\n if (existing) {\n const agentId = await this.updateAgent(definition.settings.slug, definition);\n return { agentId, created: false };\n }\n\n const agentId = await this.createAgent(definition);\n return { agentId, created: true };\n }\n\n private async requestMultipart(\n method: string,\n path: string,\n formData: FormData,\n ): Promise<unknown> {\n const url = `${this.config.baseUrl}${path}`;\n\n const response = await fetch(url, {\n method,\n headers: { Authorization: `Bearer ${this.config.apiKey}` },\n body: formData,\n });\n\n return await this.handleResponse(response);\n }\n\n private async request(method: string, path: string, body?: unknown): Promise<unknown> {\n const url = `${this.config.baseUrl}${path}`;\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.config.apiKey}`,\n };\n\n if (body !== undefined) {\n headers['Content-Type'] = 'application/json';\n }\n\n const response = await fetch(url, {\n method,\n headers,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n });\n\n return await this.handleResponse(response);\n }\n\n private async handleResponse(response: Response): Promise<unknown> {\n const contentType = response.headers.get('content-type');\n const isJson = contentType?.includes('application/json');\n\n if (!response.ok) {\n if (isJson) {\n const errorData = (await response.json()) as { error?: string; code?: string };\n throw new ApiError(\n errorData.error ?? `Request failed with status ${response.status}`,\n response.status,\n errorData.code,\n );\n }\n throw new ApiError(`Request failed with status ${response.status}`, response.status);\n }\n\n if (!isJson) {\n throw new ApiError('Expected JSON response', response.status);\n }\n\n return await response.json();\n }\n}\n","/* eslint-disable no-console */\n/**\n * Terminal output utilities with colors and formatting.\n * Console statements are intentional for CLI output.\n */\n\n// ANSI color codes\nconst colors = {\n reset: '\\x1b[0m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m',\n gray: '\\x1b[90m',\n bold: '\\x1b[1m',\n};\n\nexport function success(message: string): void {\n console.log(`${colors.green}✓${colors.reset} ${message}`);\n}\n\nexport function error(message: string): void {\n console.error(`${colors.red}✗${colors.reset} ${message}`);\n}\n\nexport function warning(message: string): void {\n console.log(`${colors.yellow}⚠${colors.reset} ${message}`);\n}\n\nexport function info(message: string): void {\n console.log(`${colors.blue}ℹ${colors.reset} ${message}`);\n}\n\nexport function dim(message: string): void {\n console.log(`${colors.gray}${message}${colors.reset}`);\n}\n\nexport function bold(text: string): string {\n return `${colors.bold}${text}${colors.reset}`;\n}\n\nexport function cyan(text: string): string {\n return `${colors.cyan}${text}${colors.reset}`;\n}\n\nexport function green(text: string): string {\n return `${colors.green}${text}${colors.reset}`;\n}\n\nexport function yellow(text: string): string {\n return `${colors.yellow}${text}${colors.reset}`;\n}\n\nexport function red(text: string): string {\n return `${colors.red}${text}${colors.reset}`;\n}\n\nexport function gray(text: string): string {\n return `${colors.gray}${text}${colors.reset}`;\n}\n\n/**\n * Print a key-value pair with formatting\n */\nexport function keyValue(key: string, value: string): void {\n console.log(` ${colors.gray}${key}:${colors.reset} ${value}`);\n}\n\n/**\n * Print a table row\n */\nexport function tableRow(columns: string[], widths: number[]): void {\n const formatted = columns.map((col, i) => col.padEnd(widths[i] ?? 20)).join(' ');\n console.log(formatted);\n}\n\n/**\n * Print a separator line\n */\nexport function separator(): void {\n console.log();\n}\n\n/**\n * JSON output mode for CI/CD\n */\nexport function json(data: unknown): void {\n console.log(JSON.stringify(data, null, 2));\n}\n","/**\n * octavus validate <path>\n * Validate agent definition via API (dry-run, no changes saved)\n */\n\nimport type { Command } from 'commander';\nimport { loadConfig, ConfigError } from '@/config.js';\nimport { readAgentDefinition, AgentFileError } from '@/agent-files.js';\nimport { CliApi, ApiError } from '@/api.js';\nimport * as output from '@/output.js';\n\ninterface ValidateOptions {\n json?: boolean;\n quiet?: boolean;\n}\n\nexport function registerValidateCommand(program: Command): void {\n program\n .command('validate <path>')\n .description('Validate agent definition (dry-run, no changes saved)')\n .option('--json', 'Output as JSON')\n .option('--quiet', 'Suppress non-essential output')\n .action(async (agentPath: string, options: ValidateOptions) => {\n try {\n await runValidate(agentPath, options);\n } catch (err) {\n handleError(err, options);\n process.exit(err instanceof ConfigError ? 2 : 1);\n }\n });\n}\n\nasync function runValidate(agentPath: string, options: ValidateOptions): Promise<void> {\n const config = loadConfig();\n const api = new CliApi(config);\n\n // Read agent files\n if (!options.quiet && !options.json) {\n output.info(`Reading agent from ${output.cyan(agentPath)}...`);\n }\n\n const definition = await readAgentDefinition(agentPath);\n\n if (!options.quiet && !options.json) {\n output.info(`Validating ${output.bold(definition.settings.slug)}...`);\n }\n\n // Validate via API\n const result = await api.validateAgent(definition);\n\n // Output results\n if (options.json) {\n output.json({\n slug: definition.settings.slug,\n valid: result.valid,\n errors: result.errors,\n warnings: result.warnings,\n });\n } else {\n if (result.valid) {\n output.success(`Agent ${output.bold(definition.settings.slug)} is valid`);\n } else {\n output.error(`Agent ${output.bold(definition.settings.slug)} has validation errors`);\n }\n\n // Show errors\n for (const err of result.errors) {\n const location = err.path ? ` (${output.gray(err.path)})` : '';\n output.error(` ${err.message}${location}`);\n }\n\n // Show warnings\n for (const warn of result.warnings) {\n const location = warn.path ? ` (${output.gray(warn.path)})` : '';\n output.warning(` ${warn.message}${location}`);\n }\n }\n\n // Exit with error code if validation failed\n if (!result.valid) {\n process.exit(1);\n }\n}\n\nfunction getErrorCode(err: unknown): string {\n if (err instanceof ConfigError) return 'CONFIG_ERROR';\n if (err instanceof AgentFileError) return 'FILE_ERROR';\n if (err instanceof ApiError) return 'API_ERROR';\n return 'UNKNOWN';\n}\n\nfunction handleError(err: unknown, options: ValidateOptions): void {\n if (options.json === true) {\n output.json({\n error: err instanceof Error ? err.message : 'Unknown error',\n code: getErrorCode(err),\n });\n return;\n }\n\n if (err instanceof ConfigError) {\n output.error(err.message);\n } else if (err instanceof AgentFileError) {\n output.error(err.message);\n if (err.filePath !== undefined) {\n output.dim(` File: ${err.filePath}`);\n }\n } else if (err instanceof ApiError) {\n output.error(`API error: ${err.message}`);\n if (err.status !== 0) {\n output.dim(` Status: ${err.status}`);\n }\n } else if (err instanceof Error) {\n output.error(err.message);\n } else {\n output.error('An unknown error occurred');\n }\n}\n","/**\n * octavus sync <path>\n * Sync agent to platform (creates or updates)\n */\n\nimport type { Command } from 'commander';\nimport { loadConfig, ConfigError } from '@/config.js';\nimport { readAgentDefinition, AgentFileError } from '@/agent-files.js';\nimport { CliApi, ApiError } from '@/api.js';\nimport * as output from '@/output.js';\n\ninterface SyncOptions {\n json?: boolean;\n quiet?: boolean;\n}\n\nexport function registerSyncCommand(program: Command): void {\n program\n .command('sync <path>')\n .description('Sync agent to platform (creates or updates)')\n .option('--json', 'Output as JSON')\n .option('--quiet', 'Suppress non-essential output')\n .action(async (agentPath: string, options: SyncOptions) => {\n try {\n await runSync(agentPath, options);\n } catch (err) {\n handleError(err, options);\n process.exit(err instanceof ConfigError ? 2 : 1);\n }\n });\n}\n\nasync function runSync(agentPath: string, options: SyncOptions): Promise<void> {\n const config = loadConfig();\n const api = new CliApi(config);\n\n // Read agent files\n if (!options.quiet && !options.json) {\n output.info(`Reading agent from ${output.cyan(agentPath)}...`);\n }\n\n const definition = await readAgentDefinition(agentPath);\n\n if (!options.quiet && !options.json) {\n output.info(`Syncing ${output.bold(definition.settings.slug)}...`);\n }\n\n // Sync to platform\n const result = await api.syncAgent(definition);\n\n // Output results\n if (options.json) {\n output.json({\n slug: definition.settings.slug,\n agentId: result.agentId,\n created: result.created,\n });\n } else {\n const action = result.created ? 'Created' : 'Updated';\n output.success(`${action}: ${output.bold(definition.settings.slug)}`);\n output.keyValue('Agent ID', result.agentId);\n }\n}\n\nfunction getErrorCode(err: unknown): string {\n if (err instanceof ConfigError) return 'CONFIG_ERROR';\n if (err instanceof AgentFileError) return 'FILE_ERROR';\n if (err instanceof ApiError) return 'API_ERROR';\n return 'UNKNOWN';\n}\n\nfunction handleError(err: unknown, options: SyncOptions): void {\n if (options.json === true) {\n output.json({\n error: err instanceof Error ? err.message : 'Unknown error',\n code: getErrorCode(err),\n });\n return;\n }\n\n if (err instanceof ConfigError) {\n output.error(err.message);\n } else if (err instanceof AgentFileError) {\n output.error(err.message);\n if (err.filePath !== undefined) {\n output.dim(` File: ${err.filePath}`);\n }\n } else if (err instanceof ApiError) {\n output.error(`API error: ${err.message}`);\n if (err.status !== 0) {\n output.dim(` Status: ${err.status}`);\n }\n } else if (err instanceof Error) {\n output.error(err.message);\n } else {\n output.error('An unknown error occurred');\n }\n}\n","/**\n * octavus list\n * List all agents in the project\n */\n\nimport type { Command } from 'commander';\nimport { loadConfig, ConfigError } from '@/config.js';\nimport { CliApi, ApiError } from '@/api.js';\nimport * as output from '@/output.js';\n\ninterface ListOptions {\n json?: boolean;\n quiet?: boolean;\n}\n\nexport function registerListCommand(program: Command): void {\n program\n .command('list')\n .description('List all agents in the project')\n .option('--json', 'Output as JSON')\n .option('--quiet', 'Suppress non-essential output')\n .action(async (options: ListOptions) => {\n try {\n await runList(options);\n } catch (err) {\n handleError(err, options);\n process.exit(err instanceof ConfigError ? 2 : 1);\n }\n });\n}\n\nasync function runList(options: ListOptions): Promise<void> {\n const config = loadConfig();\n const api = new CliApi(config);\n\n const agents = await api.listAgents();\n\n if (options.json) {\n output.json({ agents });\n return;\n }\n\n if (agents.length === 0) {\n output.info('No agents found');\n return;\n }\n\n // Print header\n output.separator();\n output.tableRow(\n [output.bold('SLUG'), output.bold('NAME'), output.bold('FORMAT'), output.bold('ID')],\n [20, 30, 12, 36],\n );\n output.dim('─'.repeat(100));\n\n // Print agents\n for (const agent of agents) {\n output.tableRow([agent.slug, agent.name, agent.format, agent.id], [20, 30, 12, 36]);\n }\n\n output.separator();\n output.dim(`${agents.length} agent(s)`);\n}\n\nfunction getErrorCode(err: unknown): string {\n if (err instanceof ConfigError) return 'CONFIG_ERROR';\n if (err instanceof ApiError) return 'API_ERROR';\n return 'UNKNOWN';\n}\n\nfunction handleError(err: unknown, options: ListOptions): void {\n if (options.json === true) {\n output.json({\n error: err instanceof Error ? err.message : 'Unknown error',\n code: getErrorCode(err),\n });\n return;\n }\n\n if (err instanceof ConfigError) {\n output.error(err.message);\n } else if (err instanceof ApiError) {\n output.error(`API error: ${err.message}`);\n if (err.status !== 0) {\n output.dim(` Status: ${err.status}`);\n }\n } else if (err instanceof Error) {\n output.error(err.message);\n } else {\n output.error('An unknown error occurred');\n }\n}\n","/**\n * octavus get <slug>\n * Get agent details by slug\n */\n\nimport type { Command } from 'commander';\nimport { loadConfig, ConfigError } from '@/config.js';\nimport { CliApi, ApiError } from '@/api.js';\nimport * as output from '@/output.js';\n\ninterface GetOptions {\n json?: boolean;\n quiet?: boolean;\n}\n\nexport function registerGetCommand(program: Command): void {\n program\n .command('get <slug>')\n .description('Get agent details by slug')\n .option('--json', 'Output as JSON')\n .option('--quiet', 'Suppress non-essential output')\n .action(async (slug: string, options: GetOptions) => {\n try {\n await runGet(slug, options);\n } catch (err) {\n handleError(err, options);\n process.exit(err instanceof ConfigError ? 2 : 1);\n }\n });\n}\n\nasync function runGet(slug: string, options: GetOptions): Promise<void> {\n const config = loadConfig();\n const api = new CliApi(config);\n\n const agent = await api.getAgent(slug);\n\n if (!agent) {\n if (options.json) {\n output.json({ error: `Agent not found: ${slug}`, code: 'NOT_FOUND' });\n } else {\n output.error(`Agent not found: ${slug}`);\n }\n process.exit(1);\n }\n\n if (options.json) {\n output.json(agent);\n return;\n }\n\n // Print agent details\n output.separator();\n output.success(`Agent: ${output.bold(agent.settings.name)}`);\n output.separator();\n output.keyValue('Slug', agent.settings.slug);\n output.keyValue('ID', agent.id);\n output.keyValue('Format', agent.settings.format);\n if (agent.settings.description) {\n output.keyValue('Description', agent.settings.description);\n }\n output.separator();\n output.keyValue(\n 'Prompts',\n agent.prompts.length > 0 ? agent.prompts.map((p) => p.name).join(', ') : '(none)',\n );\n}\n\nfunction getErrorCode(err: unknown): string {\n if (err instanceof ConfigError) return 'CONFIG_ERROR';\n if (err instanceof ApiError) return 'API_ERROR';\n return 'UNKNOWN';\n}\n\nfunction handleError(err: unknown, options: GetOptions): void {\n if (options.json === true) {\n output.json({\n error: err instanceof Error ? err.message : 'Unknown error',\n code: getErrorCode(err),\n });\n return;\n }\n\n if (err instanceof ConfigError) {\n output.error(err.message);\n } else if (err instanceof ApiError) {\n output.error(`API error: ${err.message}`);\n if (err.status !== 0) {\n output.dim(` Status: ${err.status}`);\n }\n } else if (err instanceof Error) {\n output.error(err.message);\n } else {\n output.error('An unknown error occurred');\n }\n}\n","/**\n * octavus archive <slug>\n * Archive an agent (soft delete)\n */\n\nimport type { Command } from 'commander';\nimport { loadConfig, ConfigError } from '@/config.js';\nimport { CliApi, ApiError } from '@/api.js';\nimport * as output from '@/output.js';\n\ninterface ArchiveOptions {\n json?: boolean;\n quiet?: boolean;\n}\n\nexport function registerArchiveCommand(program: Command): void {\n program\n .command('archive <slug>')\n .description('Archive an agent (soft delete)')\n .option('--json', 'Output as JSON')\n .option('--quiet', 'Suppress non-essential output')\n .action(async (slug: string, options: ArchiveOptions) => {\n try {\n await runArchive(slug, options);\n } catch (err) {\n handleError(err, options);\n process.exit(err instanceof ConfigError ? 2 : 1);\n }\n });\n}\n\nasync function runArchive(slug: string, options: ArchiveOptions): Promise<void> {\n const config = loadConfig();\n const api = new CliApi(config);\n\n if (!options.quiet && !options.json) {\n output.info(`Archiving ${output.bold(slug)}...`);\n }\n\n const result = await api.archiveAgent(slug);\n\n if (options.json) {\n output.json({\n slug,\n agentId: result.agentId,\n archived: true,\n });\n } else {\n output.success(`Archived: ${output.bold(slug)}`);\n output.keyValue('Agent ID', result.agentId);\n }\n}\n\nfunction getErrorCode(err: unknown): string {\n if (err instanceof ConfigError) return 'CONFIG_ERROR';\n if (err instanceof ApiError) return 'API_ERROR';\n return 'UNKNOWN';\n}\n\nfunction handleError(err: unknown, options: ArchiveOptions): void {\n if (options.json === true) {\n output.json({\n error: err instanceof Error ? err.message : 'Unknown error',\n code: getErrorCode(err),\n });\n return;\n }\n\n if (err instanceof ConfigError) {\n output.error(err.message);\n } else if (err instanceof ApiError) {\n output.error(`API error: ${err.message}`);\n if (err.status !== 0) {\n output.dim(` Status: ${err.status}`);\n }\n } else if (err instanceof Error) {\n output.error(err.message);\n } else {\n output.error('An unknown error occurred');\n }\n}\n","/**\n * Skill file reading, packaging, and .env parsing.\n * Reads skill directories, creates ZIP bundles, and parses environment files.\n */\n\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport dotenv from 'dotenv';\nimport JSZip from 'jszip';\nimport { parse as parseYaml } from 'yaml';\nimport { z } from 'zod';\n\nexport class SkillFileError extends Error {\n constructor(\n message: string,\n public readonly filePath?: string,\n ) {\n super(message);\n this.name = 'SkillFileError';\n }\n}\n\nexport interface SkillFrontmatter {\n name: string;\n description?: string;\n version?: string;\n license?: string;\n author?: string;\n secrets?: { name: string; description?: string; required?: boolean }[];\n}\n\nconst FRONTMATTER_REGEX = /^---\\n([\\s\\S]*?)\\n---/;\n\nconst secretsSchema = z.array(\n z.object({\n name: z.string(),\n description: z.string().optional(),\n required: z.boolean().optional(),\n }),\n);\n\nfunction optionalString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\nconst EXCLUDED_PATTERNS = ['.env', '.env.', '.git', 'node_modules', '.DS_Store'];\n\nfunction isExcluded(relativePath: string): boolean {\n const parts = relativePath.split('/');\n return parts.some((part) =>\n EXCLUDED_PATTERNS.some((pattern) => part === pattern || part.startsWith(pattern)),\n );\n}\n\n/**\n * Parse SKILL.md frontmatter to extract metadata.\n */\nexport async function parseSkillFrontmatter(skillPath: string): Promise<SkillFrontmatter> {\n const skillMdPath = path.join(skillPath, 'SKILL.md');\n\n let content: string;\n try {\n content = await fs.readFile(skillMdPath, 'utf-8');\n } catch (err) {\n if ((err as { code?: string }).code === 'ENOENT') {\n throw new SkillFileError('SKILL.md not found', skillMdPath);\n }\n throw err;\n }\n\n const match = FRONTMATTER_REGEX.exec(content);\n if (!match?.[1]) {\n throw new SkillFileError('SKILL.md is missing YAML frontmatter', skillMdPath);\n }\n\n const frontmatter = parseYaml(match[1]) as Record<string, unknown>;\n\n if (typeof frontmatter.name !== 'string' || frontmatter.name.length === 0) {\n throw new SkillFileError('SKILL.md frontmatter must have a \"name\" field', skillMdPath);\n }\n\n const parsedSecrets = secretsSchema.safeParse(frontmatter.secrets);\n\n return {\n name: frontmatter.name,\n description: optionalString(frontmatter.description),\n version: optionalString(frontmatter.version),\n license: optionalString(frontmatter.license),\n author: optionalString(frontmatter.author),\n secrets: parsedSecrets.success ? parsedSecrets.data : undefined,\n };\n}\n\n/**\n * Recursively collect all files in a directory, returning relative paths.\n */\nasync function collectFiles(dir: string, baseDir: string): Promise<string[]> {\n const files: string[] = [];\n const entries = await fs.readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n const relativePath = path.relative(baseDir, fullPath);\n\n if (isExcluded(relativePath)) continue;\n\n if (entry.isDirectory()) {\n files.push(...(await collectFiles(fullPath, baseDir)));\n } else if (entry.isFile()) {\n files.push(relativePath);\n }\n }\n\n return files;\n}\n\n/**\n * Package a skill directory into a ZIP buffer.\n * Excludes .env files, .git, and node_modules.\n */\nexport async function packageSkillBundle(skillPath: string): Promise<Buffer> {\n const resolvedPath = path.resolve(skillPath);\n\n try {\n const stat = await fs.stat(resolvedPath);\n if (!stat.isDirectory()) {\n throw new SkillFileError(`Not a directory: ${resolvedPath}`);\n }\n } catch (err) {\n if ((err as { code?: string }).code === 'ENOENT') {\n throw new SkillFileError(`Directory not found: ${resolvedPath}`);\n }\n throw err;\n }\n\n // Validate SKILL.md exists\n await parseSkillFrontmatter(resolvedPath);\n\n const files = await collectFiles(resolvedPath, resolvedPath);\n const zip = new JSZip();\n\n for (const relativePath of files) {\n const fullPath = path.join(resolvedPath, relativePath);\n const content = await fs.readFile(fullPath);\n zip.file(relativePath, content);\n }\n\n return Buffer.from(await zip.generateAsync({ type: 'nodebuffer', compression: 'DEFLATE' }));\n}\n\n/**\n * Read a .env file from a skill directory.\n * Tries .env.{env} first, falls back to .env.\n * Returns null if no env file exists.\n */\nexport async function readSkillEnv(\n skillPath: string,\n env?: string,\n): Promise<Record<string, string> | null> {\n const resolvedPath = path.resolve(skillPath);\n\n const candidates = env\n ? [path.join(resolvedPath, `.env.${env}`), path.join(resolvedPath, '.env')]\n : [path.join(resolvedPath, '.env')];\n\n for (const envPath of candidates) {\n try {\n const content = await fs.readFile(envPath, 'utf-8');\n const parsed = dotenv.parse(content);\n return parsed;\n } catch (err) {\n if ((err as { code?: string }).code === 'ENOENT') continue;\n throw err;\n }\n }\n\n return null;\n}\n","/**\n * octavus skills sync <path> [--env staging|production]\n * Sync a skill to the platform (creates or updates) and optionally push secrets.\n */\n\nimport type { Command } from 'commander';\nimport { loadConfig, ConfigError } from '@/config.js';\nimport { CliApi, ApiError } from '@/api.js';\nimport {\n packageSkillBundle,\n parseSkillFrontmatter,\n readSkillEnv,\n SkillFileError,\n} from '@/skill-files.js';\nimport * as output from '@/output.js';\n\ninterface SkillSyncOptions {\n env?: string;\n json?: boolean;\n quiet?: boolean;\n}\n\nexport function registerSkillSyncCommand(program: Command): void {\n program\n .command('sync <path>')\n .description('Sync skill to platform (creates or updates)')\n .option('--env <environment>', 'Environment for secrets (e.g., staging, production)')\n .option('--json', 'Output as JSON')\n .option('--quiet', 'Suppress non-essential output')\n .action(async (skillPath: string, options: SkillSyncOptions) => {\n try {\n await runSkillSync(skillPath, options);\n } catch (err) {\n handleError(err, options);\n process.exit(err instanceof ConfigError ? 2 : 1);\n }\n });\n}\n\nasync function runSkillSync(skillPath: string, options: SkillSyncOptions): Promise<void> {\n const config = loadConfig();\n const api = new CliApi(config);\n\n // Read and validate skill\n if (!options.quiet && !options.json) {\n output.info(`Reading skill from ${output.cyan(skillPath)}...`);\n }\n\n const frontmatter = await parseSkillFrontmatter(skillPath);\n\n if (!options.quiet && !options.json) {\n output.info(`Packaging ${output.bold(frontmatter.name)}...`);\n }\n\n // Package and upload bundle\n const bundle = await packageSkillBundle(skillPath);\n const syncResult = await api.syncSkill(bundle);\n\n if (!options.quiet && !options.json) {\n const action = syncResult.created ? 'Created' : 'Updated';\n output.success(`${action}: ${output.bold(syncResult.slug)}`);\n output.keyValue('Skill ID', syncResult.skillId);\n }\n\n // Handle secrets\n let secretCount = 0;\n const envSecrets = await readSkillEnv(skillPath, options.env);\n\n if (envSecrets && Object.keys(envSecrets).length > 0) {\n // Cross-check against declared secrets in frontmatter\n if (frontmatter.secrets && !options.quiet && !options.json) {\n const declaredNames = new Set(frontmatter.secrets.map((s) => s.name));\n const envNames = Object.keys(envSecrets);\n\n for (const name of envNames) {\n if (!declaredNames.has(name)) {\n output.warning(`Secret ${output.yellow(name)} in .env but not declared in SKILL.md`);\n }\n }\n\n for (const declared of frontmatter.secrets) {\n if (declared.required !== false && !envSecrets[declared.name]) {\n output.warning(\n `Required secret ${output.yellow(declared.name)} declared in SKILL.md but missing from .env`,\n );\n }\n }\n }\n\n if (!options.quiet && !options.json) {\n output.info(`Pushing ${Object.keys(envSecrets).length} secret(s)...`);\n }\n\n const secretsResult = await api.upsertSkillSecrets(syncResult.skillId, envSecrets);\n secretCount = secretsResult.updated.length;\n\n if (!options.quiet && !options.json) {\n output.success(`${secretCount} secret(s) updated`);\n }\n }\n\n if (options.json) {\n output.json({\n slug: syncResult.slug,\n skillId: syncResult.skillId,\n created: syncResult.created,\n secretsUpdated: secretCount,\n });\n }\n}\n\nfunction getErrorCode(err: unknown): string {\n if (err instanceof ConfigError) return 'CONFIG_ERROR';\n if (err instanceof SkillFileError) return 'FILE_ERROR';\n if (err instanceof ApiError) return 'API_ERROR';\n return 'UNKNOWN';\n}\n\nfunction handleError(err: unknown, options: SkillSyncOptions): void {\n if (options.json === true) {\n output.json({\n error: err instanceof Error ? err.message : 'Unknown error',\n code: getErrorCode(err),\n });\n return;\n }\n\n if (err instanceof ConfigError) {\n output.error(err.message);\n } else if (err instanceof SkillFileError) {\n output.error(err.message);\n if (err.filePath !== undefined) {\n output.dim(` File: ${err.filePath}`);\n }\n } else if (err instanceof ApiError) {\n output.error(`API error: ${err.message}`);\n if (err.status !== 0) {\n output.dim(` Status: ${err.status}`);\n }\n } else if (err instanceof Error) {\n output.error(err.message);\n } else {\n output.error('An unknown error occurred');\n }\n}\n"],"mappings":";;;AAmBA,OAAOA,aAAY;AACnB,SAAS,eAAe;;;ACVjB,IAAM,cAAN,cAA0B,MAAM;AAAA,EACrC,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAMO,SAAS,aAAwB;AACtC,QAAM,SAAS,QAAQ,IAAI,uBAAuB,QAAQ,IAAI;AAE9D,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAU,QAAQ,IAAI,mBAAmB;AAE/C,SAAO,EAAE,QAAQ,QAAQ;AAC3B;;;AC5BA,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,SAAS,SAAS;AAClB,SAAS,SAAS,iBAAiB;AA+BnC,IAAM,sBAAsB,EAAE,OAAO;AAAA,EACnC,MAAM,EAAE,OAAO,EAAE,IAAI,GAAG,kBAAkB;AAAA,EAC1C,MAAM,EAAE,OAAO,EAAE,IAAI,GAAG,kBAAkB;AAAA,EAC1C,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACjC,QAAQ,EAAE,KAAK,CAAC,eAAe,QAAQ,CAAC;AAC1C,CAAC;AAEM,IAAM,iBAAN,cAA6B,MAAM;AAAA,EACxC,YACE,SACgB,UAChB;AACA,UAAM,OAAO;AAFG;AAGhB,SAAK,OAAO;AAAA,EACd;AACF;AAUA,eAAsB,oBAAoB,WAA6C;AACrF,QAAM,eAAe,KAAK,QAAQ,SAAS;AAG3C,MAAI;AACF,UAAM,OAAO,MAAM,GAAG,KAAK,YAAY;AACvC,QAAI,CAAC,KAAK,YAAY,GAAG;AACvB,YAAM,IAAI,eAAe,oBAAoB,YAAY,EAAE;AAAA,IAC7D;AAAA,EACF,SAAS,KAAK;AACZ,QAAK,IAA0B,SAAS,UAAU;AAChD,YAAM,IAAI,eAAe,wBAAwB,YAAY,EAAE;AAAA,IACjE;AACA,UAAM;AAAA,EACR;AAGA,QAAM,eAAe,KAAK,KAAK,cAAc,eAAe;AAC5D,QAAM,WAAW,MAAM,aAAa,YAAY;AAGhD,QAAM,eAAe,KAAK,KAAK,cAAc,eAAe;AAC5D,QAAM,WAAW,MAAM,aAAa,YAAY;AAGhD,QAAM,cAAc,KAAK,KAAK,cAAc,SAAS;AACrD,QAAM,UAAU,MAAM,YAAY,WAAW;AAG7C,QAAM,iBAAiB,KAAK,KAAK,cAAc,YAAY;AAC3D,QAAM,aAAa,MAAM,eAAe,cAAc;AAEtD,SAAO,EAAE,UAAU,UAAU,SAAS,WAAW;AACnD;AAEA,eAAe,aAAa,UAA0C;AACpE,MAAI;AACF,UAAM,UAAU,MAAM,GAAG,SAAS,UAAU,OAAO;AACnD,UAAMC,QAAgB,KAAK,MAAM,OAAO;AACxC,UAAM,SAAS,oBAAoB,UAAUA,KAAI;AAEjD,QAAI,CAAC,OAAO,SAAS;AACnB,YAAM,SAAS,OAAO,MAAM,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI;AAClE,YAAM,IAAI,eAAe,0BAA0B,MAAM,IAAI,QAAQ;AAAA,IACvE;AAEA,WAAO,OAAO;AAAA,EAChB,SAAS,KAAK;AACZ,QAAK,IAA0B,SAAS,UAAU;AAChD,YAAM,IAAI,eAAe,2BAA2B,QAAQ;AAAA,IAC9D;AACA,QAAI,eAAe,aAAa;AAC9B,YAAM,IAAI,eAAe,kCAAkC,IAAI,OAAO,IAAI,QAAQ;AAAA,IACpF;AACA,UAAM;AAAA,EACR;AACF;AAEA,eAAe,aAAa,UAAmC;AAC7D,MAAI;AACF,WAAO,MAAM,GAAG,SAAS,UAAU,OAAO;AAAA,EAC5C,SAAS,KAAK;AACZ,QAAK,IAA0B,SAAS,UAAU;AAChD,YAAM,IAAI,eAAe,2BAA2B,QAAQ;AAAA,IAC9D;AACA,UAAM;AAAA,EACR;AACF;AAEA,eAAe,YAAY,YAAoB,eAAe,IAA4B;AACxF,QAAM,UAAyB,CAAC;AAEhC,MAAI;AACF,UAAM,UAAU,MAAM,GAAG,QAAQ,YAAY,EAAE,eAAe,KAAK,CAAC;AAEpE,eAAW,SAAS,SAAS;AAC3B,YAAM,oBAAoB,eAAe,GAAG,YAAY,IAAI,MAAM,IAAI,KAAK,MAAM;AAEjF,UAAI,MAAM,YAAY,GAAG;AACvB,cAAM,aAAa,MAAM,YAAY,KAAK,KAAK,YAAY,MAAM,IAAI,GAAG,iBAAiB;AACzF,gBAAQ,KAAK,GAAG,UAAU;AAAA,MAC5B,WAAW,MAAM,KAAK,SAAS,KAAK,GAAG;AACrC,cAAM,OAAO,kBAAkB,QAAQ,SAAS,EAAE;AAClD,cAAM,UAAU,MAAM,GAAG,SAAS,KAAK,KAAK,YAAY,MAAM,IAAI,GAAG,OAAO;AAC5E,gBAAQ,KAAK,EAAE,MAAM,QAAQ,CAAC;AAAA,MAChC;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,QAAK,IAA0B,SAAS,UAAU;AAChD,YAAM;AAAA,IACR;AAAA,EACF;AAEA,SAAO;AACT;AAEA,IAAM,oBAAoB;AAE1B,IAAM,6BAA6B,EAAE,OAAO;AAAA,EAC1C,aAAa,EAAE,OAAO,EAAE,IAAI,GAAG,yBAAyB;AAC1D,CAAC;AAED,eAAe,eAAe,eAAkD;AAC9E,QAAM,aAA+B,CAAC;AAEtC,MAAI;AACF,UAAM,UAAU,MAAM,GAAG,QAAQ,eAAe,EAAE,eAAe,KAAK,CAAC;AAEvE,eAAW,SAAS,SAAS;AAC3B,UAAI,CAAC,MAAM,OAAO,KAAK,CAAC,MAAM,KAAK,SAAS,KAAK,EAAG;AAEpD,YAAM,OAAO,MAAM,KAAK,QAAQ,SAAS,EAAE;AAC3C,YAAM,MAAM,MAAM,GAAG,SAAS,KAAK,KAAK,eAAe,MAAM,IAAI,GAAG,OAAO;AAC3E,YAAM,QAAQ,kBAAkB,KAAK,GAAG;AAExC,UAAI,CAAC,OAAO;AACV,cAAM,IAAI;AAAA,UACR,cAAc,IAAI;AAAA,UAClB,KAAK,KAAK,eAAe,MAAM,IAAI;AAAA,QACrC;AAAA,MACF;AAEA,YAAM,cAAc,UAAU,MAAM,CAAC,CAAE;AACvC,YAAM,SAAS,2BAA2B,UAAU,WAAW;AAE/D,UAAI,CAAC,OAAO,SAAS;AACnB,cAAM,SAAS,OAAO,MAAM,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI;AAClE,cAAM,IAAI;AAAA,UACR,qCAAqC,IAAI,MAAM,MAAM;AAAA,UACrD,KAAK,KAAK,eAAe,MAAM,IAAI;AAAA,QACrC;AAAA,MACF;AAEA,iBAAW,KAAK;AAAA,QACd;AAAA,QACA,aAAa,OAAO,KAAK;AAAA,QACzB,SAAS,MAAM,CAAC,EAAG,KAAK;AAAA,MAC1B,CAAC;AAAA,IACH;AAAA,EACF,SAAS,KAAK;AACZ,QAAK,IAA0B,SAAS,UAAU;AAChD,YAAM;AAAA,IACR;AAAA,EACF;AAEA,SAAO;AACT;;;AC7MA,SAAS,KAAAC,UAAS;AAKX,IAAM,WAAN,cAAuB,MAAM;AAAA,EAClC,YACE,SACgB,QACA,MAChB;AACA,UAAM,OAAO;AAHG;AACA;AAGhB,SAAK,OAAO;AAAA,EACd;AACF;AAuDA,IAAM,cAAcA,GAAE,OAAO;AAAA,EAC3B,MAAMA,GAAE,OAAO;AAAA,EACf,IAAIA,GAAE,OAAO;AAAA,EACb,MAAMA,GAAE,OAAO;AAAA,EACf,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,EACjC,QAAQA,GAAE,OAAO;AAAA,EACjB,WAAWA,GAAE,OAAO;AAAA,EACpB,WAAWA,GAAE,OAAO;AAAA,EACpB,WAAWA,GAAE,OAAO;AACtB,CAAC;AAED,IAAM,uBAAuBA,GAAE,OAAO;AAAA,EACpC,QAAQA,GAAE,MAAM,WAAW;AAC7B,CAAC;AAED,IAAM,wBAAwBA,GAAE,OAAO;AAAA,EACrC,UAAUA,GAAE,OAAO;AAAA,IACjB,MAAMA,GAAE,OAAO;AAAA,IACf,MAAMA,GAAE,OAAO;AAAA,IACf,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,IACjC,QAAQA,GAAE,KAAK,CAAC,eAAe,QAAQ,CAAC;AAAA,EAC1C,CAAC;AAAA,EACD,UAAUA,GAAE,OAAO;AAAA,EACnB,SAASA,GAAE,MAAMA,GAAE,OAAO,EAAE,MAAMA,GAAE,OAAO,GAAG,SAASA,GAAE,OAAO,EAAE,CAAC,CAAC;AAAA,EACpE,YAAYA,GACT,MAAMA,GAAE,OAAO,EAAE,MAAMA,GAAE,OAAO,GAAG,aAAaA,GAAE,OAAO,GAAG,SAASA,GAAE,OAAO,EAAE,CAAC,CAAC,EAClF,QAAQ,CAAC,CAAC;AAAA,EACb,IAAIA,GAAE,OAAO;AACf,CAAC;AAED,IAAM,yBAAyBA,GAAE,OAAO;AAAA,EACtC,OAAOA,GAAE,QAAQ;AAAA,EACjB,QAAQA,GAAE;AAAA,IACRA,GAAE,OAAO;AAAA,MACP,SAASA,GAAE,OAAO;AAAA,MAClB,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA,MAC1B,UAAUA,GAAE,KAAK,CAAC,SAAS,SAAS,CAAC;AAAA,IACvC,CAAC;AAAA,EACH;AAAA,EACA,UAAUA,GAAE;AAAA,IACVA,GAAE,OAAO;AAAA,MACP,SAASA,GAAE,OAAO;AAAA,MAClB,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA,MAC1B,UAAUA,GAAE,KAAK,CAAC,SAAS,SAAS,CAAC;AAAA,IACvC,CAAC;AAAA,EACH;AACF,CAAC;AAED,IAAM,uBAAuBA,GAAE,OAAO;AAAA,EACpC,SAASA,GAAE,OAAO;AAAA,EAClB,SAASA,GAAE,OAAO;AACpB,CAAC;AAED,IAAM,uBAAuBA,GAAE,OAAO;AAAA,EACpC,SAASA,GAAE,OAAO;AAAA,EAClB,SAASA,GAAE,OAAO;AACpB,CAAC;AAED,IAAM,wBAAwBA,GAAE,OAAO;AAAA,EACrC,SAASA,GAAE,OAAO;AAAA,EAClB,SAASA,GAAE,OAAO;AACpB,CAAC;AAcD,IAAM,wBAAwBA,GAAE,OAAO;AAAA,EACrC,SAASA,GAAE,OAAO;AAAA,EAClB,MAAMA,GAAE,OAAO;AAAA,EACf,SAASA,GAAE,QAAQ;AACrB,CAAC;AAED,IAAM,2BAA2BA,GAAE,OAAO;AAAA,EACxC,SAASA,GAAE,MAAMA,GAAE,OAAO,CAAC;AAC7B,CAAC;AAEM,IAAM,SAAN,MAAa;AAAA,EAClB,YAA6B,QAAmB;AAAnB;AAAA,EAAoB;AAAA;AAAA,EAGjD,MAAM,aAA+B;AACnC,UAAM,WAAW,MAAM,KAAK,QAAQ,OAAO,aAAa;AACxD,UAAM,OAAO,qBAAqB,MAAM,QAAQ;AAChD,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,MAAM,SAAS,MAA4C;AACzD,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,QAAQ,OAAO,eAAe,IAAI,UAAU;AACxE,aAAO,sBAAsB,MAAM,QAAQ;AAAA,IAC7C,SAAS,KAAK;AACZ,UAAI,eAAe,YAAY,IAAI,WAAW,KAAK;AACjD,eAAO;AAAA,MACT;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,cAAc,YAAwD;AAC1E,UAAM,WAAW,MAAM,KAAK,QAAQ,QAAQ,wBAAwB,UAAU;AAC9E,WAAO,uBAAuB,MAAM,QAAQ;AAAA,EAC9C;AAAA;AAAA,EAGA,MAAM,YAAY,YAA8C;AAC9D,UAAM,WAAW,MAAM,KAAK,QAAQ,QAAQ,eAAe,UAAU;AACrE,UAAM,OAAO,qBAAqB,MAAM,QAAQ;AAChD,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,MAAM,YAAY,MAAc,YAA8C;AAE5E,UAAM,EAAE,MAAM,OAAO,GAAG,SAAS,IAAI,WAAW;AAEhD,UAAM,WAAW,MAAM,KAAK,QAAQ,SAAS,eAAe,IAAI,YAAY;AAAA,MAC1E;AAAA,MACA,UAAU,WAAW;AAAA,MACrB,SAAS,WAAW;AAAA,MACpB,YAAY,WAAW;AAAA,IACzB,CAAC;AACD,UAAM,OAAO,qBAAqB,MAAM,QAAQ;AAChD,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,MAAM,aAAa,MAAsC;AACvD,UAAM,WAAW,MAAM,KAAK,QAAQ,UAAU,eAAe,IAAI,UAAU;AAC3E,WAAO,sBAAsB,MAAM,QAAQ;AAAA,EAC7C;AAAA;AAAA,EAGA,MAAM,UAAU,QAAgB,YAA+C;AAC7E,UAAM,WAAW,IAAI,SAAS;AAC9B,aAAS,OAAO,QAAQ,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,WAAW;AACvD,QAAI,YAAY;AACd,eAAS,OAAO,cAAc,UAAU;AAAA,IAC1C;AACA,UAAM,WAAW,MAAM,KAAK,iBAAiB,QAAQ,eAAe,QAAQ;AAC5E,WAAO,sBAAsB,MAAM,QAAQ;AAAA,EAC7C;AAAA;AAAA,EAGA,MAAM,mBACJ,SACA,SAC6B;AAC7B,UAAM,WAAW,MAAM,KAAK,QAAQ,OAAO,eAAe,OAAO,YAAY,EAAE,QAAQ,CAAC;AACxF,WAAO,yBAAyB,MAAM,QAAQ;AAAA,EAChD;AAAA;AAAA,EAGA,MAAM,UAAU,YAAkD;AAChE,UAAM,WAAW,MAAM,KAAK,SAAS,WAAW,SAAS,IAAI;AAE7D,QAAI,UAAU;AACZ,YAAMC,WAAU,MAAM,KAAK,YAAY,WAAW,SAAS,MAAM,UAAU;AAC3E,aAAO,EAAE,SAAAA,UAAS,SAAS,MAAM;AAAA,IACnC;AAEA,UAAM,UAAU,MAAM,KAAK,YAAY,UAAU;AACjD,WAAO,EAAE,SAAS,SAAS,KAAK;AAAA,EAClC;AAAA,EAEA,MAAc,iBACZ,QACAC,OACA,UACkB;AAClB,UAAM,MAAM,GAAG,KAAK,OAAO,OAAO,GAAGA,KAAI;AAEzC,UAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAChC;AAAA,MACA,SAAS,EAAE,eAAe,UAAU,KAAK,OAAO,MAAM,GAAG;AAAA,MACzD,MAAM;AAAA,IACR,CAAC;AAED,WAAO,MAAM,KAAK,eAAe,QAAQ;AAAA,EAC3C;AAAA,EAEA,MAAc,QAAQ,QAAgBA,OAAc,MAAkC;AACpF,UAAM,MAAM,GAAG,KAAK,OAAO,OAAO,GAAGA,KAAI;AAEzC,UAAM,UAAkC;AAAA,MACtC,eAAe,UAAU,KAAK,OAAO,MAAM;AAAA,IAC7C;AAEA,QAAI,SAAS,QAAW;AACtB,cAAQ,cAAc,IAAI;AAAA,IAC5B;AAEA,UAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAChC;AAAA,MACA;AAAA,MACA,MAAM,SAAS,SAAY,KAAK,UAAU,IAAI,IAAI;AAAA,IACpD,CAAC;AAED,WAAO,MAAM,KAAK,eAAe,QAAQ;AAAA,EAC3C;AAAA,EAEA,MAAc,eAAe,UAAsC;AACjE,UAAM,cAAc,SAAS,QAAQ,IAAI,cAAc;AACvD,UAAM,SAAS,aAAa,SAAS,kBAAkB;AAEvD,QAAI,CAAC,SAAS,IAAI;AAChB,UAAI,QAAQ;AACV,cAAM,YAAa,MAAM,SAAS,KAAK;AACvC,cAAM,IAAI;AAAA,UACR,UAAU,SAAS,8BAA8B,SAAS,MAAM;AAAA,UAChE,SAAS;AAAA,UACT,UAAU;AAAA,QACZ;AAAA,MACF;AACA,YAAM,IAAI,SAAS,8BAA8B,SAAS,MAAM,IAAI,SAAS,MAAM;AAAA,IACrF;AAEA,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,SAAS,0BAA0B,SAAS,MAAM;AAAA,IAC9D;AAEA,WAAO,MAAM,SAAS,KAAK;AAAA,EAC7B;AACF;;;AC5SA,IAAM,SAAS;AAAA,EACb,OAAO;AAAA,EACP,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,SAAS;AAAA,EACT,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AACR;AAEO,SAAS,QAAQ,SAAuB;AAC7C,UAAQ,IAAI,GAAG,OAAO,KAAK,SAAI,OAAO,KAAK,IAAI,OAAO,EAAE;AAC1D;AAEO,SAAS,MAAM,SAAuB;AAC3C,UAAQ,MAAM,GAAG,OAAO,GAAG,SAAI,OAAO,KAAK,IAAI,OAAO,EAAE;AAC1D;AAEO,SAAS,QAAQ,SAAuB;AAC7C,UAAQ,IAAI,GAAG,OAAO,MAAM,SAAI,OAAO,KAAK,IAAI,OAAO,EAAE;AAC3D;AAEO,SAAS,KAAK,SAAuB;AAC1C,UAAQ,IAAI,GAAG,OAAO,IAAI,SAAI,OAAO,KAAK,IAAI,OAAO,EAAE;AACzD;AAEO,SAAS,IAAI,SAAuB;AACzC,UAAQ,IAAI,GAAG,OAAO,IAAI,GAAG,OAAO,GAAG,OAAO,KAAK,EAAE;AACvD;AAEO,SAAS,KAAK,MAAsB;AACzC,SAAO,GAAG,OAAO,IAAI,GAAG,IAAI,GAAG,OAAO,KAAK;AAC7C;AAEO,SAAS,KAAK,MAAsB;AACzC,SAAO,GAAG,OAAO,IAAI,GAAG,IAAI,GAAG,OAAO,KAAK;AAC7C;AAMO,SAAS,OAAO,MAAsB;AAC3C,SAAO,GAAG,OAAO,MAAM,GAAG,IAAI,GAAG,OAAO,KAAK;AAC/C;AAMO,SAAS,KAAK,MAAsB;AACzC,SAAO,GAAG,OAAO,IAAI,GAAG,IAAI,GAAG,OAAO,KAAK;AAC7C;AAKO,SAAS,SAAS,KAAa,OAAqB;AACzD,UAAQ,IAAI,KAAK,OAAO,IAAI,GAAG,GAAG,IAAI,OAAO,KAAK,IAAI,KAAK,EAAE;AAC/D;AAKO,SAAS,SAAS,SAAmB,QAAwB;AAClE,QAAM,YAAY,QAAQ,IAAI,CAAC,KAAK,MAAM,IAAI,OAAO,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,IAAI;AAChF,UAAQ,IAAI,SAAS;AACvB;AAKO,SAAS,YAAkB;AAChC,UAAQ,IAAI;AACd;AAKO,SAAS,KAAK,MAAqB;AACxC,UAAQ,IAAI,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAC3C;;;AC1EO,SAAS,wBAAwBC,UAAwB;AAC9D,EAAAA,SACG,QAAQ,iBAAiB,EACzB,YAAY,uDAAuD,EACnE,OAAO,UAAU,gBAAgB,EACjC,OAAO,WAAW,+BAA+B,EACjD,OAAO,OAAO,WAAmB,YAA6B;AAC7D,QAAI;AACF,YAAM,YAAY,WAAW,OAAO;AAAA,IACtC,SAAS,KAAK;AACZ,kBAAY,KAAK,OAAO;AACxB,cAAQ,KAAK,eAAe,cAAc,IAAI,CAAC;AAAA,IACjD;AAAA,EACF,CAAC;AACL;AAEA,eAAe,YAAY,WAAmB,SAAyC;AACrF,QAAM,SAAS,WAAW;AAC1B,QAAM,MAAM,IAAI,OAAO,MAAM;AAG7B,MAAI,CAAC,QAAQ,SAAS,CAAC,QAAQ,MAAM;AACnC,IAAO,KAAK,sBAA6B,KAAK,SAAS,CAAC,KAAK;AAAA,EAC/D;AAEA,QAAM,aAAa,MAAM,oBAAoB,SAAS;AAEtD,MAAI,CAAC,QAAQ,SAAS,CAAC,QAAQ,MAAM;AACnC,IAAO,KAAK,cAAqB,KAAK,WAAW,SAAS,IAAI,CAAC,KAAK;AAAA,EACtE;AAGA,QAAM,SAAS,MAAM,IAAI,cAAc,UAAU;AAGjD,MAAI,QAAQ,MAAM;AAChB,IAAO,KAAK;AAAA,MACV,MAAM,WAAW,SAAS;AAAA,MAC1B,OAAO,OAAO;AAAA,MACd,QAAQ,OAAO;AAAA,MACf,UAAU,OAAO;AAAA,IACnB,CAAC;AAAA,EACH,OAAO;AACL,QAAI,OAAO,OAAO;AAChB,MAAO,QAAQ,SAAgB,KAAK,WAAW,SAAS,IAAI,CAAC,WAAW;AAAA,IAC1E,OAAO;AACL,MAAO,MAAM,SAAgB,KAAK,WAAW,SAAS,IAAI,CAAC,wBAAwB;AAAA,IACrF;AAGA,eAAW,OAAO,OAAO,QAAQ;AAC/B,YAAM,WAAW,IAAI,OAAO,KAAY,KAAK,IAAI,IAAI,CAAC,MAAM;AAC5D,MAAO,MAAM,KAAK,IAAI,OAAO,GAAG,QAAQ,EAAE;AAAA,IAC5C;AAGA,eAAW,QAAQ,OAAO,UAAU;AAClC,YAAM,WAAW,KAAK,OAAO,KAAY,KAAK,KAAK,IAAI,CAAC,MAAM;AAC9D,MAAO,QAAQ,KAAK,KAAK,OAAO,GAAG,QAAQ,EAAE;AAAA,IAC/C;AAAA,EACF;AAGA,MAAI,CAAC,OAAO,OAAO;AACjB,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,SAAS,aAAa,KAAsB;AAC1C,MAAI,eAAe,YAAa,QAAO;AACvC,MAAI,eAAe,eAAgB,QAAO;AAC1C,MAAI,eAAe,SAAU,QAAO;AACpC,SAAO;AACT;AAEA,SAAS,YAAY,KAAc,SAAgC;AACjE,MAAI,QAAQ,SAAS,MAAM;AACzB,IAAO,KAAK;AAAA,MACV,OAAO,eAAe,QAAQ,IAAI,UAAU;AAAA,MAC5C,MAAM,aAAa,GAAG;AAAA,IACxB,CAAC;AACD;AAAA,EACF;AAEA,MAAI,eAAe,aAAa;AAC9B,IAAO,MAAM,IAAI,OAAO;AAAA,EAC1B,WAAW,eAAe,gBAAgB;AACxC,IAAO,MAAM,IAAI,OAAO;AACxB,QAAI,IAAI,aAAa,QAAW;AAC9B,MAAO,IAAI,WAAW,IAAI,QAAQ,EAAE;AAAA,IACtC;AAAA,EACF,WAAW,eAAe,UAAU;AAClC,IAAO,MAAM,cAAc,IAAI,OAAO,EAAE;AACxC,QAAI,IAAI,WAAW,GAAG;AACpB,MAAO,IAAI,aAAa,IAAI,MAAM,EAAE;AAAA,IACtC;AAAA,EACF,WAAW,eAAe,OAAO;AAC/B,IAAO,MAAM,IAAI,OAAO;AAAA,EAC1B,OAAO;AACL,IAAO,MAAM,2BAA2B;AAAA,EAC1C;AACF;;;ACrGO,SAAS,oBAAoBC,UAAwB;AAC1D,EAAAA,SACG,QAAQ,aAAa,EACrB,YAAY,6CAA6C,EACzD,OAAO,UAAU,gBAAgB,EACjC,OAAO,WAAW,+BAA+B,EACjD,OAAO,OAAO,WAAmB,YAAyB;AACzD,QAAI;AACF,YAAM,QAAQ,WAAW,OAAO;AAAA,IAClC,SAAS,KAAK;AACZ,MAAAC,aAAY,KAAK,OAAO;AACxB,cAAQ,KAAK,eAAe,cAAc,IAAI,CAAC;AAAA,IACjD;AAAA,EACF,CAAC;AACL;AAEA,eAAe,QAAQ,WAAmB,SAAqC;AAC7E,QAAM,SAAS,WAAW;AAC1B,QAAM,MAAM,IAAI,OAAO,MAAM;AAG7B,MAAI,CAAC,QAAQ,SAAS,CAAC,QAAQ,MAAM;AACnC,IAAO,KAAK,sBAA6B,KAAK,SAAS,CAAC,KAAK;AAAA,EAC/D;AAEA,QAAM,aAAa,MAAM,oBAAoB,SAAS;AAEtD,MAAI,CAAC,QAAQ,SAAS,CAAC,QAAQ,MAAM;AACnC,IAAO,KAAK,WAAkB,KAAK,WAAW,SAAS,IAAI,CAAC,KAAK;AAAA,EACnE;AAGA,QAAM,SAAS,MAAM,IAAI,UAAU,UAAU;AAG7C,MAAI,QAAQ,MAAM;AAChB,IAAO,KAAK;AAAA,MACV,MAAM,WAAW,SAAS;AAAA,MAC1B,SAAS,OAAO;AAAA,MAChB,SAAS,OAAO;AAAA,IAClB,CAAC;AAAA,EACH,OAAO;AACL,UAAM,SAAS,OAAO,UAAU,YAAY;AAC5C,IAAO,QAAQ,GAAG,MAAM,KAAY,KAAK,WAAW,SAAS,IAAI,CAAC,EAAE;AACpE,IAAO,SAAS,YAAY,OAAO,OAAO;AAAA,EAC5C;AACF;AAEA,SAASC,cAAa,KAAsB;AAC1C,MAAI,eAAe,YAAa,QAAO;AACvC,MAAI,eAAe,eAAgB,QAAO;AAC1C,MAAI,eAAe,SAAU,QAAO;AACpC,SAAO;AACT;AAEA,SAASD,aAAY,KAAc,SAA4B;AAC7D,MAAI,QAAQ,SAAS,MAAM;AACzB,IAAO,KAAK;AAAA,MACV,OAAO,eAAe,QAAQ,IAAI,UAAU;AAAA,MAC5C,MAAMC,cAAa,GAAG;AAAA,IACxB,CAAC;AACD;AAAA,EACF;AAEA,MAAI,eAAe,aAAa;AAC9B,IAAO,MAAM,IAAI,OAAO;AAAA,EAC1B,WAAW,eAAe,gBAAgB;AACxC,IAAO,MAAM,IAAI,OAAO;AACxB,QAAI,IAAI,aAAa,QAAW;AAC9B,MAAO,IAAI,WAAW,IAAI,QAAQ,EAAE;AAAA,IACtC;AAAA,EACF,WAAW,eAAe,UAAU;AAClC,IAAO,MAAM,cAAc,IAAI,OAAO,EAAE;AACxC,QAAI,IAAI,WAAW,GAAG;AACpB,MAAO,IAAI,aAAa,IAAI,MAAM,EAAE;AAAA,IACtC;AAAA,EACF,WAAW,eAAe,OAAO;AAC/B,IAAO,MAAM,IAAI,OAAO;AAAA,EAC1B,OAAO;AACL,IAAO,MAAM,2BAA2B;AAAA,EAC1C;AACF;;;AClFO,SAAS,oBAAoBC,UAAwB;AAC1D,EAAAA,SACG,QAAQ,MAAM,EACd,YAAY,gCAAgC,EAC5C,OAAO,UAAU,gBAAgB,EACjC,OAAO,WAAW,+BAA+B,EACjD,OAAO,OAAO,YAAyB;AACtC,QAAI;AACF,YAAM,QAAQ,OAAO;AAAA,IACvB,SAAS,KAAK;AACZ,MAAAC,aAAY,KAAK,OAAO;AACxB,cAAQ,KAAK,eAAe,cAAc,IAAI,CAAC;AAAA,IACjD;AAAA,EACF,CAAC;AACL;AAEA,eAAe,QAAQ,SAAqC;AAC1D,QAAM,SAAS,WAAW;AAC1B,QAAM,MAAM,IAAI,OAAO,MAAM;AAE7B,QAAM,SAAS,MAAM,IAAI,WAAW;AAEpC,MAAI,QAAQ,MAAM;AAChB,IAAO,KAAK,EAAE,OAAO,CAAC;AACtB;AAAA,EACF;AAEA,MAAI,OAAO,WAAW,GAAG;AACvB,IAAO,KAAK,iBAAiB;AAC7B;AAAA,EACF;AAGA,EAAO,UAAU;AACjB,EAAO;AAAA,IACL,CAAQ,KAAK,MAAM,GAAU,KAAK,MAAM,GAAU,KAAK,QAAQ,GAAU,KAAK,IAAI,CAAC;AAAA,IACnF,CAAC,IAAI,IAAI,IAAI,EAAE;AAAA,EACjB;AACA,EAAO,IAAI,SAAI,OAAO,GAAG,CAAC;AAG1B,aAAW,SAAS,QAAQ;AAC1B,IAAO,SAAS,CAAC,MAAM,MAAM,MAAM,MAAM,MAAM,QAAQ,MAAM,EAAE,GAAG,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC;AAAA,EACpF;AAEA,EAAO,UAAU;AACjB,EAAO,IAAI,GAAG,OAAO,MAAM,WAAW;AACxC;AAEA,SAASC,cAAa,KAAsB;AAC1C,MAAI,eAAe,YAAa,QAAO;AACvC,MAAI,eAAe,SAAU,QAAO;AACpC,SAAO;AACT;AAEA,SAASD,aAAY,KAAc,SAA4B;AAC7D,MAAI,QAAQ,SAAS,MAAM;AACzB,IAAO,KAAK;AAAA,MACV,OAAO,eAAe,QAAQ,IAAI,UAAU;AAAA,MAC5C,MAAMC,cAAa,GAAG;AAAA,IACxB,CAAC;AACD;AAAA,EACF;AAEA,MAAI,eAAe,aAAa;AAC9B,IAAO,MAAM,IAAI,OAAO;AAAA,EAC1B,WAAW,eAAe,UAAU;AAClC,IAAO,MAAM,cAAc,IAAI,OAAO,EAAE;AACxC,QAAI,IAAI,WAAW,GAAG;AACpB,MAAO,IAAI,aAAa,IAAI,MAAM,EAAE;AAAA,IACtC;AAAA,EACF,WAAW,eAAe,OAAO;AAC/B,IAAO,MAAM,IAAI,OAAO;AAAA,EAC1B,OAAO;AACL,IAAO,MAAM,2BAA2B;AAAA,EAC1C;AACF;;;AC5EO,SAAS,mBAAmBC,UAAwB;AACzD,EAAAA,SACG,QAAQ,YAAY,EACpB,YAAY,2BAA2B,EACvC,OAAO,UAAU,gBAAgB,EACjC,OAAO,WAAW,+BAA+B,EACjD,OAAO,OAAO,MAAc,YAAwB;AACnD,QAAI;AACF,YAAM,OAAO,MAAM,OAAO;AAAA,IAC5B,SAAS,KAAK;AACZ,MAAAC,aAAY,KAAK,OAAO;AACxB,cAAQ,KAAK,eAAe,cAAc,IAAI,CAAC;AAAA,IACjD;AAAA,EACF,CAAC;AACL;AAEA,eAAe,OAAO,MAAc,SAAoC;AACtE,QAAM,SAAS,WAAW;AAC1B,QAAM,MAAM,IAAI,OAAO,MAAM;AAE7B,QAAM,QAAQ,MAAM,IAAI,SAAS,IAAI;AAErC,MAAI,CAAC,OAAO;AACV,QAAI,QAAQ,MAAM;AAChB,MAAO,KAAK,EAAE,OAAO,oBAAoB,IAAI,IAAI,MAAM,YAAY,CAAC;AAAA,IACtE,OAAO;AACL,MAAO,MAAM,oBAAoB,IAAI,EAAE;AAAA,IACzC;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,QAAQ,MAAM;AAChB,IAAO,KAAK,KAAK;AACjB;AAAA,EACF;AAGA,EAAO,UAAU;AACjB,EAAO,QAAQ,UAAiB,KAAK,MAAM,SAAS,IAAI,CAAC,EAAE;AAC3D,EAAO,UAAU;AACjB,EAAO,SAAS,QAAQ,MAAM,SAAS,IAAI;AAC3C,EAAO,SAAS,MAAM,MAAM,EAAE;AAC9B,EAAO,SAAS,UAAU,MAAM,SAAS,MAAM;AAC/C,MAAI,MAAM,SAAS,aAAa;AAC9B,IAAO,SAAS,eAAe,MAAM,SAAS,WAAW;AAAA,EAC3D;AACA,EAAO,UAAU;AACjB,EAAO;AAAA,IACL;AAAA,IACA,MAAM,QAAQ,SAAS,IAAI,MAAM,QAAQ,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI,IAAI;AAAA,EAC3E;AACF;AAEA,SAASC,cAAa,KAAsB;AAC1C,MAAI,eAAe,YAAa,QAAO;AACvC,MAAI,eAAe,SAAU,QAAO;AACpC,SAAO;AACT;AAEA,SAASD,aAAY,KAAc,SAA2B;AAC5D,MAAI,QAAQ,SAAS,MAAM;AACzB,IAAO,KAAK;AAAA,MACV,OAAO,eAAe,QAAQ,IAAI,UAAU;AAAA,MAC5C,MAAMC,cAAa,GAAG;AAAA,IACxB,CAAC;AACD;AAAA,EACF;AAEA,MAAI,eAAe,aAAa;AAC9B,IAAO,MAAM,IAAI,OAAO;AAAA,EAC1B,WAAW,eAAe,UAAU;AAClC,IAAO,MAAM,cAAc,IAAI,OAAO,EAAE;AACxC,QAAI,IAAI,WAAW,GAAG;AACpB,MAAO,IAAI,aAAa,IAAI,MAAM,EAAE;AAAA,IACtC;AAAA,EACF,WAAW,eAAe,OAAO;AAC/B,IAAO,MAAM,IAAI,OAAO;AAAA,EAC1B,OAAO;AACL,IAAO,MAAM,2BAA2B;AAAA,EAC1C;AACF;;;AChFO,SAAS,uBAAuBC,UAAwB;AAC7D,EAAAA,SACG,QAAQ,gBAAgB,EACxB,YAAY,gCAAgC,EAC5C,OAAO,UAAU,gBAAgB,EACjC,OAAO,WAAW,+BAA+B,EACjD,OAAO,OAAO,MAAc,YAA4B;AACvD,QAAI;AACF,YAAM,WAAW,MAAM,OAAO;AAAA,IAChC,SAAS,KAAK;AACZ,MAAAC,aAAY,KAAK,OAAO;AACxB,cAAQ,KAAK,eAAe,cAAc,IAAI,CAAC;AAAA,IACjD;AAAA,EACF,CAAC;AACL;AAEA,eAAe,WAAW,MAAc,SAAwC;AAC9E,QAAM,SAAS,WAAW;AAC1B,QAAM,MAAM,IAAI,OAAO,MAAM;AAE7B,MAAI,CAAC,QAAQ,SAAS,CAAC,QAAQ,MAAM;AACnC,IAAO,KAAK,aAAoB,KAAK,IAAI,CAAC,KAAK;AAAA,EACjD;AAEA,QAAM,SAAS,MAAM,IAAI,aAAa,IAAI;AAE1C,MAAI,QAAQ,MAAM;AAChB,IAAO,KAAK;AAAA,MACV;AAAA,MACA,SAAS,OAAO;AAAA,MAChB,UAAU;AAAA,IACZ,CAAC;AAAA,EACH,OAAO;AACL,IAAO,QAAQ,aAAoB,KAAK,IAAI,CAAC,EAAE;AAC/C,IAAO,SAAS,YAAY,OAAO,OAAO;AAAA,EAC5C;AACF;AAEA,SAASC,cAAa,KAAsB;AAC1C,MAAI,eAAe,YAAa,QAAO;AACvC,MAAI,eAAe,SAAU,QAAO;AACpC,SAAO;AACT;AAEA,SAASD,aAAY,KAAc,SAA+B;AAChE,MAAI,QAAQ,SAAS,MAAM;AACzB,IAAO,KAAK;AAAA,MACV,OAAO,eAAe,QAAQ,IAAI,UAAU;AAAA,MAC5C,MAAMC,cAAa,GAAG;AAAA,IACxB,CAAC;AACD;AAAA,EACF;AAEA,MAAI,eAAe,aAAa;AAC9B,IAAO,MAAM,IAAI,OAAO;AAAA,EAC1B,WAAW,eAAe,UAAU;AAClC,IAAO,MAAM,cAAc,IAAI,OAAO,EAAE;AACxC,QAAI,IAAI,WAAW,GAAG;AACpB,MAAO,IAAI,aAAa,IAAI,MAAM,EAAE;AAAA,IACtC;AAAA,EACF,WAAW,eAAe,OAAO;AAC/B,IAAO,MAAM,IAAI,OAAO;AAAA,EAC1B,OAAO;AACL,IAAO,MAAM,2BAA2B;AAAA,EAC1C;AACF;;;AC3EA,OAAOC,SAAQ;AACf,OAAOC,WAAU;AACjB,OAAO,YAAY;AACnB,OAAO,WAAW;AAClB,SAAS,SAASC,kBAAiB;AACnC,SAAS,KAAAC,UAAS;AAEX,IAAM,iBAAN,cAA6B,MAAM;AAAA,EACxC,YACE,SACgB,UAChB;AACA,UAAM,OAAO;AAFG;AAGhB,SAAK,OAAO;AAAA,EACd;AACF;AAWA,IAAMC,qBAAoB;AAE1B,IAAM,gBAAgBD,GAAE;AAAA,EACtBA,GAAE,OAAO;AAAA,IACP,MAAMA,GAAE,OAAO;AAAA,IACf,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,IACjC,UAAUA,GAAE,QAAQ,EAAE,SAAS;AAAA,EACjC,CAAC;AACH;AAEA,SAAS,eAAe,OAAoC;AAC1D,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAEA,IAAM,oBAAoB,CAAC,QAAQ,SAAS,QAAQ,gBAAgB,WAAW;AAE/E,SAAS,WAAW,cAA+B;AACjD,QAAM,QAAQ,aAAa,MAAM,GAAG;AACpC,SAAO,MAAM;AAAA,IAAK,CAAC,SACjB,kBAAkB,KAAK,CAAC,YAAY,SAAS,WAAW,KAAK,WAAW,OAAO,CAAC;AAAA,EAClF;AACF;AAKA,eAAsB,sBAAsB,WAA8C;AACxF,QAAM,cAAcF,MAAK,KAAK,WAAW,UAAU;AAEnD,MAAI;AACJ,MAAI;AACF,cAAU,MAAMD,IAAG,SAAS,aAAa,OAAO;AAAA,EAClD,SAAS,KAAK;AACZ,QAAK,IAA0B,SAAS,UAAU;AAChD,YAAM,IAAI,eAAe,sBAAsB,WAAW;AAAA,IAC5D;AACA,UAAM;AAAA,EACR;AAEA,QAAM,QAAQI,mBAAkB,KAAK,OAAO;AAC5C,MAAI,CAAC,QAAQ,CAAC,GAAG;AACf,UAAM,IAAI,eAAe,wCAAwC,WAAW;AAAA,EAC9E;AAEA,QAAM,cAAcF,WAAU,MAAM,CAAC,CAAC;AAEtC,MAAI,OAAO,YAAY,SAAS,YAAY,YAAY,KAAK,WAAW,GAAG;AACzE,UAAM,IAAI,eAAe,iDAAiD,WAAW;AAAA,EACvF;AAEA,QAAM,gBAAgB,cAAc,UAAU,YAAY,OAAO;AAEjE,SAAO;AAAA,IACL,MAAM,YAAY;AAAA,IAClB,aAAa,eAAe,YAAY,WAAW;AAAA,IACnD,SAAS,eAAe,YAAY,OAAO;AAAA,IAC3C,SAAS,eAAe,YAAY,OAAO;AAAA,IAC3C,QAAQ,eAAe,YAAY,MAAM;AAAA,IACzC,SAAS,cAAc,UAAU,cAAc,OAAO;AAAA,EACxD;AACF;AAKA,eAAe,aAAa,KAAa,SAAoC;AAC3E,QAAM,QAAkB,CAAC;AACzB,QAAM,UAAU,MAAMF,IAAG,QAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAE7D,aAAW,SAAS,SAAS;AAC3B,UAAM,WAAWC,MAAK,KAAK,KAAK,MAAM,IAAI;AAC1C,UAAM,eAAeA,MAAK,SAAS,SAAS,QAAQ;AAEpD,QAAI,WAAW,YAAY,EAAG;AAE9B,QAAI,MAAM,YAAY,GAAG;AACvB,YAAM,KAAK,GAAI,MAAM,aAAa,UAAU,OAAO,CAAE;AAAA,IACvD,WAAW,MAAM,OAAO,GAAG;AACzB,YAAM,KAAK,YAAY;AAAA,IACzB;AAAA,EACF;AAEA,SAAO;AACT;AAMA,eAAsB,mBAAmB,WAAoC;AAC3E,QAAM,eAAeA,MAAK,QAAQ,SAAS;AAE3C,MAAI;AACF,UAAM,OAAO,MAAMD,IAAG,KAAK,YAAY;AACvC,QAAI,CAAC,KAAK,YAAY,GAAG;AACvB,YAAM,IAAI,eAAe,oBAAoB,YAAY,EAAE;AAAA,IAC7D;AAAA,EACF,SAAS,KAAK;AACZ,QAAK,IAA0B,SAAS,UAAU;AAChD,YAAM,IAAI,eAAe,wBAAwB,YAAY,EAAE;AAAA,IACjE;AACA,UAAM;AAAA,EACR;AAGA,QAAM,sBAAsB,YAAY;AAExC,QAAM,QAAQ,MAAM,aAAa,cAAc,YAAY;AAC3D,QAAM,MAAM,IAAI,MAAM;AAEtB,aAAW,gBAAgB,OAAO;AAChC,UAAM,WAAWC,MAAK,KAAK,cAAc,YAAY;AACrD,UAAM,UAAU,MAAMD,IAAG,SAAS,QAAQ;AAC1C,QAAI,KAAK,cAAc,OAAO;AAAA,EAChC;AAEA,SAAO,OAAO,KAAK,MAAM,IAAI,cAAc,EAAE,MAAM,cAAc,aAAa,UAAU,CAAC,CAAC;AAC5F;AAOA,eAAsB,aACpB,WACA,KACwC;AACxC,QAAM,eAAeC,MAAK,QAAQ,SAAS;AAE3C,QAAM,aAAa,MACf,CAACA,MAAK,KAAK,cAAc,QAAQ,GAAG,EAAE,GAAGA,MAAK,KAAK,cAAc,MAAM,CAAC,IACxE,CAACA,MAAK,KAAK,cAAc,MAAM,CAAC;AAEpC,aAAW,WAAW,YAAY;AAChC,QAAI;AACF,YAAM,UAAU,MAAMD,IAAG,SAAS,SAAS,OAAO;AAClD,YAAM,SAAS,OAAO,MAAM,OAAO;AACnC,aAAO;AAAA,IACT,SAAS,KAAK;AACZ,UAAK,IAA0B,SAAS,SAAU;AAClD,YAAM;AAAA,IACR;AAAA,EACF;AAEA,SAAO;AACT;;;AC3JO,SAAS,yBAAyBK,UAAwB;AAC/D,EAAAA,SACG,QAAQ,aAAa,EACrB,YAAY,6CAA6C,EACzD,OAAO,uBAAuB,qDAAqD,EACnF,OAAO,UAAU,gBAAgB,EACjC,OAAO,WAAW,+BAA+B,EACjD,OAAO,OAAO,WAAmB,YAA8B;AAC9D,QAAI;AACF,YAAM,aAAa,WAAW,OAAO;AAAA,IACvC,SAAS,KAAK;AACZ,MAAAC,aAAY,KAAK,OAAO;AACxB,cAAQ,KAAK,eAAe,cAAc,IAAI,CAAC;AAAA,IACjD;AAAA,EACF,CAAC;AACL;AAEA,eAAe,aAAa,WAAmB,SAA0C;AACvF,QAAM,SAAS,WAAW;AAC1B,QAAM,MAAM,IAAI,OAAO,MAAM;AAG7B,MAAI,CAAC,QAAQ,SAAS,CAAC,QAAQ,MAAM;AACnC,IAAO,KAAK,sBAA6B,KAAK,SAAS,CAAC,KAAK;AAAA,EAC/D;AAEA,QAAM,cAAc,MAAM,sBAAsB,SAAS;AAEzD,MAAI,CAAC,QAAQ,SAAS,CAAC,QAAQ,MAAM;AACnC,IAAO,KAAK,aAAoB,KAAK,YAAY,IAAI,CAAC,KAAK;AAAA,EAC7D;AAGA,QAAM,SAAS,MAAM,mBAAmB,SAAS;AACjD,QAAM,aAAa,MAAM,IAAI,UAAU,MAAM;AAE7C,MAAI,CAAC,QAAQ,SAAS,CAAC,QAAQ,MAAM;AACnC,UAAM,SAAS,WAAW,UAAU,YAAY;AAChD,IAAO,QAAQ,GAAG,MAAM,KAAY,KAAK,WAAW,IAAI,CAAC,EAAE;AAC3D,IAAO,SAAS,YAAY,WAAW,OAAO;AAAA,EAChD;AAGA,MAAI,cAAc;AAClB,QAAM,aAAa,MAAM,aAAa,WAAW,QAAQ,GAAG;AAE5D,MAAI,cAAc,OAAO,KAAK,UAAU,EAAE,SAAS,GAAG;AAEpD,QAAI,YAAY,WAAW,CAAC,QAAQ,SAAS,CAAC,QAAQ,MAAM;AAC1D,YAAM,gBAAgB,IAAI,IAAI,YAAY,QAAQ,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AACpE,YAAM,WAAW,OAAO,KAAK,UAAU;AAEvC,iBAAW,QAAQ,UAAU;AAC3B,YAAI,CAAC,cAAc,IAAI,IAAI,GAAG;AAC5B,UAAO,QAAQ,UAAiB,OAAO,IAAI,CAAC,uCAAuC;AAAA,QACrF;AAAA,MACF;AAEA,iBAAW,YAAY,YAAY,SAAS;AAC1C,YAAI,SAAS,aAAa,SAAS,CAAC,WAAW,SAAS,IAAI,GAAG;AAC7D,UAAO;AAAA,YACL,mBAA0B,OAAO,SAAS,IAAI,CAAC;AAAA,UACjD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,QAAQ,SAAS,CAAC,QAAQ,MAAM;AACnC,MAAO,KAAK,WAAW,OAAO,KAAK,UAAU,EAAE,MAAM,eAAe;AAAA,IACtE;AAEA,UAAM,gBAAgB,MAAM,IAAI,mBAAmB,WAAW,SAAS,UAAU;AACjF,kBAAc,cAAc,QAAQ;AAEpC,QAAI,CAAC,QAAQ,SAAS,CAAC,QAAQ,MAAM;AACnC,MAAO,QAAQ,GAAG,WAAW,oBAAoB;AAAA,IACnD;AAAA,EACF;AAEA,MAAI,QAAQ,MAAM;AAChB,IAAO,KAAK;AAAA,MACV,MAAM,WAAW;AAAA,MACjB,SAAS,WAAW;AAAA,MACpB,SAAS,WAAW;AAAA,MACpB,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AACF;AAEA,SAASC,cAAa,KAAsB;AAC1C,MAAI,eAAe,YAAa,QAAO;AACvC,MAAI,eAAe,eAAgB,QAAO;AAC1C,MAAI,eAAe,SAAU,QAAO;AACpC,SAAO;AACT;AAEA,SAASD,aAAY,KAAc,SAAiC;AAClE,MAAI,QAAQ,SAAS,MAAM;AACzB,IAAO,KAAK;AAAA,MACV,OAAO,eAAe,QAAQ,IAAI,UAAU;AAAA,MAC5C,MAAMC,cAAa,GAAG;AAAA,IACxB,CAAC;AACD;AAAA,EACF;AAEA,MAAI,eAAe,aAAa;AAC9B,IAAO,MAAM,IAAI,OAAO;AAAA,EAC1B,WAAW,eAAe,gBAAgB;AACxC,IAAO,MAAM,IAAI,OAAO;AACxB,QAAI,IAAI,aAAa,QAAW;AAC9B,MAAO,IAAI,WAAW,IAAI,QAAQ,EAAE;AAAA,IACtC;AAAA,EACF,WAAW,eAAe,UAAU;AAClC,IAAO,MAAM,cAAc,IAAI,OAAO,EAAE;AACxC,QAAI,IAAI,WAAW,GAAG;AACpB,MAAO,IAAI,aAAa,IAAI,MAAM,EAAE;AAAA,IACtC;AAAA,EACF,WAAW,eAAe,OAAO;AAC/B,IAAO,MAAM,IAAI,OAAO;AAAA,EAC1B,OAAO;AACL,IAAO,MAAM,2BAA2B;AAAA,EAC1C;AACF;;;AXnHA,IAAM,WAAW,QAAQ,KAAK,QAAQ,OAAO;AAC7C,IAAM,UAAU,aAAa,MAAM,QAAQ,KAAK,WAAW,CAAC,IAAI,QAAQ,KAAK,WAAW,CAAC,IAAI;AAG7FC,QAAO,OAAO,EAAE,MAAM,QAAQ,CAAC;AAE/B,IAAM,UAAU,IAAI,QAAQ;AAE5B,QACG,KAAK,SAAS,EACd,YAAY,0DAA0D,EACtE,QAAQ,OAAO,EACf,OAAO,gBAAgB,yCAAyC,MAAM;AAGzE,wBAAwB,OAAO;AAC/B,oBAAoB,OAAO;AAC3B,oBAAoB,OAAO;AAC3B,mBAAmB,OAAO;AAC1B,uBAAuB,OAAO;AAG9B,IAAM,gBAAgB,QAAQ,QAAQ,QAAQ,EAAE,YAAY,eAAe;AAC3E,yBAAyB,aAAa;AAGtC,QAAQ,MAAM;","names":["dotenv","json","z","agentId","path","program","program","handleError","getErrorCode","program","handleError","getErrorCode","program","handleError","getErrorCode","program","handleError","getErrorCode","fs","path","parseYaml","z","FRONTMATTER_REGEX","program","handleError","getErrorCode","dotenv"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@octavus/cli",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.20.0",
|
|
4
4
|
"description": "CLI for validating and syncing Octavus agent definitions",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Octavus AI <dev@octavus.ai>",
|
|
@@ -35,6 +35,7 @@
|
|
|
35
35
|
"dependencies": {
|
|
36
36
|
"commander": "^13.1.0",
|
|
37
37
|
"dotenv": "^16.6.1",
|
|
38
|
+
"jszip": "^3.10.1",
|
|
38
39
|
"yaml": "^2.8.0",
|
|
39
40
|
"zod": "^4.3.5"
|
|
40
41
|
},
|