Changelog, dev startup, README, AgentHub 0.4.0, model catalog, and landing site (#7)

Branch-length batch covering tooling, the model layer, the Web App and the public
surfaces. Highlights:

- Changelog: a per-release `changelog/<version>/` tree, grouped by the surface each
  change touches, with a root CHANGELOG.md holding one line per release.
- Dev startup: `scripts/dev-prebuild.mjs` serializes the skills+core prebuild behind a
  lock and keeps `pnpm install` current; `pnpm dev` runs server+web together.
- AgentHub 0.3.3 -> 0.4.0: OmniMessage complete payloads carry one opaque `fidelity`
  object in place of item-level `signature`/`phase`, threaded verbatim through Trace,
  replay and resume; malformed classification adapted to the new error types.
- Model layer: a model is always referenced by an explicit `(provider, model_id)` pair.
  The provider is never inferred, guessed or defaulted -- both the catalog inference and
  the unique-match config resolution are gone, and CLI, SDK, server routes and
  run_subagent all require the complete pair. Catalog gains the Qwen Token Plan, Qwen
  Pay-As-You-Go and Fireworks AI gateways, plus an expanded OpenRouter group.
- Web App: catalog preset sync and per-group speed test on the Models page, positional
  slash commands, a markdown renderer, skill-library update reminders, and a vertically
  centred draft page whose upward menus size themselves to the room available.
- Public surfaces: restructured READMEs, the penguin.ooo landing site and blog, refreshed
  benchmark results for both suites, and the demo videos playing on the landing page.

Includes the fixes from a full review of the branch: 23 confirmed findings, among them a
provider-inference bug that could send one vendor's API key to another vendor's endpoint,
and an Escape handler that destroyed the composer's contents unrecoverably.

Verified on the branch head: pnpm test (1127 passing, 7 packages), pnpm typecheck and
pnpm format:check clean, Playwright e2e 14/14.
This commit is contained in:
Yaowei Zheng authored and GitHub committed 2026-07-21 17:43:31 +08:00
1 parent abf0a2f248
commit d4faee3a1e
214 files changed
+9406 -1688

No files matched your search

+76 -20
View File
@@ -8,6 +8,14 @@ import type { Strings } from "./strings";
export const en: Strings = {
siteName: "PenguinHarness",
announcement: {
label: "Announcements",
prev: "Previous announcement",
next: "Next announcement",
models: "Kimi K3 and Qwen 3.8 Max are now available in PenguinHarness",
fireworks: "Claim $50 in Fireworks API credits with the AMD Developer Program",
},
nav: {
highlights: "Highlights",
quickstart: "Quick start",
@@ -87,11 +95,33 @@ export const en: Strings = {
],
},
compare: {
eyebrow: "vs. LangChain",
title: "The gap between 1× and 100×",
subtitle:
"With LangChain, you build agents by hand — at 1× speed. With PenguinHarness, agents build agents — at 100×.",
langchain: {
name: "LangChain",
speed: "1×",
mode: "Agents built by hand",
note: "Chains, tools and prompts written line by line — every app starts from zero.",
},
penguin: {
name: "PenguinHarness",
speed: "100×",
mode: "Agents built by agents",
note: "One sentence in — an Agent delivers scaffold, code and run instructions end to end.",
},
},
selfImprove: {
eyebrow: "The self-improvement loop",
title: "Multi-agent collaboration makes evolution automatic",
subtitle:
"The Optimizer orchestrates multiple Evaluators to score the Target Agent in parallel, uses the scores and run traces to find where points were lost, and upgrades the Agent from version N to N+1 — with a snapshot before every round.",
videoLabel: "Self-improvement demo video",
videoCaption:
"The self-improvement loop end to end: run the benchmark, find the lost points, ship the next version.",
nodeOptimizer: "Optimizer",
nodeEvaluator: "Evaluator × N",
nodeTarget: "Target Agent",
@@ -122,7 +152,7 @@ export const en: Strings = {
tabCli: "CLI",
webStep2: "Open the web interface",
webStep2Desc:
"penguin web starts the local service and opens your browser; sign in with the built-in admin account admin / admin123 (change the password right after).",
"penguin web starts the local service and opens your browser; sign in with the built-in admin account admin / penguin-2026 (change the password right after).",
webCmd: "penguin web # opens http://127.0.0.1:7364",
webStep3: "Configure a model in the UI and start chatting",
webStep3Desc:
@@ -136,11 +166,12 @@ export const en: Strings = {
tabDeepseek: "DeepSeek",
tabOpenrouter: "OpenRouter",
deepseekCmd: `penguin config model add \\
--provider deepseek \\
--model-id deepseek-v4-pro \\
--api-key sk-your-deepseek-key \\
--set-default`,
deepseekNote:
"The provider is inferred as deepseek automatically; omit --api-key to fall back to the DEEPSEEK_API_KEY environment variable.",
"A model is always referenced by the (provider, model_id) pair, so --provider is required; omit --api-key to fall back to the DEEPSEEK_API_KEY environment variable.",
openrouterCmd: `penguin config model add \\
--provider openrouter \\
--model-id deepseek/deepseek-v4-pro \\
@@ -155,19 +186,29 @@ export const en: Strings = {
--message "Analyze data.csv and summarize quarterly sales"`,
},
showcase: {
eyebrow: "Use cases",
title: "Daily tasks + zero-code AI development",
cases: {
eyebrow: "Cases",
title: "From one sentence to a running app",
subtitle:
"Hand recurring chores to an Agent that runs around the clock — and go from a one-sentence request to a runnable Agent app without writing a line of code.",
tagChat: "Zero-code AI development",
captionChat:
"Development by conversation: the Agent builds an Agent app from scratch, tools really execute",
tagTraces: "Daily tasks",
captionTraces:
"Autonomous runs, fully replayable: every request and tool call with usage and timing",
tagBenchmark: "Continuous evolution",
captionBenchmark: "Built-in Benchmark scoreboards — scores climb with every round",
"Hand the requirement to an Agent and get a runnable result end to end — more cases are on the way.",
tabs: [
{
label: "RAG app",
prompt:
"Collect the docs from https://github.com/ericbuess/claude-code-docs and build a RAG app that answers Claude Code questions as a configuration expert, citing its sources.",
caption:
"The generated RAG app: a Claude Code docs expert answering with cited, clickable sources and example questions",
cost: "And generating this entire RAG app burned just $0.02 (¥0.2) of tokens — on DeepSeek V4 Pro.",
},
{
label: "2D penguin sled game",
prompt:
"Build a cute Antarctic penguin sledding game: Space to jump the rocks, with speed and difficulty ramping up over time.",
caption:
"The generated mini game: an Antarctic penguin sleds and jumps rocks, with live scoring and rising difficulty",
cost: "",
},
],
},
contract: {
@@ -224,9 +265,9 @@ export const en: Strings = {
benchmark: {
eyebrow: "Benchmark",
title: "Same model, equal or better quality, lower cost",
title: "Each with its flagship model — comparable quality, 1-2 orders of magnitude cheaper",
subtitle:
"All runs use the same DeepSeek V4 Pro model — head-to-head against Claude Code and OpenAI Codex on two suites.",
"Every product runs the model it is normally paired with, head-to-head against Claude Code and OpenAI Codex on two suites: comparable accuracy, tens of times the difference in spend.",
higherBetter: "higher is better",
lowerBetter: "lower is better",
dimScore: "Accuracy",
@@ -234,12 +275,14 @@ export const en: Strings = {
dimCost: "Cost",
dataTitle: "Complex data analysis",
dataDesc:
"Ties Claude Code on accuracy and clearly beats OpenAI Codex — with fewer Tokens at lower cost.",
"Best accuracy of the three (66.67%, against 53.33% for both rivals), at 1/35 of OpenAI Codex's cost and 1/70 of Claude Code's.",
dataFootnote:
"15 complex data-analysis tasks · averaged over 1 run · cost estimated at official pricing.",
"15 complex data-analysis tasks · single run · Tokens and cost are suite totals · estimated at official pricing.",
codeTitle: "Coding tasks",
codeDesc: "Highest accuracy of the three at the lowest per-run cost.",
codeFootnote: "40 coding tasks · averaged over 2 runs · cost estimated at official pricing.",
codeDesc:
"Ties OpenAI Codex on accuracy (71.25%) and trails Claude Code (86.25%) — at 1/58 and 1/39 of their cost.",
codeFootnote:
"40 coding tasks × 2 runs (accuracy over all 80 outcomes) · Tokens and cost are suite totals · estimated at official pricing.",
colFramework: "Framework",
colModel: "Model",
colAccuracy: "Accuracy (%)",
@@ -251,6 +294,7 @@ export const en: Strings = {
eyebrow: "Features",
title: "The full capability set, one desktop-grade UI",
subtitle: "One-to-one with the web interface's menu — installed means ready.",
more: "and more…",
items: [
{
title: "Multi-session chat",
@@ -315,6 +359,18 @@ export const en: Strings = {
],
},
community: {
eyebrow: "Community",
title: "Join the community and build with us",
subtitle: "Discuss, ask, contribute — your first Issue is the best way to start.",
items: {
discord: { name: "Discord", desc: "Chat with us and other developers in real time." },
x: { name: "X (Twitter)", desc: "Follow the latest product and team updates." },
wechat: { name: "WeChat group", desc: "Chinese community discussions and support." },
github: { name: "GitHub", desc: "Stars, Issues, and PRs all welcome." },
},
},
cta: {
title: "Complex AI development, made ever simpler",
subtitle: