@vm0/runner 3.12.2 → 3.13.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.
Files changed (2) hide show
  1. package/index.js +569 -478
  2. package/package.json +1 -1
package/index.js CHANGED
@@ -429,6 +429,26 @@ function isProcessRunning(pid) {
429
429
  return false;
430
430
  }
431
431
  }
432
+ async function gracefulKillProcess(pid, timeoutMs = 5e3) {
433
+ if (!isProcessRunning(pid)) return true;
434
+ try {
435
+ process.kill(pid, "SIGTERM");
436
+ } catch {
437
+ return !isProcessRunning(pid);
438
+ }
439
+ const startTime = Date.now();
440
+ while (Date.now() - startTime < timeoutMs) {
441
+ if (!isProcessRunning(pid)) return true;
442
+ await new Promise((resolve) => setTimeout(resolve, 100));
443
+ }
444
+ if (isProcessRunning(pid)) {
445
+ try {
446
+ process.kill(pid, "SIGKILL");
447
+ } catch {
448
+ }
449
+ }
450
+ return !isProcessRunning(pid);
451
+ }
432
452
  function killProcessTree(pid) {
433
453
  try {
434
454
  const childPidsStr = execSync(`pgrep -P ${pid} 2>/dev/null || true`, {
@@ -7896,10 +7916,109 @@ var secretsByNameContract = c11.router({
7896
7916
  }
7897
7917
  });
7898
7918
 
7899
- // ../../packages/core/src/contracts/model-providers.ts
7919
+ // ../../packages/core/src/contracts/variables.ts
7900
7920
  import { z as z19 } from "zod";
7901
7921
  var c12 = initContract();
7902
- var modelProviderTypeSchema = z19.enum([
7922
+ var variableNameSchema = z19.string().min(1, "Variable name is required").max(255, "Variable name must be at most 255 characters").regex(
7923
+ /^[A-Z][A-Z0-9_]*$/,
7924
+ "Variable name must contain only uppercase letters, numbers, and underscores, and must start with a letter (e.g., MY_VAR)"
7925
+ );
7926
+ var variableResponseSchema = z19.object({
7927
+ id: z19.string().uuid(),
7928
+ name: z19.string(),
7929
+ value: z19.string(),
7930
+ description: z19.string().nullable(),
7931
+ createdAt: z19.string(),
7932
+ updatedAt: z19.string()
7933
+ });
7934
+ var variableListResponseSchema = z19.object({
7935
+ variables: z19.array(variableResponseSchema)
7936
+ });
7937
+ var setVariableRequestSchema = z19.object({
7938
+ name: variableNameSchema,
7939
+ value: z19.string().min(1, "Variable value is required"),
7940
+ description: z19.string().max(1e3).optional()
7941
+ });
7942
+ var variablesMainContract = c12.router({
7943
+ /**
7944
+ * GET /api/variables
7945
+ * List all variables for the current user's scope (includes values)
7946
+ */
7947
+ list: {
7948
+ method: "GET",
7949
+ path: "/api/variables",
7950
+ headers: authHeadersSchema,
7951
+ responses: {
7952
+ 200: variableListResponseSchema,
7953
+ 401: apiErrorSchema,
7954
+ 500: apiErrorSchema
7955
+ },
7956
+ summary: "List all variables (includes values)"
7957
+ },
7958
+ /**
7959
+ * PUT /api/variables
7960
+ * Create or update a variable
7961
+ */
7962
+ set: {
7963
+ method: "PUT",
7964
+ path: "/api/variables",
7965
+ headers: authHeadersSchema,
7966
+ body: setVariableRequestSchema,
7967
+ responses: {
7968
+ 200: variableResponseSchema,
7969
+ 201: variableResponseSchema,
7970
+ 400: apiErrorSchema,
7971
+ 401: apiErrorSchema,
7972
+ 500: apiErrorSchema
7973
+ },
7974
+ summary: "Create or update a variable"
7975
+ }
7976
+ });
7977
+ var variablesByNameContract = c12.router({
7978
+ /**
7979
+ * GET /api/variables/:name
7980
+ * Get a variable by name (includes value)
7981
+ */
7982
+ get: {
7983
+ method: "GET",
7984
+ path: "/api/variables/:name",
7985
+ headers: authHeadersSchema,
7986
+ pathParams: z19.object({
7987
+ name: variableNameSchema
7988
+ }),
7989
+ responses: {
7990
+ 200: variableResponseSchema,
7991
+ 401: apiErrorSchema,
7992
+ 404: apiErrorSchema,
7993
+ 500: apiErrorSchema
7994
+ },
7995
+ summary: "Get variable by name"
7996
+ },
7997
+ /**
7998
+ * DELETE /api/variables/:name
7999
+ * Delete a variable by name
8000
+ */
8001
+ delete: {
8002
+ method: "DELETE",
8003
+ path: "/api/variables/:name",
8004
+ headers: authHeadersSchema,
8005
+ pathParams: z19.object({
8006
+ name: variableNameSchema
8007
+ }),
8008
+ responses: {
8009
+ 204: c12.noBody(),
8010
+ 401: apiErrorSchema,
8011
+ 404: apiErrorSchema,
8012
+ 500: apiErrorSchema
8013
+ },
8014
+ summary: "Delete a variable"
8015
+ }
8016
+ });
8017
+
8018
+ // ../../packages/core/src/contracts/model-providers.ts
8019
+ import { z as z20 } from "zod";
8020
+ var c13 = initContract();
8021
+ var modelProviderTypeSchema = z20.enum([
7903
8022
  "claude-code-oauth-token",
7904
8023
  "anthropic-api-key",
7905
8024
  "openrouter-api-key",
@@ -7910,46 +8029,46 @@ var modelProviderTypeSchema = z19.enum([
7910
8029
  "azure-foundry",
7911
8030
  "aws-bedrock"
7912
8031
  ]);
7913
- var modelProviderFrameworkSchema = z19.enum(["claude-code", "codex"]);
7914
- var modelProviderResponseSchema = z19.object({
7915
- id: z19.string().uuid(),
8032
+ var modelProviderFrameworkSchema = z20.enum(["claude-code", "codex"]);
8033
+ var modelProviderResponseSchema = z20.object({
8034
+ id: z20.string().uuid(),
7916
8035
  type: modelProviderTypeSchema,
7917
8036
  framework: modelProviderFrameworkSchema,
7918
- credentialName: z19.string().nullable(),
8037
+ credentialName: z20.string().nullable(),
7919
8038
  // Legacy single-credential (deprecated for multi-auth)
7920
- authMethod: z19.string().nullable(),
8039
+ authMethod: z20.string().nullable(),
7921
8040
  // For multi-auth providers
7922
- credentialNames: z19.array(z19.string()).nullable(),
8041
+ credentialNames: z20.array(z20.string()).nullable(),
7923
8042
  // For multi-auth providers
7924
- isDefault: z19.boolean(),
7925
- selectedModel: z19.string().nullable(),
7926
- createdAt: z19.string(),
7927
- updatedAt: z19.string()
8043
+ isDefault: z20.boolean(),
8044
+ selectedModel: z20.string().nullable(),
8045
+ createdAt: z20.string(),
8046
+ updatedAt: z20.string()
7928
8047
  });
7929
- var modelProviderListResponseSchema = z19.object({
7930
- modelProviders: z19.array(modelProviderResponseSchema)
8048
+ var modelProviderListResponseSchema = z20.object({
8049
+ modelProviders: z20.array(modelProviderResponseSchema)
7931
8050
  });
7932
- var upsertModelProviderRequestSchema = z19.object({
8051
+ var upsertModelProviderRequestSchema = z20.object({
7933
8052
  type: modelProviderTypeSchema,
7934
- credential: z19.string().min(1).optional(),
8053
+ credential: z20.string().min(1).optional(),
7935
8054
  // Legacy single credential
7936
- authMethod: z19.string().optional(),
8055
+ authMethod: z20.string().optional(),
7937
8056
  // For multi-auth providers
7938
- credentials: z19.record(z19.string(), z19.string()).optional(),
8057
+ credentials: z20.record(z20.string(), z20.string()).optional(),
7939
8058
  // For multi-auth providers
7940
- convert: z19.boolean().optional(),
7941
- selectedModel: z19.string().optional()
8059
+ convert: z20.boolean().optional(),
8060
+ selectedModel: z20.string().optional()
7942
8061
  });
7943
- var upsertModelProviderResponseSchema = z19.object({
8062
+ var upsertModelProviderResponseSchema = z20.object({
7944
8063
  provider: modelProviderResponseSchema,
7945
- created: z19.boolean()
8064
+ created: z20.boolean()
7946
8065
  });
7947
- var checkCredentialResponseSchema = z19.object({
7948
- exists: z19.boolean(),
7949
- credentialName: z19.string(),
7950
- currentType: z19.enum(["user", "model-provider"]).optional()
8066
+ var checkCredentialResponseSchema = z20.object({
8067
+ exists: z20.boolean(),
8068
+ credentialName: z20.string(),
8069
+ currentType: z20.enum(["user", "model-provider"]).optional()
7951
8070
  });
7952
- var modelProvidersMainContract = c12.router({
8071
+ var modelProvidersMainContract = c13.router({
7953
8072
  list: {
7954
8073
  method: "GET",
7955
8074
  path: "/api/model-providers",
@@ -7977,12 +8096,12 @@ var modelProvidersMainContract = c12.router({
7977
8096
  summary: "Create or update a model provider"
7978
8097
  }
7979
8098
  });
7980
- var modelProvidersCheckContract = c12.router({
8099
+ var modelProvidersCheckContract = c13.router({
7981
8100
  check: {
7982
8101
  method: "GET",
7983
8102
  path: "/api/model-providers/check/:type",
7984
8103
  headers: authHeadersSchema,
7985
- pathParams: z19.object({
8104
+ pathParams: z20.object({
7986
8105
  type: modelProviderTypeSchema
7987
8106
  }),
7988
8107
  responses: {
@@ -7993,16 +8112,16 @@ var modelProvidersCheckContract = c12.router({
7993
8112
  summary: "Check if credential exists for a model provider type"
7994
8113
  }
7995
8114
  });
7996
- var modelProvidersByTypeContract = c12.router({
8115
+ var modelProvidersByTypeContract = c13.router({
7997
8116
  delete: {
7998
8117
  method: "DELETE",
7999
8118
  path: "/api/model-providers/:type",
8000
8119
  headers: authHeadersSchema,
8001
- pathParams: z19.object({
8120
+ pathParams: z20.object({
8002
8121
  type: modelProviderTypeSchema
8003
8122
  }),
8004
8123
  responses: {
8005
- 204: c12.noBody(),
8124
+ 204: c13.noBody(),
8006
8125
  401: apiErrorSchema,
8007
8126
  404: apiErrorSchema,
8008
8127
  500: apiErrorSchema
@@ -8010,15 +8129,15 @@ var modelProvidersByTypeContract = c12.router({
8010
8129
  summary: "Delete a model provider"
8011
8130
  }
8012
8131
  });
8013
- var modelProvidersConvertContract = c12.router({
8132
+ var modelProvidersConvertContract = c13.router({
8014
8133
  convert: {
8015
8134
  method: "POST",
8016
8135
  path: "/api/model-providers/:type/convert",
8017
8136
  headers: authHeadersSchema,
8018
- pathParams: z19.object({
8137
+ pathParams: z20.object({
8019
8138
  type: modelProviderTypeSchema
8020
8139
  }),
8021
- body: z19.undefined(),
8140
+ body: z20.undefined(),
8022
8141
  responses: {
8023
8142
  200: modelProviderResponseSchema,
8024
8143
  400: apiErrorSchema,
@@ -8029,15 +8148,15 @@ var modelProvidersConvertContract = c12.router({
8029
8148
  summary: "Convert existing user credential to model provider"
8030
8149
  }
8031
8150
  });
8032
- var modelProvidersSetDefaultContract = c12.router({
8151
+ var modelProvidersSetDefaultContract = c13.router({
8033
8152
  setDefault: {
8034
8153
  method: "POST",
8035
8154
  path: "/api/model-providers/:type/set-default",
8036
8155
  headers: authHeadersSchema,
8037
- pathParams: z19.object({
8156
+ pathParams: z20.object({
8038
8157
  type: modelProviderTypeSchema
8039
8158
  }),
8040
- body: z19.undefined(),
8159
+ body: z20.undefined(),
8041
8160
  responses: {
8042
8161
  200: modelProviderResponseSchema,
8043
8162
  401: apiErrorSchema,
@@ -8047,15 +8166,15 @@ var modelProvidersSetDefaultContract = c12.router({
8047
8166
  summary: "Set a model provider as default for its framework"
8048
8167
  }
8049
8168
  });
8050
- var updateModelRequestSchema = z19.object({
8051
- selectedModel: z19.string().optional()
8169
+ var updateModelRequestSchema = z20.object({
8170
+ selectedModel: z20.string().optional()
8052
8171
  });
8053
- var modelProvidersUpdateModelContract = c12.router({
8172
+ var modelProvidersUpdateModelContract = c13.router({
8054
8173
  updateModel: {
8055
8174
  method: "PATCH",
8056
8175
  path: "/api/model-providers/:type/model",
8057
8176
  headers: authHeadersSchema,
8058
- pathParams: z19.object({
8177
+ pathParams: z20.object({
8059
8178
  type: modelProviderTypeSchema
8060
8179
  }),
8061
8180
  body: updateModelRequestSchema,
@@ -8070,42 +8189,42 @@ var modelProvidersUpdateModelContract = c12.router({
8070
8189
  });
8071
8190
 
8072
8191
  // ../../packages/core/src/contracts/sessions.ts
8073
- import { z as z20 } from "zod";
8074
- var c13 = initContract();
8075
- var sessionResponseSchema = z20.object({
8076
- id: z20.string(),
8077
- agentComposeId: z20.string(),
8078
- agentComposeVersionId: z20.string().nullable(),
8079
- conversationId: z20.string().nullable(),
8080
- artifactName: z20.string().nullable(),
8081
- vars: z20.record(z20.string(), z20.string()).nullable(),
8082
- secretNames: z20.array(z20.string()).nullable(),
8083
- volumeVersions: z20.record(z20.string(), z20.string()).nullable(),
8084
- createdAt: z20.string(),
8085
- updatedAt: z20.string()
8192
+ import { z as z21 } from "zod";
8193
+ var c14 = initContract();
8194
+ var sessionResponseSchema = z21.object({
8195
+ id: z21.string(),
8196
+ agentComposeId: z21.string(),
8197
+ agentComposeVersionId: z21.string().nullable(),
8198
+ conversationId: z21.string().nullable(),
8199
+ artifactName: z21.string().nullable(),
8200
+ vars: z21.record(z21.string(), z21.string()).nullable(),
8201
+ secretNames: z21.array(z21.string()).nullable(),
8202
+ volumeVersions: z21.record(z21.string(), z21.string()).nullable(),
8203
+ createdAt: z21.string(),
8204
+ updatedAt: z21.string()
8086
8205
  });
8087
- var agentComposeSnapshotSchema = z20.object({
8088
- agentComposeVersionId: z20.string(),
8089
- vars: z20.record(z20.string(), z20.string()).optional(),
8090
- secretNames: z20.array(z20.string()).optional()
8206
+ var agentComposeSnapshotSchema = z21.object({
8207
+ agentComposeVersionId: z21.string(),
8208
+ vars: z21.record(z21.string(), z21.string()).optional(),
8209
+ secretNames: z21.array(z21.string()).optional()
8091
8210
  });
8092
- var artifactSnapshotSchema2 = z20.object({
8093
- artifactName: z20.string(),
8094
- artifactVersion: z20.string()
8211
+ var artifactSnapshotSchema2 = z21.object({
8212
+ artifactName: z21.string(),
8213
+ artifactVersion: z21.string()
8095
8214
  });
8096
- var volumeVersionsSnapshotSchema2 = z20.object({
8097
- versions: z20.record(z20.string(), z20.string())
8215
+ var volumeVersionsSnapshotSchema2 = z21.object({
8216
+ versions: z21.record(z21.string(), z21.string())
8098
8217
  });
8099
- var checkpointResponseSchema = z20.object({
8100
- id: z20.string(),
8101
- runId: z20.string(),
8102
- conversationId: z20.string(),
8218
+ var checkpointResponseSchema = z21.object({
8219
+ id: z21.string(),
8220
+ runId: z21.string(),
8221
+ conversationId: z21.string(),
8103
8222
  agentComposeSnapshot: agentComposeSnapshotSchema,
8104
8223
  artifactSnapshot: artifactSnapshotSchema2.nullable(),
8105
8224
  volumeVersionsSnapshot: volumeVersionsSnapshotSchema2.nullable(),
8106
- createdAt: z20.string()
8225
+ createdAt: z21.string()
8107
8226
  });
8108
- var sessionsByIdContract = c13.router({
8227
+ var sessionsByIdContract = c14.router({
8109
8228
  /**
8110
8229
  * GET /api/agent/sessions/:id
8111
8230
  * Get session by ID
@@ -8114,8 +8233,8 @@ var sessionsByIdContract = c13.router({
8114
8233
  method: "GET",
8115
8234
  path: "/api/agent/sessions/:id",
8116
8235
  headers: authHeadersSchema,
8117
- pathParams: z20.object({
8118
- id: z20.string().min(1, "Session ID is required")
8236
+ pathParams: z21.object({
8237
+ id: z21.string().min(1, "Session ID is required")
8119
8238
  }),
8120
8239
  responses: {
8121
8240
  200: sessionResponseSchema,
@@ -8126,7 +8245,7 @@ var sessionsByIdContract = c13.router({
8126
8245
  summary: "Get session by ID"
8127
8246
  }
8128
8247
  });
8129
- var checkpointsByIdContract = c13.router({
8248
+ var checkpointsByIdContract = c14.router({
8130
8249
  /**
8131
8250
  * GET /api/agent/checkpoints/:id
8132
8251
  * Get checkpoint by ID
@@ -8135,8 +8254,8 @@ var checkpointsByIdContract = c13.router({
8135
8254
  method: "GET",
8136
8255
  path: "/api/agent/checkpoints/:id",
8137
8256
  headers: authHeadersSchema,
8138
- pathParams: z20.object({
8139
- id: z20.string().min(1, "Checkpoint ID is required")
8257
+ pathParams: z21.object({
8258
+ id: z21.string().min(1, "Checkpoint ID is required")
8140
8259
  }),
8141
8260
  responses: {
8142
8261
  200: checkpointResponseSchema,
@@ -8149,93 +8268,93 @@ var checkpointsByIdContract = c13.router({
8149
8268
  });
8150
8269
 
8151
8270
  // ../../packages/core/src/contracts/schedules.ts
8152
- import { z as z21 } from "zod";
8153
- var c14 = initContract();
8154
- var scheduleTriggerSchema = z21.object({
8155
- cron: z21.string().optional(),
8156
- at: z21.string().optional(),
8157
- timezone: z21.string().default("UTC")
8271
+ import { z as z22 } from "zod";
8272
+ var c15 = initContract();
8273
+ var scheduleTriggerSchema = z22.object({
8274
+ cron: z22.string().optional(),
8275
+ at: z22.string().optional(),
8276
+ timezone: z22.string().default("UTC")
8158
8277
  }).refine((data) => data.cron && !data.at || !data.cron && data.at, {
8159
8278
  message: "Exactly one of 'cron' or 'at' must be specified"
8160
8279
  });
8161
- var scheduleRunConfigSchema = z21.object({
8162
- agent: z21.string().min(1, "Agent reference required"),
8163
- prompt: z21.string().min(1, "Prompt required"),
8164
- vars: z21.record(z21.string(), z21.string()).optional(),
8165
- secrets: z21.record(z21.string(), z21.string()).optional(),
8166
- artifactName: z21.string().optional(),
8167
- artifactVersion: z21.string().optional(),
8168
- volumeVersions: z21.record(z21.string(), z21.string()).optional()
8280
+ var scheduleRunConfigSchema = z22.object({
8281
+ agent: z22.string().min(1, "Agent reference required"),
8282
+ prompt: z22.string().min(1, "Prompt required"),
8283
+ vars: z22.record(z22.string(), z22.string()).optional(),
8284
+ secrets: z22.record(z22.string(), z22.string()).optional(),
8285
+ artifactName: z22.string().optional(),
8286
+ artifactVersion: z22.string().optional(),
8287
+ volumeVersions: z22.record(z22.string(), z22.string()).optional()
8169
8288
  });
8170
- var scheduleDefinitionSchema = z21.object({
8289
+ var scheduleDefinitionSchema = z22.object({
8171
8290
  on: scheduleTriggerSchema,
8172
8291
  run: scheduleRunConfigSchema
8173
8292
  });
8174
- var scheduleYamlSchema = z21.object({
8175
- version: z21.literal("1.0"),
8176
- schedules: z21.record(z21.string(), scheduleDefinitionSchema)
8177
- });
8178
- var deployScheduleRequestSchema = z21.object({
8179
- name: z21.string().min(1).max(64, "Schedule name max 64 chars"),
8180
- cronExpression: z21.string().optional(),
8181
- atTime: z21.string().optional(),
8182
- timezone: z21.string().default("UTC"),
8183
- prompt: z21.string().min(1, "Prompt required"),
8184
- vars: z21.record(z21.string(), z21.string()).optional(),
8185
- secrets: z21.record(z21.string(), z21.string()).optional(),
8186
- artifactName: z21.string().optional(),
8187
- artifactVersion: z21.string().optional(),
8188
- volumeVersions: z21.record(z21.string(), z21.string()).optional(),
8293
+ var scheduleYamlSchema = z22.object({
8294
+ version: z22.literal("1.0"),
8295
+ schedules: z22.record(z22.string(), scheduleDefinitionSchema)
8296
+ });
8297
+ var deployScheduleRequestSchema = z22.object({
8298
+ name: z22.string().min(1).max(64, "Schedule name max 64 chars"),
8299
+ cronExpression: z22.string().optional(),
8300
+ atTime: z22.string().optional(),
8301
+ timezone: z22.string().default("UTC"),
8302
+ prompt: z22.string().min(1, "Prompt required"),
8303
+ vars: z22.record(z22.string(), z22.string()).optional(),
8304
+ secrets: z22.record(z22.string(), z22.string()).optional(),
8305
+ artifactName: z22.string().optional(),
8306
+ artifactVersion: z22.string().optional(),
8307
+ volumeVersions: z22.record(z22.string(), z22.string()).optional(),
8189
8308
  // Resolved agent compose ID (CLI resolves scope/name:version → composeId)
8190
- composeId: z21.string().uuid("Invalid compose ID")
8309
+ composeId: z22.string().uuid("Invalid compose ID")
8191
8310
  }).refine(
8192
8311
  (data) => data.cronExpression && !data.atTime || !data.cronExpression && data.atTime,
8193
8312
  {
8194
8313
  message: "Exactly one of 'cronExpression' or 'atTime' must be specified"
8195
8314
  }
8196
8315
  );
8197
- var scheduleResponseSchema = z21.object({
8198
- id: z21.string().uuid(),
8199
- composeId: z21.string().uuid(),
8200
- composeName: z21.string(),
8201
- scopeSlug: z21.string(),
8202
- name: z21.string(),
8203
- cronExpression: z21.string().nullable(),
8204
- atTime: z21.string().nullable(),
8205
- timezone: z21.string(),
8206
- prompt: z21.string(),
8207
- vars: z21.record(z21.string(), z21.string()).nullable(),
8316
+ var scheduleResponseSchema = z22.object({
8317
+ id: z22.string().uuid(),
8318
+ composeId: z22.string().uuid(),
8319
+ composeName: z22.string(),
8320
+ scopeSlug: z22.string(),
8321
+ name: z22.string(),
8322
+ cronExpression: z22.string().nullable(),
8323
+ atTime: z22.string().nullable(),
8324
+ timezone: z22.string(),
8325
+ prompt: z22.string(),
8326
+ vars: z22.record(z22.string(), z22.string()).nullable(),
8208
8327
  // Secret names only (values are never returned)
8209
- secretNames: z21.array(z21.string()).nullable(),
8210
- artifactName: z21.string().nullable(),
8211
- artifactVersion: z21.string().nullable(),
8212
- volumeVersions: z21.record(z21.string(), z21.string()).nullable(),
8213
- enabled: z21.boolean(),
8214
- nextRunAt: z21.string().nullable(),
8215
- lastRunAt: z21.string().nullable(),
8216
- retryStartedAt: z21.string().nullable(),
8217
- createdAt: z21.string(),
8218
- updatedAt: z21.string()
8219
- });
8220
- var runSummarySchema = z21.object({
8221
- id: z21.string().uuid(),
8222
- status: z21.enum(["pending", "running", "completed", "failed", "timeout"]),
8223
- createdAt: z21.string(),
8224
- completedAt: z21.string().nullable(),
8225
- error: z21.string().nullable()
8226
- });
8227
- var scheduleRunsResponseSchema = z21.object({
8228
- runs: z21.array(runSummarySchema)
8229
- });
8230
- var scheduleListResponseSchema = z21.object({
8231
- schedules: z21.array(scheduleResponseSchema)
8232
- });
8233
- var deployScheduleResponseSchema = z21.object({
8328
+ secretNames: z22.array(z22.string()).nullable(),
8329
+ artifactName: z22.string().nullable(),
8330
+ artifactVersion: z22.string().nullable(),
8331
+ volumeVersions: z22.record(z22.string(), z22.string()).nullable(),
8332
+ enabled: z22.boolean(),
8333
+ nextRunAt: z22.string().nullable(),
8334
+ lastRunAt: z22.string().nullable(),
8335
+ retryStartedAt: z22.string().nullable(),
8336
+ createdAt: z22.string(),
8337
+ updatedAt: z22.string()
8338
+ });
8339
+ var runSummarySchema = z22.object({
8340
+ id: z22.string().uuid(),
8341
+ status: z22.enum(["pending", "running", "completed", "failed", "timeout"]),
8342
+ createdAt: z22.string(),
8343
+ completedAt: z22.string().nullable(),
8344
+ error: z22.string().nullable()
8345
+ });
8346
+ var scheduleRunsResponseSchema = z22.object({
8347
+ runs: z22.array(runSummarySchema)
8348
+ });
8349
+ var scheduleListResponseSchema = z22.object({
8350
+ schedules: z22.array(scheduleResponseSchema)
8351
+ });
8352
+ var deployScheduleResponseSchema = z22.object({
8234
8353
  schedule: scheduleResponseSchema,
8235
- created: z21.boolean()
8354
+ created: z22.boolean()
8236
8355
  // true if created, false if updated
8237
8356
  });
8238
- var schedulesMainContract = c14.router({
8357
+ var schedulesMainContract = c15.router({
8239
8358
  /**
8240
8359
  * POST /api/agent/schedules
8241
8360
  * Deploy (create or update) a schedule
@@ -8273,7 +8392,7 @@ var schedulesMainContract = c14.router({
8273
8392
  summary: "List all schedules"
8274
8393
  }
8275
8394
  });
8276
- var schedulesByNameContract = c14.router({
8395
+ var schedulesByNameContract = c15.router({
8277
8396
  /**
8278
8397
  * GET /api/agent/schedules/:name
8279
8398
  * Get schedule by name
@@ -8282,11 +8401,11 @@ var schedulesByNameContract = c14.router({
8282
8401
  method: "GET",
8283
8402
  path: "/api/agent/schedules/:name",
8284
8403
  headers: authHeadersSchema,
8285
- pathParams: z21.object({
8286
- name: z21.string().min(1, "Schedule name required")
8404
+ pathParams: z22.object({
8405
+ name: z22.string().min(1, "Schedule name required")
8287
8406
  }),
8288
- query: z21.object({
8289
- composeId: z21.string().uuid("Compose ID required")
8407
+ query: z22.object({
8408
+ composeId: z22.string().uuid("Compose ID required")
8290
8409
  }),
8291
8410
  responses: {
8292
8411
  200: scheduleResponseSchema,
@@ -8303,21 +8422,21 @@ var schedulesByNameContract = c14.router({
8303
8422
  method: "DELETE",
8304
8423
  path: "/api/agent/schedules/:name",
8305
8424
  headers: authHeadersSchema,
8306
- pathParams: z21.object({
8307
- name: z21.string().min(1, "Schedule name required")
8425
+ pathParams: z22.object({
8426
+ name: z22.string().min(1, "Schedule name required")
8308
8427
  }),
8309
- query: z21.object({
8310
- composeId: z21.string().uuid("Compose ID required")
8428
+ query: z22.object({
8429
+ composeId: z22.string().uuid("Compose ID required")
8311
8430
  }),
8312
8431
  responses: {
8313
- 204: c14.noBody(),
8432
+ 204: c15.noBody(),
8314
8433
  401: apiErrorSchema,
8315
8434
  404: apiErrorSchema
8316
8435
  },
8317
8436
  summary: "Delete schedule"
8318
8437
  }
8319
8438
  });
8320
- var schedulesEnableContract = c14.router({
8439
+ var schedulesEnableContract = c15.router({
8321
8440
  /**
8322
8441
  * POST /api/agent/schedules/:name/enable
8323
8442
  * Enable a disabled schedule
@@ -8326,11 +8445,11 @@ var schedulesEnableContract = c14.router({
8326
8445
  method: "POST",
8327
8446
  path: "/api/agent/schedules/:name/enable",
8328
8447
  headers: authHeadersSchema,
8329
- pathParams: z21.object({
8330
- name: z21.string().min(1, "Schedule name required")
8448
+ pathParams: z22.object({
8449
+ name: z22.string().min(1, "Schedule name required")
8331
8450
  }),
8332
- body: z21.object({
8333
- composeId: z21.string().uuid("Compose ID required")
8451
+ body: z22.object({
8452
+ composeId: z22.string().uuid("Compose ID required")
8334
8453
  }),
8335
8454
  responses: {
8336
8455
  200: scheduleResponseSchema,
@@ -8347,11 +8466,11 @@ var schedulesEnableContract = c14.router({
8347
8466
  method: "POST",
8348
8467
  path: "/api/agent/schedules/:name/disable",
8349
8468
  headers: authHeadersSchema,
8350
- pathParams: z21.object({
8351
- name: z21.string().min(1, "Schedule name required")
8469
+ pathParams: z22.object({
8470
+ name: z22.string().min(1, "Schedule name required")
8352
8471
  }),
8353
- body: z21.object({
8354
- composeId: z21.string().uuid("Compose ID required")
8472
+ body: z22.object({
8473
+ composeId: z22.string().uuid("Compose ID required")
8355
8474
  }),
8356
8475
  responses: {
8357
8476
  200: scheduleResponseSchema,
@@ -8361,7 +8480,7 @@ var schedulesEnableContract = c14.router({
8361
8480
  summary: "Disable schedule"
8362
8481
  }
8363
8482
  });
8364
- var scheduleRunsContract = c14.router({
8483
+ var scheduleRunsContract = c15.router({
8365
8484
  /**
8366
8485
  * GET /api/agent/schedules/:name/runs
8367
8486
  * List recent runs for a schedule
@@ -8370,12 +8489,12 @@ var scheduleRunsContract = c14.router({
8370
8489
  method: "GET",
8371
8490
  path: "/api/agent/schedules/:name/runs",
8372
8491
  headers: authHeadersSchema,
8373
- pathParams: z21.object({
8374
- name: z21.string().min(1, "Schedule name required")
8492
+ pathParams: z22.object({
8493
+ name: z22.string().min(1, "Schedule name required")
8375
8494
  }),
8376
- query: z21.object({
8377
- composeId: z21.string().uuid("Compose ID required"),
8378
- limit: z21.coerce.number().min(0).max(100).default(5)
8495
+ query: z22.object({
8496
+ composeId: z22.string().uuid("Compose ID required"),
8497
+ limit: z22.coerce.number().min(0).max(100).default(5)
8379
8498
  }),
8380
8499
  responses: {
8381
8500
  200: scheduleRunsResponseSchema,
@@ -8387,18 +8506,18 @@ var scheduleRunsContract = c14.router({
8387
8506
  });
8388
8507
 
8389
8508
  // ../../packages/core/src/contracts/realtime.ts
8390
- import { z as z22 } from "zod";
8391
- var c15 = initContract();
8392
- var ablyTokenRequestSchema = z22.object({
8393
- keyName: z22.string(),
8394
- ttl: z22.number().optional(),
8395
- timestamp: z22.number(),
8396
- capability: z22.string(),
8397
- clientId: z22.string().optional(),
8398
- nonce: z22.string(),
8399
- mac: z22.string()
8509
+ import { z as z23 } from "zod";
8510
+ var c16 = initContract();
8511
+ var ablyTokenRequestSchema = z23.object({
8512
+ keyName: z23.string(),
8513
+ ttl: z23.number().optional(),
8514
+ timestamp: z23.number(),
8515
+ capability: z23.string(),
8516
+ clientId: z23.string().optional(),
8517
+ nonce: z23.string(),
8518
+ mac: z23.string()
8400
8519
  });
8401
- var realtimeTokenContract = c15.router({
8520
+ var realtimeTokenContract = c16.router({
8402
8521
  /**
8403
8522
  * POST /api/realtime/token
8404
8523
  * Get an Ably token to subscribe to a run's events channel
@@ -8407,8 +8526,8 @@ var realtimeTokenContract = c15.router({
8407
8526
  method: "POST",
8408
8527
  path: "/api/realtime/token",
8409
8528
  headers: authHeadersSchema,
8410
- body: z22.object({
8411
- runId: z22.string().uuid("runId must be a valid UUID")
8529
+ body: z23.object({
8530
+ runId: z23.string().uuid("runId must be a valid UUID")
8412
8531
  }),
8413
8532
  responses: {
8414
8533
  200: ablyTokenRequestSchema,
@@ -8420,7 +8539,7 @@ var realtimeTokenContract = c15.router({
8420
8539
  summary: "Get Ably token for run event subscription"
8421
8540
  }
8422
8541
  });
8423
- var runnerRealtimeTokenContract = c15.router({
8542
+ var runnerRealtimeTokenContract = c16.router({
8424
8543
  /**
8425
8544
  * POST /api/runners/realtime/token
8426
8545
  * Get an Ably token to subscribe to a runner group's job notification channel
@@ -8429,7 +8548,7 @@ var runnerRealtimeTokenContract = c15.router({
8429
8548
  method: "POST",
8430
8549
  path: "/api/runners/realtime/token",
8431
8550
  headers: authHeadersSchema,
8432
- body: z22.object({
8551
+ body: z23.object({
8433
8552
  group: runnerGroupSchema
8434
8553
  }),
8435
8554
  responses: {
@@ -8443,11 +8562,11 @@ var runnerRealtimeTokenContract = c15.router({
8443
8562
  });
8444
8563
 
8445
8564
  // ../../packages/core/src/contracts/platform.ts
8446
- import { z as z24 } from "zod";
8565
+ import { z as z25 } from "zod";
8447
8566
 
8448
8567
  // ../../packages/core/src/contracts/public/common.ts
8449
- import { z as z23 } from "zod";
8450
- var publicApiErrorTypeSchema = z23.enum([
8568
+ import { z as z24 } from "zod";
8569
+ var publicApiErrorTypeSchema = z24.enum([
8451
8570
  "api_error",
8452
8571
  // Internal server error (5xx)
8453
8572
  "invalid_request_error",
@@ -8461,40 +8580,40 @@ var publicApiErrorTypeSchema = z23.enum([
8461
8580
  "rate_limit_error"
8462
8581
  // Rate limit exceeded (429)
8463
8582
  ]);
8464
- var publicApiErrorSchema = z23.object({
8465
- error: z23.object({
8583
+ var publicApiErrorSchema = z24.object({
8584
+ error: z24.object({
8466
8585
  type: publicApiErrorTypeSchema,
8467
- code: z23.string(),
8468
- message: z23.string(),
8469
- param: z23.string().optional(),
8470
- docUrl: z23.string().url().optional()
8586
+ code: z24.string(),
8587
+ message: z24.string(),
8588
+ param: z24.string().optional(),
8589
+ docUrl: z24.string().url().optional()
8471
8590
  })
8472
8591
  });
8473
- var paginationSchema = z23.object({
8474
- hasMore: z23.boolean(),
8475
- nextCursor: z23.string().nullable()
8592
+ var paginationSchema = z24.object({
8593
+ hasMore: z24.boolean(),
8594
+ nextCursor: z24.string().nullable()
8476
8595
  });
8477
8596
  function createPaginatedResponseSchema(dataSchema) {
8478
- return z23.object({
8479
- data: z23.array(dataSchema),
8597
+ return z24.object({
8598
+ data: z24.array(dataSchema),
8480
8599
  pagination: paginationSchema
8481
8600
  });
8482
8601
  }
8483
- var listQuerySchema = z23.object({
8484
- cursor: z23.string().optional(),
8485
- limit: z23.coerce.number().min(1).max(100).default(20)
8602
+ var listQuerySchema = z24.object({
8603
+ cursor: z24.string().optional(),
8604
+ limit: z24.coerce.number().min(1).max(100).default(20)
8486
8605
  });
8487
- var requestIdSchema = z23.string().uuid();
8488
- var timestampSchema = z23.string().datetime();
8606
+ var requestIdSchema = z24.string().uuid();
8607
+ var timestampSchema = z24.string().datetime();
8489
8608
 
8490
8609
  // ../../packages/core/src/contracts/platform.ts
8491
- var c16 = initContract();
8492
- var platformPaginationSchema = z24.object({
8493
- hasMore: z24.boolean(),
8494
- nextCursor: z24.string().nullable(),
8495
- totalPages: z24.number()
8610
+ var c17 = initContract();
8611
+ var platformPaginationSchema = z25.object({
8612
+ hasMore: z25.boolean(),
8613
+ nextCursor: z25.string().nullable(),
8614
+ totalPages: z25.number()
8496
8615
  });
8497
- var platformLogStatusSchema = z24.enum([
8616
+ var platformLogStatusSchema = z25.enum([
8498
8617
  "pending",
8499
8618
  "running",
8500
8619
  "completed",
@@ -8502,41 +8621,41 @@ var platformLogStatusSchema = z24.enum([
8502
8621
  "timeout",
8503
8622
  "cancelled"
8504
8623
  ]);
8505
- var platformLogEntrySchema = z24.object({
8506
- id: z24.string().uuid(),
8507
- sessionId: z24.string().nullable(),
8508
- agentName: z24.string(),
8509
- framework: z24.string().nullable(),
8624
+ var platformLogEntrySchema = z25.object({
8625
+ id: z25.string().uuid(),
8626
+ sessionId: z25.string().nullable(),
8627
+ agentName: z25.string(),
8628
+ framework: z25.string().nullable(),
8510
8629
  status: platformLogStatusSchema,
8511
- createdAt: z24.string()
8630
+ createdAt: z25.string()
8512
8631
  });
8513
- var platformLogsListResponseSchema = z24.object({
8514
- data: z24.array(platformLogEntrySchema),
8632
+ var platformLogsListResponseSchema = z25.object({
8633
+ data: z25.array(platformLogEntrySchema),
8515
8634
  pagination: platformPaginationSchema
8516
8635
  });
8517
- var artifactSchema = z24.object({
8518
- name: z24.string().nullable(),
8519
- version: z24.string().nullable()
8636
+ var artifactSchema = z25.object({
8637
+ name: z25.string().nullable(),
8638
+ version: z25.string().nullable()
8520
8639
  });
8521
- var platformLogDetailSchema = z24.object({
8522
- id: z24.string().uuid(),
8523
- sessionId: z24.string().nullable(),
8524
- agentName: z24.string(),
8525
- framework: z24.string().nullable(),
8640
+ var platformLogDetailSchema = z25.object({
8641
+ id: z25.string().uuid(),
8642
+ sessionId: z25.string().nullable(),
8643
+ agentName: z25.string(),
8644
+ framework: z25.string().nullable(),
8526
8645
  status: platformLogStatusSchema,
8527
- prompt: z24.string(),
8528
- error: z24.string().nullable(),
8529
- createdAt: z24.string(),
8530
- startedAt: z24.string().nullable(),
8531
- completedAt: z24.string().nullable(),
8646
+ prompt: z25.string(),
8647
+ error: z25.string().nullable(),
8648
+ createdAt: z25.string(),
8649
+ startedAt: z25.string().nullable(),
8650
+ completedAt: z25.string().nullable(),
8532
8651
  artifact: artifactSchema
8533
8652
  });
8534
- var platformLogsListContract = c16.router({
8653
+ var platformLogsListContract = c17.router({
8535
8654
  list: {
8536
8655
  method: "GET",
8537
8656
  path: "/api/platform/logs",
8538
8657
  query: listQuerySchema.extend({
8539
- search: z24.string().optional()
8658
+ search: z25.string().optional()
8540
8659
  }),
8541
8660
  responses: {
8542
8661
  200: platformLogsListResponseSchema,
@@ -8545,12 +8664,12 @@ var platformLogsListContract = c16.router({
8545
8664
  summary: "List agent run logs with pagination"
8546
8665
  }
8547
8666
  });
8548
- var platformLogsByIdContract = c16.router({
8667
+ var platformLogsByIdContract = c17.router({
8549
8668
  getById: {
8550
8669
  method: "GET",
8551
8670
  path: "/api/platform/logs/:id",
8552
- pathParams: z24.object({
8553
- id: z24.string().uuid("Invalid log ID")
8671
+ pathParams: z25.object({
8672
+ id: z25.string().uuid("Invalid log ID")
8554
8673
  }),
8555
8674
  responses: {
8556
8675
  200: platformLogDetailSchema,
@@ -8560,17 +8679,17 @@ var platformLogsByIdContract = c16.router({
8560
8679
  summary: "Get agent run log details by ID"
8561
8680
  }
8562
8681
  });
8563
- var artifactDownloadResponseSchema = z24.object({
8564
- url: z24.string().url(),
8565
- expiresAt: z24.string()
8682
+ var artifactDownloadResponseSchema = z25.object({
8683
+ url: z25.string().url(),
8684
+ expiresAt: z25.string()
8566
8685
  });
8567
- var platformArtifactDownloadContract = c16.router({
8686
+ var platformArtifactDownloadContract = c17.router({
8568
8687
  getDownloadUrl: {
8569
8688
  method: "GET",
8570
8689
  path: "/api/platform/artifacts/download",
8571
- query: z24.object({
8572
- name: z24.string().min(1, "Artifact name is required"),
8573
- version: z24.string().optional()
8690
+ query: z25.object({
8691
+ name: z25.string().min(1, "Artifact name is required"),
8692
+ version: z25.string().optional()
8574
8693
  }),
8575
8694
  responses: {
8576
8695
  200: artifactDownloadResponseSchema,
@@ -8582,29 +8701,29 @@ var platformArtifactDownloadContract = c16.router({
8582
8701
  });
8583
8702
 
8584
8703
  // ../../packages/core/src/contracts/llm.ts
8585
- import { z as z25 } from "zod";
8586
- var c17 = initContract();
8587
- var messageRoleSchema = z25.enum(["user", "assistant", "system"]);
8588
- var chatMessageSchema = z25.object({
8704
+ import { z as z26 } from "zod";
8705
+ var c18 = initContract();
8706
+ var messageRoleSchema = z26.enum(["user", "assistant", "system"]);
8707
+ var chatMessageSchema = z26.object({
8589
8708
  role: messageRoleSchema,
8590
- content: z25.string()
8709
+ content: z26.string()
8591
8710
  });
8592
- var tokenUsageSchema = z25.object({
8593
- promptTokens: z25.number(),
8594
- completionTokens: z25.number(),
8595
- totalTokens: z25.number()
8711
+ var tokenUsageSchema = z26.object({
8712
+ promptTokens: z26.number(),
8713
+ completionTokens: z26.number(),
8714
+ totalTokens: z26.number()
8596
8715
  });
8597
- var llmChatRequestSchema = z25.object({
8598
- model: z25.string().min(1).optional(),
8599
- messages: z25.array(chatMessageSchema).min(1, "At least one message is required"),
8600
- stream: z25.boolean().optional().default(false)
8716
+ var llmChatRequestSchema = z26.object({
8717
+ model: z26.string().min(1).optional(),
8718
+ messages: z26.array(chatMessageSchema).min(1, "At least one message is required"),
8719
+ stream: z26.boolean().optional().default(false)
8601
8720
  });
8602
- var llmChatResponseSchema = z25.object({
8603
- content: z25.string(),
8604
- model: z25.string(),
8721
+ var llmChatResponseSchema = z26.object({
8722
+ content: z26.string(),
8723
+ model: z26.string(),
8605
8724
  usage: tokenUsageSchema
8606
8725
  });
8607
- var llmChatContract = c17.router({
8726
+ var llmChatContract = c18.router({
8608
8727
  chat: {
8609
8728
  method: "POST",
8610
8729
  path: "/api/llm/chat",
@@ -8620,28 +8739,28 @@ var llmChatContract = c17.router({
8620
8739
  });
8621
8740
 
8622
8741
  // ../../packages/core/src/contracts/public/agents.ts
8623
- import { z as z26 } from "zod";
8624
- var c18 = initContract();
8625
- var publicAgentSchema = z26.object({
8626
- id: z26.string(),
8627
- name: z26.string(),
8628
- currentVersionId: z26.string().nullable(),
8742
+ import { z as z27 } from "zod";
8743
+ var c19 = initContract();
8744
+ var publicAgentSchema = z27.object({
8745
+ id: z27.string(),
8746
+ name: z27.string(),
8747
+ currentVersionId: z27.string().nullable(),
8629
8748
  createdAt: timestampSchema,
8630
8749
  updatedAt: timestampSchema
8631
8750
  });
8632
- var agentVersionSchema = z26.object({
8633
- id: z26.string(),
8634
- agentId: z26.string(),
8635
- versionNumber: z26.number(),
8751
+ var agentVersionSchema = z27.object({
8752
+ id: z27.string(),
8753
+ agentId: z27.string(),
8754
+ versionNumber: z27.number(),
8636
8755
  createdAt: timestampSchema
8637
8756
  });
8638
8757
  var publicAgentDetailSchema = publicAgentSchema;
8639
8758
  var paginatedAgentsSchema = createPaginatedResponseSchema(publicAgentSchema);
8640
8759
  var paginatedAgentVersionsSchema = createPaginatedResponseSchema(agentVersionSchema);
8641
8760
  var agentListQuerySchema = listQuerySchema.extend({
8642
- name: z26.string().optional()
8761
+ name: z27.string().optional()
8643
8762
  });
8644
- var publicAgentsListContract = c18.router({
8763
+ var publicAgentsListContract = c19.router({
8645
8764
  list: {
8646
8765
  method: "GET",
8647
8766
  path: "/v1/agents",
@@ -8656,13 +8775,13 @@ var publicAgentsListContract = c18.router({
8656
8775
  description: "List all agents in the current scope with pagination. Use the `name` query parameter to filter by agent name."
8657
8776
  }
8658
8777
  });
8659
- var publicAgentByIdContract = c18.router({
8778
+ var publicAgentByIdContract = c19.router({
8660
8779
  get: {
8661
8780
  method: "GET",
8662
8781
  path: "/v1/agents/:id",
8663
8782
  headers: authHeadersSchema,
8664
- pathParams: z26.object({
8665
- id: z26.string().min(1, "Agent ID is required")
8783
+ pathParams: z27.object({
8784
+ id: z27.string().min(1, "Agent ID is required")
8666
8785
  }),
8667
8786
  responses: {
8668
8787
  200: publicAgentDetailSchema,
@@ -8674,13 +8793,13 @@ var publicAgentByIdContract = c18.router({
8674
8793
  description: "Get agent details by ID"
8675
8794
  }
8676
8795
  });
8677
- var publicAgentVersionsContract = c18.router({
8796
+ var publicAgentVersionsContract = c19.router({
8678
8797
  list: {
8679
8798
  method: "GET",
8680
8799
  path: "/v1/agents/:id/versions",
8681
8800
  headers: authHeadersSchema,
8682
- pathParams: z26.object({
8683
- id: z26.string().min(1, "Agent ID is required")
8801
+ pathParams: z27.object({
8802
+ id: z27.string().min(1, "Agent ID is required")
8684
8803
  }),
8685
8804
  query: listQuerySchema,
8686
8805
  responses: {
@@ -8695,9 +8814,9 @@ var publicAgentVersionsContract = c18.router({
8695
8814
  });
8696
8815
 
8697
8816
  // ../../packages/core/src/contracts/public/runs.ts
8698
- import { z as z27 } from "zod";
8699
- var c19 = initContract();
8700
- var publicRunStatusSchema = z27.enum([
8817
+ import { z as z28 } from "zod";
8818
+ var c20 = initContract();
8819
+ var publicRunStatusSchema = z28.enum([
8701
8820
  "pending",
8702
8821
  "running",
8703
8822
  "completed",
@@ -8705,54 +8824,54 @@ var publicRunStatusSchema = z27.enum([
8705
8824
  "timeout",
8706
8825
  "cancelled"
8707
8826
  ]);
8708
- var publicRunSchema = z27.object({
8709
- id: z27.string(),
8710
- agentId: z27.string(),
8711
- agentName: z27.string(),
8827
+ var publicRunSchema = z28.object({
8828
+ id: z28.string(),
8829
+ agentId: z28.string(),
8830
+ agentName: z28.string(),
8712
8831
  status: publicRunStatusSchema,
8713
- prompt: z27.string(),
8832
+ prompt: z28.string(),
8714
8833
  createdAt: timestampSchema,
8715
8834
  startedAt: timestampSchema.nullable(),
8716
8835
  completedAt: timestampSchema.nullable()
8717
8836
  });
8718
8837
  var publicRunDetailSchema = publicRunSchema.extend({
8719
- error: z27.string().nullable(),
8720
- executionTimeMs: z27.number().nullable(),
8721
- checkpointId: z27.string().nullable(),
8722
- sessionId: z27.string().nullable(),
8723
- artifactName: z27.string().nullable(),
8724
- artifactVersion: z27.string().nullable(),
8725
- volumes: z27.record(z27.string(), z27.string()).optional()
8838
+ error: z28.string().nullable(),
8839
+ executionTimeMs: z28.number().nullable(),
8840
+ checkpointId: z28.string().nullable(),
8841
+ sessionId: z28.string().nullable(),
8842
+ artifactName: z28.string().nullable(),
8843
+ artifactVersion: z28.string().nullable(),
8844
+ volumes: z28.record(z28.string(), z28.string()).optional()
8726
8845
  });
8727
8846
  var paginatedRunsSchema = createPaginatedResponseSchema(publicRunSchema);
8728
- var createRunRequestSchema = z27.object({
8847
+ var createRunRequestSchema = z28.object({
8729
8848
  // Agent identification (one of: agent, agentId, sessionId, checkpointId)
8730
- agent: z27.string().optional(),
8849
+ agent: z28.string().optional(),
8731
8850
  // Agent name
8732
- agentId: z27.string().optional(),
8851
+ agentId: z28.string().optional(),
8733
8852
  // Agent ID
8734
- agentVersion: z27.string().optional(),
8853
+ agentVersion: z28.string().optional(),
8735
8854
  // Version specifier (e.g., "latest", "v1", specific ID)
8736
8855
  // Continue session
8737
- sessionId: z27.string().optional(),
8856
+ sessionId: z28.string().optional(),
8738
8857
  // Resume from checkpoint
8739
- checkpointId: z27.string().optional(),
8858
+ checkpointId: z28.string().optional(),
8740
8859
  // Required
8741
- prompt: z27.string().min(1, "Prompt is required"),
8860
+ prompt: z28.string().min(1, "Prompt is required"),
8742
8861
  // Optional configuration
8743
- variables: z27.record(z27.string(), z27.string()).optional(),
8744
- secrets: z27.record(z27.string(), z27.string()).optional(),
8745
- artifactName: z27.string().optional(),
8862
+ variables: z28.record(z28.string(), z28.string()).optional(),
8863
+ secrets: z28.record(z28.string(), z28.string()).optional(),
8864
+ artifactName: z28.string().optional(),
8746
8865
  // Artifact name to mount
8747
- artifactVersion: z27.string().optional(),
8866
+ artifactVersion: z28.string().optional(),
8748
8867
  // Artifact version (defaults to latest)
8749
- volumes: z27.record(z27.string(), z27.string()).optional()
8868
+ volumes: z28.record(z28.string(), z28.string()).optional()
8750
8869
  // volume_name -> version
8751
8870
  });
8752
8871
  var runListQuerySchema = listQuerySchema.extend({
8753
8872
  status: publicRunStatusSchema.optional()
8754
8873
  });
8755
- var publicRunsListContract = c19.router({
8874
+ var publicRunsListContract = c20.router({
8756
8875
  list: {
8757
8876
  method: "GET",
8758
8877
  path: "/v1/runs",
@@ -8784,13 +8903,13 @@ var publicRunsListContract = c19.router({
8784
8903
  description: "Create and execute a new agent run. Returns 202 Accepted as runs execute asynchronously."
8785
8904
  }
8786
8905
  });
8787
- var publicRunByIdContract = c19.router({
8906
+ var publicRunByIdContract = c20.router({
8788
8907
  get: {
8789
8908
  method: "GET",
8790
8909
  path: "/v1/runs/:id",
8791
8910
  headers: authHeadersSchema,
8792
- pathParams: z27.object({
8793
- id: z27.string().min(1, "Run ID is required")
8911
+ pathParams: z28.object({
8912
+ id: z28.string().min(1, "Run ID is required")
8794
8913
  }),
8795
8914
  responses: {
8796
8915
  200: publicRunDetailSchema,
@@ -8802,15 +8921,15 @@ var publicRunByIdContract = c19.router({
8802
8921
  description: "Get run details by ID"
8803
8922
  }
8804
8923
  });
8805
- var publicRunCancelContract = c19.router({
8924
+ var publicRunCancelContract = c20.router({
8806
8925
  cancel: {
8807
8926
  method: "POST",
8808
8927
  path: "/v1/runs/:id/cancel",
8809
8928
  headers: authHeadersSchema,
8810
- pathParams: z27.object({
8811
- id: z27.string().min(1, "Run ID is required")
8929
+ pathParams: z28.object({
8930
+ id: z28.string().min(1, "Run ID is required")
8812
8931
  }),
8813
- body: z27.undefined(),
8932
+ body: z28.undefined(),
8814
8933
  responses: {
8815
8934
  200: publicRunDetailSchema,
8816
8935
  400: publicApiErrorSchema,
@@ -8823,27 +8942,27 @@ var publicRunCancelContract = c19.router({
8823
8942
  description: "Cancel a pending or running execution"
8824
8943
  }
8825
8944
  });
8826
- var logEntrySchema = z27.object({
8945
+ var logEntrySchema = z28.object({
8827
8946
  timestamp: timestampSchema,
8828
- type: z27.enum(["agent", "system", "network"]),
8829
- level: z27.enum(["debug", "info", "warn", "error"]),
8830
- message: z27.string(),
8831
- metadata: z27.record(z27.string(), z27.unknown()).optional()
8947
+ type: z28.enum(["agent", "system", "network"]),
8948
+ level: z28.enum(["debug", "info", "warn", "error"]),
8949
+ message: z28.string(),
8950
+ metadata: z28.record(z28.string(), z28.unknown()).optional()
8832
8951
  });
8833
8952
  var paginatedLogsSchema = createPaginatedResponseSchema(logEntrySchema);
8834
8953
  var logsQuerySchema = listQuerySchema.extend({
8835
- type: z27.enum(["agent", "system", "network", "all"]).default("all"),
8954
+ type: z28.enum(["agent", "system", "network", "all"]).default("all"),
8836
8955
  since: timestampSchema.optional(),
8837
8956
  until: timestampSchema.optional(),
8838
- order: z27.enum(["asc", "desc"]).default("asc")
8957
+ order: z28.enum(["asc", "desc"]).default("asc")
8839
8958
  });
8840
- var publicRunLogsContract = c19.router({
8959
+ var publicRunLogsContract = c20.router({
8841
8960
  getLogs: {
8842
8961
  method: "GET",
8843
8962
  path: "/v1/runs/:id/logs",
8844
8963
  headers: authHeadersSchema,
8845
- pathParams: z27.object({
8846
- id: z27.string().min(1, "Run ID is required")
8964
+ pathParams: z28.object({
8965
+ id: z28.string().min(1, "Run ID is required")
8847
8966
  }),
8848
8967
  query: logsQuerySchema,
8849
8968
  responses: {
@@ -8856,30 +8975,30 @@ var publicRunLogsContract = c19.router({
8856
8975
  description: "Get unified logs for a run. Combines agent, system, and network logs."
8857
8976
  }
8858
8977
  });
8859
- var metricPointSchema = z27.object({
8978
+ var metricPointSchema = z28.object({
8860
8979
  timestamp: timestampSchema,
8861
- cpuPercent: z27.number(),
8862
- memoryUsedMb: z27.number(),
8863
- memoryTotalMb: z27.number(),
8864
- diskUsedMb: z27.number(),
8865
- diskTotalMb: z27.number()
8866
- });
8867
- var metricsSummarySchema = z27.object({
8868
- avgCpuPercent: z27.number(),
8869
- maxMemoryUsedMb: z27.number(),
8870
- totalDurationMs: z27.number().nullable()
8871
- });
8872
- var metricsResponseSchema2 = z27.object({
8873
- data: z27.array(metricPointSchema),
8980
+ cpuPercent: z28.number(),
8981
+ memoryUsedMb: z28.number(),
8982
+ memoryTotalMb: z28.number(),
8983
+ diskUsedMb: z28.number(),
8984
+ diskTotalMb: z28.number()
8985
+ });
8986
+ var metricsSummarySchema = z28.object({
8987
+ avgCpuPercent: z28.number(),
8988
+ maxMemoryUsedMb: z28.number(),
8989
+ totalDurationMs: z28.number().nullable()
8990
+ });
8991
+ var metricsResponseSchema2 = z28.object({
8992
+ data: z28.array(metricPointSchema),
8874
8993
  summary: metricsSummarySchema
8875
8994
  });
8876
- var publicRunMetricsContract = c19.router({
8995
+ var publicRunMetricsContract = c20.router({
8877
8996
  getMetrics: {
8878
8997
  method: "GET",
8879
8998
  path: "/v1/runs/:id/metrics",
8880
8999
  headers: authHeadersSchema,
8881
- pathParams: z27.object({
8882
- id: z27.string().min(1, "Run ID is required")
9000
+ pathParams: z28.object({
9001
+ id: z28.string().min(1, "Run ID is required")
8883
9002
  }),
8884
9003
  responses: {
8885
9004
  200: metricsResponseSchema2,
@@ -8891,7 +9010,7 @@ var publicRunMetricsContract = c19.router({
8891
9010
  description: "Get CPU, memory, and disk metrics for a run"
8892
9011
  }
8893
9012
  });
8894
- var sseEventTypeSchema = z27.enum([
9013
+ var sseEventTypeSchema = z28.enum([
8895
9014
  "status",
8896
9015
  // Run status change
8897
9016
  "output",
@@ -8903,26 +9022,26 @@ var sseEventTypeSchema = z27.enum([
8903
9022
  "heartbeat"
8904
9023
  // Keep-alive
8905
9024
  ]);
8906
- var sseEventSchema = z27.object({
9025
+ var sseEventSchema = z28.object({
8907
9026
  event: sseEventTypeSchema,
8908
- data: z27.unknown(),
8909
- id: z27.string().optional()
9027
+ data: z28.unknown(),
9028
+ id: z28.string().optional()
8910
9029
  // For Last-Event-ID reconnection
8911
9030
  });
8912
- var publicRunEventsContract = c19.router({
9031
+ var publicRunEventsContract = c20.router({
8913
9032
  streamEvents: {
8914
9033
  method: "GET",
8915
9034
  path: "/v1/runs/:id/events",
8916
9035
  headers: authHeadersSchema,
8917
- pathParams: z27.object({
8918
- id: z27.string().min(1, "Run ID is required")
9036
+ pathParams: z28.object({
9037
+ id: z28.string().min(1, "Run ID is required")
8919
9038
  }),
8920
- query: z27.object({
8921
- lastEventId: z27.string().optional()
9039
+ query: z28.object({
9040
+ lastEventId: z28.string().optional()
8922
9041
  // For reconnection
8923
9042
  }),
8924
9043
  responses: {
8925
- 200: z27.any(),
9044
+ 200: z28.any(),
8926
9045
  // SSE stream - actual content is text/event-stream
8927
9046
  401: publicApiErrorSchema,
8928
9047
  404: publicApiErrorSchema,
@@ -8934,28 +9053,28 @@ var publicRunEventsContract = c19.router({
8934
9053
  });
8935
9054
 
8936
9055
  // ../../packages/core/src/contracts/public/artifacts.ts
8937
- import { z as z28 } from "zod";
8938
- var c20 = initContract();
8939
- var publicArtifactSchema = z28.object({
8940
- id: z28.string(),
8941
- name: z28.string(),
8942
- currentVersionId: z28.string().nullable(),
8943
- size: z28.number(),
9056
+ import { z as z29 } from "zod";
9057
+ var c21 = initContract();
9058
+ var publicArtifactSchema = z29.object({
9059
+ id: z29.string(),
9060
+ name: z29.string(),
9061
+ currentVersionId: z29.string().nullable(),
9062
+ size: z29.number(),
8944
9063
  // Total size in bytes
8945
- fileCount: z28.number(),
9064
+ fileCount: z29.number(),
8946
9065
  createdAt: timestampSchema,
8947
9066
  updatedAt: timestampSchema
8948
9067
  });
8949
- var artifactVersionSchema = z28.object({
8950
- id: z28.string(),
9068
+ var artifactVersionSchema = z29.object({
9069
+ id: z29.string(),
8951
9070
  // SHA-256 content hash
8952
- artifactId: z28.string(),
8953
- size: z28.number(),
9071
+ artifactId: z29.string(),
9072
+ size: z29.number(),
8954
9073
  // Size in bytes
8955
- fileCount: z28.number(),
8956
- message: z28.string().nullable(),
9074
+ fileCount: z29.number(),
9075
+ message: z29.string().nullable(),
8957
9076
  // Optional commit message
8958
- createdBy: z28.string(),
9077
+ createdBy: z29.string(),
8959
9078
  createdAt: timestampSchema
8960
9079
  });
8961
9080
  var publicArtifactDetailSchema = publicArtifactSchema.extend({
@@ -8965,7 +9084,7 @@ var paginatedArtifactsSchema = createPaginatedResponseSchema(publicArtifactSchem
8965
9084
  var paginatedArtifactVersionsSchema = createPaginatedResponseSchema(
8966
9085
  artifactVersionSchema
8967
9086
  );
8968
- var publicArtifactsListContract = c20.router({
9087
+ var publicArtifactsListContract = c21.router({
8969
9088
  list: {
8970
9089
  method: "GET",
8971
9090
  path: "/v1/artifacts",
@@ -8980,13 +9099,13 @@ var publicArtifactsListContract = c20.router({
8980
9099
  description: "List all artifacts in the current scope with pagination"
8981
9100
  }
8982
9101
  });
8983
- var publicArtifactByIdContract = c20.router({
9102
+ var publicArtifactByIdContract = c21.router({
8984
9103
  get: {
8985
9104
  method: "GET",
8986
9105
  path: "/v1/artifacts/:id",
8987
9106
  headers: authHeadersSchema,
8988
- pathParams: z28.object({
8989
- id: z28.string().min(1, "Artifact ID is required")
9107
+ pathParams: z29.object({
9108
+ id: z29.string().min(1, "Artifact ID is required")
8990
9109
  }),
8991
9110
  responses: {
8992
9111
  200: publicArtifactDetailSchema,
@@ -8998,13 +9117,13 @@ var publicArtifactByIdContract = c20.router({
8998
9117
  description: "Get artifact details by ID"
8999
9118
  }
9000
9119
  });
9001
- var publicArtifactVersionsContract = c20.router({
9120
+ var publicArtifactVersionsContract = c21.router({
9002
9121
  list: {
9003
9122
  method: "GET",
9004
9123
  path: "/v1/artifacts/:id/versions",
9005
9124
  headers: authHeadersSchema,
9006
- pathParams: z28.object({
9007
- id: z28.string().min(1, "Artifact ID is required")
9125
+ pathParams: z29.object({
9126
+ id: z29.string().min(1, "Artifact ID is required")
9008
9127
  }),
9009
9128
  query: listQuerySchema,
9010
9129
  responses: {
@@ -9017,20 +9136,20 @@ var publicArtifactVersionsContract = c20.router({
9017
9136
  description: "List all versions of an artifact with pagination"
9018
9137
  }
9019
9138
  });
9020
- var publicArtifactDownloadContract = c20.router({
9139
+ var publicArtifactDownloadContract = c21.router({
9021
9140
  download: {
9022
9141
  method: "GET",
9023
9142
  path: "/v1/artifacts/:id/download",
9024
9143
  headers: authHeadersSchema,
9025
- pathParams: z28.object({
9026
- id: z28.string().min(1, "Artifact ID is required")
9144
+ pathParams: z29.object({
9145
+ id: z29.string().min(1, "Artifact ID is required")
9027
9146
  }),
9028
- query: z28.object({
9029
- versionId: z28.string().optional()
9147
+ query: z29.object({
9148
+ versionId: z29.string().optional()
9030
9149
  // Defaults to current version
9031
9150
  }),
9032
9151
  responses: {
9033
- 302: z28.undefined(),
9152
+ 302: z29.undefined(),
9034
9153
  // Redirect to presigned URL
9035
9154
  401: publicApiErrorSchema,
9036
9155
  404: publicApiErrorSchema,
@@ -9042,28 +9161,28 @@ var publicArtifactDownloadContract = c20.router({
9042
9161
  });
9043
9162
 
9044
9163
  // ../../packages/core/src/contracts/public/volumes.ts
9045
- import { z as z29 } from "zod";
9046
- var c21 = initContract();
9047
- var publicVolumeSchema = z29.object({
9048
- id: z29.string(),
9049
- name: z29.string(),
9050
- currentVersionId: z29.string().nullable(),
9051
- size: z29.number(),
9164
+ import { z as z30 } from "zod";
9165
+ var c22 = initContract();
9166
+ var publicVolumeSchema = z30.object({
9167
+ id: z30.string(),
9168
+ name: z30.string(),
9169
+ currentVersionId: z30.string().nullable(),
9170
+ size: z30.number(),
9052
9171
  // Total size in bytes
9053
- fileCount: z29.number(),
9172
+ fileCount: z30.number(),
9054
9173
  createdAt: timestampSchema,
9055
9174
  updatedAt: timestampSchema
9056
9175
  });
9057
- var volumeVersionSchema = z29.object({
9058
- id: z29.string(),
9176
+ var volumeVersionSchema = z30.object({
9177
+ id: z30.string(),
9059
9178
  // SHA-256 content hash
9060
- volumeId: z29.string(),
9061
- size: z29.number(),
9179
+ volumeId: z30.string(),
9180
+ size: z30.number(),
9062
9181
  // Size in bytes
9063
- fileCount: z29.number(),
9064
- message: z29.string().nullable(),
9182
+ fileCount: z30.number(),
9183
+ message: z30.string().nullable(),
9065
9184
  // Optional commit message
9066
- createdBy: z29.string(),
9185
+ createdBy: z30.string(),
9067
9186
  createdAt: timestampSchema
9068
9187
  });
9069
9188
  var publicVolumeDetailSchema = publicVolumeSchema.extend({
@@ -9071,7 +9190,7 @@ var publicVolumeDetailSchema = publicVolumeSchema.extend({
9071
9190
  });
9072
9191
  var paginatedVolumesSchema = createPaginatedResponseSchema(publicVolumeSchema);
9073
9192
  var paginatedVolumeVersionsSchema = createPaginatedResponseSchema(volumeVersionSchema);
9074
- var publicVolumesListContract = c21.router({
9193
+ var publicVolumesListContract = c22.router({
9075
9194
  list: {
9076
9195
  method: "GET",
9077
9196
  path: "/v1/volumes",
@@ -9086,13 +9205,13 @@ var publicVolumesListContract = c21.router({
9086
9205
  description: "List all volumes in the current scope with pagination"
9087
9206
  }
9088
9207
  });
9089
- var publicVolumeByIdContract = c21.router({
9208
+ var publicVolumeByIdContract = c22.router({
9090
9209
  get: {
9091
9210
  method: "GET",
9092
9211
  path: "/v1/volumes/:id",
9093
9212
  headers: authHeadersSchema,
9094
- pathParams: z29.object({
9095
- id: z29.string().min(1, "Volume ID is required")
9213
+ pathParams: z30.object({
9214
+ id: z30.string().min(1, "Volume ID is required")
9096
9215
  }),
9097
9216
  responses: {
9098
9217
  200: publicVolumeDetailSchema,
@@ -9104,13 +9223,13 @@ var publicVolumeByIdContract = c21.router({
9104
9223
  description: "Get volume details by ID"
9105
9224
  }
9106
9225
  });
9107
- var publicVolumeVersionsContract = c21.router({
9226
+ var publicVolumeVersionsContract = c22.router({
9108
9227
  list: {
9109
9228
  method: "GET",
9110
9229
  path: "/v1/volumes/:id/versions",
9111
9230
  headers: authHeadersSchema,
9112
- pathParams: z29.object({
9113
- id: z29.string().min(1, "Volume ID is required")
9231
+ pathParams: z30.object({
9232
+ id: z30.string().min(1, "Volume ID is required")
9114
9233
  }),
9115
9234
  query: listQuerySchema,
9116
9235
  responses: {
@@ -9123,20 +9242,20 @@ var publicVolumeVersionsContract = c21.router({
9123
9242
  description: "List all versions of a volume with pagination"
9124
9243
  }
9125
9244
  });
9126
- var publicVolumeDownloadContract = c21.router({
9245
+ var publicVolumeDownloadContract = c22.router({
9127
9246
  download: {
9128
9247
  method: "GET",
9129
9248
  path: "/v1/volumes/:id/download",
9130
9249
  headers: authHeadersSchema,
9131
- pathParams: z29.object({
9132
- id: z29.string().min(1, "Volume ID is required")
9250
+ pathParams: z30.object({
9251
+ id: z30.string().min(1, "Volume ID is required")
9133
9252
  }),
9134
- query: z29.object({
9135
- versionId: z29.string().optional()
9253
+ query: z30.object({
9254
+ versionId: z30.string().optional()
9136
9255
  // Defaults to current version
9137
9256
  }),
9138
9257
  responses: {
9139
- 302: z29.undefined(),
9258
+ 302: z30.undefined(),
9140
9259
  // Redirect to presigned URL
9141
9260
  401: publicApiErrorSchema,
9142
9261
  404: publicApiErrorSchema,
@@ -9375,17 +9494,15 @@ var ProxyManager = class {
9375
9494
  String(this.config.port),
9376
9495
  "--set",
9377
9496
  `confdir=${this.config.caDir}`,
9497
+ "--set",
9498
+ `vm0_api_url=${this.config.apiUrl}`,
9499
+ "--set",
9500
+ `vm0_registry_path=${this.config.registryPath}`,
9378
9501
  "--scripts",
9379
9502
  this.config.addonPath,
9380
9503
  "--quiet"
9381
9504
  ];
9382
- const env = {
9383
- ...process.env,
9384
- VM0_API_URL: this.config.apiUrl,
9385
- VM0_REGISTRY_PATH: this.config.registryPath
9386
- };
9387
9505
  this.process = spawn2("mitmdump", args, {
9388
- env,
9389
9506
  stdio: ["ignore", "pipe", "pipe"],
9390
9507
  detached: false
9391
9508
  });
@@ -9838,7 +9955,7 @@ async function executeJob(context, config, options = {}) {
9838
9955
  logger9.log(`Guest client ready`);
9839
9956
  if (config.firecracker.snapshot) {
9840
9957
  const timestamp = (Date.now() / 1e3).toFixed(3);
9841
- await guest.exec(`date -s "@${timestamp}"`);
9958
+ await guest.exec(`sudo date -s "@${timestamp}"`);
9842
9959
  }
9843
9960
  if (context.storageManifest) {
9844
9961
  await withSandboxTiming(
@@ -9897,7 +10014,7 @@ async function executeJob(context, config, options = {}) {
9897
10014
  const duration = Math.round(durationMs / 1e3);
9898
10015
  if (exitCode === 137 || exitCode === 9) {
9899
10016
  const dmesgCheck = await guest.exec(
9900
- `dmesg | tail -20 | grep -iE "killed|oom" 2>/dev/null`
10017
+ `sudo dmesg | tail -20 | grep -iE "killed|oom" 2>/dev/null`
9901
10018
  );
9902
10019
  if (dmesgCheck.stdout.toLowerCase().includes("oom") || dmesgCheck.stdout.toLowerCase().includes("killed")) {
9903
10020
  logger9.log(`OOM detected: ${dmesgCheck.stdout}`);
@@ -10031,14 +10148,6 @@ function checkNetworkPrerequisites() {
10031
10148
  errors
10032
10149
  };
10033
10150
  }
10034
- async function isPortInUse(port) {
10035
- try {
10036
- await execAsync3(`ss -tln | grep -q ":${port} "`);
10037
- return true;
10038
- } catch {
10039
- return false;
10040
- }
10041
- }
10042
10151
 
10043
10152
  // src/lib/runner/runner-lock.ts
10044
10153
  import fs10 from "fs";
@@ -10448,19 +10557,24 @@ function parseFirecrackerCmdline(cmdline) {
10448
10557
  }
10449
10558
  }
10450
10559
  if (!filePath) return null;
10451
- const match = filePath.match(/vm0-([a-f0-9]+)\//);
10452
- if (!match?.[1]) return null;
10453
- return createVmId(match[1]);
10560
+ const vmIdMatch = filePath.match(/vm0-([a-f0-9]+)\//);
10561
+ if (!vmIdMatch?.[1]) return null;
10562
+ const baseDirMatch = filePath.match(/^(.+)\/workspaces\/vm0-[a-f0-9]+\//);
10563
+ if (!baseDirMatch?.[1]) return null;
10564
+ return { vmId: createVmId(vmIdMatch[1]), baseDir: baseDirMatch[1] };
10454
10565
  }
10455
10566
  function parseMitmproxyCmdline(cmdline) {
10456
10567
  if (!cmdline.includes("mitmproxy") && !cmdline.includes("mitmdump")) {
10457
10568
  return null;
10458
10569
  }
10459
10570
  const args = cmdline.split("\0");
10460
- const portIdx = args.findIndex((a) => a === "-p" || a === "--listen-port");
10461
- const portArg = args[portIdx + 1];
10462
- const port = portIdx !== -1 && portArg ? parseInt(portArg, 10) : void 0;
10463
- return { port };
10571
+ for (const arg of args) {
10572
+ const match = arg.match(/^vm0_registry_path=(.+)\/vm-registry\.json$/);
10573
+ if (match?.[1]) {
10574
+ return match[1];
10575
+ }
10576
+ }
10577
+ return null;
10464
10578
  }
10465
10579
  function findFirecrackerProcesses() {
10466
10580
  const processes = [];
@@ -10478,9 +10592,9 @@ function findFirecrackerProcesses() {
10478
10592
  if (!existsSync4(cmdlinePath)) continue;
10479
10593
  try {
10480
10594
  const cmdline = readFileSync2(cmdlinePath, "utf-8");
10481
- const vmId = parseFirecrackerCmdline(cmdline);
10482
- if (vmId) {
10483
- processes.push({ pid, vmId });
10595
+ const parsed = parseFirecrackerCmdline(cmdline);
10596
+ if (parsed) {
10597
+ processes.push({ pid, vmId: parsed.vmId, baseDir: parsed.baseDir });
10484
10598
  }
10485
10599
  } catch {
10486
10600
  continue;
@@ -10493,33 +10607,14 @@ function findProcessByVmId(vmId) {
10493
10607
  const vmIdStr = vmIdValue(vmId);
10494
10608
  return processes.find((p) => vmIdValue(p.vmId) === vmIdStr) || null;
10495
10609
  }
10496
- async function killProcess(pid, timeoutMs = 5e3) {
10497
- if (!isProcessRunning(pid)) return true;
10498
- try {
10499
- process.kill(pid, "SIGTERM");
10500
- } catch {
10501
- return !isProcessRunning(pid);
10502
- }
10503
- const startTime = Date.now();
10504
- while (Date.now() - startTime < timeoutMs) {
10505
- if (!isProcessRunning(pid)) return true;
10506
- await new Promise((resolve) => setTimeout(resolve, 100));
10507
- }
10508
- if (isProcessRunning(pid)) {
10509
- try {
10510
- process.kill(pid, "SIGKILL");
10511
- } catch {
10512
- }
10513
- }
10514
- return !isProcessRunning(pid);
10515
- }
10516
- function findMitmproxyProcess() {
10610
+ function findMitmproxyProcesses() {
10611
+ const processes = [];
10517
10612
  const procDir = "/proc";
10518
10613
  let entries;
10519
10614
  try {
10520
10615
  entries = readdirSync(procDir);
10521
10616
  } catch {
10522
- return null;
10617
+ return [];
10523
10618
  }
10524
10619
  for (const entry of entries) {
10525
10620
  if (!/^\d+$/.test(entry)) continue;
@@ -10528,26 +10623,26 @@ function findMitmproxyProcess() {
10528
10623
  if (!existsSync4(cmdlinePath)) continue;
10529
10624
  try {
10530
10625
  const cmdline = readFileSync2(cmdlinePath, "utf-8");
10531
- const parsed = parseMitmproxyCmdline(cmdline);
10532
- if (parsed) {
10533
- return { pid, port: parsed.port };
10626
+ const baseDir = parseMitmproxyCmdline(cmdline);
10627
+ if (baseDir) {
10628
+ processes.push({ pid, baseDir });
10534
10629
  }
10535
10630
  } catch {
10536
10631
  continue;
10537
10632
  }
10538
10633
  }
10539
- return null;
10634
+ return processes;
10540
10635
  }
10541
10636
 
10542
10637
  // src/lib/runner/types.ts
10543
- import { z as z30 } from "zod";
10544
- var RunnerModeSchema = z30.enum(["running", "draining", "stopping", "stopped"]);
10545
- var RunnerStatusSchema = z30.object({
10638
+ import { z as z31 } from "zod";
10639
+ var RunnerModeSchema = z31.enum(["running", "draining", "stopping", "stopped"]);
10640
+ var RunnerStatusSchema = z31.object({
10546
10641
  mode: RunnerModeSchema,
10547
- active_runs: z30.number(),
10548
- active_run_ids: z30.array(z30.string()),
10549
- started_at: z30.string(),
10550
- updated_at: z30.string()
10642
+ active_runs: z31.number(),
10643
+ active_run_ids: z31.array(z31.string()),
10644
+ started_at: z31.string(),
10645
+ updated_at: z31.string()
10551
10646
  });
10552
10647
 
10553
10648
  // src/commands/doctor.ts
@@ -10589,20 +10684,14 @@ async function checkApiConnectivity(config, warnings) {
10589
10684
  });
10590
10685
  }
10591
10686
  }
10592
- async function checkNetwork(config, warnings) {
10687
+ function checkNetwork(config, warnings) {
10593
10688
  console.log("Network:");
10594
- const proxyPort = config.proxy.port;
10595
- const mitmProc = findMitmproxyProcess();
10596
- const portInUse = await isPortInUse(proxyPort);
10689
+ const mitmProcesses = findMitmproxyProcesses();
10690
+ const mitmProc = mitmProcesses.find((p) => p.baseDir === config.base_dir);
10597
10691
  if (mitmProc) {
10598
- console.log(` \u2713 Proxy mitmproxy (PID ${mitmProc.pid}) on :${proxyPort}`);
10599
- } else if (portInUse) {
10600
10692
  console.log(
10601
- ` \u26A0\uFE0F Proxy port :${proxyPort} in use but mitmproxy process not found`
10693
+ ` \u2713 Proxy mitmproxy (PID ${mitmProc.pid}) on :${config.proxy.port}`
10602
10694
  );
10603
- warnings.push({
10604
- message: `Port ${proxyPort} is in use but mitmproxy process not detected`
10605
- });
10606
10695
  } else {
10607
10696
  console.log(` \u2717 Proxy mitmproxy not running`);
10608
10697
  warnings.push({ message: "Proxy mitmproxy is not running" });
@@ -10688,7 +10777,8 @@ async function findOrphanNetworkNamespaces(warnings) {
10688
10777
  return [];
10689
10778
  }
10690
10779
  }
10691
- async function detectOrphanResources(jobs, processes, workspaces, statusVmIds, warnings) {
10780
+ async function detectOrphanResources(jobs, allProcesses, workspaces, statusVmIds, baseDir, warnings) {
10781
+ const processes = allProcesses.filter((p) => p.baseDir === baseDir);
10692
10782
  for (const job of jobs) {
10693
10783
  if (!job.firecrackerPid) {
10694
10784
  warnings.push({
@@ -10750,7 +10840,7 @@ var doctorCommand = new Command2("doctor").description("Diagnose runner health,
10750
10840
  console.log("");
10751
10841
  await checkApiConnectivity(config, warnings);
10752
10842
  console.log("");
10753
- await checkNetwork(config, warnings);
10843
+ checkNetwork(config, warnings);
10754
10844
  console.log("");
10755
10845
  const processes = findFirecrackerProcesses();
10756
10846
  const workspaces = existsSync5(workspacesDir) ? readdirSync2(workspacesDir).filter(runnerPaths.isVmWorkspace) : [];
@@ -10762,6 +10852,7 @@ var doctorCommand = new Command2("doctor").description("Diagnose runner health,
10762
10852
  processes,
10763
10853
  workspaces,
10764
10854
  statusVmIds,
10855
+ config.base_dir,
10765
10856
  warnings
10766
10857
  );
10767
10858
  displayWarnings(warnings);
@@ -10809,7 +10900,7 @@ var killCommand = new Command3("kill").description("Force terminate a run and cl
10809
10900
  }
10810
10901
  const results = [];
10811
10902
  if (proc) {
10812
- const killed = await killProcess(proc.pid);
10903
+ const killed = await gracefulKillProcess(proc.pid);
10813
10904
  results.push({
10814
10905
  step: "Firecracker process",
10815
10906
  success: killed,
@@ -11254,7 +11345,7 @@ var snapshotCommand = new Command5("snapshot").description("Generate a Firecrack
11254
11345
  );
11255
11346
 
11256
11347
  // src/index.ts
11257
- var version = true ? "3.12.2" : "0.1.0";
11348
+ var version = true ? "3.13.0" : "0.1.0";
11258
11349
  program.name("vm0-runner").version(version).description("Self-hosted runner for VM0 agents");
11259
11350
  program.addCommand(startCommand);
11260
11351
  program.addCommand(doctorCommand);