{
description = "Monarchic AI protocol types and schemas";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
};
outputs = { self, nixpkgs }:
let
systems = [ "x86_64-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin" ];
forAllSystems = f: nixpkgs.lib.genAttrs systems (system: f system);
in
{
packages = forAllSystems (system:
let
pkgs = nixpkgs.legacyPackages.${system};
in
{
default = self.packages.${system}.rust-lib;
rust-lib = pkgs.rustPlatform.buildRustPackage {
pname = "monarchic-agent-protocol";
version = "0.1.0";
src = ./.;
cargoLock = {
lockFile = ./Cargo.lock;
};
installPhase = ''
runHook preInstall
mkdir -p $out/lib
cp target/*/release/deps/*.rlib $out/lib/
cp target/*/release/deps/*.rmeta $out/lib/ || true
runHook postInstall
'';
};
crate-lib = pkgs.rustPlatform.buildRustPackage {
pname = "monarchic-agent-protocol";
version = "0.1.0";
src = pkgs.fetchCrate {
pname = "monarchic-agent-protocol";
version = "0.1.0";
sha256 = "08i0yi881h5i1jmn8dhmwqqzwc187124dv2jlvf1lm93bskfjg7h";
};
cargoLock = {
lockFile = ./Cargo.lock;
};
installPhase = ''
runHook preInstall
mkdir -p $out/lib
cp target/*/release/deps/*.rlib $out/lib/
cp target/*/release/deps/*.rmeta $out/lib/ || true
runHook postInstall
'';
};
python-lib = pkgs.python3Packages.buildPythonPackage {
pname = "monarchic-agent-protocol";
version = "0.1.0";
format = "pyproject";
src = ./.;
nativeBuildInputs = [
pkgs.protobuf
pkgs.python3Packages.setuptools
pkgs.python3Packages.wheel
];
propagatedBuildInputs = [ pkgs.python3Packages.protobuf ];
preUnpack = ''
export PROTO_DIR="${./schemas/v1}"
'';
preBuild = ''
protoc -I "$PROTO_DIR" \
--python_out=src/python/monarchic_agent_protocol \
"$PROTO_DIR/monarchic_agent_protocol.proto"
'';
};
pypi-lib = pkgs.python3Packages.buildPythonPackage {
pname = "monarchic-agent-protocol";
version = "0.1.0";
format = "pyproject";
src = pkgs.fetchPypi {
pname = "monarchic_agent_protocol";
version = "0.1.0";
sha256 = "sha256-4VjrXQX5hw5Q9mF4UJOTewK5OZuMNvKJCyqVC5rbtkE=";
};
nativeBuildInputs = [
pkgs.python3Packages.setuptools
pkgs.python3Packages.wheel
];
propagatedBuildInputs = [ pkgs.python3Packages.protobuf ];
doCheck = false;
};
ts-lib = pkgs.buildNpmPackage {
pname = "monarchic-agent-protocol-ts";
version = "0.1.0";
src = ./.;
npmDepsHash = "sha256-1Rpiw6/TKbto9qaSbbhgs/D6h/3ZzQoM5KM1uE/X/sY=";
npmPackFlags = [ "--ignore-scripts" ];
forceEmptyCache = true;
dontNpmBuild = true;
dontNpmInstall = true;
installPhase = ''
runHook preInstall
mkdir -p $out/lib/node_modules/@monarchic-ai/monarchic-agent-protocol
cp package.json $out/lib/node_modules/@monarchic-ai/monarchic-agent-protocol/package.json
cp -r src/ts $out/lib/node_modules/@monarchic-ai/monarchic-agent-protocol/src
runHook postInstall
'';
};
npm-lib = pkgs.buildNpmPackage {
pname = "monarchic-agent-protocol-npm";
version = "0.1.0";
src = pkgs.fetchurl {
url = "https://registry.npmjs.org/@monarchic-ai/monarchic-agent-protocol/-/monarchic-agent-protocol-0.1.0.tgz";
sha256 = "sha256-EqAz9EuVz0KAAvuU9BmWwLG2TGtljSjvbt02N8z0QaM=";
};
npmDepsHash = "sha256-1Rpiw6/TKbto9qaSbbhgs/D6h/3ZzQoM5KM1uE/X/sY=";
npmPackFlags = [ "--ignore-scripts" ];
forceEmptyCache = true;
dontNpmBuild = true;
dontNpmInstall = true;
postPatch =
let
npmPackageLock = pkgs.writeText "npm-package-lock.json" ''
{
"name": "@monarchic-ai/monarchic-agent-protocol",
"version": "0.1.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@monarchic-ai/monarchic-agent-protocol",
"version": "0.1.0"
}
}
}
'';
in ''
if [ ! -f package-lock.json ]; then
cp ${npmPackageLock} package-lock.json
fi
'';
installPhase = ''
runHook preInstall
mkdir -p $out/lib/node_modules/@monarchic-ai/monarchic-agent-protocol
tar -xzf $src -C $out/lib/node_modules/@monarchic-ai/monarchic-agent-protocol --strip-components=1
runHook postInstall
'';
};
});
checks = forAllSystems (system:
let
pkgs = import nixpkgs { inherit system; };
in
{
default = self.packages.${system}.default;
crate-import = pkgs.rustPlatform.buildRustPackage
(let
crateImportLock = ''
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
[[package]]
name = "crate-import"
version = "0.1.0"
dependencies = [
"monarchic-agent-protocol",
]
[[package]]
name = "itoa"
version = "1.0.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2"
[[package]]
name = "memchr"
version = "2.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273"
[[package]]
name = "monarchic-agent-protocol"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f6214e49fbdba4a449ef30e7e238e116a04dde4d85c9730b306f253c7e38da5d"
dependencies = [
"serde",
"serde_json",
]
[[package]]
name = "proc-macro2"
version = "1.0.106"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
dependencies = [
"unicode-ident",
]
[[package]]
name = "quote"
version = "1.0.44"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4"
dependencies = [
"proc-macro2",
]
[[package]]
name = "serde"
version = "1.0.228"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
dependencies = [
"serde_core",
"serde_derive",
]
[[package]]
name = "serde_core"
version = "1.0.228"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
[[package]]
name = "serde_derive"
version = "1.0.228"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "serde_json"
version = "1.0.149"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86"
dependencies = [
"itoa",
"memchr",
"serde_core",
"zmij",
]
[[package]]
name = "syn"
version = "2.0.114"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a"
dependencies = [
"proc-macro2",
"quote",
"unicode-ident",
]
[[package]]
name = "unicode-ident"
version = "1.0.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5"
[[package]]
name = "zmij"
version = "1.0.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3ff05f8caa9038894637571ae6b9e29466c1f4f829d26c9b28f869a29cbe3445"
'';
in {
pname = "crate-import";
version = "0.1.0";
src =
let
crateImportCargoToml = pkgs.writeText "crate-import-Cargo.toml" ''
[package]
name = "crate-import"
version = "0.1.0"
edition = "2021"
[dependencies]
monarchic-agent-protocol = { path = "${pkgs.fetchCrate {
pname = "monarchic-agent-protocol";
version = "0.1.0";
sha256 = "08i0yi881h5i1jmn8dhmwqqzwc187124dv2jlvf1lm93bskfjg7h";
}}" }
'';
crateImportMainRs = pkgs.writeText "crate-import-main.rs" ''
use monarchic_agent_protocol::{AgentRole, Task, PROTOCOL_VERSION};
fn main() {
let task = Task {
version: PROTOCOL_VERSION.to_string(),
task_id: "task-123".to_string(),
role: AgentRole::Dev,
goal: "hello".to_string(),
inputs: None,
constraints: None,
gates_required: None,
run_context: None,
extensions: Default::default(),
};
println!("{}", task.task_id);
}
'';
crateImportCargoLock = pkgs.writeText "crate-import-Cargo.lock" crateImportLock;
in
pkgs.runCommand "crate-import-src" {} ''
set -euo pipefail
mkdir -p $out/src
cp ${crateImportCargoToml} $out/Cargo.toml
cp ${crateImportCargoLock} $out/Cargo.lock
cp ${crateImportMainRs} $out/src/main.rs
'';
cargoLock = {
lockFile = pkgs.writeText "crate-import-Cargo.lock" crateImportLock;
};
cargoHash = "";
doCheck = true;
checkPhase = ''
runHook preCheck
./target/*/release/crate-import >/dev/null
runHook postCheck
'';
});
schema-validation = pkgs.runCommand "schema-validation" {
nativeBuildInputs = [ pkgs.python3 pkgs.python3Packages.jsonschema ];
} ''
set -euo pipefail
python <<'PY'
import json
import os
from jsonschema import Draft202012Validator
schema_dir = "${./schemas/v1}"
schemas = []
for name in os.listdir(schema_dir):
if name.endswith(".json"):
with open(os.path.join(schema_dir, name), "r", encoding="utf-8") as handle:
schemas.append(json.load(handle))
for schema in schemas:
Draft202012Validator.check_schema(schema)
PY
touch $out
'';
proto-validation = pkgs.runCommand "proto-validation" {
nativeBuildInputs = [
pkgs.protobuf
];
} ''
set -euo pipefail
bash ${./scripts/test-proto.sh} ${./schemas/v1/monarchic_agent_protocol.proto}
touch $out
'';
pypi-import = pkgs.stdenv.mkDerivation {
pname = "pypi-import";
version = "0.1.0";
nativeBuildInputs = [
(pkgs.python3.withPackages (ps: [ self.packages.${system}.pypi-lib ]))
];
src = pkgs.writeTextDir "pypi-import-check.py" ''
import monarchic_agent_protocol
from monarchic_agent_protocol import monarchic_agent_protocol_pb2 as pb
task = pb.Task(version="v1", task_id="t1", role=pb.AgentRole.DEV, goal="hello")
assert task.version == "v1"
'';
installPhase = ''
runHook preInstall
mkdir -p $out/bin
cat > $out/bin/pypi-import-check <<'PY'
#!/usr/bin/env python
import monarchic_agent_protocol
from monarchic_agent_protocol import monarchic_agent_protocol_pb2 as pb
task = pb.Task(version="v1", task_id="t1", role=pb.AgentRole.DEV, goal="hello")
assert task.version == "v1"
PY
chmod +x $out/bin/pypi-import-check
runHook postInstall
'';
checkPhase = ''
runHook preCheck
$out/bin/pypi-import-check
runHook postCheck
'';
};
npm-import = pkgs.stdenv.mkDerivation {
pname = "npm-import";
version = "0.1.0";
nativeBuildInputs = [
pkgs.nodejs
pkgs.nodePackages.typescript
];
src = pkgs.writeTextDir "npm-import-check.ts" ''
import { Task } from "@monarchic-ai/monarchic-agent-protocol";
const task: Task = {
version: "v1",
task_id: "task-123",
role: "dev",
goal: "hello",
};
void task;
'';
installPhase = ''
runHook preInstall
mkdir -p $out
runHook postInstall
'';
checkPhase = ''
runHook preCheck
mkdir -p node_modules/@monarchic-ai
cp -r ${self.packages.${system}.npm-lib}/lib/node_modules/@monarchic-ai/monarchic-agent-protocol node_modules/@monarchic-ai/monarchic-agent-protocol
cat > tsconfig.json <<'JSON'
{
"compilerOptions": {
"target": "ES2020",
"module": "ESNext",
"moduleResolution": "Node",
"strict": true,
"noEmit": true,
"skipLibCheck": true
}
}
JSON
cat > index.ts <<'TS'
import { Task } from "@monarchic-ai/monarchic-agent-protocol";
const task: Task = {
version: "v1",
task_id: "task-123",
role: "dev",
goal: "hello",
};
void task;
TS
tsc --noEmit index.ts
runHook postCheck
'';
};
});
devShells = forAllSystems (system:
let
pkgs = import nixpkgs { inherit system; };
in
{
default = pkgs.mkShell {
packages = [
pkgs.cargo
pkgs.rustc
pkgs.rustfmt
pkgs.protobuf
pkgs.nodejs
pkgs.jq
pkgs.python3
pkgs.python3Packages.jsonschema
];
};
});
};
}