///|
pub fn moongate_framework_apps_json() -> Json {
Json::array([
moongate_framework_app_json(
"moondesk",
"MoonDesk",
"single",
desktop=true,
provider_app_type=Some("openclaw"),
priority=0,
),
moongate_framework_app_json(
"moonclaw",
"MoonClaw",
"single",
provider_app_type=Some("openclaw"),
priority=1,
),
moongate_framework_app_json("claude", "Claude Code", "single"),
moongate_framework_app_json(
"claude-desktop",
"Claude Desktop",
"single",
desktop=true,
),
moongate_framework_app_json("codex", "Codex", "single"),
moongate_framework_app_json("gemini", "Gemini", "single"),
moongate_framework_app_json("opencode", "OpenCode", "additive"),
moongate_framework_app_json("openclaw", "OpenClaw", "additive"),
moongate_framework_app_json("hermes", "Hermes", "additive"),
])
}
///|
fn moongate_framework_app_json(
id : String,
label : String,
mode : String,
desktop? : Bool = false,
provider_app_type? : String? = None,
priority? : Int = 100,
) -> Json {
let app = {
"id": Json::string(id),
"label": Json::string(label),
"mode": Json::string(mode),
"priority": Json::number(priority.to_double()),
}
if desktop {
app["desktop"] = Json::boolean(true)
}
match provider_app_type {
Some(value) => app["providerAppType"] = Json::string(value)
None => ()
}
Json::object(app)
}
///|
fn moongate_ui_sections() -> Array[(String, String)] {
[
("overview", "Overview"),
("providers", "Providers"),
("bindings", "App Bindings"),
("connections", "Connection Graph"),
("connect", "Manual Connect"),
("requests", "Requests"),
("usage", "Usage"),
("operations", "Operations"),
("suite", "Suite"),
("guide", "Guide"),
]
}
///|
pub fn moongate_ui_sections_json() -> Json {
Json::array(
moongate_ui_sections().map(fn(section) {
let (id, label) = section
Json::object({
"id": Json::string(id),
"label": Json::string(label),
"target": Json::string("#\{id}"),
})
}),
)
}
///|
pub fn moongate_ui_endpoints_json() -> Json {
Json::object({
"health": Json::string("/health"),
"status": Json::string("/status"),
"proxy": Json::string("/proxy/status"),
"proxyStart": Json::string("/proxy/start"),
"proxyStop": Json::string("/proxy/stop"),
"syncLive": Json::string("/proxy/sync-current-providers-live"),
"providerCreate": Json::string("/providers"),
"providerCurrent": Json::string("/providers/current"),
"providerUpdate": Json::string("/providers/update"),
"providerDelete": Json::string("/providers"),
"providerSwitch": Json::string("/providers/switch"),
"appBinding": Json::string("/bindings"),
"providerImportLive": Json::string("/providers/import-live"),
"providerPresets": Json::string("/providers/presets"),
"providerStreamCheck": Json::string("/proxy/stream-check/provider"),
"usageSummary": Json::string("/usage/summary"),
"usageByApp": Json::string("/usage/summary/by-app"),
"usageTrends": Json::string("/usage/trends"),
"providerStats": Json::string("/usage/provider-stats"),
"modelStats": Json::string("/usage/model-stats"),
"usageLogs": Json::string("/usage/logs"),
"operationsMonitor": Json::string("/operations/monitor"),
"deterministicBenchmark": Json::string("/benchmark/deterministic"),
"liveBenchmark": Json::string("/benchmark/live"),
"routingPolicy": Json::string("/routing/policies"),
"routingPolicyConfigure": Json::string("/routing/policies/configure"),
"routingPolicyShadow": Json::string("/routing/policies/shadow"),
"routingPolicyActivate": Json::string("/routing/policies/activate"),
"routingPolicyRollback": Json::string("/routing/policies/rollback"),
"logs": Json::string("/usage/logs?limit=8"),
"requestDetail": Json::string("/usage/request-detail"),
"authStatus": Json::string("/auth/status"),
"configStatus": Json::string("/config/status"),
"configFolderOpen": Json::string("/config/folder/open"),
"claudeDesktopStatus": Json::string("/providers/claude-desktop/status"),
"claudeDesktopImport": Json::string("/providers/claude-desktop/import"),
"mcpServers": Json::string("/mcp/servers"),
"mcpImportApps": Json::string("/mcp/import-apps"),
"settings": Json::string("/settings"),
"portableMode": Json::string("/runtime/portable-mode"),
"toolsVersions": Json::string("/tools/versions"),
"proxyRunning": Json::string("/proxy/running"),
"takeoverStatus": Json::string("/proxy/takeover-status"),
"pluginClaudeStatus": Json::string("/plugin/claude/status"),
"pluginClaudeApplied": Json::string("/plugin/claude/applied"),
"circuitConfig": Json::string("/proxy/circuit-breaker-config"),
"circuitStats": Json::string("/proxy/circuit-breaker-stats"),
"resetCircuit": Json::string("/proxy/reset-circuit-breaker"),
"failoverQueue": Json::string("/proxy/failover-queue"),
"availableFailover": Json::string("/proxy/available-failover-providers"),
"autoFailover": Json::string("/proxy/auto-failover-enabled"),
"providerLimits": Json::string("/usage/provider-limits"),
"streamCheckAll": Json::string("/proxy/stream-check/all"),
"streamCheckConfig": Json::string("/proxy/stream-check/config"),
"suiteManifest": Json::string("/suite/manifest"),
"suiteStatus": Json::string("/suite/status"),
"suiteDrift": Json::string("/suite/drift"),
"suiteCapabilities": Json::string("/suite/capabilities"),
"suiteCapabilityResolve": Json::string("/suite/capabilities/resolve"),
"suiteWriteStatus": Json::string("/suite/status/write"),
"suiteMoonclawProviders": Json::string("/suite/moonclaw-providers"),
"suiteWriteMoonclawProviders": Json::string(
"/suite/moonclaw-providers/write",
),
})
}
///|
pub fn moongate_ui_readiness_cards_json() -> Json {
Json::array([
moongate_readiness_card_json(
"gateway", "MoonGate", "Ready", "Unavailable", "#overview",
),
moongate_readiness_card_json(
"proxy", "AI routing", "Running", "Needs start", "#overview",
),
moongate_readiness_card_json(
"providers", "Providers", "Configured", "Add provider", "#providers",
),
moongate_readiness_card_json(
"usage", "Usage", "Tracking", "No traffic yet", "#usage",
),
moongate_readiness_card_json(
"requests", "Requests", "Recent activity", "No requests yet", "#requests",
),
])
}
///|
fn moongate_readiness_card_json(
id : String,
label : String,
ready : String,
waiting : String,
target : String,
) -> Json {
Json::object({
"id": Json::string(id),
"label": Json::string(label),
"ready": Json::string(ready),
"waiting": Json::string(waiting),
"target": Json::string(target),
})
}