The Rust SDK already existed at Sulkta-Coop/clawdforge clients/rust/ — async,
reqwest-based, bearer-auth, exposes Client::run() + Session for multi-turn.
Vendoring it into vendor/clawdforge so skald is self-contained: no
git-submodule + no needing the clawdforge repo cloned next to skald.
Trade-off accepted: updates require manual re-copy until both sides
stabilize and we publish to a private cargo registry.
What landed:
- vendor/clawdforge/ — full SDK source from Sulkta-Coop/clawdforge HEAD.
Pinned in skald-core/Cargo.toml as a path dep.
- skald-core/src/forge.rs — three-pass orchestration shell. Forge wraps
clawdforge::Client; generate() / cleanup() / audit() each build a
RunRequest with the right system prompt + model alias (always opus),
call client.run(), return a PassOutput.
Prompt templates are TODO stubs (SYSTEM_GEN_TODO etc) — filling in the
actual prose-craft prompts is its own deep session.
- skald-core/src/config.rs — ForgeConfig { base_url, app_token, model }.
Resolved by the binary from env (CLAWDFORGE_URL + CLAWDFORGE_TOKEN);
lib stays env-agnostic.
- skald-core::AuditFinding + AuditResponse — parse shape for what the
third-Opus canon audit returns, ready to map onto audit_findings rows.
- docs/tts-pipeline.md — full plan for v0.2 narration + post-TTS audit
chain. Whisper-large-v3 STT does text-to-text verification on every
render; an optional Gemini Flash audio pass catches subjective issues
(prosody, tone) Whisper can't see. Reroll loop on crit findings.
What's still stubbed:
- Prompt templates in forge.rs (gen / cleanup / audit) — placeholders
that describe the role but don't constrain output shape yet.
- context.rs (assemble the LLM context blob from DB rows) — entire module
TBD.
- No CLI subcommand yet for invoking forge — that comes after context.rs.
Naming note: in Rust 2024 'gen' is a reserved keyword (for generators),
so the method is Forge::generate(), not Forge::gen().
33 lines
1.1 KiB
Rust
33 lines
1.1 KiB
Rust
//! Configuration for skald-core consumers.
|
|
//!
|
|
//! Configs are passed in explicitly by the calling binary, not loaded
|
|
//! from disk here — the lib stays env-agnostic. (skald-the-binary
|
|
//! reads env vars + maps them into these structs.)
|
|
|
|
use serde::{Deserialize, Serialize};
|
|
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
pub struct ForgeConfig {
|
|
/// Base URL of the clawdforge HTTP service. Defaults to
|
|
/// `http://clawdforge.sulkta.lan:8800` in production; override
|
|
/// for tests via env.
|
|
pub base_url: String,
|
|
|
|
/// App-level bearer token. Resolved by the binary from
|
|
/// `CLAWDFORGE_TOKEN`; should never be logged or `Display`ed.
|
|
pub app_token: String,
|
|
|
|
/// Model alias passed to clawdforge → `claude -p --model`. Skald
|
|
/// is opinionated: always opus max effort. Default reflects that.
|
|
pub model: String,
|
|
}
|
|
|
|
impl Default for ForgeConfig {
|
|
fn default() -> Self {
|
|
Self {
|
|
base_url: "http://clawdforge.sulkta.lan:8800".into(),
|
|
app_token: String::new(),
|
|
model: "opus".into(),
|
|
}
|
|
}
|
|
}
|