Implementerer synops-mail --send --to <epost> --subject <emne> CLI-verktøy
for utgående epost via msmtp. Alt er ferdig og testet strukturelt:
- tools/synops-mail: Rust CLI som bygger RFC 5322-melding og sender via msmtp
- /srv/synops/config/msmtp/msmtprc: msmtp-konfig mot Hetzner-relay (587/STARTTLS)
- Installert til /usr/local/bin/synops-mail
Blokkert av: mangler SMTP-relay brukernavn/passord. Hetzner-relay
(mail.your-server.de) krever autentisering, port 25 er blokkert utgående.
Trenger credentials i msmtprc for å fullføre.
Når en bruker limer inn en URL i chatten, gjenkjenner synops-respond
URL-en automatisk, kaller synops-clip --write for å hente, parse og
oppsummere artikkelen, og inkluderer resultatet i prompten slik at
Claude kan presentere oppsummeringen naturlig.
Ved betalingsmur: Claude informerer brukeren og ber om innlimt innhold.
Maks 3 URL-er per melding, 60s timeout per klipp.
Endringer:
- synops-respond: URL-deteksjon (regex), synops-clip-kall, prompt-kontekst
- maskinrommet/agent.rs: videresend env-variabler for synops-clip
- maskinrommet-env.sh: SYNOPS_CLIP_SCRIPTS env-variabel
- docs/infra/claude_agent.md: dokumentert URL-klipping-flyten
Legger til --write-modus som oppretter:
- content-node med artikkelinnhold og metadata.source_url
- tagged-edge "clipped" (self-tag)
- AI-oppsummering via LiteLLM (integrert i node-innhold)
- mentions-edges til gjenkjente entiteter i kunnskapsgrafen
AI-analysen er robust: feiler den, opprettes noden uten oppsummering.
Gjenbruker eksisterende topic-noder der navnene matcher (case-insensitive).
Nye entiteter opprettes som topic-noder med entity_type i metadata.
Ressursforbruk logges til resource_usage_log.
Nye CLI-flagg: --write, --created-by <uuid>
Payload-JSON utvides med write + created_by for jobbkø-integrasjon.
Nytt verktøy som henter og parser webartikler til ren tekst + metadata.
Bruker Mozilla Readability (via Node.js) for artikkelekstraksjon, med
Playwright som fallback for JS-rendrede sider.
Arkitektur:
- Rust CLI (clap, reqwest) håndterer HTTP-henting, paywall-deteksjon, JSON-output
- Node.js-hjelpeskript (readability.mjs) bruker @mozilla/readability + jsdom
- Playwright-script (playwright.mjs) for headless browser-fallback
- Støtter --payload-json for maskinrommet/jobbkø-integrasjon
Paywall-deteksjon basert på:
- Kort innhold (<200 tegn)
- Norske/engelske paywall-fraser i innholdet
- CSS-klasser/HTML-attributter (piano, schibsted, amedia, etc.)
- Schema.org isAccessibleForFree meta-tagg
Output: JSON med title, author, date, content, url, paywall, excerpt, source
Nytt CLI-verktøy `synops-ai` som leser cli_tool-noder fra PG, bygger
en systemprompt med tilgjengelige verktøy og script-grammatikk, og
bruker LLM til å foreslå orkestreringsscript fra fritekst-beskrivelse.
Tre moduser:
- Synkron: --description "..." → LLM genererer script → JSON output
- System prompt: --generate-system-prompt → skriver auto-generert prompt
- Eventually: --eventually → lagrer som work_item for Claude Code
Maskinrommet: nytt endepunkt POST /intentions/ai_suggest_script som
kaller synops-ai, validerer resultatet med script_compiler, og returnerer
script + kompileringsresultat til frontend.
Frontend: AI-assistent-knapp i OrchestrationTrait med fritekst-input,
generer-knapp, og feilvisning. Generert script settes direkte i editoren.
Migration: synops-ai seeded som cli_tool-node med norske verb-alias.
Fase 11 (produksjon) validert — LiveKit, pruning og podcast-RSS:
- rss.rs + synops-rss: Les filstørrelse fra både 'size_bytes' (intentions)
og 'size' (publishing) med COALESCE — forhindrer manglende enclosure-
størrelse i podcast-feeds avhengig av opplastingsmetode.
- pruning.rs + synops-prune: Samme COALESCE-fix for konsistent size-tracking.
- rss.rs + synops-rss: Fiks truncate_description til å bruke char-indeksering
istedenfor byte-indeksering — forhindrer panic på norsk tekst (å, ø, æ).
LiveKit kjører i Docker (healthy), token-generering via join_communication,
pruning-loop aktiv, RSS-endepunkt returnerer korrekt 404 for ukjent slug.
Alle 61 maskinrommet-tester bestått.
Ny crate `tools/synops-common` samler duplisert kode som var
spredt over 13 CLI-verktøy:
- db::connect() — PG-pool fra DATABASE_URL (erstatter 10+ identiske blokker)
- cas::path() — CAS-stioppslag med to-nivå hash-katalog
- cas::root() — CAS_ROOT env med default
- cas::hash_bytes() / hash_file() / store() — SHA-256 hashing og lagring
- cas::mime_to_extension() — MIME → filendelse
- logging::init() — tracing til stderr med env-filter
- types::{NodeRow, EdgeRow, NodeSummary} — delte FromRow-structs
Alle verktøy (unntatt synops-tasks som ikke bruker DB) er refaktorert
til å bruke synops-common. Alle kompilerer og tester passerer.
Nytt CLI-verktøy for å hente og vise en node med alle tilkoblede edges.
Støtter rekursiv graf-traversering (--depth) og to output-formater
(markdown og JSON). Brukes av Claude og maskinrommet for å inspisere
graf-tilstand.
Features:
- Hent node med alle edges (inn og ut)
- Berik edges med peer-tittel og node_kind for lesbarhet
- --depth 0: bare noden, --depth 1: + edges (default), --depth 2+: traverser
- --format md (default) eller json
- Kompakt metadata-visning, forkortet innhold
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Nytt verktøy som samler feature-status fra fire kilder:
1. Spec-sammendrag fra docs/features/ og docs/concepts/
2. Relaterte oppgaver fra tasks.md (fuzzy-matching på nøkkel)
3. Nylige git-commits (fil-endringer + commit-meldinger)
4. Ubesvart feedback fra PG (spec-noder med discusses-edge)
DATABASE_URL er valgfri — feedback hoppes over uten tilkobling.
Prøver også /tmp/maskinrommet.env som fallback.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Parser tasks.md og viser formatert oppgavestatus med filtrering
på fase (--phase N) og status (--status todo|done|blocked|inprogress|question).
Viser sammendrag med antall per status og fremdriftsbar.
Rent filbasert verktøy — ingen database nødvendig. Finner tasks.md
automatisk fra arbeidsdir eller absolutt sti.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Fulltekstsøk i noder via PostgreSQL tsvector/tsquery med norsk
tekstkonfigurasjon. Bruker eksisterende GIN-indeks fra migrasjon 011.
Støtter --kind-filter og --limit. Output: markdown med relevans-score
og utdrag (ts_headline med «»-markering).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Nytt verktøy som samler kontekst for en kommunikasjonsnode i
markdown-format — deltakere, spesifikasjon (discusses-edge),
meldingshistorikk og relaterte noder. Brukes av synops-respond
og andre verktøy som trenger samtalekontekst.
Input: --communication-id <uuid> [--max-messages N]
Output: markdown til stdout
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Erstatter maskinrommet/src/pruning.rs med selvstendig CLI-verktøy
som følger unix-filosofien. Tre-fase pruning:
- Fase 1 (disk ≥85%): Slett regenererbart innhold (TTS, thumbnails)
- Fase 2 (alltid): TTL-basert pruning per modalitet (lyd 30d, bilde 30d, video 14d)
- Fase 3 (disk ≥95%): Kritisk — alt uten publishing-edge slettes
Dry-run er default (krever --write for faktisk sletting).
JSON-output til stdout, logging til stderr.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Bryter ut prosesseringslogikken fra maskinrommet/src/agent.rs til
et selvstendig CLI-verktøy: synops-respond. Følger unix-filosofien
der maskinrommet orkestrerer og CLI-verktøy gjør jobben.
Ansvarsdeling:
- maskinrommet beholder: kill switch, rate limiting, loop-prevensjon,
STDB-skriving (sanntidsvisning for frontend)
- synops-respond håndterer: kontekst-henting fra PG, prompt-bygging,
claude CLI-kall med retry, PG-skriving (node, edges, logging)
agent.rs er nå en tynn dispatcher (~140 linjer, ned fra ~305) som
validerer sikkerhet og spawner synops-respond, likt mønsteret fra
summarize.rs sin delegering til synops-summarize.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Erstatter maskinrommet/src/ai_edges.rs med et selvstendig CLI-verktøy
som følger unix-filosofien: maskinrommet orkestrerer, verktøy gjør jobben.
Verktøyet analyserer en nodes innhold via LiteLLM og foreslår
topics og mentions (entiteter) som edges. I lesemodus (default)
returneres kun forslag som JSON med confidence-score. Med --write
opprettes topic-noder og mentions-edges i PG.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Ekstraherer AI-oppsummeringslogikk fra maskinrommet til standalone
CLI-verktøy, i tråd med unix_filosofi.md-prinsippet om at maskinrommet
orkestrerer og CLI-verktøy gjør jobben.
synops-summarize:
- Henter meldinger og deltakere fra kommunikasjonsnode i PG
- Sender samtalelogg til LiteLLM for oppsummering
- Med --write: oppretter sammendrag-node, belongs_to/summary-edges,
logger AI-ressursforbruk
- Uten --write: dry-run som skriver JSON til stdout
maskinrommet/src/summarize.rs er nå en tynn dispatcher som spawner
synops-summarize med --write, tilsvarende transcribe.rs-mønsteret.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Nytt CLI-verktøy som erstatter maskinrommet/src/tts.rs.
Kaller ElevenLabs API, lagrer generert lyd i CAS, og returnerer
CAS-hash som JSON. Med --write opprettes media-node og has_media-edge
i PostgreSQL, inkludert ressurslogging.
Følger samme mønster som synops-transcribe: clap-args, tracing til
stderr, JSON til stdout, atomisk CAS-lagring via temp+rename.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Frittstående RSS/Atom-feed generator som erstatter maskinrommet/src/rss.rs.
Følger unix-filosofien: ett verktøy per oppgave, XML til stdout.
Støtter:
- Oppslag via --collection-id (UUID) eller --slug
- RSS 2.0 og Atom 1.0 (konfigurerbart via trait-metadata eller --format)
- Podcast-enclosures via has_media-edges
- --max-items for å begrense antall elementer
Verifisert mot prod-database med Sidelinja-samlingen.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Nytt CLI-verktøy som rendrer artikler og forsider til HTML via
Tera-templates og lagrer resultatet i CAS. Erstatter rendering-logikken
i maskinrommet/src/publishing.rs som standalone verktøy.
Støtter to render-typer:
- article: Rendrer enkeltartikkel med SEO-metadata, presentasjonselementer,
TipTap→HTML-konvertering, og tema-basert CSS.
- index: Rendrer forside med hero/featured/stream-artikler.
Fire innebygde temaer: avis, magasin, blogg, tidsskrift.
Templates er kopiert fra maskinrommet og innebygd via include_str!().
TipTap-modulen er duplisert inntil synops-common (21.16) samler felles kode.
Følger eksisterende CLI-mønster: --write gater DB-oppdateringer,
JSON til stdout, stderr for logging.
16 enhetstester dekker CSS-variabler, SEO, kategorisering, rendering
og TipTap-konvertering. Verifisert mot produksjons-DB.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Bryter ut Whisper-transkribering fra maskinrommet til selvstendig
CLI-verktøy i tools/synops-transcribe/, i tråd med unix-filosofien.
Verktøyet:
- Leser lydfil fra CAS, sender til faster-whisper API (SRT-format)
- Parser SRT til segmenter, skriver JSON til stdout
- Med --write: skriver segmenter til PG, oppdaterer node metadata,
logger ressursforbruk
- Støtter --cas-hash, --model, --initial-prompt, --language, --mime,
--node-id, --requested-by
Maskinrommet sin transcribe.rs er nå en tynn dispatcher som spawner
synops-transcribe som subprosess med riktige env-variabler.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>