From 8c2ded434c21a9d5f6def12b86a77dc8d3a7069d Mon Sep 17 00:00:00 2001 From: ares <285551516+New1Direction@users.noreply.github.com> Date: Mon, 8 Jun 2026 03:22:58 -0700 Subject: [PATCH 1/2] feat(skills): add `summarize` builtin skill Native fetch for text/web URLs; delegates to the steipete/summarize CLI for media; provenance recorded to the ledger. Auto-loaded with the other builtins. --- src/skills_builtin/summarize/SKILL.md | 50 +++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 src/skills_builtin/summarize/SKILL.md diff --git a/src/skills_builtin/summarize/SKILL.md b/src/skills_builtin/summarize/SKILL.md new file mode 100644 index 0000000..64f9d3f --- /dev/null +++ b/src/skills_builtin/summarize/SKILL.md @@ -0,0 +1,50 @@ +--- +name: summarize +description: Use this skill to summarize ANY content at a chosen length — web pages, articles, YouTube/podcasts, PDFs, audio/video, RSS, or piped text — and record the summary with a verifiable link to its source. Triggers: "summarize this", "tl;dr", a URL/file/video/podcast to condense, "what's in this ", "give me the gist". +origin: adapted from steipete/summarize (MIT) — media pipeline delegated to that CLI; provenance + compression are korgex-native +--- + +# Summarize — content extraction + summarization, with provenance + +Summarize anything into a length the user asked for, then make the summary **traceable to its +exact source** (the korgex value-add over a plain summarizer). Pick the lightest path that +handles the input — don't reach for heavy media tooling when a fetch will do. + +## When to Use +- The user shares a URL, file, video, podcast, or PDF and wants the gist. +- Condensing a long transcript / article / thread before acting on it. +- "tl;dr", "summarize", "what's in this". + +## Routing — lightest path first +1. **Plain text / stdin / a file already in context** → summarize directly with the model. No tools. +2. **Web page / article URL** → korgex `WebFetch`; if the page is JS-heavy or blocked, fall back to the **browser** tool (`browser.py`) to render, then extract the main content and summarize. +3. **Media** — YouTube, podcasts, Spotify/Apple episodes, audio/video files, image/PDF needing OCR, RSS → **delegate to the `summarize` CLI** (steipete/summarize) if it's installed (`command -v summarize`). It owns yt-dlp / Whisper transcription / ffmpeg / tesseract — do **not** reimplement that. Run e.g. `summarize "" --length --format markdown`. If the CLI is absent, say so and ask for a transcript/text, or offer to summarize a text fallback. + +## Options (match `summarize`'s ergonomics) +- **length**: `short` · `medium` (default) · `long` · `xl` +- **format**: `markdown` (default) · `json` · `text` +- **language**: default = the source's language unless asked otherwise +- **smart default**: if the source is already shorter than the requested summary, **return it unchanged** (don't pad) unless the user forces a summary. + +## korgex value-add — what makes this more than running a summarizer +1. **Provenance as a verifiable event.** After summarizing, emit a ledger event recording + `{ source (URL or content hash), length, format, model, timestamp }`. Any summary is then + traceable to the exact source it came from — "this summary was produced from this input," + checkable later. This is the korg-native bit: a summary is a cognition event, not a throwaway. +2. **Never lose the source (context compression).** Seal the *full* extracted content once as a + content-ref; the summary is the compact in-context view; the agent can `Retrieve(ref)` the exact + bytes when a detail is needed. The summary saves tokens without discarding the original. +3. **Report cost + timing** of the run (extraction + LLM) so the user sees what it took. + +## Steps +1. **Classify** the input: text / web-url / media. +2. **Extract** via the lightest path above (model-only → WebFetch → browser → `summarize` CLI). +3. **Summarize** at the requested length + format (honor the smart default). +4. **Seal** the full source as a content-ref and **record** the `summary.created` ledger event. +5. **Return** the summary, plus the source ref so the user (or a later turn) can verify or expand it. + +## Notes +- Prefer the model directly for short text — invoking media tooling on a paragraph is waste. +- For paywalled/blocked pages, the browser tool or the CLI's Firecrawl fallback is the escalation. +- Keep summaries faithful: a summary preserves proportions of the source; it is not a fold or a + cherry-pick. If the user wants only the load-bearing point, that's a different ask (use logic-folding). From cd0515ff58dfcc3f1f1b0686d31b8b5a6b812531 Mon Sep 17 00:00:00 2001 From: ares <285551516+New1Direction@users.noreply.github.com> Date: Mon, 8 Jun 2026 03:22:59 -0700 Subject: [PATCH 2/2] chore(branding): add reproducible ASCII teaser recipe Terminal launch-teaser pipeline: chafa/tplay render -> vhs capture -> ffmpeg CRT pass (scanlines/bloom/barrel/vignette). banner.tape (chrome wordmark) + video.tape (clip -> ASCII) + crt.sh. Renders are gitignored (large / may include third-party footage). --- docs/branding/teaser/.gitignore | 7 +++++++ docs/branding/teaser/banner.tape | 26 +++++++++++++++++++++++++ docs/branding/teaser/crt.sh | 33 ++++++++++++++++++++++++++++++++ docs/branding/teaser/video.tape | 28 +++++++++++++++++++++++++++ 4 files changed, 94 insertions(+) create mode 100644 docs/branding/teaser/.gitignore create mode 100644 docs/branding/teaser/banner.tape create mode 100755 docs/branding/teaser/crt.sh create mode 100644 docs/branding/teaser/video.tape diff --git a/docs/branding/teaser/.gitignore b/docs/branding/teaser/.gitignore new file mode 100644 index 0000000..3d3ba48 --- /dev/null +++ b/docs/branding/teaser/.gitignore @@ -0,0 +1,7 @@ +# Render outputs are reproducible from the tapes + crt.sh, and the video +# flavor may contain third-party footage — keep the recipe, not the renders. +*.mp4 +*.gif +*.png +clip.* +raw*.mp4 diff --git a/docs/branding/teaser/banner.tape b/docs/branding/teaser/banner.tape new file mode 100644 index 0000000..f0097ff --- /dev/null +++ b/docs/branding/teaser/banner.tape @@ -0,0 +1,26 @@ +# Launch-teaser recording — renders the chrome banner as terminal ANSI art, +# captured to raw.mp4. crt.sh then adds the CRT pass and exports gif + mp4. +# +# brew install vhs chafa +# cd docs/branding/teaser && vhs banner.tape && bash crt.sh +# +# Font: "Departure Mono" (https://departuremono.com) for brand parity; falls +# back to a system mono if not installed. The banner is image-rendered (chafa), +# so the font only affects any typed text. + +Output raw.mp4 + +Set Shell "bash" +Set FontFamily "Menlo" +Set FontSize 20 +Set Width 1100 +Set Height 620 +Set Padding 26 +Set TypingSpeed 38ms +Set Theme '{ "name": "korgex-y2k", "background": "#060B16", "foreground": "#D6ECFF", "cursor": "#2DE2FF", "selection": "#16335C", "black": "#0A1120", "red": "#FF5566", "green": "#4DFFA6", "yellow": "#FFD23F", "blue": "#2D9BFF", "magenta": "#B48CFF", "cyan": "#2DE2FF", "white": "#D6ECFF", "brightBlack": "#3A4A63", "brightRed": "#FF7B88", "brightGreen": "#8EFFC4", "brightYellow": "#FFE27A", "brightBlue": "#6CC0FF", "brightMagenta": "#CFB0FF", "brightCyan": "#7DEFFF", "brightWhite": "#F2FAFF" }' + +Sleep 500ms +Type "chafa -c full -f symbols --size=88x24 ../../images/banner.jpg" +Sleep 300ms +Enter +Sleep 3400ms diff --git a/docs/branding/teaser/crt.sh b/docs/branding/teaser/crt.sh new file mode 100755 index 0000000..2835d12 --- /dev/null +++ b/docs/branding/teaser/crt.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env bash +# CRT post-process for the launch teaser. +# Input : raw.mp4 (produced by `vhs banner.tape`) +# Output: teaser-crt.mp4 (CRT-shaded, social/README mp4) +# teaser.gif (palette-optimized GIF for the README) +# +# The CRT look = scanlines (darken every other row) + bloom (screen-blend a +# blurred copy) + a gentle barrel bulge + vignette. All in ffmpeg, no GUI. +set -euo pipefail +cd "$(dirname "$0")" + +IN="${1:-raw.mp4}" +[ -f "$IN" ] || { echo "missing $IN — run: vhs banner.tape" >&2; exit 1; } + +echo "→ CRT pass …" +ffmpeg -y -loglevel error -i "$IN" -filter_complex " +[0:v]format=rgb24, +geq=r='r(X,Y)*(0.82+0.18*mod(Y,2))':g='g(X,Y)*(0.82+0.18*mod(Y,2))':b='b(X,Y)*(0.82+0.18*mod(Y,2))'[sl]; +[sl]split=2[base][bl]; +[bl]gblur=sigma=3.5[bloom]; +[base][bloom]blend=all_mode=screen:all_opacity=0.35[lit]; +[lit]lenscorrection=k1=-0.04:k2=-0.008:fc=black@1.0, +vignette=angle=PI/5[out] +" -map "[out]" -c:v libx264 -pix_fmt yuv420p -crf 18 -movflags +faststart teaser-crt.mp4 + +echo "→ GIF (palette-optimized) …" +ffmpeg -y -loglevel error -i teaser-crt.mp4 -filter_complex " +fps=15,scale=800:-1:flags=lanczos,split[s0][s1]; +[s0]palettegen=max_colors=128:stats_mode=diff[p]; +[s1][p]paletteuse=dither=bayer:bayer_scale=4" teaser.gif + +echo "done:" +ls -lh teaser-crt.mp4 teaser.gif diff --git a/docs/branding/teaser/video.tape b/docs/branding/teaser/video.tape new file mode 100644 index 0000000..82c5739 --- /dev/null +++ b/docs/branding/teaser/video.tape @@ -0,0 +1,28 @@ +# Video teaser — plays a local clip through tplay (video → ASCII), captured to +# raw-video.mp4. crt.sh then adds the CRT pass. +# +# yt-dlp --download-sections "*0:03-0:10.5" -f bv*[height<=720] --recode mp4 -o clip.mp4 +# vhs video.tape && bash crt.sh raw-video.mp4 + +Output raw-video.mp4 + +Set Shell "bash" +Set FontFamily "Menlo" +Set FontSize 14 +Set Width 1280 +Set Height 720 +Set Padding 0 +Set Theme '{ "name": "blk", "background": "#000000", "foreground": "#FFFFFF", "black": "#000000", "red": "#FF5555", "green": "#55FF55", "yellow": "#FFFF55", "blue": "#5555FF", "magenta": "#FF55FF", "cyan": "#55FFFF", "white": "#FFFFFF", "brightBlack": "#555555", "brightRed": "#FF7777", "brightGreen": "#77FF77", "brightYellow": "#FFFF77", "brightBlue": "#7777FF", "brightMagenta": "#FF77FF", "brightCyan": "#77FFFF", "brightWhite": "#FFFFFF" }' + +Hide +Type "export PATH=$HOME/.cargo/bin:/opt/homebrew/bin:$PATH" +Enter +Type "clear" +Enter +Show + +Sleep 400ms +Type "tplay clip.mp4 -f 24" +Sleep 200ms +Enter +Sleep 12000ms