tandem-server 0.6.0

HTTP server for Tandem engine APIs
struct CoderMemoryAuthorityJobContextBase<'a> {
    tenant_context: &'a tandem_types::TenantContext,
    capability: &'a tandem_memory::MemoryCapabilityToken,
    record: &'a CoderRunRecord,
    candidate_id: &'a str,
    partition: &'a tandem_memory::MemoryPartition,
    artifact_refs: &'a [String],
    approval_id: Option<&'a str>,
}

fn coder_memory_authority_job_context(
    base: &CoderMemoryAuthorityJobContextBase<'_>,
    operation: tandem_memory::MemoryAuthorityOperation,
    source_memory_ids: Vec<String>,
) -> tandem_memory::MemoryAuthorityJobContext {
    tandem_memory::MemoryAuthorityJobContext {
        org_id: base.partition.org_id.clone(),
        workspace_id: base.partition.workspace_id.clone(),
        deployment_id: base.tenant_context.deployment_id.clone(),
        project_id: base.partition.project_id.clone(),
        actor_id: base.capability.subject.clone(),
        run_id: base.record.linked_context_run_id.clone(),
        node_id: base
            .record
            .worker_run_id
            .clone()
            .or_else(|| base.record.worker_session_id.clone()),
        task_id: Some(base.candidate_id.to_string()),
        purpose: "promote approved coder memory candidate".to_string(),
        source_binding_id: Some(format!("repo:{}", base.record.repo_binding.repo_slug)),
        data_class: Some(tandem_types::DataClass::SourceCode),
        classification: tandem_memory::MemoryClassification::Internal,
        operation,
        source_memory_ids,
        artifact_refs: base.artifact_refs.to_vec(),
        policy_decision_id: base.approval_id.map(ToString::to_string),
        grant_decision_id: base.approval_id.map(ToString::to_string),
    }
}