@vm0/cli 4.36.1 → 4.38.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/index.js +1348 -97
- package/package.json +1 -1
package/index.js
CHANGED
|
@@ -6,8 +6,8 @@ var __export = (target, all) => {
|
|
|
6
6
|
};
|
|
7
7
|
|
|
8
8
|
// src/index.ts
|
|
9
|
-
import { Command as
|
|
10
|
-
import
|
|
9
|
+
import { Command as Command27 } from "commander";
|
|
10
|
+
import chalk29 from "chalk";
|
|
11
11
|
|
|
12
12
|
// src/lib/auth.ts
|
|
13
13
|
import chalk from "chalk";
|
|
@@ -984,10 +984,10 @@ function mergeDefs(...defs) {
|
|
|
984
984
|
function cloneDef(schema) {
|
|
985
985
|
return mergeDefs(schema._zod.def);
|
|
986
986
|
}
|
|
987
|
-
function getElementAtPath(obj,
|
|
988
|
-
if (!
|
|
987
|
+
function getElementAtPath(obj, path16) {
|
|
988
|
+
if (!path16)
|
|
989
989
|
return obj;
|
|
990
|
-
return
|
|
990
|
+
return path16.reduce((acc, key) => acc?.[key], obj);
|
|
991
991
|
}
|
|
992
992
|
function promiseAllObject(promisesObj) {
|
|
993
993
|
const keys = Object.keys(promisesObj);
|
|
@@ -1346,11 +1346,11 @@ function aborted(x, startIndex = 0) {
|
|
|
1346
1346
|
}
|
|
1347
1347
|
return false;
|
|
1348
1348
|
}
|
|
1349
|
-
function prefixIssues(
|
|
1349
|
+
function prefixIssues(path16, issues) {
|
|
1350
1350
|
return issues.map((iss) => {
|
|
1351
1351
|
var _a;
|
|
1352
1352
|
(_a = iss).path ?? (_a.path = []);
|
|
1353
|
-
iss.path.unshift(
|
|
1353
|
+
iss.path.unshift(path16);
|
|
1354
1354
|
return iss;
|
|
1355
1355
|
});
|
|
1356
1356
|
}
|
|
@@ -1518,7 +1518,7 @@ function treeifyError(error43, _mapper) {
|
|
|
1518
1518
|
return issue2.message;
|
|
1519
1519
|
};
|
|
1520
1520
|
const result = { errors: [] };
|
|
1521
|
-
const processError = (error44,
|
|
1521
|
+
const processError = (error44, path16 = []) => {
|
|
1522
1522
|
var _a, _b;
|
|
1523
1523
|
for (const issue2 of error44.issues) {
|
|
1524
1524
|
if (issue2.code === "invalid_union" && issue2.errors.length) {
|
|
@@ -1528,7 +1528,7 @@ function treeifyError(error43, _mapper) {
|
|
|
1528
1528
|
} else if (issue2.code === "invalid_element") {
|
|
1529
1529
|
processError({ issues: issue2.issues }, issue2.path);
|
|
1530
1530
|
} else {
|
|
1531
|
-
const fullpath = [...
|
|
1531
|
+
const fullpath = [...path16, ...issue2.path];
|
|
1532
1532
|
if (fullpath.length === 0) {
|
|
1533
1533
|
result.errors.push(mapper(issue2));
|
|
1534
1534
|
continue;
|
|
@@ -1560,8 +1560,8 @@ function treeifyError(error43, _mapper) {
|
|
|
1560
1560
|
}
|
|
1561
1561
|
function toDotPath(_path) {
|
|
1562
1562
|
const segs = [];
|
|
1563
|
-
const
|
|
1564
|
-
for (const seg of
|
|
1563
|
+
const path16 = _path.map((seg) => typeof seg === "object" ? seg.key : seg);
|
|
1564
|
+
for (const seg of path16) {
|
|
1565
1565
|
if (typeof seg === "number")
|
|
1566
1566
|
segs.push(`[${seg}]`);
|
|
1567
1567
|
else if (typeof seg === "symbol")
|
|
@@ -2760,7 +2760,7 @@ var $ZodBase64 = /* @__PURE__ */ $constructor("$ZodBase64", (inst, def) => {
|
|
|
2760
2760
|
function isValidBase64URL(data) {
|
|
2761
2761
|
if (!base64url.test(data))
|
|
2762
2762
|
return false;
|
|
2763
|
-
const base643 = data.replace(/[-_]/g, (
|
|
2763
|
+
const base643 = data.replace(/[-_]/g, (c16) => c16 === "-" ? "+" : "/");
|
|
2764
2764
|
const padded = base643.padEnd(Math.ceil(base643.length / 4) * 4, "=");
|
|
2765
2765
|
return isValidBase64(padded);
|
|
2766
2766
|
}
|
|
@@ -11672,9 +11672,9 @@ var ZodDate = /* @__PURE__ */ $constructor("ZodDate", (inst, def) => {
|
|
|
11672
11672
|
ZodType.init(inst, def);
|
|
11673
11673
|
inst.min = (value, params) => inst.check(_gte(value, params));
|
|
11674
11674
|
inst.max = (value, params) => inst.check(_lte(value, params));
|
|
11675
|
-
const
|
|
11676
|
-
inst.minDate =
|
|
11677
|
-
inst.maxDate =
|
|
11675
|
+
const c16 = inst._zod.bag;
|
|
11676
|
+
inst.minDate = c16.minimum ? new Date(c16.minimum) : null;
|
|
11677
|
+
inst.maxDate = c16.maximum ? new Date(c16.maximum) : null;
|
|
11678
11678
|
});
|
|
11679
11679
|
function date3(params) {
|
|
11680
11680
|
return _date(ZodDate, params);
|
|
@@ -12448,6 +12448,33 @@ var composesVersionsContract = c.router({
|
|
|
12448
12448
|
summary: "Resolve version specifier to full version ID"
|
|
12449
12449
|
}
|
|
12450
12450
|
});
|
|
12451
|
+
var composeListItemSchema = external_exports.object({
|
|
12452
|
+
name: external_exports.string(),
|
|
12453
|
+
headVersionId: external_exports.string().nullable(),
|
|
12454
|
+
updatedAt: external_exports.string()
|
|
12455
|
+
});
|
|
12456
|
+
var composesListContract = c.router({
|
|
12457
|
+
/**
|
|
12458
|
+
* GET /api/agent/composes/list?scope={scope}
|
|
12459
|
+
* List all agent composes for a scope
|
|
12460
|
+
* If scope is not provided, uses the authenticated user's default scope
|
|
12461
|
+
*/
|
|
12462
|
+
list: {
|
|
12463
|
+
method: "GET",
|
|
12464
|
+
path: "/api/agent/composes/list",
|
|
12465
|
+
query: external_exports.object({
|
|
12466
|
+
scope: external_exports.string().optional()
|
|
12467
|
+
}),
|
|
12468
|
+
responses: {
|
|
12469
|
+
200: external_exports.object({
|
|
12470
|
+
composes: external_exports.array(composeListItemSchema)
|
|
12471
|
+
}),
|
|
12472
|
+
400: apiErrorSchema,
|
|
12473
|
+
401: apiErrorSchema
|
|
12474
|
+
},
|
|
12475
|
+
summary: "List all agent composes for a scope"
|
|
12476
|
+
}
|
|
12477
|
+
});
|
|
12451
12478
|
|
|
12452
12479
|
// ../../packages/core/src/contracts/runs.ts
|
|
12453
12480
|
var c2 = initContract();
|
|
@@ -13598,7 +13625,9 @@ var executionContextSchema = external_exports.object({
|
|
|
13598
13625
|
environment: external_exports.record(external_exports.string(), external_exports.string()).nullable(),
|
|
13599
13626
|
resumeSession: resumeSessionSchema.nullable(),
|
|
13600
13627
|
secretValues: external_exports.array(external_exports.string()).nullable(),
|
|
13601
|
-
cliAgentType: external_exports.string()
|
|
13628
|
+
cliAgentType: external_exports.string(),
|
|
13629
|
+
// Network security mode flag
|
|
13630
|
+
experimentalNetworkSecurity: external_exports.boolean().optional()
|
|
13602
13631
|
});
|
|
13603
13632
|
var runnersJobClaimContract = c10.router({
|
|
13604
13633
|
claim: {
|
|
@@ -13623,6 +13652,913 @@ var runnersJobClaimContract = c10.router({
|
|
|
13623
13652
|
}
|
|
13624
13653
|
});
|
|
13625
13654
|
|
|
13655
|
+
// ../../packages/core/src/contracts/public/common.ts
|
|
13656
|
+
var publicApiErrorTypeSchema = external_exports.enum([
|
|
13657
|
+
"api_error",
|
|
13658
|
+
// Internal server error (5xx)
|
|
13659
|
+
"invalid_request_error",
|
|
13660
|
+
// Bad parameters (400)
|
|
13661
|
+
"authentication_error",
|
|
13662
|
+
// Auth failure (401)
|
|
13663
|
+
"not_found_error",
|
|
13664
|
+
// Resource missing (404)
|
|
13665
|
+
"conflict_error"
|
|
13666
|
+
// Resource conflict (409)
|
|
13667
|
+
]);
|
|
13668
|
+
var publicApiErrorSchema = external_exports.object({
|
|
13669
|
+
error: external_exports.object({
|
|
13670
|
+
type: publicApiErrorTypeSchema,
|
|
13671
|
+
code: external_exports.string(),
|
|
13672
|
+
message: external_exports.string(),
|
|
13673
|
+
param: external_exports.string().optional(),
|
|
13674
|
+
doc_url: external_exports.string().url().optional()
|
|
13675
|
+
})
|
|
13676
|
+
});
|
|
13677
|
+
var paginationSchema = external_exports.object({
|
|
13678
|
+
has_more: external_exports.boolean(),
|
|
13679
|
+
next_cursor: external_exports.string().nullable()
|
|
13680
|
+
});
|
|
13681
|
+
function createPaginatedResponseSchema(dataSchema) {
|
|
13682
|
+
return external_exports.object({
|
|
13683
|
+
data: external_exports.array(dataSchema),
|
|
13684
|
+
pagination: paginationSchema
|
|
13685
|
+
});
|
|
13686
|
+
}
|
|
13687
|
+
var listQuerySchema = external_exports.object({
|
|
13688
|
+
cursor: external_exports.string().optional(),
|
|
13689
|
+
limit: external_exports.coerce.number().min(1).max(100).default(20)
|
|
13690
|
+
});
|
|
13691
|
+
var requestIdSchema = external_exports.string().uuid();
|
|
13692
|
+
var timestampSchema = external_exports.string().datetime();
|
|
13693
|
+
|
|
13694
|
+
// ../../packages/core/src/contracts/public/agents.ts
|
|
13695
|
+
var c11 = initContract();
|
|
13696
|
+
var publicAgentSchema = external_exports.object({
|
|
13697
|
+
id: external_exports.string(),
|
|
13698
|
+
name: external_exports.string(),
|
|
13699
|
+
current_version_id: external_exports.string().nullable(),
|
|
13700
|
+
created_at: timestampSchema,
|
|
13701
|
+
updated_at: timestampSchema
|
|
13702
|
+
});
|
|
13703
|
+
var agentVersionSchema = external_exports.object({
|
|
13704
|
+
id: external_exports.string(),
|
|
13705
|
+
agent_id: external_exports.string(),
|
|
13706
|
+
version_number: external_exports.number(),
|
|
13707
|
+
config: external_exports.unknown(),
|
|
13708
|
+
// Agent YAML configuration
|
|
13709
|
+
created_at: timestampSchema
|
|
13710
|
+
});
|
|
13711
|
+
var publicAgentDetailSchema = publicAgentSchema.extend({
|
|
13712
|
+
config: external_exports.unknown().optional()
|
|
13713
|
+
});
|
|
13714
|
+
var paginatedAgentsSchema = createPaginatedResponseSchema(publicAgentSchema);
|
|
13715
|
+
var paginatedAgentVersionsSchema = createPaginatedResponseSchema(agentVersionSchema);
|
|
13716
|
+
var createAgentRequestSchema = external_exports.object({
|
|
13717
|
+
name: external_exports.string().min(1).max(100).regex(
|
|
13718
|
+
/^[a-z0-9][a-z0-9-]*[a-z0-9]$|^[a-z0-9]$/,
|
|
13719
|
+
"Name must be lowercase alphanumeric with hyphens, not starting or ending with hyphen"
|
|
13720
|
+
),
|
|
13721
|
+
config: external_exports.unknown()
|
|
13722
|
+
// Agent YAML configuration
|
|
13723
|
+
});
|
|
13724
|
+
var updateAgentRequestSchema = external_exports.object({
|
|
13725
|
+
config: external_exports.unknown()
|
|
13726
|
+
// New agent configuration (creates new version)
|
|
13727
|
+
});
|
|
13728
|
+
var publicAgentsListContract = c11.router({
|
|
13729
|
+
list: {
|
|
13730
|
+
method: "GET",
|
|
13731
|
+
path: "/v1/agents",
|
|
13732
|
+
query: listQuerySchema,
|
|
13733
|
+
responses: {
|
|
13734
|
+
200: paginatedAgentsSchema,
|
|
13735
|
+
401: publicApiErrorSchema,
|
|
13736
|
+
500: publicApiErrorSchema
|
|
13737
|
+
},
|
|
13738
|
+
summary: "List agents",
|
|
13739
|
+
description: "List all agents in the current scope with pagination"
|
|
13740
|
+
},
|
|
13741
|
+
create: {
|
|
13742
|
+
method: "POST",
|
|
13743
|
+
path: "/v1/agents",
|
|
13744
|
+
body: createAgentRequestSchema,
|
|
13745
|
+
responses: {
|
|
13746
|
+
201: publicAgentDetailSchema,
|
|
13747
|
+
400: publicApiErrorSchema,
|
|
13748
|
+
401: publicApiErrorSchema,
|
|
13749
|
+
409: publicApiErrorSchema,
|
|
13750
|
+
500: publicApiErrorSchema
|
|
13751
|
+
},
|
|
13752
|
+
summary: "Create agent",
|
|
13753
|
+
description: "Create a new agent with the given configuration"
|
|
13754
|
+
}
|
|
13755
|
+
});
|
|
13756
|
+
var publicAgentByIdContract = c11.router({
|
|
13757
|
+
get: {
|
|
13758
|
+
method: "GET",
|
|
13759
|
+
path: "/v1/agents/:id",
|
|
13760
|
+
pathParams: external_exports.object({
|
|
13761
|
+
id: external_exports.string().min(1, "Agent ID is required")
|
|
13762
|
+
}),
|
|
13763
|
+
responses: {
|
|
13764
|
+
200: publicAgentDetailSchema,
|
|
13765
|
+
401: publicApiErrorSchema,
|
|
13766
|
+
404: publicApiErrorSchema,
|
|
13767
|
+
500: publicApiErrorSchema
|
|
13768
|
+
},
|
|
13769
|
+
summary: "Get agent",
|
|
13770
|
+
description: "Get agent details by ID"
|
|
13771
|
+
},
|
|
13772
|
+
update: {
|
|
13773
|
+
method: "PUT",
|
|
13774
|
+
path: "/v1/agents/:id",
|
|
13775
|
+
pathParams: external_exports.object({
|
|
13776
|
+
id: external_exports.string().min(1, "Agent ID is required")
|
|
13777
|
+
}),
|
|
13778
|
+
body: updateAgentRequestSchema,
|
|
13779
|
+
responses: {
|
|
13780
|
+
200: publicAgentDetailSchema,
|
|
13781
|
+
400: publicApiErrorSchema,
|
|
13782
|
+
401: publicApiErrorSchema,
|
|
13783
|
+
404: publicApiErrorSchema,
|
|
13784
|
+
500: publicApiErrorSchema
|
|
13785
|
+
},
|
|
13786
|
+
summary: "Update agent",
|
|
13787
|
+
description: "Update agent configuration. Creates a new version if config changes."
|
|
13788
|
+
},
|
|
13789
|
+
delete: {
|
|
13790
|
+
method: "DELETE",
|
|
13791
|
+
path: "/v1/agents/:id",
|
|
13792
|
+
pathParams: external_exports.object({
|
|
13793
|
+
id: external_exports.string().min(1, "Agent ID is required")
|
|
13794
|
+
}),
|
|
13795
|
+
body: external_exports.undefined(),
|
|
13796
|
+
responses: {
|
|
13797
|
+
204: external_exports.undefined(),
|
|
13798
|
+
401: publicApiErrorSchema,
|
|
13799
|
+
404: publicApiErrorSchema,
|
|
13800
|
+
500: publicApiErrorSchema
|
|
13801
|
+
},
|
|
13802
|
+
summary: "Delete agent",
|
|
13803
|
+
description: "Archive an agent (soft delete)"
|
|
13804
|
+
}
|
|
13805
|
+
});
|
|
13806
|
+
var publicAgentVersionsContract = c11.router({
|
|
13807
|
+
list: {
|
|
13808
|
+
method: "GET",
|
|
13809
|
+
path: "/v1/agents/:id/versions",
|
|
13810
|
+
pathParams: external_exports.object({
|
|
13811
|
+
id: external_exports.string().min(1, "Agent ID is required")
|
|
13812
|
+
}),
|
|
13813
|
+
query: listQuerySchema,
|
|
13814
|
+
responses: {
|
|
13815
|
+
200: paginatedAgentVersionsSchema,
|
|
13816
|
+
401: publicApiErrorSchema,
|
|
13817
|
+
404: publicApiErrorSchema,
|
|
13818
|
+
500: publicApiErrorSchema
|
|
13819
|
+
},
|
|
13820
|
+
summary: "List agent versions",
|
|
13821
|
+
description: "List all versions of an agent with pagination"
|
|
13822
|
+
}
|
|
13823
|
+
});
|
|
13824
|
+
|
|
13825
|
+
// ../../packages/core/src/contracts/public/runs.ts
|
|
13826
|
+
var c12 = initContract();
|
|
13827
|
+
var publicRunStatusSchema = external_exports.enum([
|
|
13828
|
+
"pending",
|
|
13829
|
+
"running",
|
|
13830
|
+
"completed",
|
|
13831
|
+
"failed",
|
|
13832
|
+
"timeout",
|
|
13833
|
+
"cancelled"
|
|
13834
|
+
]);
|
|
13835
|
+
var publicRunSchema = external_exports.object({
|
|
13836
|
+
id: external_exports.string(),
|
|
13837
|
+
agent_id: external_exports.string(),
|
|
13838
|
+
agent_name: external_exports.string(),
|
|
13839
|
+
status: publicRunStatusSchema,
|
|
13840
|
+
prompt: external_exports.string(),
|
|
13841
|
+
created_at: timestampSchema,
|
|
13842
|
+
started_at: timestampSchema.nullable(),
|
|
13843
|
+
completed_at: timestampSchema.nullable()
|
|
13844
|
+
});
|
|
13845
|
+
var publicRunDetailSchema = publicRunSchema.extend({
|
|
13846
|
+
output: external_exports.string().nullable(),
|
|
13847
|
+
error: external_exports.string().nullable(),
|
|
13848
|
+
execution_time_ms: external_exports.number().nullable(),
|
|
13849
|
+
checkpoint_id: external_exports.string().nullable(),
|
|
13850
|
+
session_id: external_exports.string().nullable(),
|
|
13851
|
+
artifacts: external_exports.record(external_exports.string(), external_exports.string()).optional(),
|
|
13852
|
+
volumes: external_exports.record(external_exports.string(), external_exports.string()).optional()
|
|
13853
|
+
});
|
|
13854
|
+
var paginatedRunsSchema = createPaginatedResponseSchema(publicRunSchema);
|
|
13855
|
+
var createRunRequestSchema = external_exports.object({
|
|
13856
|
+
// Agent identification (one of: agent, agent_id, session_id, checkpoint_id)
|
|
13857
|
+
agent: external_exports.string().optional(),
|
|
13858
|
+
// Agent name
|
|
13859
|
+
agent_id: external_exports.string().optional(),
|
|
13860
|
+
// Agent ID
|
|
13861
|
+
agent_version: external_exports.string().optional(),
|
|
13862
|
+
// Version specifier (e.g., "latest", "v1", specific ID)
|
|
13863
|
+
// Continue session
|
|
13864
|
+
session_id: external_exports.string().optional(),
|
|
13865
|
+
// Resume from checkpoint
|
|
13866
|
+
checkpoint_id: external_exports.string().optional(),
|
|
13867
|
+
// Required
|
|
13868
|
+
prompt: external_exports.string().min(1, "Prompt is required"),
|
|
13869
|
+
// Optional configuration
|
|
13870
|
+
variables: external_exports.record(external_exports.string(), external_exports.string()).optional(),
|
|
13871
|
+
secrets: external_exports.record(external_exports.string(), external_exports.string()).optional(),
|
|
13872
|
+
artifacts: external_exports.record(external_exports.string(), external_exports.string()).optional(),
|
|
13873
|
+
// artifact_name -> version
|
|
13874
|
+
volumes: external_exports.record(external_exports.string(), external_exports.string()).optional()
|
|
13875
|
+
// volume_name -> version
|
|
13876
|
+
});
|
|
13877
|
+
var runListQuerySchema = listQuerySchema.extend({
|
|
13878
|
+
agent_id: external_exports.string().optional(),
|
|
13879
|
+
status: publicRunStatusSchema.optional(),
|
|
13880
|
+
since: timestampSchema.optional()
|
|
13881
|
+
});
|
|
13882
|
+
var publicRunsListContract = c12.router({
|
|
13883
|
+
list: {
|
|
13884
|
+
method: "GET",
|
|
13885
|
+
path: "/v1/runs",
|
|
13886
|
+
query: runListQuerySchema,
|
|
13887
|
+
responses: {
|
|
13888
|
+
200: paginatedRunsSchema,
|
|
13889
|
+
401: publicApiErrorSchema,
|
|
13890
|
+
500: publicApiErrorSchema
|
|
13891
|
+
},
|
|
13892
|
+
summary: "List runs",
|
|
13893
|
+
description: "List runs with optional filtering by agent, status, and time"
|
|
13894
|
+
},
|
|
13895
|
+
create: {
|
|
13896
|
+
method: "POST",
|
|
13897
|
+
path: "/v1/runs",
|
|
13898
|
+
body: createRunRequestSchema,
|
|
13899
|
+
responses: {
|
|
13900
|
+
202: publicRunDetailSchema,
|
|
13901
|
+
// Async operation
|
|
13902
|
+
400: publicApiErrorSchema,
|
|
13903
|
+
401: publicApiErrorSchema,
|
|
13904
|
+
404: publicApiErrorSchema,
|
|
13905
|
+
500: publicApiErrorSchema
|
|
13906
|
+
},
|
|
13907
|
+
summary: "Create run",
|
|
13908
|
+
description: "Create and execute a new agent run. Returns 202 Accepted as runs execute asynchronously."
|
|
13909
|
+
}
|
|
13910
|
+
});
|
|
13911
|
+
var publicRunByIdContract = c12.router({
|
|
13912
|
+
get: {
|
|
13913
|
+
method: "GET",
|
|
13914
|
+
path: "/v1/runs/:id",
|
|
13915
|
+
pathParams: external_exports.object({
|
|
13916
|
+
id: external_exports.string().min(1, "Run ID is required")
|
|
13917
|
+
}),
|
|
13918
|
+
responses: {
|
|
13919
|
+
200: publicRunDetailSchema,
|
|
13920
|
+
401: publicApiErrorSchema,
|
|
13921
|
+
404: publicApiErrorSchema,
|
|
13922
|
+
500: publicApiErrorSchema
|
|
13923
|
+
},
|
|
13924
|
+
summary: "Get run",
|
|
13925
|
+
description: "Get run details by ID"
|
|
13926
|
+
}
|
|
13927
|
+
});
|
|
13928
|
+
var publicRunCancelContract = c12.router({
|
|
13929
|
+
cancel: {
|
|
13930
|
+
method: "POST",
|
|
13931
|
+
path: "/v1/runs/:id/cancel",
|
|
13932
|
+
pathParams: external_exports.object({
|
|
13933
|
+
id: external_exports.string().min(1, "Run ID is required")
|
|
13934
|
+
}),
|
|
13935
|
+
body: external_exports.undefined(),
|
|
13936
|
+
responses: {
|
|
13937
|
+
200: publicRunDetailSchema,
|
|
13938
|
+
400: publicApiErrorSchema,
|
|
13939
|
+
// Run not in cancellable state
|
|
13940
|
+
401: publicApiErrorSchema,
|
|
13941
|
+
404: publicApiErrorSchema,
|
|
13942
|
+
500: publicApiErrorSchema
|
|
13943
|
+
},
|
|
13944
|
+
summary: "Cancel run",
|
|
13945
|
+
description: "Cancel a pending or running execution"
|
|
13946
|
+
}
|
|
13947
|
+
});
|
|
13948
|
+
var logEntrySchema = external_exports.object({
|
|
13949
|
+
timestamp: timestampSchema,
|
|
13950
|
+
type: external_exports.enum(["agent", "system", "network"]),
|
|
13951
|
+
level: external_exports.enum(["debug", "info", "warn", "error"]),
|
|
13952
|
+
message: external_exports.string(),
|
|
13953
|
+
metadata: external_exports.record(external_exports.string(), external_exports.unknown()).optional()
|
|
13954
|
+
});
|
|
13955
|
+
var paginatedLogsSchema = createPaginatedResponseSchema(logEntrySchema);
|
|
13956
|
+
var logsQuerySchema = listQuerySchema.extend({
|
|
13957
|
+
type: external_exports.enum(["agent", "system", "network", "all"]).default("all"),
|
|
13958
|
+
since: timestampSchema.optional(),
|
|
13959
|
+
until: timestampSchema.optional(),
|
|
13960
|
+
order: external_exports.enum(["asc", "desc"]).default("asc")
|
|
13961
|
+
});
|
|
13962
|
+
var publicRunLogsContract = c12.router({
|
|
13963
|
+
getLogs: {
|
|
13964
|
+
method: "GET",
|
|
13965
|
+
path: "/v1/runs/:id/logs",
|
|
13966
|
+
pathParams: external_exports.object({
|
|
13967
|
+
id: external_exports.string().min(1, "Run ID is required")
|
|
13968
|
+
}),
|
|
13969
|
+
query: logsQuerySchema,
|
|
13970
|
+
responses: {
|
|
13971
|
+
200: paginatedLogsSchema,
|
|
13972
|
+
401: publicApiErrorSchema,
|
|
13973
|
+
404: publicApiErrorSchema,
|
|
13974
|
+
500: publicApiErrorSchema
|
|
13975
|
+
},
|
|
13976
|
+
summary: "Get run logs",
|
|
13977
|
+
description: "Get unified logs for a run. Combines agent, system, and network logs."
|
|
13978
|
+
}
|
|
13979
|
+
});
|
|
13980
|
+
var metricPointSchema = external_exports.object({
|
|
13981
|
+
timestamp: timestampSchema,
|
|
13982
|
+
cpu_percent: external_exports.number(),
|
|
13983
|
+
memory_used_mb: external_exports.number(),
|
|
13984
|
+
memory_total_mb: external_exports.number(),
|
|
13985
|
+
disk_used_mb: external_exports.number(),
|
|
13986
|
+
disk_total_mb: external_exports.number()
|
|
13987
|
+
});
|
|
13988
|
+
var metricsSummarySchema = external_exports.object({
|
|
13989
|
+
avg_cpu_percent: external_exports.number(),
|
|
13990
|
+
max_memory_used_mb: external_exports.number(),
|
|
13991
|
+
total_duration_ms: external_exports.number().nullable()
|
|
13992
|
+
});
|
|
13993
|
+
var metricsResponseSchema2 = external_exports.object({
|
|
13994
|
+
data: external_exports.array(metricPointSchema),
|
|
13995
|
+
summary: metricsSummarySchema
|
|
13996
|
+
});
|
|
13997
|
+
var publicRunMetricsContract = c12.router({
|
|
13998
|
+
getMetrics: {
|
|
13999
|
+
method: "GET",
|
|
14000
|
+
path: "/v1/runs/:id/metrics",
|
|
14001
|
+
pathParams: external_exports.object({
|
|
14002
|
+
id: external_exports.string().min(1, "Run ID is required")
|
|
14003
|
+
}),
|
|
14004
|
+
responses: {
|
|
14005
|
+
200: metricsResponseSchema2,
|
|
14006
|
+
401: publicApiErrorSchema,
|
|
14007
|
+
404: publicApiErrorSchema,
|
|
14008
|
+
500: publicApiErrorSchema
|
|
14009
|
+
},
|
|
14010
|
+
summary: "Get run metrics",
|
|
14011
|
+
description: "Get CPU, memory, and disk metrics for a run"
|
|
14012
|
+
}
|
|
14013
|
+
});
|
|
14014
|
+
var sseEventTypeSchema = external_exports.enum([
|
|
14015
|
+
"status",
|
|
14016
|
+
// Run status change
|
|
14017
|
+
"output",
|
|
14018
|
+
// Agent output
|
|
14019
|
+
"error",
|
|
14020
|
+
// Error occurred
|
|
14021
|
+
"complete",
|
|
14022
|
+
// Run completed
|
|
14023
|
+
"heartbeat"
|
|
14024
|
+
// Keep-alive
|
|
14025
|
+
]);
|
|
14026
|
+
var sseEventSchema = external_exports.object({
|
|
14027
|
+
event: sseEventTypeSchema,
|
|
14028
|
+
data: external_exports.unknown(),
|
|
14029
|
+
id: external_exports.string().optional()
|
|
14030
|
+
// For Last-Event-ID reconnection
|
|
14031
|
+
});
|
|
14032
|
+
var publicRunEventsContract = c12.router({
|
|
14033
|
+
streamEvents: {
|
|
14034
|
+
method: "GET",
|
|
14035
|
+
path: "/v1/runs/:id/events",
|
|
14036
|
+
pathParams: external_exports.object({
|
|
14037
|
+
id: external_exports.string().min(1, "Run ID is required")
|
|
14038
|
+
}),
|
|
14039
|
+
query: external_exports.object({
|
|
14040
|
+
last_event_id: external_exports.string().optional()
|
|
14041
|
+
// For reconnection
|
|
14042
|
+
}),
|
|
14043
|
+
responses: {
|
|
14044
|
+
200: external_exports.any(),
|
|
14045
|
+
// SSE stream - actual content is text/event-stream
|
|
14046
|
+
401: publicApiErrorSchema,
|
|
14047
|
+
404: publicApiErrorSchema,
|
|
14048
|
+
500: publicApiErrorSchema
|
|
14049
|
+
},
|
|
14050
|
+
summary: "Stream run events",
|
|
14051
|
+
description: "Stream real-time events for a run using Server-Sent Events (SSE). Set Accept: text/event-stream header."
|
|
14052
|
+
}
|
|
14053
|
+
});
|
|
14054
|
+
|
|
14055
|
+
// ../../packages/core/src/contracts/public/artifacts.ts
|
|
14056
|
+
var c13 = initContract();
|
|
14057
|
+
var publicArtifactSchema = external_exports.object({
|
|
14058
|
+
id: external_exports.string(),
|
|
14059
|
+
name: external_exports.string(),
|
|
14060
|
+
current_version_id: external_exports.string().nullable(),
|
|
14061
|
+
size: external_exports.number(),
|
|
14062
|
+
// Total size in bytes
|
|
14063
|
+
file_count: external_exports.number(),
|
|
14064
|
+
created_at: timestampSchema,
|
|
14065
|
+
updated_at: timestampSchema
|
|
14066
|
+
});
|
|
14067
|
+
var artifactVersionSchema = external_exports.object({
|
|
14068
|
+
id: external_exports.string(),
|
|
14069
|
+
// SHA-256 content hash
|
|
14070
|
+
artifact_id: external_exports.string(),
|
|
14071
|
+
size: external_exports.number(),
|
|
14072
|
+
// Size in bytes
|
|
14073
|
+
file_count: external_exports.number(),
|
|
14074
|
+
message: external_exports.string().nullable(),
|
|
14075
|
+
// Optional commit message
|
|
14076
|
+
created_by: external_exports.string(),
|
|
14077
|
+
created_at: timestampSchema
|
|
14078
|
+
});
|
|
14079
|
+
var publicArtifactDetailSchema = publicArtifactSchema.extend({
|
|
14080
|
+
current_version: artifactVersionSchema.nullable()
|
|
14081
|
+
});
|
|
14082
|
+
var paginatedArtifactsSchema = createPaginatedResponseSchema(publicArtifactSchema);
|
|
14083
|
+
var paginatedArtifactVersionsSchema = createPaginatedResponseSchema(
|
|
14084
|
+
artifactVersionSchema
|
|
14085
|
+
);
|
|
14086
|
+
var createArtifactRequestSchema = external_exports.object({
|
|
14087
|
+
name: external_exports.string().min(1).max(100).regex(
|
|
14088
|
+
/^[a-z0-9][a-z0-9-]*[a-z0-9]$|^[a-z0-9]$/,
|
|
14089
|
+
"Name must be lowercase alphanumeric with hyphens, not starting or ending with hyphen"
|
|
14090
|
+
)
|
|
14091
|
+
});
|
|
14092
|
+
var fileEntrySchema = external_exports.object({
|
|
14093
|
+
path: external_exports.string(),
|
|
14094
|
+
size: external_exports.number(),
|
|
14095
|
+
hash: external_exports.string().optional()
|
|
14096
|
+
// SHA-256 hash of file content
|
|
14097
|
+
});
|
|
14098
|
+
var prepareUploadRequestSchema = external_exports.object({
|
|
14099
|
+
files: external_exports.array(fileEntrySchema),
|
|
14100
|
+
message: external_exports.string().optional()
|
|
14101
|
+
// Optional commit message
|
|
14102
|
+
});
|
|
14103
|
+
var presignedUploadSchema2 = external_exports.object({
|
|
14104
|
+
path: external_exports.string(),
|
|
14105
|
+
upload_url: external_exports.string(),
|
|
14106
|
+
// Presigned S3 URL
|
|
14107
|
+
upload_id: external_exports.string()
|
|
14108
|
+
// For multi-part uploads
|
|
14109
|
+
});
|
|
14110
|
+
var prepareUploadResponseSchema = external_exports.object({
|
|
14111
|
+
upload_session_id: external_exports.string(),
|
|
14112
|
+
files: external_exports.array(presignedUploadSchema2),
|
|
14113
|
+
expires_at: timestampSchema
|
|
14114
|
+
});
|
|
14115
|
+
var commitUploadRequestSchema = external_exports.object({
|
|
14116
|
+
upload_session_id: external_exports.string(),
|
|
14117
|
+
message: external_exports.string().optional()
|
|
14118
|
+
});
|
|
14119
|
+
var downloadResponseSchema = external_exports.object({
|
|
14120
|
+
version_id: external_exports.string(),
|
|
14121
|
+
files: external_exports.array(
|
|
14122
|
+
external_exports.object({
|
|
14123
|
+
path: external_exports.string(),
|
|
14124
|
+
size: external_exports.number(),
|
|
14125
|
+
download_url: external_exports.string()
|
|
14126
|
+
// Presigned S3 URL
|
|
14127
|
+
})
|
|
14128
|
+
),
|
|
14129
|
+
expires_at: timestampSchema
|
|
14130
|
+
});
|
|
14131
|
+
var publicArtifactsListContract = c13.router({
|
|
14132
|
+
list: {
|
|
14133
|
+
method: "GET",
|
|
14134
|
+
path: "/v1/artifacts",
|
|
14135
|
+
query: listQuerySchema,
|
|
14136
|
+
responses: {
|
|
14137
|
+
200: paginatedArtifactsSchema,
|
|
14138
|
+
401: publicApiErrorSchema,
|
|
14139
|
+
500: publicApiErrorSchema
|
|
14140
|
+
},
|
|
14141
|
+
summary: "List artifacts",
|
|
14142
|
+
description: "List all artifacts in the current scope with pagination"
|
|
14143
|
+
},
|
|
14144
|
+
create: {
|
|
14145
|
+
method: "POST",
|
|
14146
|
+
path: "/v1/artifacts",
|
|
14147
|
+
body: createArtifactRequestSchema,
|
|
14148
|
+
responses: {
|
|
14149
|
+
201: publicArtifactDetailSchema,
|
|
14150
|
+
400: publicApiErrorSchema,
|
|
14151
|
+
401: publicApiErrorSchema,
|
|
14152
|
+
409: publicApiErrorSchema,
|
|
14153
|
+
500: publicApiErrorSchema
|
|
14154
|
+
},
|
|
14155
|
+
summary: "Create artifact",
|
|
14156
|
+
description: "Create a new empty artifact container"
|
|
14157
|
+
}
|
|
14158
|
+
});
|
|
14159
|
+
var publicArtifactByIdContract = c13.router({
|
|
14160
|
+
get: {
|
|
14161
|
+
method: "GET",
|
|
14162
|
+
path: "/v1/artifacts/:id",
|
|
14163
|
+
pathParams: external_exports.object({
|
|
14164
|
+
id: external_exports.string().min(1, "Artifact ID is required")
|
|
14165
|
+
}),
|
|
14166
|
+
responses: {
|
|
14167
|
+
200: publicArtifactDetailSchema,
|
|
14168
|
+
401: publicApiErrorSchema,
|
|
14169
|
+
404: publicApiErrorSchema,
|
|
14170
|
+
500: publicApiErrorSchema
|
|
14171
|
+
},
|
|
14172
|
+
summary: "Get artifact",
|
|
14173
|
+
description: "Get artifact details by ID"
|
|
14174
|
+
},
|
|
14175
|
+
delete: {
|
|
14176
|
+
method: "DELETE",
|
|
14177
|
+
path: "/v1/artifacts/:id",
|
|
14178
|
+
pathParams: external_exports.object({
|
|
14179
|
+
id: external_exports.string().min(1, "Artifact ID is required")
|
|
14180
|
+
}),
|
|
14181
|
+
body: external_exports.undefined(),
|
|
14182
|
+
responses: {
|
|
14183
|
+
204: external_exports.undefined(),
|
|
14184
|
+
401: publicApiErrorSchema,
|
|
14185
|
+
404: publicApiErrorSchema,
|
|
14186
|
+
500: publicApiErrorSchema
|
|
14187
|
+
},
|
|
14188
|
+
summary: "Delete artifact",
|
|
14189
|
+
description: "Delete an artifact and all its versions"
|
|
14190
|
+
}
|
|
14191
|
+
});
|
|
14192
|
+
var publicArtifactVersionsContract = c13.router({
|
|
14193
|
+
list: {
|
|
14194
|
+
method: "GET",
|
|
14195
|
+
path: "/v1/artifacts/:id/versions",
|
|
14196
|
+
pathParams: external_exports.object({
|
|
14197
|
+
id: external_exports.string().min(1, "Artifact ID is required")
|
|
14198
|
+
}),
|
|
14199
|
+
query: listQuerySchema,
|
|
14200
|
+
responses: {
|
|
14201
|
+
200: paginatedArtifactVersionsSchema,
|
|
14202
|
+
401: publicApiErrorSchema,
|
|
14203
|
+
404: publicApiErrorSchema,
|
|
14204
|
+
500: publicApiErrorSchema
|
|
14205
|
+
},
|
|
14206
|
+
summary: "List artifact versions",
|
|
14207
|
+
description: "List all versions of an artifact with pagination"
|
|
14208
|
+
}
|
|
14209
|
+
});
|
|
14210
|
+
var publicArtifactUploadContract = c13.router({
|
|
14211
|
+
prepareUpload: {
|
|
14212
|
+
method: "POST",
|
|
14213
|
+
path: "/v1/artifacts/:id/upload",
|
|
14214
|
+
pathParams: external_exports.object({
|
|
14215
|
+
id: external_exports.string().min(1, "Artifact ID is required")
|
|
14216
|
+
}),
|
|
14217
|
+
body: prepareUploadRequestSchema,
|
|
14218
|
+
responses: {
|
|
14219
|
+
200: prepareUploadResponseSchema,
|
|
14220
|
+
400: publicApiErrorSchema,
|
|
14221
|
+
401: publicApiErrorSchema,
|
|
14222
|
+
404: publicApiErrorSchema,
|
|
14223
|
+
500: publicApiErrorSchema
|
|
14224
|
+
},
|
|
14225
|
+
summary: "Prepare artifact upload",
|
|
14226
|
+
description: "Get presigned URLs for direct S3 upload. Returns upload URLs for each file."
|
|
14227
|
+
}
|
|
14228
|
+
});
|
|
14229
|
+
var publicArtifactCommitContract = c13.router({
|
|
14230
|
+
commitUpload: {
|
|
14231
|
+
method: "POST",
|
|
14232
|
+
path: "/v1/artifacts/:id/commit",
|
|
14233
|
+
pathParams: external_exports.object({
|
|
14234
|
+
id: external_exports.string().min(1, "Artifact ID is required")
|
|
14235
|
+
}),
|
|
14236
|
+
body: commitUploadRequestSchema,
|
|
14237
|
+
responses: {
|
|
14238
|
+
200: artifactVersionSchema,
|
|
14239
|
+
400: publicApiErrorSchema,
|
|
14240
|
+
401: publicApiErrorSchema,
|
|
14241
|
+
404: publicApiErrorSchema,
|
|
14242
|
+
500: publicApiErrorSchema
|
|
14243
|
+
},
|
|
14244
|
+
summary: "Commit artifact upload",
|
|
14245
|
+
description: "Finalize an upload session and create a new artifact version."
|
|
14246
|
+
}
|
|
14247
|
+
});
|
|
14248
|
+
var publicArtifactDownloadContract = c13.router({
|
|
14249
|
+
download: {
|
|
14250
|
+
method: "GET",
|
|
14251
|
+
path: "/v1/artifacts/:id/download",
|
|
14252
|
+
pathParams: external_exports.object({
|
|
14253
|
+
id: external_exports.string().min(1, "Artifact ID is required")
|
|
14254
|
+
}),
|
|
14255
|
+
query: external_exports.object({
|
|
14256
|
+
version_id: external_exports.string().optional()
|
|
14257
|
+
// Defaults to current version
|
|
14258
|
+
}),
|
|
14259
|
+
responses: {
|
|
14260
|
+
200: downloadResponseSchema,
|
|
14261
|
+
401: publicApiErrorSchema,
|
|
14262
|
+
404: publicApiErrorSchema,
|
|
14263
|
+
500: publicApiErrorSchema
|
|
14264
|
+
},
|
|
14265
|
+
summary: "Download artifact",
|
|
14266
|
+
description: "Get presigned URLs for downloading artifact files. Defaults to current version."
|
|
14267
|
+
}
|
|
14268
|
+
});
|
|
14269
|
+
|
|
14270
|
+
// ../../packages/core/src/contracts/public/volumes.ts
|
|
14271
|
+
var c14 = initContract();
|
|
14272
|
+
var publicVolumeSchema = external_exports.object({
|
|
14273
|
+
id: external_exports.string(),
|
|
14274
|
+
name: external_exports.string(),
|
|
14275
|
+
current_version_id: external_exports.string().nullable(),
|
|
14276
|
+
size: external_exports.number(),
|
|
14277
|
+
// Total size in bytes
|
|
14278
|
+
file_count: external_exports.number(),
|
|
14279
|
+
created_at: timestampSchema,
|
|
14280
|
+
updated_at: timestampSchema
|
|
14281
|
+
});
|
|
14282
|
+
var volumeVersionSchema = external_exports.object({
|
|
14283
|
+
id: external_exports.string(),
|
|
14284
|
+
// SHA-256 content hash
|
|
14285
|
+
volume_id: external_exports.string(),
|
|
14286
|
+
size: external_exports.number(),
|
|
14287
|
+
// Size in bytes
|
|
14288
|
+
file_count: external_exports.number(),
|
|
14289
|
+
message: external_exports.string().nullable(),
|
|
14290
|
+
// Optional commit message
|
|
14291
|
+
created_by: external_exports.string(),
|
|
14292
|
+
created_at: timestampSchema
|
|
14293
|
+
});
|
|
14294
|
+
var publicVolumeDetailSchema = publicVolumeSchema.extend({
|
|
14295
|
+
current_version: volumeVersionSchema.nullable()
|
|
14296
|
+
});
|
|
14297
|
+
var paginatedVolumesSchema = createPaginatedResponseSchema(publicVolumeSchema);
|
|
14298
|
+
var paginatedVolumeVersionsSchema = createPaginatedResponseSchema(volumeVersionSchema);
|
|
14299
|
+
var createVolumeRequestSchema = external_exports.object({
|
|
14300
|
+
name: external_exports.string().min(1).max(100).regex(
|
|
14301
|
+
/^[a-z0-9][a-z0-9-]*[a-z0-9]$|^[a-z0-9]$/,
|
|
14302
|
+
"Name must be lowercase alphanumeric with hyphens, not starting or ending with hyphen"
|
|
14303
|
+
)
|
|
14304
|
+
});
|
|
14305
|
+
var fileEntrySchema2 = external_exports.object({
|
|
14306
|
+
path: external_exports.string(),
|
|
14307
|
+
size: external_exports.number(),
|
|
14308
|
+
hash: external_exports.string().optional()
|
|
14309
|
+
// SHA-256 hash of file content
|
|
14310
|
+
});
|
|
14311
|
+
var prepareUploadRequestSchema2 = external_exports.object({
|
|
14312
|
+
files: external_exports.array(fileEntrySchema2),
|
|
14313
|
+
message: external_exports.string().optional()
|
|
14314
|
+
// Optional commit message
|
|
14315
|
+
});
|
|
14316
|
+
var presignedUploadSchema3 = external_exports.object({
|
|
14317
|
+
path: external_exports.string(),
|
|
14318
|
+
upload_url: external_exports.string(),
|
|
14319
|
+
// Presigned S3 URL
|
|
14320
|
+
upload_id: external_exports.string()
|
|
14321
|
+
// For multi-part uploads
|
|
14322
|
+
});
|
|
14323
|
+
var prepareUploadResponseSchema2 = external_exports.object({
|
|
14324
|
+
upload_session_id: external_exports.string(),
|
|
14325
|
+
files: external_exports.array(presignedUploadSchema3),
|
|
14326
|
+
expires_at: timestampSchema
|
|
14327
|
+
});
|
|
14328
|
+
var commitUploadRequestSchema2 = external_exports.object({
|
|
14329
|
+
upload_session_id: external_exports.string(),
|
|
14330
|
+
message: external_exports.string().optional()
|
|
14331
|
+
});
|
|
14332
|
+
var downloadResponseSchema2 = external_exports.object({
|
|
14333
|
+
version_id: external_exports.string(),
|
|
14334
|
+
files: external_exports.array(
|
|
14335
|
+
external_exports.object({
|
|
14336
|
+
path: external_exports.string(),
|
|
14337
|
+
size: external_exports.number(),
|
|
14338
|
+
download_url: external_exports.string()
|
|
14339
|
+
// Presigned S3 URL
|
|
14340
|
+
})
|
|
14341
|
+
),
|
|
14342
|
+
expires_at: timestampSchema
|
|
14343
|
+
});
|
|
14344
|
+
var publicVolumesListContract = c14.router({
|
|
14345
|
+
list: {
|
|
14346
|
+
method: "GET",
|
|
14347
|
+
path: "/v1/volumes",
|
|
14348
|
+
query: listQuerySchema,
|
|
14349
|
+
responses: {
|
|
14350
|
+
200: paginatedVolumesSchema,
|
|
14351
|
+
401: publicApiErrorSchema,
|
|
14352
|
+
500: publicApiErrorSchema
|
|
14353
|
+
},
|
|
14354
|
+
summary: "List volumes",
|
|
14355
|
+
description: "List all volumes in the current scope with pagination"
|
|
14356
|
+
},
|
|
14357
|
+
create: {
|
|
14358
|
+
method: "POST",
|
|
14359
|
+
path: "/v1/volumes",
|
|
14360
|
+
body: createVolumeRequestSchema,
|
|
14361
|
+
responses: {
|
|
14362
|
+
201: publicVolumeDetailSchema,
|
|
14363
|
+
400: publicApiErrorSchema,
|
|
14364
|
+
401: publicApiErrorSchema,
|
|
14365
|
+
409: publicApiErrorSchema,
|
|
14366
|
+
500: publicApiErrorSchema
|
|
14367
|
+
},
|
|
14368
|
+
summary: "Create volume",
|
|
14369
|
+
description: "Create a new empty volume container"
|
|
14370
|
+
}
|
|
14371
|
+
});
|
|
14372
|
+
var publicVolumeByIdContract = c14.router({
|
|
14373
|
+
get: {
|
|
14374
|
+
method: "GET",
|
|
14375
|
+
path: "/v1/volumes/:id",
|
|
14376
|
+
pathParams: external_exports.object({
|
|
14377
|
+
id: external_exports.string().min(1, "Volume ID is required")
|
|
14378
|
+
}),
|
|
14379
|
+
responses: {
|
|
14380
|
+
200: publicVolumeDetailSchema,
|
|
14381
|
+
401: publicApiErrorSchema,
|
|
14382
|
+
404: publicApiErrorSchema,
|
|
14383
|
+
500: publicApiErrorSchema
|
|
14384
|
+
},
|
|
14385
|
+
summary: "Get volume",
|
|
14386
|
+
description: "Get volume details by ID"
|
|
14387
|
+
},
|
|
14388
|
+
delete: {
|
|
14389
|
+
method: "DELETE",
|
|
14390
|
+
path: "/v1/volumes/:id",
|
|
14391
|
+
pathParams: external_exports.object({
|
|
14392
|
+
id: external_exports.string().min(1, "Volume ID is required")
|
|
14393
|
+
}),
|
|
14394
|
+
body: external_exports.undefined(),
|
|
14395
|
+
responses: {
|
|
14396
|
+
204: external_exports.undefined(),
|
|
14397
|
+
401: publicApiErrorSchema,
|
|
14398
|
+
404: publicApiErrorSchema,
|
|
14399
|
+
500: publicApiErrorSchema
|
|
14400
|
+
},
|
|
14401
|
+
summary: "Delete volume",
|
|
14402
|
+
description: "Delete a volume and all its versions"
|
|
14403
|
+
}
|
|
14404
|
+
});
|
|
14405
|
+
var publicVolumeVersionsContract = c14.router({
|
|
14406
|
+
list: {
|
|
14407
|
+
method: "GET",
|
|
14408
|
+
path: "/v1/volumes/:id/versions",
|
|
14409
|
+
pathParams: external_exports.object({
|
|
14410
|
+
id: external_exports.string().min(1, "Volume ID is required")
|
|
14411
|
+
}),
|
|
14412
|
+
query: listQuerySchema,
|
|
14413
|
+
responses: {
|
|
14414
|
+
200: paginatedVolumeVersionsSchema,
|
|
14415
|
+
401: publicApiErrorSchema,
|
|
14416
|
+
404: publicApiErrorSchema,
|
|
14417
|
+
500: publicApiErrorSchema
|
|
14418
|
+
},
|
|
14419
|
+
summary: "List volume versions",
|
|
14420
|
+
description: "List all versions of a volume with pagination"
|
|
14421
|
+
}
|
|
14422
|
+
});
|
|
14423
|
+
var publicVolumeUploadContract = c14.router({
|
|
14424
|
+
prepareUpload: {
|
|
14425
|
+
method: "POST",
|
|
14426
|
+
path: "/v1/volumes/:id/upload",
|
|
14427
|
+
pathParams: external_exports.object({
|
|
14428
|
+
id: external_exports.string().min(1, "Volume ID is required")
|
|
14429
|
+
}),
|
|
14430
|
+
body: prepareUploadRequestSchema2,
|
|
14431
|
+
responses: {
|
|
14432
|
+
200: prepareUploadResponseSchema2,
|
|
14433
|
+
400: publicApiErrorSchema,
|
|
14434
|
+
401: publicApiErrorSchema,
|
|
14435
|
+
404: publicApiErrorSchema,
|
|
14436
|
+
500: publicApiErrorSchema
|
|
14437
|
+
},
|
|
14438
|
+
summary: "Prepare volume upload",
|
|
14439
|
+
description: "Get presigned URLs for direct S3 upload. Returns upload URLs for each file."
|
|
14440
|
+
}
|
|
14441
|
+
});
|
|
14442
|
+
var publicVolumeCommitContract = c14.router({
|
|
14443
|
+
commitUpload: {
|
|
14444
|
+
method: "POST",
|
|
14445
|
+
path: "/v1/volumes/:id/commit",
|
|
14446
|
+
pathParams: external_exports.object({
|
|
14447
|
+
id: external_exports.string().min(1, "Volume ID is required")
|
|
14448
|
+
}),
|
|
14449
|
+
body: commitUploadRequestSchema2,
|
|
14450
|
+
responses: {
|
|
14451
|
+
200: volumeVersionSchema,
|
|
14452
|
+
400: publicApiErrorSchema,
|
|
14453
|
+
401: publicApiErrorSchema,
|
|
14454
|
+
404: publicApiErrorSchema,
|
|
14455
|
+
500: publicApiErrorSchema
|
|
14456
|
+
},
|
|
14457
|
+
summary: "Commit volume upload",
|
|
14458
|
+
description: "Finalize an upload session and create a new volume version."
|
|
14459
|
+
}
|
|
14460
|
+
});
|
|
14461
|
+
var publicVolumeDownloadContract = c14.router({
|
|
14462
|
+
download: {
|
|
14463
|
+
method: "GET",
|
|
14464
|
+
path: "/v1/volumes/:id/download",
|
|
14465
|
+
pathParams: external_exports.object({
|
|
14466
|
+
id: external_exports.string().min(1, "Volume ID is required")
|
|
14467
|
+
}),
|
|
14468
|
+
query: external_exports.object({
|
|
14469
|
+
version_id: external_exports.string().optional()
|
|
14470
|
+
// Defaults to current version
|
|
14471
|
+
}),
|
|
14472
|
+
responses: {
|
|
14473
|
+
200: downloadResponseSchema2,
|
|
14474
|
+
401: publicApiErrorSchema,
|
|
14475
|
+
404: publicApiErrorSchema,
|
|
14476
|
+
500: publicApiErrorSchema
|
|
14477
|
+
},
|
|
14478
|
+
summary: "Download volume",
|
|
14479
|
+
description: "Get presigned URLs for downloading volume files. Defaults to current version."
|
|
14480
|
+
}
|
|
14481
|
+
});
|
|
14482
|
+
|
|
14483
|
+
// ../../packages/core/src/contracts/public/tokens.ts
|
|
14484
|
+
var c15 = initContract();
|
|
14485
|
+
var publicTokenSchema = external_exports.object({
|
|
14486
|
+
id: external_exports.string(),
|
|
14487
|
+
name: external_exports.string(),
|
|
14488
|
+
token_prefix: external_exports.string(),
|
|
14489
|
+
// First 12 chars for identification (e.g., "vm0_live_abc")
|
|
14490
|
+
last_used_at: timestampSchema.nullable(),
|
|
14491
|
+
expires_at: timestampSchema,
|
|
14492
|
+
created_at: timestampSchema
|
|
14493
|
+
});
|
|
14494
|
+
var publicTokenDetailSchema = publicTokenSchema.extend({
|
|
14495
|
+
token: external_exports.string().optional()
|
|
14496
|
+
// Full token value, only returned on creation
|
|
14497
|
+
});
|
|
14498
|
+
var paginatedTokensSchema = createPaginatedResponseSchema(publicTokenSchema);
|
|
14499
|
+
var createTokenRequestSchema = external_exports.object({
|
|
14500
|
+
name: external_exports.string().min(1, "Name is required").max(100, "Name too long"),
|
|
14501
|
+
expires_in_days: external_exports.number().min(1).max(365).optional()
|
|
14502
|
+
// null for no expiry (default 90 days)
|
|
14503
|
+
});
|
|
14504
|
+
var publicTokensListContract = c15.router({
|
|
14505
|
+
list: {
|
|
14506
|
+
method: "GET",
|
|
14507
|
+
path: "/v1/tokens",
|
|
14508
|
+
query: listQuerySchema,
|
|
14509
|
+
responses: {
|
|
14510
|
+
200: paginatedTokensSchema,
|
|
14511
|
+
401: publicApiErrorSchema
|
|
14512
|
+
},
|
|
14513
|
+
summary: "List API tokens",
|
|
14514
|
+
description: "List all API tokens for the authenticated user"
|
|
14515
|
+
},
|
|
14516
|
+
create: {
|
|
14517
|
+
method: "POST",
|
|
14518
|
+
path: "/v1/tokens",
|
|
14519
|
+
body: createTokenRequestSchema,
|
|
14520
|
+
responses: {
|
|
14521
|
+
201: publicTokenDetailSchema,
|
|
14522
|
+
// Includes full token value
|
|
14523
|
+
400: publicApiErrorSchema,
|
|
14524
|
+
401: publicApiErrorSchema
|
|
14525
|
+
},
|
|
14526
|
+
summary: "Create API token",
|
|
14527
|
+
description: "Create a new API token. The token value is only returned once on creation."
|
|
14528
|
+
}
|
|
14529
|
+
});
|
|
14530
|
+
var publicTokenByIdContract = c15.router({
|
|
14531
|
+
get: {
|
|
14532
|
+
method: "GET",
|
|
14533
|
+
path: "/v1/tokens/:id",
|
|
14534
|
+
pathParams: external_exports.object({
|
|
14535
|
+
id: external_exports.string()
|
|
14536
|
+
}),
|
|
14537
|
+
responses: {
|
|
14538
|
+
200: publicTokenSchema,
|
|
14539
|
+
// Does NOT include token value
|
|
14540
|
+
401: publicApiErrorSchema,
|
|
14541
|
+
404: publicApiErrorSchema
|
|
14542
|
+
},
|
|
14543
|
+
summary: "Get API token",
|
|
14544
|
+
description: "Get details of an API token (does not include the token value)"
|
|
14545
|
+
},
|
|
14546
|
+
delete: {
|
|
14547
|
+
method: "DELETE",
|
|
14548
|
+
path: "/v1/tokens/:id",
|
|
14549
|
+
pathParams: external_exports.object({
|
|
14550
|
+
id: external_exports.string()
|
|
14551
|
+
}),
|
|
14552
|
+
responses: {
|
|
14553
|
+
204: external_exports.undefined(),
|
|
14554
|
+
401: publicApiErrorSchema,
|
|
14555
|
+
404: publicApiErrorSchema
|
|
14556
|
+
},
|
|
14557
|
+
summary: "Revoke API token",
|
|
14558
|
+
description: "Permanently revoke an API token. This action cannot be undone."
|
|
14559
|
+
}
|
|
14560
|
+
});
|
|
14561
|
+
|
|
13626
14562
|
// ../../packages/core/src/scope-reference.ts
|
|
13627
14563
|
function getLegacySystemTemplateWarning(legacyFormat) {
|
|
13628
14564
|
if (!isLegacySystemTemplate(legacyFormat)) {
|
|
@@ -14065,7 +15001,7 @@ var ApiClient = class {
|
|
|
14065
15001
|
/**
|
|
14066
15002
|
* Generic GET request
|
|
14067
15003
|
*/
|
|
14068
|
-
async get(
|
|
15004
|
+
async get(path16) {
|
|
14069
15005
|
const baseUrl = await this.getBaseUrl();
|
|
14070
15006
|
const token = await getToken();
|
|
14071
15007
|
if (!token) {
|
|
@@ -14078,7 +15014,7 @@ var ApiClient = class {
|
|
|
14078
15014
|
if (bypassSecret) {
|
|
14079
15015
|
headers["x-vercel-protection-bypass"] = bypassSecret;
|
|
14080
15016
|
}
|
|
14081
|
-
return fetch(`${baseUrl}${
|
|
15017
|
+
return fetch(`${baseUrl}${path16}`, {
|
|
14082
15018
|
method: "GET",
|
|
14083
15019
|
headers
|
|
14084
15020
|
});
|
|
@@ -14086,7 +15022,7 @@ var ApiClient = class {
|
|
|
14086
15022
|
/**
|
|
14087
15023
|
* Generic POST request
|
|
14088
15024
|
*/
|
|
14089
|
-
async post(
|
|
15025
|
+
async post(path16, options) {
|
|
14090
15026
|
const baseUrl = await this.getBaseUrl();
|
|
14091
15027
|
const token = await getToken();
|
|
14092
15028
|
if (!token) {
|
|
@@ -14102,7 +15038,7 @@ var ApiClient = class {
|
|
|
14102
15038
|
if (bypassSecret) {
|
|
14103
15039
|
headers["x-vercel-protection-bypass"] = bypassSecret;
|
|
14104
15040
|
}
|
|
14105
|
-
return fetch(`${baseUrl}${
|
|
15041
|
+
return fetch(`${baseUrl}${path16}`, {
|
|
14106
15042
|
method: "POST",
|
|
14107
15043
|
headers,
|
|
14108
15044
|
body: options?.body
|
|
@@ -14111,7 +15047,7 @@ var ApiClient = class {
|
|
|
14111
15047
|
/**
|
|
14112
15048
|
* Generic DELETE request
|
|
14113
15049
|
*/
|
|
14114
|
-
async delete(
|
|
15050
|
+
async delete(path16) {
|
|
14115
15051
|
const baseUrl = await this.getBaseUrl();
|
|
14116
15052
|
const token = await getToken();
|
|
14117
15053
|
if (!token) {
|
|
@@ -14124,7 +15060,7 @@ var ApiClient = class {
|
|
|
14124
15060
|
if (bypassSecret) {
|
|
14125
15061
|
headers["x-vercel-protection-bypass"] = bypassSecret;
|
|
14126
15062
|
}
|
|
14127
|
-
return fetch(`${baseUrl}${
|
|
15063
|
+
return fetch(`${baseUrl}${path16}`, {
|
|
14128
15064
|
method: "DELETE",
|
|
14129
15065
|
headers
|
|
14130
15066
|
});
|
|
@@ -15458,9 +16394,9 @@ var CodexEventParser = class {
|
|
|
15458
16394
|
}
|
|
15459
16395
|
}
|
|
15460
16396
|
if (itemType === "file_change" && item.changes && item.changes.length > 0) {
|
|
15461
|
-
const changes = item.changes.map((
|
|
15462
|
-
const action =
|
|
15463
|
-
return `${action}: ${
|
|
16397
|
+
const changes = item.changes.map((c16) => {
|
|
16398
|
+
const action = c16.kind === "add" ? "Created" : c16.kind === "modify" ? "Modified" : "Deleted";
|
|
16399
|
+
return `${action}: ${c16.path}`;
|
|
15464
16400
|
}).join("\n");
|
|
15465
16401
|
return {
|
|
15466
16402
|
type: "text",
|
|
@@ -15801,9 +16737,9 @@ var CodexEventRenderer = class {
|
|
|
15801
16737
|
return;
|
|
15802
16738
|
}
|
|
15803
16739
|
if (itemType === "file_change" && item.changes && item.changes.length > 0) {
|
|
15804
|
-
const summary = item.changes.map((
|
|
15805
|
-
const icon =
|
|
15806
|
-
return `${icon}${
|
|
16740
|
+
const summary = item.changes.map((c16) => {
|
|
16741
|
+
const icon = c16.kind === "add" ? "+" : c16.kind === "delete" ? "-" : "~";
|
|
16742
|
+
return `${icon}${c16.path}`;
|
|
15807
16743
|
}).join(", ");
|
|
15808
16744
|
console.log(chalk4.green("[files]") + ` ${summary}`);
|
|
15809
16745
|
return;
|
|
@@ -17692,7 +18628,7 @@ async function autoPullArtifact(runOutput, artifactDir) {
|
|
|
17692
18628
|
}
|
|
17693
18629
|
var cookCmd = new Command17().name("cook").description("One-click agent preparation and execution from vm0.yaml");
|
|
17694
18630
|
cookCmd.argument("[prompt]", "Prompt for the agent").option("-y, --yes", "Skip confirmation prompts").action(async (prompt, options) => {
|
|
17695
|
-
const shouldExit = await checkAndUpgrade("4.
|
|
18631
|
+
const shouldExit = await checkAndUpgrade("4.38.0", prompt);
|
|
17696
18632
|
if (shouldExit) {
|
|
17697
18633
|
process.exit(0);
|
|
17698
18634
|
}
|
|
@@ -18190,7 +19126,7 @@ async function showNetworkLogs(runId, options) {
|
|
|
18190
19126
|
if (response.networkLogs.length === 0) {
|
|
18191
19127
|
console.log(
|
|
18192
19128
|
chalk22.yellow(
|
|
18193
|
-
"No network logs found for this run. Network logs are only captured when
|
|
19129
|
+
"No network logs found for this run. Network logs are only captured when experimental_network_security is enabled on an experimental_runner."
|
|
18194
19130
|
)
|
|
18195
19131
|
);
|
|
18196
19132
|
return;
|
|
@@ -18342,10 +19278,324 @@ var setCommand = new Command20().name("set").description("Set your scope slug").
|
|
|
18342
19278
|
// src/commands/scope/index.ts
|
|
18343
19279
|
var scopeCommand = new Command21().name("scope").description("Manage your scope (namespace for images)").addCommand(statusCommand3).addCommand(setCommand);
|
|
18344
19280
|
|
|
18345
|
-
// src/commands/
|
|
19281
|
+
// src/commands/agents/index.ts
|
|
19282
|
+
import { Command as Command24 } from "commander";
|
|
19283
|
+
|
|
19284
|
+
// src/commands/agents/list.ts
|
|
18346
19285
|
import { Command as Command22 } from "commander";
|
|
18347
19286
|
import chalk25 from "chalk";
|
|
18348
|
-
|
|
19287
|
+
var listCommand3 = new Command22().name("list").alias("ls").description("List all agent composes").option("-s, --scope <scope>", "Scope to list composes from").action(async (options) => {
|
|
19288
|
+
try {
|
|
19289
|
+
const url2 = options.scope ? `/api/agent/composes/list?scope=${encodeURIComponent(options.scope)}` : "/api/agent/composes/list";
|
|
19290
|
+
const response = await apiClient.get(url2);
|
|
19291
|
+
if (!response.ok) {
|
|
19292
|
+
const error43 = await response.json();
|
|
19293
|
+
throw new Error(error43.error?.message || "List failed");
|
|
19294
|
+
}
|
|
19295
|
+
const data = await response.json();
|
|
19296
|
+
if (data.composes.length === 0) {
|
|
19297
|
+
console.log(chalk25.dim("No agent composes found"));
|
|
19298
|
+
console.log(
|
|
19299
|
+
chalk25.dim(" Create one with: vm0 compose <agent-compose.yaml>")
|
|
19300
|
+
);
|
|
19301
|
+
return;
|
|
19302
|
+
}
|
|
19303
|
+
const nameWidth = Math.max(4, ...data.composes.map((c16) => c16.name.length));
|
|
19304
|
+
const header = ["NAME".padEnd(nameWidth), "VERSION", "UPDATED"].join(
|
|
19305
|
+
" "
|
|
19306
|
+
);
|
|
19307
|
+
console.log(chalk25.dim(header));
|
|
19308
|
+
for (const compose of data.composes) {
|
|
19309
|
+
const versionShort = compose.headVersionId ? compose.headVersionId.slice(0, 8) : chalk25.dim("-");
|
|
19310
|
+
const row = [
|
|
19311
|
+
compose.name.padEnd(nameWidth),
|
|
19312
|
+
versionShort,
|
|
19313
|
+
formatRelativeTime(compose.updatedAt)
|
|
19314
|
+
].join(" ");
|
|
19315
|
+
console.log(row);
|
|
19316
|
+
}
|
|
19317
|
+
} catch (error43) {
|
|
19318
|
+
console.error(chalk25.red("\u2717 Failed to list agent composes"));
|
|
19319
|
+
if (error43 instanceof Error) {
|
|
19320
|
+
if (error43.message.includes("Not authenticated")) {
|
|
19321
|
+
console.error(chalk25.dim(" Run: vm0 auth login"));
|
|
19322
|
+
} else {
|
|
19323
|
+
console.error(chalk25.dim(` ${error43.message}`));
|
|
19324
|
+
}
|
|
19325
|
+
}
|
|
19326
|
+
process.exit(1);
|
|
19327
|
+
}
|
|
19328
|
+
});
|
|
19329
|
+
|
|
19330
|
+
// src/commands/agents/inspect.ts
|
|
19331
|
+
import { Command as Command23 } from "commander";
|
|
19332
|
+
import chalk26 from "chalk";
|
|
19333
|
+
|
|
19334
|
+
// src/lib/source-derivation.ts
|
|
19335
|
+
import * as fs9 from "fs/promises";
|
|
19336
|
+
import * as path13 from "path";
|
|
19337
|
+
import * as os7 from "os";
|
|
19338
|
+
function extractVariableReferences2(environment) {
|
|
19339
|
+
const secrets = [];
|
|
19340
|
+
const vars = [];
|
|
19341
|
+
for (const value of Object.values(environment)) {
|
|
19342
|
+
const matches = value.matchAll(/\$\{?([A-Z_][A-Z0-9_]*)\}?/g);
|
|
19343
|
+
for (const match of matches) {
|
|
19344
|
+
const varName = match[1];
|
|
19345
|
+
if (!varName) continue;
|
|
19346
|
+
if (varName.endsWith("_KEY") || varName.endsWith("_SECRET") || varName.endsWith("_TOKEN") || varName.endsWith("_PASSWORD") || varName.includes("API_KEY") || varName.includes("SECRET")) {
|
|
19347
|
+
if (!secrets.includes(varName)) {
|
|
19348
|
+
secrets.push(varName);
|
|
19349
|
+
}
|
|
19350
|
+
} else {
|
|
19351
|
+
if (!vars.includes(varName)) {
|
|
19352
|
+
vars.push(varName);
|
|
19353
|
+
}
|
|
19354
|
+
}
|
|
19355
|
+
}
|
|
19356
|
+
}
|
|
19357
|
+
return { secrets: secrets.sort(), vars: vars.sort() };
|
|
19358
|
+
}
|
|
19359
|
+
async function fetchSkillFrontmatter(skillUrl, tempDir) {
|
|
19360
|
+
try {
|
|
19361
|
+
const parsed = parseGitHubTreeUrl2(skillUrl);
|
|
19362
|
+
const skillDir = await downloadGitHubSkill(parsed, tempDir);
|
|
19363
|
+
const frontmatter = await readSkillFrontmatter(skillDir);
|
|
19364
|
+
return { skillName: parsed.skillName, frontmatter };
|
|
19365
|
+
} catch {
|
|
19366
|
+
return null;
|
|
19367
|
+
}
|
|
19368
|
+
}
|
|
19369
|
+
async function deriveAgentVariableSources(agent, options) {
|
|
19370
|
+
const { secrets: secretNames, vars: varNames } = agent.environment ? extractVariableReferences2(agent.environment) : { secrets: [], vars: [] };
|
|
19371
|
+
const secretSources = /* @__PURE__ */ new Map();
|
|
19372
|
+
const varSources = /* @__PURE__ */ new Map();
|
|
19373
|
+
for (const name of secretNames) {
|
|
19374
|
+
secretSources.set(name, { name, source: "agent environment" });
|
|
19375
|
+
}
|
|
19376
|
+
for (const name of varNames) {
|
|
19377
|
+
varSources.set(name, { name, source: "agent environment" });
|
|
19378
|
+
}
|
|
19379
|
+
if (options?.skipNetwork || !agent.skills || agent.skills.length === 0) {
|
|
19380
|
+
return {
|
|
19381
|
+
secrets: Array.from(secretSources.values()),
|
|
19382
|
+
vars: Array.from(varSources.values())
|
|
19383
|
+
};
|
|
19384
|
+
}
|
|
19385
|
+
const tempDir = await fs9.mkdtemp(
|
|
19386
|
+
path13.join(os7.tmpdir(), "vm0-source-derivation-")
|
|
19387
|
+
);
|
|
19388
|
+
try {
|
|
19389
|
+
const skillResults = await Promise.all(
|
|
19390
|
+
agent.skills.map((url2) => fetchSkillFrontmatter(url2, tempDir))
|
|
19391
|
+
);
|
|
19392
|
+
for (const result of skillResults) {
|
|
19393
|
+
if (!result) continue;
|
|
19394
|
+
const { skillName, frontmatter } = result;
|
|
19395
|
+
if (frontmatter.vm0_secrets) {
|
|
19396
|
+
for (const secretName of frontmatter.vm0_secrets) {
|
|
19397
|
+
if (secretSources.has(secretName)) {
|
|
19398
|
+
secretSources.set(secretName, {
|
|
19399
|
+
name: secretName,
|
|
19400
|
+
source: `skill: ${skillName}`,
|
|
19401
|
+
skillName
|
|
19402
|
+
});
|
|
19403
|
+
}
|
|
19404
|
+
}
|
|
19405
|
+
}
|
|
19406
|
+
if (frontmatter.vm0_vars) {
|
|
19407
|
+
for (const varName of frontmatter.vm0_vars) {
|
|
19408
|
+
if (varSources.has(varName)) {
|
|
19409
|
+
varSources.set(varName, {
|
|
19410
|
+
name: varName,
|
|
19411
|
+
source: `skill: ${skillName}`,
|
|
19412
|
+
skillName
|
|
19413
|
+
});
|
|
19414
|
+
}
|
|
19415
|
+
}
|
|
19416
|
+
}
|
|
19417
|
+
}
|
|
19418
|
+
} finally {
|
|
19419
|
+
await fs9.rm(tempDir, { recursive: true, force: true });
|
|
19420
|
+
}
|
|
19421
|
+
return {
|
|
19422
|
+
secrets: Array.from(secretSources.values()),
|
|
19423
|
+
vars: Array.from(varSources.values())
|
|
19424
|
+
};
|
|
19425
|
+
}
|
|
19426
|
+
async function deriveComposeVariableSources(content, options) {
|
|
19427
|
+
const results = /* @__PURE__ */ new Map();
|
|
19428
|
+
const entries = Object.entries(content.agents);
|
|
19429
|
+
const sourcesPromises = entries.map(async ([agentName, agent]) => {
|
|
19430
|
+
const sources = await deriveAgentVariableSources(agent, options);
|
|
19431
|
+
return { agentName, sources };
|
|
19432
|
+
});
|
|
19433
|
+
const sourcesResults = await Promise.all(sourcesPromises);
|
|
19434
|
+
for (const { agentName, sources } of sourcesResults) {
|
|
19435
|
+
results.set(agentName, sources);
|
|
19436
|
+
}
|
|
19437
|
+
return results;
|
|
19438
|
+
}
|
|
19439
|
+
|
|
19440
|
+
// src/commands/agents/inspect.ts
|
|
19441
|
+
function formatComposeOutput(name, versionId, content, variableSources) {
|
|
19442
|
+
console.log(chalk26.bold("Name:") + ` ${name}`);
|
|
19443
|
+
console.log(chalk26.bold("Version:") + ` ${versionId}`);
|
|
19444
|
+
console.log();
|
|
19445
|
+
console.log(chalk26.bold("Agents:"));
|
|
19446
|
+
for (const [agentName, agent] of Object.entries(content.agents)) {
|
|
19447
|
+
console.log(` ${chalk26.cyan(agentName)}:`);
|
|
19448
|
+
console.log(` Provider: ${agent.provider}`);
|
|
19449
|
+
if (agent.image) {
|
|
19450
|
+
console.log(` Image: ${agent.image}`);
|
|
19451
|
+
}
|
|
19452
|
+
if (agent.apps && agent.apps.length > 0) {
|
|
19453
|
+
console.log(` Apps:`);
|
|
19454
|
+
for (const app of agent.apps) {
|
|
19455
|
+
console.log(` - ${app}`);
|
|
19456
|
+
}
|
|
19457
|
+
}
|
|
19458
|
+
if (agent.working_dir) {
|
|
19459
|
+
console.log(` Working Dir: ${agent.working_dir}`);
|
|
19460
|
+
}
|
|
19461
|
+
if (agent.volumes && agent.volumes.length > 0) {
|
|
19462
|
+
console.log(` Volumes:`);
|
|
19463
|
+
for (const vol of agent.volumes) {
|
|
19464
|
+
const volumeDef = content.volumes?.[vol];
|
|
19465
|
+
if (volumeDef) {
|
|
19466
|
+
console.log(` - ${vol}:${volumeDef.version.slice(0, 8)}`);
|
|
19467
|
+
} else {
|
|
19468
|
+
console.log(` - ${vol}`);
|
|
19469
|
+
}
|
|
19470
|
+
}
|
|
19471
|
+
}
|
|
19472
|
+
if (agent.skills && agent.skills.length > 0) {
|
|
19473
|
+
console.log(` Skills:`);
|
|
19474
|
+
for (const skill of agent.skills) {
|
|
19475
|
+
console.log(` - ${skill}`);
|
|
19476
|
+
}
|
|
19477
|
+
}
|
|
19478
|
+
const agentSources = variableSources?.get(agentName);
|
|
19479
|
+
if (agentSources) {
|
|
19480
|
+
if (agentSources.secrets.length > 0) {
|
|
19481
|
+
console.log(` Secrets:`);
|
|
19482
|
+
for (const secret of agentSources.secrets) {
|
|
19483
|
+
const sourceInfo = chalk26.dim(`(${secret.source})`);
|
|
19484
|
+
console.log(` - ${secret.name.padEnd(20)} ${sourceInfo}`);
|
|
19485
|
+
}
|
|
19486
|
+
}
|
|
19487
|
+
if (agentSources.vars.length > 0) {
|
|
19488
|
+
console.log(` Vars:`);
|
|
19489
|
+
for (const v of agentSources.vars) {
|
|
19490
|
+
const sourceInfo = chalk26.dim(`(${v.source})`);
|
|
19491
|
+
console.log(` - ${v.name.padEnd(20)} ${sourceInfo}`);
|
|
19492
|
+
}
|
|
19493
|
+
}
|
|
19494
|
+
}
|
|
19495
|
+
if (agent.experimental_runner) {
|
|
19496
|
+
console.log(` Runner: ${agent.experimental_runner.group}`);
|
|
19497
|
+
}
|
|
19498
|
+
if (agent.experimental_network_security) {
|
|
19499
|
+
console.log(` Network Security: enabled`);
|
|
19500
|
+
}
|
|
19501
|
+
}
|
|
19502
|
+
}
|
|
19503
|
+
var inspectCommand = new Command23().name("inspect").description("Inspect an agent compose").argument(
|
|
19504
|
+
"<name[:version]>",
|
|
19505
|
+
"Agent name with optional version (e.g., my-agent:latest or my-agent:a1b2c3d4)"
|
|
19506
|
+
).option("-s, --scope <scope>", "Scope to look up the compose from").option("--no-sources", "Skip fetching skills to determine variable sources").action(
|
|
19507
|
+
async (argument, options) => {
|
|
19508
|
+
try {
|
|
19509
|
+
const colonIndex = argument.lastIndexOf(":");
|
|
19510
|
+
let name;
|
|
19511
|
+
let version2;
|
|
19512
|
+
if (colonIndex === -1) {
|
|
19513
|
+
name = argument;
|
|
19514
|
+
version2 = "latest";
|
|
19515
|
+
} else {
|
|
19516
|
+
name = argument.slice(0, colonIndex);
|
|
19517
|
+
version2 = argument.slice(colonIndex + 1) || "latest";
|
|
19518
|
+
}
|
|
19519
|
+
let compose;
|
|
19520
|
+
try {
|
|
19521
|
+
compose = await apiClient.getComposeByName(name, options.scope);
|
|
19522
|
+
} catch (error43) {
|
|
19523
|
+
if (error43 instanceof Error && error43.message.includes("not found")) {
|
|
19524
|
+
console.error(chalk26.red(`\u2717 Agent compose not found: ${name}`));
|
|
19525
|
+
console.error(chalk26.dim(" Run: vm0 agents list"));
|
|
19526
|
+
process.exit(1);
|
|
19527
|
+
}
|
|
19528
|
+
throw error43;
|
|
19529
|
+
}
|
|
19530
|
+
let resolvedVersionId = compose.headVersionId;
|
|
19531
|
+
if (version2 !== "latest" && compose.headVersionId) {
|
|
19532
|
+
if (version2.length < 64) {
|
|
19533
|
+
try {
|
|
19534
|
+
const versionInfo = await apiClient.getComposeVersion(
|
|
19535
|
+
compose.id,
|
|
19536
|
+
version2
|
|
19537
|
+
);
|
|
19538
|
+
resolvedVersionId = versionInfo.versionId;
|
|
19539
|
+
} catch (error43) {
|
|
19540
|
+
if (error43 instanceof Error && error43.message.includes("not found")) {
|
|
19541
|
+
console.error(chalk26.red(`\u2717 Version not found: ${version2}`));
|
|
19542
|
+
console.error(
|
|
19543
|
+
chalk26.dim(
|
|
19544
|
+
` HEAD version: ${compose.headVersionId?.slice(0, 8)}`
|
|
19545
|
+
)
|
|
19546
|
+
);
|
|
19547
|
+
process.exit(1);
|
|
19548
|
+
}
|
|
19549
|
+
throw error43;
|
|
19550
|
+
}
|
|
19551
|
+
} else {
|
|
19552
|
+
resolvedVersionId = version2;
|
|
19553
|
+
}
|
|
19554
|
+
}
|
|
19555
|
+
if (!resolvedVersionId || !compose.content) {
|
|
19556
|
+
console.error(chalk26.red(`\u2717 No version found for: ${name}`));
|
|
19557
|
+
process.exit(1);
|
|
19558
|
+
}
|
|
19559
|
+
const content = compose.content;
|
|
19560
|
+
let variableSources;
|
|
19561
|
+
if (options.sources !== false) {
|
|
19562
|
+
try {
|
|
19563
|
+
variableSources = await deriveComposeVariableSources(content);
|
|
19564
|
+
} catch {
|
|
19565
|
+
console.error(
|
|
19566
|
+
chalk26.yellow(
|
|
19567
|
+
"\u26A0 Warning: Failed to fetch skill sources, showing basic info"
|
|
19568
|
+
)
|
|
19569
|
+
);
|
|
19570
|
+
}
|
|
19571
|
+
}
|
|
19572
|
+
formatComposeOutput(
|
|
19573
|
+
compose.name,
|
|
19574
|
+
resolvedVersionId,
|
|
19575
|
+
content,
|
|
19576
|
+
variableSources
|
|
19577
|
+
);
|
|
19578
|
+
} catch (error43) {
|
|
19579
|
+
console.error(chalk26.red("\u2717 Failed to inspect agent compose"));
|
|
19580
|
+
if (error43 instanceof Error) {
|
|
19581
|
+
if (error43.message.includes("Not authenticated")) {
|
|
19582
|
+
console.error(chalk26.dim(" Run: vm0 auth login"));
|
|
19583
|
+
} else {
|
|
19584
|
+
console.error(chalk26.dim(` ${error43.message}`));
|
|
19585
|
+
}
|
|
19586
|
+
}
|
|
19587
|
+
process.exit(1);
|
|
19588
|
+
}
|
|
19589
|
+
}
|
|
19590
|
+
);
|
|
19591
|
+
|
|
19592
|
+
// src/commands/agents/index.ts
|
|
19593
|
+
var agentsCommand = new Command24().name("agents").description("Manage agent composes").addCommand(listCommand3).addCommand(inspectCommand);
|
|
19594
|
+
|
|
19595
|
+
// src/commands/init.ts
|
|
19596
|
+
import { Command as Command25 } from "commander";
|
|
19597
|
+
import chalk27 from "chalk";
|
|
19598
|
+
import path14 from "path";
|
|
18349
19599
|
import { existsSync as existsSync9 } from "fs";
|
|
18350
19600
|
import { writeFile as writeFile7 } from "fs/promises";
|
|
18351
19601
|
var VM0_YAML_FILE = "vm0.yaml";
|
|
@@ -18385,14 +19635,14 @@ function checkExistingFiles() {
|
|
|
18385
19635
|
if (existsSync9(AGENTS_MD_FILE)) existingFiles.push(AGENTS_MD_FILE);
|
|
18386
19636
|
return existingFiles;
|
|
18387
19637
|
}
|
|
18388
|
-
var initCommand3 = new
|
|
19638
|
+
var initCommand3 = new Command25().name("init").description("Initialize a new VM0 project in the current directory").option("-f, --force", "Overwrite existing files").option("-n, --name <name>", "Agent name (required in non-interactive mode)").action(async (options) => {
|
|
18389
19639
|
const existingFiles = checkExistingFiles();
|
|
18390
19640
|
if (existingFiles.length > 0 && !options.force) {
|
|
18391
19641
|
for (const file2 of existingFiles) {
|
|
18392
|
-
console.log(
|
|
19642
|
+
console.log(chalk27.red(`\u2717 ${file2} already exists`));
|
|
18393
19643
|
}
|
|
18394
19644
|
console.log();
|
|
18395
|
-
console.log(`To overwrite: ${
|
|
19645
|
+
console.log(`To overwrite: ${chalk27.cyan("vm0 init --force")}`);
|
|
18396
19646
|
process.exit(1);
|
|
18397
19647
|
}
|
|
18398
19648
|
let agentName;
|
|
@@ -18400,12 +19650,12 @@ var initCommand3 = new Command22().name("init").description("Initialize a new VM
|
|
|
18400
19650
|
agentName = options.name.trim();
|
|
18401
19651
|
} else if (!isInteractive()) {
|
|
18402
19652
|
console.error(
|
|
18403
|
-
|
|
19653
|
+
chalk27.red("\u2717 --name flag is required in non-interactive mode")
|
|
18404
19654
|
);
|
|
18405
|
-
console.error(
|
|
19655
|
+
console.error(chalk27.dim(" Usage: vm0 init --name <agent-name>"));
|
|
18406
19656
|
process.exit(1);
|
|
18407
19657
|
} else {
|
|
18408
|
-
const dirName =
|
|
19658
|
+
const dirName = path14.basename(process.cwd());
|
|
18409
19659
|
const defaultName = validateAgentName(dirName) ? dirName : void 0;
|
|
18410
19660
|
const name = await promptText(
|
|
18411
19661
|
"Enter agent name",
|
|
@@ -18418,42 +19668,42 @@ var initCommand3 = new Command22().name("init").description("Initialize a new VM
|
|
|
18418
19668
|
}
|
|
18419
19669
|
);
|
|
18420
19670
|
if (name === void 0) {
|
|
18421
|
-
console.log(
|
|
19671
|
+
console.log(chalk27.dim("Cancelled"));
|
|
18422
19672
|
return;
|
|
18423
19673
|
}
|
|
18424
19674
|
agentName = name;
|
|
18425
19675
|
}
|
|
18426
19676
|
if (!agentName || !validateAgentName(agentName)) {
|
|
18427
|
-
console.log(
|
|
19677
|
+
console.log(chalk27.red("\u2717 Invalid agent name"));
|
|
18428
19678
|
console.log(
|
|
18429
|
-
|
|
19679
|
+
chalk27.dim(" Must be 3-64 characters, alphanumeric and hyphens only")
|
|
18430
19680
|
);
|
|
18431
|
-
console.log(
|
|
19681
|
+
console.log(chalk27.dim(" Must start and end with letter or number"));
|
|
18432
19682
|
process.exit(1);
|
|
18433
19683
|
}
|
|
18434
19684
|
await writeFile7(VM0_YAML_FILE, generateVm0Yaml(agentName));
|
|
18435
19685
|
const vm0Status = existingFiles.includes(VM0_YAML_FILE) ? " (overwritten)" : "";
|
|
18436
|
-
console.log(
|
|
19686
|
+
console.log(chalk27.green(`\u2713 Created ${VM0_YAML_FILE}${vm0Status}`));
|
|
18437
19687
|
await writeFile7(AGENTS_MD_FILE, generateAgentsMd());
|
|
18438
19688
|
const agentsStatus = existingFiles.includes(AGENTS_MD_FILE) ? " (overwritten)" : "";
|
|
18439
|
-
console.log(
|
|
19689
|
+
console.log(chalk27.green(`\u2713 Created ${AGENTS_MD_FILE}${agentsStatus}`));
|
|
18440
19690
|
console.log();
|
|
18441
19691
|
console.log("Next steps:");
|
|
18442
19692
|
console.log(
|
|
18443
|
-
` 1. Get your Claude Code token: ${
|
|
19693
|
+
` 1. Get your Claude Code token: ${chalk27.cyan("claude setup-token")}`
|
|
18444
19694
|
);
|
|
18445
19695
|
console.log(` 2. Set the environment variable (or add to .env file):`);
|
|
18446
|
-
console.log(
|
|
18447
|
-
console.log(` 3. Run your agent: ${
|
|
19696
|
+
console.log(chalk27.dim(` export CLAUDE_CODE_OAUTH_TOKEN=<your-token>`));
|
|
19697
|
+
console.log(` 3. Run your agent: ${chalk27.cyan('vm0 cook "your prompt"')}`);
|
|
18448
19698
|
});
|
|
18449
19699
|
|
|
18450
19700
|
// src/commands/setup-github.ts
|
|
18451
|
-
import { Command as
|
|
18452
|
-
import
|
|
19701
|
+
import { Command as Command26 } from "commander";
|
|
19702
|
+
import chalk28 from "chalk";
|
|
18453
19703
|
import { existsSync as existsSync10 } from "fs";
|
|
18454
19704
|
import { mkdir as mkdir7, readFile as readFile8, writeFile as writeFile8 } from "fs/promises";
|
|
18455
19705
|
import { execSync, spawnSync } from "child_process";
|
|
18456
|
-
import
|
|
19706
|
+
import path15 from "path";
|
|
18457
19707
|
import { parse as parseYaml5 } from "yaml";
|
|
18458
19708
|
function isGhInstalled() {
|
|
18459
19709
|
try {
|
|
@@ -18485,74 +19735,74 @@ function getRelativeWorkingDir(gitRoot) {
|
|
|
18485
19735
|
if (cwd === gitRoot) {
|
|
18486
19736
|
return null;
|
|
18487
19737
|
}
|
|
18488
|
-
const relativePath =
|
|
19738
|
+
const relativePath = path15.relative(gitRoot, cwd);
|
|
18489
19739
|
return relativePath.replace(/\\/g, "/");
|
|
18490
19740
|
}
|
|
18491
19741
|
async function checkPrerequisites() {
|
|
18492
19742
|
console.log("Checking prerequisites...");
|
|
18493
19743
|
const gitRoot = getGitRoot();
|
|
18494
19744
|
if (!gitRoot) {
|
|
18495
|
-
console.log(
|
|
19745
|
+
console.log(chalk28.red("\u2717 Not in a git repository"));
|
|
18496
19746
|
console.log();
|
|
18497
19747
|
console.log("This command must be run from within a git repository.");
|
|
18498
19748
|
console.log();
|
|
18499
19749
|
console.log("To initialize a git repository, run:");
|
|
18500
|
-
console.log(` ${
|
|
19750
|
+
console.log(` ${chalk28.cyan("git init")}`);
|
|
18501
19751
|
process.exit(1);
|
|
18502
19752
|
}
|
|
18503
|
-
console.log(
|
|
19753
|
+
console.log(chalk28.green("\u2713 Git repository detected"));
|
|
18504
19754
|
if (!isGhInstalled()) {
|
|
18505
|
-
console.log(
|
|
19755
|
+
console.log(chalk28.red("\u2717 GitHub CLI (gh) is not installed"));
|
|
18506
19756
|
console.log();
|
|
18507
19757
|
console.log("GitHub CLI is required for this command.");
|
|
18508
19758
|
console.log();
|
|
18509
|
-
console.log(` macOS: ${
|
|
18510
|
-
console.log(` Other: ${
|
|
19759
|
+
console.log(` macOS: ${chalk28.cyan("brew install gh")}`);
|
|
19760
|
+
console.log(` Other: ${chalk28.cyan("https://cli.github.com/")}`);
|
|
18511
19761
|
console.log();
|
|
18512
19762
|
console.log("After installation, run:");
|
|
18513
|
-
console.log(` ${
|
|
19763
|
+
console.log(` ${chalk28.cyan("gh auth login")}`);
|
|
18514
19764
|
console.log();
|
|
18515
19765
|
console.log("Then try again:");
|
|
18516
|
-
console.log(` ${
|
|
19766
|
+
console.log(` ${chalk28.cyan("vm0 setup-github")}`);
|
|
18517
19767
|
process.exit(1);
|
|
18518
19768
|
}
|
|
18519
|
-
console.log(
|
|
19769
|
+
console.log(chalk28.green("\u2713 GitHub CLI (gh) is installed"));
|
|
18520
19770
|
if (!isGhAuthenticated()) {
|
|
18521
|
-
console.log(
|
|
19771
|
+
console.log(chalk28.red("\u2717 GitHub CLI is not authenticated"));
|
|
18522
19772
|
console.log();
|
|
18523
19773
|
console.log("Please authenticate GitHub CLI first:");
|
|
18524
|
-
console.log(` ${
|
|
19774
|
+
console.log(` ${chalk28.cyan("gh auth login")}`);
|
|
18525
19775
|
console.log();
|
|
18526
19776
|
console.log("Then try again:");
|
|
18527
|
-
console.log(` ${
|
|
19777
|
+
console.log(` ${chalk28.cyan("vm0 setup-github")}`);
|
|
18528
19778
|
process.exit(1);
|
|
18529
19779
|
}
|
|
18530
|
-
console.log(
|
|
19780
|
+
console.log(chalk28.green("\u2713 GitHub CLI is authenticated"));
|
|
18531
19781
|
const token = await getToken();
|
|
18532
19782
|
if (!token) {
|
|
18533
|
-
console.log(
|
|
19783
|
+
console.log(chalk28.red("\u2717 VM0 not authenticated"));
|
|
18534
19784
|
console.log();
|
|
18535
19785
|
console.log("Please authenticate with VM0 first:");
|
|
18536
|
-
console.log(` ${
|
|
19786
|
+
console.log(` ${chalk28.cyan("vm0 auth login")}`);
|
|
18537
19787
|
console.log();
|
|
18538
19788
|
console.log("Then try again:");
|
|
18539
|
-
console.log(` ${
|
|
19789
|
+
console.log(` ${chalk28.cyan("vm0 setup-github")}`);
|
|
18540
19790
|
process.exit(1);
|
|
18541
19791
|
}
|
|
18542
|
-
console.log(
|
|
19792
|
+
console.log(chalk28.green("\u2713 VM0 authenticated"));
|
|
18543
19793
|
if (!existsSync10("vm0.yaml")) {
|
|
18544
|
-
console.log(
|
|
19794
|
+
console.log(chalk28.red("\u2717 vm0.yaml not found"));
|
|
18545
19795
|
console.log();
|
|
18546
19796
|
console.log("This command requires a vm0.yaml configuration file.");
|
|
18547
19797
|
console.log();
|
|
18548
19798
|
console.log("To create one, run:");
|
|
18549
|
-
console.log(` ${
|
|
19799
|
+
console.log(` ${chalk28.cyan("vm0 init")}`);
|
|
18550
19800
|
console.log();
|
|
18551
19801
|
console.log("Then try again:");
|
|
18552
|
-
console.log(` ${
|
|
19802
|
+
console.log(` ${chalk28.cyan("vm0 setup-github")}`);
|
|
18553
19803
|
process.exit(1);
|
|
18554
19804
|
}
|
|
18555
|
-
console.log(
|
|
19805
|
+
console.log(chalk28.green("\u2713 vm0.yaml found"));
|
|
18556
19806
|
return { token, gitRoot };
|
|
18557
19807
|
}
|
|
18558
19808
|
function generatePublishYaml(workingDir) {
|
|
@@ -18709,7 +19959,7 @@ function displaySecretsTable(secretStatuses, varStatuses) {
|
|
|
18709
19959
|
if (secretStatuses.length > 0) {
|
|
18710
19960
|
console.log("\u2502 Secrets: \u2502");
|
|
18711
19961
|
for (const s of secretStatuses) {
|
|
18712
|
-
const status = s.found ?
|
|
19962
|
+
const status = s.found ? chalk28.green("\u2713") : chalk28.red("\u2717");
|
|
18713
19963
|
const source = s.found ? `(from ${s.source})` : "not found";
|
|
18714
19964
|
const paddedName = (s.name + " ").padEnd(23, ".");
|
|
18715
19965
|
console.log(`\u2502 ${status} ${paddedName} ${source.padEnd(19)}\u2502`);
|
|
@@ -18718,7 +19968,7 @@ function displaySecretsTable(secretStatuses, varStatuses) {
|
|
|
18718
19968
|
if (varStatuses.length > 0) {
|
|
18719
19969
|
console.log("\u2502 Variables: \u2502");
|
|
18720
19970
|
for (const v of varStatuses) {
|
|
18721
|
-
const status = v.found ?
|
|
19971
|
+
const status = v.found ? chalk28.green("\u2713") : chalk28.red("\u2717");
|
|
18722
19972
|
const source = v.found ? `(from ${v.source})` : "not found";
|
|
18723
19973
|
const paddedName = (v.name + " ").padEnd(23, ".");
|
|
18724
19974
|
console.log(`\u2502 ${status} ${paddedName} ${source.padEnd(19)}\u2502`);
|
|
@@ -18730,17 +19980,17 @@ function showManualSetupInstructions(secrets, vars) {
|
|
|
18730
19980
|
console.log("Skipped automatic setup. Configure secrets manually:");
|
|
18731
19981
|
console.log();
|
|
18732
19982
|
console.log(" Step 1: Get your VM0 token");
|
|
18733
|
-
console.log(` ${
|
|
19983
|
+
console.log(` ${chalk28.cyan("vm0 auth setup-token")}`);
|
|
18734
19984
|
console.log();
|
|
18735
19985
|
console.log(" Step 2: Set GitHub secrets");
|
|
18736
19986
|
for (const s of secrets) {
|
|
18737
|
-
console.log(` ${
|
|
19987
|
+
console.log(` ${chalk28.cyan(`gh secret set ${s}`)}`);
|
|
18738
19988
|
}
|
|
18739
19989
|
if (vars.length > 0) {
|
|
18740
19990
|
console.log();
|
|
18741
19991
|
console.log(" Step 3: Set GitHub variables");
|
|
18742
19992
|
for (const v of vars) {
|
|
18743
|
-
console.log(` ${
|
|
19993
|
+
console.log(` ${chalk28.cyan(`gh variable set ${v}`)}`);
|
|
18744
19994
|
}
|
|
18745
19995
|
}
|
|
18746
19996
|
}
|
|
@@ -18783,7 +20033,7 @@ function showWorkflowsCreatedMessage() {
|
|
|
18783
20033
|
console.log("\u2502 3. Push to main branch to trigger publish \u2502");
|
|
18784
20034
|
console.log("\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518");
|
|
18785
20035
|
}
|
|
18786
|
-
var setupGithubCommand = new
|
|
20036
|
+
var setupGithubCommand = new Command26().name("setup-github").description("Initialize GitHub Actions workflows for agent deployment").option("-f, --force", "Overwrite existing workflow files").option("-y, --yes", "Auto-confirm all prompts").option("--skip-secrets", "Skip automatic secrets/variables setup").action(
|
|
18787
20037
|
async (options) => {
|
|
18788
20038
|
const prereqs = await checkPrerequisites();
|
|
18789
20039
|
if (!prereqs) {
|
|
@@ -18797,23 +20047,23 @@ var setupGithubCommand = new Command23().name("setup-github").description("Initi
|
|
|
18797
20047
|
const config2 = parseYaml5(content);
|
|
18798
20048
|
const agents = config2.agents;
|
|
18799
20049
|
const agentName = Object.keys(agents)[0];
|
|
18800
|
-
console.log(
|
|
20050
|
+
console.log(chalk28.green(`\u2713 Agent: ${agentName}`));
|
|
18801
20051
|
const { secrets, vars } = extractSecretsAndVars(config2);
|
|
18802
20052
|
console.log(
|
|
18803
|
-
|
|
20053
|
+
chalk28.green(
|
|
18804
20054
|
`\u2713 Found ${secrets.length} secrets, ${vars.length} variables`
|
|
18805
20055
|
)
|
|
18806
20056
|
);
|
|
18807
20057
|
console.log();
|
|
18808
|
-
const publishPath =
|
|
18809
|
-
const runPath =
|
|
20058
|
+
const publishPath = path15.join(gitRoot, ".github/workflows/publish.yml");
|
|
20059
|
+
const runPath = path15.join(gitRoot, ".github/workflows/run.yml");
|
|
18810
20060
|
const displayPublishPath = ".github/workflows/publish.yml";
|
|
18811
20061
|
const displayRunPath = ".github/workflows/run.yml";
|
|
18812
20062
|
const existingFiles = [];
|
|
18813
20063
|
if (existsSync10(publishPath)) existingFiles.push(displayPublishPath);
|
|
18814
20064
|
if (existsSync10(runPath)) existingFiles.push(displayRunPath);
|
|
18815
20065
|
if (existingFiles.length > 0 && !options.force) {
|
|
18816
|
-
console.log(
|
|
20066
|
+
console.log(chalk28.yellow("\u26A0 Existing workflow files detected:"));
|
|
18817
20067
|
for (const file2 of existingFiles) {
|
|
18818
20068
|
console.log(` \u2022 ${file2}`);
|
|
18819
20069
|
}
|
|
@@ -18826,23 +20076,23 @@ var setupGithubCommand = new Command23().name("setup-github").description("Initi
|
|
|
18826
20076
|
if (!overwrite) {
|
|
18827
20077
|
console.log();
|
|
18828
20078
|
console.log("Aborted. To force overwrite, run:");
|
|
18829
|
-
console.log(` ${
|
|
20079
|
+
console.log(` ${chalk28.cyan("vm0 setup-github --force")}`);
|
|
18830
20080
|
process.exit(0);
|
|
18831
20081
|
}
|
|
18832
20082
|
}
|
|
18833
20083
|
console.log();
|
|
18834
20084
|
}
|
|
18835
20085
|
console.log("Creating workflow files...");
|
|
18836
|
-
await mkdir7(
|
|
20086
|
+
await mkdir7(path15.join(gitRoot, ".github/workflows"), { recursive: true });
|
|
18837
20087
|
await writeFile8(publishPath, generatePublishYaml(workingDir));
|
|
18838
20088
|
const publishStatus = existingFiles.includes(displayPublishPath) ? "Overwrote" : "Created";
|
|
18839
|
-
console.log(
|
|
20089
|
+
console.log(chalk28.green(`\u2713 ${publishStatus} ${displayPublishPath}`));
|
|
18840
20090
|
await writeFile8(runPath, generateRunYaml(agentName, secrets, vars));
|
|
18841
20091
|
const runStatus = existingFiles.includes(displayRunPath) ? "Overwrote" : "Created";
|
|
18842
|
-
console.log(
|
|
20092
|
+
console.log(chalk28.green(`\u2713 ${runStatus} ${displayRunPath}`));
|
|
18843
20093
|
console.log();
|
|
18844
20094
|
if (options.skipSecrets) {
|
|
18845
|
-
console.log(
|
|
20095
|
+
console.log(chalk28.green("\u2713 Done (secrets setup skipped)"));
|
|
18846
20096
|
return;
|
|
18847
20097
|
}
|
|
18848
20098
|
const { secretStatuses, varStatuses } = await detectSecretValues(
|
|
@@ -18882,14 +20132,14 @@ var setupGithubCommand = new Command23().name("setup-github").description("Initi
|
|
|
18882
20132
|
if (s.found && s.value) {
|
|
18883
20133
|
const success2 = setGitHubSecret(s.name, s.value);
|
|
18884
20134
|
if (success2) {
|
|
18885
|
-
console.log(` ${
|
|
20135
|
+
console.log(` ${chalk28.green("\u2713")} ${s.name}`);
|
|
18886
20136
|
} else {
|
|
18887
|
-
console.log(` ${
|
|
20137
|
+
console.log(` ${chalk28.red("\u2717")} ${s.name} (failed)`);
|
|
18888
20138
|
failedSecrets.push(s.name);
|
|
18889
20139
|
}
|
|
18890
20140
|
} else {
|
|
18891
20141
|
console.log(
|
|
18892
|
-
` ${
|
|
20142
|
+
` ${chalk28.yellow("\u26A0")} ${s.name} (skipped - not found)`
|
|
18893
20143
|
);
|
|
18894
20144
|
}
|
|
18895
20145
|
}
|
|
@@ -18901,14 +20151,14 @@ var setupGithubCommand = new Command23().name("setup-github").description("Initi
|
|
|
18901
20151
|
if (v.found && v.value) {
|
|
18902
20152
|
const success2 = setGitHubVariable(v.name, v.value);
|
|
18903
20153
|
if (success2) {
|
|
18904
|
-
console.log(` ${
|
|
20154
|
+
console.log(` ${chalk28.green("\u2713")} ${v.name}`);
|
|
18905
20155
|
} else {
|
|
18906
|
-
console.log(` ${
|
|
20156
|
+
console.log(` ${chalk28.red("\u2717")} ${v.name} (failed)`);
|
|
18907
20157
|
failedVars.push(v.name);
|
|
18908
20158
|
}
|
|
18909
20159
|
} else {
|
|
18910
20160
|
console.log(
|
|
18911
|
-
` ${
|
|
20161
|
+
` ${chalk28.yellow("\u26A0")} ${v.name} (skipped - not found)`
|
|
18912
20162
|
);
|
|
18913
20163
|
}
|
|
18914
20164
|
}
|
|
@@ -18931,10 +20181,10 @@ var setupGithubCommand = new Command23().name("setup-github").description("Initi
|
|
|
18931
20181
|
);
|
|
18932
20182
|
|
|
18933
20183
|
// src/index.ts
|
|
18934
|
-
var program = new
|
|
18935
|
-
program.name("vm0").description("VM0 CLI - A modern build tool").version("4.
|
|
20184
|
+
var program = new Command27();
|
|
20185
|
+
program.name("vm0").description("VM0 CLI - A modern build tool").version("4.38.0");
|
|
18936
20186
|
program.command("info").description("Display environment information").action(async () => {
|
|
18937
|
-
console.log(
|
|
20187
|
+
console.log(chalk29.bold("System Information:"));
|
|
18938
20188
|
console.log(`Node Version: ${process.version}`);
|
|
18939
20189
|
console.log(`Platform: ${process.platform}`);
|
|
18940
20190
|
console.log(`Architecture: ${process.arch}`);
|
|
@@ -18961,6 +20211,7 @@ program.addCommand(artifactCommand);
|
|
|
18961
20211
|
program.addCommand(cookCommand);
|
|
18962
20212
|
program.addCommand(logsCommand);
|
|
18963
20213
|
program.addCommand(scopeCommand);
|
|
20214
|
+
program.addCommand(agentsCommand);
|
|
18964
20215
|
program.addCommand(initCommand3);
|
|
18965
20216
|
program.addCommand(setupGithubCommand);
|
|
18966
20217
|
if (process.argv[1]?.endsWith("index.js") || process.argv[1]?.endsWith("index.ts") || process.argv[1]?.endsWith("vm0")) {
|