use std::collections::BTreeMap;
use anyhow::{Context, Result};
use greentic_types::secrets::SecretRequirement;
use serde::Serialize;
use serde_json::{Value, json};
pub fn dw_agents_sidecar_bytes(
agents: &BTreeMap<String, serde_json::Value>,
) -> Result<Option<Vec<u8>>> {
if agents.is_empty() {
return Ok(None);
}
let bytes = serde_json::to_vec(agents).context("serialize dw-agents.json")?;
Ok(Some(bytes))
}
#[derive(Debug, Clone, Serialize)]
#[serde(tag = "policy", rename_all = "kebab-case")]
pub enum SecretSharePolicy {
ByoRequired,
DefaultOverridable {
#[serde(default, skip_serializing_if = "Option::is_none")]
default_ref: Option<String>,
},
}
#[derive(Debug, Clone, Serialize)]
pub struct SecretPolicyEntry {
#[serde(flatten)]
pub requirement: SecretRequirement,
#[serde(flatten)]
pub share: SecretSharePolicy,
}
#[derive(Debug, Clone, Default, Serialize)]
pub struct AgenticWorkerSecretsPolicy {
pub requirements: Vec<SecretPolicyEntry>,
}
pub fn secrets_policy_sidecar_bytes(requirements: &[SecretRequirement]) -> Result<Option<Vec<u8>>> {
if requirements.is_empty() {
return Ok(None);
}
let policy = AgenticWorkerSecretsPolicy {
requirements: requirements
.iter()
.map(|req| SecretPolicyEntry {
requirement: req.clone(),
share: SecretSharePolicy::ByoRequired,
})
.collect(),
};
let bytes = serde_json::to_vec(&policy).context("serialize secrets-policy.json")?;
Ok(Some(bytes))
}
pub struct DescribeMeta {
pub id: String,
pub name: String,
pub version: String,
pub summary: String,
pub manifest_sha256: String,
}
pub fn agentic_worker_describe(meta: &DescribeMeta) -> Value {
json!({
"apiVersion": "greentic.ai/v2",
"kind": "AgenticWorker",
"compat": {
"min_designer_version": ">=1.2.0",
"min_runner_version": "^0.12.0",
"contract_version": "1.2.0"
},
"metadata": {
"id": meta.id,
"name": meta.name,
"version": meta.version,
"summary": meta.summary,
"author": { "name": "Greentic" },
"license": "MIT"
},
"engine": { "greenticDesigner": ">=1.2.0", "extRuntime": "^1.2.0" },
"capabilities": { "offered": [], "required": [] },
"runtime": {
"memoryLimitMB": 32,
"permissions": { "network": [], "secrets": [], "callExtensionKinds": [] },
"components": {
"worker": {
"gtpack": {
"file": "worker.wasm",
"sha256": "0000000000000000000000000000000000000000000000000000000000000000",
"pack_id": meta.id,
"component_version": meta.version
},
"sha256": "0000000000000000000000000000000000000000000000000000000000000000",
"world": format!("greentic:{}/extension@{}", meta.id, meta.version)
}
}
},
"contributions": {},
"manifestSha256": meta.manifest_sha256
})
}