Commit Graph

1973 Commits

Author SHA1 Message Date
Joel Hooks 60a166476e feat: imessage channel via imsg-rpc socket (ADR-0121) 2026-02-23 18:33:45 -08:00
Joel Hooks d942d79f2d feat: add Discord and iMessage gateway channels (ADR-0120, ADR-0121, ADR-0122) 2026-02-23 18:24:31 -08:00
Joel Hooks a4fe6f0041 feat: add imsg skill for iMessage CLI 2026-02-23 18:08:32 -08:00
Joel Hooks ed6db5c3e4 sync: vault content (1 files)
adrs (1):
  new: 0119-x-twitter-cli-integration.md
2026-02-23 17:57:22 -08:00
Joel Hooks b684f3e3fc sync: vault content (1 files)
discoveries (1):
  new: Why Running Agents on a Single Branch Can Be Faster Than Worktrees.md
2026-02-23 16:51:48 -08:00
Joel Hooks 13d9a23eff adr: link Sean Grove's talk in ADR-0118 2026-02-23 15:14:42 -08:00
Joel Hooks 9a95b4fd14 adr: ADR-0118 Koko shadow executor mode (credit: Sean Grove)
Run same workloads as TypeScript in parallel, compare results.
Shadow never writes authoritative state — results logged for comparison.
Candidates: heartbeat, friction, digest, proposal triage, content-sync.
Comparison metrics: latency, error rate, output quality, recovery time.
Shadow comparison becomes the graduation exam for ADR-0114.
2026-02-23 14:00:47 -08:00
Joel Hooks c0bf99829b adr: Koko granular ADRs — charter (0115), bridge protocol (0116), first workloads (0117)
ADR-0115: What Koko is/isn't, graduation criteria, tech stack, naming
ADR-0116: Redis bridge — passive observer → dedicated channel → bidirectional
ADR-0117: Three workloads — health pulse, event digest, file watcher
All three demonstrate distinct BEAM advantages (supervision, isolation, hot reload)
2026-02-23 13:25:55 -08:00
Joel Hooks 1a2b00fd76 adr: ADR-0114 update — Jido alternatives analysis (Oban, LangChain, SwarmEx, raw OTP)
Oban + OTP + Phoenix is the recommended stack if migrating.
Jido adds agent abstractions but young/dependency risk.
Oban is the mature Inngest equivalent (6+ yrs, funded, dashboards).
2026-02-23 13:15:42 -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 aae37b3eb8 sync: vault content (1 files)
adrs (1):
  updated: 0089-transcript-indexing-typesense.md
2026-02-23 10:34:12 -08:00
Joel Hooks a8db2959c1 sync: vault content (1 files)
adrs (1):
  updated: 0113-standardize-status-indicator.md
2026-02-23 10:05:41 -08:00
Joel Hooks aebeda7c05 sync: vault content (1 files)
adrs (1):
  updated: 0113-standardize-status-indicator.md
2026-02-23 09:53:21 -08:00
Joel Hooks 176e12456e sync: vault content (1 files)
adrs (1):
  new: 0113-standardize-status-indicator.md
2026-02-23 09:52:29 -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 cae4c4a4e4 feat: ADR-0112 unified cache layer — core module + Typesense/Granola wiring
- New packages/system-bus/src/lib/cache.ts: hot (Redis), warm (file), cold (NAS)
- cacheGet/cacheSet/cacheInvalidate/cacheWrap + invalidatePattern
- Atomic file writes, graceful NAS fallback, structured OTEL logs
- Typesense multi_search wrapped with 5min hot cache (SHA-256 key)
- Granola meeting-analyze wrapped with 30min hot cache
- ADR-0112 status: proposed → accepted
2026-02-23 09:43:07 -08:00
Joel Hooks dc46b16463 feat: email thread/attachment caching + ADR-0112 unified caching layer
- Email read now caches threads to ~/.cache/joelclaw/email/threads/
- Attachment download + local file caching
- --refresh flag to bypass cache, --cache-ttl-minutes for TTL control
- Stale fallback when Front API is unreachable
- ADR-0112 proposes system-wide caching: hot (Redis), warm (file), cold (NAS)
- Covers Front, Todoist, Granola, Typesense, PDS with per-service TTLs
- Webhook-driven invalidation + CLI --refresh on all cached commands
2026-02-23 09:23:41 -08:00
Joel Hooks 49dac8d0db sync: vault content (1 files)
discoveries (1):
  new: AI Hero as a New Frame for Developer Education.md
2026-02-23 09:17:08 -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 960d27c922 fix: 5 friction patterns — Typesense vector field, o11y handler, drift thresholds, content-sync cooldown, agent-dispatch file detection
1. observe.ts: resolve vector field name dynamically from Typesense schema
2. o11y-triage.ts: register missing auto-fix handler names
3. check-system-health.ts: raise drift thresholds + add minVerdicts guard
4. content-sync.ts: add 6h Redis cooldown for changes_not_committed
5. agent-dispatch.ts: detect file-reading tasks and skip --no-tools for pi
2026-02-23 06:26:56 -08:00
Joel Hooks 9b3e5c1629 fix: remove silent notify oxymoron — just don't call notify
Friction-fix no longer calls gateway.notify() at all for per-pattern
results. Removed the silent option from gateway middleware — if you
don't want to notify, don't notify.
2026-02-23 06:13:59 -08:00
Joel Hooks 98c5606206 feat: gateway.notify() silent option + friction-fix fully silent
- gateway.notify(type, payload, { silent: true }) logs but doesn't push to Joel
- All friction-fix per-pattern notifications now silent
- Only parent friction.ts summary ('10 patterns → N tasks') reaches gateway
- Individual fix outcomes logged via console for OTEL observability
- Eliminates all friction-fix gateway noise (was 10 events per analysis run)
2026-02-23 06:13:13 -08:00
Joel Hooks c4649ff279 fix: suppress friction-fix skip notifications — only notify on fixes or escalations
Friction analysis emits 10 patterns → 10 friction-fix runs → 10 gateway
notifications. Most are 'skipped' (codex produces no commits). These flood
the gateway with noise. Now only actual fixes and Todoist escalations notify.
2026-02-23 06:08:53 -08:00
Joel Hooks 427d06f8e3 fix: friction — vercel webhook secret, auto PUT sync, media/received suppression
- Lease vercel_webhook_secret in start.sh (was silently dropping all Vercel signatures)
- POST-startup PUT sync to prevent stale Inngest registry after every restart
- Add media/received to SUPPRESSED_TYPES (5+ duplicate progress events per image)
- Fix friction-fix.ts TS error (implicit any)
2026-02-22 23:12:53 -08:00
Joel Hooks aaa763f541 feat: Telegram MCQ auto-select timeout — 30s default, picks recommended on expiry
- Per-question timer starts when recommended option exists
- Auto-selects and edits message with '⏱ Auto-selected: option N'
- Button press cancels timer
- Configurable via timeout param (0 disables)
- No-recommended questions wait forever (no change)
2026-02-22 22:22:30 -08:00
Joel Hooks c758e0fc98 fix: Telegram MCQ buttons — short numeric labels, full descriptions in message body
- Buttons now show '1', '2 ★', '3' instead of truncated option text
- Full numbered option descriptions in message body above buttons
- Recommendation reason shown as italic text below options
- 'Other' gets a number too for consistency
- callback_data unchanged, no behavior change
2026-02-22 21:39:58 -08:00
Joel Hooks 036465d2dd fix: friction — Granola concurrency guards + Todoist echo suppression
- Add account-scoped concurrency (granola-mcp, limit:1) to all Granola functions
- Add rate-limit error detection with retriable throws
- Suppress Todoist task.completed webhook echoes via Redis set (60s TTL)
- Agent marks task IDs before API close, webhook handler checks before processing
2026-02-22 20:21:53 -08:00
Joel Hooks bb65b2bd83 web: render /adrs list in server HTML 2026-02-22 19:04:24 -08:00
Joel Hooks 815c434b77 sync: vault content (1 files)
adrs (1):
  updated: 0111-email-channel-routing-engine.md
2026-02-22 17:33:52 -08:00
Joel Hooks 12c06c11e8 sync: vault content (1 files)
adrs (1):
  updated: 0111-email-channel-routing-engine.md
2026-02-22 17:21:57 -08:00
Joel Hooks 91c844fc20 sync: vault content (1 files)
adrs (1):
  new: 0111-email-channel-routing-engine.md
2026-02-22 17:19:15 -08:00
Joel Hooks 4a375ea19d feat(cli): email command improvements — Front search fixes + archive-ids
- Add archive-ids command: parallel batched archive by comma-separated IDs
- Add --from, --before, --after flags to inbox command (structured query building)
- Add --page-token for pagination through large result sets
- Fix: before:/after: now correctly convert YYYY-MM-DD to unix timestamps
  (Front API requires seconds, not date strings)
- Fix: Remove is:unread from suggestions (not a valid Front status)
- Add buildFrontQuery() with full Front Search API reference in docblock
  (authoritative filter list: is/from/to/cc/bcc/recipient/inbox/tag/
   before/after/during/assignee/participant/author/mention/commenter/
   contact/link/custom_field)
- Update help text with valid query examples
2026-02-22 15:54:03 -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 155fbc5bee sync: vault content (1 files)
adrs (1):
  new: 0110-agent-secrets-lease-dedup-otel.md
2026-02-22 15:20:39 -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 44e6b048f5 fix(web): add missing review gate components for Vercel build
LazyReviewGate and ConvexReviewGate were untracked but imported by
[slug]/page.tsx and adrs/[slug]/page.tsx. Lazy-loads Convex client
via useEffect to avoid Date.now() during static prerender.
2026-02-22 12:56:52 -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 97431d0077 sync: vault content (2 files)
adrs (2):
  updated: 0105-joelclaw-pdf-brain-typesense.md
  updated: 0109-system-wide-taxonomy-concept-contract.md
2026-02-22 12:51:11 -08:00
Joel Hooks 60903781f6 content: cache components patterns skill for Next.js 16+
Static shell + slots architecture, 'use cache' boundaries, provider islands,
prefetch rules, cache invalidation, migration from unstable_cache.
Bi-modal with AgentNote blocks pointing to nextjs-static-shells skill.
2026-02-22 12:48:26 -08:00
Joel Hooks 2d6d8a93bf skill: add nextjs-static-shells — static-first Next.js 16 architecture patterns
Covers: Entry+Static+Slots route architecture, 'use cache' boundaries
with cacheLife/cacheTag/updateTag, provider islands, RSC boundary rules,
async patterns, Suspense requirements, link preloading strategy,
unstable_cache migration, and failure mode catalog.

Incorporates reference material from next-best-practices and
next-cache-components skills into a self-contained architecture guide.
2026-02-22 12:42:40 -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 e01d9b6d52 sync: vault content (1 files)
adrs (1):
  new: 0108-nextjs-best-practices-audit.md
2026-02-22 12:09:29 -08:00
Joel Hooks 7354f1f35e fix: isOwner query throws when logged out, CLS on wrapper mount
auth.isOwner: wrap getAuthUser in try/catch — returns false instead
of throwing when no session token exists.

ReviewGate: treat undefined (loading) same as false — render children
without wrapper to prevent layout shift.

ReviewWrapper: remove -mx-2/px-2/py-0.5 from paragraph hover styles
that caused vertical CLS when wrapper mounted after auth resolved.
2026-02-22 11:55:12 -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 8643845c6f feat(review): auto-expanding textarea with smooth animation
useAutoResize hook: measures scrollHeight, transitions height at
150ms with cubic-bezier(0.22, 1, 0.36, 1). Expands as you type,
collapses when content is deleted. Applied to both compose and
edit textareas. Max height 240px then scrolls.
2026-02-22 11:42:15 -08:00
Joel Hooks 003597ebd6 feat(review): cmd/ctrl/shift multi-select paragraphs
- Plain click: single select (toggle)
- Cmd/Ctrl+click: add/remove from selection
- Shift+click: range select (DOM order)
- Cmd+Shift: range added to existing selection
- Multi-select shows '3 paragraphs' badge in comment header
- Comment prefixed with selection context for agent
- Hint bar shows keyboard shortcuts
2026-02-22 11:30:23 -08:00