@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
|
-
|
|
51288
|
-
description: "Manage
|
|
51289
|
-
usage: "eve
|
|
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
|
-
|
|
51292
|
-
description: "
|
|
51293
|
-
usage: "eve
|
|
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
|
-
"
|
|
51324
|
-
"
|
|
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
|
-
|
|
51328
|
-
description: "List
|
|
51329
|
-
usage: "eve
|
|
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
|
-
|
|
51332
|
-
description: "
|
|
51333
|
-
usage: "eve
|
|
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
|
-
"
|
|
51336
|
-
|
|
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
|
-
|
|
51344
|
-
description: "
|
|
51345
|
-
usage: "eve
|
|
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
|
-
|
|
51348
|
-
description: "
|
|
51349
|
-
usage: "eve
|
|
51350
|
-
|
|
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
|
-
|
|
51356
|
-
description: "
|
|
51357
|
-
usage: "eve
|
|
51358
|
-
|
|
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
|
|
51367
|
-
"eve
|
|
51368
|
-
"eve
|
|
51369
|
-
"eve
|
|
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("
|
|
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
|
|
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/
|
|
60343
|
-
var
|
|
60344
|
-
|
|
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
|
-
|
|
60384
|
-
scope_id: external_exports.string().nullable(),
|
|
60334
|
+
/** Original filename */
|
|
60385
60335
|
name: external_exports.string(),
|
|
60386
|
-
|
|
60387
|
-
|
|
60388
|
-
|
|
60389
|
-
|
|
60390
|
-
|
|
60391
|
-
|
|
60392
|
-
|
|
60393
|
-
|
|
60394
|
-
|
|
60395
|
-
|
|
60396
|
-
|
|
60397
|
-
|
|
60398
|
-
|
|
60399
|
-
|
|
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
|
|
60411
|
-
|
|
60412
|
-
|
|
60413
|
-
|
|
60414
|
-
|
|
60415
|
-
|
|
60416
|
-
|
|
60417
|
-
|
|
60418
|
-
|
|
60419
|
-
|
|
60420
|
-
|
|
60421
|
-
|
|
60422
|
-
|
|
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
|
|
60425
|
-
|
|
60426
|
-
|
|
60427
|
-
|
|
60428
|
-
|
|
60429
|
-
|
|
60430
|
-
|
|
60431
|
-
|
|
60432
|
-
|
|
60433
|
-
|
|
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
|
|
60389
|
+
var PrivateEndpointResponseSchema = external_exports.object({
|
|
60436
60390
|
id: external_exports.string(),
|
|
60437
|
-
|
|
60438
|
-
|
|
60439
|
-
|
|
60440
|
-
|
|
60441
|
-
|
|
60442
|
-
|
|
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
|
|
60447
|
-
|
|
60448
|
-
|
|
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
|
|
60475
|
-
|
|
60476
|
-
|
|
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
|
|
60479
|
-
|
|
60480
|
-
|
|
60481
|
-
|
|
60482
|
-
|
|
60483
|
-
|
|
60484
|
-
|
|
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.
|
|
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,
|
|
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
|
|
74634
|
+
const pad2 = (s, n) => s + " ".repeat(Math.max(0, n - s.length));
|
|
74749
74635
|
const header = [
|
|
74750
|
-
|
|
74751
|
-
|
|
74752
|
-
|
|
74753
|
-
|
|
74754
|
-
|
|
74755
|
-
|
|
74756
|
-
|
|
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
|
-
|
|
74763
|
-
|
|
74764
|
-
|
|
74765
|
-
|
|
74766
|
-
|
|
74767
|
-
|
|
74768
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
}
|