[package] name = "albert" version = "0.3.0" edition = "2021" license = "LicenseRef-BSL-1.1" description = "Albert — the assembly: an Octo cogitator with kaeru memory and a scheduler connector. Talk to it; it remembers and reminds." [dependencies] # Octo — shared runtime, SQL stores and authenticated human approvals. # Keep every crate on the same immutable repository revision. # NOTE: linking the mail crate pulls a second rustls provider (ring); main() MUST call # ensure_crypto_provider(). octo-core = { git = "https://github.com/LamantinAI/octo", rev = "1dbd557111028cab149a194e9fab3d55c305e007" } octo-approval = { git = "https://github.com/LamantinAI/octo", rev = "1dbd557111028cab149a194e9fab3d55c305e007" } octo-connector-sql = { git = "https://github.com/LamantinAI/octo", rev = "1dbd557111028cab149a194e9fab3d55c305e007" } octo-rig = { git = "https://github.com/LamantinAI/octo", rev = "1dbd557111028cab149a194e9fab3d55c305e007" } # octo-openai-auth — the ChatGPT-subscription credential component (auth.json store + # refresh + the shared, refresh-serialised SubscriptionAuth handle). Moved out of Albert # so the voice connectors (synth + transcribe) and other assemblies share one token owner. octo-openai-auth = { git = "https://github.com/LamantinAI/octo", rev = "1dbd557111028cab149a194e9fab3d55c305e007" } octo-history = { git = "https://github.com/LamantinAI/octo", rev = "1dbd557111028cab149a194e9fab3d55c305e007", features = ["sqlite"] } octo-connector-telegram = { git = "https://github.com/LamantinAI/octo", rev = "1dbd557111028cab149a194e9fab3d55c305e007" } octo-connector-scheduler = { git = "https://github.com/LamantinAI/octo", rev = "1dbd557111028cab149a194e9fab3d55c305e007" } octo-connector-caldav = { git = "https://github.com/LamantinAI/octo", rev = "1dbd557111028cab149a194e9fab3d55c305e007" } # octo-code — file/code tools (read/write/edit/list/glob/grep) as rig tools, jailed # to $OCTO_CODE_WORKSPACE. Ported from llm-coding-tools-rig (Apache-2.0) to rig 0.35. octo-code = { git = "https://github.com/LamantinAI/octo", rev = "1dbd557111028cab149a194e9fab3d55c305e007" } # octo-connector-storage — durable object store (put/get/list/delete + promote/ # checkout); env-as-tools organ, backend swappable (local dir now, S3 later). octo-connector-storage = { git = "https://github.com/LamantinAI/octo", rev = "1dbd557111028cab149a194e9fab3d55c305e007" } # octo-connector-forkd — sandboxed script runner (v0) for executable skills: # forkd.run a script jailed to the workspace, clean env, dropped privileges, timeout. octo-connector-forkd = { git = "https://github.com/LamantinAI/octo", rev = "1dbd557111028cab149a194e9fab3d55c305e007" } # octo-connector-mail — IMAP read + SMTP send mailbox organ (env-as-tools: mail.cmd.*). # Wired in but OFF by default: the factory is registered, but no config/connectors/mail # manifest is shipped (only mail.toml.example), so nothing is instantiated until you add # one + the creds. Its rustls provider (ring) forces the ensure_crypto_provider() call. octo-connector-mail = { git = "https://github.com/LamantinAI/octo", rev = "1dbd557111028cab149a194e9fab3d55c305e007" } # octo-connector-search — web search organ (env-as-tools: search.web { query, limit? }). # Its DuckDuckGo backend fetches through the SYSTEM libcurl, because DDG's anti-bot # answers reqwest with a 202 challenge (and drops a vendored libcurl's handshake), while # the system libcurl gets a full page — measured, see the crate docs. Consequences for # this binary: needs `libcurl4-openssl-dev` to BUILD and links `libcurl.so.4` at RUN time # (present wherever `curl` is). If a build predates the dev headers, curl-sys silently # vendored its own copy — `cargo clean -p curl-sys` and rebuild. # Backend is swappable — Yandex Search API slots in behind the same trait later. octo-connector-search = { git = "https://github.com/LamantinAI/octo", rev = "1dbd557111028cab149a194e9fab3d55c305e007" } # octo-connector-transcribe — voice-in as an env-as-tools organ: transcribe.run { path } -> # { text } via the ChatGPT-subscription dictation endpoint. Takes the shared SubscriptionAuth # (constructed in main.rs), so it shares the LLM path's one token owner. On while its manifest # (config/connectors/transcribe) is present and a subscription token exists. octo-connector-transcribe = { git = "https://github.com/LamantinAI/octo", rev = "1dbd557111028cab149a194e9fab3d55c305e007" } # octo-connector-speak — voice-out as an env-as-tools organ: speak.run { text, voice? } -> # { path } via a native WebRTC call to ChatGPT Voice (str0m, sans-IO). Writes an Ogg/Opus # voice note into the workspace; shares the same SubscriptionAuth as transcribe. On while its # manifest (config/connectors/speak) is present and a subscription token exists. octo-connector-speak = { git = "https://github.com/LamantinAI/octo", rev = "1dbd557111028cab149a194e9fab3d55c305e007" } # octo-connector-imagegen — image synthesis as an env-as-tools organ: imagegen.run { prompt, … } # -> { path } via the subscription Images endpoint (gpt-image-2), one call, no codex CLI. Shares # the same SubscriptionAuth. On while its manifest (config/connectors/imagegen) is present. octo-connector-imagegen = { git = "https://github.com/LamantinAI/octo", rev = "1dbd557111028cab149a194e9fab3d55c305e007" } # octo-connector-http — the GENERIC configurable connector: a whole REST API becomes an # env-as-tools organ from a manifest alone (type = "http"), no code. Ported colleague # work (PR #3) wires Jira this way — config/connectors/jira/jira.toml. octo-connector-http = { git = "https://github.com/LamantinAI/octo", rev = "1dbd557111028cab149a194e9fab3d55c305e007" } # octo-connector-browser — stealth web-fetch organ (browser.fetch): drives a real headless # Chrome via zendriver for JS-heavy / anti-bot pages. Pulls the fetcher (manages a stable # Chrome-for-Testing) + a CDP tree — heavy build. The host needs Chrome's shared libs at # runtime (libnss3, libgbm1, libasound2, …); the deploy provisions them. octo-connector-browser = { git = "https://github.com/LamantinAI/octo", rev = "1dbd557111028cab149a194e9fab3d55c305e007" } # Kaeru — latest stable release, including recall and temporal write fixes. kaeru-core = { git = "https://github.com/LamantinAI/kaeru", tag = "v0.7.5" } kaeru-rig = { git = "https://github.com/LamantinAI/kaeru", tag = "v0.7.5" } # Dedicated memory transport; external memory does not enter the connector catalog. rmcp = { version = "=1.8.0", default-features = false, features = ["client", "transport-child-process", "transport-streamable-http-client-reqwest"] } mcp-http = { package = "reqwest", version = "0.13", default-features = false, features = ["rustls"] } tokio = { version = "1.40", features = ["full"] } # futures: drain rig's SSE stream (StreamExt::next) in the Codex subscription model. futures = "0.3" # bytes: rewrite the Codex request/response body in the custom rig HttpClientExt # (codex_http). The reqwest client itself comes via rig's `http_client::ReqwestClient`. bytes = "1" # Subscription login (openai_login): the OAuth PKCE flow and the code exchange (refresh # lives in octo-openai-auth). reqwest reuses rig's already-built TLS (default-features off, # just add `json`); sha2 for the PKCE S256 challenge; rand for the verifier/state; # url to build the authorize URL safely. reqwest = { version = "0.12", default-features = false, features = ["json"] } sha2 = "0.10" rand = "0.8" url = "2" async-trait = "0.1" thiserror = "2" serde = { version = "1", features = ["derive"] } serde_json = "1" # Internal identity/routing metadata shares octo-history's SQLite pool. Its # migrations use a separate registry; application SQL stores remain isolated. sqlx = { version = "=0.8.6", default-features = false, features = ["runtime-tokio", "sqlite", "migrate", "sqlite-preupdate-hook"] } # base64: the PKCE verifier/state (URL-safe, no-pad) in openai_login, and inline images # for vision models in the cogitator. Already in the tree transitively. base64 = "0.22" chrono = "0.4" chrono-tz = "0.10" tracing = "0.1" tracing-subscriber = { version = "0.3", features = ["env-filter"] } dotenvy = "0.15" toml = "0.8" rig-core = "0.35" tiktoken-rs = "0.12.0" [dev-dependencies] tempfile = "3" rmcp = { version = "=1.8.0", default-features = false, features = ["server", "transport-streamable-http-server"] } axum = "0.8" # Optimized release profile for the deployed binary (smaller + faster; the target # is a small VM). opt-level 3 is the release default; the wins are LTO + a single # codegen unit + strip. [profile.release] opt-level = 3 lto = "thin" codegen-units = 1 strip = true # cozo (pulled transitively via kaeru-core) needs this patch on rustc 1.85+ / # rayon 1.10+ — the same pin kaeru's own workspace carries. Patches are # per-workspace-root, so Albert (its own workspace) must repeat it. [patch.crates-io] graph_builder = { git = "https://github.com/lawless-m/graph", rev = "790ef623533fa39574ddd11308e3abc3993c0994" }