@eve-horizon/cli 0.2.51 → 0.2.52

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -51284,97 +51284,58 @@ Requires Docker Desktop; k3d and kubectl are auto-managed by the CLI.`,
51284
51284
  "eve analytics env-health --org org_xxx"
51285
51285
  ]
51286
51286
  },
51287
- ollama: {
51288
- description: "Manage inference targets, installs, models, aliases, and platform managed availability.",
51289
- usage: "eve ollama <subcommand> [options]",
51287
+ endpoint: {
51288
+ description: "Manage private endpoints \u2014 Tailscale-connected services accessible from within the K8s cluster.",
51289
+ usage: "eve endpoint <subcommand> [options]",
51290
51290
  subcommands: {
51291
- targets: {
51292
- description: "List inference targets",
51293
- usage: "eve ollama targets [--scope-kind <platform|org|project>] [--scope-id <id>] [--json]"
51294
- },
51295
- target: {
51296
- description: "Manage a single target (add, rm, test, wake, pull, models)",
51297
- usage: "eve ollama target <add|rm|test|wake|pull|models> [options]",
51298
- options: [
51299
- "add: --name <name> --base-url <url> [--scope-kind <kind>] [--scope-id <id>] [--target-type <type>] [--transport-profile <profile>] [--api-key-ref <secret-ref>]",
51300
- "rm: <target-id>",
51301
- "test: <target-id>",
51302
- "wake: <target-id> [--wait true] [--timeout-ms <ms>] \u2014 Trigger GPU wake via ASG. Without --wait, returns immediately with retry_after_seconds (caller must poll). With --wait, server polls every 2.5s until target is healthy or timeout (default 120s, ~65s typical cold start).",
51303
- "pull: <target-id> --model-id <id> \u2014 Pull a model onto a remote Ollama target",
51304
- "models: <target-id> \u2014 List models currently loaded on a remote target"
51305
- ]
51306
- },
51307
- models: {
51308
- description: "List canonical inference models",
51309
- usage: "eve ollama models [--json]"
51310
- },
51311
- model: {
51312
- description: "Create canonical inference model",
51313
- usage: "eve ollama model add --canonical <id> --provider <name> --slug <provider-model-slug>"
51314
- },
51315
- aliases: {
51316
- description: "List alias routes",
51317
- usage: "eve ollama aliases [--scope-kind <kind>] [--scope-id <id>] [--json]"
51318
- },
51319
- alias: {
51320
- description: "Set or remove alias route",
51321
- usage: "eve ollama alias <set|rm> [options]",
51291
+ add: {
51292
+ description: "Register a private endpoint backed by Tailscale",
51293
+ usage: "eve endpoint add --name <name> --tailscale-hostname <fqdn> --port <port> --org <org_id> [--health-path <path>]",
51322
51294
  options: [
51323
- "set: --alias <name> --target-id <target-id> --model-id <model-id> [--scope-kind <kind>] [--scope-id <id>]",
51324
- "rm: --alias <name> [--scope-kind <kind>] [--scope-id <id>]"
51295
+ "--name <name> DNS-safe endpoint name",
51296
+ "--tailscale-hostname <fqdn> Tailscale MagicDNS hostname (e.g., mac-mini.tail12345.ts.net)",
51297
+ "--port <port> Service port (1-65535)",
51298
+ "--org <id> Organization ID or slug",
51299
+ '--health-path <path> HTTP health check path (default: /v1/models, "none" to disable)'
51300
+ ],
51301
+ examples: [
51302
+ "eve endpoint add --name lmstudio --tailscale-hostname mac-mini.tail12345.ts.net --port 1234 --org org_xxx"
51325
51303
  ]
51326
51304
  },
51327
- installs: {
51328
- description: "List target-model installs",
51329
- usage: "eve ollama installs [--target-id <id>] [--model-id <id>] [--json]"
51305
+ list: {
51306
+ description: "List registered endpoints for an org",
51307
+ usage: "eve endpoint list --org <org_id>",
51308
+ examples: ["eve endpoint list --org org_xxx"]
51330
51309
  },
51331
- install: {
51332
- description: "Install or remove model availability on a target",
51333
- usage: "eve ollama install <add|rm> --target-id <target-id> --model-id <model-id> [options]",
51310
+ show: {
51311
+ description: "Show endpoint details and optionally run a health check",
51312
+ usage: "eve endpoint show <name> --org <org_id> [--verbose]",
51334
51313
  options: [
51335
- "add: --target-id <target-id> --model-id <model-id> [--requires-warm-start true|false] [--min-target-capacity <n>]",
51336
- "rm: --target-id <target-id> --model-id <model-id>"
51337
- ]
51338
- },
51339
- assignments: {
51340
- description: "Inspect target assignment/load and queue depth",
51341
- usage: "eve ollama assignments [--scope-kind <platform|org|project>] [--scope-id <id>] [--json]"
51314
+ "--verbose Run and display a health check"
51315
+ ],
51316
+ examples: ["eve endpoint show lmstudio --org org_xxx --verbose"]
51342
51317
  },
51343
- "route-policies": {
51344
- description: "List route policies by scope",
51345
- usage: "eve ollama route-policies [--scope-kind <platform|org|project>] [--scope-id <id>] [--json]"
51318
+ remove: {
51319
+ description: "Remove a private endpoint and its K8s Service",
51320
+ usage: "eve endpoint remove <name> --org <org_id>",
51321
+ examples: ["eve endpoint remove lmstudio --org org_xxx"]
51346
51322
  },
51347
- "route-policy": {
51348
- description: "Set or remove a route policy",
51349
- usage: "eve ollama route-policy <set|rm> [options]",
51350
- options: [
51351
- "set: --scope-kind <kind> [--scope-id <id>] --preferred-target-id <target-id> [--fallback-to-alias-target true|false]",
51352
- "rm: --scope-kind <kind> [--scope-id <id>]"
51353
- ]
51323
+ health: {
51324
+ description: "Run a health check against a private endpoint",
51325
+ usage: "eve endpoint health <name> --org <org_id>",
51326
+ examples: ["eve endpoint health lmstudio --org org_xxx"]
51354
51327
  },
51355
- managed: {
51356
- description: "List, publish, and unpublish platform-managed catalog models",
51357
- usage: "eve ollama managed <list|publish|unpublish> [options]",
51358
- options: [
51359
- "list: [--json]",
51360
- "publish: --canonical <id> --provider <name> --slug <provider_model_slug> --target-id <id> [--requires-warm-start true|false] [--enabled true|false] [--json]",
51361
- "unpublish: --canonical <id> [--json]"
51362
- ]
51328
+ diagnose: {
51329
+ description: "Run diagnostic checks on a private endpoint",
51330
+ usage: "eve endpoint diagnose <name> --org <org_id>",
51331
+ examples: ["eve endpoint diagnose lmstudio --org org_xxx"]
51363
51332
  }
51364
51333
  },
51365
51334
  examples: [
51366
- "eve ollama target add --name local --base-url http://localhost:11434 --scope-kind platform --target-type external_ollama",
51367
- "eve ollama target wake itgt_xxx --wait true # Block until GPU target is healthy (~65s)",
51368
- "eve ollama target wake itgt_xxx --wait true --timeout-ms 180000 # Wait up to 3 minutes",
51369
- "eve ollama target wake itgt_xxx # Fire-and-forget (returns retry_after_seconds)",
51370
- "eve ollama target pull itgt_xxx --model-id imod_xxx # Pull model onto remote target",
51371
- "eve ollama target models itgt_xxx # List models on remote target",
51372
- "eve ollama model add --canonical gpt-oss:120b --provider ollama --slug gpt-oss:120b",
51373
- "eve ollama install add --target-id itgt_xxx --model-id imod_xxx --min-target-capacity 1",
51374
- "eve ollama assignments --scope-kind platform",
51375
- "eve ollama managed list",
51376
- "eve ollama managed publish --canonical deepseek-r1 --provider ollama --slug deepseek-r1:latest --target-id itgt_xxx",
51377
- "eve ollama managed unpublish --canonical deepseek-r1"
51335
+ "eve endpoint add --name lmstudio --tailscale-hostname mac-mini.tail12345.ts.net --port 1234 --org org_xxx",
51336
+ "eve endpoint list --org org_xxx",
51337
+ "eve endpoint show lmstudio --org org_xxx --verbose",
51338
+ "eve endpoint diagnose lmstudio --org org_xxx"
51378
51339
  ]
51379
51340
  },
51380
51341
  migrate: {
@@ -51482,7 +51443,7 @@ function showMainHelp() {
51482
51443
  console.log(" auth Authentication (login, logout, status)");
51483
51444
  console.log(" webhooks Manage outbound webhook subscriptions");
51484
51445
  console.log(" analytics Org analytics (jobs, pipelines, env health)");
51485
- console.log(" ollama Manage inference targets, aliases, and model routes");
51446
+ console.log(" endpoint Manage private endpoints (Tailscale-connected services)");
51486
51447
  console.log(" access Access control: permissions, roles, bindings, policy-as-code sync");
51487
51448
  console.log(" user Look up user profiles and memberships");
51488
51449
  console.log(" admin User and platform admin operations");
@@ -52546,7 +52507,7 @@ function buildQuery2(params) {
52546
52507
  }
52547
52508
 
52548
52509
  // src/commands/job.ts
52549
- var import_child_process2 = require("child_process");
52510
+ var import_child_process4 = require("child_process");
52550
52511
  var import_fs = require("fs");
52551
52512
  var import_path = require("path");
52552
52513
 
@@ -56674,6 +56635,8 @@ var configSchema = external_exports.object({
56674
56635
  EVE_SLACK_CLIENT_ID: external_exports.string().optional(),
56675
56636
  EVE_SLACK_CLIENT_SECRET: external_exports.string().optional(),
56676
56637
  EVE_INTERNAL_API_KEY: external_exports.string().optional(),
56638
+ EVE_GATEWAY_URL: external_exports.string().url().optional(),
56639
+ // Internal gateway URL for outbound delivery (e.g., http://eve-gateway.eve.svc.cluster.local:4820)
56677
56640
  EVE_ORG_FS_LINK_TOKEN_SECRET: external_exports.string().optional(),
56678
56641
  EVE_ORG_FS_LINK_TOKEN_TTL_SECONDS: external_exports.coerce.number().int().min(60).default(900),
56679
56642
  EVE_SECRETS_MASTER_KEY: external_exports.string().optional(),
@@ -59034,6 +58997,7 @@ var EventListResponseSchema = external_exports.object({
59034
58997
  var AgentSummarySchema = external_exports.object({
59035
58998
  id: external_exports.string(),
59036
58999
  slug: external_exports.string().nullable().optional(),
59000
+ alias: external_exports.string().nullable().optional(),
59037
59001
  name: external_exports.string().nullable().optional(),
59038
59002
  description: external_exports.string().nullable().optional(),
59039
59003
  role: external_exports.string().nullable().optional(),
@@ -59057,6 +59021,7 @@ var OrgAgentDirectoryItemSchema = external_exports.object({
59057
59021
  project_name: external_exports.string(),
59058
59022
  agent_id: external_exports.string(),
59059
59023
  agent_slug: external_exports.string().nullable(),
59024
+ agent_alias: external_exports.string().nullable().optional(),
59060
59025
  agent_name: external_exports.string().nullable().optional(),
59061
59026
  agent_description: external_exports.string().nullable().optional(),
59062
59027
  role: external_exports.string().nullable().optional(),
@@ -59117,6 +59082,7 @@ var VALID_TOOLCHAINS = ["python", "media", "rust", "java", "kotlin"];
59117
59082
  var AgentEntrySchema = external_exports.object({
59118
59083
  name: external_exports.string().optional(),
59119
59084
  slug: AgentSlugSchema.optional(),
59085
+ alias: AgentSlugSchema.optional(),
59120
59086
  description: external_exports.string().optional(),
59121
59087
  role: external_exports.string().optional(),
59122
59088
  skill: external_exports.string().min(1),
@@ -59135,11 +59101,20 @@ var AgentsYamlSchema = external_exports.object({
59135
59101
  }).passthrough();
59136
59102
  var TeamDispatchSchema = external_exports.object({
59137
59103
  mode: external_exports.enum(["fanout", "council", "relay"]).optional(),
59104
+ staged: external_exports.boolean().optional(),
59138
59105
  max_parallel: external_exports.number().int().min(1).optional(),
59139
59106
  merge_strategy: external_exports.string().optional(),
59140
59107
  lead_timeout: external_exports.number().int().positive().optional(),
59141
59108
  member_timeout: external_exports.number().int().positive().optional()
59142
- }).passthrough();
59109
+ }).passthrough().superRefine((dispatch, ctx) => {
59110
+ if (dispatch.staged === true && dispatch.mode !== "council") {
59111
+ ctx.addIssue({
59112
+ code: "custom",
59113
+ path: ["staged"],
59114
+ message: "dispatch.staged=true is only valid when dispatch.mode is 'council'"
59115
+ });
59116
+ }
59117
+ });
59143
59118
  var TeamEntrySchema = external_exports.object({
59144
59119
  lead: external_exports.string().min(1),
59145
59120
  members: external_exports.array(external_exports.string()).optional(),
@@ -59173,6 +59148,7 @@ var AgentsSyncRequestSchema = external_exports.object({
59173
59148
  agents_yaml: external_exports.string().min(1, "agents yaml cannot be empty"),
59174
59149
  teams_yaml: external_exports.string().min(1, "teams yaml cannot be empty"),
59175
59150
  chat_yaml: external_exports.string().min(1, "chat yaml cannot be empty"),
59151
+ x_eve_yaml: external_exports.string().optional(),
59176
59152
  pack_refs: external_exports.array(PackRefSchema).optional(),
59177
59153
  git_sha: external_exports.string().optional(),
59178
59154
  branch: external_exports.string().optional(),
@@ -59255,6 +59231,9 @@ var ThreadMessageResponseSchema = external_exports.object({
59255
59231
  actor_id: external_exports.string().nullable().optional(),
59256
59232
  body: external_exports.string(),
59257
59233
  job_id: external_exports.string().nullable().optional(),
59234
+ delivery_status: external_exports.string().nullable().optional(),
59235
+ delivery_error: external_exports.string().nullable().optional(),
59236
+ delivered_at: external_exports.string().nullable().optional(),
59258
59237
  created_at: external_exports.string()
59259
59238
  });
59260
59239
  var ThreadMessageListResponseSchema = external_exports.object({
@@ -59370,6 +59349,15 @@ var ChatDispatchRequestSchema = ChatRouteRequestSchema.extend({
59370
59349
  var ChatDispatchResponseSchema = external_exports.object({
59371
59350
  job_ids: external_exports.array(external_exports.string())
59372
59351
  });
59352
+ var ChatDeliverRequestSchema = external_exports.object({
59353
+ job_id: external_exports.string().min(1).optional(),
59354
+ // optional for progress messages
59355
+ thread_id: external_exports.string().min(1),
59356
+ text: external_exports.string().min(1),
59357
+ agent_id: external_exports.string().optional(),
59358
+ progress: external_exports.boolean().optional()
59359
+ // marks this as a progress update (not final result)
59360
+ });
59373
59361
 
59374
59362
  // ../shared/dist/schemas/integrations.js
59375
59363
  var IntegrationResponseSchema = external_exports.object({
@@ -60339,201 +60327,105 @@ var BatchValidateResponseSchema = external_exports.object({
60339
60327
  errors: external_exports.array(BatchValidationErrorSchema)
60340
60328
  });
60341
60329
 
60342
- // ../shared/dist/schemas/managed-models.js
60343
- var ManagedModelCapabilitySchema = external_exports.object({
60344
- streaming: external_exports.boolean(),
60345
- tool_calling: external_exports.boolean(),
60346
- reasoning: external_exports.boolean()
60347
- });
60348
- var ManagedModelConfigV1Schema = external_exports.object({
60349
- display_name: external_exports.string().min(1),
60350
- inference_provider: external_exports.string().min(1),
60351
- harness: external_exports.string().optional(),
60352
- api_model_id: external_exports.string().min(1),
60353
- base_url: external_exports.string().min(1),
60354
- auth_header: external_exports.string().min(1),
60355
- auth_scheme: external_exports.string(),
60356
- secret_ref: external_exports.string().min(1),
60357
- extra_headers: external_exports.record(external_exports.string()),
60358
- capabilities: ManagedModelCapabilitySchema
60359
- }).passthrough();
60360
- var ManagedModelConfigV2Schema = external_exports.object({
60361
- display_name: external_exports.string().min(1),
60362
- provider: external_exports.string().min(1),
60363
- api_model_id: external_exports.string().min(1),
60364
- capabilities: ManagedModelCapabilitySchema,
60365
- harness: external_exports.string().optional(),
60366
- base_url: external_exports.string().optional(),
60367
- secret_ref: external_exports.string().optional(),
60368
- extra_headers: external_exports.record(external_exports.string()).optional()
60369
- }).passthrough();
60370
- var ManagedModelConfigSchema = external_exports.union([
60371
- ManagedModelConfigV1Schema,
60372
- ManagedModelConfigV2Schema
60373
- ]);
60374
- var ManagedModelRegistrySchema = external_exports.record(ManagedModelConfigSchema);
60375
-
60376
- // ../shared/dist/schemas/inference.js
60377
- var InferenceScopeKindSchema = external_exports.enum(["platform", "org", "project"]);
60378
- var InferenceTargetTypeSchema = external_exports.enum(["ollama_pool", "external_ollama", "openai_compat"]);
60379
- var InferenceTransportProfileSchema = external_exports.enum(["ollama_api", "openai_compat"]);
60380
- var InferenceTargetStatusSchema = external_exports.enum(["unknown", "healthy", "unhealthy", "waking", "draining", "disabled"]);
60381
- var InferenceTargetSchema = external_exports.object({
60330
+ // ../shared/dist/schemas/chat-file.js
60331
+ var ChatFileSchema = external_exports.object({
60332
+ /** Provider file ID */
60382
60333
  id: external_exports.string(),
60383
- scope_kind: InferenceScopeKindSchema,
60384
- scope_id: external_exports.string().nullable(),
60334
+ /** Original filename */
60385
60335
  name: external_exports.string(),
60386
- target_type: InferenceTargetTypeSchema,
60387
- transport_profile: InferenceTransportProfileSchema,
60388
- base_url: external_exports.string(),
60389
- health_probe_url: external_exports.string().nullable(),
60390
- capacity: external_exports.number().int(),
60391
- max_concurrent_inflight: external_exports.number().int(),
60392
- status: InferenceTargetStatusSchema,
60393
- transport_metadata: external_exports.record(external_exports.unknown()),
60394
- created_by: external_exports.string().nullable(),
60395
- updated_by: external_exports.string().nullable(),
60396
- created_at: external_exports.string(),
60397
- updated_at: external_exports.string()
60398
- });
60399
- var InferenceModelSchema = external_exports.object({
60400
- id: external_exports.string(),
60401
- canonical_model_id: external_exports.string(),
60402
- provider: external_exports.string(),
60403
- provider_model_slug: external_exports.string(),
60404
- max_context: external_exports.number().int().nullable(),
60405
- supports_json_schema: external_exports.boolean(),
60406
- metadata: external_exports.record(external_exports.unknown()),
60407
- created_at: external_exports.string(),
60408
- updated_at: external_exports.string()
60336
+ /** MIME type */
60337
+ mimetype: external_exports.string().optional(),
60338
+ /** URL — provider URL initially, then eve-storage:// after resolution */
60339
+ url: external_exports.string().optional(),
60340
+ /** File size in bytes */
60341
+ size: external_exports.number().optional(),
60342
+ /** Set after resolveFiles: original provider URL */
60343
+ source_url: external_exports.string().optional(),
60344
+ /** Set after resolveFiles: provider name */
60345
+ source_provider: external_exports.string().optional(),
60346
+ /** Set after resolveFiles: eve-storage key */
60347
+ storage_key: external_exports.string().optional(),
60348
+ /** Set when file resolution failed — reason code (e.g. 'auth_failed', 'content_mismatch') */
60349
+ error: external_exports.string().optional()
60409
60350
  });
60410
- var InferenceAliasSchema = external_exports.object({
60411
- id: external_exports.string(),
60412
- scope_kind: InferenceScopeKindSchema,
60413
- scope_id: external_exports.string().nullable(),
60414
- alias: external_exports.string(),
60415
- target_id: external_exports.string(),
60416
- model_id: external_exports.string(),
60417
- pin_model_id: external_exports.string().nullable(),
60418
- pinned_at: external_exports.string().nullable(),
60419
- created_by: external_exports.string().nullable(),
60420
- updated_by: external_exports.string().nullable(),
60421
- created_at: external_exports.string(),
60422
- updated_at: external_exports.string()
60351
+ var AttachmentIndexEntrySchema = external_exports.object({
60352
+ /** Provider attachment ID, when available */
60353
+ id: external_exports.string().optional(),
60354
+ /** Original filename */
60355
+ name: external_exports.string(),
60356
+ /** Relative path from workspace root */
60357
+ path: external_exports.string().nullable(),
60358
+ /** MIME type (e.g. application/pdf) */
60359
+ mimetype: external_exports.string().optional(),
60360
+ /** File size in bytes */
60361
+ size: external_exports.number().optional(),
60362
+ /** Original provider URL */
60363
+ source_url: external_exports.string().optional(),
60364
+ /** Provider that supplied this file */
60365
+ source_provider: external_exports.string().optional(),
60366
+ /** Storage key for re-download/debug */
60367
+ storage_key: external_exports.string().optional(),
60368
+ /** Error code if file could not be downloaded */
60369
+ error: external_exports.string().optional()
60423
60370
  });
60424
- var InferenceInstallSchema = external_exports.object({
60425
- id: external_exports.string(),
60426
- target_id: external_exports.string(),
60427
- model_id: external_exports.string(),
60428
- requires_warm_start: external_exports.boolean(),
60429
- min_target_capacity: external_exports.number().int(),
60430
- allowed_scopes: external_exports.record(external_exports.unknown()),
60431
- route_hints: external_exports.record(external_exports.unknown()),
60432
- created_at: external_exports.string(),
60433
- updated_at: external_exports.string()
60371
+ var AttachmentIndexSchema = external_exports.object({
60372
+ files: external_exports.array(AttachmentIndexEntrySchema)
60373
+ });
60374
+ var MAX_CHAT_FILE_SIZE = 50 * 1024 * 1024;
60375
+ var MAX_CHAT_TOTAL_SIZE = 100 * 1024 * 1024;
60376
+
60377
+ // ../shared/dist/schemas/private-endpoint.js
60378
+ var PrivateEndpointProviderSchema = external_exports.enum(["tailscale"]);
60379
+ var PrivateEndpointStatusSchema = external_exports.enum(["pending", "ready", "error"]);
60380
+ var DNS_SAFE_REGEX = /^[a-z0-9]([a-z0-9-]*[a-z0-9])?$/;
60381
+ var CreatePrivateEndpointRequestSchema = external_exports.object({
60382
+ name: external_exports.string().min(1).max(53).regex(DNS_SAFE_REGEX, "Name must be DNS-safe: lowercase alphanumeric and hyphens, cannot start or end with a hyphen"),
60383
+ provider: PrivateEndpointProviderSchema.optional().default("tailscale"),
60384
+ hostname: external_exports.string().min(1, "Tailscale hostname is required"),
60385
+ port: external_exports.number().int().min(1).max(65535),
60386
+ health_path: external_exports.string().nullable().optional().default("/v1/models"),
60387
+ metadata: external_exports.record(external_exports.unknown()).optional()
60434
60388
  });
60435
- var InferenceRoutePolicySchema = external_exports.object({
60389
+ var PrivateEndpointResponseSchema = external_exports.object({
60436
60390
  id: external_exports.string(),
60437
- scope_kind: InferenceScopeKindSchema,
60438
- scope_id: external_exports.string().nullable(),
60439
- preferred_target_id: external_exports.string(),
60440
- fallback_to_alias_target: external_exports.boolean(),
60441
- created_by: external_exports.string().nullable(),
60442
- updated_by: external_exports.string().nullable(),
60391
+ name: external_exports.string(),
60392
+ org_id: external_exports.string(),
60393
+ provider: external_exports.string(),
60394
+ hostname: external_exports.string(),
60395
+ port: external_exports.number(),
60396
+ protocol: external_exports.string(),
60397
+ status: PrivateEndpointStatusSchema,
60398
+ status_msg: external_exports.string().nullable(),
60399
+ k8s_svc_name: external_exports.string(),
60400
+ k8s_namespace: external_exports.string(),
60401
+ k8s_dns: external_exports.string().nullable(),
60402
+ health_path: external_exports.string().nullable(),
60403
+ cluster_url: external_exports.string().nullable(),
60443
60404
  created_at: external_exports.string(),
60444
60405
  updated_at: external_exports.string()
60445
60406
  });
60446
- var InferenceManagedModelSchema = external_exports.object({
60447
- canonical_model_id: external_exports.string(),
60448
- provider: external_exports.string(),
60449
- provider_model_slug: external_exports.string(),
60450
- target_id: external_exports.string(),
60451
- requires_warm_start: external_exports.boolean().default(false),
60452
- enabled: external_exports.boolean().default(true)
60453
- });
60454
- var InferenceManagedModelsSchema = external_exports.record(InferenceManagedModelSchema);
60455
- var UpsertInferenceManagedModelRequestSchema = external_exports.object({
60456
- canonical_model_id: external_exports.string(),
60457
- provider: external_exports.string(),
60458
- provider_model_slug: external_exports.string(),
60459
- target_id: external_exports.string(),
60460
- requires_warm_start: external_exports.boolean().optional().default(false),
60461
- enabled: external_exports.boolean().optional().default(true)
60462
- });
60463
- var InferenceManagedModelResponseSchema = external_exports.object({
60464
- canonical_model_id: external_exports.string(),
60465
- provider: external_exports.string(),
60466
- provider_model_slug: external_exports.string(),
60467
- target_id: external_exports.string(),
60468
- requires_warm_start: external_exports.boolean(),
60469
- enabled: external_exports.boolean()
60470
- });
60471
- var InferenceManagedModelListResponseSchema = external_exports.object({
60472
- data: external_exports.array(InferenceManagedModelResponseSchema)
60407
+ var PrivateEndpointListResponseSchema = external_exports.object({
60408
+ data: external_exports.array(PrivateEndpointResponseSchema),
60409
+ pagination: PaginationSchema
60473
60410
  });
60474
- var InferenceManagedModelUpsertResponseSchema = external_exports.object({
60475
- data: InferenceManagedModelResponseSchema,
60476
- created_install: external_exports.boolean()
60411
+ var PrivateEndpointHealthSchema = external_exports.object({
60412
+ endpoint: PrivateEndpointResponseSchema,
60413
+ health: external_exports.object({
60414
+ checked_at: external_exports.string(),
60415
+ reachable: external_exports.boolean(),
60416
+ http_status: external_exports.number().nullable(),
60417
+ response_time_ms: external_exports.number().nullable(),
60418
+ error: external_exports.string().nullable()
60419
+ })
60477
60420
  });
60478
- var CreateInferenceTargetRequestSchema = external_exports.object({
60479
- scope_kind: InferenceScopeKindSchema,
60480
- scope_id: external_exports.string().optional(),
60481
- name: external_exports.string().min(1),
60482
- target_type: InferenceTargetTypeSchema,
60483
- transport_profile: InferenceTransportProfileSchema.default("ollama_api"),
60484
- base_url: external_exports.string().min(1),
60485
- health_probe_url: external_exports.string().optional(),
60486
- capacity: external_exports.number().int().positive().optional(),
60487
- max_concurrent_inflight: external_exports.number().int().positive().optional(),
60488
- status: InferenceTargetStatusSchema.optional(),
60489
- transport_metadata: external_exports.record(external_exports.unknown()).optional()
60490
- });
60491
- var UpdateInferenceTargetRequestSchema = external_exports.object({
60492
- name: external_exports.string().min(1).optional(),
60493
- target_type: InferenceTargetTypeSchema.optional(),
60494
- transport_profile: InferenceTransportProfileSchema.optional(),
60495
- base_url: external_exports.string().min(1).optional(),
60496
- health_probe_url: external_exports.string().optional(),
60497
- capacity: external_exports.number().int().positive().optional(),
60498
- max_concurrent_inflight: external_exports.number().int().positive().optional(),
60499
- status: InferenceTargetStatusSchema.optional(),
60500
- transport_metadata: external_exports.record(external_exports.unknown()).optional()
60501
- });
60502
- var CreateInferenceModelRequestSchema = external_exports.object({
60503
- canonical_model_id: external_exports.string().min(1),
60504
- provider: external_exports.string().min(1),
60505
- provider_model_slug: external_exports.string().min(1),
60506
- max_context: external_exports.number().int().positive().optional(),
60507
- supports_json_schema: external_exports.boolean().optional(),
60508
- metadata: external_exports.record(external_exports.unknown()).optional()
60421
+ var PrivateEndpointDiagnoseSchema = external_exports.object({
60422
+ endpoint: PrivateEndpointResponseSchema,
60423
+ checks: external_exports.array(external_exports.object({
60424
+ name: external_exports.string(),
60425
+ passed: external_exports.boolean(),
60426
+ detail: external_exports.string().nullable()
60427
+ }))
60509
60428
  });
60510
- var CreateInferenceInstallRequestSchema = external_exports.object({
60511
- requires_warm_start: external_exports.boolean().optional(),
60512
- min_target_capacity: external_exports.number().int().positive().optional(),
60513
- allowed_scopes: external_exports.record(external_exports.unknown()).optional(),
60514
- route_hints: external_exports.record(external_exports.unknown()).optional()
60515
- });
60516
- var UpsertInferenceRoutePolicyRequestSchema = external_exports.object({
60517
- scope_kind: InferenceScopeKindSchema,
60518
- scope_id: external_exports.string().optional(),
60519
- preferred_target_id: external_exports.string().min(1),
60520
- fallback_to_alias_target: external_exports.boolean().optional()
60521
- });
60522
- var UpsertInferenceAliasRequestSchema = external_exports.object({
60523
- scope_kind: InferenceScopeKindSchema,
60524
- scope_id: external_exports.string().optional(),
60525
- alias: external_exports.string().min(1),
60526
- target_id: external_exports.string().min(1),
60527
- model_id: external_exports.string().min(1),
60528
- pin_model_id: external_exports.string().optional()
60529
- });
60530
- var InferenceChatCompletionsRequestSchema = external_exports.object({
60531
- model: external_exports.string().min(1),
60532
- messages: external_exports.array(external_exports.record(external_exports.unknown())).min(1),
60533
- stream: external_exports.boolean().optional(),
60534
- project_id: external_exports.string().optional(),
60535
- org_id: external_exports.string().optional()
60536
- }).passthrough();
60537
60429
 
60538
60430
  // ../shared/dist/observability.js
60539
60431
  var import_async_hooks = require("async_hooks");
@@ -60989,25 +60881,11 @@ for (const provider of PROVIDER_REGISTRY) {
60989
60881
  function getProvider(name) {
60990
60882
  return byName.get(name.trim().toLowerCase());
60991
60883
  }
60992
- function deriveHarnessEnvMap() {
60993
- const map = {};
60994
- for (const provider of PROVIDER_REGISTRY) {
60995
- for (const harness of provider.harnesses.all) {
60996
- if (!map[harness]) {
60997
- map[harness] = { ...provider.harnesses.env_map };
60998
- }
60999
- }
61000
- }
61001
- return map;
61002
- }
61003
60884
 
61004
60885
  // ../shared/dist/pricing/model-normalization.js
61005
60886
  function normalizeModelName(provider, model) {
61006
60887
  let m = model.trim();
61007
- if (m.startsWith("managed/")) {
61008
- m = m.slice("managed/".length);
61009
- }
61010
- if (m.includes("/") && !m.startsWith("managed/")) {
60888
+ if (m.includes("/")) {
61011
60889
  m = m.split("/").slice(1).join("/");
61012
60890
  }
61013
60891
  const providerDef = getProvider(provider);
@@ -62612,13 +62490,8 @@ var DEFAULT_RESOURCE_CLASSES_V1 = {
62612
62490
  }
62613
62491
  };
62614
62492
 
62615
- // ../shared/dist/pricing/managed-models.js
62616
- var HARNESS_ENV_MAP = deriveHarnessEnvMap();
62617
-
62618
62493
  // ../shared/dist/permissions.js
62619
62494
  var ALL_PERMISSIONS = [
62620
- // Inference
62621
- "inference:write",
62622
62495
  // Jobs
62623
62496
  "jobs:read",
62624
62497
  "jobs:write",
@@ -62672,6 +62545,9 @@ var ALL_PERMISSIONS = [
62672
62545
  "events:write",
62673
62546
  // Chat
62674
62547
  "chat:write",
62548
+ // Private Endpoints
62549
+ "endpoints:read",
62550
+ "endpoints:write",
62675
62551
  // System
62676
62552
  "system:read",
62677
62553
  "system:admin"
@@ -62761,6 +62637,16 @@ function normalizeLogLine(line) {
62761
62637
  return { type: kind || "log", raw: line };
62762
62638
  }
62763
62639
 
62640
+ // ../shared/dist/invoke/git-utils.js
62641
+ var import_child_process2 = require("child_process");
62642
+ var import_util5 = require("util");
62643
+ var execFileAsync2 = (0, import_util5.promisify)(import_child_process2.execFile);
62644
+
62645
+ // ../shared/dist/invoke/workspace-hooks.js
62646
+ var import_child_process3 = require("child_process");
62647
+ var import_util6 = require("util");
62648
+ var execFileAsync3 = (0, import_util6.promisify)(import_child_process3.execFile);
62649
+
62764
62650
  // src/commands/job.ts
62765
62651
  async function handleJob(subcommand, positionals, flags, context2) {
62766
62652
  const json = Boolean(flags.json);
@@ -65370,7 +65256,7 @@ async function handleRunnerLogs(positionals, flags, context2) {
65370
65256
  console.log(`No pod_name in runtime_meta, using label selector: job-id=${jobId}`);
65371
65257
  kubectlArgs = ["-n", "eve", "logs", "-f", "-l", `job-id=${jobId}`];
65372
65258
  }
65373
- const kubectl = (0, import_child_process2.spawn)("kubectl", kubectlArgs, {
65259
+ const kubectl = (0, import_child_process4.spawn)("kubectl", kubectlArgs, {
65374
65260
  stdio: "inherit"
65375
65261
  });
65376
65262
  return new Promise((resolve8, reject) => {
@@ -74745,27 +74631,27 @@ async function handleUsers(flags, context2, json) {
74745
74631
  role: col("role", "Role"),
74746
74632
  created: col("created", "Created")
74747
74633
  };
74748
- const pad3 = (s, n) => s + " ".repeat(Math.max(0, n - s.length));
74634
+ const pad2 = (s, n) => s + " ".repeat(Math.max(0, n - s.length));
74749
74635
  const header = [
74750
- pad3("Email", w.email),
74751
- pad3("Name", w.name),
74752
- pad3("Admin", w.admin),
74753
- pad3("Scope", w.scope),
74754
- pad3("Target", w.target),
74755
- pad3("Role", w.role),
74756
- pad3("Created", w.created)
74636
+ pad2("Email", w.email),
74637
+ pad2("Name", w.name),
74638
+ pad2("Admin", w.admin),
74639
+ pad2("Scope", w.scope),
74640
+ pad2("Target", w.target),
74641
+ pad2("Role", w.role),
74642
+ pad2("Created", w.created)
74757
74643
  ].join(" ");
74758
74644
  console.log(header);
74759
74645
  console.log("-".repeat(header.length));
74760
74646
  for (const row of rows) {
74761
74647
  console.log([
74762
- pad3(row.email, w.email),
74763
- pad3(row.name, w.name),
74764
- pad3(row.admin, w.admin),
74765
- pad3(row.scope, w.scope),
74766
- pad3(row.target, w.target),
74767
- pad3(row.role, w.role),
74768
- pad3(row.created, w.created)
74648
+ pad2(row.email, w.email),
74649
+ pad2(row.name, w.name),
74650
+ pad2(row.admin, w.admin),
74651
+ pad2(row.scope, w.scope),
74652
+ pad2(row.target, w.target),
74653
+ pad2(row.role, w.role),
74654
+ pad2(row.created, w.created)
74769
74655
  ].join(" "));
74770
74656
  }
74771
74657
  console.log("");
@@ -74958,7 +74844,7 @@ async function resolvePacksAndMerge(repoRoot, manifest, projectSlug) {
74958
74844
  agents_count: Object.keys(extractInnerMap(mergedAgents, "agents")).length,
74959
74845
  teams_count: Object.keys(extractInnerMap(mergedTeams, "teams")).length,
74960
74846
  routes_count: (mergedChat.routes ?? []).length,
74961
- profiles_count: Object.keys(mergedXEve?.profiles ?? {}).length,
74847
+ profiles_count: Object.keys(mergedXEve?.agents?.profiles ?? {}).length,
74962
74848
  agents_hash: simpleHash(JSON.stringify(mergedAgents)),
74963
74849
  teams_hash: simpleHash(JSON.stringify(mergedTeams)),
74964
74850
  chat_hash: simpleHash(JSON.stringify(mergedChat))
@@ -74974,6 +74860,7 @@ async function resolvePacksAndMerge(repoRoot, manifest, projectSlug) {
74974
74860
  agentsYaml: (0, import_yaml3.stringify)(mergedAgents),
74975
74861
  teamsYaml: (0, import_yaml3.stringify)(mergedTeams),
74976
74862
  chatYaml: (0, import_yaml3.stringify)(mergedChat),
74863
+ xEveYaml: Object.keys(mergedXEve).length > 0 ? (0, import_yaml3.stringify)(mergedXEve) : null,
74977
74864
  workflowsYaml: mergedWorkflows ? (0, import_yaml3.stringify)({
74978
74865
  workflows: mergedWorkflows,
74979
74866
  ...Object.keys(mergedXEve).length > 0 ? { x_eve: mergedXEve } : {}
@@ -75135,11 +75022,13 @@ async function handleAgents(subcommand, positionals, flags, context2) {
75135
75022
  let agentsYaml;
75136
75023
  let teamsYaml;
75137
75024
  let chatYaml;
75025
+ let xEveYaml;
75138
75026
  let packRefs;
75139
75027
  if (packResult) {
75140
75028
  agentsYaml = packResult.agentsYaml;
75141
75029
  teamsYaml = packResult.teamsYaml;
75142
75030
  chatYaml = packResult.chatYaml;
75031
+ xEveYaml = packResult.xEveYaml ?? void 0;
75143
75032
  packRefs = packResult.packRefs;
75144
75033
  if (packResult.workflowsYaml) {
75145
75034
  await requestJson(
@@ -75180,6 +75069,7 @@ async function handleAgents(subcommand, positionals, flags, context2) {
75180
75069
  agents_yaml: agentsYaml,
75181
75070
  teams_yaml: teamsYaml,
75182
75071
  chat_yaml: chatYaml,
75072
+ ...xEveYaml ? { x_eve_yaml: xEveYaml } : {},
75183
75073
  git_sha: gitSha,
75184
75074
  branch,
75185
75075
  git_ref: gitRef,
@@ -76587,7 +76477,8 @@ async function handleThread(subcommand, positionals, flags, context2) {
76587
76477
  const dir = msg.direction === "outbound" ? "\u2192" : "\u2190";
76588
76478
  const time = new Date(msg.created_at).toLocaleTimeString();
76589
76479
  const jobRef = msg.job_id ? ` [job:${msg.job_id}]` : "";
76590
- console.log(` ${dir} ${time} ${actor}${jobRef}`);
76480
+ const delivery = msg.delivery_status === "delivered" ? " \u2713 delivered" : msg.delivery_status === "failed" ? ` \u2717 ${msg.delivery_error ?? "delivery failed"}` : msg.delivery_status === "pending" ? " \u23F3 pending" : "";
76481
+ console.log(` ${dir} ${time} ${actor}${jobRef}${delivery}`);
76591
76482
  try {
76592
76483
  const parsed = JSON.parse(msg.body);
76593
76484
  if (parsed.kind && parsed.body) {
@@ -76659,7 +76550,8 @@ async function handleThread(subcommand, positionals, flags, context2) {
76659
76550
  const dir = msg.direction === "outbound" ? "\u2192" : "\u2190";
76660
76551
  const time = new Date(msg.created_at).toLocaleTimeString();
76661
76552
  const jobRef = msg.job_id ? ` [job:${msg.job_id}]` : "";
76662
- process.stdout.write(`${dir} ${time} ${actor}${jobRef}: `);
76553
+ const delivery = msg.delivery_status === "delivered" ? " \u2713" : msg.delivery_status === "failed" ? " \u2717" : "";
76554
+ process.stdout.write(`${dir} ${time} ${actor}${jobRef}${delivery}: `);
76663
76555
  try {
76664
76556
  const parsed = JSON.parse(msg.body);
76665
76557
  if (parsed.kind && parsed.body) {
@@ -76880,70 +76772,6 @@ function normalizeRemoteSource(source) {
76880
76772
  return source;
76881
76773
  }
76882
76774
 
76883
- // src/commands/models.ts
76884
- async function handleModels(subcommand, positionals, flags, context2) {
76885
- const json = Boolean(flags.json);
76886
- switch (subcommand) {
76887
- case "list":
76888
- case void 0:
76889
- return handleList8(context2, json);
76890
- default:
76891
- throw new Error("Usage: eve models list [--json]");
76892
- }
76893
- }
76894
- async function handleList8(context2, json) {
76895
- const response = await requestJson(context2, "/models");
76896
- if (json) {
76897
- outputJson(response, json);
76898
- return;
76899
- }
76900
- if (response.byok) {
76901
- console.log("BYOK (Bring Your Own Key)");
76902
- console.log("========================");
76903
- console.log(` ${response.byok.description}`);
76904
- console.log("");
76905
- }
76906
- if (response.managed.length === 0) {
76907
- console.log("No managed models available.");
76908
- return;
76909
- }
76910
- console.log("Managed Models (Platform-Hosted)");
76911
- console.log("================================");
76912
- console.log("");
76913
- const specWidth = Math.max(10, ...response.managed.map((m) => m.model_spec.length));
76914
- const nameWidth = Math.max(12, ...response.managed.map((m) => m.display_name.length));
76915
- const providerWidth = Math.max(8, ...response.managed.map((m) => m.inference_provider.length));
76916
- const header = [
76917
- padRight9("Model Spec", specWidth),
76918
- padRight9("Display Name", nameWidth),
76919
- padRight9("Provider", providerWidth),
76920
- "Capabilities"
76921
- ].join(" ");
76922
- console.log(header);
76923
- console.log("-".repeat(header.length));
76924
- for (const model of response.managed) {
76925
- const caps = [];
76926
- if (model.capabilities.streaming) caps.push("stream");
76927
- if (model.capabilities.tool_calling) caps.push("tools");
76928
- if (model.capabilities.reasoning) caps.push("reason");
76929
- const row = [
76930
- padRight9(model.model_spec, specWidth),
76931
- padRight9(model.display_name, nameWidth),
76932
- padRight9(model.inference_provider, providerWidth),
76933
- caps.join(", ")
76934
- ].join(" ");
76935
- console.log(row);
76936
- }
76937
- console.log("");
76938
- console.log(`Total: ${response.managed.length} managed model(s)`);
76939
- console.log("");
76940
- console.log('Usage: Set harness_options.model to the model spec (e.g. "managed/deepseek-r1")');
76941
- }
76942
- function padRight9(str, width) {
76943
- if (str.length >= width) return str;
76944
- return str + " ".repeat(width - str.length);
76945
- }
76946
-
76947
76775
  // src/commands/access.ts
76948
76776
  var import_node_fs16 = require("node:fs");
76949
76777
  var import_node_path16 = require("node:path");
@@ -79694,539 +79522,6 @@ async function handleAnalytics(subcommand, _positionals, flags, context2) {
79694
79522
  }
79695
79523
  }
79696
79524
 
79697
- // src/commands/ollama.ts
79698
- function asString(flags, key) {
79699
- const value = flags[key];
79700
- return typeof value === "string" ? value : void 0;
79701
- }
79702
- function requireString(flags, key) {
79703
- const value = asString(flags, key);
79704
- if (!value) throw new Error(`Missing required flag --${key}`);
79705
- return value;
79706
- }
79707
- function asBoolean(flags, key) {
79708
- const value = asString(flags, key);
79709
- if (value === void 0) return void 0;
79710
- return value === "true" || value === "1";
79711
- }
79712
- function normalizeManagedModelRows(payload) {
79713
- return Array.isArray(payload) ? payload : payload.data;
79714
- }
79715
- function looksLikeGatewayPath(baseUrl) {
79716
- try {
79717
- const parsed = new URL(baseUrl);
79718
- const path8 = parsed.pathname.toLowerCase();
79719
- return path8.includes("/inference/v1") || path8.endsWith("/v1");
79720
- } catch {
79721
- return false;
79722
- }
79723
- }
79724
- function printTable(headers, rows) {
79725
- const widths = headers.map((header, idx) => Math.max(header.length, ...rows.map((row) => row[idx]?.length ?? 0)));
79726
- const line = `+${widths.map((w) => "-".repeat(w + 2)).join("+")}+`;
79727
- console.log(line);
79728
- console.log(formatRow3(headers, widths));
79729
- console.log(line);
79730
- for (const row of rows) {
79731
- console.log(formatRow3(row, widths));
79732
- }
79733
- console.log(line);
79734
- }
79735
- function formatRow3(columns, widths) {
79736
- const padded = columns.map((value, idx) => ` ${pad2(value, widths[idx])} `);
79737
- return `|${padded.join("|")}|`;
79738
- }
79739
- function pad2(value, width) {
79740
- return value.length >= width ? value : `${value}${" ".repeat(width - value.length)}`;
79741
- }
79742
- async function handleOllama(subcommand, positionals, flags, context2) {
79743
- const json = Boolean(flags.json);
79744
- switch (subcommand) {
79745
- case "targets": {
79746
- const scopeKind = asString(flags, "scope-kind");
79747
- const scopeId = asString(flags, "scope-id");
79748
- const query = new URLSearchParams();
79749
- if (scopeKind) query.set("scope_kind", scopeKind);
79750
- if (scopeId) query.set("scope_id", scopeId);
79751
- const suffix = query.toString() ? `?${query.toString()}` : "";
79752
- const targets = await requestJson(context2, `/inference/targets${suffix}`);
79753
- if (json) {
79754
- outputJson(targets, json);
79755
- return;
79756
- }
79757
- if (targets.length === 0) {
79758
- console.log("No inference targets found.");
79759
- return;
79760
- }
79761
- printTable(
79762
- ["ID", "Name", "Scope", "Type", "Transport", "Status", "Base URL"],
79763
- targets.map((item) => [
79764
- item.id,
79765
- item.name,
79766
- item.scope_id ? `${item.scope_kind}:${item.scope_id}` : item.scope_kind,
79767
- item.target_type,
79768
- item.transport_profile,
79769
- item.status,
79770
- item.base_url
79771
- ])
79772
- );
79773
- return;
79774
- }
79775
- case "target": {
79776
- const action = positionals[0];
79777
- if (action === "add") {
79778
- const body = {
79779
- scope_kind: asString(flags, "scope-kind") ?? "platform",
79780
- name: requireString(flags, "name"),
79781
- target_type: asString(flags, "target-type") ?? "external_ollama",
79782
- transport_profile: asString(flags, "transport-profile") ?? "ollama_api",
79783
- base_url: requireString(flags, "base-url")
79784
- };
79785
- const scopeId = asString(flags, "scope-id");
79786
- if (scopeId) body.scope_id = scopeId;
79787
- const apiKeyRef = asString(flags, "api-key-ref");
79788
- if (apiKeyRef) {
79789
- body.transport_metadata = {
79790
- api_key_ref: apiKeyRef,
79791
- auth_header: asString(flags, "auth-header") ?? "Authorization",
79792
- auth_scheme: asString(flags, "auth-scheme") ?? "Bearer"
79793
- };
79794
- }
79795
- const created = await requestJson(context2, "/inference/targets", {
79796
- method: "POST",
79797
- body
79798
- });
79799
- outputJson(created, json);
79800
- if (!json) console.log(`Created target ${created.id}`);
79801
- return;
79802
- }
79803
- if (action === "rm") {
79804
- const targetId = positionals[1];
79805
- if (!targetId) throw new Error("Usage: eve ollama target rm <target-id>");
79806
- await requestJson(context2, `/inference/targets/${targetId}`, {
79807
- method: "DELETE"
79808
- });
79809
- if (!json) console.log(`Deleted target ${targetId}`);
79810
- return;
79811
- }
79812
- if (action === "test") {
79813
- const targetId = positionals[1];
79814
- if (!targetId) throw new Error("Usage: eve ollama target test <target-id>");
79815
- const result = await requestJson(context2, `/inference/targets/${targetId}/test`, {
79816
- method: "POST"
79817
- });
79818
- outputJson(result, json);
79819
- if (!json) console.log("Target test completed");
79820
- return;
79821
- }
79822
- if (action === "wake") {
79823
- const targetId = positionals[1];
79824
- if (!targetId) throw new Error("Usage: eve ollama target wake <target-id> [--wait=true] [--timeout-ms <ms>]");
79825
- const query = new URLSearchParams();
79826
- const wait = asString(flags, "wait");
79827
- const timeoutMs = asString(flags, "timeout-ms");
79828
- if (wait === "true" || wait === "1") query.set("wait", "true");
79829
- if (timeoutMs) query.set("timeout_ms", timeoutMs);
79830
- const suffix = query.toString() ? `?${query.toString()}` : "";
79831
- const result = await requestJson(context2, `/inference/targets/${targetId}/wake${suffix}`, {
79832
- method: "POST"
79833
- });
79834
- outputJson(result, json);
79835
- if (!json) {
79836
- const nextState = result.ready ? "ready" : result.state;
79837
- console.log(`Wake request state: ${result.state}`);
79838
- console.log(`Target: ${result.target_id}`);
79839
- if (result.waited_ms !== void 0) {
79840
- console.log(`Waited: ${result.waited_ms}ms`);
79841
- } else {
79842
- console.log(`Retry after: ${result.retry_after_seconds}s`);
79843
- }
79844
- console.log(`Message: ${result.message}`);
79845
- if (result.ready) {
79846
- console.log(`Wake result: ${nextState}`);
79847
- }
79848
- }
79849
- return;
79850
- }
79851
- if (action === "pull") {
79852
- const targetId = positionals[1];
79853
- if (!targetId) throw new Error("Usage: eve ollama target pull <target-id> --model-id <id>");
79854
- const modelId = requireString(flags, "model-id");
79855
- const query = new URLSearchParams();
79856
- query.set("model_id", modelId);
79857
- const result = await requestJson(
79858
- context2,
79859
- `/inference/targets/${targetId}/pull?${query.toString()}`,
79860
- { method: "POST" }
79861
- );
79862
- outputJson(result, json);
79863
- if (!json) {
79864
- if (result.ok) {
79865
- console.log(`Pull complete: ${result.model} on ${result.target}`);
79866
- } else {
79867
- console.error(`Pull failed: ${result.message}`);
79868
- process.exitCode = 1;
79869
- }
79870
- }
79871
- return;
79872
- }
79873
- if (action === "models") {
79874
- const targetId = positionals[1];
79875
- if (!targetId) throw new Error("Usage: eve ollama target models <target-id>");
79876
- const result = await requestJson(
79877
- context2,
79878
- `/inference/targets/${targetId}/remote-models`
79879
- );
79880
- if (json) {
79881
- outputJson(result, json);
79882
- return;
79883
- }
79884
- console.log(`Models on target "${result.target}":`);
79885
- if (result.models.length === 0) {
79886
- console.log(" (none)");
79887
- return;
79888
- }
79889
- printTable(
79890
- ["Name", "Size (GB)", "Modified"],
79891
- result.models.map((m) => [
79892
- m.name,
79893
- (m.size / 1e9).toFixed(1),
79894
- m.modified_at
79895
- ])
79896
- );
79897
- return;
79898
- }
79899
- throw new Error(
79900
- "Usage: eve ollama target <add|rm|test|wake|pull|models> ...\n wake: <target-id> [--wait true] [--timeout-ms <ms>] Trigger GPU wake (default timeout 120s with --wait)"
79901
- );
79902
- }
79903
- case "models": {
79904
- const models = await requestJson(context2, "/inference/models");
79905
- if (json) {
79906
- outputJson(models, json);
79907
- return;
79908
- }
79909
- if (models.length === 0) {
79910
- console.log("No inference models found.");
79911
- return;
79912
- }
79913
- printTable(
79914
- ["ID", "Canonical", "Provider", "Provider Slug"],
79915
- models.map((item) => [item.id, item.canonical_model_id, item.provider, item.provider_model_slug])
79916
- );
79917
- return;
79918
- }
79919
- case "model": {
79920
- const action = positionals[0];
79921
- if (action !== "add") throw new Error("Usage: eve ollama model add --canonical <id> --provider <name> --slug <provider-model-slug>");
79922
- const created = await requestJson(context2, "/inference/models", {
79923
- method: "POST",
79924
- body: {
79925
- canonical_model_id: requireString(flags, "canonical"),
79926
- provider: requireString(flags, "provider"),
79927
- provider_model_slug: requireString(flags, "slug")
79928
- }
79929
- });
79930
- outputJson(created, json);
79931
- if (!json) console.log(`Model available as ${created.id}`);
79932
- return;
79933
- }
79934
- case "aliases": {
79935
- const scopeKind = asString(flags, "scope-kind");
79936
- const scopeId = asString(flags, "scope-id");
79937
- const query = new URLSearchParams();
79938
- if (scopeKind) query.set("scope_kind", scopeKind);
79939
- if (scopeId) query.set("scope_id", scopeId);
79940
- const suffix = query.toString() ? `?${query.toString()}` : "";
79941
- const aliases = await requestJson(context2, `/inference/aliases${suffix}`);
79942
- if (json) {
79943
- outputJson(aliases, json);
79944
- return;
79945
- }
79946
- if (aliases.length === 0) {
79947
- console.log("No inference aliases found.");
79948
- return;
79949
- }
79950
- printTable(
79951
- ["Alias", "Scope", "Target ID", "Model ID"],
79952
- aliases.map((item) => [
79953
- item.alias,
79954
- item.scope_id ? `${item.scope_kind}:${item.scope_id}` : item.scope_kind,
79955
- item.target_id,
79956
- item.model_id
79957
- ])
79958
- );
79959
- return;
79960
- }
79961
- case "alias": {
79962
- const action = positionals[0];
79963
- if (action === "set") {
79964
- const alias = requireString(flags, "alias");
79965
- const targetId = requireString(flags, "target-id");
79966
- const modelId = requireString(flags, "model-id");
79967
- const scopeKind = asString(flags, "scope-kind") ?? "platform";
79968
- const scopeId = asString(flags, "scope-id");
79969
- const body = {
79970
- alias,
79971
- target_id: targetId,
79972
- model_id: modelId,
79973
- scope_kind: scopeKind
79974
- };
79975
- if (scopeId) body.scope_id = scopeId;
79976
- const saved = await requestJson(context2, "/inference/aliases", {
79977
- method: "POST",
79978
- body
79979
- });
79980
- outputJson(saved, json);
79981
- if (!json) console.log(`Alias ${alias} saved`);
79982
- return;
79983
- }
79984
- if (action === "rm") {
79985
- const scopeKind = asString(flags, "scope-kind") ?? "platform";
79986
- const alias = requireString(flags, "alias");
79987
- const scopeId = asString(flags, "scope-id");
79988
- const query = new URLSearchParams();
79989
- if (scopeId) query.set("scope_id", scopeId);
79990
- const suffix = query.toString() ? `?${query.toString()}` : "";
79991
- await requestJson(context2, `/inference/aliases/${scopeKind}/${alias}${suffix}`, {
79992
- method: "DELETE"
79993
- });
79994
- if (!json) console.log(`Alias ${alias} deleted`);
79995
- return;
79996
- }
79997
- throw new Error("Usage: eve ollama alias <set|rm> ...");
79998
- }
79999
- case "installs": {
80000
- const targetId = asString(flags, "target-id");
80001
- const modelId = asString(flags, "model-id");
80002
- const query = new URLSearchParams();
80003
- if (targetId) query.set("target_id", targetId);
80004
- if (modelId) query.set("model_id", modelId);
80005
- const suffix = query.toString() ? `?${query.toString()}` : "";
80006
- const installs = await requestJson(context2, `/inference/installs${suffix}`);
80007
- if (json) {
80008
- outputJson(installs, json);
80009
- return;
80010
- }
80011
- if (installs.length === 0) {
80012
- console.log("No inference installs found.");
80013
- return;
80014
- }
80015
- printTable(
80016
- ["ID", "Target ID", "Model ID", "Warm Start", "Min Capacity"],
80017
- installs.map((item) => [
80018
- item.id,
80019
- item.target_id,
80020
- item.model_id,
80021
- item.requires_warm_start ? "yes" : "no",
80022
- String(item.min_target_capacity)
80023
- ])
80024
- );
80025
- return;
80026
- }
80027
- case "assignments": {
80028
- const scopeKind = asString(flags, "scope-kind");
80029
- const scopeId = asString(flags, "scope-id");
80030
- const query = new URLSearchParams();
80031
- if (scopeKind) query.set("scope_kind", scopeKind);
80032
- if (scopeId) query.set("scope_id", scopeId);
80033
- const suffix = query.toString() ? `?${query.toString()}` : "";
80034
- const assignments = await requestJson(context2, `/inference/assignments${suffix}`);
80035
- if (json) {
80036
- outputJson(assignments, json);
80037
- return;
80038
- }
80039
- if (assignments.length === 0) {
80040
- console.log("No inference assignments found.");
80041
- return;
80042
- }
80043
- printTable(
80044
- ["Target", "Scope", "Inflight", "Queue", "Max Inflight", "Status"],
80045
- assignments.map((item) => [
80046
- item.target_name,
80047
- item.scope_id ? `${item.scope_kind}:${item.scope_id}` : item.scope_kind,
80048
- String(item.inflight),
80049
- String(item.queue_depth),
80050
- String(item.max_concurrent_inflight),
80051
- item.status
80052
- ])
80053
- );
80054
- return;
80055
- }
80056
- case "route-policies": {
80057
- const scopeKind = asString(flags, "scope-kind");
80058
- const scopeId = asString(flags, "scope-id");
80059
- const query = new URLSearchParams();
80060
- if (scopeKind) query.set("scope_kind", scopeKind);
80061
- if (scopeId) query.set("scope_id", scopeId);
80062
- const suffix = query.toString() ? `?${query.toString()}` : "";
80063
- const policies = await requestJson(context2, `/inference/route-policies${suffix}`);
80064
- if (json) {
80065
- outputJson(policies, json);
80066
- return;
80067
- }
80068
- if (policies.length === 0) {
80069
- console.log("No inference route policies found.");
80070
- return;
80071
- }
80072
- printTable(
80073
- ["Scope", "Preferred Target", "Fallback"],
80074
- policies.map((item) => [
80075
- item.scope_id ? `${item.scope_kind}:${item.scope_id}` : item.scope_kind,
80076
- item.preferred_target_id,
80077
- item.fallback_to_alias_target ? "yes" : "no"
80078
- ])
80079
- );
80080
- return;
80081
- }
80082
- case "route-policy": {
80083
- const action = positionals[0];
80084
- if (action === "set") {
80085
- const scopeKind = asString(flags, "scope-kind") ?? "platform";
80086
- const scopeId = asString(flags, "scope-id");
80087
- const preferredTargetId = requireString(flags, "preferred-target-id");
80088
- const fallback = asString(flags, "fallback-to-alias-target");
80089
- const body = {
80090
- scope_kind: scopeKind,
80091
- preferred_target_id: preferredTargetId
80092
- };
80093
- if (scopeId) body.scope_id = scopeId;
80094
- if (fallback !== void 0) body.fallback_to_alias_target = fallback === "true" || fallback === "1";
80095
- const saved = await requestJson(context2, "/inference/route-policies", {
80096
- method: "POST",
80097
- body
80098
- });
80099
- outputJson(saved, json);
80100
- if (!json) console.log("Route policy saved");
80101
- return;
80102
- }
80103
- if (action === "rm") {
80104
- const scopeKind = asString(flags, "scope-kind") ?? "platform";
80105
- const scopeId = asString(flags, "scope-id");
80106
- const query = new URLSearchParams();
80107
- if (scopeId) query.set("scope_id", scopeId);
80108
- const suffix = query.toString() ? `?${query.toString()}` : "";
80109
- await requestJson(context2, `/inference/route-policies/${scopeKind}${suffix}`, {
80110
- method: "DELETE"
80111
- });
80112
- if (!json) console.log("Route policy deleted");
80113
- return;
80114
- }
80115
- throw new Error("Usage: eve ollama route-policy <set|rm> [options]");
80116
- }
80117
- case "install": {
80118
- const action = positionals[0];
80119
- if (action === "add") {
80120
- const targetId = requireString(flags, "target-id");
80121
- const modelId = requireString(flags, "model-id");
80122
- const body = {};
80123
- const requiresWarmStart = asString(flags, "requires-warm-start");
80124
- if (requiresWarmStart !== void 0) {
80125
- body.requires_warm_start = requiresWarmStart === "true" || requiresWarmStart === "1";
80126
- }
80127
- const minTargetCapacity = asString(flags, "min-target-capacity");
80128
- if (minTargetCapacity) {
80129
- body.min_target_capacity = Number(minTargetCapacity);
80130
- }
80131
- const saved = await requestJson(context2, `/inference/targets/${targetId}/models/${modelId}`, {
80132
- method: "POST",
80133
- body
80134
- });
80135
- outputJson(saved, json);
80136
- if (!json) console.log(`Installed model ${modelId} on target ${targetId}`);
80137
- return;
80138
- }
80139
- if (action === "rm") {
80140
- const targetId = requireString(flags, "target-id");
80141
- const modelId = requireString(flags, "model-id");
80142
- await requestJson(context2, `/inference/targets/${targetId}/models/${modelId}`, {
80143
- method: "DELETE"
80144
- });
80145
- if (!json) console.log(`Removed model ${modelId} from target ${targetId}`);
80146
- return;
80147
- }
80148
- throw new Error("Usage: eve ollama install <add|rm> --target-id <id> --model-id <id>");
80149
- }
80150
- case "managed": {
80151
- const action = positionals[0];
80152
- if (action === "list") {
80153
- const response = await requestJson(
80154
- context2,
80155
- "/inference/managed-models"
80156
- );
80157
- const managed = normalizeManagedModelRows(response);
80158
- outputJson(managed, json);
80159
- if (json) return;
80160
- if (managed.length === 0) {
80161
- console.log("No managed models published.");
80162
- return;
80163
- }
80164
- printTable(
80165
- ["Canonical", "Provider", "Slug", "Target ID", "Warm Start", "Enabled"],
80166
- managed.map((item) => [
80167
- item.canonical_model_id,
80168
- item.provider,
80169
- item.provider_model_slug,
80170
- item.target_id,
80171
- item.requires_warm_start ? "yes" : "no",
80172
- item.enabled ? "yes" : "no"
80173
- ])
80174
- );
80175
- return;
80176
- }
80177
- if (action === "publish") {
80178
- const body = {
80179
- canonical_model_id: requireString(flags, "canonical"),
80180
- provider: requireString(flags, "provider"),
80181
- provider_model_slug: requireString(flags, "slug"),
80182
- target_id: requireString(flags, "target-id")
80183
- };
80184
- const requiresWarmStart = asBoolean(flags, "requires-warm-start");
80185
- const enabled = asBoolean(flags, "enabled");
80186
- const targetId = body.target_id;
80187
- const target = await requestJson(context2, `/inference/targets/${targetId}`);
80188
- if (target.transport_profile === "openai_compat" && looksLikeGatewayPath(target.base_url)) {
80189
- console.log("warning: openai_compat target base_url appears to include /v1-like gateway path.");
80190
- }
80191
- if (requiresWarmStart !== void 0) {
80192
- body.requires_warm_start = requiresWarmStart;
80193
- }
80194
- if (enabled !== void 0) {
80195
- body.enabled = enabled;
80196
- }
80197
- const result = await requestJson(context2, "/inference/managed-models", {
80198
- method: "POST",
80199
- body
80200
- });
80201
- outputJson(result, json);
80202
- if (!json) {
80203
- console.log(
80204
- `Published managed model ${result.data.canonical_model_id} (install ${result.created_install ? "created" : "already present"}), target ${result.data.target_id}`
80205
- );
80206
- }
80207
- return;
80208
- }
80209
- if (action === "unpublish") {
80210
- const canonicalModelId = requireString(flags, "canonical");
80211
- await requestJson(context2, `/inference/managed-models/${encodeURIComponent(canonicalModelId)}`, {
80212
- method: "DELETE"
80213
- });
80214
- const payload = { canonical_model_id: canonicalModelId };
80215
- outputJson(payload, json);
80216
- if (!json) {
80217
- console.log(`Unpublished managed model ${canonicalModelId}`);
80218
- }
80219
- return;
80220
- }
80221
- throw new Error("Usage: eve ollama managed <list|publish|unpublish> ...");
80222
- }
80223
- default:
80224
- throw new Error(
80225
- "Usage: eve ollama <targets|target|models|model|aliases|alias|installs|install|assignments|route-policies|route-policy|managed>"
80226
- );
80227
- }
80228
- }
80229
-
80230
79525
  // src/commands/ingest.ts
80231
79526
  var import_node_fs19 = require("node:fs");
80232
79527
  var import_node_path19 = require("node:path");
@@ -82234,6 +81529,170 @@ async function handleUser(subcommand, positionals, flags, context2) {
82234
81529
  }
82235
81530
  }
82236
81531
 
81532
+ // src/commands/endpoint.ts
81533
+ async function handleEndpoint(subcommand, positionals, flags, context2) {
81534
+ const json = Boolean(flags.json);
81535
+ const orgId = getStringFlag(flags, ["org"]) ?? context2.orgId;
81536
+ if (!orgId) {
81537
+ throw new Error("Missing --org flag or profile default org.");
81538
+ }
81539
+ const basePath = `/orgs/${orgId}/endpoints`;
81540
+ switch (subcommand) {
81541
+ case "add": {
81542
+ const name = getStringFlag(flags, ["name"]) ?? positionals[0];
81543
+ const hostname2 = getStringFlag(flags, ["tailscale-hostname", "hostname"]);
81544
+ const portStr = getStringFlag(flags, ["port"]);
81545
+ const healthPath = getStringFlag(flags, ["health-path"]);
81546
+ if (!name || !hostname2 || !portStr) {
81547
+ throw new Error(
81548
+ "Usage: eve endpoint add --name <name> --tailscale-hostname <fqdn> --port <port> --org <org_id> [--health-path <path>]"
81549
+ );
81550
+ }
81551
+ const port = parseInt(portStr, 10);
81552
+ if (isNaN(port) || port < 1 || port > 65535) {
81553
+ throw new Error("--port must be a valid port number (1-65535)");
81554
+ }
81555
+ const body = {
81556
+ name,
81557
+ provider: "tailscale",
81558
+ hostname: hostname2,
81559
+ port
81560
+ };
81561
+ if (healthPath !== void 0) {
81562
+ body.health_path = healthPath === "none" ? null : healthPath;
81563
+ }
81564
+ const response = await requestJson(context2, basePath, {
81565
+ method: "POST",
81566
+ body
81567
+ });
81568
+ if (json) {
81569
+ outputJson(response, true);
81570
+ } else {
81571
+ const clusterUrl = response.cluster_url ?? "unknown";
81572
+ const status = response.status ?? "unknown";
81573
+ console.log(`\u2713 Endpoint registered: ${name}`);
81574
+ console.log(` Status: ${status}`);
81575
+ console.log(` Cluster URL: ${clusterUrl}`);
81576
+ console.log(` K8s Service: ${response.k8s_svc_name}.${response.k8s_namespace}`);
81577
+ if (status === "error" && response.status_msg) {
81578
+ console.log(` Error: ${response.status_msg}`);
81579
+ }
81580
+ console.log("");
81581
+ console.log(`Use this URL in your secrets:`);
81582
+ console.log(` eve secrets set LLM_BASE_URL "${clusterUrl}/v1" --scope org --org ${orgId}`);
81583
+ }
81584
+ return;
81585
+ }
81586
+ case "list": {
81587
+ const response = await requestJson(context2, basePath);
81588
+ if (json) {
81589
+ outputJson(response, true);
81590
+ } else {
81591
+ const data = response.data ?? [];
81592
+ if (data.length === 0) {
81593
+ console.log("No private endpoints registered.");
81594
+ } else {
81595
+ console.log(`Private endpoints for org ${orgId}:
81596
+ `);
81597
+ for (const ep of data) {
81598
+ const status = ep.status === "ready" ? "\u2713" : ep.status === "error" ? "\u2717" : "\u2026";
81599
+ console.log(` ${status} ${ep.name} (${ep.hostname}:${ep.port}) [${ep.status}]`);
81600
+ console.log(` URL: ${ep.cluster_url ?? "pending"}`);
81601
+ }
81602
+ }
81603
+ }
81604
+ return;
81605
+ }
81606
+ case "show": {
81607
+ const name = positionals[0] ?? getStringFlag(flags, ["name"]);
81608
+ if (!name) {
81609
+ throw new Error("Usage: eve endpoint show <name> --org <org_id>");
81610
+ }
81611
+ const verbose = Boolean(flags.verbose);
81612
+ const response = await requestJson(context2, `${basePath}/${name}`);
81613
+ if (json) {
81614
+ outputJson(response, true);
81615
+ } else {
81616
+ console.log(`Name: ${response.name}`);
81617
+ console.log(`Org: ${orgId}`);
81618
+ console.log(`Provider: ${response.provider}`);
81619
+ console.log(`Hostname: ${response.hostname}`);
81620
+ console.log(`Port: ${response.port}`);
81621
+ console.log(`Status: ${response.status}`);
81622
+ console.log(`Cluster DNS: ${response.k8s_dns}:${response.port}`);
81623
+ console.log(`Cluster URL: ${response.cluster_url}`);
81624
+ if (response.status_msg) {
81625
+ console.log(`Status Msg: ${response.status_msg}`);
81626
+ }
81627
+ if (verbose && response.health_path) {
81628
+ console.log("");
81629
+ console.log("Running health check...");
81630
+ try {
81631
+ const health = await requestJson(
81632
+ context2,
81633
+ `${basePath}/${name}/health`
81634
+ );
81635
+ const h = health.health;
81636
+ console.log(` Last checked: ${h.checked_at}`);
81637
+ if (h.reachable) {
81638
+ console.log(` HTTP GET ${response.health_path} \u2192 ${h.http_status} OK (${h.response_time_ms}ms)`);
81639
+ } else {
81640
+ console.log(` Unreachable: ${h.error}`);
81641
+ }
81642
+ } catch (err) {
81643
+ console.log(` Health check failed: ${err instanceof Error ? err.message : err}`);
81644
+ }
81645
+ }
81646
+ }
81647
+ return;
81648
+ }
81649
+ case "remove": {
81650
+ const name = positionals[0] ?? getStringFlag(flags, ["name"]);
81651
+ if (!name) {
81652
+ throw new Error("Usage: eve endpoint remove <name> --org <org_id>");
81653
+ }
81654
+ await requestJson(context2, `${basePath}/${name}`, { method: "DELETE" });
81655
+ outputJson({ ok: true }, json, `\u2713 Endpoint '${name}' removed`);
81656
+ return;
81657
+ }
81658
+ case "health": {
81659
+ const name = positionals[0] ?? getStringFlag(flags, ["name"]);
81660
+ if (!name) {
81661
+ throw new Error("Usage: eve endpoint health <name> --org <org_id>");
81662
+ }
81663
+ const response = await requestJson(context2, `${basePath}/${name}/health`);
81664
+ outputJson(response, json);
81665
+ return;
81666
+ }
81667
+ case "diagnose": {
81668
+ const name = positionals[0] ?? getStringFlag(flags, ["name"]);
81669
+ if (!name) {
81670
+ throw new Error("Usage: eve endpoint diagnose <name> --org <org_id>");
81671
+ }
81672
+ const response = await requestJson(
81673
+ context2,
81674
+ `${basePath}/${name}/diagnose`
81675
+ );
81676
+ if (json) {
81677
+ outputJson(response, true);
81678
+ } else {
81679
+ console.log(`Diagnostics for endpoint '${name}':
81680
+ `);
81681
+ for (const check of response.checks) {
81682
+ const icon = check.passed ? "\u2713" : "\u2717";
81683
+ const detail = check.detail ? ` \u2014 ${check.detail}` : "";
81684
+ console.log(` ${icon} ${check.name}${detail}`);
81685
+ }
81686
+ }
81687
+ return;
81688
+ }
81689
+ default:
81690
+ throw new Error(
81691
+ "Usage: eve endpoint <add|list|show|remove|health|diagnose>\n\n add Register a private endpoint backed by Tailscale\n list List endpoints for an org\n show Show endpoint details\n remove Remove an endpoint\n health Run a health check\n diagnose Run diagnostics on an endpoint"
81692
+ );
81693
+ }
81694
+ }
81695
+
82237
81696
  // src/index.ts
82238
81697
  function getCliVersion() {
82239
81698
  try {
@@ -82388,9 +81847,6 @@ async function main2() {
82388
81847
  case "migrate":
82389
81848
  await handleMigrate2(subcommand, rest, flags);
82390
81849
  return;
82391
- case "models":
82392
- await handleModels(subcommand, rest, flags, context2);
82393
- return;
82394
81850
  case "access":
82395
81851
  await handleAccess(subcommand, rest, flags, context2);
82396
81852
  return;
@@ -82417,9 +81873,6 @@ async function main2() {
82417
81873
  case "analytics":
82418
81874
  await handleAnalytics(subcommand, rest, flags, context2);
82419
81875
  return;
82420
- case "ollama":
82421
- await handleOllama(subcommand, rest, flags, context2);
82422
- return;
82423
81876
  case "ingest":
82424
81877
  await handleIngest(subcommand, rest, flags, context2);
82425
81878
  return;
@@ -82438,6 +81891,9 @@ async function main2() {
82438
81891
  case "user":
82439
81892
  await handleUser(subcommand, rest, flags, context2);
82440
81893
  return;
81894
+ case "endpoint":
81895
+ await handleEndpoint(subcommand, rest, flags, context2);
81896
+ return;
82441
81897
  default:
82442
81898
  showMainHelp();
82443
81899
  }