SIwithin

  1. Isolatie van bestanden: De run raakt alleen de mappen aan die expliciet zijn toegewezen. Toegang tot uw home-folder wordt geweigerd voor zowel lezen als schrijven; alleen de specifieke run-mappen zijn toegestaan.
  2. Budgetbeheer: De run kan niet meer uitgeven dan het toegewezen budget. Er is een budget per run, een maximum over alle runs heen en een timer per run. Voor de Claude-adapter wordt een loopback-proxy gebruikt als enige deur naar de API: de run bezit een tijdelijk token per run en niet uw persoonlijke sleutel. Elk verzoek wordt gemeten en geweigerd zodra het budget is overschreden. Indien een CLI niet halverwege een run kan worden gestopt, weigert de tool de start tenzij u expliciet aangeeft dit te accepteren (zie "Het grootboek" en "De Codex-adapter").
  3. Audit trail: Elke run laat precies één regel achter waarin staat wat de kosten waren en of de taak is voltooid.

Compatibiliteit en Platform

SIwithin werkt met de command-line tools van Claude Code en OpenAI Codex.

Let op: SIwithin is een onafhankelijk project en is niet gemaakt, onderschreven of gesponsord door Anthropic of OpenAI. Claude, Claude Code, OpenAI en Codex zijn eigendomsnamen van hun respectievelijke eigenaren. Gebruikers blijven gebonden aan de servicevoorwaarden en gebruiksbeperkingen van de betreffende leveranciers.

Platformondersteuning: SIwithin draait uitsluitend op macOS. Op Linux en Windows weigert de tool op te starten om te voorkomen dat er zonder "fence" (beveiliging) wordt uitgevoerd.

Installatie

SIwithin bestaat uit één enkel bestand, vereist Python 3.10 of nieuwer en maakt uitsluitend gebruik van de standaardbibliotheek. Het maakt geen eigen netwerkoproepen en verzendt geen telemetrie. De proxy die voor een run wordt gestart, luistert op een loopback-poort en communiceert alleen met de door u geconfigureerde API-host.

git clone <this repository> && cd siwithin
python3 siwithin.py --version
# Optioneel: voeg toe aan uw PATH
install -m 755 siwithin.py ~/.local/bin/siwithin

Daarnaast moet de gewenste CLI geïnstalleerd zijn en in uw PATH staan, inclusief een bijbehorende API-sleutel (zie "Authenticatie").

Opmerking: De smoke test (python3 tests/smoke.py) is geslaagd op Python 3.9.6. Python 3.10 is de ondersteunde ondergrens en de code vermijdt nieuwere syntax, maar is niet uitgebreid getest op 3.10 of hoger.

Snelstart

Claude Code

mkdir -p ~/.config/siwinter && echo 20 > ~/.config/siwithin/cap       # Totaalbudget voor alle runs: $20
export ANTHROPIC_API_KEY=...                                     # De tool leest dit één keer buiten de fence
python3 siwithin.py --dir ~/work/proj --model sonnet --dry-run < brief.md      # Alleen printen, niets uitvoeren
python3 siwithin.py --dir ~/work/proj --model sonnet --budget 2 \
--done "ALL TESTS PASS" --out notes.md < brief.md
  • --dir: De map van de run. De CLI werkt hierin en mag hierin schrijven (--readonly maakt het alleen-lezen).
  • --read <folder>: Voegt mappen toe die de run mag lezen.
  • --model: Accepteert een ID of alias (haiku, sonnet, opus).

Codex

mkdir -p ~/.config/siwithin && echo 20 > ~/.config/siwithin/cap
export CODEX_API_KEY=...
python3 siwithin.py --adapter codex --model gpt-5.3-codex --soft-budget --network open --dir ~/work/proj --dry-run < brief.md
python3 siwithin.py --adapter codex --model gpt-5.3-codex --soft-budget --network open --budget 2 --dir ~/work/proj < brief.md

Voor deze adapter zijn twee vlaggen vereist: --model (omdat de CLI tokens rapporteert maar geen kosten) en --soft-budget (omdat de CLI verbruik pas rapporteert aan het einde van een beurt). Deze adapter is gebouwd op basis van documentatie en is niet getest tegen een live CLI.

Authenticatie (Auth)

SIwithin parseert, bewaart, print of logt nooit een API-sleutel. De manier waarop de sleutel de API bereikt, hangt af van het auth-veld van de adapter.

Claude adapter (auth = "proxy")

Dit is de standaardinstelling vanaf versie 0.3.0.

  1. Buiten de fence: De runner leest de sleutel één keer uit ANTHROPICAPIKEY in de omgeving, of via een key_command in config.toml (bijv. een keychain-opvraag).
  2. Proxy server: Er wordt een kleine HTTP-server gestart op een loopback-poort.
  3. Token-systeem: De omgeving van de run krijgt ANTHROPICAPIKEY=siwithin-<32 tekens>, een uniek token dat nergens anders werkt, en ANTHROPICBASEURL=http://127.0.0.1:<port>.
  4. Filtering: De proxy accepteert alleen het run-token. Verzoeken naar niet-toegestane paden (standaard alleen /v1/messages en /v1/messages/count_tokens) worden geweigerd met een 403-fout.
  5. Budgetcontrole: De proxy meet de kosten. Zodra het budget is bereikt, geeft de proxy een 402-fout, wat de run onmiddellijk beëindigt.
  6. Logging: Elk verzoek wordt gelogd in proxy.jsonl in de run-map (pad, model, status, verbruik, kosten). Inhoud, sleutels of tokens worden nooit gelogd.

auth = "env"

Hierbij wordt de sleutelvariabele direct gekopieerd naar de run. Dit is de enige modus voor de Codex-adapter. Omdat er geen proxy is, kan de "netwerkmuur" niet worden opgericht; de run vereist daarom --network open. Gebruik in dit geval een sleutel die uitsluitend voor SIwithin is gemaakt met een spend-limiet in de console van de provider.

De "Fence" (Sandbox)

SIwithin genereert voor elke run een macOS sandbox-exec profiel.

Toegangsbeheer

  • Geweigerd: De gehele home-folder is standaard geblokkeerd voor lezen en schrijven. Ook schrijfacties in /private/tmp, /tmp, /opt, /usr/local, /Applications, /Library en /Volumes zijn verboden.
  • Toegestaan:
  • De run-mappen (lezen; de eerste map is schrijfbare tenzij --readonly is ingesteld).
  • Het binary van de CLI, caches en logs onder ~/Library (lezen/schrijven).
  • Keychain-bestanden (alleen lezen).
  • Python user packages, shell rc-bestanden en git config.
  • De eigen configuratiemap van de run.
  • Beperkingen in de CLI-config: Alleen state-paden (transcripts, sessies, etc.) zijn schrijfbare. Instellingen, geheugen en plugins blijven ongewijzigd, zodat een run geen instructies kan achterlaten voor de volgende.

Uitvoerbare programma's

De volgende programma's mogen niet worden gestart (deny_exec): open, screencapture, osascript, say, afplay, launchctl, crontab, at en batch.

De Netwerkmuur (The Wall)

Met de proxy-adapter weigert het profiel elke socket en DNS-opvraag, behalve de loopback-poort van de key-proxy (network = "proxy").

Er zijn drie modi voor het netwerk:

  • proxy: Alleen verkeer naar de proxy is toegestaan.
  • report: Het netwerk blijft open, maar elke geopende socket wordt geteld en gerapporteerd in summary.json.
  • open: Het netwerk is volledig open (standaard in versie 0.3.0).

Procesbeheer

De runner houdt alle afstammelingen van de CLI bij. Bij elke stop (budget, timer, interrupt of exit) doorzoekt de runner de procestabel naar processen met de markering van de run en doodt deze systematisch tot er niets meer over is.

Het Grootboek (The Ledger)

Elke run voegt één regel toe aan ledger.md en print een samenvatting in de terminal.

Voorbeeld regel: 2026-10-13 14:02 | docs-pass | /Users/you/work/proj | claude sonnet - | 12 turns | 6.4 min | cli $0.4123 | true $0.4123 | in 310k out 18k | runs/2026-10-13-1402-docs-pass | done | receipt <hash>

  • cli: De kosten volgens de CLI zelf.
  • true: De kosten berekend op basis van gepubliceerde tarieven in config.toml of via de proxy.

Budgettering

  • Cap: Een totaalmaximum voor alle runs samen (cap bestand). Als het totaal plus het huidige budget de cap overschrijdt, wordt de run geweigerd.
  • Budget: Het bedrag voor één specifieke run (--budget).
  • Voor CLI's met een budgetvlag wordt dit omgerekend via een factor.
  • Voor CLI's zonder budgetvlag meet SIwithin het verbruik tijdens het streamen en doodt de run bij overschrijding.
  • Bij CLI's die verbruik pas na een beurt rapporteren, is --soft-budget vereist.

De Kwitantie (The Receipt)

Om de integriteit te waarborgen, schrijft de runner na elke run een receipt.json.

Kenmerken:

  • Bevat SHA256-hashes van alle gegenereerde bestanden (brief.md, command.txt, fence.sb, events.jsonl, stderr.txt, result.md, summary.json en eventueel proxy.jsonl).
  • Hashing-keten: De kwitantie is gekoppeld aan de vorige kwitantie en aan de staat van het grootboek (ledger_before).
  • Verificatie: Met python3 siwithin.py --verify kan worden gecontroleerd of er bestanden of regels in het grootboek zijn gewijzigd.

Reconciliatie (Reconcile)

De --reconcile functie vergelijkt de uitgaven in het grootboek met de daadwerkelijke rekening van de provider om onverklaarbare kosten (bijv. door een tweede gebruiker van de sleutel) te detecteren.

  • Methoden: Via een Admin API-sleutel of via een CSV-export uit de console van de provider.
  • Verdicten:
  • unaccounted: Uitgaven bij de provider zonder bijbehorende run.
  • over: Een run was actief, maar de provider rapporteert meer kosten dan de run logde.
  • ok: De bedragen komen overeen binnen de ingestelde tolerantie.

Het "Brief" Contract

De briefing wordt via stdin aangeboden.

  • --done "<text>": SIwithin rapporteert of result.md deze tekst bevat.
  • --absent "<text>": Controleert of een bepaalde tekst (die verwijderd moest worden) níét aanwezig is.
  • --out <file>: Het resultaat wordt hiernaar geschreven, maar alleen als het contract is voldaan (de run is "done").

De Codex Adapter

Deze adapter is gebouwd op basis van publieke documentatie van OpenAI.

Belangrijke details:

  • Gebruikt codex exec en CODEXAPIKEY.
  • Vereist --soft-budget omdat verbruik pas bij turn.completed wordt gemeld.
  • Aannames: Het wordt aangenomen dat inputtokens inclusief cachedinputtokens is en dat outputtokens ook reasoning-tokens bevat.
  • De sandbox-instellingen van de CLI (--sandbox) worden gecoördineerd met de SIwithin-fence.

Beperkingen (Wat het niet doet)

  • OS: Geen ondersteuning voor Linux en Windows.
  • Ledger: Geen gecentraliseerd team-grootboek; het is een lokaal bestand.
  • Adapters: Beperkt tot twee ingebouwde CLI-formaten (Claude en Codex).
  • Proxy: De proxy is momenteel alleen beschikbaar voor de eerste adapter (Claude).
  • Configuratie: Geen aparte configuratiemap per run; runs kunnen transcripts van eerdere runs lezen.
  • Budget: Geen real-time budgethandhaving midden in een beurt voor CLI's die verbruik laat rapporteren.

Configuratie

Kopieer config.example.toml naar ~/.config/siwithin/config.toml.

  • [auth]: Bevat key_command, upstream en paths.
  • [fence]: Bepaalt de netwerkmodus (proxy, report of open).
  • [reconcile]: Bevat de admin-sleutel commando's en toleranties.
  • [prices]: Definieert de kosten per model en cache-factoren.

Gebruik --home <folder> om alle SIwithin-paden naar een andere locatie te verplaatsen.

Status en Versiegeschiedenis

Versie 0.5.0 (19 oktober 2026)

  • Introductie van --reconcile.
  • Uitgebreide smoke tests (291 checks).

Versie 0.4.0 (18 oktober 2026)

  • Introductie van de netwerkmuur (Network Wall).
  • Toevoeging van STOLEN-KEYS.md naar aanleiding van de OpenCode Console breach.

Versie 0.3.0 (15 oktober 2026)

  • Introductie van de key-proxy en de "kill walk" (het opsporen en beëindigen van alle subprocessen).
  • Implementatie van --verify --expect en budgetbeperkingen.

Tests

Smoke Tests (python3 tests/smoke.py) Testen dry runs, fence-profielen, budget-arithmetiek, configuratie-lezer, proxy-checks en de kill-walk tegen fake CLI's.

Red Briefs (tests/red/) Testen specifiek de fence door taken uit te voeren die bewust proberen muren te doorbreken:

  • Schrijven naar de home-directory of /tmp.
  • Starten van verboden programma's.
  • Overschrijden van kleine budgetten.
  • Zoeken naar API-sleutels in de omgeving.
  • Het starten van een tweede API-client via de proxy.
  • Het openen van sockets buiten de proxy-poort.