@nestbox-ai/cli 1.0.38 → 1.0.40

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.
Files changed (49) hide show
  1. package/.github/workflows/test.yml +54 -0
  2. package/dist/commands/agent/apiUtils.d.ts +20 -0
  3. package/dist/commands/agent/apiUtils.js +75 -2
  4. package/dist/commands/agent/apiUtils.js.map +1 -1
  5. package/dist/commands/agent/create.d.ts +2 -29
  6. package/dist/commands/agent/create.js +123 -61
  7. package/dist/commands/agent/create.js.map +1 -1
  8. package/dist/commands/agent/deploy.js +183 -137
  9. package/dist/commands/agent/deploy.js.map +1 -1
  10. package/dist/commands/agent/index.d.ts +1 -2
  11. package/dist/commands/agent/index.js +3 -6
  12. package/dist/commands/agent/index.js.map +1 -1
  13. package/dist/commands/agent/yaml-schema.d.ts +72 -0
  14. package/dist/commands/agent/yaml-schema.js +61 -0
  15. package/dist/commands/agent/yaml-schema.js.map +1 -0
  16. package/dist/commands/agent.js +2 -2
  17. package/dist/commands/agent.js.map +1 -1
  18. package/dist/commands/generate/project.js +34 -30
  19. package/dist/commands/generate/project.js.map +1 -1
  20. package/dist/utils/agent.js +18 -20
  21. package/dist/utils/agent.js.map +1 -1
  22. package/dist/utils/plopGenerator.d.ts +3 -1
  23. package/dist/utils/plopGenerator.js +34 -22
  24. package/dist/utils/plopGenerator.js.map +1 -1
  25. package/package.json +3 -2
  26. package/src/commands/agent/apiUtils.ts +103 -14
  27. package/src/commands/agent/create.ts +266 -100
  28. package/src/commands/agent/deploy.ts +515 -264
  29. package/src/commands/agent/index.ts +1 -4
  30. package/src/commands/agent/yaml-schema.ts +57 -0
  31. package/src/commands/agent.ts +10 -10
  32. package/src/commands/generate/project.ts +179 -147
  33. package/src/utils/agent.ts +141 -125
  34. package/src/utils/plopGenerator.ts +55 -33
  35. package/templates/base-js/index.js.hbs +21 -8
  36. package/templates/base-js/nestbox-agents.yaml.hbs +12 -0
  37. package/templates/base-js/package.json +1 -1
  38. package/templates/base-ts/nestbox-agents.yaml.hbs +12 -0
  39. package/templates/base-ts/nestbox.config.json +9 -0
  40. package/templates/base-ts/package.json +1 -1
  41. package/templates/base-ts/src/index.ts.hbs +21 -8
  42. package/templates/chatbot-js/package.json +1 -1
  43. package/templates/chatbot-ts/package.json +1 -1
  44. package/test/agent.test.ts +153 -124
  45. package/dist/commands/agent/createFromYaml.d.ts +0 -2
  46. package/dist/commands/agent/createFromYaml.js +0 -172
  47. package/dist/commands/agent/createFromYaml.js.map +0 -1
  48. package/sample-agents.yaml +0 -0
  49. package/src/commands/agent/createFromYaml.ts +0 -192
@@ -0,0 +1,54 @@
1
+ name: Test Nestbox AI CLI Tools
2
+
3
+ on:
4
+ push:
5
+ branches-ignore:
6
+ - main
7
+ pull_request:
8
+ branches:
9
+ - main
10
+
11
+ permissions:
12
+ contents: read
13
+
14
+ jobs:
15
+ test:
16
+ runs-on: ubuntu-latest
17
+
18
+ steps:
19
+ - uses: actions/checkout@v4
20
+
21
+ - name: Setup Node.js
22
+ uses: actions/setup-node@v4
23
+ with:
24
+ node-version: '20'
25
+ cache: 'npm'
26
+
27
+ - name: Install dependencies
28
+ run: |
29
+ npm install --prefer-offline --no-audit
30
+
31
+ - name: Install platform-specific dependencies
32
+ run: |
33
+ # Install Linux-specific Rollup binary for vitest
34
+ npm install @rollup/rollup-linux-x64-gnu --no-save || echo "Warning: Could not install platform-specific Rollup binary"
35
+ continue-on-error: true
36
+
37
+ - name: Verify installation
38
+ run: |
39
+ npm list vitest --depth=0
40
+ node --version
41
+ npm --version
42
+
43
+ - name: Run tests
44
+ run: |
45
+ echo "Running tests..."
46
+ echo "Node.js version: $(node --version)"
47
+ echo "NPM version: $(npm --version)"
48
+ echo "Checking if vitest is available..."
49
+ npx vitest --version || echo "Vitest not found via npx"
50
+ npm run test:ci
51
+ echo "All tests passed! ✅"
52
+
53
+ - name: Build project
54
+ run: npm run build
@@ -8,3 +8,23 @@ export interface ApiInstances {
8
8
  * Create API instances with current authentication using setupAuthAndConfig
9
9
  */
10
10
  export declare function createApis(): ApiInstances;
11
+ export type ManifestAgent = {
12
+ name: string;
13
+ description: string;
14
+ entry: string;
15
+ type?: "REGULAR" | "CHATBOT" | "WORKFLOW";
16
+ inputSchema: {
17
+ type: "object";
18
+ properties: Record<string, {
19
+ type: string;
20
+ description?: string;
21
+ default?: string | number | boolean | null;
22
+ }>;
23
+ required?: string[];
24
+ };
25
+ };
26
+ export type ManifestFile = {
27
+ agents: ManifestAgent[];
28
+ };
29
+ export declare function loadAgentFromYaml(agentName: string): Promise<ManifestAgent | undefined>;
30
+ export declare function loadAllAgentNamesFromYaml(): Promise<string[]>;
@@ -1,20 +1,93 @@
1
1
  "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
2
14
  Object.defineProperty(exports, "__esModule", { value: true });
3
15
  exports.createApis = createApis;
16
+ exports.loadAgentFromYaml = loadAgentFromYaml;
17
+ exports.loadAllAgentNamesFromYaml = loadAllAgentNamesFromYaml;
4
18
  const admin_1 = require("@nestbox-ai/admin");
5
19
  const api_1 = require("../../utils/api");
20
+ const promises_1 = __importDefault(require("fs/promises"));
21
+ const path_1 = __importDefault(require("path"));
22
+ const js_yaml_1 = __importDefault(require("js-yaml"));
23
+ const ajv_1 = __importDefault(require("ajv"));
24
+ const yaml_schema_1 = require("./yaml-schema");
6
25
  /**
7
26
  * Create API instances with current authentication using setupAuthAndConfig
8
27
  */
9
28
  function createApis() {
10
29
  const authResult = (0, api_1.setupAuthAndConfig)();
11
30
  if (!authResult) {
12
- throw new Error('No authentication token found. Please log in first.');
31
+ throw new Error("No authentication token found. Please log in first.");
13
32
  }
14
33
  return {
15
34
  agentsApi: new admin_1.MachineAgentApi(authResult.configuration),
16
35
  projectsApi: new admin_1.ProjectsApi(authResult.configuration),
17
- instanceApi: new admin_1.MachineInstancesApi(authResult.configuration)
36
+ instanceApi: new admin_1.MachineInstancesApi(authResult.configuration),
18
37
  };
19
38
  }
39
+ const ajv = new ajv_1.default({ strict: false });
40
+ const validate = ajv.compile(yaml_schema_1.yamlSchema);
41
+ function loadAgentFromYaml(agentName) {
42
+ return __awaiter(this, void 0, void 0, function* () {
43
+ const file = path_1.default.join(process.cwd(), "nestbox-agents.yaml");
44
+ try {
45
+ yield promises_1.default.access(file);
46
+ }
47
+ catch (err) {
48
+ if ((err === null || err === void 0 ? void 0 : err.code) === "ENOENT")
49
+ return undefined;
50
+ throw new Error(`cannot access nestbox-agents.yaml: ${err.message}`);
51
+ }
52
+ const raw = yield promises_1.default.readFile(file, "utf8");
53
+ const doc = js_yaml_1.default.load(raw);
54
+ if (!validate(doc)) {
55
+ const msg = ajv.errorsText(validate.errors, { separator: "\n- " });
56
+ throw new Error(`invalid nestbox-agents.yaml:\n- ${msg}`);
57
+ }
58
+ const mf = doc;
59
+ return mf.agents.find(a => (a === null || a === void 0 ? void 0 : a.name) === agentName);
60
+ });
61
+ }
62
+ function loadAllAgentNamesFromYaml() {
63
+ return __awaiter(this, void 0, void 0, function* () {
64
+ const file = path_1.default.join(process.cwd(), "nestbox-agents.yaml");
65
+ try {
66
+ yield promises_1.default.access(file);
67
+ }
68
+ catch (err) {
69
+ if ((err === null || err === void 0 ? void 0 : err.code) === "ENOENT")
70
+ return [];
71
+ throw new Error(`cannot access nestbox-agents.yaml: ${err.message}`);
72
+ }
73
+ const raw = yield promises_1.default.readFile(file, "utf8");
74
+ const doc = js_yaml_1.default.load(raw);
75
+ if (!validate(doc)) {
76
+ const msg = ajv.errorsText(validate.errors, { separator: "\n- " });
77
+ throw new Error(`invalid nestbox-agents.yaml:\n- ${msg}`);
78
+ }
79
+ const mf = doc;
80
+ const names = Array.isArray(mf === null || mf === void 0 ? void 0 : mf.agents)
81
+ ? mf.agents.map(a => a === null || a === void 0 ? void 0 : a.name).filter(Boolean)
82
+ : [];
83
+ // de-duplicate by name, keep first occurrence
84
+ const seen = new Set();
85
+ return names.filter(n => {
86
+ if (seen.has(n))
87
+ return false;
88
+ seen.add(n);
89
+ return true;
90
+ });
91
+ });
92
+ }
20
93
  //# sourceMappingURL=apiUtils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"apiUtils.js","sourceRoot":"","sources":["../../../src/commands/agent/apiUtils.ts"],"names":[],"mappings":";;AAYA,gCAWC;AAvBD,6CAAsF;AACtF,yCAAqD;AAQrD;;GAEG;AACH,SAAgB,UAAU;IACxB,MAAM,UAAU,GAAG,IAAA,wBAAkB,GAAE,CAAC;IACxC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IAED,OAAO;QACL,SAAS,EAAE,IAAI,uBAAe,CAAC,UAAU,CAAC,aAAa,CAAC;QACxD,WAAW,EAAE,IAAI,mBAAW,CAAC,UAAU,CAAC,aAAa,CAAC;QACtD,WAAW,EAAE,IAAI,2BAAmB,CAAC,UAAU,CAAC,aAAa,CAAC;KAC/D,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"apiUtils.js","sourceRoot":"","sources":["../../../src/commands/agent/apiUtils.ts"],"names":[],"mappings":"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"}
@@ -1,29 +1,2 @@
1
- import { MachineAgentApi, ProjectsApi } from "@nestbox-ai/admin";
2
- export interface CreateAgentOptions {
3
- lang?: string;
4
- template?: string;
5
- project?: string;
6
- instanceName?: string;
7
- machineManifestId?: string;
8
- type?: string;
9
- goal?: string;
10
- modelBaseId?: string;
11
- machineName?: string;
12
- machineInstanceId?: number;
13
- instanceIP?: string;
14
- userId?: number;
15
- parameters?: Array<{
16
- name: string;
17
- description: string;
18
- default: any;
19
- }>;
20
- }
21
- /**
22
- * Create a new agent in the Nestbox platform
23
- *
24
- * @param agentName The name of the agent
25
- * @param options Options including lang, template, and project
26
- * @param agentsApi The MachineAgentApi instance
27
- * @param projectsApi The ProjectsApi instance
28
- */
29
- export declare function createAgent(agentName: string, options: CreateAgentOptions, agentsApi?: MachineAgentApi, projectsApi?: ProjectsApi): Promise<any>;
1
+ import { Command } from "commander";
2
+ export declare function registerCreateCommand(agentCommand: Command): void;
@@ -8,81 +8,143 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
8
  step((generator = generator.apply(thisArg, _arguments || [])).next());
9
9
  });
10
10
  };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
11
14
  Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.createAgent = createAgent;
13
- const admin_1 = require("@nestbox-ai/admin");
14
- const auth_1 = require("../../utils/auth");
15
+ exports.registerCreateCommand = registerCreateCommand;
16
+ const chalk_1 = __importDefault(require("chalk"));
15
17
  const project_1 = require("../../utils/project");
16
- /**
17
- * Create a new agent in the Nestbox platform
18
- *
19
- * @param agentName The name of the agent
20
- * @param options Options including lang, template, and project
21
- * @param agentsApi The MachineAgentApi instance
22
- * @param projectsApi The ProjectsApi instance
23
- */
24
- function createAgent(agentName, options, agentsApi, projectsApi) {
25
- return __awaiter(this, void 0, void 0, function* () {
26
- var _a, _b, _c;
27
- const authToken = (0, auth_1.getAuthToken)();
28
- if (!authToken) {
29
- throw new Error("No authentication token found. Please login first.");
18
+ const agent_1 = require("../../utils/agent");
19
+ const apiUtils_1 = require("./apiUtils");
20
+ function buildAgentData(options_1) {
21
+ return __awaiter(this, arguments, void 0, function* (options, machineInstanceData = {}) {
22
+ const createAgentData = {
23
+ agentName: "",
24
+ goal: "",
25
+ inputSchema: {},
26
+ machineManifestId: machineInstanceData.machineId,
27
+ machineName: options.instance,
28
+ machineInstanceId: machineInstanceData.id,
29
+ instanceIP: machineInstanceData.internalIP,
30
+ projectId: options.project,
31
+ type: (options === null || options === void 0 ? void 0 : options.type) || "REGULAR",
32
+ userId: 0,
33
+ modelBaseId: "",
34
+ entryFunctionName: "",
35
+ };
36
+ // check agent name and add prefix
37
+ if (!options.agent) {
38
+ throw new Error("Missing required argument <agent>.");
39
+ }
40
+ createAgentData.agentName = options.prefix
41
+ ? options.prefix + "-" + options.agent
42
+ : options.agent;
43
+ // agent creation using arguments
44
+ if (options.description || options.inputSchema) {
45
+ if (!options.description) {
46
+ throw new Error("Missing required argument <description>.");
47
+ }
48
+ if (!options.inputSchema) {
49
+ throw new Error("Missing required argument <inputSchema>.");
50
+ }
51
+ createAgentData.goal = options.description;
52
+ createAgentData.inputSchema = JSON.parse(options.inputSchema);
30
53
  }
31
- // Create API instances if not provided
32
- if (!agentsApi || !projectsApi) {
33
- const configuration = new admin_1.Configuration({
34
- basePath: authToken === null || authToken === void 0 ? void 0 : authToken.serverUrl,
35
- baseOptions: {
36
- headers: {
37
- Authorization: authToken === null || authToken === void 0 ? void 0 : authToken.token,
38
- },
39
- },
40
- });
41
- agentsApi = agentsApi || new admin_1.MachineAgentApi(configuration);
42
- projectsApi = projectsApi || new admin_1.ProjectsApi(configuration);
54
+ else {
55
+ const manifestAgent = yield (0, apiUtils_1.loadAgentFromYaml)(options.agent);
56
+ if (!manifestAgent) {
57
+ throw new Error("Could not find a yaml file definition of an agent or agent not defined in yaml file.");
58
+ }
59
+ createAgentData.goal = manifestAgent.description;
60
+ createAgentData.inputSchema = manifestAgent.inputSchema || {};
61
+ createAgentData.type = options.type || (manifestAgent === null || manifestAgent === void 0 ? void 0 : manifestAgent.type) || "REGULAR";
43
62
  }
44
- // Resolve project - convert options to match CommandOptions interface
45
- const projectData = yield (0, project_1.resolveProject)(projectsApi, Object.assign({ project: options.project, instance: options.instanceName || '' }, options));
46
- // Prepare agent creation payload
47
- // Determine the correct type value based on options.type
48
- const agentTypeValue = ((_a = options.type) === null || _a === void 0 ? void 0 : _a.includes("AGENT")) ? "REGULAR" : options.type || "CHAT";
49
- const payload = {
50
- agentName,
51
- goal: options.goal || `AI agent for ${agentName}`,
52
- modelBaseId: options.modelBaseId || "",
53
- machineName: options.machineName,
54
- machineInstanceId: options.machineInstanceId,
55
- instanceIP: options.instanceIP,
56
- machineManifestId: options.machineManifestId,
57
- parameters: ((_b = options.parameters) === null || _b === void 0 ? void 0 : _b.map((param) => ({
58
- name: param.name,
59
- description: param.description,
60
- default_value: param.default || "",
61
- isUserParam: param.isUserParam !== undefined ? param.isUserParam : true
62
- }))) || [],
63
- projectId: projectData.id,
64
- type: agentTypeValue,
65
- userId: options.userId || 0,
66
- };
67
- // Determine the type of resource (Agent or Chat)
68
- const agentType = options.type || "CHAT";
69
- const resourceType = agentType === "AGENT" || agentType === "REGULAR" ? "Agent" : "Chatbot";
70
- // Create the agent
63
+ return createAgentData;
64
+ });
65
+ }
66
+ function registerCreateCommand(agentCommand) {
67
+ agentCommand
68
+ .command("create")
69
+ .description("Create an agent with direct arguments or YAML.")
70
+ .option("--agent <agent>", "Agent name to deploy")
71
+ .option("--all", "Deploy all agents defined in nestbox-agents.yaml")
72
+ .option("--project <project>", "Project ID (defaults to current project)")
73
+ .option("--type <type>", "Agent type (e.g. CHAT, AGENT, REGULAR)")
74
+ .option("--prefix <prefix>", "A prefix added to beginning of the agent name.")
75
+ .option("--description <description>", "Description of the agent")
76
+ .option("--instance <instance>", "Machine name")
77
+ .option("--inputSchema <inputSchema>", "Agent input schema")
78
+ .action((options) => __awaiter(this, void 0, void 0, function* () {
79
+ var _a, _b, _c;
71
80
  try {
72
- const response = yield agentsApi.machineAgentControllerCreateMachineAgent(projectData.id, payload);
81
+ const apis = (0, apiUtils_1.createApis)();
82
+ // resolve project
83
+ const projectData = yield (0, project_1.resolveProject)(apis.projectsApi, Object.assign({ project: (options === null || options === void 0 ? void 0 : options.project) || "", instance: (options === null || options === void 0 ? void 0 : options.instance) || "" }, options));
84
+ const projectRoot = process.cwd();
85
+ const nestboxConfig = (0, agent_1.loadNestboxConfig)(projectRoot);
86
+ if (!(options === null || options === void 0 ? void 0 : options.instance) && !(nestboxConfig === null || nestboxConfig === void 0 ? void 0 : nestboxConfig.instance)) {
87
+ console.log(chalk_1.default.red("Parameter <instance> not provided."));
88
+ return;
89
+ }
90
+ const machineName = (options === null || options === void 0 ? void 0 : options.instance) || (nestboxConfig === null || nestboxConfig === void 0 ? void 0 : nestboxConfig.instance);
91
+ const instanceData = yield apis.instanceApi.machineInstancesControllerGetMachineInstanceByUserId(projectData.id, 0, 10);
92
+ const targetInstance = instanceData.data.machineInstances.find((instance) => instance.instanceName === machineName);
93
+ if (!targetInstance) {
94
+ console.error(chalk_1.default.red(`Instance with name "${machineName}" not found in project "${projectData.name}".`));
95
+ console.log(chalk_1.default.yellow("Available instances:"));
96
+ instanceData.data.machineInstances.forEach((instance) => {
97
+ console.log(chalk_1.default.yellow(` - ${instance.instanceName} (ID: ${instance.id})`));
98
+ });
99
+ return;
100
+ }
101
+ // handle --all (iterate all manifest agent names)
102
+ if (options.all) {
103
+ let created = 0;
104
+ let failed = 0;
105
+ const names = yield (0, apiUtils_1.loadAllAgentNamesFromYaml)();
106
+ if (!names.length) {
107
+ console.log(chalk_1.default.yellow("No agents found in YAML manifest."));
108
+ return;
109
+ }
110
+ console.log(chalk_1.default.cyan(`Deploying ${names.length} agent(s) from YAML${options.prefix ? ` with prefix "${options.prefix}"` : ""}...`));
111
+ const results = [];
112
+ for (const name of names) {
113
+ try {
114
+ const data = yield buildAgentData(Object.assign(Object.assign({}, options), { project: projectData.id, agent: name }), targetInstance);
115
+ const res = yield apis.agentsApi.machineAgentControllerCreateMachineAgent(projectData.id, Object.assign({}, data));
116
+ created++;
117
+ results.push(res.data);
118
+ console.log(chalk_1.default.green(`✔ Created: ${data.agentName}`));
119
+ }
120
+ catch (err) {
121
+ failed++;
122
+ const msg = ((_b = (_a = err === null || err === void 0 ? void 0 : err.response) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.message) ||
123
+ (err === null || err === void 0 ? void 0 : err.message) ||
124
+ "Unknown error";
125
+ console.log(chalk_1.default.red(`✖ Failed: ${name} — ${msg}`));
126
+ }
127
+ }
128
+ console.log(chalk_1.default.cyan(`Done. ${chalk_1.default.green(`${created} created`)}, ${chalk_1.default.red(`${failed} failed`)}.`));
129
+ return results;
130
+ }
131
+ // original single-agent flow
132
+ const data = yield buildAgentData(Object.assign(Object.assign({}, options), { project: projectData.id }), targetInstance);
133
+ const response = yield apis.agentsApi.machineAgentControllerCreateMachineAgent(projectData.id, Object.assign({}, data));
134
+ console.log(chalk_1.default.green("Agent successfully created."));
73
135
  return response.data;
74
136
  }
75
137
  catch (error) {
76
138
  if (error.response && error.response.status === 401) {
77
- throw new Error('Authentication token has expired. Please login again using "nestbox login <domain>".');
139
+ console.log(chalk_1.default.red('Authentication token has expired. Please login again using "nestbox login <domain>".'));
78
140
  }
79
141
  else if (error.response) {
80
- throw new Error(`API Error (${error.response.status}): ${((_c = error.response.data) === null || _c === void 0 ? void 0 : _c.message) || "Unknown error"}`);
142
+ console.log(chalk_1.default.red(`API Error (${error.response.status}): ${((_c = error.response.data) === null || _c === void 0 ? void 0 : _c.message) || "Unknown error"}`));
81
143
  }
82
144
  else {
83
- throw new Error(error.message || "Unknown error");
145
+ console.log(chalk_1.default.red(error.message || "Unknown error"));
84
146
  }
85
147
  }
86
- });
148
+ }));
87
149
  }
88
150
  //# sourceMappingURL=create.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/commands/agent/create.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/commands/agent/create.ts"],"names":[],"mappings":"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"}