Commit Graph
719 Commits
Author SHA1 Message Date
Ivanko1608 c41c5f3132 feat: stream turns through the claude CLI
Each turn runs claude -p with stream-json in and out and maps its events onto pi's assistant message stream. A process that stops on tool calls is kept alive and continued when pi sends the results back, instead of replaying the whole transcript. API credentials are removed from the CLI environment so turns always bill to the signed-in subscription.
2026-10-25 02:04:22 +04:00
Ivanko1608 6650f91eca feat: add MCP bridge exposing pi tools to the CLI
A localhost-only MCP HTTP server, guarded by a per-turn bearer token, lists pi's tools and holds each call until pi has run it and returned the result.
2026-10-25 02:04:22 +04:00
Ivanko1608 76b91dc1e5 fix: prefer claude.exe over claude.cmd on Windows
Node cannot spawn a .cmd file without a shell, so a claude.cmd found
earlier on PATH would hide a working claude.exe.
2026-10-25 01:06:50 +04:00
Ivanko1608 5c0425901c feat: replay pi transcript as CLI input 2026-10-24 20:35:20 +04:00
Ivanko1608 913b29efe5 feat: add subscription CLI provider catalog
opus, sonnet and haiku aliases, low..max thinking, zero cost, keyless
auth. Streaming is injected.
2026-10-24 20:24:57 +04:00
Ivanko1608 1df95fdfdd feat: locate CLI binary
Search PATH, then standard install dirs, since the packaged app often
starts with a minimal PATH.
2026-10-24 20:24:57 +04:00
Ivanko1608 8981456dfd chore: add MCP SDK and CLI stream fixtures
Pin @modelcontextprotocol/sdk 1.32.1 for the tool bridge. Fixtures are
sanitized `-p` stream-json recordings (text, tool, signed-out).
2026-10-24 20:24:57 +04:00
amosblomqvist 6cba9c8c5a release: prepare 0.3.4 v0.3.4 2026-10-23 20:29:02 +03:00
amosblomqvist cc657faa93 Merge native Pi identity and provider catalog upgrade 2026-10-23 17:25:10 +03:00
amosblomqvist 6685b3d09a fix: use native Pi identity and refresh provider catalogs 2026-10-23 17:25:10 +03:00
amosblomqvist b15db907ab Merge KaTeX security repair 2026-10-23 17:11:57 +03:00
amosblomqvist 93017d767e security: upgrade KaTeX to 0.18.2 across active renderers 2026-10-23 17:11:57 +03:00
amosblomqvist 388addff3e release: prepare 0.3.3 v0.3.3 2026-10-23 06:18:51 +03:00
amosblomqvist c36c1c6b4d ui: simplify import feedback and shorten waiting status 2026-10-23 06:14:33 +03:00
amosblomqvist a67366005a Merge notes import reliability repair 2026-10-23 04:43:56 +03:00
amosblomqvist 2d67376b76 fix: always run explicit notes imports and surface failures 2026-10-23 04:43:56 +03:00
amosblomqvist aef01c44a0 Merge provider credential repair 2026-10-23 04:26:25 +03:00
amosblomqvist 261a9b9927 fix: honor selected-provider credentials in visual and PDF agents 2026-10-23 04:26:25 +03:00
amosblomqvist 1c5024c8c2 release: prepare 0.3.2 v0.3.2 2026-10-21 00:41:53 +03:00
amosblomqvist 01e7b17fcd Merge persistent practice nudges for 0.3.2 2026-10-21 00:30:43 +03:00
amosblomqvist c4c15b8fd2 fix: keep practice problems active through failed attempts 2026-10-21 00:30:43 +03:00
amosblomqvist 7f95753cf2 fix: share question math repair with practice displays 2026-10-21 00:00:20 +03:00
amosblomqvist 0ebb88ec08 release: prepare 0.3.1 v0.3.1 2026-10-20 16:40:43 +03:00
amosblomqvist 94b63c6ba7 fix: own demo browser lifetime through cross-platform IPC 2026-10-20 15:56:19 +03:00
amosblomqvist 3d70e0da86 fix: announce demo browser only after CDP is ready 2026-10-20 15:15:28 +03:00
amosblomqvist b39d5cd6ab fix: include packaged demo runtime and verify browser payload 2026-10-20 14:51:40 +03:00
amosblomqvist 32febaaae7 ci: allow release verifier to read unpublished drafts v0.3.0 untagged-98e30a568dba8637f58e 2026-10-17 15:15:59 +03:00
amosblomqvist c32d7a89af build: fix macOS CI signing keychain password handling 2026-10-17 14:48:32 +03:00
amosblomqvist 6b29688c47 release: prepare 0.3.0 and README screenshots 2026-10-17 14:09:48 +03:00
amosblomqvist 3d1ad38e46 ui: unify practice composer actions and node picker copy 2026-10-17 01:06:28 +03:00
amosblomqvist 487a63eaa5 ui: polish first-run setup copy and dialog dismissal 2026-10-17 00:38:57 +03:00
amosblomqvist 15772f47c9 ci: update Actions to supported Node 24 runtimes 2026-10-16 22:51:42 +03:00
amosblomqvist a0a5018a42 chore: record bundled optional Tailwind WASM dependencies 2026-10-16 21:24:41 +03:00
amosblomqvist c0ad63a940 skill: add portable read-only learning-data readers 2026-10-16 21:24:27 +03:00
amosblomqvist b3c9f9e18b math: heal overescaped LaTeX commands in question displays 2026-10-16 21:24:14 +03:00
amosblomqvist 1a11de5cee license: document the free-forever promise 2026-10-16 21:24:06 +03:00
amosblomqvist 5da0d407ab release: use macOS 26 for Icon Composer packaging 2026-10-13 18:41:34 +03:00
amosblomqvist 91672160c2 release: add storefront artwork and draft completeness gate 2026-10-13 15:41:43 +03:00
amosblomqvist cf042b25e7 icons: per-platform icon set — real Liquid Glass on macOS, flat design on Windows/Linux
The hand-packed icns was pixel-clean (verified by unpacking and scanning
every size), but macOS 26 composites legacy .icns icons into the Liquid
Glass system at render time; stacked on Icon Composer's baked PNG-export
lighting, that clips the rim highlights into the near-corner specks and
abrupt highlight ends (owner report 2026-10-13). The fix is the real
layered icon: mac.icon now points at the Icon Composer document
(build/icon.icon, copied from ~/Documents/Affinity/lh-logo) and
electron-builder compiles it via actool into Assets.car — macOS 26+
renders the true Liquid Glass design (dark/tinted variants included).

actool's backwards-compat icns caps at 256px, so scripts/after-pack.cjs
swaps in the existing full-res build/icon.icns before signing: pre-Tahoe
macOS keeps today's quality, Tahoe gets the layered icon.

Windows/Linux get the owner's flat design (rounded squircle with baked
transparency): scripts/make-icons.mjs renders build/icon-flat.svg via
resvg into build/icon.ico (16→256 PNG entries) + build/icon.png (512),
and electron-builder.yml pins win.icon/linux.icon.

desktop:dist injects DEVELOPER_DIR (actool needs Xcode; the machine
selects CommandLineTools by default, CI's setup-xcode takes precedence
via the :- default). The release workflow's mac job selects Xcode 26+
explicitly. Verified locally: mac --dir build (Assets.car + checksummed
full-res fallback + CFBundleIconName/IconFile) and the win-unpacked exe
carries our ico bytes; NSIS/AppImage assembly is CI's (cross-build
tooling can't run on arm64 macOS). Runbook updated. 1610/1610.
2026-10-13 10:51:22 +03:00
amosblomqvist 5601a98335 dialogs: delete dialogs drop the serif display title for the abort-turn look
Titles become text-sm font-semibold in destructive red — JetBrains Mono
via the UI default, matching the abort-turn/dismiss-question dialogs the
owner named as the ideal look. Node and session names below the title
drop the sized-up text-lg for normal text-sm, still white mono, no
code-block chrome. Settings and Setup keep their serif titles by owner
ruling; abort-turn already renders this way. 1610/1610 both configs;
verified live on the running dev server.
2026-10-13 09:54:43 +03:00
amosblomqvist 2a8f65de6e graph: session deep links reliably jump to the source message
The mount-time jump never fired on real graph-link arrivals: the
transcript scroller's ref is attached by a later sibling, and the queued
rAF was cancelled outright whenever use-stick-to-bottom re-created its
context while the initial scroll settled — every link landed at the
bottom (owner report 2026-10-13).

Rewrite the mount path as a synchronous 64ms retry watcher that keeps
running past its first success (hydration/adoption can replace the
jumped-to node), with a ~20s watchdog for cold-compile SSR streams
(observed 6.8s). jump() now reads the stick-to-bottom context through a
ref so effect identities stay stable, and the unmount cleanup no longer
strips a live flash. Verified live on real data: full load, SPA link
navigation, and in-session hashchange all land the anchor 16px from the
scroller top with the 2s highlight.

Also gives the node card's session/file rows matching horizontal and
vertical padding (px-2 py-1.5).
2026-10-13 09:28:09 +03:00
amosblomqvist cdd8ac047e sessions: source-message deep links from the graph + session Find (Cmd/Ctrl+F) 2026-10-13 08:26:31 +03:00
amosblomqvist 664c1bfed2 extraction: message-granular proposition anchors; factory budget back to 4096 2026-10-13 08:26:31 +03:00
amosblomqvist d653ba0e91 math: render escaped dollars inside inline math
micromark-extension-math's inline closer is code-span logic — any
size-matched $ run closes, backslash-escaped dollars included — so
"$x = \$5$" closed at the escape, errored in KaTeX, and could cascade
into later text. KaTeX itself renders the escaped dollar fine, and its
own auto-render scanner skips escaped dollars, so the author's intent
is unambiguous.

Fix at the render seam (transformMathDelimiters): inside a balanced
inline span, an escaped dollar becomes the dollar-free
\text{\textdollar} before tokenization, with an escape-aware closer
(odd-backslash dollars never close; even-backslash row-break closers
keep closing). Display spans are untouched (a lone $ can't close $$ —
the escape already survives there), prose escaped dollars, code, and
unbalanced spans pass through, and spans without escaped dollars emit
byte-identical text — corpus-verified over 489 dollar-bearing fields
in 40 real sessions (35 changed, all escaped-dollar spans; the
economics session's dollar-amount math now renders).

The latex-testing session's Test-6 question renders 14 KaTeX spans
with zero errors (was 12 + 2 errors). 1578/1578 tests both configs;
typecheck, lint, build, and Electron-runtime smoke green.
2026-10-13 06:36:05 +03:00
amosblomqvist bf29a2070f math: dollar delimiters end-to-end (exact answers, escaping examples, context rendering)
- switch the math authoring/rendering contract from \(...\)/\[...\] to the
  standard $...$ inline / $$...$$ display: prompts (20-question-tools,
  40-formatting), singleDollarTextMath on the renderer, legacy reader kept,
  and escape-debris recovery extended to dollar spans (mirroring micromark
  delimiter-run rules)
- exact answer membership now precedes debris cleanup in
  coerceCorrectAnswer (calculus incident: an exact sentence-final-period
  label was stripped as model debris, then rejected); option keys are
  passed at the boundary/grading seams, the dock no longer pre-coerces
- a complete, phase-correct JSON-escaping example rides the probe/quiz
  tool descriptions (serialized from one canonical body; quiz leads with
  type+nodeId), plus the one-sentence JSON-escaping rule in 40-formatting
- ask option descriptions render markdown/LaTeX in the pending dock;
  settled cards keep the details line and option descriptions
  retroactively, read from the persisted call arguments (chat passes
  part.input to AnsweredCard)

1566/1566 tests on both navigator configs; typecheck, lint, production
build, standalone packaging, and Electron-runtime smoke all green.
2026-10-13 06:24:33 +03:00
amosblomqvist a395f37727 desktop: use native-height Windows and Linux controls 2026-10-12 09:46:42 +03:00
amosblomqvist 0540bf697c ci: isolate test setup and fix Windows PDF font paths 2026-10-11 10:41:30 +03:00
amosblomqvist e266c3c028 desktop: tri-platform window chrome, packaging and draft-release CI 2026-10-11 10:12:13 +03:00
amosblomqvist 8ebaf0da6e wave E stage 3: demos run in the app's own Chromium (browser-service helper)
Demos execute JS and need a browser; the app's own binary now provides
one: main.cjs boots a hidden window + CDP port under --browser-service
(before the single-instance lock - a helper is deliberately a second
instance of this binary), lifetime tied to the server's stdin (EOF =
quit, no orphans). headless.ts connects over CDP as PRIMARY (owner
ruling 2026-10-10), system Chrome stays the fallback, graceful refusal
when neither. Electron's CDP has no Target.createTarget, so the helper's
pre-created window is THE page, reused and reset per job behind a
serialized queue. PDFs and SVGs never reach a browser anymore (native
since stages 1-2); stale Chrome wording in model-facing tool copy made
engine-neutral. Live-proofed end-to-end from the dev tree (helper seen
by process watch, js-ran 42 probe, no orphan). Gates 1523/1523.
2026-10-11 07:03:45 +03:00
amosblomqvist e9cf841ce7 wave E stage 2: renderSvg goes native-first - resvg in-process
Visual-maker SVGs never execute script, so a browser added nothing but a
process. resvg rasterizes in-process now (white background and fitTo
width mirror the old Chrome-page semantics; svgViewport unchanged,
quirks included for parity). The old Chrome path stays verbatim as the
fallback for exotic-SVG parse failures - it was the only path before,
so nothing regresses.

The resvg binary (4MB per platform, one per build) rides the standalone
via the same tracing pattern. Gates 1519/1519; native path pinned
against real SVGs (intrinsic size, viewBox-only 900 default, opts
override, system-font text).
2026-10-11 06:52:32 +03:00