okami.mom/albedo
git clone https://git.nkp.pet/okami.mom/albedo
5bdc0ee
main
1"""Shared editable daemon and model-driven cells for kernel E2E scenarios.""" 2 3import json 4from pathlib import Path 5import shutil 6import tempfile 7 8import harness 9from harness import Albedo ,Provider ,latest_user 10 11MARKER = '\nMARKER = "new bundle"\n' 12 13 14def editable_daemon (root ): 15"""A copy of the test daemon whose python bundle is ours to edit: every 16package links back to the snapshot except albedo's priv/python.""" 17assert harness ._executable is not None ,"the runner snapshots the daemon first" 18source = Path (harness ._executable ).parent 19out = Path (tempfile .mkdtemp (prefix = "daemon-" ,dir = root )) 20for package in source .iterdir (): 21if package .is_dir ()and package .name != "albedo" : 22 (out / package .name ).symlink_to (package ) 23albedo = out / "albedo" 24 (albedo / "priv" ).mkdir (parents = True ) 25 (albedo / "ebin" ).symlink_to (source / "albedo" / "ebin" ) 26priv = (source / "albedo" / "priv" ).resolve () 27for entry in priv .iterdir (): 28if entry .name == "python" : 29shutil .copytree ( 30entry , 31albedo / "priv" / "python" , 32ignore = shutil .ignore_patterns ("__pycache__" ), 33 ) 34else : 35 (albedo / "priv" / entry .name ).symlink_to (entry ) 36launcher = out / "albedo-daemon" 37launcher .write_text ( 38"#!/bin/sh\n" 39f"exec erl -pa { out } /*/ebin -eval 'albedo@@main:run(albedo)' -noshell -extra\n" 40 ) 41launcher .chmod (0o755 ) 42return launcher ,albedo / "priv" / "python" 43 44 45class ModelCells : 46"""Run queued Python cells through the fixture's provider and session.""" 47 48cells :list [str ] 49app :Albedo 50provider :Provider 51session :str 52 53def cell (self ,code ): 54"""Run one cell through a model turn; its result and the turn's prompt.""" 55self .cells .append (code ) 56self .app .prompt (self .session ,"run it" ).close () 57self .app .idle (self .session ) 58results = [ 59json .loads (part ["value" ]) 60for entry in self .app .history (self .session )["items" ] 61if entry ["kind" ]== "tool_result" and entry ["tool" ]["name" ]== "python" 62for part in entry ["content" ] 63if part ["kind" ]== "json" and part ["field" ]== "result" 64 ] 65request = next ( 66r ["request" ] 67for r in reversed (self .provider .requests ) 68if any (i .get ("role" )== "user" for i in r ["request" ]["input" ]) 69 ) 70prompt = latest_user (request ) 71return results [- 1 ],prompt