v0.0.1
bite 0.0.1
Pre-built binaries for Linux, macOS, and Windows are attached below.
Docker:
docker pull ghcr.io/nicksan222/bite:0.0.1
Changelog
Other
- c1b1398: DRY runChat tests with stubEnv helper (Nicholas Santi nicksan222@gmail.com)
- d1662ff: add internal/tools registry foundation (Nicholas Santi nicksan222@gmail.com)
- 55ea744: add meta-test asserting every tool reaches every surface (Nicholas Santi nicksan222@gmail.com)
- 017e6e6: add registry adapters for ai, cobra, slash, and system prompt (Nicholas Santi nicksan222@gmail.com)
- ba0e8a4: ask: make prompt optional so image-only invocations work (Nicholas Santi nicksan222@gmail.com)
- ec0107f: bootstrap bite: terminal AI nutritionist scaffolding (Nicholas Santi nicksan222@gmail.com)
- 5a10684: centralise doctor checks into registry, auto-derive help (Nicholas Santi nicksan222@gmail.com)
- 12588e5: centralise tool-binding stream options in tools.ChatStreamOptions (Nicholas Santi nicksan222@gmail.com)
- 55a6596: check registry: switch to slices.Clone + slices.SortStableFunc (Nicholas Santi nicksan222@gmail.com)
- 87e44d1: check sort: use cmp.Compare instead of int subtraction (Nicholas Santi nicksan222@gmail.com)
- 75ea999: check: reject non-snake_case Gate names so auto-derived flags stay valid (Nicholas Santi nicksan222@gmail.com)
- f43804f: cli doc: chat.go is now a cobra wrapper around tools.RunChatTUI (Nicholas Santi nicksan222@gmail.com)
- 41a396e: cli doc: refresh — lazy Deps wiring lives in tools.CobraDepsProvider (Nicholas Santi nicksan222@gmail.com)
- c7d6e6b: cobra: pick friendliest positional-args validator (ExactArgs / MaxArgs / RangeArgs) (Nicholas Santi nicksan222@gmail.com)
- b882ad9: cobra: render per-tool Examples in 'bite --help' (Nicholas Santi nicksan222@gmail.com)
- f83a6d8: db tests: modernize for-range-int loops and use any over interface{} (Nicholas Santi nicksan222@gmail.com)
- f38f3e2: db: silence goose migration logger so every cli command stops printing 'OK ' (Nicholas Santi nicksan222@gmail.com)
- 11d61af: dev: live reload for bite web via air (make web-dev) (Nicholas Santi nicksan222@gmail.com)
- be5d75f: dev: rename air build.bin → build.entrypoint (silence deprecation) (Nicholas Santi nicksan222@gmail.com)
- ba478d3: devcontainer: mention bite web in post-create hints (Nicholas Santi nicksan222@gmail.com)
- 78b2ea4: doctor: auto-derive params from registered check gates (Nicholas Santi nicksan222@gmail.com)
- 8dd9ee4: doctor: derive fail glyph from Severity.FailGlyph() (Nicholas Santi nicksan222@gmail.com)
- 7f11f6e: doctor: stop computing dynamic description twice; help test uses Long() (Nicholas Santi nicksan222@gmail.com)
- 7d55764: document tool registry in CLAUDE.md (Nicholas Santi nicksan222@gmail.com)
- 3465e77: drop duplicate tools.SlashHandler type, rely on Go function compatibility (Nicholas Santi nicksan222@gmail.com)
- 8f411b9: drop unused SeverityRoot and add Args/parseSlashArgs edge tests (Nicholas Santi nicksan222@gmail.com)
- f444612: drop unused SlashOutcome.UserLine field (Nicholas Santi nicksan222@gmail.com)
- 4780365: drop unused build date — fang has no WithDate, value was set but never read (Nicholas Santi nicksan222@gmail.com)
- 9eca5b7: env.example: document optional OPENAI_API_KEY for whisper transcription (Nicholas Santi nicksan222@gmail.com)
- a2b8f75: extract chat-launch flow to tools.RunChatTUI; cli/chat.go is just a cobra shim (Nicholas Santi nicksan222@gmail.com)
- c4c326b: extract slash adapter dance into tools.NewSlashHandler (Nicholas Santi nicksan222@gmail.com)
- ad5f0cd: factor shared meal-list formatting into meals_format helper (Nicholas Santi nicksan222@gmail.com)
- 344bec5: gitignore: anchor /bite so it only matches root binary, not cmd/bite/ source (Nicholas Santi nicksan222@gmail.com)
- c07839e: meals_recent: default limit to 10 and reuse totals helper (Nicholas Santi nicksan222@gmail.com)
- dff7e8b: modernize slash tokeniser to range-over-int loop (Nicholas Santi nicksan222@gmail.com)
- 8e8f7c9: move chat persona from config to tools.DefaultPersona (Nicholas Santi nicksan222@gmail.com)
- 480d409: move chat session helpers from cli to internal/tools (Nicholas Santi nicksan222@gmail.com)
- b76898c: move config and client wiring helpers from cli to tools (Nicholas Santi nicksan222@gmail.com)
- a5a0d6c: readme: document the registry-driven CLI and slash commands (Nicholas Santi nicksan222@gmail.com)
- e782fba: register ask tool with streaming via Deps.StreamWriter (Nicholas Santi nicksan222@gmail.com)
- 0f4e00f: register conversation management tools (Nicholas Santi nicksan222@gmail.com)
- ae03a8a: register meal tracking tools in registry (Nicholas Santi nicksan222@gmail.com)
- 0ed773b: register media analysis tools (analyze_meal, log_meal_from_media) (Nicholas Santi nicksan222@gmail.com)
- 6d78436: registry: All() one-liner via slices.SortedFunc(maps.Values) (Nicholas Santi nicksan222@gmail.com)
- 52794f6: registry: add Tool.SkipAI and Tool.SkipSlash for cobra-only commands (Nicholas Santi nicksan222@gmail.com)
- a849ad5: registry: auto-derive bite --help examples from each tool's Examples field (Nicholas Santi nicksan222@gmail.com)
- 2d77cdd: registry: inject Param.Default into Args, drop manual fallbacks (Nicholas Santi nicksan222@gmail.com)
- 0ae0d33: registry: meta-test that every registered Param has a Desc (Nicholas Santi nicksan222@gmail.com)
- dfe1188: registry: modernize All() with slices.Sorted + maps.Keys (Nicholas Santi nicksan222@gmail.com)
- f1954c2: registry: reject Required + Default — contradictory, default would be unreachable (Nicholas Santi nicksan222@gmail.com)
- 133a6da: registry: reject tools whose name shadows /help dispatcher builtin (Nicholas Santi nicksan222@gmail.com)
- 5894d96: registry: require Check.Desc and validate Severity at registration (Nicholas Santi nicksan222@gmail.com)
- 0f286f3: registry: use cmp.Compare consistently for tool name sort (Nicholas Santi nicksan222@gmail.com)
- d3c9864: registry: validate Example.Cmd invokes the declaring tool by name (Nicholas Santi nicksan222@gmail.com)
- 1b8ab25: registry: validate Tool.Examples shape at registration (Nicholas Santi nicksan222@gmail.com)
- fae84a0: registry: validate that Param.Default Go type matches ParamType (Nicholas Santi nicksan222@gmail.com)
- 93fcd81: root help: drop developer-facing CLAUDE.md reference, point at bite doctor (Nicholas Santi nicksan222@gmail.com)
- 13bb5c2: simplify check registry: SliceStable preserves order, drop manual serial (Nicholas Santi nicksan222@gmail.com)
- 08f4d15: slash adapter: clean up positional fill loop with idiomatic for-range (Nicholas Santi nicksan222@gmail.com)
- 171ad95: slash: bare '/' surfaces a clear empty-command error instead of '/' as name (Nicholas Santi nicksan222@gmail.com)
- 9dd7d33: slash: show positional signature in /help, share with cobra Use (Nicholas Santi nicksan222@gmail.com)
- b557e65: split tool.go into focused files: args, deps, tool (Nicholas Santi nicksan222@gmail.com)
- 61874a5: tests: add partialFailStore to cover second-call-fails branches (Nicholas Santi nicksan222@gmail.com)
- 760f0f4: tests: assert doctor params mirror registered check gates (Nicholas Santi nicksan222@gmail.com)
- 87a077e: tests: cover ChatStreamOptions (Nicholas Santi nicksan222@gmail.com)
- aa7c157: tests: cover CobraDepsProvider store-open error path (Nicholas Santi nicksan222@gmail.com)
- 8f681b7: tests: cover Dispatch's non-slash-prefix rejection (Nicholas Santi nicksan222@gmail.com)
- 665e314: tests: cover PrepareSession ListMessages/NewConversation error branches (Nicholas Santi nicksan222@gmail.com)
- fd091bb: tests: cover Required non-positional flag enforcement (MarkFlagRequired branch) (Nicholas Santi nicksan222@gmail.com)
- 3a7a741: tests: cover Store.Streak ListMealsBetween error path (Nicholas Santi nicksan222@gmail.com)
- e93a146: tests: cover Tool.Long branches (dynamic, dynamic-empty fallback, no-dynamic) (Nicholas Santi nicksan222@gmail.com)
- 42fbdc3: tests: cover absorbPositionals omitted-optional-positional branch (Nicholas Santi nicksan222@gmail.com)
- 2e9a4a4: tests: cover ai Execute run-error path and isKeyValue edge cases (Nicholas Santi nicksan222@gmail.com)
- adb52a9: tests: cover analyzeFromArgs error path (bad model JSON) (Nicholas Santi nicksan222@gmail.com)
- b53b839: tests: cover ask error paths, system override, and Final-only events (Nicholas Santi nicksan222@gmail.com)
- dc8cd0b: tests: cover ask image-attachment path (Nicholas Santi nicksan222@gmail.com)
- 83dff1f: tests: cover cobra DepsProvider error/cleanup and describeCheck fallback (Nicholas Santi nicksan222@gmail.com)
- 99016fc: tests: cover cobra Run error propagation and streaming text suppression (Nicholas Santi nicksan222@gmail.com)
- 39a0e28: tests: cover conversations_list untitled fallback (renders '(untitled)' for empty) (Nicholas Santi nicksan222@gmail.com)
- 4ddd041: tests: cover doctor check failure paths (bad DSN, bad config) (Nicholas Santi nicksan222@gmail.com)
- f867865: tests: cover doctor ffmpeg-found path with fake-binary-on-PATH trick (Nicholas Santi nicksan222@gmail.com)
- a20df17: tests: cover doctor ping path with fake key reaching Stream (Nicholas Santi nicksan222@gmail.com)
- f1185ee: tests: cover helpText empty-registry fallback (Nicholas Santi nicksan222@gmail.com)
- 565bba2: tests: cover isSnakeCase exhaustively and validate edge cases (Nicholas Santi nicksan222@gmail.com)
- 0792c6f: tests: cover lazyAI.Stream client-built delegation path (Nicholas Santi nicksan222@gmail.com)
- b8acfda: tests: cover meals_on store-error path (Nicholas Santi nicksan222@gmail.com)
- 18426f9: tests: cover meals_recent store-error path (Nicholas Santi nicksan222@gmail.com)
- 17b1434: tests: cover meals_week store-error path (Nicholas Santi nicksan222@gmail.com)
- ce2d4fe: tests: cover parseString edge cases and all flag-binding types (Nicholas Santi nicksan222@gmail.com)
- 6ecb463: tests: cover parseString unknown-ParamType defensive branch (Nicholas Santi nicksan222@gmail.com)
- a848b76: tests: cover plain-int Default for ParamInt flags (Nicholas Santi nicksan222@gmail.com)
- 88d1794: tests: cover positionalArgsValidator branches (Exact/Max/Range) (Nicholas Santi nicksan222@gmail.com)
- 4a202aa: tests: cover renderMarkdownTable nil/empty short-circuit (Nicholas Santi nicksan222@gmail.com)
- 8bab454: tests: cover runAsk channel-closed-without-Done fallback (Nicholas Santi nicksan222@gmail.com)
- 68edad8: tests: cover slash positional/keyed type-mismatch parse errors (Nicholas Santi nicksan222@gmail.com)
- 8e6d2ec: tests: cover slash too-many-positional-arguments rejection (Nicholas Santi nicksan222@gmail.com)
- 0573f2f: tests: cover small helpers (RenderResultForChat, asImageAttachment, Severity.String, countingWriter, Args numeric coercions, Deps defaults) (Nicholas Santi nicksan222@gmail.com)
- aa7b054: tests: cover store-error paths in delete/list_conversations and URL routing in analyze_meal (Nicholas Santi nicksan222@gmail.com)
- d439126: tests: cover store-error paths in delete_meal, log_meal_from_media, and ChatPersister (Nicholas Santi nicksan222@gmail.com)
- e2c8765: tests: cover store-error paths in meals_today, set_goals, rename_conversation (Nicholas Santi nicksan222@gmail.com)
- f895f1e: tests: cover store-error paths in streak and get_goals (Nicholas Santi nicksan222@gmail.com)
- 0cba2db: tests: exercise doctor success path with full env to cover check init() bodies (Nicholas Santi nicksan222@gmail.com)
- f6fac13: tests: extract snapshotCheckRegistry helper for registry-mutating tests (Nicholas Santi nicksan222@gmail.com)
- a340891: tests: gateParams dedupes when two checks share a gate (Nicholas Santi nicksan222@gmail.com)
- 8a719ae: tests: hoist errStreamer and eventStreamer to testdeps for sharing (Nicholas Santi nicksan222@gmail.com)
- 6aaba10: tests: hoist stubAI to testdeps so all AI-using tests share one mock (Nicholas Santi nicksan222@gmail.com)
- 7f65c97: tests: lock AI tool spec to static Description (not DescribeDynamic) (Nicholas Santi nicksan222@gmail.com)
- b514113: tests: lock slash quoted key=value preserves internal spaces (Nicholas Santi nicksan222@gmail.com)
- d2cb190: tests: meta-assert tool Examples are well-formed (bite-prefix, non-empty desc) (Nicholas Santi nicksan222@gmail.com)
- ef516c7: tests: pin formatMealList and totals.add behaviour directly (Nicholas Santi nicksan222@gmail.com)
- 7304ef3: tests: pin mergeGoal absent/zero/nonzero semantics directly (Nicholas Santi nicksan222@gmail.com)
- ea9b543: tests: prove brand-new tool reaches every surface (registry promise smoke test) (Nicholas Santi nicksan222@gmail.com)
- acd7304: tests: skip TUI/ffmpeg/dev-null assertions on Windows; portable bad-DSN via t.TempDir (Nicholas Santi nicksan222@gmail.com)
- 0b27577: tools doc: list NewSlashHandler and ChatStreamOptions in adapter index (Nicholas Santi nicksan222@gmail.com)
- a15b98f: tools: add Examples to every remaining tool so all surface in bite --help (Nicholas Santi nicksan222@gmail.com)
- d8c27d5: tools: add Examples to meals_week, streak, set_goals, delete_meal (Nicholas Santi nicksan222@gmail.com)
- b5b503d: tools: add SetDefault, drop hand-written RunE from cli/root.go (Nicholas Santi nicksan222@gmail.com)
- 21933d5: tools: collapse RunChatWithDeps into chat tool's Run as the single launcher (Nicholas Santi nicksan222@gmail.com)
- 906c166: tools: cover Deps NowOrDefault, LocOrDefault, RequireAI nil/non-ensurer paths (Nicholas Santi nicksan222@gmail.com)
- 5cc0c28: tools: cover NewArgsForTool nil-raw path, comment runDoctor flow (Nicholas Santi nicksan222@gmail.com)
- 062f314: tools: cover chat tool registration and run-error path (Nicholas Santi nicksan222@gmail.com)
- 53a5dc6: tools: cover helpText width extension for short tool names (Nicholas Santi nicksan222@gmail.com)
- 7a2d422: tools: default freshDeps Model so chat-flow tests stop setting it manually (Nicholas Santi nicksan222@gmail.com)
- 784b0e2: tools: directly test SkipAI/SkipSlash filtering in adapters (Nicholas Santi nicksan222@gmail.com)
- d1000b7: tools: drop hard-coded sibling-tool refs from chat docs (rotates if renamed) (Nicholas Santi nicksan222@gmail.com)
- 6994938: tools: drop unused RunChatTUI, refresh CLAUDE.md TUI guidance (Nicholas Santi nicksan222@gmail.com)
- 041fe4d: tools: extract formatGoals so get_goals and set_goals share the rendering (Nicholas Santi nicksan222@gmail.com)
- 0e024cb: tools: extract formatMacrosFull shared by totals and meal-saved lines (Nicholas Santi nicksan222@gmail.com)
- 3901419: tools: extract isHTTPURL shared by ask and analyze_meal media routing (Nicholas Santi nicksan222@gmail.com)
- 7103a1c: tools: extract macroCells so meals_recent stops repeating fmt.Sprintf 8 times (Nicholas Santi nicksan222@gmail.com)
- 126d160: tools: extract totals.addTotals so meals_week stops repeating field-by-field sums (Nicholas Santi nicksan222@gmail.com)
- ddc2cec: tools: fail-fast on missing API key for both bite and bite chat paths (Nicholas Santi nicksan222@gmail.com)
- a3c56d0: tools: lock in untyped int Default + chat hidden from live adapters (Nicholas Santi nicksan222@gmail.com)
- d4bd058: tools: meta-test that every tool ships at least one Example for discoverability (Nicholas Santi nicksan222@gmail.com)
- 06060fc: tools: refresh Param/Result/Examples doc comments to match current behavior (Nicholas Santi nicksan222@gmail.com)
- 564b171: tools: refresh package doc with SetDefault and Skip-flag adapter notes (Nicholas Santi nicksan222@gmail.com)
- e0a7c08: tools: register chat as a SkipAI/SkipSlash Tool, remove cli/chat.go (Nicholas Santi nicksan222@gmail.com)
- cafe5d3: tools: register web tool — launches the HTMX dashboard (Nicholas Santi nicksan222@gmail.com)
- 12d0683: tools: rename run_chat_tui_test.go to launch_chat_test.go (Nicholas Santi nicksan222@gmail.com)
- c8080ec: tools: route RunChatTUI through CobraDepsProvider, share one deps-builder (Nicholas Santi nicksan222@gmail.com)
- 8db51a7: tools: route ask/analyze nil-AI checks through Deps.RequireAI (Nicholas Santi nicksan222@gmail.com)
- 81e0f5f: tools: share formatMealSaved between log_meal and log_meal_from_media (Nicholas Santi nicksan222@gmail.com)
- 5b2fb10: tools: simplify runChat tail — return prog.Run error directly (Nicholas Santi nicksan222@gmail.com)
- 9b29c49: tools: smoother chat description prose (Nicholas Santi nicksan222@gmail.com)
- 45bc229: tui doc: new-screen wiring goes through tools launch fn, not direct cli wiring (Nicholas Santi nicksan222@gmail.com)
- d5ddeac: tui tests: drop placeholder use of errors and use strings.Builder for delta accumulation (Nicholas Santi nicksan222@gmail.com)
- 63008a6: tui: cover handleSlash success, parse-error, persist-error, and fallthrough (Nicholas Santi nicksan222@gmail.com)
- b4a07fe: tui: drop stale 'cli/.go wrapper' step from new-screen guide (Nicholas Santi nicksan222@gmail.com)
- b750d49: tui: hint /help in welcome banner and modernize layout maxes (Nicholas Santi nicksan222@gmail.com)
- ae501fe: tui: refresh Persister doc — adapter lives in tools.ChatPersister now (Nicholas Santi nicksan222@gmail.com)
- f66890b: tui: surface /help in chat status line (Nicholas Santi nicksan222@gmail.com)
- a5aabc3: web: actually decode the error envelope in TestNew_errorHandlerEnvelope (Nicholas Santi nicksan222@gmail.com)
- 56f4770: web: add sr-only label for chat textarea (Nicholas Santi nicksan222@gmail.com)
- bfb5304: web: add sr-only labels to meal form inputs (Nicholas Santi nicksan222@gmail.com)
- 51b0cb1: web: add title attribute to param badges for non-color cues (Nicholas Santi nicksan222@gmail.com)
- feacf92: web: also assert unconfigured-AI body shape, not just status + content-type (Nicholas Santi nicksan222@gmail.com)
- 554fa10: web: assert /api/tools/:name success returns JSON content-type (Nicholas Santi nicksan222@gmail.com)
- c244a9c: web: assert Content-Type=text/html on chat POST success path (Nicholas Santi nicksan222@gmail.com)
- 9215a6b: web: assert JSON error envelope shape in API tests via shared helper (Nicholas Santi nicksan222@gmail.com)
- 1d4825e: web: assert POST content-type in chat lifecycle test (Nicholas Santi nicksan222@gmail.com)
- 25669b5: web: assert appendTurn actually appends user/asst pair, not just bumps last (Nicholas Santi nicksan222@gmail.com)
- 5566ee2: web: assert appendTurn doesn't resurrect a missing session (Nicholas Santi nicksan222@gmail.com)
- 2599f5a: web: assert appendTurn refreshes sess.last so prune can't race a long stream (Nicholas Santi nicksan222@gmail.com)
- f74fc4c: web: assert correct Content-Type per static asset (CSS vs JS) (Nicholas Santi nicksan222@gmail.com)
- 76287af: web: assert dashboard renders every dashboardCards entry (Nicholas Santi nicksan222@gmail.com)
- 0d89321: web: assert each surface's envelope shape in unconfigured-deps test (Nicholas Santi nicksan222@gmail.com)
- d056394: web: assert empty-message error renders as HTML alert, not just 400 (Nicholas Santi nicksan222@gmail.com)
- ed2f3f4: web: assert ensure runs prune so idle sessions don't leak via the request path (Nicholas Santi nicksan222@gmail.com)
- 4c55739: web: assert event:done on every SSE-error test path (Nicholas Santi nicksan222@gmail.com)
- 1868ad3: web: assert exactly one aria-current per page render (Nicholas Santi nicksan222@gmail.com)
- 0e4ac2a: web: assert htmx 404 alert echoes the requested tool name (Nicholas Santi nicksan222@gmail.com)
- 1163b8d: web: assert htmx 503 body shape (alert class + message), not just headers (Nicholas Santi nicksan222@gmail.com)
- 7509b3c: web: assert htmx postForm response body echoes Result.Text (Nicholas Santi nicksan222@gmail.com)
- 971e7c3: web: assert listTools JSON content-type and summary round-trip (Nicholas Santi nicksan222@gmail.com)
- 85284a2: web: assert page-specific copy in render test (catches empty content block) (Nicholas Santi nicksan222@gmail.com)
- 2abd5ec: web: assert recovered-panic body shape, not just status + content-type (Nicholas Santi nicksan222@gmail.com)
- ac2256e: web: assert terminating done event on the unconfigured-AI SSE path (Nicholas Santi nicksan222@gmail.com)
- 368669e: web: assert turnStash.stash runs prune so abandoned turns don't leak (Nicholas Santi nicksan222@gmail.com)
- 0db5141: web: bracket IPv6 hosts in Config.Addr via net.JoinHostPort (Nicholas Santi nicksan222@gmail.com)
- c219685: web: cache role conversion in parseChatRole (Nicholas Santi nicksan222@gmail.com)
- 2c0ac65: web: chatStart template-error path returns HTML, not JSON envelope (Nicholas Santi nicksan222@gmail.com)
- 5b42008: web: clarify CDN dependency and route paths in doc.go (Nicholas Santi nicksan222@gmail.com)
- 038be67: web: clarify Listen's shutdown vs bind-error semantics in doc (Nicholas Santi nicksan222@gmail.com)
- bf94552: web: clarify stubDeps doc — nil invoke means unconfigured, not a no-op (Nicholas Santi nicksan222@gmail.com)
- 20f303b: web: clean up shared chatSessionStore after the prune test runs (Nicholas Santi nicksan222@gmail.com)
- ac9bac2: web: collapse htmx GET+POST mounts into a single Add (Nicholas Santi nicksan222@gmail.com)
- c397fc8: web: configure htmx so 4xx/5xx responses still swap (alerts were silent) (Nicholas Santi nicksan222@gmail.com)
- fa6f794: web: cover /static asset serving (Nicholas Santi nicksan222@gmail.com)
- 4f2eb00: web: cover HTMX generic-error branch returning HTML alert (Nicholas Santi nicksan222@gmail.com)
- 358872c: web: cover Listen reporting bind errors (Nicholas Santi nicksan222@gmail.com)
- db55f1a: web: cover SSE error and handshake-failure branches (Nicholas Santi nicksan222@gmail.com)
- 7a2561d: web: cover SSE handshake-error branch on the GET stream endpoint (Nicholas Santi nicksan222@gmail.com)
- 183191a: web: cover Server ErrorHandler envelope contract (Nicholas Santi nicksan222@gmail.com)
- 20cf497: web: cover Server.Listen graceful shutdown (Nicholas Santi nicksan222@gmail.com)
- ec55076: web: cover StreamOpts forwarding into ai.Streamer (Nicholas Santi nicksan222@gmail.com)
- 381aae9: web: cover StreamOpts forwarding through the new chat endpoint pair (Nicholas Santi nicksan222@gmail.com)
- 752b3ee: web: cover parsePages views/ read-error branch (Nicholas Santi nicksan222@gmail.com)
- 0b97fbd: web: cover pumpStreamEvents Flush-error early return (Nicholas Santi nicksan222@gmail.com)
- 62544a6: web: cover pumpStreamEvents fallback when Final is empty (Nicholas Santi nicksan222@gmail.com)
- e7c02bf: web: cover recover middleware converting panics to 500 (Nicholas Santi nicksan222@gmail.com)
- 3a4d789: web: cover render's unknown-template fallback (Nicholas Santi nicksan222@gmail.com)
- 0e23c41: web: cover session/turn store prune and missing-id branches (Nicholas Santi nicksan222@gmail.com)
- 7e92fb6: web: cover tools page param rendering (badges + title attribute) (Nicholas Santi nicksan222@gmail.com)
- 1055c39: web: dashboard cards also listen for body 'refresh' events (Nicholas Santi nicksan222@gmail.com)
- c5a3aa6: web: defer Flush in pumpStreamEvents to guarantee terminal events ship (Nicholas Santi nicksan222@gmail.com)
- 11c8161: web: defer SSE headers until Stream call succeeds (Nicholas Santi nicksan222@gmail.com)
- 4567e00: web: dispatch refresh after log_meal so Today card updates instantly (Nicholas Santi nicksan222@gmail.com)
- 84de4a5: web: doc all stubStreamer fields, not just the error knobs (Nicholas Santi nicksan222@gmail.com)
- 7278efe: web: doc chatSession, sessionStore, and turnStash types (Nicholas Santi nicksan222@gmail.com)
- 75ba142: web: doc embed.go's mustParsePages and mustSub helpers (Nicholas Santi nicksan222@gmail.com)
- 770482c: web: doc failingWriter fields with their semantics (Nicholas Santi nicksan222@gmail.com)
- 9de14b3: web: doc freePort and waitForListen test helpers (Nicholas Santi nicksan222@gmail.com)
- ecbfc10: web: doc sessionStore.pruneLocked — locking contract + eviction policy (Nicholas Santi nicksan222@gmail.com)
- 01d67f5: web: doc turnStash.stash/pop/pruneLocked for parity with sessionStore (Nicholas Santi nicksan222@gmail.com)
- 30b8da2: web: document StreamOpts → ai.WithTools binding in chatStream doc (Nicholas Santi nicksan222@gmail.com)
- 8a71158: web: document chatMsgDTO's untyped Role design choice (Nicholas Santi nicksan222@gmail.com)
- 87a95e7: web: drive chat with htmx + htmx-ext-sse, drop chat.js (Nicholas Santi nicksan222@gmail.com)
- ef31126: web: drop chat-bubble class from error swap target so daisyUI alert wins (Nicholas Santi nicksan222@gmail.com)
- 9a062f7: web: drop hand-rolled mapKeys for stdlib slices.Collect (Nicholas Santi nicksan222@gmail.com)
- 2f296c2: web: drop newSessionID/newTurnID wrappers, call newRandomID directly (Nicholas Santi nicksan222@gmail.com)
- ae6e10d: web: drop newSessionStore constructor for direct literal (Nicholas Santi nicksan222@gmail.com)
- 74e753d: web: drop redundant 404 message rebuild in htmxTool (Nicholas Santi nicksan222@gmail.com)
- cf54549: web: drop redundant hx-ext=sse on chat form (each bubble declares its own) (Nicholas Santi nicksan222@gmail.com)
- 9026e59: web: drop stale data-final-text reference in chatTurnTmpl doc (Nicholas Santi nicksan222@gmail.com)
- 1068638: web: drop static MaxAge so live reload picks up CSS/JS edits (Nicholas Santi nicksan222@gmail.com)
- abda578: web: drop stringWriter test helper — strings.Builder is already an io.Writer (Nicholas Santi nicksan222@gmail.com)
- 725b016: web: drop unreachable empty-name guards in tool handlers (Nicholas Santi nicksan222@gmail.com)
- 0cb46f3: web: drop unreachable marshal-error branch in writeSSE (Nicholas Santi nicksan222@gmail.com)
- b51947b: web: drop writeSSE empty-body special case (Nicholas Santi nicksan222@gmail.com)
- ed9008e: web: embed static recursively so subdirs are picked up automatically (Nicholas Santi nicksan222@gmail.com)
- 6acce54: web: emit terminating done on pump mid-stream errors (matches pre-stream contract) (Nicholas Santi nicksan222@gmail.com)
- f3a54cc: web: enumerate valid pageData.Active values in the doc (Nicholas Santi nicksan222@gmail.com)
- 14ba6d8: web: expand pageData doc to spell out Title and Active semantics (Nicholas Santi nicksan222@gmail.com)
- 9c40ee2: web: expand routes package doc to reflect chat's multi-file split (Nicholas Santi nicksan222@gmail.com)
- 81a65de: web: explain the defensive copy of sess.history in chatStart (Nicholas Santi nicksan222@gmail.com)
- 61687e3: web: extract ErrorHandler closure to named errorEnvelope func (Nicholas Santi nicksan222@gmail.com)
- 97db75b: web: extract addNonEmpty out of mergeArgs (Nicholas Santi nicksan222@gmail.com)
- 4cdaa66: web: extract htmlError helper for HTMX error branches (Nicholas Santi nicksan222@gmail.com)
- 3dcca2e: web: extract renderChatTurn helper out of chatStart (Nicholas Santi nicksan222@gmail.com)
- beae9fc: web: extract requireHTMLAlert helper for the 5 HTMX-error tests (Nicholas Santi nicksan222@gmail.com)
- 62b6ba2: web: extract requireSSEErrorAndDone helper for the four error paths (Nicholas Santi nicksan222@gmail.com)
- 945a7c2: web: extract setSSEHeaders and pumpStreamEvents from chatStream (Nicholas Santi nicksan222@gmail.com)
- 3a9059c: web: extract toolErrorStatus helper shared by JSON and HTMX surfaces (Nicholas Santi nicksan222@gmail.com)
- 0a87450: web: fix 'couplied' typo in extractTurnID doc (Nicholas Santi nicksan222@gmail.com)
- a575371: web: fix misleading 'Secure exercised separately' comment in cookie test (Nicholas Santi nicksan222@gmail.com)
- 9b97d3c: web: fix stale 'home page' comment on dashboardCard (Nicholas Santi nicksan222@gmail.com)
- bdf92b0: web: fix stale 'must 404' comment on TestChatTurn_idIsSingleUse (Nicholas Santi nicksan222@gmail.com)
- 1a26384: web: format resultTmpl as readable multiline template (Nicholas Santi nicksan222@gmail.com)
- 80fc32a: web: group chat session constants in a single const block (Nicholas Santi nicksan222@gmail.com)
- a7ab35c: web: hide empty asst chat-bubble on stream-error so alert stands alone (Nicholas Santi nicksan222@gmail.com)
- 92dd604: web: htmx 503 returns HTML alert, not JSON envelope (Nicholas Santi nicksan222@gmail.com)
- fac9909: web: keep chat-stream route under api group via composed path consts (Nicholas Santi nicksan222@gmail.com)
- 9d4b8db: web: mark active nav link with aria-current=page (Nicholas Santi nicksan222@gmail.com)
- 382aaff: web: mark chat session cookie Secure when request is HTTPS (Nicholas Santi nicksan222@gmail.com)
- 3557d69: web: move chat tests next to chat_stream.go (Nicholas Santi nicksan222@gmail.com)
- cf89c12: web: move misplaced extractTurnID doc onto the function (Nicholas Santi nicksan222@gmail.com)
- 7daac29: web: move newRandomID to helpers — used by both session and turn (Nicholas Santi nicksan222@gmail.com)
- 7fc7cd8: web: name SSE event-name constants instead of string literals (Nicholas Santi nicksan222@gmail.com)
- f3f152d: web: name chatStreamPathPrefix constant shared by route + template (Nicholas Santi nicksan222@gmail.com)
- 4972b57: web: name chatTurnData type instead of inline anonymous struct (Nicholas Santi nicksan222@gmail.com)
- 27f9357: web: name writeSSEDone helper for done-only emissions (Nicholas Santi nicksan222@gmail.com)
- bf1c02f: web: new package — Fiber + HTMX dashboard over the tool registry (Nicholas Santi nicksan222@gmail.com)
- a8c2225: web: parse JSON error envelope in chat.js so users see prose (Nicholas Santi nicksan222@gmail.com)
- 632095d: web: parse htmx-config JSON in test instead of substring matching (Nicholas Santi nicksan222@gmail.com)
- aef5fd0: web: persist chat cookie via MaxAge so browser restart keeps history (Nicholas Santi nicksan222@gmail.com)
- 6e74641: web: pin chat form's success-only reset and scroll hooks (Nicholas Santi nicksan222@gmail.com)
- dd97cfb: web: pin chat input's Enter-to-submit keydown handler (Nicholas Santi nicksan222@gmail.com)
- b1413a8: web: pin chat page form wiring + htmx-ext-sse script load (Nicholas Santi nicksan222@gmail.com)
- c425695: web: pin chat session cookie security flags via dedicated test (Nicholas Santi nicksan222@gmail.com)
- d10a81e: web: pin dashboard card hx-trigger and hx-swap behaviour (Nicholas Santi nicksan222@gmail.com)
- bd70f8b: web: pin empty-state removal hook on chat form (Nicholas Santi nicksan222@gmail.com)
- e018efe: web: pin meals Today card's hx-get URL alongside the refresh wiring (Nicholas Santi nicksan222@gmail.com)
- 3629b1f: web: pin meals form's hx-post target + refresh-event wiring (Nicholas Santi nicksan222@gmail.com)
- 2000de5: web: pin meals form's hx-target and success-only after-request branches (Nicholas Santi nicksan222@gmail.com)
- 71749e8: web: pre-compute chat cookie MaxAge as a const + concrete-value assertion (Nicholas Santi nicksan222@gmail.com)
- e2bc67c: web: pre-parse page templates at init (Nicholas Santi nicksan222@gmail.com)
- cf22003: web: precise chatTurnTmpl doc on sse-close + error swap target (Nicholas Santi nicksan222@gmail.com)
- 7778ff5: web: promote chatSessionTTL from var to const (Nicholas Santi nicksan222@gmail.com)
- ea547a1: web: pump mid-stream error path calls writeSSEErrorAndDone, not inline pair (Nicholas Santi nicksan222@gmail.com)
- 0f03005: web: rebuild dashboard UI on daisyUI + Tailwind via CDN (Nicholas Santi nicksan222@gmail.com)
- 3b35956: web: refresh package doc for htmx chat split (Nicholas Santi nicksan222@gmail.com)
- 437050f: web: refresh pageChat doc — chat.js is gone (Nicholas Santi nicksan222@gmail.com)
- 3743039: web: refresh setSSEHeaders doc — no more JSON-error fallback path (Nicholas Santi nicksan222@gmail.com)
- e7c00a0: web: refresh stale 404 doc on TestTurnStash_popExpiredReturnsNotFound (Nicholas Santi nicksan222@gmail.com)
- b7794ac: web: reject non-user/assistant roles in chat history (Nicholas Santi nicksan222@gmail.com)
- 3ac93ec: web: rename history loop var to 'prior' for clarity (Nicholas Santi nicksan222@gmail.com)
- 3d9a727: web: rename turnStoreT to turnStash, drop pointless newTurnStore (Nicholas Santi nicksan222@gmail.com)
- 9fd12d9: web: return history snapshot from sessionStore.ensure to fix shared-state race (Nicholas Santi nicksan222@gmail.com)
- 1ec13b5: web: route chat to / and move dashboard to /dashboard (Nicholas Santi nicksan222@gmail.com)
- 1c041b1: web: route htmlAlert through html/template for one escape primitive (Nicholas Santi nicksan222@gmail.com)
- 2f0f70f: web: route tests through chatStreamPathPrefix instead of repeating literal (Nicholas Santi nicksan222@gmail.com)
- c038463: web: simplify TestChatTurn_sessionAccumulates with a runChatTurn helper (Nicholas Santi nicksan222@gmail.com)
- a20fbe4: web: split SSE encoding helpers into chat_sse.go (Nicholas Santi nicksan222@gmail.com)
- cf97b88: web: split chat_turn.go into state and view files (mirroring split test files) (Nicholas Santi nicksan222@gmail.com)
- cf202db: web: split pendingTurn payload from TTL metadata visually (Nicholas Santi nicksan222@gmail.com)
- 3c6cea1: web: split pump-stream tests into chat_sse_test.go to mirror prod split (Nicholas Santi nicksan222@gmail.com)
- 5cbe451: web: surface chat-stream failures as SSE error events, not non-200 responses (Nicholas Santi nicksan222@gmail.com)
- 7ef2166: web: switch renderResultHTML to html/template for safer escaping (Nicholas Santi nicksan222@gmail.com)
- 00ed163: web: synthesize done event when channel closes without it (fixes hang) (Nicholas Santi nicksan222@gmail.com)
- 08ba01d: web: tighten pumpStreamEvents doc — client-disconnect path skips done (Nicholas Santi nicksan222@gmail.com)
- 7a5edbc: web: type SSE payloads instead of per-event map literals (Nicholas Santi nicksan222@gmail.com)
- d552711: web: unit-test buildChatHistory ordering and role allowlist (Nicholas Santi nicksan222@gmail.com)
- 879fa9c: web: unit-test renderChatTurn escape safety and bubble structure (Nicholas Santi nicksan222@gmail.com)
- 54f8219: web: unit-test toolErrorStatus, including unwrap-aware mapping (Nicholas Santi nicksan222@gmail.com)
- 5face6a: web: use Args.All instead of deprecated VisitAll (Nicholas Santi nicksan222@gmail.com)
- 2978439: web: use cmp.Or for the Done final-fallback in pumpStreamEvents (Nicholas Santi nicksan222@gmail.com)
- 38fa150: web: use hx-on:keydown for chat-input enter-submit (consistent with the rest) (Nicholas Santi nicksan222@gmail.com)
- d12b713: web: use named fields in dashboardCards literals (Nicholas Santi nicksan222@gmail.com)
- cecccca: web: use named fields in pageData literals (Nicholas Santi nicksan222@gmail.com)
- 50e9a5f: web: validate page templates define content at init (Nicholas Santi nicksan222@gmail.com)
- 50b59a6: web: vendor htmx-ext-sse for chat streaming (Nicholas Santi nicksan222@gmail.com)
- 07036f5: web: verify first GET streams correctly in idIsSingleUse, not just status (Nicholas Santi nicksan222@gmail.com)
- f19265c: wire registry into cli, tui, and drop hand-rolled commands (Nicholas Santi nicksan222@gmail.com)