Commit Graph

96 Commits

Author SHA1 Message Date
Joel Hooks 1edd703bfc feat: processing indicator + comment lockout during feedback review
- Banner moved above article content with pulsing animation
- Review sheet disabled when feedback items are processing
- FAB dimmed and disabled during processing
- Submit button shows 'Processing feedback…' state
- 'Comments paused' note shown under form
2026-02-27 17:16:42 -08:00
Joel Hooks a5914ece57 feat: joelclaw webhook provider for Inngest event proxy
- /webhooks/joelclaw with HMAC-SHA256 signature verification
- Forwards events to self-hosted Inngest at localhost:8288
- Submit route signs requests with x-joelclaw-signature
- Removed duplicate /webhooks/inngest-event endpoint
- Added post:slug cacheTag for revalidation (FBP-4)
2026-02-27 16:45:11 -08:00
Joel Hooks 7338a5c815 feat(FBP-4): Cache invalidation after content-review edit 2026-02-27 16:36:37 -08:00
Joel Hooks 1f18980006 feat(FBP-1): Fix review submit route for Vercel → self-hosted Inngest 2026-02-27 16:21:34 -08:00
Joel Hooks 10c1ee42a9 feat(CFP-7): Wire feedback form to Convex + show processing status 2026-02-27 15:42:46 -08:00
Joel Hooks 7f5129cb7b feat(CFP-5): Inngest function: content/review.submitted handler 2026-02-27 15:04:28 -08:00
Joel Hooks 8881242236 chore: biome auto-fix import ordering across repo 2026-02-27 14:55:43 -08:00
Joel Hooks 973cf3739c feat(CFP-4): cache invalidation endpoint
POST /api/revalidate with x-revalidation-secret header + { tag } body.
Calls revalidateTag() for on-demand ISR. 401 on bad secret, 400 on missing tag.
2026-02-27 14:34:52 -08:00
Joel Hooks fb4758ed77 feat(CFP-3): static article shell with cache components
Rename PostPageLayout → StaticArticleShell for clarity.
cacheTag/cacheLife already wired from prior work.
2026-02-27 14:21:36 -08:00
Joel Hooks 5886437570 feat: Rust worker-supervisor binary (ADR-0158)
525KB binary, zero external dependencies. Replaces start.sh as launchd target.
- Pre-start port cleanup (kills orphans holding 3111)
- Signal forwarding (SIGTERM/SIGINT/SIGHUP → bun child)
- Crash recovery with exponential backoff (1s→30s max)
- Health checks every 30s, auto-restart after 3 consecutive failures
- Inngest function registry PUT sync after startup
- Secret loading via `secrets` CLI
- TOML config at ~/.config/worker-supervisor.toml

Tested: bun crash → auto-restart in 1s, SIGTERM → clean forwarding,
launchd restart → no orphans, no EADDRINUSE.
2026-02-27 10:46:27 -08:00
Joel Hooks d3c43f0092 fix: use timeouts.finish (not start) for story pipeline
timeouts.start = queued-before-execution timeout
timeouts.finish = total execution time timeout
Was using wrong one, causing 5m default to kill codex runs.
2026-02-27 10:07:19 -08:00
Joel Hooks 748c124506 fix: set 30m Inngest timeout + 15m execSync timeout for story pipeline
Default 5m step timeout was killing codex implement stages that take 10-15 min.
2026-02-27 10:01:09 -08:00
Joel Hooks 923381353e feat(CFP-2): Read articles from Convex instead of filesystem
Codex implement step completed — tsc clean, build passes.
Committed manually because codex didn't commit (prompt strengthened).
Also: stronger commit requirement in story-pipeline implement prompt.
2026-02-27 09:49:47 -08:00
Joel Hooks 1077942d50 revert(CFP-2): restore filesystem article reads — async Convex breaks PPR prerender
CFP-2 made getPost/getAllPosts async for Convex reads, but Next.js 16
with PPR rejects uncached async data access outside <Suspense>.
ALL article pages failed prerender with 'Uncached data was accessed
outside of <Suspense>'.

CFP-2 and CFP-3 need to land together — Convex reads require
'use cache' boundaries first.
2026-02-27 09:21:43 -08:00
Joel Hooks 561b636f52 fix(story-pipeline): retries: 2 for transient SDK failures (ADR-0156)
retries: 0 made worker restarts fatal — Inngest couldn't retry
the step on the new worker. With retries: 2, the 1s restart window
is covered by Inngest's built-in retry backoff.

ADR-0156 rewritten: blue/green port swap > drain-then-restart.
Inngest is step-level stateless — we don't need to wait for runs,
just for the current in-flight step.
2026-02-27 09:19:32 -08:00
Joel Hooks c82474bf47 OG images from post frontmatter: image field → openGraph + twitter cards
- Added image? to PostMeta
- [slug]/page.tsx wires image into og:image and twitter:image
- MineClaw post with hero image + OG
2026-02-27 07:28:36 -08:00
Joel Hooks acd0dcd1a3 move agent search to /api/search, remove /api/agent prefix
- /api/search now serves HATEOAS envelope for agents AND web UI
- Search dialog reads from .result.hits (envelope-aware)
- Updated /api discovery and layout comment
- Removed /api/agent/ directory
2026-02-26 18:48:50 -08:00
Joel Hooks 828bd65b1e api discovery: cacheLife max — only changes on deploy 2026-02-26 18:45:12 -08:00
Joel Hooks 43596db249 fix: separate cached data from NextResponse in /api route
use cache only works on serializable return values, not NextResponse objects
2026-02-26 18:44:09 -08:00
Joel Hooks bad43bf1b4 root /api discovery: cached HATEOAS map of all APIs, content, and agent tips 2026-02-26 18:42:41 -08:00
Joel Hooks cc36806768 agent search discovery: rich about/topics, sample searches for actual content 2026-02-26 18:31:08 -08:00
Joel Hooks 054c62515d agent search API: HATEOAS envelope, markdown snippets, Upstash rate limiting
- /api/agent/search?q={query} — agent-first search endpoint
- Public: blog posts, discoveries, ADRs
- Authenticated (Bearer): adds vault, memory, system log, transcripts
- HATEOAS discovery at /api/agent/search (no query)
- Upstash sliding window rate limit (60/min default)
- Updated layout HTML comment to reference agent APIs
2026-02-26 18:30:27 -08:00
Joel Hooks 45e0084f8b voice agent tutorial + agent HTML comment in layout
- Tutorial: generalized LiveKit voice agent pattern guide (Docker Compose + k8s)
  Written for agents building on behalf of humans
- Layout: HTML comment instructing agents to use raw MDX/RSS/search API
2026-02-26 18:26:29 -08:00
Joel Hooks 8731d90199 Open docs API routes with generous Upstash limits 2026-02-26 16:42:30 -08:00
Joel Hooks 539bdc6016 Support Vercel KV env aliases for docs API rate limit 2026-02-26 16:34:25 -08:00
Joel Hooks adc33f3204 Add /api/docs proxy with Upstash rate limits 2026-02-26 16:29:54 -08:00
Joel Hooks 2ce6ca037a fix(adrs): sync detail page STATUS_COLORS with status-config (add deferred, shipped=claw pink) 2026-02-25 19:21:08 -08:00
Joel Hooks ed949617a3 feat(ADR-0140): complete inference router — tests, gateway alignment, Langfuse on all paths, TS clean
- 16 unit tests for inference-router (catalog + router)
- Gateway model-fallback.ts wired to inference-router catalog
- Langfuse traces every inference call (success + failure)
- Strict/permissive mode based on NODE_ENV
- All TS errors fixed across system-bus and gateway
- ADR status page: added shipped + all status variants
2026-02-25 13:26:16 -08:00
Joel Hooks 6dfd308d40 feat(web): include ADRs and discoveries in RSS feed, sorted by date 2026-02-24 06:20:43 -08:00
Joel Hooks cccfaf7c96 feat(web): add X + RSS links to footer, RSS feed discovery in head, fix twitter:creator 2026-02-24 06:18:36 -08:00
Joel Hooks c3b1c92590 adr: ADR-0114 researching — Elixir/BEAM/Jido migration evaluation
Full architecture analysis: what BEAM replaces natively, what doesn't map,
three migration strategies (full rewrite, hybrid, strangler), Jido framework
assessment, cost/benefit matrix, open questions. Status: researching.
2026-02-23 10:57:36 -08:00
Joel Hooks abff3d8a03 fix: StatusLed invisible — add @source for @repo/ui in Tailwind v4
Tailwind v4 auto-detection doesn't scan symlinked workspace packages.
Added explicit @source directive for packages/ui/src/**/*.tsx.
Reverted ring-based glow to shadow-[...] arbitrary values (more reliable).
2026-02-23 09:44:54 -08:00
Joel Hooks 1df7c2ab04 feat: LED status indicators on /network — replace pills with hardware-rack dots
- New StatusLed component: colored dot only, no text/pill background
- Sizes sm/md/lg (6/8/10px) with pulse animation for healthy
- Subtle glow effect matching status color
- Left-aligned: [LED] name across nodes, pods, daemons
- StatusBadge kept for backward compat
2026-02-23 09:00:27 -08:00
Joel Hooks bb65b2bd83 web: render /adrs list in server HTML 2026-02-22 19:04:24 -08:00
Joel Hooks 9f5ce35b33 mdx: switch shiki theme to catppuccin-mocha 2026-02-22 15:50:35 -08:00
Joel Hooks 6079824945 web: restore shiki highlighting and harden public search 2026-02-22 15:46:38 -08:00
Joel Hooks 8fff257747 web: keep mdx static with cache-component-safe renderers 2026-02-22 15:10:55 -08:00
Joel Hooks e7f36114c5 web: stabilize cache components build and route dynamic islands 2026-02-22 13:59:37 -08:00
Joel Hooks 038fecd7ee fix(web): resolve Vercel build failures
- Fix formatDateStatic import → toDateString (function was removed by prior commit)
- Remove proxy.ts (conflicts with middleware.ts in Next.js 16)
- Clean up untracked (owner) route group and leftover files from gateway agent
2026-02-22 12:59:30 -08:00
Joel Hooks 6b2bb5a5f0 fix(web): Next.js 16 prerender Date.now() errors
- Add connection() before MDX rendering in /[slug] and /adrs/[slug]
- Wrap AdrListWithFilters in Suspense on /adrs index
- next-mdx-remote uses Date.now() internally, requires dynamic opt-in
2026-02-22 12:56:13 -08:00
Joel Hooks d3e253beb8 feat(web): enable review comments on blog posts
Wrap PostContent in LazyReviewGate with contentId=post:{slug}.
Same pipeline as ADRs — paragraph-level comments, Convex storage,
Inngest agent rewrite, gateway notification. ADR-0106.
2026-02-22 12:53:42 -08:00
Joel Hooks 39518c6c34 feat: Next.js best practices audit fixes (ADR-0108)
Error boundaries:
- app/error.tsx: route-level error recovery with reset button
- app/global-error.tsx: root layout failure handler with html/body

Loading skeletons:
- vault, memory, syslog, system, system/events, dashboard, voice
- Pulse shimmer matching each page's actual layout structure
- font-pixel labels for consistent dashboard aesthetic

Import aliases:
- Converted all relative imports (../../lib/, ../../../lib/) to @/*
- 40+ files across app/, components/site-header, components/mobile-nav
- tsconfig @/* alias was already configured, now actually used
2026-02-22 12:13:22 -08:00
Joel Hooks 85beeb2594 feat: functional animations across joelclaw.com
Nav: sliding active indicator bar (CSS transition, no framer-motion).
Measures active link position, slides on route change. 200ms
cubic-bezier(0.22, 1, 0.36, 1).

Mobile nav: exit animation mirrors entrance. Links slide out right
with reverse stagger (30ms), overlay fades out 150ms.

Fix transition-all violations (emilkowal props-transform-opacity):
- signin button: explicit property list
- review FAB: explicit + scale(0.97) per spec
- review submit: explicit + motion-reduce

All animations respect prefers-reduced-motion.
2026-02-22 11:48:46 -08:00
Joel Hooks 0e6e1a6c85 refactor(review): generalize from ADR-only to universal content review
- Drop adrComments table, use contentResources + contentResourceResource
- New reviewComments.ts Convex functions (getByContent, addComment, etc)
- Rename Adr* components → Review* (review-gate, review-wrapper, etc)
- Move /api/adrs/submit-review → /api/review/submit
- Event: content/review.submitted (was adr/review.submitted)
- Props: contentId + contentType + contentSlug (was adrSlug)
- Add content-review.ts Inngest function in system-bus
- Registry renamed: adr-review → content-review
- listLinkedReviewComments query added to contentResources

ADR-0106. Zero data existed so schema migration was free.
2026-02-22 11:00:06 -08:00
Joel Hooks 6bff2cc455 feat(adr-review): ADR-0106 — inline paragraph comment system
- Convex adrComments table + 7 mutations/queries
- rehype-paragraph-ids plugin (content-hash anchoring)
- Review UI: comment drawer, review sheet, FAB, auth gate
- shadcn init (Tailwind v4) + registry.json
- Submit review API route (fires Inngest event)
- @/* path alias for imports
2026-02-22 10:38:59 -08:00
Joel Hooks 016dccc295 redesign: cool finds index — full titles, readable descriptions, compact cards
- Titles wrap fully instead of truncating
- Relevance text shows complete (no line-clamp)
- Date shown as relative time (2d ago) above title, not stealing width
- Single type badge (repo/article/video) replaces full tag list
- Source URL removed from index (shown on detail page)
- Tighter card spacing for better scan density
- Re-removed duplicate self-hosting discovery (also from Vault source)
2026-02-22 08:07:35 -08:00