979 lines
30 KiB
JSON
979 lines
30 KiB
JSON
{
|
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
"$id": "https://hwlab.pikastech.local/deploy/deploy.schema.json",
|
|
"title": "HWLAB Deploy Manifest",
|
|
"type": "object",
|
|
"required": ["manifestVersion", "environment", "health", "publicEndpoints", "frp", "k3s", "profiles", "services"],
|
|
"properties": {
|
|
"manifestVersion": {
|
|
"type": "string",
|
|
"pattern": "^v[0-9]+$"
|
|
},
|
|
"environment": {
|
|
"type": "string",
|
|
"enum": ["dev"]
|
|
},
|
|
"namespace": {
|
|
"type": "string",
|
|
"minLength": 1,
|
|
"maxLength": 63,
|
|
"pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$"
|
|
},
|
|
"endpoint": {
|
|
"type": "string",
|
|
"const": "http://74.48.78.17:16667"
|
|
},
|
|
"health": {
|
|
"$ref": "#/$defs/health"
|
|
},
|
|
"publicEndpoints": {
|
|
"$ref": "#/$defs/publicEndpoints"
|
|
},
|
|
"frp": {
|
|
"$ref": "#/$defs/frp"
|
|
},
|
|
"k3s": {
|
|
"$ref": "#/$defs/k3s"
|
|
},
|
|
"profiles": {
|
|
"type": "object",
|
|
"required": ["dev"],
|
|
"properties": {
|
|
"dev": {
|
|
"$ref": "#/$defs/profile"
|
|
},
|
|
"prod": {
|
|
"$ref": "#/$defs/profile"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"lanes": {
|
|
"$ref": "#/$defs/lanes"
|
|
},
|
|
"services": {
|
|
"type": "array",
|
|
"minItems": 1,
|
|
"items": {
|
|
"$ref": "#/$defs/service"
|
|
}
|
|
},
|
|
"createdAt": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
}
|
|
},
|
|
"additionalProperties": false,
|
|
"$defs": {
|
|
"serviceId": {
|
|
"type": "string",
|
|
"enum": [
|
|
"hwlab-cloud-api",
|
|
"hwlab-workbench-runtime",
|
|
"hwlab-user-billing",
|
|
"hwlab-project-management",
|
|
"hwlab-cloud-web",
|
|
"hwlab-gateway",
|
|
"hwlab-edge-proxy",
|
|
"hwlab-agent-skills"
|
|
]
|
|
},
|
|
"health": {
|
|
"type": "object",
|
|
"required": ["method", "path", "responseFormat"],
|
|
"properties": {
|
|
"method": {
|
|
"type": "string",
|
|
"const": "GET"
|
|
},
|
|
"path": {
|
|
"type": "string",
|
|
"const": "/health/live"
|
|
},
|
|
"responseFormat": {
|
|
"type": "string",
|
|
"const": "json"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"publicEndpoints": {
|
|
"type": "object",
|
|
"required": ["frontend", "api"],
|
|
"properties": {
|
|
"frontend": {
|
|
"allOf": [
|
|
{
|
|
"$ref": "#/$defs/publicEndpoint"
|
|
},
|
|
{
|
|
"properties": {
|
|
"url": {
|
|
"const": "http://74.48.78.17:16666"
|
|
},
|
|
"port": {
|
|
"const": 16666
|
|
},
|
|
"serviceId": {
|
|
"const": "hwlab-cloud-web"
|
|
},
|
|
"frpProxy": {
|
|
"const": "hwlab-dev-cloud-web"
|
|
}
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"api": {
|
|
"allOf": [
|
|
{
|
|
"$ref": "#/$defs/publicEndpoint"
|
|
},
|
|
{
|
|
"properties": {
|
|
"url": {
|
|
"const": "http://74.48.78.17:16667"
|
|
},
|
|
"port": {
|
|
"const": 16667
|
|
},
|
|
"serviceId": {
|
|
"const": "hwlab-edge-proxy"
|
|
},
|
|
"frpProxy": {
|
|
"const": "hwlab-dev-edge-proxy"
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"publicEndpoint": {
|
|
"type": "object",
|
|
"required": ["url", "protocol", "host", "port", "serviceId", "frpProxy"],
|
|
"properties": {
|
|
"url": {
|
|
"type": "string",
|
|
"pattern": "^http://74\\.48\\.78\\.17:1666[67]$"
|
|
},
|
|
"protocol": {
|
|
"type": "string",
|
|
"const": "http"
|
|
},
|
|
"host": {
|
|
"type": "string",
|
|
"const": "74.48.78.17"
|
|
},
|
|
"port": {
|
|
"type": "integer",
|
|
"enum": [16666, 16667]
|
|
},
|
|
"serviceId": {
|
|
"$ref": "#/$defs/serviceId"
|
|
},
|
|
"frpProxy": {
|
|
"type": "string",
|
|
"minLength": 1
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"frp": {
|
|
"type": "object",
|
|
"required": ["server", "proxies"],
|
|
"properties": {
|
|
"server": {
|
|
"type": "object",
|
|
"required": ["address", "bindPort"],
|
|
"properties": {
|
|
"address": {
|
|
"type": "string",
|
|
"const": "74.48.78.17"
|
|
},
|
|
"bindPort": {
|
|
"type": "integer",
|
|
"const": 7000
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"proxies": {
|
|
"type": "array",
|
|
"minItems": 1,
|
|
"items": {
|
|
"$ref": "#/$defs/frpProxy"
|
|
}
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"frpProxy": {
|
|
"type": "object",
|
|
"required": ["name", "type", "localServiceId", "localHost", "localPort", "remotePort"],
|
|
"properties": {
|
|
"name": {
|
|
"type": "string",
|
|
"minLength": 1
|
|
},
|
|
"endpointId": {
|
|
"type": "string",
|
|
"enum": ["frontend", "api"]
|
|
},
|
|
"type": {
|
|
"type": "string",
|
|
"const": "tcp"
|
|
},
|
|
"localServiceId": {
|
|
"$ref": "#/$defs/serviceId"
|
|
},
|
|
"localHost": {
|
|
"type": "string",
|
|
"pattern": "^[-a-z0-9]+\\.hwlab-dev\\.svc\\.cluster\\.local$"
|
|
},
|
|
"localPort": {
|
|
"type": "integer",
|
|
"minimum": 1,
|
|
"maximum": 65535
|
|
},
|
|
"remotePort": {
|
|
"type": "integer",
|
|
"minimum": 1,
|
|
"maximum": 65535
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"k3s": {
|
|
"type": "object",
|
|
"required": ["serviceMappings"],
|
|
"properties": {
|
|
"serviceMappings": {
|
|
"type": "array",
|
|
"minItems": 1,
|
|
"items": {
|
|
"$ref": "#/$defs/k3sServiceMapping"
|
|
}
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"k3sServiceMapping": {
|
|
"type": "object",
|
|
"required": ["serviceId", "name", "namespace", "port", "targetPort"],
|
|
"properties": {
|
|
"serviceId": {
|
|
"$ref": "#/$defs/serviceId"
|
|
},
|
|
"name": {
|
|
"type": "string",
|
|
"minLength": 1
|
|
},
|
|
"namespace": {
|
|
"type": "string",
|
|
"const": "hwlab-dev"
|
|
},
|
|
"port": {
|
|
"type": "integer",
|
|
"minimum": 1,
|
|
"maximum": 65535
|
|
},
|
|
"targetPort": {
|
|
"type": "string",
|
|
"const": "http"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"profile": {
|
|
"type": "object",
|
|
"required": ["name", "enabled"],
|
|
"properties": {
|
|
"name": {
|
|
"type": "string",
|
|
"enum": ["dev", "prod"]
|
|
},
|
|
"enabled": {
|
|
"type": "boolean"
|
|
},
|
|
"namespace": {
|
|
"type": "string"
|
|
},
|
|
"endpoint": {
|
|
"type": "string"
|
|
},
|
|
"notes": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"lanes": {
|
|
"type": "object",
|
|
"patternProperties": {
|
|
"^v[0-9]{2,}$": {
|
|
"$ref": "#/$defs/runtimeLane"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"runtimeLane": {
|
|
"type": "object",
|
|
"required": ["name", "sourceBranch", "gitopsBranch", "namespace", "envReuseServices", "bootScripts", "serviceDeclarations", "envRecipe", "bootConfig"],
|
|
"properties": {
|
|
"name": { "type": "string", "pattern": "^v0\\.[0-9]+$" },
|
|
"sourceBranch": { "type": "string", "pattern": "^v0\\.[0-9]+$" },
|
|
"gitopsBranch": { "type": "string", "pattern": "^v0\\.[0-9]+-gitops$" },
|
|
"namespace": { "type": "string", "pattern": "^hwlab-v[0-9]{2,}$" },
|
|
"endpoint": { "type": "string" },
|
|
"publicEndpoints": {
|
|
"type": "object",
|
|
"additionalProperties": { "type": "string" }
|
|
},
|
|
"externalPostgres": { "$ref": "#/$defs/externalPostgres" },
|
|
"artifactCatalog": { "type": "string" },
|
|
"runtimePath": { "type": "string" },
|
|
"imageTagMode": { "type": "string", "enum": ["short", "full"] },
|
|
"workbench": { "$ref": "#/$defs/workbenchUiPolicy" },
|
|
"observability": { "$ref": "#/$defs/runtimeObservabilityPolicy" },
|
|
"opencode": { "$ref": "#/$defs/opencodeRuntime" },
|
|
"runtimeStore": { "$ref": "#/$defs/runtimeStore" },
|
|
"workbenchRuntime": { "$ref": "#/$defs/workbenchRuntime" },
|
|
"sourceRepo": { "type": "string" },
|
|
"envReuseServices": {
|
|
"type": "array",
|
|
"items": { "$ref": "#/$defs/serviceId" },
|
|
"uniqueItems": true
|
|
},
|
|
"bootScripts": {
|
|
"type": "object",
|
|
"minProperties": 1,
|
|
"additionalProperties": { "$ref": "#/$defs/repoPath" }
|
|
},
|
|
"serviceDeclarations": {
|
|
"type": "object",
|
|
"minProperties": 1,
|
|
"additionalProperties": { "$ref": "#/$defs/serviceDeclaration" }
|
|
},
|
|
"envRecipe": { "$ref": "#/$defs/envRecipe" },
|
|
"bootConfig": { "$ref": "#/$defs/bootConfig" },
|
|
"services": {
|
|
"type": "array",
|
|
"items": { "$ref": "#/$defs/laneService" }
|
|
},
|
|
"configMaps": {
|
|
"type": "array",
|
|
"items": { "$ref": "#/$defs/laneConfigMap" }
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"opencodeRuntime": {
|
|
"type": "object",
|
|
"properties": {
|
|
"providerProfile": { "type": "string", "minLength": 1 },
|
|
"providerId": { "type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]*$" },
|
|
"displayName": { "type": "string", "minLength": 1 },
|
|
"model": { "type": "string", "minLength": 1 },
|
|
"smallModel": { "type": "string", "minLength": 1 },
|
|
"baseURL": { "type": "string", "minLength": 1 },
|
|
"apkProxyURL": { "type": "string", "minLength": 1 },
|
|
"npm": { "type": "string", "minLength": 1 },
|
|
"apiKeyEnv": { "type": "string", "pattern": "^[A-Z0-9_]+$" },
|
|
"apiKeySecretRef": { "type": "string", "pattern": "^[A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+$" },
|
|
"contextLimit": { "type": "integer", "minimum": 1 },
|
|
"outputLimit": { "type": "integer", "minimum": 1 },
|
|
"agentrunSecretNamespace": { "type": "string", "minLength": 1 },
|
|
"agentrunSecretName": { "type": "string", "minLength": 1 },
|
|
"agentrunSecretKeys": {
|
|
"type": "array",
|
|
"items": { "type": "string", "minLength": 1 },
|
|
"uniqueItems": true
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"runtimeObservabilityPolicy": {
|
|
"type": "object",
|
|
"properties": {
|
|
"traceExplorerUrlTemplate": {
|
|
"type": "string",
|
|
"minLength": 1,
|
|
"pattern": "\\{trace_id\\}"
|
|
},
|
|
"prometheusOperatorResources": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"runtimeStore": {
|
|
"type": "object",
|
|
"properties": {
|
|
"postgres": { "$ref": "#/$defs/postgresRuntimeStore" }
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"postgresRuntimeStore": {
|
|
"type": "object",
|
|
"properties": {
|
|
"image": { "type": "string", "minLength": 1 },
|
|
"sslMode": { "type": "string", "enum": ["disable", "require"] },
|
|
"poolMax": { "type": "integer", "minimum": 1 },
|
|
"connectionTimeoutMs": { "type": "integer", "minimum": 1 },
|
|
"queryTimeoutMs": { "type": "integer", "minimum": 1 },
|
|
"queryRetryMaxAttempts": { "type": "integer", "minimum": 1 },
|
|
"queryRetryInitialDelayMs": { "type": "integer", "minimum": 0 },
|
|
"queryRetryMaxDelayMs": { "type": "integer", "minimum": 0 }
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"workbenchRuntime": {
|
|
"type": "object",
|
|
"properties": {
|
|
"client": { "$ref": "#/$defs/workbenchRuntimeClient" },
|
|
"sessionsSummary": { "$ref": "#/$defs/workbenchRuntimeSessionsSummary" },
|
|
"factsQuery": { "$ref": "#/$defs/workbenchRuntimeFactsQuery" },
|
|
"postgres": { "$ref": "#/$defs/workbenchRuntimePostgres" },
|
|
"cache": { "$ref": "#/$defs/workbenchRuntimeCache" }
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"workbenchRuntimeClient": {
|
|
"type": "object",
|
|
"properties": {
|
|
"timeoutMs": { "type": "integer", "minimum": 1 }
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"workbenchRuntimeFactsQuery": {
|
|
"type": "object",
|
|
"properties": {
|
|
"maxAttempts": { "type": "integer", "minimum": 1 },
|
|
"backoffBaseMs": { "type": "integer", "minimum": 0 },
|
|
"backoffMaxMs": { "type": "integer", "minimum": 1 }
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"workbenchRuntimeSessionsSummary": {
|
|
"type": "object",
|
|
"properties": {
|
|
"maxAttempts": { "type": "integer", "minimum": 1 },
|
|
"attemptTimeoutMs": { "type": "integer", "minimum": 1 },
|
|
"backoffMs": { "type": "integer", "minimum": 0 }
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"workbenchRuntimePostgres": {
|
|
"type": "object",
|
|
"properties": {
|
|
"poolMax": { "type": "integer", "minimum": 1 },
|
|
"queryTimeoutMs": { "type": "integer", "minimum": 1 },
|
|
"readyTimeoutMs": { "type": "integer", "minimum": 1 }
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"workbenchRuntimeCache": {
|
|
"type": "object",
|
|
"properties": {
|
|
"redis": { "$ref": "#/$defs/workbenchRuntimeRedisCache" }
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"workbenchRuntimeRedisCache": {
|
|
"type": "object",
|
|
"required": ["enabled", "namespace", "serviceName", "port", "image", "resources", "memoryPolicy", "ttl", "limits", "timeouts", "metrics", "disableSwitchEnv", "unavailableBehavior"],
|
|
"properties": {
|
|
"enabled": { "type": "boolean" },
|
|
"namespace": { "type": "string", "pattern": "^hwlab-v[0-9]{2,}$" },
|
|
"serviceName": {
|
|
"type": "string",
|
|
"minLength": 1,
|
|
"maxLength": 63,
|
|
"pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$"
|
|
},
|
|
"port": { "type": "integer", "minimum": 1, "maximum": 65535 },
|
|
"image": { "type": "string", "minLength": 1 },
|
|
"resources": { "$ref": "#/$defs/workbenchRuntimeRedisResources" },
|
|
"memoryPolicy": { "$ref": "#/$defs/workbenchRuntimeRedisMemoryPolicy" },
|
|
"ttl": { "$ref": "#/$defs/workbenchRuntimeRedisTtl" },
|
|
"limits": { "$ref": "#/$defs/workbenchRuntimeRedisLimits" },
|
|
"timeouts": { "$ref": "#/$defs/workbenchRuntimeRedisTimeouts" },
|
|
"metrics": { "$ref": "#/$defs/workbenchRuntimeRedisMetrics" },
|
|
"disableSwitchEnv": { "type": "string", "pattern": "^[A-Z0-9_]+$" },
|
|
"unavailableBehavior": { "$ref": "#/$defs/workbenchRuntimeRedisUnavailableBehavior" }
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"workbenchRuntimeRedisResources": {
|
|
"type": "object",
|
|
"required": ["requests", "limits"],
|
|
"properties": {
|
|
"requests": { "$ref": "#/$defs/workbenchRuntimeResourcePair" },
|
|
"limits": { "$ref": "#/$defs/workbenchRuntimeResourcePair" }
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"workbenchRuntimeResourcePair": {
|
|
"type": "object",
|
|
"required": ["cpu", "memory"],
|
|
"properties": {
|
|
"cpu": { "type": "string", "minLength": 1 },
|
|
"memory": { "type": "string", "minLength": 1 }
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"workbenchRuntimeRedisMemoryPolicy": {
|
|
"type": "object",
|
|
"required": ["persistence", "maxMemory", "eviction"],
|
|
"properties": {
|
|
"persistence": { "type": "string", "enum": ["disabled"] },
|
|
"maxMemory": { "type": "string", "minLength": 1 },
|
|
"eviction": { "type": "string", "minLength": 1 }
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"workbenchRuntimeRedisTtl": {
|
|
"type": "object",
|
|
"required": ["sessionsSummaryMs", "terminalTurnMs", "terminalTracePageMs", "runningPageMs"],
|
|
"properties": {
|
|
"sessionsSummaryMs": { "type": "integer", "minimum": 0 },
|
|
"terminalTurnMs": { "type": "integer", "minimum": 0 },
|
|
"terminalTracePageMs": { "type": "integer", "minimum": 0 },
|
|
"runningPageMs": { "type": "integer", "minimum": 0 }
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"workbenchRuntimeRedisLimits": {
|
|
"type": "object",
|
|
"required": ["maxKeyBytes", "maxPayloadBytes"],
|
|
"properties": {
|
|
"maxKeyBytes": { "type": "integer", "minimum": 1 },
|
|
"maxPayloadBytes": { "type": "integer", "minimum": 1 }
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"workbenchRuntimeRedisTimeouts": {
|
|
"type": "object",
|
|
"required": ["connectMs", "operationMs"],
|
|
"properties": {
|
|
"connectMs": { "type": "integer", "minimum": 1 },
|
|
"operationMs": { "type": "integer", "minimum": 1 }
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"workbenchRuntimeRedisMetrics": {
|
|
"type": "object",
|
|
"required": ["labels"],
|
|
"properties": {
|
|
"labels": {
|
|
"type": "object",
|
|
"additionalProperties": { "type": "string", "minLength": 1 }
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"workbenchRuntimeRedisUnavailableBehavior": {
|
|
"type": "object",
|
|
"required": ["livenessFailure", "readMode", "fallbackStateSource"],
|
|
"properties": {
|
|
"livenessFailure": { "type": "boolean" },
|
|
"readMode": { "type": "string", "enum": ["db-or-degraded"] },
|
|
"fallbackStateSource": { "type": "boolean" }
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"workbenchUiPolicy": {
|
|
"type": "object",
|
|
"properties": {
|
|
"traceTimeline": { "$ref": "#/$defs/workbenchTraceTimelinePolicy" },
|
|
"rawHwlabEventWindow": { "$ref": "#/$defs/workbenchRawHwlabEventWindowPolicy" }
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"workbenchTraceTimelinePolicy": {
|
|
"type": "object",
|
|
"properties": {
|
|
"autoExpandRunning": { "type": "boolean" },
|
|
"autoCollapseTerminal": { "type": "boolean" }
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"workbenchRawHwlabEventWindowPolicy": {
|
|
"type": "object",
|
|
"required": ["enabled", "maxEntries", "maxRetainedBytes"],
|
|
"properties": {
|
|
"enabled": { "type": "boolean" },
|
|
"maxEntries": { "type": "integer", "minimum": 1 },
|
|
"maxRetainedBytes": { "type": "integer", "minimum": 1 }
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"externalPostgres": {
|
|
"type": "object",
|
|
"required": ["enabled", "serviceName", "endpointAddress", "port"],
|
|
"properties": {
|
|
"enabled": { "type": "boolean" },
|
|
"serviceName": {
|
|
"type": "string",
|
|
"minLength": 1,
|
|
"maxLength": 63,
|
|
"pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$"
|
|
},
|
|
"endpointAddress": { "type": "string", "minLength": 1 },
|
|
"port": { "type": "integer", "minimum": 1, "maximum": 65535 },
|
|
"nodes": {
|
|
"type": "object",
|
|
"additionalProperties": { "$ref": "#/$defs/externalPostgresNodeOverride" }
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"externalPostgresNodeOverride": {
|
|
"type": "object",
|
|
"required": ["serviceName", "endpointAddress", "port"],
|
|
"properties": {
|
|
"serviceName": {
|
|
"type": "string",
|
|
"minLength": 1,
|
|
"maxLength": 63,
|
|
"pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$"
|
|
},
|
|
"endpointAddress": { "type": "string", "minLength": 1 },
|
|
"port": { "type": "integer", "minimum": 1, "maximum": 65535 }
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"probeTiming": {
|
|
"type": "object",
|
|
"properties": {
|
|
"initialDelaySeconds": { "type": "integer", "minimum": 0 },
|
|
"periodSeconds": { "type": "integer", "minimum": 1 },
|
|
"timeoutSeconds": { "type": "integer", "minimum": 1 },
|
|
"failureThreshold": { "type": "integer", "minimum": 1 },
|
|
"successThreshold": { "type": "integer", "minimum": 1 }
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"serviceHealthProbe": {
|
|
"type": "object",
|
|
"properties": {
|
|
"readiness": { "$ref": "#/$defs/probeTiming" },
|
|
"liveness": { "$ref": "#/$defs/probeTiming" },
|
|
"startup": { "$ref": "#/$defs/probeTiming" }
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"serviceDeclaration": {
|
|
"type": "object",
|
|
"required": ["runtimeKind", "entrypoint", "componentPaths"],
|
|
"properties": {
|
|
"runtimeKind": { "type": "string", "enum": ["bun-command", "cloud-web", "skills-bundle", "node-command", "go-service"] },
|
|
"entrypoint": { "$ref": "#/$defs/repoPath" },
|
|
"artifactKind": { "type": "string", "enum": ["bun-command", "cloud-web", "skills-bundle", "node-command", "go-service"] },
|
|
"healthPath": { "type": "string", "pattern": "^/" },
|
|
"healthPort": { "type": "integer", "minimum": 1, "maximum": 65535 },
|
|
"healthProbe": { "$ref": "#/$defs/serviceHealthProbe" },
|
|
"componentPaths": {
|
|
"type": "array",
|
|
"minItems": 1,
|
|
"items": { "$ref": "#/$defs/repoPath" }
|
|
},
|
|
"env": {
|
|
"type": "object",
|
|
"additionalProperties": { "type": "string" }
|
|
},
|
|
"observable": { "type": "boolean" }
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"envRecipe": {
|
|
"type": "object",
|
|
"required": ["osPackages", "bunVersion", "launcherPath", "runtimeNodeModulesPath", "additionalEnvPaths", "hwpodAliases"],
|
|
"properties": {
|
|
"osPackages": {
|
|
"type": "array",
|
|
"minItems": 1,
|
|
"items": { "type": "string", "minLength": 1 },
|
|
"uniqueItems": true
|
|
},
|
|
"goOsPackages": {
|
|
"type": "array",
|
|
"items": { "type": "string", "minLength": 1 },
|
|
"uniqueItems": true
|
|
},
|
|
"bunVersion": { "type": "string", "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+" },
|
|
"launcherPath": { "$ref": "#/$defs/repoPath" },
|
|
"runtimeNodeModulesPath": { "type": "string", "pattern": "^/" },
|
|
"runtimeGoModCachePath": { "type": "string", "pattern": "^/" },
|
|
"runtimeGoBuildCachePath": { "type": "string", "pattern": "^/" },
|
|
"goToolchain": { "type": "string", "minLength": 1 },
|
|
"additionalEnvPaths": {
|
|
"type": "array",
|
|
"items": { "$ref": "#/$defs/repoPath" },
|
|
"uniqueItems": true
|
|
},
|
|
"hwpodAliases": {
|
|
"type": "array",
|
|
"items": { "$ref": "#/$defs/hwpodAlias" }
|
|
},
|
|
"downloadStack": {
|
|
"type": "object",
|
|
"additionalProperties": true,
|
|
"properties": {
|
|
"goProxy": { "type": "string", "minLength": 1 }
|
|
}
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"hwpodAlias": {
|
|
"type": "object",
|
|
"required": ["command", "script"],
|
|
"properties": {
|
|
"command": { "type": "string", "minLength": 1 },
|
|
"script": { "$ref": "#/$defs/repoPath" }
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"bootConfig": {
|
|
"type": "object",
|
|
"required": ["template"],
|
|
"properties": {
|
|
"template": { "type": "string", "enum": ["default"] },
|
|
"overrides": { "type": "object" }
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"laneService": {
|
|
"type": "object",
|
|
"required": ["serviceId"],
|
|
"properties": {
|
|
"serviceId": { "$ref": "#/$defs/serviceId" },
|
|
"env": {
|
|
"type": "object",
|
|
"additionalProperties": { "type": "string" }
|
|
},
|
|
"configMapMounts": {
|
|
"type": "array",
|
|
"items": { "$ref": "#/$defs/configMapMount" }
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"laneConfigMap": {
|
|
"type": "object",
|
|
"required": ["name", "data"],
|
|
"properties": {
|
|
"name": { "$ref": "#/$defs/k8sName" },
|
|
"labels": {
|
|
"type": "object",
|
|
"additionalProperties": { "type": "string" }
|
|
},
|
|
"annotations": {
|
|
"type": "object",
|
|
"additionalProperties": { "type": "string" }
|
|
},
|
|
"data": {
|
|
"type": "object",
|
|
"minProperties": 1,
|
|
"additionalProperties": { "type": "string" }
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"configMapMount": {
|
|
"type": "object",
|
|
"required": ["name", "configMapName", "mountPath"],
|
|
"properties": {
|
|
"name": { "$ref": "#/$defs/k8sName" },
|
|
"configMapName": { "$ref": "#/$defs/k8sName" },
|
|
"mountPath": { "type": "string", "pattern": "^/" },
|
|
"readOnly": { "type": "boolean" },
|
|
"items": {
|
|
"type": "array",
|
|
"items": { "$ref": "#/$defs/configMapMountItem" }
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"configMapMountItem": {
|
|
"type": "object",
|
|
"required": ["key", "path"],
|
|
"properties": {
|
|
"key": { "type": "string", "minLength": 1 },
|
|
"path": { "type": "string", "minLength": 1, "not": { "pattern": "(^/|(^|/)\\.\\.(/|$))" } }
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"k8sName": {
|
|
"type": "string",
|
|
"minLength": 1,
|
|
"maxLength": 63,
|
|
"pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$"
|
|
},
|
|
"repoPath": {
|
|
"type": "string",
|
|
"minLength": 1,
|
|
"not": { "pattern": "(^/|(^|/)\\.\\.(/|$))" }
|
|
},
|
|
"service": {
|
|
"type": "object",
|
|
"required": ["serviceId", "namespace", "healthPath", "profile"],
|
|
"properties": {
|
|
"serviceId": {
|
|
"$ref": "#/$defs/serviceId"
|
|
},
|
|
"namespace": {
|
|
"type": "string",
|
|
"minLength": 1
|
|
},
|
|
"healthPath": {
|
|
"type": "string",
|
|
"pattern": "^/"
|
|
},
|
|
"profile": {
|
|
"type": "string",
|
|
"enum": ["dev", "prod"]
|
|
},
|
|
"replicas": {
|
|
"type": "integer",
|
|
"minimum": 0
|
|
},
|
|
"instanceNames": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string",
|
|
"minLength": 1
|
|
}
|
|
},
|
|
"identityStrategy": {
|
|
"type": "string",
|
|
"enum": ["indexed-workloads"]
|
|
},
|
|
"env": {
|
|
"type": "object",
|
|
"additionalProperties": {
|
|
"type": "string"
|
|
},
|
|
"properties": {
|
|
"HWLAB_CLOUD_DB_URL": {
|
|
"type": "string",
|
|
"const": "secretRef:hwlab-cloud-api-dev-db/database-url"
|
|
},
|
|
"HWLAB_CLOUD_DB_SSL_MODE": {
|
|
"type": "string",
|
|
"const": "disable"
|
|
},
|
|
"HWLAB_CLOUD_DB_CONTRACT": {
|
|
"type": "string",
|
|
"const": "dev-redacted-presence-only"
|
|
},
|
|
"HWLAB_CLOUD_RUNTIME_ADAPTER": {
|
|
"type": "string",
|
|
"const": "postgres"
|
|
},
|
|
"HWLAB_CLOUD_RUNTIME_DURABLE": {
|
|
"type": "string",
|
|
"const": "true"
|
|
},
|
|
"HWLAB_CODE_AGENT_PROVIDER": {
|
|
"type": "string",
|
|
"const": "codex-stdio"
|
|
},
|
|
"HWLAB_CODE_AGENT_MODEL": {
|
|
"type": "string",
|
|
"const": "gpt-5.5"
|
|
},
|
|
"HWLAB_CODE_AGENT_DEFAULT_PROVIDER_PROFILE": {
|
|
"type": "string",
|
|
"const": "deepseek"
|
|
},
|
|
"HWLAB_CODE_AGENT_DEEPSEEK_MODEL": {
|
|
"type": "string",
|
|
"const": "deepseek-chat"
|
|
},
|
|
"HWLAB_CODE_AGENT_DEEPSEEK_BASE_URL": {
|
|
"type": "string",
|
|
"const": "http://hwlab-deepseek-proxy.hwlab-dev.svc.cluster.local:4000/v1/responses"
|
|
},
|
|
"HWLAB_CODE_AGENT_CODEX_API_MODEL": {
|
|
"type": "string",
|
|
"const": "gpt-5.5"
|
|
},
|
|
"HWLAB_CODE_AGENT_CODEX_API_BASE_URL": {
|
|
"type": "string",
|
|
"const": "http://127.0.0.1:49280/responses"
|
|
},
|
|
"HWLAB_CODE_AGENT_CODEX_API_UPSTREAM_BASE_URL": {
|
|
"type": "string",
|
|
"const": "https://hyueapi.com"
|
|
},
|
|
"HWLAB_CODE_AGENT_CODEX_API_FORWARDER_PORT": {
|
|
"type": "string",
|
|
"const": "49280"
|
|
},
|
|
"HWLAB_CODE_AGENT_OPENAI_BASE_URL": {
|
|
"type": "string",
|
|
"const": "http://127.0.0.1:49280/responses"
|
|
},
|
|
"HWLAB_CODE_AGENT_CODEX_STDIO_ENABLED": {
|
|
"type": "string",
|
|
"const": "1"
|
|
},
|
|
"HWLAB_CODE_AGENT_CODEX_STDIO_SUPERVISOR": {
|
|
"type": "string",
|
|
"const": "repo-owned"
|
|
},
|
|
"HWLAB_CODE_AGENT_WORKSPACE": {
|
|
"type": "string",
|
|
"const": "/workspace/hwlab"
|
|
},
|
|
"HWLAB_CODE_AGENT_CODEX_WORKSPACE": {
|
|
"type": "string",
|
|
"const": "/workspace/hwlab"
|
|
},
|
|
"HWLAB_CODE_AGENT_CODEX_SANDBOX": {
|
|
"type": "string",
|
|
"const": "danger-full-access"
|
|
},
|
|
"HWLAB_CODE_AGENT_CODEX_COMMAND": {
|
|
"type": "string",
|
|
"const": "/app/node_modules/.bin/codex"
|
|
},
|
|
"CODEX_HOME": {
|
|
"type": "string",
|
|
"const": "/codex-home"
|
|
},
|
|
"NO_PROXY": {
|
|
"type": "string"
|
|
},
|
|
"no_proxy": {
|
|
"type": "string"
|
|
},
|
|
"OPENAI_API_KEY": {
|
|
"type": "string",
|
|
"const": "secretRef:hwlab-code-agent-provider/openai-api-key"
|
|
}
|
|
}
|
|
},
|
|
"publishEnabled": {
|
|
"type": "boolean"
|
|
},
|
|
"artifactRequired": {
|
|
"type": "boolean"
|
|
},
|
|
"artifactScope": {
|
|
"type": "string",
|
|
"enum": ["required", "disabled"]
|
|
},
|
|
"notPublishedReason": {
|
|
"type": ["string", "null"]
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
}
|
|
}
|
|
}
|