@seqyuan/annodex 0.1.89 → 0.1.90
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/app-path-routes-manifest.json +8 -8
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +3 -3
- package/.next/required-server-files.js +1 -1
- package/.next/required-server-files.json +1 -1
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +1 -1
- package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/api/internal/runtime/route.js +1 -1
- package/.next/server/app/api/version/route.js +1 -1
- package/.next/server/app/docs/changelog.html +2 -2
- package/.next/server/app/docs/changelog.rsc +1 -1
- package/.next/server/app/docs/changelog.segments/_full.segment.rsc +1 -1
- package/.next/server/app/docs/changelog.segments/_head.segment.rsc +1 -1
- package/.next/server/app/docs/changelog.segments/_index.segment.rsc +1 -1
- package/.next/server/app/docs/changelog.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/docs/changelog.segments/docs/changelog/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/docs/changelog.segments/docs/changelog.segment.rsc +1 -1
- package/.next/server/app/docs/changelog.segments/docs.segment.rsc +1 -1
- package/.next/server/app/index.html +1 -1
- package/.next/server/app/index.rsc +1 -1
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/login.html +1 -1
- package/.next/server/app/login.rsc +1 -1
- package/.next/server/app/login.segments/_full.segment.rsc +1 -1
- package/.next/server/app/login.segments/_head.segment.rsc +1 -1
- package/.next/server/app/login.segments/_index.segment.rsc +1 -1
- package/.next/server/app/login.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/login.segments/login.segment.rsc +1 -1
- package/.next/server/app/workspace/page.js +2 -2
- package/.next/server/app/workspace/page_client-reference-manifest.js +1 -1
- package/.next/server/app/workspace.html +1 -1
- package/.next/server/app/workspace.rsc +2 -2
- package/.next/server/app/workspace.segments/_full.segment.rsc +2 -2
- package/.next/server/app/workspace.segments/_head.segment.rsc +1 -1
- package/.next/server/app/workspace.segments/_index.segment.rsc +1 -1
- package/.next/server/app/workspace.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/workspace.segments/workspace/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/workspace.segments/workspace.segment.rsc +1 -1
- package/.next/server/app-paths-manifest.json +8 -8
- package/.next/server/chunks/6983.js +1 -1
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/app/workspace/{page-36909d4e71c61d85.js → page-2c593e6c2b9d5950.js} +2 -2
- package/package.json +1 -1
- /package/.next/static/{VPL-m7CM4eSfxm1yRwwxO → SDOFq_E7ojxmkJsbWnwQx}/_buildManifest.js +0 -0
- /package/.next/static/{VPL-m7CM4eSfxm1yRwwxO → SDOFq_E7ojxmkJsbWnwQx}/_ssgManifest.js +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="en" class="__variable_66b8ca"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/7deddc85b7ffd1dc-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/ec14413c594b3356-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/css/6b00dcf032cca328.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/fddca953485158e4.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-0b1e0af2488fca8f.js"/><script src="/_next/static/chunks/4bd1b696-e356ca5ba0218e27.js" async=""></script><script src="/_next/static/chunks/3794-123fdf632563f469.js" async=""></script><script src="/_next/static/chunks/main-app-45a0f19af99d61b6.js" async=""></script><script src="/_next/static/chunks/8500-f62a38ff68ab7f42.js" async=""></script><script src="/_next/static/chunks/4550-eff0bf233a5b0aec.js" async=""></script><script src="/_next/static/chunks/app/layout-2e8a047b671c8731.js" async=""></script><script src="/_next/static/chunks/app/docs/changelog/page-7f8ff3ce79d21000.js" async=""></script><meta name="next-size-adjust" content=""/><title>Changelog</title><meta name="description" content="Release history and changes"/><link rel="shortcut icon" href="/favicon.svg" type="image/svg+xml"/><link rel="icon" href="/favicon.svg" type="image/svg+xml"/><script>(function(){try{var t=localStorage.getItem("annodex-theme");if(t==="dark")document.documentElement.classList.add("dark")}catch(e){}})();</script><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body style="min-height:100dvh;display:flex;flex-direction:column"><div hidden=""><!--$--><!--/$--></div><script>((a,b,c,d,e,f,g,h)=>{let i=document.documentElement,j=["light","dark"];function k(b){var c;(Array.isArray(a)?a:[a]).forEach(a=>{let c="class"===a,d=c&&f?e.map(a=>f[a]||a):e;c?(i.classList.remove(...d),i.classList.add(f&&f[b]?f[b]:b)):i.setAttribute(a,b)}),c=b,h&&j.includes(c)&&(i.style.colorScheme=c)}if(d)k(d);else try{let a=localStorage.getItem(b)||c,d=g&&"system"===a?window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":a;k(d)}catch(a){}})("class","theme","system",null,["light","dark"],null,true,true)</script><!--$--><div class="bg-fd-secondary/50 p-3 empty:hidden"></div><!--/$--><div style="max-width:800px;margin:0 auto;padding:40px 24px 80px"><a style="display:inline-flex;align-items:center;gap:6px;color:var(--color-accent, #3b82f6);text-decoration:none;font-size:14px;margin-bottom:24px" href="/workspace">←<!-- --> Back to <!-- -->annodex</a><div class="changelog-content"><p class="cl-p"><h2 class="cl-h2">0.1.89</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li><strong>SSE transport: EventSource → fetch + ReadableStream</strong> — the browser-side SSE consumer now uses <code class="cl-code">fetch()</code> + <code class="cl-code">ReadableStreamDefaultReader</code> (adapted from CodePilot's pattern) instead of the opaque <code class="cl-code">EventSource</code> API. This eliminates browser-internal SSE buffering that caused mid-output freezes and stale stop buttons. Manual line-by-line parsing gives full control over read timing and buffer sizes.</li><br/><li><strong>Stream lifecycle via <code class="cl-code">createSSEReader</code></strong> — new <code class="cl-code">lib/sse-reader.ts</code> provides a managed <code class="cl-code">fetch</code>+<code class="cl-code">reader</code>+<code class="cl-code">AbortController</code> lifecycle with explicit <code class="cl-code">ConnectionState</code> tracking (<code class="cl-code">idle</code>/<code class="cl-code">connecting</code>/<code class="cl-code">connected</code>/<code class="cl-code">closed</code>/<code class="cl-code">error</code>), on-state-change callback, and abort-based cleanup. Reconnection uses exponential backoff just like the old EventSource path.</li><br/><li><strong>Removed dead <code class="cl-code">recordStreamHeartbeat</code></strong> — the old SSE-comment-based heartbeat path (<code class="cl-code">:\n\n</code>) was superseded by data-event heartbeats in v0.1.88 and is now fully removed.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>No more EventSource buffering stalls — mid-output freezes where the model was still generating but the UI showed a stuck spinner and stale stop button are resolved.</li><br/><li>Abort now cleanly cancels the fetch via <code class="cl-code">AbortController</code>, eliminating the race where the old <code class="cl-code">EventSource.close()</code> could leave partial connections dangling.</li><br/></ul><br/><h2 class="cl-h2">0.1.87</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li><strong>SSE stream freeze</strong> — model replies no longer stall mid-output. Added three-layer defense: (1) client-side idle watchdog detects silent SSE disconnects within 60s and transitions stream to error state, (2) reconcile timer now always fetches full messages so even if <code class="cl-code">agent_end</code> is lost the UI self-heals within 10s, (3) SSE reconnect uses exponential backoff (1s → 30s cap) instead of fixed 1s retry.</li><br/><li><strong>Text rendering smoothness</strong> — text deltas are now throttled at 100ms (per CodePilot pattern), preventing excessive React re-renders during rapid model output that caused visual stuttering and apparent freezes.</li><br/></ul><br/><h2 class="cl-h2">0.1.88</h2></p><p class="cl-p">Three root causes were identified by comparing annodex, CodePilot, hello-halo, and hermes-agent streaming architectures. CodePilot uses fetch + ReadableStream reader (bypassing EventSource buffering), while annodex relied on browser EventSource which has known issues with invisible SSE comment heartbeats and opaque error handling.</p><p class="cl-p"><h3 class="cl-h3">Fixes</h3></p><p class="cl-p"><ul class="cl-ul"><li>Fix SSE stream freeze: when the stream controller is closed (client disconnect / backpressure), the server-side <code class="cl-code">encode</code> function now immediately cleans up the session event listener and heartbeat timer, preventing orphaned resources that caused the UI to appear frozen while the backend continued generating.</li><br/><li>Fix SSE heartbeat invisible to EventSource: the server now sends heartbeats as data events (<code class="cl-code">{"type":"heartbeat"}</code>) instead of SSE comment lines (<code class="cl-code">:\n\n</code>), so the browser's EventSource <code class="cl-code">onmessage</code> handler can see them and reset the client-side idle watchdog.</li><br/><li>Fix idle watchdog not propagating stream errors to React state: the stream-session-manager now has a <code class="cl-code">registerStreamErrorCallback</code> mechanism that the idle watchdog uses to set <code class="cl-code">agentRunning = false</code> in the React layer, so the stop button disappears and the UI correctly shows the connection is dead.</li><br/><li>Fix premature stream timeout: the idle watchdog now considers both <code class="cl-code">lastEventAt</code> and <code class="cl-code">lastHeartbeatAt</code> when deciding whether the stream is dead, so long-running tool executions (>60s) don't trigger false-positive timeouts.</li><br/><li>Heartbeat interval reduced from 30s to 15s for faster dead-connection detection.</li><br/></ul><br/><h2 class="cl-h2">0.1.86</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li><strong>Session loading 500 errors</strong> — sessions whose working directory no longer exists (deleted projects, cleaned temp dirs) no longer trigger HTTP 500. <code class="cl-code">loadCodexSessionContext</code> now bails out early when <code class="cl-code">cwd</code> is missing on disk, avoiding a futile codex app-server spawn that would exceed WebSocket retry/timeout budgets.</li><br/><li><strong>Session route error logging</strong> — <code class="cl-code">GET/PATCH/DELETE /api/sessions/[id]</code> catch blocks now log the actual error with <code class="cl-code">console.error</code>, making future session-load failures diagnosable from the server console.</li><br/></ul><br/><h2 class="cl-h2">0.1.85</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li><strong>IM gateway auto-start</strong> — annodex supervisor now spawns the IM gateway as a managed child process. <code class="cl-code">annodex start</code> automatically runs the gateway in the background; <code class="cl-code">annodex stop</code> cascades to stop it. Logs go to <code class="cl-code">~/.config/annodex/annodex-im-gateway.log</code>.</li><br/><li><strong>Chat attachment file upload</strong> — dropping non-image files (yaml, json, txt, csv, tsv, pdf, docx, xlsx, pptx) into the chat input now uploads them to the project <code class="cl-code">.annodex-uploads/</code> directory and includes the saved path in the message.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li><strong>Audio playback</strong> — reuse a single AudioContext instead of creating new ones per sound; resume suspended context (browser autoplay policy); increase completion sound volume from 0.18 to 0.4.</li><br/><li><strong>Image upload refactor</strong> — deduplicate shared types and helpers into <code class="cl-code">chat-attachment-shared.ts</code>.</li><br/></ul><br/><h2 class="cl-h2">0.1.84</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li><strong>Site build failure</strong> — fix static page generation error <code class="cl-code">/en/changelog</code> caused by passing the raw <code class="cl-code">i18n</code> object (which contains a <code class="cl-code">translations</code> function) to the <code class="cl-code">HomeLayout</code> client component. Removed <code class="cl-code">i18n</code> from <code class="cl-code">baseOptions()</code> since the actual i18n functionality is handled by <code class="cl-code">RootProvider</code> context. Build now completes with all 20 pages.</li><br/></ul><br/><h2 class="cl-h2">0.1.83</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li><strong>Mobile extensions popover</strong> — extensions (plugin) button at the bottom of chat input was clipped off-screen on mobile browsers. Now uses the same mobile sheet style as other dropdowns (model, thinking, tools, slash).</li><br/><li><strong><code class="cl-code">/goal</code> multiline command</strong> — <code class="cl-code">/goal</code> now splits on the first newline: the first line sets the goal objective, and subsequent lines are forwarded as a prompt to the AI. Previously the entire text after <code class="cl-code">/goal</code> was consumed as the objective, leaving no prompt for the AI to respond to, which appeared as an error.</li><br/></ul><br/><h2 class="cl-h2">0.1.82</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li><strong>Session rename</strong> — fix sidebar session rename button that silently failed.</li><br/></ul> The PATCH handler now always creates a dedicated app-server connection instead<br/> of reusing the session's internal connection, which may be dead from idle<br/> timeout (10 min), causing the rename to silently return ok without effect.</p><p class="cl-p"><h2 class="cl-h2">0.1.81</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li><strong>Browser image rendering rollback</strong> — remove the browser-side <code class="cl-code">MEDIA:</code> preview</li><br/></ul> path and restore the previous web UI image rendering behavior: Markdown images,<br/> local path detection, image blocks, and <code class="cl-code">show-widget</code> previews.</p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Avoid unstable web image previews introduced by browser <code class="cl-code">MEDIA:</code> parsing while</li><br/></ul> keeping WeCom IM attachment handling isolated in the IM channel.</p><p class="cl-p"><h2 class="cl-h2">0.1.80</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li><strong>Browser MEDIA: preview loading race</strong> — defer local-image</li><br/></ul> previews until streaming completes, avoiding requests before<br/> the file is fully written.<br/><ul class="cl-ul"><li><strong>MEDIA: tag parsing</strong> — accept relative paths</li><br/></ul> (./output.png, output/plot.png) and quoted paths with spaces<br/> ('plot with space.png') in addition to absolute paths.</p><p class="cl-p"><h2 class="cl-h2">0.1.79</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li><strong>im-gateway npm package</strong> — include <code class="cl-code">lib/im-cancel.js</code> in published <code class="cl-code">files</code></li><br/></ul> (fixes <code class="cl-code">Cannot find module '../lib/im-cancel.js'</code> after <code class="cl-code">npm install -g</code>).<br/><ul class="cl-ul"><li><code class="cl-code">pack:check</code> now requires <code class="cl-code">bin/annodex-im-gateway.js</code>, <code class="cl-code">lib/im-media.js</code>, and</li><br/></ul> <code class="cl-code">lib/im-cancel.js</code> so gateway deps are not omitted again.</p><p class="cl-p"><h2 class="cl-h2">0.1.78</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li><strong>Browser MEDIA: preview</strong> — assistant and tool-result text with <code class="cl-code">MEDIA:/path</code></li><br/></ul> tags now hide the tag line and show inline local image previews (alongside<br/> existing Generative UI / path detection).<br/><ul class="cl-ul"><li><strong>Sidebar [IM] badge</strong> — WeCom IM Codex threads are labeled with a blue</li><br/></ul> <code class="cl-code">[IM]</code> pill; <code class="cl-code">GET /api/im/session-ids</code> + <code class="cl-code">listImSessionIds()</code>.<br/><ul class="cl-ul"><li>Refactor local preview path resolution into <code class="cl-code">lib/local-preview-path.ts</code>.</li><br/><li><strong>Docs (en/zh)</strong> — expanded [Project IM](/docs/im) guide with positioning,</li><br/></ul> dual-channel comparison (Generative UI vs WeCom), pairing flow, MEDIA delivery,<br/> Reset IM thread, and SVG architecture diagrams on the site.</p><p class="cl-p"><h2 class="cl-h2">0.1.77</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li><strong>Reset IM thread</strong> (Settings → Project → WeCom IM): button deletes</li><br/></ul> <code class="cl-code">im-sessions/<sha1(cwd)>.json</code> and stops the in-memory IM session; pairing and bot<br/> settings are kept. Next WeCom message starts a fresh Codex thread.<br/><ul class="cl-ul"><li>New <code class="cl-code">DELETE /api/im/project?cwd=</code> and <code class="cl-code">resetProjectImSession()</code> /</li><br/></ul> <code class="cl-code">clearProjectImSession()</code>.</p><p class="cl-p"><h2 class="cl-h2">0.1.76</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li><strong>IM cancel</strong>: send 取消/停止/cancel (etc.) to abort a running IM turn —</li><br/></ul> <code class="cl-code">POST /api/im/cancel</code>, gateway intercept, and busy-session fallback; strips WeCom<br/> zero-width suffixes when matching cancel commands.<br/><ul class="cl-ul"><li><strong>IM vs browser prompts</strong>: IM Codex threads use <code class="cl-code">channel: "im"</code> — strip browser</li><br/></ul> <code class="cl-code">show-widget</code> system rules and inject <code class="cl-code"><wecom_im_channel></code> once; per-message<br/> <code class="cl-code">buildImPrompt()</code> no longer repeats MEDIA/show-widget guidance (avoids polluting<br/> thread history if the IM session is opened in the browser).<br/><ul class="cl-ul"><li><code class="cl-code">abort</code> clears session busy state so cancel and follow-up turns recover cleanly.</li><br/><li>Docs (en/zh): IM cancel flow and separated system prompt notes.</li><br/></ul><br/><h2 class="cl-h2">0.1.75</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li><strong>Global Toast stack</strong>: <code class="cl-code">ToastProvider</code> in root layout replaces scattered inline error</li><br/></ul> banners across Settings (Projects, Extensions, Tools, Models, Skills), sidebar,<br/> conversation search, file explorer, and composer slash/goal errors.<br/><ul class="cl-ul"><li><strong>Composer input history</strong>: ↑/↓ recalls previous user prompts from the current</li><br/></ul> session (Hermes-style; does not overwrite a non-empty draft).<br/><ul class="cl-ul"><li><strong>Composer message queue</strong>: queue sends while the agent is busy; auto-flush when idle.</li><br/><li><strong>Composer drag-and-drop</strong>: attach files (including common bioinformatics extensions)</li><br/></ul> by dropping onto the input area.<br/><ul class="cl-ul"><li><strong>WeCom IM panel</strong>: gateway status pill (<code class="cl-code">GET /api/im/gateway-status</code>), copy buttons</li><br/></ul> for pairing code and <code class="cl-code">annodex im-gateway</code> command.<br/><ul class="cl-ul"><li>New helpers: <code class="cl-code">lib/composer-input-history.ts</code>, <code class="cl-code">lib/composer-queue.ts</code>,</li><br/></ul> <code class="cl-code">lib/drag-drop-files.ts</code>, <code class="cl-code">lib/im-gateway-status.ts</code>, <code class="cl-code">components/CopyButton.tsx</code>.<br/><ul class="cl-ul"><li>Tests for composer queue, input history, and gateway status.</li><br/></ul><br/><h2 class="cl-h2">0.1.74</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li><strong>WeCom IM — MEDIA: attachments</strong>: gateway parses <code class="cl-code">MEDIA:/path</code> from agent replies,</li><br/></ul> strips tags and <code class="cl-code">show-widget</code> fences from streamed text, uploads images/files via WeCom<br/> <code class="cl-code">aibot_upload_media_*</code>, and sends native attachments after the stream finishes.<br/><ul class="cl-ul"><li><strong>Upload permission fallback</strong>: when the enterprise bot lacks file/image upload rights</li><br/></ul> (or upload fails), a follow-up text message includes the local absolute path; the<br/> bridge caches <code class="cl-code">mediaUploadDisabled</code> to avoid repeated failed uploads.<br/><ul class="cl-ul"><li><strong>IM prompt</strong>: <code class="cl-code">buildImPrompt()</code> instructs the agent to save diagrams as files with</li><br/></ul> <code class="cl-code">MEDIA:</code> tags and plain-text paths (no <code class="cl-code">show-widget</code> in IM).<br/><ul class="cl-ul"><li>New <code class="cl-code">lib/im-media.js</code>, WeCom upload helpers in <code class="cl-code">lib/im-wecom.ts</code> and</li><br/></ul> <code class="cl-code">annodex-im-gateway</code>; docs (en/zh) and <code class="cl-code">tests/im-media.test.mjs</code>.</p><p class="cl-p"><h2 class="cl-h2">0.1.73</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li><strong>Docs site (en/zh)</strong>: FileViewer download API, Extensions simplified UI + Advanced,</li><br/></ul> Model Discover vs manual add, SOUL/HARNESS edit paths, CLI commands (doctor/stop/im-gateway),<br/> web-auth localhost bypass for IM/memory APIs, quick-start CLI helpers, homepage copy sync.</p><p class="cl-p"><h2 class="cl-h2">0.1.72</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li><strong>Default SOUL.md</strong>: replace Spock persona with a neutral global template (working</li><br/></ul> principles, operating parameters, continuity). Existing user files are not overwritten.<br/><ul class="cl-ul"><li><strong>Config path</strong>: <code class="cl-code">getAgentDir()</code> and <code class="cl-code">/api/soul</code> + <code class="cl-code">/api/harness</code> respect</li><br/></ul> <code class="cl-code">ANNODEX_CONFIG_DIR</code> consistently with CLI seed and system prompt injection.<br/><ul class="cl-ul"><li><strong>Docs</strong>: configuration and memory pages document first-start SOUL/HARNESS seeding</li><br/></ul> and per-user config directories.</p><p class="cl-p"><h2 class="cl-h2">0.1.71</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li><strong>Docs — Project IM</strong>: site docs (en/zh) updated for Settings → WeCom IM setup,</li><br/></ul> pairing-first onboarding (send pairing code before agent runs), <code class="cl-code">annodex im-gateway</code><br/> in the same Linux account, streaming replies, and current storage/API paths.<br/><ul class="cl-ul"><li>Related updates in configuration, usage, and homepage feature copy.</li><br/></ul><br/><h2 class="cl-h2">0.1.70</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li><strong>File download</strong>: Download button in FileViewer toolbars (text, image, audio, PDF,</li><br/></ul> DOCX, XLSX, PPTX). <code class="cl-code">GET /api/files/{path}?type=download</code> streams the original file<br/> with <code class="cl-code">Content-Disposition: attachment</code> (500MB cap).<br/><ul class="cl-ul"><li><strong>Extensions settings</strong>: simpler default panel (name, description, project/chat toggles)</li><br/></ul> with <strong>Advanced</strong> collapse for ID, transport, scope, and MCP install details.<br/><ul class="cl-ul"><li><strong>WeCom IM settings</strong>: prominent enable switch; config fields only when enabled;</li><br/></ul> updated gateway hint; <strong>Save IM settings</strong> as primary action button.<br/><ul class="cl-ul"><li><strong>Model Discover</strong>: infer reasoning/image flags from model metadata on Discover;</li><br/></ul> manual model add keeps thinking/image unchecked by default.</p><p class="cl-p"><h2 class="cl-h2">0.1.69</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li><strong>WeCom IM streaming replies</strong>: <code class="cl-code">POST /api/im/turn</code> with <code class="cl-code">Accept: text/event-stream</code></li><br/></ul> (or <code class="cl-code">?stream=1</code>) streams <code class="cl-code">status</code>, <code class="cl-code">delta</code>, and <code class="cl-code">done</code> events while the agent runs.<br/><ul class="cl-ul"><li><code class="cl-code">annodex-im-gateway</code> consumes the SSE turn stream and pushes partial text to WeCom</li><br/></ul> with a fixed <code class="cl-code">streamId</code> (<code class="cl-code">finish: false</code> during stream, <code class="cl-code">finish: true</code> on completion).<br/><ul class="cl-ul"><li>Tool-running phases still show <code class="cl-code">(working Ns)</code>; assistant text streams with 300ms throttle.</li><br/><li>Sync JSON <code class="cl-code">/api/im/turn</code> kept for tests and curl.</li><br/><li>New <code class="cl-code">annodex im-gateway</code> CLI subcommand (same user's <code class="cl-code">~/.config/annodex</code>).</li><br/><li>Web-auth: localhost requests to <code class="cl-code">/api/im/*</code> and <code class="cl-code">/api/memory/*</code> bypass login so the</li><br/></ul> IM gateway and memory MCP sidecars work when password auth is enabled.</p><p class="cl-p"><h2 class="cl-h2">0.1.68</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li><strong>Multi-user IM gateway</strong>: bot secrets are served over <code class="cl-code">GET /api/im/projects</code> from</li><br/></ul> the annodex server; gateway no longer reads local <code class="cl-code">im-secrets/</code> files.<br/><ul class="cl-ul"><li>New <code class="cl-code">GET /api/im/gateway-token</code> (localhost only): sync gateway token and warn when</li><br/></ul> <code class="cl-code">ANNODEX_CONFIG_DIR</code> differs from the annodex server.<br/><ul class="cl-ul"><li><code class="cl-code">annodex-im-gateway</code>: clearer 401/403 errors; startup token sync; tolerate</li><br/></ul> unwritable <code class="cl-code">im-gateway.json</code> with a helpful message.<br/><ul class="cl-ul"><li>Docs (en/zh) and <strong>Settings → Project → WeCom IM</strong>: multi-account /</li><br/></ul> <code class="cl-code">ANNODEX_CONFIG_DIR</code> guidance.</p><p class="cl-p"><h2 class="cl-h2">0.1.67</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li><code class="cl-code">annodex stop</code>: scan and terminate orphaned <strong>codex app-server</strong> processes left</li><br/></ul> after the Next.js server exits (Linux process-group kill when available).<br/><ul class="cl-ul"><li><code class="cl-code">annodex stop</code> does <strong>not</strong> stop <code class="cl-code">annodex-im-gateway</code>; IM sidecar can stay running</li><br/></ul> while annodex is restarted separately.<br/><ul class="cl-ul"><li><code class="cl-code">annodex doctor</code>: recommend cleaning orphaned codex app-server processes; note</li><br/></ul> when IM gateway is up but annodex is stopped.<br/><ul class="cl-ul"><li><code class="cl-code">annodex-im-gateway</code>: log clearer errors when <code class="cl-code">/api/im/turn</code> fails.</li><br/></ul><br/><h2 class="cl-h2">0.1.66</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li>README and docs site (en/zh): align project switcher, IM settings path, and mobile</li><br/></ul> Extensions wording with the v0.1.65 workspace UI.<br/><ul class="cl-ul"><li>Homepage feature copy (<code class="cl-code">home-i18n</code>) updated for pinned sidebar folders and</li><br/></ul> <strong>Settings → Project → WeCom IM</strong>.</p><p class="cl-p"><h2 class="cl-h2">0.1.65</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li>Sidebar project layout: pinned projects appear as expandable folders with chat</li><br/></ul> history; unpinned projects list in the switcher dropdown; the active unpinned<br/> project shows as a temporary sidebar folder while selected.<br/><ul class="cl-ul"><li>Project IM (WeCom): moved from Tools to <strong>Settings → Project</strong> with a per-project</li><br/></ul> <strong>WeCom IM</strong> expand control.<br/><ul class="cl-ul"><li>Chat UI: remove the per-session “Enabled extensions for this session” banner;</li><br/></ul> extension toggles remain in the input bar.<br/><ul class="cl-ul"><li>Mobile chat input: Extensions control shows icon only (count in tooltip).</li><br/></ul><br/><h2 class="cl-h2">0.1.64</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li>Docs site i18n: English and Chinese (<code class="cl-code">/docs</code> and <code class="cl-code">/zh/docs</code>) with Fumadocs</li><br/></ul> language switcher and locale-aware navigation.<br/><ul class="cl-ul"><li>New documentation pages: [Project Memory](/docs/memory) and</li><br/></ul> [Project IM (WeCom)](/docs/im) in both languages.<br/><ul class="cl-ul"><li>Homepage, usage, and configuration docs updated for memory, IM, project</li><br/></ul> switcher, and writable <code class="cl-code">$HOME</code> / <code class="cl-code">ANNODEX_CONFIG_DIR</code> guidance.</p><p class="cl-p"><h2 class="cl-h2">0.1.63</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li>Per-project WeCom IM gateway (v1): optional one bot per project cwd via</li><br/></ul> <code class="cl-code">annodex-im-gateway</code> sidecar and <code class="cl-code">{cwd}/.annodex/im.json</code> config.<br/><ul class="cl-ul"><li>IM APIs: <code class="cl-code">GET/PUT /api/im/project</code>, <code class="cl-code">GET /api/im/projects</code>, <code class="cl-code">POST /api/im/turn</code></li><br/></ul> for gateway integration and synchronous IM replies.<br/><ul class="cl-ul"><li>Tools panel <strong>Project IM</strong> section: enable bot, bot credentials, pairing code,</li><br/></ul> allowlist, and group-chat options (UI-only config, no CLI).<br/><ul class="cl-ul"><li>WeCom pairing: users send project pairing code in IM to join <code class="cl-code">allowedUsers</code>;</li><br/></ul> multi-user allowlist supported with one shared IM Codex thread per project.<br/><ul class="cl-ul"><li>IM unit tests cover config, auth, WeCom message parsing, and simulated IM</li><br/></ul> agent sessions with mocked Codex wrapper.</p><p class="cl-p"><h2 class="cl-h2">0.1.62</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li>Phase 1 project memory: JSONL working store at</li><br/></ul> <code class="cl-code">~/.config/annodex/memory/<sha1(cwd)>/entries.jsonl</code> with retain, recall, and<br/> reflect via the <code class="cl-code">annodex-memory-mcp</code> stdio MCP server.<br/><ul class="cl-ul"><li>Promote working-memory candidates to project <code class="cl-code">MEMORY.md</code> or <code class="cl-code">CONTEXT.md</code> from</li><br/></ul> the Tools panel or <code class="cl-code">POST /api/memory/promote</code>.<br/><ul class="cl-ul"><li>System prompt injects <code class="cl-code">CONTEXT.md</code> alongside <code class="cl-code">MEMORY.md</code>; <code class="cl-code">buildSystemPrompt()</code></li><br/></ul> uses shared context-file wrappers.<br/><ul class="cl-ul"><li>Tools panel shows memory stats, promotion candidates, and recent entries for</li><br/></ul> the active project.<br/><ul class="cl-ul"><li><code class="cl-code">annodex-memory</code> extension preset in Settings → Extensions; auto-registered in</li><br/></ul> <code class="cl-code">extensions.json</code> on first session start.<br/><ul class="cl-ul"><li>README and docs site: writable <code class="cl-code">$HOME</code> / <code class="cl-code">ANNODEX_CONFIG_DIR</code>, project</li><br/></ul> switcher, extensions, and storage layout.</p><p class="cl-p"><h2 class="cl-h2">0.1.61</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Settings Extensions tab: clip long extension names, IDs, and transport commands</li><br/></ul> in the sidebar list so text no longer overflows into the details panel; form<br/> controls and discovery cards use consistent width constraints and ellipsis.</p><p class="cl-p"><h2 class="cl-h2">0.1.60</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li>Sidebar project switcher: replace the multi-project PROJECTS channel with a</li><br/></ul> compact dropdown (pi-web style); session list shows the current project only.<br/><ul class="cl-ul"><li>Pin visibility: switcher lists pinned projects plus the active cwd; unpinned</li><br/></ul> projects disappear when you switch away unless explicitly pinned.<br/><ul class="cl-ul"><li>Add project from the switcher dropdown via the existing folder browse dialog</li><br/></ul> (sidebar Add button removed).<br/><ul class="cl-ul"><li>Drag reorder pinned projects in the switcher dropdown; order persists in the</li><br/></ul> project registry.</p><p class="cl-p"><h2 class="cl-h2">0.1.59</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li>Chat image uploads: pasted images save to <code class="cl-code">{cwd}/.annodex-uploads/</code> via</li><br/></ul> <code class="cl-code">POST /api/images/upload</code>; prompts send <code class="cl-code">localImage</code> paths plus vision data<br/> URLs instead of large inline base64 bodies.<br/><ul class="cl-ul"><li>User messages show path appendix (<code class="cl-code">[User attached image N: /path (name)]</code>) and</li><br/></ul> thumbnails load from disk through <code class="cl-code">/api/files/...?type=read</code>.<br/><ul class="cl-ul"><li>Session history restores images from Codex <code class="cl-code">localImage</code> inputs after reload.</li><br/></ul><br/><h2 class="cl-h2">0.1.58</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li>Codex native <code class="cl-code">/goal</code>: slash command calls <code class="cl-code">thread/goal/set|get|clear</code> instead of</li><br/></ul> inserting a prompt template; <code class="cl-code">ThreadGoalPanel</code> shows objective, status, token/time<br/> progress; goal state loads on session open and updates via SSE.<br/><ul class="cl-ul"><li>Subagent UI: top-right button shows only while subagent runs are active; panel</li><br/></ul> auto-closes when all runs finish.</p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Subagent status merge prefers terminal states (failed/completed) over stale</li><br/></ul> <code class="cl-code">running</code>; dedupe by <code class="cl-code">threadId</code>; unknown Codex statuses default to <code class="cl-code">paused</code>.<br/><ul class="cl-ul"><li>Idle session load finalizes in-flight subagent runs so historical sessions no</li><br/></ul> longer show a stuck active badge after failures.<br/><ul class="cl-ul"><li>Clear subagent state immediately when switching sessions.</li><br/></ul><br/><h2 class="cl-h2">0.1.57</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li>Stream session manager (<code class="cl-code">lib/stream-session-manager.ts</code>): client-side snapshot</li><br/></ul> accumulator survives React remounts and SSE reconnects; thinking phases, tool<br/> calls, and text merge in one place instead of local reducers.<br/><ul class="cl-ul"><li>Session reader: merge reasoning, tool calls, and text within a Codex turn into</li><br/></ul> one assistant message (with paired toolResult rows) for cleaner history after<br/> reload.<br/><ul class="cl-ul"><li>Waiting UX: <code class="cl-code">StreamingStatusBar</code> shows live elapsed seconds and real runtime</li><br/></ul> phase; time-phased labels during the pre-first-token gap; ProcessPanel<br/> waiting shell appears immediately on send.<br/><ul class="cl-ul"><li>Send flow: optimistic running state and stream shell start before SSE connect;</li><br/></ul> running reconcile no longer replaces messages mid-turn.</p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Remove <code class="cl-code">message_end</code> mid-turn append; canonical state comes from <code class="cl-code">agent_end</code></li><br/></ul> reconcile only, reducing duplicate assistant replies.<br/><ul class="cl-ul"><li>Optimistic user message dedup via <code class="cl-code">pendingOptimisticUserRef</code> and merge on</li><br/></ul> reload, fixing duplicate user bubbles after send.<br/><ul class="cl-ul"><li>Streaming UI: thinking/tools render only in ProcessPanel during live turns,</li><br/></ul> not inline twice.</p><p class="cl-p"><h2 class="cl-h2">0.1.56</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>macos-codex-security.js: needsRepairBeforeSpawn now also checks</li><br/></ul> spctl --assess (5s timeout) after codesign --verify passes.<br/> codesign may report 'valid on disk' even when spctl detects<br/> CSSMERR_TP_CERT_REVOKED — only spctl checks Apple's revocation DB.<br/> This makes auto-repair work on first spawn after npm update,<br/> eliminating the need for manual <code class="cl-code">annodex doctor --repair</code>.<br/><ul class="cl-ul"><li>macos-codex-security.js: spctl timeout now treated as needing repair.</li><br/></ul> A valid cert should return quickly; a slow response usually means the<br/> revocation check is happening against a revoked cert. Worst case:<br/> unnecessary ad-hoc re-sign, which is harmless.</p><p class="cl-p"><h2 class="cl-h2">0.1.55</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>codex-server.ts: resolveCodexNativeBinary now searches annodex's own</li><br/></ul> node_modules (join(__dirname, '..', 'node_modules')), fixing the path<br/> mismatch where the doctor repaired the native binary but spawn used a<br/> JS shim (node_modules/.bin/codex). The shim→native grandchild exec<br/> triggered macOS Gatekeeper SIGKILL even after repair.<br/><ul class="cl-ul"><li>macos-codex-security.js: prepareMacOSCodexForSpawn now resolves the</li><br/></ul> underlying native binary when given a JS shim path, and repairs that<br/> binary directly. Added resolveNativeBinaryFromShim() helper.</p><p class="cl-p"><h2 class="cl-h2">0.1.54</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li>macOS: ad-hoc codesign repair for revoked codex Developer ID certificate</li><br/></ul> (CSSMERR_TP_CERT_REVOKED). New <code class="cl-code">lib/macos-codex-security.js</code> strips revoked<br/> signatures and applies <code class="cl-code">codesign --force --sign -</code> before spawn, following<br/> the hermes-agent recovery pattern.<br/><ul class="cl-ul"><li>doctor: add <code class="cl-code">--repair</code> mode for deep quarantine clear and ad-hoc signing.</li><br/></ul> Add <code class="cl-code">codesign verify</code> output alongside <code class="cl-code">spctl</code> for dual diagnostic view.<br/> Warn when repo/runtime is inside macOS protected folders (Desktop, Documents,<br/> Downloads, iCloud Drive).<br/><ul class="cl-ul"><li>next.config.ts: allow <code class="cl-code">127.0.0.1</code> and <code class="cl-code">localhost</code> in <code class="cl-code">allowedDevOrigins</code> for</li><br/></ul> Next.js 16 HMR compatibility.</p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>codex-server.ts: removed inline <code class="cl-code">clearMacOSQuarantine()</code> which performed</li><br/></ul> slow recursive xattr on every spawn. Replaced with fast <code class="cl-code">prepareMacOSCodexForSpawn</code><br/> that only validates the codex binary signature (3s timeout, no spctl).<br/><ul class="cl-ul"><li>Hot path no longer calls <code class="cl-code">spctl --assess</code> or recursive xattr, eliminating</li><br/></ul> 20-80s stalls on macOS with large Documents folders.</p><p class="cl-p"><h2 class="cl-h2">0.1.53</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li>macOS: default transport switched from WebSocket to stdio (matching</li><br/></ul> Windows), removing the network-server code path that triggered hardened<br/> runtime entitlement checks and Gatekeeper reinforcement on Apple Silicon.<br/><ul class="cl-ul"><li>macOS: child process no longer spawned with <code class="cl-code">detached: true</code>, matching</li><br/></ul> hello-halo's proven spawning strategy. Combined with the stdio transport<br/> change, this avoids the session-leader security path that Gatekeeper may<br/> flag.<br/><ul class="cl-ul"><li>macOS: <code class="cl-code">clearMacOSQuarantine()</code> now also runs <code class="cl-code">spctl --assess</code> on the</li><br/></ul> resolved native binary and attempts <code class="cl-code">spctl --add</code> if the assessment is<br/> not accepted, providing an additional approval layer beyond <code class="cl-code">xattr -cr</code>.<br/><ul class="cl-ul"><li>Direct native binary spawn: <code class="cl-code">resolveCodexNativeBinary()</code> resolves the</li><br/></ul> vendored codex binary (bypassing the JS shim) to avoid the grandchild<br/> process hop that Gatekeeper intercepts even when quarantine is cleared.<br/><ul class="cl-ul"><li>Added <code class="cl-code">/docs/changelog</code> page that renders CHANGELOG.md in the annodex UI.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>macOS: corrected kill-on-close logic to use process-group kill only on</li><br/></ul> Linux (where detached is still true), preventing accidental signal<br/> propagation to annodex's own process group on macOS.<br/><ul class="cl-ul"><li>macOS: improved Gatekeeper diagnostic message with <code class="cl-code">spctl --add</code> and</li><br/></ul> manual Terminal-approval workaround instructions.</p><p class="cl-p"><h1 class="cl-h1">Changelog</h1></p><p class="cl-p"><h2 class="cl-h2">0.1.52</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>macOS: <code class="cl-code">clearMacOSQuarantine()</code> now targets the entire <code class="cl-code">@openai/codex</code> package</li><br/></ul> tree and the npm bin shim with <code class="cl-code">xattr -cr</code> (recursive clear-all), not just<br/> the vendored native binary. This resolves cases where macOS Gatekeeper/XProtect<br/> killed the process even after <code class="cl-code">com.apple.quarantine</code> was removed from the<br/> vendored binary alone.<br/><ul class="cl-ul"><li>macOS: improved the Gatekeeper kill diagnostic message with a one-liner</li><br/></ul> <code class="cl-code">xattr -cr</code> fix command.</p><p class="cl-p"><h2 class="cl-h2">0.1.51</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li>macOS: <code class="cl-code">lib/codex-server.ts</code> now automatically clears the <code class="cl-code">com.apple.quarantine</code></li><br/></ul> extended attribute from vendored codex native binaries before spawning the<br/> app-server, preventing silent Gatekeeper/XProtect kills that caused "No agent<br/> runtime is active" on macOS.<br/><ul class="cl-ul"><li>macOS: improved <code class="cl-code">proc.on("exit")</code> diagnostics — when the codex process is</li><br/></ul> killed by a signal, the server log now includes a macOS Gatekeeper hint with<br/> manual fix instructions.</p><p class="cl-p"><h2 class="cl-h2">0.1.50</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Ignored local <code class="cl-code">tmp/</code> protocol scratch files and the uncurated site image <code class="cl-code">site/public/images/搜索框传播样式-白色版.png</code> so they no longer pollute the release worktree or get staged by accident.</li><br/></ul><br/><h2 class="cl-h2">0.1.49</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Finalized in-flight subagent runs when a turn ends or the user aborts, so the Subagent panel no longer leaves stale <code class="cl-code">running</code> / <code class="cl-code">pending</code> entries hanging after cancellation or failure.</li><br/></ul><br/><h2 class="cl-h2">0.1.48</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li>Added first-pass Extensions management in Settings and chat, including per-session extension visibility and toggles for enabled vs available extensions.</li><br/><li>Added a browser-use extension testing checklist at <code class="cl-code">docs/browser-use-extension-test-plan.md</code> to document the minimum end-to-end validation flow.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Synced saved enabled MCP extensions into the Codex MCP registry on save so newly configured servers can be discovered by runtime sessions without extra manual registration.</li><br/></ul><br/><h2 class="cl-h2">0.1.47</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li>Added a WeChat follow card on the website homepage pointing users to the <code class="cl-code">seqyuan</code>公众号 for updated annodex tutorials and Windows setup guidance.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Sidebar: increased project/chat loading timeout from 15s to 30s and converted abort/timeout failures into friendly retry messages, reducing macOS <code class="cl-code">AbortError: signal is aborted without reason</code> reports during slow Codex startup.</li><br/><li>Skills: made skill path validation cross-platform by replacing hard-coded POSIX <code class="cl-code">/.codex/skills/</code> checks with normalized path resolution, fixing Windows skill search/install follow-up operations against user and project <code class="cl-code">.codex/skills</code> directories.</li><br/></ul><br/><h2 class="cl-h2">0.1.46</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li>Expanded the website quick start with detailed Windows Miniforge installation, Codex initialization, Annodex launch, and DeepSeek model setup steps.</li><br/><li>Added a screenshot-based Usage Guide covering model configuration, skills, file preview, runtime monitoring, and mobile browser usage.</li><br/><li>Added product screenshots to the homepage and documentation overview.</li><br/><li>Documented platform app-server transport defaults and added startup logging for the selected Codex app-server transport.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Ensured website documentation references tracked screenshot assets so published docs render images correctly.</li><br/></ul><br/><h2 class="cl-h2">0.1.45</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li>Added a wildcard Codex app-server notification hook so annodex can normalize all incoming app-server events consistently across WebSocket and stdio transports.</li><br/><li>Added optional Codex event diagnostics with ANNODEX_CODEX_EVENT_LOG=1.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Improved streaming output by lazily starting assistant rendering when text deltas arrive before turn or item lifecycle events.</li><br/><li>Added streaming support for Codex reasoning text and reasoning summary deltas.</li><br/><li>Avoided treating completed agent messages as new streamed content when deltas were already received, while preserving completed-message fallback when no deltas arrive.</li><br/></ul><br/><h2 class="cl-h2">0.1.44</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li>Added dual Codex app-server transports: existing WebSocket mode and a new stdio JSON-RPC mode.</li><br/><li>Windows now defaults to stdio transport, while macOS/Linux keep the existing WebSocket transport.</li><br/><li>Added ANNODEX_CODEX_TRANSPORT=ws|stdio|auto override for transport selection.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Improved Windows compatibility by avoiding local port/listener readiness issues that can leave chats stuck loading or turns stalled.</li><br/><li>Codex server registry keys now include transport mode so WebSocket and stdio app-server instances are not accidentally reused across modes.</li><br/></ul><br/><h2 class="cl-h2">0.1.43</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Windows: completed the Codex app-server JSON-RPC handshake by sending the required <code class="cl-code">initialized</code> notification immediately after <code class="cl-code">initialize</code>, matching CodePilot/hello-halo and fixing cases where sidebar chat loading, thread start/resume, and agent replies could stall.</li><br/><li>Sessions: added a 12-second timeout fallback for workspace <code class="cl-code">thread/list</code> loading so the sidebar no longer stays on "Loading chats..." indefinitely when the workspace app-server is stuck; it falls back to local session summaries instead.</li><br/></ul><br/><h2 class="cl-h2">0.1.42</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li>Sidebar: renamed project section label from "Threads" to "Projects".</li><br/><li>Sidebar: removed the "drag to sort, pin to top" hint next to the project label.</li><br/></ul><br/><h2 class="cl-h2">0.1.41</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li>Simplified <code class="cl-code">annodex passwd</code>: terminal access now grants password-reset permission. No old password prompt, single new-password entry. Empty input disables auth. <code class="cl-code">--reset</code> still works as a silent alias for backward compatibility.</li><br/><li>Simplified <code class="cl-code">promptPassword()</code> (first-run setup) to match the single-entry flow.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Windows: <code class="cl-code">.cmd</code>/<code class="cl-code">.bat</code> shim binaries (e.g. <code class="cl-code">codex.cmd</code>) now launch through <code class="cl-code">cmd.exe /d /s /c</code> with <code class="cl-code">windowsVerbatimArguments</code>, matching CodePilot's <code class="cl-code">buildCodexLaunch()</code> pattern. Fixes spawn failures when the codex binary is an npm-installed shim in a path with spaces.</li><br/><li>Windows: <code class="cl-code">findListeningPids()</code> now uses <code class="cl-code">Get-NetTCPConnection</code> (PowerShell) primary and <code class="cl-code">netstat</code> fallback for port detection, replacing the previous blank <code class="cl-code">return []</code> on win32.</li><br/><li>Windows: <code class="cl-code">readProcessCmdline()</code> now supports win32 via <code class="cl-code">Get-CimInstance</code> / <code class="cl-code">wmic</code> fallback.</li><br/></ul></p><p class="cl-p"><h2 class="cl-h2">0.1.40</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Fixed <code class="cl-code">codex</code> CLI not found (<code class="cl-code">ENOENT</code>) on Windows: <code class="cl-code">getCodexExecutablePath()</code> now searches for <code class="cl-code">codex.cmd</code> and <code class="cl-code">codex.exe</code> in addition to <code class="cl-code">codex</code>, scans the global npm <code class="cl-code">node_modules/.bin</code> directory, and uses <code class="cl-code">__dirname</code>-relative lookup for globally-installed annodex. Connection failure errors now include a clear hint about the missing binary path.</li><br/></ul><br/><h2 class="cl-h2">0.1.39</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li><code class="cl-code">handleSend</code> no longer removes the user's message on failure — the message stays visible and a descriptive "Send failed: …" error is shown, making it obvious when an agent request fails instead of silently flashing the message away.</li><br/></ul><br/><h2 class="cl-h2">0.1.38</h2></p><p class="cl-p"><h3 class="cl-h3">Improvements</h3><br/><ul class="cl-ul"><li>Preset providers (DeepSeek, Moonshot AI, Zhipu, MiniMax) now auto-discover models from the provider's API (<code class="cl-code">/v1/models</code>) after entering an API key, instead of using a static preset model list. Falls back to preset models if the API is unreachable.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Added 15-second fetch timeout to <code class="cl-code">loadSessionsForCwd</code> and <code class="cl-code">loadProjects</code> in the sidebar, preventing permanent "Loading chats…" hang on slow or blocked network connections.</li><br/></ul><br/><h2 class="cl-h2">0.1.37</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Fixed constant screen flickering on Windows caused by <code class="cl-code">router.replace("/")</code> navigating away from <code class="cl-code">/workspace</code> and triggering a <code class="cl-code">redirect</code> → remount loop in <code class="cl-code">AppShell</code>. Three <code class="cl-code">handleCwdChange</code> / <code class="cl-code">handleNewSession</code> / <code class="cl-code">handleSessionDeleted</code> paths now use <code class="cl-code">/workspace</code> instead of <code class="cl-code">/</code>.</li><br/></ul><br/><h2 class="cl-h2">0.1.36</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Removed the tracked <code class="cl-code">presentation/</code> publishing assets and root <code class="cl-code">.source/</code> generated files from the Git repository so release secret scanning no longer flags embedded cookies or tokens.</li><br/><li>Removed the obsolete root Fumadocs MDX build hook from the main app, fixing release <code class="cl-code">npm-publish</code> builds that failed on <code class="cl-code">source.config.ts</code> externalization.</li><br/></ul><br/><h2 class="cl-h2">0.1.35</h2></p><p class="cl-p"><h3 class="cl-h3">Improvements</h3><br/><ul class="cl-ul"><li>Refined the mobile chat input sheet interactions so phone users can reach composer actions more reliably without dialog overlays blocking taps near the bottom edge.</li><br/><li>Added built-in provider presets for DeepSeek, Moonshot AI, Zhipu AI, MiniMax, and OpenRouter to speed up API-key-based model setup.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Changed provider preset insertion in the Models dialog to update only the local draft until Save, preventing unsaved provider edits from being clobbered.</li><br/><li>Allowed writable annodex provider entries to override same-id read-only Codex providers from merged config.</li><br/><li>Switched the OpenRouter preset default protocol to OpenAI Responses for correct out-of-box behavior.</li><br/></ul><br/><h2 class="cl-h2">0.1.34</h2></p><p class="cl-p"><h3 class="cl-h3">New</h3><br/><ul class="cl-ul"><li>Added presentation assets for annodex product introduction: HyperFrames HTML composition with 6-scene Chinese narration, TTS audio, and CSS-rendered virtual UI showcasing the browser-based AI workspace experience.</li><br/><li>Added WeChat official account promotional article (<code class="cl-code">presentation/wechat_article.md</code>) targeting bioinformatics researchers.</li><br/><li>Added automated Xiaohongshu (RED) publishing scripts using Selenium/Playwright for one-click note posting with Firefox login session reuse.</li><br/></ul><br/><h3 class="cl-h3">Documentation</h3><br/><ul class="cl-ul"><li>Updated product messaging across presentation and promotion materials: unified URL to <code class="cl-code">annodex.seqyuan.cn</code>, refined value proposition around eliminating ChatGPT/VPN barriers, DeepSeek API format bridging, and bioinformatics-specific generative UI.</li><br/></ul><br/><h2 class="cl-h2">0.1.33</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li>Simplified the root app back to the local workspace role: <code class="cl-code">/</code> now redirects to <code class="cl-code">/workspace</code>, while the standalone <code class="cl-code">site/</code> subproject remains the only public-facing docs/marketing surface.</li><br/></ul><br/><h3 class="cl-h3">Maintenance</h3><br/><ul class="cl-ul"><li>Removed the duplicated root-app docs route, root MDX loader chain, and mirrored <code class="cl-code">content/docs</code> sources that were superseded by <code class="cl-code">site/</code>.</li><br/><li>Updated lint ignores so <code class="cl-code">site/.next</code> and <code class="cl-code">site/.source</code> generated files do not pollute root-repo lint results.</li><br/></ul><br/><h2 class="cl-h2">0.1.32</h2></p><p class="cl-p"><h3 class="cl-h3">Improvements</h3><br/><ul class="cl-ul"><li>Added a standalone <code class="cl-code">site/</code> public documentation subproject so Vercel can deploy the explanation site without exposing the main local workspace app, APIs, or <code class="cl-code">/workspace</code> route.</li><br/><li>Reframed the public-site copy and docs to make the local/LAN product boundary explicit: the hosted site is documentation only, while annodex itself remains a local-first browser workspace.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Restored historical message timestamps by hydrating chat history from local Codex session JSONL records instead of assigning the entire loaded thread the same <code class="cl-code">updatedAt</code> time.</li><br/></ul><br/><h2 class="cl-h2">0.1.31</h2></p><p class="cl-p"><h3 class="cl-h3">Improvements</h3><br/><ul class="cl-ul"><li>Added presentation copy and helper scripts for rendering or manually publishing the annodex promo deck and Xiaohongshu post assets.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Normalized assistant messages that arrive as plain strings so the session UI still renders them as text blocks instead of dropping their content.</li><br/><li>Removed outdated public/open-source wording from the presentation deck so the promo materials match the current annodex positioning and repository visibility.</li><br/></ul><br/><h2 class="cl-h2">0.1.30</h2></p><p class="cl-p"><h3 class="cl-h3">Improvements</h3><br/><ul class="cl-ul"><li>Added a public-facing landing page and documentation section so annodex now has a clearer project website instead of dropping users directly into the workspace UI.</li><br/><li>Added a dedicated <code class="cl-code">/workspace</code> route for the actual working interface, keeping the browser workspace accessible while allowing <code class="cl-code">/</code> and <code class="cl-code">/docs</code> to serve as product-facing entry points.</li><br/><li>Expanded the documentation set with quick start, installation, configuration, architecture, runtime, and workspace guides aligned to the current annodex product surface.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Corrected project-site and docs copy to reflect the current product structure, including the workspace entry path and the removal of the old Report tab terminology.</li><br/><li>Excluded generated Fumadocs <code class="cl-code">.source/</code> files from linting and git noise, while keeping the authored docs content tracked in the repository.</li><br/></ul><br/><h2 class="cl-h2">0.1.29</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Switched the mobile composer overflow menu outside-click handling to <code class="cl-code">pointerdown</code> with <code class="cl-code">mousedown</code> fallback, so tapping the three-dot button on phones reliably opens the More menu.</li><br/></ul><br/><h2 class="cl-h2">0.1.28</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Cleared the server-side prompt busy state as soon as an <code class="cl-code">agent_end</code> event arrives, so completed assistant replies no longer leave the composer stuck showing the red Stop button.</li><br/></ul><br/><h2 class="cl-h2">0.1.27</h2></p><p class="cl-p"><h3 class="cl-h3">Improvements</h3><br/><ul class="cl-ul"><li>Expanded project/session loading to prefer complete Codex thread metadata, so project chat counts and expanded project histories can reflect the full set of chats instead of only local cache fragments.</li><br/><li>Added per-project chat count display in the left sidebar and a recent-project chat count fallback, making project activity easier to scan without opening every thread.</li><br/><li>Improved chat runtime visibility with a live Working panel, elapsed-seconds label, periodic reconcile while sessions are running, and default full-access sandbox mode for new or resumed chats when configured.</li><br/><li>Tightened mobile chat UX: the minimap and subagent overlays stay out of the way on phones, the composer is more compact and sticky, and the final messages now keep enough bottom space above the mobile input bar.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Restored assistant timestamp rendering after replies finish so completed AI messages keep their visible time markers.</li><br/><li>Hardened client refresh behavior with more reliable streaming/reconcile updates, reducing cases where users had to manually refresh the page to see the assistant reply.</li><br/></ul><br/><h2 class="cl-h2">0.1.25</h2></p><p class="cl-p"><h3 class="cl-h3">Improvements</h3><br/><ul class="cl-ul"><li>Reworked the chat message surface with a live process panel that keeps tool calls, thinking blocks, and runtime status visible while a Codex session is running.</li><br/><li>Added floating preview windows for images and PDFs, including gallery navigation for generated image groups, so visual files no longer need to occupy right-panel tabs.</li><br/><li>Expanded the chat input toolbar with a slash-command menu and practical prompt shortcuts for <code class="cl-code">/memory</code>, <code class="cl-code">/init</code>, and <code class="cl-code">/goal</code>, while keeping <code class="cl-code">/compact</code> as the only true native command.</li><br/><li>Added persistent app settings for default sandbox mode and auto-restart, and wired the default sandbox choice into new sessions and restored threads.</li><br/><li>Upgraded the project sidebar to support stable project ordering with pinning and manual reorder metadata, while keeping project history lazy-loaded.</li><br/></ul><br/><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li>Simplified the CLI help output by removing app-specific environment variable details from the default help screen.</li><br/></ul><br/><h2 class="cl-h2">0.1.24</h2></p><p class="cl-p"><h3 class="cl-h3">Improvements</h3><br/><ul class="cl-ul"><li>Reduced global install weight by moving build-only frontend packages out of runtime dependencies while keeping the production <code class="cl-code">.next</code> package layout.</li><br/><li>Kept the npm package source-minimized: published files still contain production build artifacts, CLI files, defaults, and public assets rather than app/component source trees.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Added a package check that prevents build-only frontend libraries from accidentally returning to runtime dependencies.</li><br/></ul><br/><h2 class="cl-h2">0.1.23</h2></p><p class="cl-p"><h3 class="cl-h3">Maintenance</h3><br/><ul class="cl-ul"><li>Released the verified 0.1.22 project sidebar, lazy session loading, and new-chat rollout handling changes as the current patch version.</li><br/><li>Confirmed the local development server can run on an alternate Next.js dev port when the default port is already occupied.</li><br/></ul><br/><h2 class="cl-h2">0.1.22</h2></p><p class="cl-p"><h3 class="cl-h3">Improvements</h3><br/><ul class="cl-ul"><li>Reworked the left sidebar project list to a CodePilot-style Threads view with compact expandable project rows and hover actions for starting a chat in a project.</li><br/><li>Updated the add-project dialog so users can either browse server folders or manually enter a project path and use it directly.</li><br/><li>Kept project session history lazy-loaded per project so opening the sidebar does not eagerly read every Codex thread.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Fixed session restore paths to use lightweight thread metadata lookup before loading full history, preventing old sessions from being blocked by unrelated project/session scans.</li><br/><li>Treated missing Codex rollouts and not-found thread reads as absent sessions instead of hard failures.</li><br/><li>Skipped <code class="cl-code">thread/resume</code> before the first prompt for newly created chats, avoiding <code class="cl-code">no rollout found</code> errors on new thread startup.</li><br/></ul><br/><h2 class="cl-h2">0.1.21</h2></p><p class="cl-p"><h3 class="cl-h3">Improvements</h3><br/><ul class="cl-ul"><li>Reworked the left sidebar project channel to match the AnnoVibe grouped project view: all chat projects are shown, project chat history is collapsible, and only the current or most recently active project expands by default.</li><br/><li>Added a right-panel Tools tab that shows live Codex chat runtime status, including phase, model, active tools, wait time, last event, and abort control.</li><br/><li>Added a lightweight Starfleet-inspired favicon.</li><br/><li>Opened the right panel on Files by default after removing the Report tab.</li><br/></ul><br/><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li>Removed the Analysis Report tab, report update parsing, report prompt injection, report storage, and report API surface.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Exposed <code class="cl-code">/api/agent/runtime</code> for UI runtime polling and expanded runtime state tracking for running sessions.</li><br/></ul><br/><h2 class="cl-h2">0.1.20</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Wait for the <code class="cl-code">connected</code> SSE event before sending the first prompt in new and resumed chats, so the event subscription is live before Codex emits turn events.</li><br/><li>Treat agent event stream connection timeouts as send failures instead of entering "Waiting for model...", and clean up unconfirmed EventSource connections.</li><br/><li>Prevent duplicate sends while a chat is still creating its session or waiting for SSE setup.</li><br/><li>Send the SSE <code class="cl-code">connected</code> event only after the server has registered the session event listener.</li><br/></ul><br/><h2 class="cl-h2">0.1.19</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Fixed new chats getting stuck on "Waiting for model..." after the temporary new-session view switches to the real Codex thread id.</li><br/><li>Scoped EventSource cleanup to the session id it owns so session creation, model-switch forks, and reconnects do not accidentally close the active SSE stream.</li><br/></ul><br/><h2 class="cl-h2">0.1.18</h2></p><p class="cl-p"><h3 class="cl-h3">Improvements</h3><br/><ul class="cl-ul"><li>Moved the file explorer out of the left sidebar into a persistent right-panel Files tab.</li><br/><li>Restored the left sidebar project list as an expanded project tree, with only the most recently active or current project's chats expanded by default.</li><br/><li>Open PDF and image files in draggable preview windows instead of occupying right-panel file tabs.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Kept project chat loading scoped per project so expanding one project's history does not force all project histories to load at once.</li><br/></ul><br/><h2 class="cl-h2">0.1.17</h2></p><p class="cl-p"><h3 class="cl-h3">Improvements</h3><br/><ul class="cl-ul"><li>Added the Annodex Router provider so Codex app-server now sees one stable <code class="cl-code">annodex-router</code> provider per workspace while Annodex routes real provider/model requests by wire model key.</li><br/><li>Centralized Responses and Chat Completions routing in the local router, reusing the compat proxy translation path for Chat-only providers.</li><br/><li>Kept legacy multi-provider workspace env generation available as a rollback/test path.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Resumed chats now bind the current wire model before each prompt, allowing historical chats to continue and switch models without losing the thread.</li><br/><li>Prevented <code class="cl-code">annodex-router</code> provider ids and hashed wire model keys from leaking into UI session runtime, history rendering, and context usage recovery.</li><br/><li>Preserved protocol correctness by keeping <code class="cl-code">turn/start</code> provider-stable and sending only the wire model id for each turn.</li><br/></ul><br/><h2 class="cl-h2">0.1.11</h2></p><p class="cl-p"><h3 class="cl-h3">Improvements</h3><br/><ul class="cl-ul"><li>Router/relay providers (DeepRouter, OpenRouter, etc.) now default to Responses API without the compat proxy, matching codex CLI behavior and eliminating ~6s of SSE translation latency.</li><br/><li>New chats auto-select a default model from annodex providers.json when no codex config.toml default is set.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Cross-provider model switching no longer forces a full ChatWindow remount, preserving the selected model across the fork so the UI does not appear blank after switching.</li><br/><li>Session-change effect uses <code class="cl-code">[session?.id]</code> dependency instead of mount-only, with a ref guard to avoid reconnecting the already-live EventSource after the first message creates a session.</li><br/></ul><br/><h2 class="cl-h2">0.1.10</h2></p><p class="cl-p"><h3 class="cl-h3">Improvements</h3><br/><ul class="cl-ul"><li>Added collapsible "Chats" section in the sidebar, matching the existing Project and Explorer toggle behavior, with session count display.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Fixed cross-provider session context loading (e.g. DeepRouter threads queried through DeepSeek server) by looking up the session's stored provider runtime before choosing a codex app-server instance.</li><br/><li>Moved <code class="cl-code">codexServerEnvForModel</code> to a shared location to avoid circular imports between <code class="cl-code">rpc-manager</code> and <code class="cl-code">session-reader</code>.</li><br/></ul><br/><h2 class="cl-h2">0.1.9</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Fixed cross-provider model switching (e.g. DeepSeek → DeepRouter) silently creating a fresh thread instead of leaking a "thread not found" error, since each codex app-server instance only knows its own threads.</li><br/></ul><br/><h2 class="cl-h2">0.1.8</h2></p><p class="cl-p"><h3 class="cl-h3">Improvements</h3><br/><ul class="cl-ul"><li>Added per-provider <code class="cl-code">reasoningConfig</code> to <code class="cl-code">providers.json</code>, allowing explicit control over thinking/reasoning parameter mapping (thinkingParam, effortParam, effortValueMode) when the compat proxy translates OpenAI Resposnes to Chat Completions. Falls back to hardcoded provider defaults when not configured.</li><br/><li>Vulcan salute (LLAP 🖖) favicon replacing the generic hand icon.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>GPT-pattern models (e.g. <code class="cl-code">gpt-5.5</code>) on Chat Completions providers like DeepRouter no longer force <code class="cl-code">openai-responses</code>; they now inherit the provider's API setting, ensuring the compat proxy starts and translates correctly.</li><br/><li>Included <code class="cl-code">reasoningConfig</code> fingerprint in the codex app-server instance key so switching models with different thinking parameter mappings creates a fresh compat proxy instead of reusing a stale one.</li><br/></ul><br/><h2 class="cl-h2">0.1.7</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Moved <code class="cl-code">-c</code> global config overrides before the <code class="cl-code">app-server</code> subcommand so Codex app-server correctly loads dynamic provider settings (DeepSeek, DeepRouter, etc.), fixing sessions that were stuck on "Waiting for model...".</li><br/><li>Fixed DeepRouter/OpenRouter API detection — now correctly identified as Chat Completions providers instead of defaulting to OpenAI Responses, ensuring the compat proxy translates requests properly.</li><br/><li>Added <code class="cl-code">crazyrouter</code>, <code class="cl-code">therouter</code> to Chat Completions provider patterns and compat proxy detection for consistent routing.</li><br/></ul><br/><h2 class="cl-h2">0.1.6</h2></p><p class="cl-p"><h3 class="cl-h3">Improvements</h3><br/><ul class="cl-ul"><li>Kept UI-managed providers and Codex home providers distinct when their ids or model names collide, so duplicate models such as <code class="cl-code">gpt-5.5</code> resolve to the selected source.</li><br/><li>Marked Codex-loaded providers as read-only in the Models settings UI and prevented them from being written back to annodex provider config.</li><br/><li>Replaced the old pi favicon with an LLAP hand favicon.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Resolved provider normalization and app-server switching issues that could send a UI-configured deeprouter GPT model through a stale DeepSeek-compatible connection.</li><br/><li>Added session alias handling when Codex cannot resume an old thread and creates a replacement thread, fixing restored-session <code class="cl-code">thread not found</code> failures.</li><br/><li>Removed the misleading Steer and Follow-up input controls because Codex app-server does not support native steer or queued follow-up operations.</li><br/></ul><br/><h2 class="cl-h2">0.1.5</h2></p><p class="cl-p"><h3 class="cl-h3">Improvements</h3><br/><ul class="cl-ul"><li>Added collapsible Project controls in the left sidebar, matching the Explorer section behavior.</li><br/><li>Made the Project header refresh projects and current project sessions when toggled, while keeping the dedicated refresh button for refresh-only updates.</li><br/><li>Improved deeprouter and mixed-provider model handling so GPT-style models can use OpenAI Responses while DeepSeek/Kimi/Qwen-style models use Chat Completions through the compat proxy.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Switched Codex app-server connections when the UI model/provider changes, preventing a selected deeprouter GPT model from being sent through a stale DeepSeek provider connection.</li><br/><li>Preserved <code class="cl-code">custom</code> providers in session runtime so restored sessions keep the correct provider context.</li><br/><li>Merged Codex <code class="cl-code">~/.codex/config.toml</code> and <code class="cl-code">auth.json</code> defaults with annodex-managed provider models, including API key discovery from Codex auth state.</li><br/></ul><br/><h2 class="cl-h2">0.1.4</h2></p><p class="cl-p"><h3 class="cl-h3">Improvements</h3><br/><ul class="cl-ul"><li>Restored Codex token statistics in the top bar by reading <code class="cl-code">token_count</code> events from local Codex session JSONL history.</li><br/><li>Added context usage recovery for Codex app-server sessions, including context window fallback from known model defaults and configured models.</li><br/><li>Attached per-turn token usage to assistant messages when Codex history includes usage snapshots.</li><br/><li>Display context usage as used tokens over context window, with percentage detail in the tooltip.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Avoided double-counting duplicate Codex token snapshots emitted during the same turn.</li><br/><li>Kept live agent state aligned with recovered context usage after refresh or idle resume.</li><br/></ul><br/><h2 class="cl-h2">0.1.3</h2></p><p class="cl-p"><h3 class="cl-h3">Improvements</h3><br/><ul class="cl-ul"><li>Aligned model settings with annodex's Codex Web target by supporting only the two backend protocols that actually run: OpenAI Responses and Chat Completions through the compat proxy.</li><br/><li>Added provider protocol inference so DeepSeek/Kimi/Qwen/Zhipu-style endpoints default to Chat Completions while OpenAI and deeprouter-style endpoints default to Responses.</li><br/><li>Made model testing perform a real lightweight provider request instead of returning a placeholder success.</li><br/><li>Preserved model-level protocol overrides, reasoning flags, thinking-level maps, and compatibility metadata across save/load.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Reused Codex app-server processes only when provider protocol, base URL, API key source, and context window match, preventing stale credentials after model settings changes.</li><br/><li>Passed thinking-level defaults into the Chat Completions compat proxy for reasoning-capable providers.</li><br/><li>Kept model, skills, projects, and session APIs aligned with <code class="cl-code">CODEX_HOME</code> and active Codex runtime state.</li><br/></ul><br/><h2 class="cl-h2">0.1.2</h2></p><p class="cl-p"><h3 class="cl-h3">Improvements</h3><br/><ul class="cl-ul"><li>Load projects, sessions, skills, and model settings from local Codex/annodex state without blocking on a cold <code class="cl-code">codex app-server</code> startup.</li><br/><li>Read Codex-native skills from project, user, and system skill directories, and install skills with the Codex agent target.</li><br/><li>Make model configuration work with just <code class="cl-code">baseUrl</code>, <code class="cl-code">apiKey</code>, and a manually entered model id; model discovery is now optional.</li><br/><li>Surface managed-server update and idle-restart state in the Web UI top bar.</li><br/><li>Improve Analysis Report prompting and fallback generation with representative figure links and richer output file notes.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Fixed settings panels that could remain stuck on loading for projects, skills, and models.</li><br/><li>Preserved Codex defaults from <code class="cl-code">~/.codex/config.toml</code> unless the user explicitly changes annodex-managed defaults.</li><br/><li>Scoped session listing to the active project and skipped injected context in previews.</li><br/></ul><br/><h2 class="cl-h2">0.8.17</h2></p><p class="cl-p"><h3 class="cl-h3">Improvements</h3><br/><ul class="cl-ul"><li>Added streaming progress updates and cancel support for skill installs.</li><br/><li>Made <code class="cl-code">npx skills</code> invocation non-interactive and increased the install timeout for slow GitHub clones.</li><br/><li>Improved skill install error cleanup so spinner control codes and npm first-run warnings do not obscure the real failure.</li><br/><li>Fixed the npm publish workflow package name after the AnnoVibe rename.</li><br/></ul><br/><h2 class="cl-h2">0.8.16</h2></p><p class="cl-p"><h3 class="cl-h3">Improvements</h3><br/><ul class="cl-ul"><li>Auto-detect image-capable models during Models discovery and import them with <code class="cl-code">input: ["text", "image"]</code>.</li><br/><li>Show an <code class="cl-code">image</code> capability marker in the Models discovery list for imported vision models.</li><br/></ul><br/><h2 class="cl-h2">0.8.15</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Fixed Plot tool preset activation so new sessions actually allow <code class="cl-code">kernel_plot_*</code> tools.</li><br/><li>Kept Plot mode synced on existing sessions after idle wrapper recreation or later prompts.</li><br/><li>Prevented Plot mode from being implicitly enabled when restoring ordinary sessions.</li><br/></ul><br/><h2 class="cl-h2">0.8.14</h2></p><p class="cl-p"><h3 class="cl-h3">Improvements</h3><br/><ul class="cl-ul"><li>Added idle-aware auto-restart for managed AnnoVibe servers after package updates.</li><br/><li>Improved bioinformatics analysis reporting so completed analysis runs create topic-scoped Report updates, including large PDF/result directories.</li><br/><li>Prefer generated UI widgets over Mermaid for diagrams unless raw Mermaid/source output is explicitly requested.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Fixed PDF.js compatibility in browsers missing <code class="cl-code">Uint8Array.prototype.toHex</code>.</li><br/><li>Prevented Mermaid syntax errors from flooding or crashing the chat UI.</li><br/><li>Added clearer sidebar API error messages and ignored local <code class="cl-code">.pi/</code> workspace data.</li><br/></ul><br/><h2 class="cl-h2">0.8.12</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li>Renamed the product surface from Pidex to AnnoVibe / annovibe.</li><br/><li>Added AnnoVibe version checking with npm update command hints.</li><br/><li>Added plot kernel status APIs, memory display, release action, and idle timeout settings.</li><br/><li>Kept legacy pidex settings, auth cookies, and CLI state files compatible during migration.</li><br/></ul><br/><h2 class="cl-h2">0.7.9</h2></p><p class="cl-p"><h3 class="cl-h3">Improvements</h3><br/><ul class="cl-ul"><li><strong>Global file editor in right panel</strong> — soul.md and harness.md now open in right panel with CodeMirror, instead of inline sidebar textarea.</li><br/></ul><br/><h2 class="cl-h2">0.7.8</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li><strong>stderr null reference</strong> on daemon detach.</li><br/></ul><br/><h2 class="cl-h2">0.7.7</h2></p><p class="cl-p"><ul class="cl-ul"><li>Updated README with all features and CLI commands.</li><br/></ul><br/><h2 class="cl-h2">0.7.6</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li><strong>Login redirect</strong> — auth env was exposed to <code class="cl-code">next.config.ts</code> so Edge Runtime middleware can read it.</li><br/><li><strong>Password management</strong> — <code class="cl-code">annovibe passwd</code> (change), <code class="cl-code">annovibe passwd --reset</code> (remove). Password stored at <code class="cl-code">~/.pi/agent/web-auth.json</code>.</li><br/></ul><br/><h2 class="cl-h2">0.7.5</h2></p><p class="cl-p"><h3 class="cl-h3">New Features</h3><br/><ul class="cl-ul"><li><strong>CLI commands</strong> — <code class="cl-code">annovibe --version</code>, <code class="cl-code">annovibe --help</code>, <code class="cl-code">annovibe update</code> (self-update from npm).</li><br/><li><strong>Version check</strong> — auto-checks npm for newer version on startup.</li><br/></ul><br/><h2 class="cl-h2">0.7.4</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li><strong>Removed @lobehub/icons</strong> — replaced 25 provider icons with inline SVGs. Eliminates @lobehub/ui → antd → @emoji-mart heavy dependency chain. No more peer dependency warnings on install.</li><br/></ul><br/><h3 class="cl-h3">Improvements</h3><br/><ul class="cl-ul"><li><strong>Daemon mode</strong> — annovibe auto-detaches after startup, returns terminal prompt while server runs in background.</li><br/></ul><br/><h2 class="cl-h2">0.7.2</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li><strong>Login redirect broken</strong> — <code class="cl-code">router.push()</code> not sending <code class="cl-code">SameSite=Lax</code> cookie, causing endless login loop. Fixed with <code class="cl-code">window.location.href</code> hard navigation.</li><br/><li><strong>npm-publish workflow</strong> — explicit <code class="cl-code">.npmrc</code> auth token, handle already-published packages, fix <code class="cl-code">useSearchParams</code> Suspense wrapper, split <code class="cl-code">auth-token.ts</code> from bcryptjs for Edge Runtime compat.</li><br/></ul><br/><h2 class="cl-h2">0.7.1</h2></p><p class="cl-p"><h3 class="cl-h3">New Features</h3><br/><ul class="cl-ul"><li><strong>Streaming widgets</strong> — <code class="cl-code">show-widget</code> fence support. LLM outputs charts/plots/SVG inline during streaming, rendered in sandboxed iframe with postMessage protocol.</li><br/><li><strong>Visualization harness</strong> — global <code class="cl-code">harness.md</code> behavioral constraints. Default template covers when to visualize, chart type guidelines, and matplotlib/R script→base64 PNG embedding.</li><br/><li><strong>Global harness editor</strong> — inline editing in sidebar Context panel (same UX as soul.md).</li><br/></ul><br/><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li>harness.md moved from per-project (<code class="cl-code">{cwd}/</code>) to global (<code class="cl-code">~/.pi/agent/</code>) alongside soul.md</li><br/><li>SoulEditor renamed to GlobalEditor (shared by soul.md + harness.md)</li><br/></ul><br/><h2 class="cl-h2">0.7.0</h2></p><p class="cl-p"><h3 class="cl-h3">New Features</h3><br/><ul class="cl-ul"><li><strong>Password authentication</strong> — optional password protection (like Jupyter). Set on first start via CLI prompt or <code class="cl-code">ANNOVIBE_PASSWORD</code> env var. bcrypt-hashed, HMAC-signed session cookies.</li><br/><li><strong>Subagent panel</strong> — track subagent runs (active/completed/failed) in a slide-out panel in the chat area.</li><br/><li><strong>Resizable panels</strong> — drag sidebar and right panel dividers to resize. Widths persist via localStorage.</li><br/><li><strong>Document viewers</strong> — PDF, DOCX, XLSX, PPTX preview in sidebar file explorer and drag-drop attachments in chat.</li><br/><li><strong>Text file editing</strong> — CodeMirror 6 editor with syntax highlighting for 10+ languages. Ctrl+S to save.</li><br/><li><strong>Project Context</strong> — sidebar section for soul.md (global, Spock personality), memory.md (project-level, self-updating), and AGENTS.md.</li><br/></ul><br/><h3 class="cl-h3">Improvements</h3><br/><ul class="cl-ul"><li>Renamed from <code class="cl-code">@agegr/pi-web</code> to <code class="cl-code">@seqyuan/annovibe</code></li><br/><li>SSE reconnection now works during tool execution (not just text streaming)</li><br/><li>File explorer auto-refreshes on custom path changes</li><br/><li>Custom messages (<code class="cl-code">subagent-notify</code>) now rendered in chat</li><br/><li>soul.md / memory.md auto-injected into system prompt at session creation</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li><code class="cl-code">xdg-open</code> crash on systems without xdg-utils installed</li><br/><li>Session switching no longer loses in-progress agent responses</li><br/></ul></p></div><style>
|
|
1
|
+
<!DOCTYPE html><html lang="en" class="__variable_66b8ca"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/7deddc85b7ffd1dc-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/ec14413c594b3356-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/css/6b00dcf032cca328.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/fddca953485158e4.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-0b1e0af2488fca8f.js"/><script src="/_next/static/chunks/4bd1b696-e356ca5ba0218e27.js" async=""></script><script src="/_next/static/chunks/3794-123fdf632563f469.js" async=""></script><script src="/_next/static/chunks/main-app-45a0f19af99d61b6.js" async=""></script><script src="/_next/static/chunks/8500-f62a38ff68ab7f42.js" async=""></script><script src="/_next/static/chunks/4550-eff0bf233a5b0aec.js" async=""></script><script src="/_next/static/chunks/app/layout-2e8a047b671c8731.js" async=""></script><script src="/_next/static/chunks/app/docs/changelog/page-7f8ff3ce79d21000.js" async=""></script><meta name="next-size-adjust" content=""/><title>Changelog</title><meta name="description" content="Release history and changes"/><link rel="shortcut icon" href="/favicon.svg" type="image/svg+xml"/><link rel="icon" href="/favicon.svg" type="image/svg+xml"/><script>(function(){try{var t=localStorage.getItem("annodex-theme");if(t==="dark")document.documentElement.classList.add("dark")}catch(e){}})();</script><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body style="min-height:100dvh;display:flex;flex-direction:column"><div hidden=""><!--$--><!--/$--></div><script>((a,b,c,d,e,f,g,h)=>{let i=document.documentElement,j=["light","dark"];function k(b){var c;(Array.isArray(a)?a:[a]).forEach(a=>{let c="class"===a,d=c&&f?e.map(a=>f[a]||a):e;c?(i.classList.remove(...d),i.classList.add(f&&f[b]?f[b]:b)):i.setAttribute(a,b)}),c=b,h&&j.includes(c)&&(i.style.colorScheme=c)}if(d)k(d);else try{let a=localStorage.getItem(b)||c,d=g&&"system"===a?window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":a;k(d)}catch(a){}})("class","theme","system",null,["light","dark"],null,true,true)</script><!--$--><div class="bg-fd-secondary/50 p-3 empty:hidden"></div><!--/$--><div style="max-width:800px;margin:0 auto;padding:40px 24px 80px"><a style="display:inline-flex;align-items:center;gap:6px;color:var(--color-accent, #3b82f6);text-decoration:none;font-size:14px;margin-bottom:24px" href="/workspace">←<!-- --> Back to <!-- -->annodex</a><div class="changelog-content"><p class="cl-p"><h2 class="cl-h2">0.1.90</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li><strong>Scroll to latest messages on session open</strong> — opening an existing chat session now scrolls to the bottom (latest messages) instead of showing the top. Fix: (1) reset scroll state on session switch, (2) replace the fragile messages-length useEffect with a hermes-agent-style settle loop that pins to the true bottom over ~5 stable frames (handles async DOM reflow from code blocks / syntax highlighting).</li><br/></ul><br/><h2 class="cl-h2">0.1.89</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li><strong>SSE transport: EventSource → fetch + ReadableStream</strong> — the browser-side SSE consumer now uses <code class="cl-code">fetch()</code> + <code class="cl-code">ReadableStreamDefaultReader</code> (adapted from CodePilot's pattern) instead of the opaque <code class="cl-code">EventSource</code> API. This eliminates browser-internal SSE buffering that caused mid-output freezes and stale stop buttons. Manual line-by-line parsing gives full control over read timing and buffer sizes.</li><br/><li><strong>Stream lifecycle via <code class="cl-code">createSSEReader</code></strong> — new <code class="cl-code">lib/sse-reader.ts</code> provides a managed <code class="cl-code">fetch</code>+<code class="cl-code">reader</code>+<code class="cl-code">AbortController</code> lifecycle with explicit <code class="cl-code">ConnectionState</code> tracking (<code class="cl-code">idle</code>/<code class="cl-code">connecting</code>/<code class="cl-code">connected</code>/<code class="cl-code">closed</code>/<code class="cl-code">error</code>), on-state-change callback, and abort-based cleanup. Reconnection uses exponential backoff just like the old EventSource path.</li><br/><li><strong>Removed dead <code class="cl-code">recordStreamHeartbeat</code></strong> — the old SSE-comment-based heartbeat path (<code class="cl-code">:\n\n</code>) was superseded by data-event heartbeats in v0.1.88 and is now fully removed.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>No more EventSource buffering stalls — mid-output freezes where the model was still generating but the UI showed a stuck spinner and stale stop button are resolved.</li><br/><li>Abort now cleanly cancels the fetch via <code class="cl-code">AbortController</code>, eliminating the race where the old <code class="cl-code">EventSource.close()</code> could leave partial connections dangling.</li><br/></ul><br/><h2 class="cl-h2">0.1.87</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li><strong>SSE stream freeze</strong> — model replies no longer stall mid-output. Added three-layer defense: (1) client-side idle watchdog detects silent SSE disconnects within 60s and transitions stream to error state, (2) reconcile timer now always fetches full messages so even if <code class="cl-code">agent_end</code> is lost the UI self-heals within 10s, (3) SSE reconnect uses exponential backoff (1s → 30s cap) instead of fixed 1s retry.</li><br/><li><strong>Text rendering smoothness</strong> — text deltas are now throttled at 100ms (per CodePilot pattern), preventing excessive React re-renders during rapid model output that caused visual stuttering and apparent freezes.</li><br/></ul><br/><h2 class="cl-h2">0.1.88</h2></p><p class="cl-p">Three root causes were identified by comparing annodex, CodePilot, hello-halo, and hermes-agent streaming architectures. CodePilot uses fetch + ReadableStream reader (bypassing EventSource buffering), while annodex relied on browser EventSource which has known issues with invisible SSE comment heartbeats and opaque error handling.</p><p class="cl-p"><h3 class="cl-h3">Fixes</h3></p><p class="cl-p"><ul class="cl-ul"><li>Fix SSE stream freeze: when the stream controller is closed (client disconnect / backpressure), the server-side <code class="cl-code">encode</code> function now immediately cleans up the session event listener and heartbeat timer, preventing orphaned resources that caused the UI to appear frozen while the backend continued generating.</li><br/><li>Fix SSE heartbeat invisible to EventSource: the server now sends heartbeats as data events (<code class="cl-code">{"type":"heartbeat"}</code>) instead of SSE comment lines (<code class="cl-code">:\n\n</code>), so the browser's EventSource <code class="cl-code">onmessage</code> handler can see them and reset the client-side idle watchdog.</li><br/><li>Fix idle watchdog not propagating stream errors to React state: the stream-session-manager now has a <code class="cl-code">registerStreamErrorCallback</code> mechanism that the idle watchdog uses to set <code class="cl-code">agentRunning = false</code> in the React layer, so the stop button disappears and the UI correctly shows the connection is dead.</li><br/><li>Fix premature stream timeout: the idle watchdog now considers both <code class="cl-code">lastEventAt</code> and <code class="cl-code">lastHeartbeatAt</code> when deciding whether the stream is dead, so long-running tool executions (>60s) don't trigger false-positive timeouts.</li><br/><li>Heartbeat interval reduced from 30s to 15s for faster dead-connection detection.</li><br/></ul><br/><h2 class="cl-h2">0.1.86</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li><strong>Session loading 500 errors</strong> — sessions whose working directory no longer exists (deleted projects, cleaned temp dirs) no longer trigger HTTP 500. <code class="cl-code">loadCodexSessionContext</code> now bails out early when <code class="cl-code">cwd</code> is missing on disk, avoiding a futile codex app-server spawn that would exceed WebSocket retry/timeout budgets.</li><br/><li><strong>Session route error logging</strong> — <code class="cl-code">GET/PATCH/DELETE /api/sessions/[id]</code> catch blocks now log the actual error with <code class="cl-code">console.error</code>, making future session-load failures diagnosable from the server console.</li><br/></ul><br/><h2 class="cl-h2">0.1.85</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li><strong>IM gateway auto-start</strong> — annodex supervisor now spawns the IM gateway as a managed child process. <code class="cl-code">annodex start</code> automatically runs the gateway in the background; <code class="cl-code">annodex stop</code> cascades to stop it. Logs go to <code class="cl-code">~/.config/annodex/annodex-im-gateway.log</code>.</li><br/><li><strong>Chat attachment file upload</strong> — dropping non-image files (yaml, json, txt, csv, tsv, pdf, docx, xlsx, pptx) into the chat input now uploads them to the project <code class="cl-code">.annodex-uploads/</code> directory and includes the saved path in the message.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li><strong>Audio playback</strong> — reuse a single AudioContext instead of creating new ones per sound; resume suspended context (browser autoplay policy); increase completion sound volume from 0.18 to 0.4.</li><br/><li><strong>Image upload refactor</strong> — deduplicate shared types and helpers into <code class="cl-code">chat-attachment-shared.ts</code>.</li><br/></ul><br/><h2 class="cl-h2">0.1.84</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li><strong>Site build failure</strong> — fix static page generation error <code class="cl-code">/en/changelog</code> caused by passing the raw <code class="cl-code">i18n</code> object (which contains a <code class="cl-code">translations</code> function) to the <code class="cl-code">HomeLayout</code> client component. Removed <code class="cl-code">i18n</code> from <code class="cl-code">baseOptions()</code> since the actual i18n functionality is handled by <code class="cl-code">RootProvider</code> context. Build now completes with all 20 pages.</li><br/></ul><br/><h2 class="cl-h2">0.1.83</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li><strong>Mobile extensions popover</strong> — extensions (plugin) button at the bottom of chat input was clipped off-screen on mobile browsers. Now uses the same mobile sheet style as other dropdowns (model, thinking, tools, slash).</li><br/><li><strong><code class="cl-code">/goal</code> multiline command</strong> — <code class="cl-code">/goal</code> now splits on the first newline: the first line sets the goal objective, and subsequent lines are forwarded as a prompt to the AI. Previously the entire text after <code class="cl-code">/goal</code> was consumed as the objective, leaving no prompt for the AI to respond to, which appeared as an error.</li><br/></ul><br/><h2 class="cl-h2">0.1.82</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li><strong>Session rename</strong> — fix sidebar session rename button that silently failed.</li><br/></ul> The PATCH handler now always creates a dedicated app-server connection instead<br/> of reusing the session's internal connection, which may be dead from idle<br/> timeout (10 min), causing the rename to silently return ok without effect.</p><p class="cl-p"><h2 class="cl-h2">0.1.81</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li><strong>Browser image rendering rollback</strong> — remove the browser-side <code class="cl-code">MEDIA:</code> preview</li><br/></ul> path and restore the previous web UI image rendering behavior: Markdown images,<br/> local path detection, image blocks, and <code class="cl-code">show-widget</code> previews.</p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Avoid unstable web image previews introduced by browser <code class="cl-code">MEDIA:</code> parsing while</li><br/></ul> keeping WeCom IM attachment handling isolated in the IM channel.</p><p class="cl-p"><h2 class="cl-h2">0.1.80</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li><strong>Browser MEDIA: preview loading race</strong> — defer local-image</li><br/></ul> previews until streaming completes, avoiding requests before<br/> the file is fully written.<br/><ul class="cl-ul"><li><strong>MEDIA: tag parsing</strong> — accept relative paths</li><br/></ul> (./output.png, output/plot.png) and quoted paths with spaces<br/> ('plot with space.png') in addition to absolute paths.</p><p class="cl-p"><h2 class="cl-h2">0.1.79</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li><strong>im-gateway npm package</strong> — include <code class="cl-code">lib/im-cancel.js</code> in published <code class="cl-code">files</code></li><br/></ul> (fixes <code class="cl-code">Cannot find module '../lib/im-cancel.js'</code> after <code class="cl-code">npm install -g</code>).<br/><ul class="cl-ul"><li><code class="cl-code">pack:check</code> now requires <code class="cl-code">bin/annodex-im-gateway.js</code>, <code class="cl-code">lib/im-media.js</code>, and</li><br/></ul> <code class="cl-code">lib/im-cancel.js</code> so gateway deps are not omitted again.</p><p class="cl-p"><h2 class="cl-h2">0.1.78</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li><strong>Browser MEDIA: preview</strong> — assistant and tool-result text with <code class="cl-code">MEDIA:/path</code></li><br/></ul> tags now hide the tag line and show inline local image previews (alongside<br/> existing Generative UI / path detection).<br/><ul class="cl-ul"><li><strong>Sidebar [IM] badge</strong> — WeCom IM Codex threads are labeled with a blue</li><br/></ul> <code class="cl-code">[IM]</code> pill; <code class="cl-code">GET /api/im/session-ids</code> + <code class="cl-code">listImSessionIds()</code>.<br/><ul class="cl-ul"><li>Refactor local preview path resolution into <code class="cl-code">lib/local-preview-path.ts</code>.</li><br/><li><strong>Docs (en/zh)</strong> — expanded [Project IM](/docs/im) guide with positioning,</li><br/></ul> dual-channel comparison (Generative UI vs WeCom), pairing flow, MEDIA delivery,<br/> Reset IM thread, and SVG architecture diagrams on the site.</p><p class="cl-p"><h2 class="cl-h2">0.1.77</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li><strong>Reset IM thread</strong> (Settings → Project → WeCom IM): button deletes</li><br/></ul> <code class="cl-code">im-sessions/<sha1(cwd)>.json</code> and stops the in-memory IM session; pairing and bot<br/> settings are kept. Next WeCom message starts a fresh Codex thread.<br/><ul class="cl-ul"><li>New <code class="cl-code">DELETE /api/im/project?cwd=</code> and <code class="cl-code">resetProjectImSession()</code> /</li><br/></ul> <code class="cl-code">clearProjectImSession()</code>.</p><p class="cl-p"><h2 class="cl-h2">0.1.76</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li><strong>IM cancel</strong>: send 取消/停止/cancel (etc.) to abort a running IM turn —</li><br/></ul> <code class="cl-code">POST /api/im/cancel</code>, gateway intercept, and busy-session fallback; strips WeCom<br/> zero-width suffixes when matching cancel commands.<br/><ul class="cl-ul"><li><strong>IM vs browser prompts</strong>: IM Codex threads use <code class="cl-code">channel: "im"</code> — strip browser</li><br/></ul> <code class="cl-code">show-widget</code> system rules and inject <code class="cl-code"><wecom_im_channel></code> once; per-message<br/> <code class="cl-code">buildImPrompt()</code> no longer repeats MEDIA/show-widget guidance (avoids polluting<br/> thread history if the IM session is opened in the browser).<br/><ul class="cl-ul"><li><code class="cl-code">abort</code> clears session busy state so cancel and follow-up turns recover cleanly.</li><br/><li>Docs (en/zh): IM cancel flow and separated system prompt notes.</li><br/></ul><br/><h2 class="cl-h2">0.1.75</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li><strong>Global Toast stack</strong>: <code class="cl-code">ToastProvider</code> in root layout replaces scattered inline error</li><br/></ul> banners across Settings (Projects, Extensions, Tools, Models, Skills), sidebar,<br/> conversation search, file explorer, and composer slash/goal errors.<br/><ul class="cl-ul"><li><strong>Composer input history</strong>: ↑/↓ recalls previous user prompts from the current</li><br/></ul> session (Hermes-style; does not overwrite a non-empty draft).<br/><ul class="cl-ul"><li><strong>Composer message queue</strong>: queue sends while the agent is busy; auto-flush when idle.</li><br/><li><strong>Composer drag-and-drop</strong>: attach files (including common bioinformatics extensions)</li><br/></ul> by dropping onto the input area.<br/><ul class="cl-ul"><li><strong>WeCom IM panel</strong>: gateway status pill (<code class="cl-code">GET /api/im/gateway-status</code>), copy buttons</li><br/></ul> for pairing code and <code class="cl-code">annodex im-gateway</code> command.<br/><ul class="cl-ul"><li>New helpers: <code class="cl-code">lib/composer-input-history.ts</code>, <code class="cl-code">lib/composer-queue.ts</code>,</li><br/></ul> <code class="cl-code">lib/drag-drop-files.ts</code>, <code class="cl-code">lib/im-gateway-status.ts</code>, <code class="cl-code">components/CopyButton.tsx</code>.<br/><ul class="cl-ul"><li>Tests for composer queue, input history, and gateway status.</li><br/></ul><br/><h2 class="cl-h2">0.1.74</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li><strong>WeCom IM — MEDIA: attachments</strong>: gateway parses <code class="cl-code">MEDIA:/path</code> from agent replies,</li><br/></ul> strips tags and <code class="cl-code">show-widget</code> fences from streamed text, uploads images/files via WeCom<br/> <code class="cl-code">aibot_upload_media_*</code>, and sends native attachments after the stream finishes.<br/><ul class="cl-ul"><li><strong>Upload permission fallback</strong>: when the enterprise bot lacks file/image upload rights</li><br/></ul> (or upload fails), a follow-up text message includes the local absolute path; the<br/> bridge caches <code class="cl-code">mediaUploadDisabled</code> to avoid repeated failed uploads.<br/><ul class="cl-ul"><li><strong>IM prompt</strong>: <code class="cl-code">buildImPrompt()</code> instructs the agent to save diagrams as files with</li><br/></ul> <code class="cl-code">MEDIA:</code> tags and plain-text paths (no <code class="cl-code">show-widget</code> in IM).<br/><ul class="cl-ul"><li>New <code class="cl-code">lib/im-media.js</code>, WeCom upload helpers in <code class="cl-code">lib/im-wecom.ts</code> and</li><br/></ul> <code class="cl-code">annodex-im-gateway</code>; docs (en/zh) and <code class="cl-code">tests/im-media.test.mjs</code>.</p><p class="cl-p"><h2 class="cl-h2">0.1.73</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li><strong>Docs site (en/zh)</strong>: FileViewer download API, Extensions simplified UI + Advanced,</li><br/></ul> Model Discover vs manual add, SOUL/HARNESS edit paths, CLI commands (doctor/stop/im-gateway),<br/> web-auth localhost bypass for IM/memory APIs, quick-start CLI helpers, homepage copy sync.</p><p class="cl-p"><h2 class="cl-h2">0.1.72</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li><strong>Default SOUL.md</strong>: replace Spock persona with a neutral global template (working</li><br/></ul> principles, operating parameters, continuity). Existing user files are not overwritten.<br/><ul class="cl-ul"><li><strong>Config path</strong>: <code class="cl-code">getAgentDir()</code> and <code class="cl-code">/api/soul</code> + <code class="cl-code">/api/harness</code> respect</li><br/></ul> <code class="cl-code">ANNODEX_CONFIG_DIR</code> consistently with CLI seed and system prompt injection.<br/><ul class="cl-ul"><li><strong>Docs</strong>: configuration and memory pages document first-start SOUL/HARNESS seeding</li><br/></ul> and per-user config directories.</p><p class="cl-p"><h2 class="cl-h2">0.1.71</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li><strong>Docs — Project IM</strong>: site docs (en/zh) updated for Settings → WeCom IM setup,</li><br/></ul> pairing-first onboarding (send pairing code before agent runs), <code class="cl-code">annodex im-gateway</code><br/> in the same Linux account, streaming replies, and current storage/API paths.<br/><ul class="cl-ul"><li>Related updates in configuration, usage, and homepage feature copy.</li><br/></ul><br/><h2 class="cl-h2">0.1.70</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li><strong>File download</strong>: Download button in FileViewer toolbars (text, image, audio, PDF,</li><br/></ul> DOCX, XLSX, PPTX). <code class="cl-code">GET /api/files/{path}?type=download</code> streams the original file<br/> with <code class="cl-code">Content-Disposition: attachment</code> (500MB cap).<br/><ul class="cl-ul"><li><strong>Extensions settings</strong>: simpler default panel (name, description, project/chat toggles)</li><br/></ul> with <strong>Advanced</strong> collapse for ID, transport, scope, and MCP install details.<br/><ul class="cl-ul"><li><strong>WeCom IM settings</strong>: prominent enable switch; config fields only when enabled;</li><br/></ul> updated gateway hint; <strong>Save IM settings</strong> as primary action button.<br/><ul class="cl-ul"><li><strong>Model Discover</strong>: infer reasoning/image flags from model metadata on Discover;</li><br/></ul> manual model add keeps thinking/image unchecked by default.</p><p class="cl-p"><h2 class="cl-h2">0.1.69</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li><strong>WeCom IM streaming replies</strong>: <code class="cl-code">POST /api/im/turn</code> with <code class="cl-code">Accept: text/event-stream</code></li><br/></ul> (or <code class="cl-code">?stream=1</code>) streams <code class="cl-code">status</code>, <code class="cl-code">delta</code>, and <code class="cl-code">done</code> events while the agent runs.<br/><ul class="cl-ul"><li><code class="cl-code">annodex-im-gateway</code> consumes the SSE turn stream and pushes partial text to WeCom</li><br/></ul> with a fixed <code class="cl-code">streamId</code> (<code class="cl-code">finish: false</code> during stream, <code class="cl-code">finish: true</code> on completion).<br/><ul class="cl-ul"><li>Tool-running phases still show <code class="cl-code">(working Ns)</code>; assistant text streams with 300ms throttle.</li><br/><li>Sync JSON <code class="cl-code">/api/im/turn</code> kept for tests and curl.</li><br/><li>New <code class="cl-code">annodex im-gateway</code> CLI subcommand (same user's <code class="cl-code">~/.config/annodex</code>).</li><br/><li>Web-auth: localhost requests to <code class="cl-code">/api/im/*</code> and <code class="cl-code">/api/memory/*</code> bypass login so the</li><br/></ul> IM gateway and memory MCP sidecars work when password auth is enabled.</p><p class="cl-p"><h2 class="cl-h2">0.1.68</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li><strong>Multi-user IM gateway</strong>: bot secrets are served over <code class="cl-code">GET /api/im/projects</code> from</li><br/></ul> the annodex server; gateway no longer reads local <code class="cl-code">im-secrets/</code> files.<br/><ul class="cl-ul"><li>New <code class="cl-code">GET /api/im/gateway-token</code> (localhost only): sync gateway token and warn when</li><br/></ul> <code class="cl-code">ANNODEX_CONFIG_DIR</code> differs from the annodex server.<br/><ul class="cl-ul"><li><code class="cl-code">annodex-im-gateway</code>: clearer 401/403 errors; startup token sync; tolerate</li><br/></ul> unwritable <code class="cl-code">im-gateway.json</code> with a helpful message.<br/><ul class="cl-ul"><li>Docs (en/zh) and <strong>Settings → Project → WeCom IM</strong>: multi-account /</li><br/></ul> <code class="cl-code">ANNODEX_CONFIG_DIR</code> guidance.</p><p class="cl-p"><h2 class="cl-h2">0.1.67</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li><code class="cl-code">annodex stop</code>: scan and terminate orphaned <strong>codex app-server</strong> processes left</li><br/></ul> after the Next.js server exits (Linux process-group kill when available).<br/><ul class="cl-ul"><li><code class="cl-code">annodex stop</code> does <strong>not</strong> stop <code class="cl-code">annodex-im-gateway</code>; IM sidecar can stay running</li><br/></ul> while annodex is restarted separately.<br/><ul class="cl-ul"><li><code class="cl-code">annodex doctor</code>: recommend cleaning orphaned codex app-server processes; note</li><br/></ul> when IM gateway is up but annodex is stopped.<br/><ul class="cl-ul"><li><code class="cl-code">annodex-im-gateway</code>: log clearer errors when <code class="cl-code">/api/im/turn</code> fails.</li><br/></ul><br/><h2 class="cl-h2">0.1.66</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li>README and docs site (en/zh): align project switcher, IM settings path, and mobile</li><br/></ul> Extensions wording with the v0.1.65 workspace UI.<br/><ul class="cl-ul"><li>Homepage feature copy (<code class="cl-code">home-i18n</code>) updated for pinned sidebar folders and</li><br/></ul> <strong>Settings → Project → WeCom IM</strong>.</p><p class="cl-p"><h2 class="cl-h2">0.1.65</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li>Sidebar project layout: pinned projects appear as expandable folders with chat</li><br/></ul> history; unpinned projects list in the switcher dropdown; the active unpinned<br/> project shows as a temporary sidebar folder while selected.<br/><ul class="cl-ul"><li>Project IM (WeCom): moved from Tools to <strong>Settings → Project</strong> with a per-project</li><br/></ul> <strong>WeCom IM</strong> expand control.<br/><ul class="cl-ul"><li>Chat UI: remove the per-session “Enabled extensions for this session” banner;</li><br/></ul> extension toggles remain in the input bar.<br/><ul class="cl-ul"><li>Mobile chat input: Extensions control shows icon only (count in tooltip).</li><br/></ul><br/><h2 class="cl-h2">0.1.64</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li>Docs site i18n: English and Chinese (<code class="cl-code">/docs</code> and <code class="cl-code">/zh/docs</code>) with Fumadocs</li><br/></ul> language switcher and locale-aware navigation.<br/><ul class="cl-ul"><li>New documentation pages: [Project Memory](/docs/memory) and</li><br/></ul> [Project IM (WeCom)](/docs/im) in both languages.<br/><ul class="cl-ul"><li>Homepage, usage, and configuration docs updated for memory, IM, project</li><br/></ul> switcher, and writable <code class="cl-code">$HOME</code> / <code class="cl-code">ANNODEX_CONFIG_DIR</code> guidance.</p><p class="cl-p"><h2 class="cl-h2">0.1.63</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li>Per-project WeCom IM gateway (v1): optional one bot per project cwd via</li><br/></ul> <code class="cl-code">annodex-im-gateway</code> sidecar and <code class="cl-code">{cwd}/.annodex/im.json</code> config.<br/><ul class="cl-ul"><li>IM APIs: <code class="cl-code">GET/PUT /api/im/project</code>, <code class="cl-code">GET /api/im/projects</code>, <code class="cl-code">POST /api/im/turn</code></li><br/></ul> for gateway integration and synchronous IM replies.<br/><ul class="cl-ul"><li>Tools panel <strong>Project IM</strong> section: enable bot, bot credentials, pairing code,</li><br/></ul> allowlist, and group-chat options (UI-only config, no CLI).<br/><ul class="cl-ul"><li>WeCom pairing: users send project pairing code in IM to join <code class="cl-code">allowedUsers</code>;</li><br/></ul> multi-user allowlist supported with one shared IM Codex thread per project.<br/><ul class="cl-ul"><li>IM unit tests cover config, auth, WeCom message parsing, and simulated IM</li><br/></ul> agent sessions with mocked Codex wrapper.</p><p class="cl-p"><h2 class="cl-h2">0.1.62</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li>Phase 1 project memory: JSONL working store at</li><br/></ul> <code class="cl-code">~/.config/annodex/memory/<sha1(cwd)>/entries.jsonl</code> with retain, recall, and<br/> reflect via the <code class="cl-code">annodex-memory-mcp</code> stdio MCP server.<br/><ul class="cl-ul"><li>Promote working-memory candidates to project <code class="cl-code">MEMORY.md</code> or <code class="cl-code">CONTEXT.md</code> from</li><br/></ul> the Tools panel or <code class="cl-code">POST /api/memory/promote</code>.<br/><ul class="cl-ul"><li>System prompt injects <code class="cl-code">CONTEXT.md</code> alongside <code class="cl-code">MEMORY.md</code>; <code class="cl-code">buildSystemPrompt()</code></li><br/></ul> uses shared context-file wrappers.<br/><ul class="cl-ul"><li>Tools panel shows memory stats, promotion candidates, and recent entries for</li><br/></ul> the active project.<br/><ul class="cl-ul"><li><code class="cl-code">annodex-memory</code> extension preset in Settings → Extensions; auto-registered in</li><br/></ul> <code class="cl-code">extensions.json</code> on first session start.<br/><ul class="cl-ul"><li>README and docs site: writable <code class="cl-code">$HOME</code> / <code class="cl-code">ANNODEX_CONFIG_DIR</code>, project</li><br/></ul> switcher, extensions, and storage layout.</p><p class="cl-p"><h2 class="cl-h2">0.1.61</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Settings Extensions tab: clip long extension names, IDs, and transport commands</li><br/></ul> in the sidebar list so text no longer overflows into the details panel; form<br/> controls and discovery cards use consistent width constraints and ellipsis.</p><p class="cl-p"><h2 class="cl-h2">0.1.60</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li>Sidebar project switcher: replace the multi-project PROJECTS channel with a</li><br/></ul> compact dropdown (pi-web style); session list shows the current project only.<br/><ul class="cl-ul"><li>Pin visibility: switcher lists pinned projects plus the active cwd; unpinned</li><br/></ul> projects disappear when you switch away unless explicitly pinned.<br/><ul class="cl-ul"><li>Add project from the switcher dropdown via the existing folder browse dialog</li><br/></ul> (sidebar Add button removed).<br/><ul class="cl-ul"><li>Drag reorder pinned projects in the switcher dropdown; order persists in the</li><br/></ul> project registry.</p><p class="cl-p"><h2 class="cl-h2">0.1.59</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li>Chat image uploads: pasted images save to <code class="cl-code">{cwd}/.annodex-uploads/</code> via</li><br/></ul> <code class="cl-code">POST /api/images/upload</code>; prompts send <code class="cl-code">localImage</code> paths plus vision data<br/> URLs instead of large inline base64 bodies.<br/><ul class="cl-ul"><li>User messages show path appendix (<code class="cl-code">[User attached image N: /path (name)]</code>) and</li><br/></ul> thumbnails load from disk through <code class="cl-code">/api/files/...?type=read</code>.<br/><ul class="cl-ul"><li>Session history restores images from Codex <code class="cl-code">localImage</code> inputs after reload.</li><br/></ul><br/><h2 class="cl-h2">0.1.58</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li>Codex native <code class="cl-code">/goal</code>: slash command calls <code class="cl-code">thread/goal/set|get|clear</code> instead of</li><br/></ul> inserting a prompt template; <code class="cl-code">ThreadGoalPanel</code> shows objective, status, token/time<br/> progress; goal state loads on session open and updates via SSE.<br/><ul class="cl-ul"><li>Subagent UI: top-right button shows only while subagent runs are active; panel</li><br/></ul> auto-closes when all runs finish.</p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Subagent status merge prefers terminal states (failed/completed) over stale</li><br/></ul> <code class="cl-code">running</code>; dedupe by <code class="cl-code">threadId</code>; unknown Codex statuses default to <code class="cl-code">paused</code>.<br/><ul class="cl-ul"><li>Idle session load finalizes in-flight subagent runs so historical sessions no</li><br/></ul> longer show a stuck active badge after failures.<br/><ul class="cl-ul"><li>Clear subagent state immediately when switching sessions.</li><br/></ul><br/><h2 class="cl-h2">0.1.57</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li>Stream session manager (<code class="cl-code">lib/stream-session-manager.ts</code>): client-side snapshot</li><br/></ul> accumulator survives React remounts and SSE reconnects; thinking phases, tool<br/> calls, and text merge in one place instead of local reducers.<br/><ul class="cl-ul"><li>Session reader: merge reasoning, tool calls, and text within a Codex turn into</li><br/></ul> one assistant message (with paired toolResult rows) for cleaner history after<br/> reload.<br/><ul class="cl-ul"><li>Waiting UX: <code class="cl-code">StreamingStatusBar</code> shows live elapsed seconds and real runtime</li><br/></ul> phase; time-phased labels during the pre-first-token gap; ProcessPanel<br/> waiting shell appears immediately on send.<br/><ul class="cl-ul"><li>Send flow: optimistic running state and stream shell start before SSE connect;</li><br/></ul> running reconcile no longer replaces messages mid-turn.</p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Remove <code class="cl-code">message_end</code> mid-turn append; canonical state comes from <code class="cl-code">agent_end</code></li><br/></ul> reconcile only, reducing duplicate assistant replies.<br/><ul class="cl-ul"><li>Optimistic user message dedup via <code class="cl-code">pendingOptimisticUserRef</code> and merge on</li><br/></ul> reload, fixing duplicate user bubbles after send.<br/><ul class="cl-ul"><li>Streaming UI: thinking/tools render only in ProcessPanel during live turns,</li><br/></ul> not inline twice.</p><p class="cl-p"><h2 class="cl-h2">0.1.56</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>macos-codex-security.js: needsRepairBeforeSpawn now also checks</li><br/></ul> spctl --assess (5s timeout) after codesign --verify passes.<br/> codesign may report 'valid on disk' even when spctl detects<br/> CSSMERR_TP_CERT_REVOKED — only spctl checks Apple's revocation DB.<br/> This makes auto-repair work on first spawn after npm update,<br/> eliminating the need for manual <code class="cl-code">annodex doctor --repair</code>.<br/><ul class="cl-ul"><li>macos-codex-security.js: spctl timeout now treated as needing repair.</li><br/></ul> A valid cert should return quickly; a slow response usually means the<br/> revocation check is happening against a revoked cert. Worst case:<br/> unnecessary ad-hoc re-sign, which is harmless.</p><p class="cl-p"><h2 class="cl-h2">0.1.55</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>codex-server.ts: resolveCodexNativeBinary now searches annodex's own</li><br/></ul> node_modules (join(__dirname, '..', 'node_modules')), fixing the path<br/> mismatch where the doctor repaired the native binary but spawn used a<br/> JS shim (node_modules/.bin/codex). The shim→native grandchild exec<br/> triggered macOS Gatekeeper SIGKILL even after repair.<br/><ul class="cl-ul"><li>macos-codex-security.js: prepareMacOSCodexForSpawn now resolves the</li><br/></ul> underlying native binary when given a JS shim path, and repairs that<br/> binary directly. Added resolveNativeBinaryFromShim() helper.</p><p class="cl-p"><h2 class="cl-h2">0.1.54</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li>macOS: ad-hoc codesign repair for revoked codex Developer ID certificate</li><br/></ul> (CSSMERR_TP_CERT_REVOKED). New <code class="cl-code">lib/macos-codex-security.js</code> strips revoked<br/> signatures and applies <code class="cl-code">codesign --force --sign -</code> before spawn, following<br/> the hermes-agent recovery pattern.<br/><ul class="cl-ul"><li>doctor: add <code class="cl-code">--repair</code> mode for deep quarantine clear and ad-hoc signing.</li><br/></ul> Add <code class="cl-code">codesign verify</code> output alongside <code class="cl-code">spctl</code> for dual diagnostic view.<br/> Warn when repo/runtime is inside macOS protected folders (Desktop, Documents,<br/> Downloads, iCloud Drive).<br/><ul class="cl-ul"><li>next.config.ts: allow <code class="cl-code">127.0.0.1</code> and <code class="cl-code">localhost</code> in <code class="cl-code">allowedDevOrigins</code> for</li><br/></ul> Next.js 16 HMR compatibility.</p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>codex-server.ts: removed inline <code class="cl-code">clearMacOSQuarantine()</code> which performed</li><br/></ul> slow recursive xattr on every spawn. Replaced with fast <code class="cl-code">prepareMacOSCodexForSpawn</code><br/> that only validates the codex binary signature (3s timeout, no spctl).<br/><ul class="cl-ul"><li>Hot path no longer calls <code class="cl-code">spctl --assess</code> or recursive xattr, eliminating</li><br/></ul> 20-80s stalls on macOS with large Documents folders.</p><p class="cl-p"><h2 class="cl-h2">0.1.53</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li>macOS: default transport switched from WebSocket to stdio (matching</li><br/></ul> Windows), removing the network-server code path that triggered hardened<br/> runtime entitlement checks and Gatekeeper reinforcement on Apple Silicon.<br/><ul class="cl-ul"><li>macOS: child process no longer spawned with <code class="cl-code">detached: true</code>, matching</li><br/></ul> hello-halo's proven spawning strategy. Combined with the stdio transport<br/> change, this avoids the session-leader security path that Gatekeeper may<br/> flag.<br/><ul class="cl-ul"><li>macOS: <code class="cl-code">clearMacOSQuarantine()</code> now also runs <code class="cl-code">spctl --assess</code> on the</li><br/></ul> resolved native binary and attempts <code class="cl-code">spctl --add</code> if the assessment is<br/> not accepted, providing an additional approval layer beyond <code class="cl-code">xattr -cr</code>.<br/><ul class="cl-ul"><li>Direct native binary spawn: <code class="cl-code">resolveCodexNativeBinary()</code> resolves the</li><br/></ul> vendored codex binary (bypassing the JS shim) to avoid the grandchild<br/> process hop that Gatekeeper intercepts even when quarantine is cleared.<br/><ul class="cl-ul"><li>Added <code class="cl-code">/docs/changelog</code> page that renders CHANGELOG.md in the annodex UI.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>macOS: corrected kill-on-close logic to use process-group kill only on</li><br/></ul> Linux (where detached is still true), preventing accidental signal<br/> propagation to annodex's own process group on macOS.<br/><ul class="cl-ul"><li>macOS: improved Gatekeeper diagnostic message with <code class="cl-code">spctl --add</code> and</li><br/></ul> manual Terminal-approval workaround instructions.</p><p class="cl-p"><h1 class="cl-h1">Changelog</h1></p><p class="cl-p"><h2 class="cl-h2">0.1.52</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>macOS: <code class="cl-code">clearMacOSQuarantine()</code> now targets the entire <code class="cl-code">@openai/codex</code> package</li><br/></ul> tree and the npm bin shim with <code class="cl-code">xattr -cr</code> (recursive clear-all), not just<br/> the vendored native binary. This resolves cases where macOS Gatekeeper/XProtect<br/> killed the process even after <code class="cl-code">com.apple.quarantine</code> was removed from the<br/> vendored binary alone.<br/><ul class="cl-ul"><li>macOS: improved the Gatekeeper kill diagnostic message with a one-liner</li><br/></ul> <code class="cl-code">xattr -cr</code> fix command.</p><p class="cl-p"><h2 class="cl-h2">0.1.51</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li>macOS: <code class="cl-code">lib/codex-server.ts</code> now automatically clears the <code class="cl-code">com.apple.quarantine</code></li><br/></ul> extended attribute from vendored codex native binaries before spawning the<br/> app-server, preventing silent Gatekeeper/XProtect kills that caused "No agent<br/> runtime is active" on macOS.<br/><ul class="cl-ul"><li>macOS: improved <code class="cl-code">proc.on("exit")</code> diagnostics — when the codex process is</li><br/></ul> killed by a signal, the server log now includes a macOS Gatekeeper hint with<br/> manual fix instructions.</p><p class="cl-p"><h2 class="cl-h2">0.1.50</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Ignored local <code class="cl-code">tmp/</code> protocol scratch files and the uncurated site image <code class="cl-code">site/public/images/搜索框传播样式-白色版.png</code> so they no longer pollute the release worktree or get staged by accident.</li><br/></ul><br/><h2 class="cl-h2">0.1.49</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Finalized in-flight subagent runs when a turn ends or the user aborts, so the Subagent panel no longer leaves stale <code class="cl-code">running</code> / <code class="cl-code">pending</code> entries hanging after cancellation or failure.</li><br/></ul><br/><h2 class="cl-h2">0.1.48</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li>Added first-pass Extensions management in Settings and chat, including per-session extension visibility and toggles for enabled vs available extensions.</li><br/><li>Added a browser-use extension testing checklist at <code class="cl-code">docs/browser-use-extension-test-plan.md</code> to document the minimum end-to-end validation flow.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Synced saved enabled MCP extensions into the Codex MCP registry on save so newly configured servers can be discovered by runtime sessions without extra manual registration.</li><br/></ul><br/><h2 class="cl-h2">0.1.47</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li>Added a WeChat follow card on the website homepage pointing users to the <code class="cl-code">seqyuan</code>公众号 for updated annodex tutorials and Windows setup guidance.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Sidebar: increased project/chat loading timeout from 15s to 30s and converted abort/timeout failures into friendly retry messages, reducing macOS <code class="cl-code">AbortError: signal is aborted without reason</code> reports during slow Codex startup.</li><br/><li>Skills: made skill path validation cross-platform by replacing hard-coded POSIX <code class="cl-code">/.codex/skills/</code> checks with normalized path resolution, fixing Windows skill search/install follow-up operations against user and project <code class="cl-code">.codex/skills</code> directories.</li><br/></ul><br/><h2 class="cl-h2">0.1.46</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li>Expanded the website quick start with detailed Windows Miniforge installation, Codex initialization, Annodex launch, and DeepSeek model setup steps.</li><br/><li>Added a screenshot-based Usage Guide covering model configuration, skills, file preview, runtime monitoring, and mobile browser usage.</li><br/><li>Added product screenshots to the homepage and documentation overview.</li><br/><li>Documented platform app-server transport defaults and added startup logging for the selected Codex app-server transport.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Ensured website documentation references tracked screenshot assets so published docs render images correctly.</li><br/></ul><br/><h2 class="cl-h2">0.1.45</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li>Added a wildcard Codex app-server notification hook so annodex can normalize all incoming app-server events consistently across WebSocket and stdio transports.</li><br/><li>Added optional Codex event diagnostics with ANNODEX_CODEX_EVENT_LOG=1.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Improved streaming output by lazily starting assistant rendering when text deltas arrive before turn or item lifecycle events.</li><br/><li>Added streaming support for Codex reasoning text and reasoning summary deltas.</li><br/><li>Avoided treating completed agent messages as new streamed content when deltas were already received, while preserving completed-message fallback when no deltas arrive.</li><br/></ul><br/><h2 class="cl-h2">0.1.44</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li>Added dual Codex app-server transports: existing WebSocket mode and a new stdio JSON-RPC mode.</li><br/><li>Windows now defaults to stdio transport, while macOS/Linux keep the existing WebSocket transport.</li><br/><li>Added ANNODEX_CODEX_TRANSPORT=ws|stdio|auto override for transport selection.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Improved Windows compatibility by avoiding local port/listener readiness issues that can leave chats stuck loading or turns stalled.</li><br/><li>Codex server registry keys now include transport mode so WebSocket and stdio app-server instances are not accidentally reused across modes.</li><br/></ul><br/><h2 class="cl-h2">0.1.43</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Windows: completed the Codex app-server JSON-RPC handshake by sending the required <code class="cl-code">initialized</code> notification immediately after <code class="cl-code">initialize</code>, matching CodePilot/hello-halo and fixing cases where sidebar chat loading, thread start/resume, and agent replies could stall.</li><br/><li>Sessions: added a 12-second timeout fallback for workspace <code class="cl-code">thread/list</code> loading so the sidebar no longer stays on "Loading chats..." indefinitely when the workspace app-server is stuck; it falls back to local session summaries instead.</li><br/></ul><br/><h2 class="cl-h2">0.1.42</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li>Sidebar: renamed project section label from "Threads" to "Projects".</li><br/><li>Sidebar: removed the "drag to sort, pin to top" hint next to the project label.</li><br/></ul><br/><h2 class="cl-h2">0.1.41</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li>Simplified <code class="cl-code">annodex passwd</code>: terminal access now grants password-reset permission. No old password prompt, single new-password entry. Empty input disables auth. <code class="cl-code">--reset</code> still works as a silent alias for backward compatibility.</li><br/><li>Simplified <code class="cl-code">promptPassword()</code> (first-run setup) to match the single-entry flow.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Windows: <code class="cl-code">.cmd</code>/<code class="cl-code">.bat</code> shim binaries (e.g. <code class="cl-code">codex.cmd</code>) now launch through <code class="cl-code">cmd.exe /d /s /c</code> with <code class="cl-code">windowsVerbatimArguments</code>, matching CodePilot's <code class="cl-code">buildCodexLaunch()</code> pattern. Fixes spawn failures when the codex binary is an npm-installed shim in a path with spaces.</li><br/><li>Windows: <code class="cl-code">findListeningPids()</code> now uses <code class="cl-code">Get-NetTCPConnection</code> (PowerShell) primary and <code class="cl-code">netstat</code> fallback for port detection, replacing the previous blank <code class="cl-code">return []</code> on win32.</li><br/><li>Windows: <code class="cl-code">readProcessCmdline()</code> now supports win32 via <code class="cl-code">Get-CimInstance</code> / <code class="cl-code">wmic</code> fallback.</li><br/></ul></p><p class="cl-p"><h2 class="cl-h2">0.1.40</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Fixed <code class="cl-code">codex</code> CLI not found (<code class="cl-code">ENOENT</code>) on Windows: <code class="cl-code">getCodexExecutablePath()</code> now searches for <code class="cl-code">codex.cmd</code> and <code class="cl-code">codex.exe</code> in addition to <code class="cl-code">codex</code>, scans the global npm <code class="cl-code">node_modules/.bin</code> directory, and uses <code class="cl-code">__dirname</code>-relative lookup for globally-installed annodex. Connection failure errors now include a clear hint about the missing binary path.</li><br/></ul><br/><h2 class="cl-h2">0.1.39</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li><code class="cl-code">handleSend</code> no longer removes the user's message on failure — the message stays visible and a descriptive "Send failed: …" error is shown, making it obvious when an agent request fails instead of silently flashing the message away.</li><br/></ul><br/><h2 class="cl-h2">0.1.38</h2></p><p class="cl-p"><h3 class="cl-h3">Improvements</h3><br/><ul class="cl-ul"><li>Preset providers (DeepSeek, Moonshot AI, Zhipu, MiniMax) now auto-discover models from the provider's API (<code class="cl-code">/v1/models</code>) after entering an API key, instead of using a static preset model list. Falls back to preset models if the API is unreachable.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Added 15-second fetch timeout to <code class="cl-code">loadSessionsForCwd</code> and <code class="cl-code">loadProjects</code> in the sidebar, preventing permanent "Loading chats…" hang on slow or blocked network connections.</li><br/></ul><br/><h2 class="cl-h2">0.1.37</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Fixed constant screen flickering on Windows caused by <code class="cl-code">router.replace("/")</code> navigating away from <code class="cl-code">/workspace</code> and triggering a <code class="cl-code">redirect</code> → remount loop in <code class="cl-code">AppShell</code>. Three <code class="cl-code">handleCwdChange</code> / <code class="cl-code">handleNewSession</code> / <code class="cl-code">handleSessionDeleted</code> paths now use <code class="cl-code">/workspace</code> instead of <code class="cl-code">/</code>.</li><br/></ul><br/><h2 class="cl-h2">0.1.36</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Removed the tracked <code class="cl-code">presentation/</code> publishing assets and root <code class="cl-code">.source/</code> generated files from the Git repository so release secret scanning no longer flags embedded cookies or tokens.</li><br/><li>Removed the obsolete root Fumadocs MDX build hook from the main app, fixing release <code class="cl-code">npm-publish</code> builds that failed on <code class="cl-code">source.config.ts</code> externalization.</li><br/></ul><br/><h2 class="cl-h2">0.1.35</h2></p><p class="cl-p"><h3 class="cl-h3">Improvements</h3><br/><ul class="cl-ul"><li>Refined the mobile chat input sheet interactions so phone users can reach composer actions more reliably without dialog overlays blocking taps near the bottom edge.</li><br/><li>Added built-in provider presets for DeepSeek, Moonshot AI, Zhipu AI, MiniMax, and OpenRouter to speed up API-key-based model setup.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Changed provider preset insertion in the Models dialog to update only the local draft until Save, preventing unsaved provider edits from being clobbered.</li><br/><li>Allowed writable annodex provider entries to override same-id read-only Codex providers from merged config.</li><br/><li>Switched the OpenRouter preset default protocol to OpenAI Responses for correct out-of-box behavior.</li><br/></ul><br/><h2 class="cl-h2">0.1.34</h2></p><p class="cl-p"><h3 class="cl-h3">New</h3><br/><ul class="cl-ul"><li>Added presentation assets for annodex product introduction: HyperFrames HTML composition with 6-scene Chinese narration, TTS audio, and CSS-rendered virtual UI showcasing the browser-based AI workspace experience.</li><br/><li>Added WeChat official account promotional article (<code class="cl-code">presentation/wechat_article.md</code>) targeting bioinformatics researchers.</li><br/><li>Added automated Xiaohongshu (RED) publishing scripts using Selenium/Playwright for one-click note posting with Firefox login session reuse.</li><br/></ul><br/><h3 class="cl-h3">Documentation</h3><br/><ul class="cl-ul"><li>Updated product messaging across presentation and promotion materials: unified URL to <code class="cl-code">annodex.seqyuan.cn</code>, refined value proposition around eliminating ChatGPT/VPN barriers, DeepSeek API format bridging, and bioinformatics-specific generative UI.</li><br/></ul><br/><h2 class="cl-h2">0.1.33</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li>Simplified the root app back to the local workspace role: <code class="cl-code">/</code> now redirects to <code class="cl-code">/workspace</code>, while the standalone <code class="cl-code">site/</code> subproject remains the only public-facing docs/marketing surface.</li><br/></ul><br/><h3 class="cl-h3">Maintenance</h3><br/><ul class="cl-ul"><li>Removed the duplicated root-app docs route, root MDX loader chain, and mirrored <code class="cl-code">content/docs</code> sources that were superseded by <code class="cl-code">site/</code>.</li><br/><li>Updated lint ignores so <code class="cl-code">site/.next</code> and <code class="cl-code">site/.source</code> generated files do not pollute root-repo lint results.</li><br/></ul><br/><h2 class="cl-h2">0.1.32</h2></p><p class="cl-p"><h3 class="cl-h3">Improvements</h3><br/><ul class="cl-ul"><li>Added a standalone <code class="cl-code">site/</code> public documentation subproject so Vercel can deploy the explanation site without exposing the main local workspace app, APIs, or <code class="cl-code">/workspace</code> route.</li><br/><li>Reframed the public-site copy and docs to make the local/LAN product boundary explicit: the hosted site is documentation only, while annodex itself remains a local-first browser workspace.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Restored historical message timestamps by hydrating chat history from local Codex session JSONL records instead of assigning the entire loaded thread the same <code class="cl-code">updatedAt</code> time.</li><br/></ul><br/><h2 class="cl-h2">0.1.31</h2></p><p class="cl-p"><h3 class="cl-h3">Improvements</h3><br/><ul class="cl-ul"><li>Added presentation copy and helper scripts for rendering or manually publishing the annodex promo deck and Xiaohongshu post assets.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Normalized assistant messages that arrive as plain strings so the session UI still renders them as text blocks instead of dropping their content.</li><br/><li>Removed outdated public/open-source wording from the presentation deck so the promo materials match the current annodex positioning and repository visibility.</li><br/></ul><br/><h2 class="cl-h2">0.1.30</h2></p><p class="cl-p"><h3 class="cl-h3">Improvements</h3><br/><ul class="cl-ul"><li>Added a public-facing landing page and documentation section so annodex now has a clearer project website instead of dropping users directly into the workspace UI.</li><br/><li>Added a dedicated <code class="cl-code">/workspace</code> route for the actual working interface, keeping the browser workspace accessible while allowing <code class="cl-code">/</code> and <code class="cl-code">/docs</code> to serve as product-facing entry points.</li><br/><li>Expanded the documentation set with quick start, installation, configuration, architecture, runtime, and workspace guides aligned to the current annodex product surface.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Corrected project-site and docs copy to reflect the current product structure, including the workspace entry path and the removal of the old Report tab terminology.</li><br/><li>Excluded generated Fumadocs <code class="cl-code">.source/</code> files from linting and git noise, while keeping the authored docs content tracked in the repository.</li><br/></ul><br/><h2 class="cl-h2">0.1.29</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Switched the mobile composer overflow menu outside-click handling to <code class="cl-code">pointerdown</code> with <code class="cl-code">mousedown</code> fallback, so tapping the three-dot button on phones reliably opens the More menu.</li><br/></ul><br/><h2 class="cl-h2">0.1.28</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Cleared the server-side prompt busy state as soon as an <code class="cl-code">agent_end</code> event arrives, so completed assistant replies no longer leave the composer stuck showing the red Stop button.</li><br/></ul><br/><h2 class="cl-h2">0.1.27</h2></p><p class="cl-p"><h3 class="cl-h3">Improvements</h3><br/><ul class="cl-ul"><li>Expanded project/session loading to prefer complete Codex thread metadata, so project chat counts and expanded project histories can reflect the full set of chats instead of only local cache fragments.</li><br/><li>Added per-project chat count display in the left sidebar and a recent-project chat count fallback, making project activity easier to scan without opening every thread.</li><br/><li>Improved chat runtime visibility with a live Working panel, elapsed-seconds label, periodic reconcile while sessions are running, and default full-access sandbox mode for new or resumed chats when configured.</li><br/><li>Tightened mobile chat UX: the minimap and subagent overlays stay out of the way on phones, the composer is more compact and sticky, and the final messages now keep enough bottom space above the mobile input bar.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Restored assistant timestamp rendering after replies finish so completed AI messages keep their visible time markers.</li><br/><li>Hardened client refresh behavior with more reliable streaming/reconcile updates, reducing cases where users had to manually refresh the page to see the assistant reply.</li><br/></ul><br/><h2 class="cl-h2">0.1.25</h2></p><p class="cl-p"><h3 class="cl-h3">Improvements</h3><br/><ul class="cl-ul"><li>Reworked the chat message surface with a live process panel that keeps tool calls, thinking blocks, and runtime status visible while a Codex session is running.</li><br/><li>Added floating preview windows for images and PDFs, including gallery navigation for generated image groups, so visual files no longer need to occupy right-panel tabs.</li><br/><li>Expanded the chat input toolbar with a slash-command menu and practical prompt shortcuts for <code class="cl-code">/memory</code>, <code class="cl-code">/init</code>, and <code class="cl-code">/goal</code>, while keeping <code class="cl-code">/compact</code> as the only true native command.</li><br/><li>Added persistent app settings for default sandbox mode and auto-restart, and wired the default sandbox choice into new sessions and restored threads.</li><br/><li>Upgraded the project sidebar to support stable project ordering with pinning and manual reorder metadata, while keeping project history lazy-loaded.</li><br/></ul><br/><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li>Simplified the CLI help output by removing app-specific environment variable details from the default help screen.</li><br/></ul><br/><h2 class="cl-h2">0.1.24</h2></p><p class="cl-p"><h3 class="cl-h3">Improvements</h3><br/><ul class="cl-ul"><li>Reduced global install weight by moving build-only frontend packages out of runtime dependencies while keeping the production <code class="cl-code">.next</code> package layout.</li><br/><li>Kept the npm package source-minimized: published files still contain production build artifacts, CLI files, defaults, and public assets rather than app/component source trees.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Added a package check that prevents build-only frontend libraries from accidentally returning to runtime dependencies.</li><br/></ul><br/><h2 class="cl-h2">0.1.23</h2></p><p class="cl-p"><h3 class="cl-h3">Maintenance</h3><br/><ul class="cl-ul"><li>Released the verified 0.1.22 project sidebar, lazy session loading, and new-chat rollout handling changes as the current patch version.</li><br/><li>Confirmed the local development server can run on an alternate Next.js dev port when the default port is already occupied.</li><br/></ul><br/><h2 class="cl-h2">0.1.22</h2></p><p class="cl-p"><h3 class="cl-h3">Improvements</h3><br/><ul class="cl-ul"><li>Reworked the left sidebar project list to a CodePilot-style Threads view with compact expandable project rows and hover actions for starting a chat in a project.</li><br/><li>Updated the add-project dialog so users can either browse server folders or manually enter a project path and use it directly.</li><br/><li>Kept project session history lazy-loaded per project so opening the sidebar does not eagerly read every Codex thread.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Fixed session restore paths to use lightweight thread metadata lookup before loading full history, preventing old sessions from being blocked by unrelated project/session scans.</li><br/><li>Treated missing Codex rollouts and not-found thread reads as absent sessions instead of hard failures.</li><br/><li>Skipped <code class="cl-code">thread/resume</code> before the first prompt for newly created chats, avoiding <code class="cl-code">no rollout found</code> errors on new thread startup.</li><br/></ul><br/><h2 class="cl-h2">0.1.21</h2></p><p class="cl-p"><h3 class="cl-h3">Improvements</h3><br/><ul class="cl-ul"><li>Reworked the left sidebar project channel to match the AnnoVibe grouped project view: all chat projects are shown, project chat history is collapsible, and only the current or most recently active project expands by default.</li><br/><li>Added a right-panel Tools tab that shows live Codex chat runtime status, including phase, model, active tools, wait time, last event, and abort control.</li><br/><li>Added a lightweight Starfleet-inspired favicon.</li><br/><li>Opened the right panel on Files by default after removing the Report tab.</li><br/></ul><br/><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li>Removed the Analysis Report tab, report update parsing, report prompt injection, report storage, and report API surface.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Exposed <code class="cl-code">/api/agent/runtime</code> for UI runtime polling and expanded runtime state tracking for running sessions.</li><br/></ul><br/><h2 class="cl-h2">0.1.20</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Wait for the <code class="cl-code">connected</code> SSE event before sending the first prompt in new and resumed chats, so the event subscription is live before Codex emits turn events.</li><br/><li>Treat agent event stream connection timeouts as send failures instead of entering "Waiting for model...", and clean up unconfirmed EventSource connections.</li><br/><li>Prevent duplicate sends while a chat is still creating its session or waiting for SSE setup.</li><br/><li>Send the SSE <code class="cl-code">connected</code> event only after the server has registered the session event listener.</li><br/></ul><br/><h2 class="cl-h2">0.1.19</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Fixed new chats getting stuck on "Waiting for model..." after the temporary new-session view switches to the real Codex thread id.</li><br/><li>Scoped EventSource cleanup to the session id it owns so session creation, model-switch forks, and reconnects do not accidentally close the active SSE stream.</li><br/></ul><br/><h2 class="cl-h2">0.1.18</h2></p><p class="cl-p"><h3 class="cl-h3">Improvements</h3><br/><ul class="cl-ul"><li>Moved the file explorer out of the left sidebar into a persistent right-panel Files tab.</li><br/><li>Restored the left sidebar project list as an expanded project tree, with only the most recently active or current project's chats expanded by default.</li><br/><li>Open PDF and image files in draggable preview windows instead of occupying right-panel file tabs.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Kept project chat loading scoped per project so expanding one project's history does not force all project histories to load at once.</li><br/></ul><br/><h2 class="cl-h2">0.1.17</h2></p><p class="cl-p"><h3 class="cl-h3">Improvements</h3><br/><ul class="cl-ul"><li>Added the Annodex Router provider so Codex app-server now sees one stable <code class="cl-code">annodex-router</code> provider per workspace while Annodex routes real provider/model requests by wire model key.</li><br/><li>Centralized Responses and Chat Completions routing in the local router, reusing the compat proxy translation path for Chat-only providers.</li><br/><li>Kept legacy multi-provider workspace env generation available as a rollback/test path.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Resumed chats now bind the current wire model before each prompt, allowing historical chats to continue and switch models without losing the thread.</li><br/><li>Prevented <code class="cl-code">annodex-router</code> provider ids and hashed wire model keys from leaking into UI session runtime, history rendering, and context usage recovery.</li><br/><li>Preserved protocol correctness by keeping <code class="cl-code">turn/start</code> provider-stable and sending only the wire model id for each turn.</li><br/></ul><br/><h2 class="cl-h2">0.1.11</h2></p><p class="cl-p"><h3 class="cl-h3">Improvements</h3><br/><ul class="cl-ul"><li>Router/relay providers (DeepRouter, OpenRouter, etc.) now default to Responses API without the compat proxy, matching codex CLI behavior and eliminating ~6s of SSE translation latency.</li><br/><li>New chats auto-select a default model from annodex providers.json when no codex config.toml default is set.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Cross-provider model switching no longer forces a full ChatWindow remount, preserving the selected model across the fork so the UI does not appear blank after switching.</li><br/><li>Session-change effect uses <code class="cl-code">[session?.id]</code> dependency instead of mount-only, with a ref guard to avoid reconnecting the already-live EventSource after the first message creates a session.</li><br/></ul><br/><h2 class="cl-h2">0.1.10</h2></p><p class="cl-p"><h3 class="cl-h3">Improvements</h3><br/><ul class="cl-ul"><li>Added collapsible "Chats" section in the sidebar, matching the existing Project and Explorer toggle behavior, with session count display.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Fixed cross-provider session context loading (e.g. DeepRouter threads queried through DeepSeek server) by looking up the session's stored provider runtime before choosing a codex app-server instance.</li><br/><li>Moved <code class="cl-code">codexServerEnvForModel</code> to a shared location to avoid circular imports between <code class="cl-code">rpc-manager</code> and <code class="cl-code">session-reader</code>.</li><br/></ul><br/><h2 class="cl-h2">0.1.9</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Fixed cross-provider model switching (e.g. DeepSeek → DeepRouter) silently creating a fresh thread instead of leaking a "thread not found" error, since each codex app-server instance only knows its own threads.</li><br/></ul><br/><h2 class="cl-h2">0.1.8</h2></p><p class="cl-p"><h3 class="cl-h3">Improvements</h3><br/><ul class="cl-ul"><li>Added per-provider <code class="cl-code">reasoningConfig</code> to <code class="cl-code">providers.json</code>, allowing explicit control over thinking/reasoning parameter mapping (thinkingParam, effortParam, effortValueMode) when the compat proxy translates OpenAI Resposnes to Chat Completions. Falls back to hardcoded provider defaults when not configured.</li><br/><li>Vulcan salute (LLAP 🖖) favicon replacing the generic hand icon.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>GPT-pattern models (e.g. <code class="cl-code">gpt-5.5</code>) on Chat Completions providers like DeepRouter no longer force <code class="cl-code">openai-responses</code>; they now inherit the provider's API setting, ensuring the compat proxy starts and translates correctly.</li><br/><li>Included <code class="cl-code">reasoningConfig</code> fingerprint in the codex app-server instance key so switching models with different thinking parameter mappings creates a fresh compat proxy instead of reusing a stale one.</li><br/></ul><br/><h2 class="cl-h2">0.1.7</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Moved <code class="cl-code">-c</code> global config overrides before the <code class="cl-code">app-server</code> subcommand so Codex app-server correctly loads dynamic provider settings (DeepSeek, DeepRouter, etc.), fixing sessions that were stuck on "Waiting for model...".</li><br/><li>Fixed DeepRouter/OpenRouter API detection — now correctly identified as Chat Completions providers instead of defaulting to OpenAI Responses, ensuring the compat proxy translates requests properly.</li><br/><li>Added <code class="cl-code">crazyrouter</code>, <code class="cl-code">therouter</code> to Chat Completions provider patterns and compat proxy detection for consistent routing.</li><br/></ul><br/><h2 class="cl-h2">0.1.6</h2></p><p class="cl-p"><h3 class="cl-h3">Improvements</h3><br/><ul class="cl-ul"><li>Kept UI-managed providers and Codex home providers distinct when their ids or model names collide, so duplicate models such as <code class="cl-code">gpt-5.5</code> resolve to the selected source.</li><br/><li>Marked Codex-loaded providers as read-only in the Models settings UI and prevented them from being written back to annodex provider config.</li><br/><li>Replaced the old pi favicon with an LLAP hand favicon.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Resolved provider normalization and app-server switching issues that could send a UI-configured deeprouter GPT model through a stale DeepSeek-compatible connection.</li><br/><li>Added session alias handling when Codex cannot resume an old thread and creates a replacement thread, fixing restored-session <code class="cl-code">thread not found</code> failures.</li><br/><li>Removed the misleading Steer and Follow-up input controls because Codex app-server does not support native steer or queued follow-up operations.</li><br/></ul><br/><h2 class="cl-h2">0.1.5</h2></p><p class="cl-p"><h3 class="cl-h3">Improvements</h3><br/><ul class="cl-ul"><li>Added collapsible Project controls in the left sidebar, matching the Explorer section behavior.</li><br/><li>Made the Project header refresh projects and current project sessions when toggled, while keeping the dedicated refresh button for refresh-only updates.</li><br/><li>Improved deeprouter and mixed-provider model handling so GPT-style models can use OpenAI Responses while DeepSeek/Kimi/Qwen-style models use Chat Completions through the compat proxy.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Switched Codex app-server connections when the UI model/provider changes, preventing a selected deeprouter GPT model from being sent through a stale DeepSeek provider connection.</li><br/><li>Preserved <code class="cl-code">custom</code> providers in session runtime so restored sessions keep the correct provider context.</li><br/><li>Merged Codex <code class="cl-code">~/.codex/config.toml</code> and <code class="cl-code">auth.json</code> defaults with annodex-managed provider models, including API key discovery from Codex auth state.</li><br/></ul><br/><h2 class="cl-h2">0.1.4</h2></p><p class="cl-p"><h3 class="cl-h3">Improvements</h3><br/><ul class="cl-ul"><li>Restored Codex token statistics in the top bar by reading <code class="cl-code">token_count</code> events from local Codex session JSONL history.</li><br/><li>Added context usage recovery for Codex app-server sessions, including context window fallback from known model defaults and configured models.</li><br/><li>Attached per-turn token usage to assistant messages when Codex history includes usage snapshots.</li><br/><li>Display context usage as used tokens over context window, with percentage detail in the tooltip.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Avoided double-counting duplicate Codex token snapshots emitted during the same turn.</li><br/><li>Kept live agent state aligned with recovered context usage after refresh or idle resume.</li><br/></ul><br/><h2 class="cl-h2">0.1.3</h2></p><p class="cl-p"><h3 class="cl-h3">Improvements</h3><br/><ul class="cl-ul"><li>Aligned model settings with annodex's Codex Web target by supporting only the two backend protocols that actually run: OpenAI Responses and Chat Completions through the compat proxy.</li><br/><li>Added provider protocol inference so DeepSeek/Kimi/Qwen/Zhipu-style endpoints default to Chat Completions while OpenAI and deeprouter-style endpoints default to Responses.</li><br/><li>Made model testing perform a real lightweight provider request instead of returning a placeholder success.</li><br/><li>Preserved model-level protocol overrides, reasoning flags, thinking-level maps, and compatibility metadata across save/load.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Reused Codex app-server processes only when provider protocol, base URL, API key source, and context window match, preventing stale credentials after model settings changes.</li><br/><li>Passed thinking-level defaults into the Chat Completions compat proxy for reasoning-capable providers.</li><br/><li>Kept model, skills, projects, and session APIs aligned with <code class="cl-code">CODEX_HOME</code> and active Codex runtime state.</li><br/></ul><br/><h2 class="cl-h2">0.1.2</h2></p><p class="cl-p"><h3 class="cl-h3">Improvements</h3><br/><ul class="cl-ul"><li>Load projects, sessions, skills, and model settings from local Codex/annodex state without blocking on a cold <code class="cl-code">codex app-server</code> startup.</li><br/><li>Read Codex-native skills from project, user, and system skill directories, and install skills with the Codex agent target.</li><br/><li>Make model configuration work with just <code class="cl-code">baseUrl</code>, <code class="cl-code">apiKey</code>, and a manually entered model id; model discovery is now optional.</li><br/><li>Surface managed-server update and idle-restart state in the Web UI top bar.</li><br/><li>Improve Analysis Report prompting and fallback generation with representative figure links and richer output file notes.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Fixed settings panels that could remain stuck on loading for projects, skills, and models.</li><br/><li>Preserved Codex defaults from <code class="cl-code">~/.codex/config.toml</code> unless the user explicitly changes annodex-managed defaults.</li><br/><li>Scoped session listing to the active project and skipped injected context in previews.</li><br/></ul><br/><h2 class="cl-h2">0.8.17</h2></p><p class="cl-p"><h3 class="cl-h3">Improvements</h3><br/><ul class="cl-ul"><li>Added streaming progress updates and cancel support for skill installs.</li><br/><li>Made <code class="cl-code">npx skills</code> invocation non-interactive and increased the install timeout for slow GitHub clones.</li><br/><li>Improved skill install error cleanup so spinner control codes and npm first-run warnings do not obscure the real failure.</li><br/><li>Fixed the npm publish workflow package name after the AnnoVibe rename.</li><br/></ul><br/><h2 class="cl-h2">0.8.16</h2></p><p class="cl-p"><h3 class="cl-h3">Improvements</h3><br/><ul class="cl-ul"><li>Auto-detect image-capable models during Models discovery and import them with <code class="cl-code">input: ["text", "image"]</code>.</li><br/><li>Show an <code class="cl-code">image</code> capability marker in the Models discovery list for imported vision models.</li><br/></ul><br/><h2 class="cl-h2">0.8.15</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Fixed Plot tool preset activation so new sessions actually allow <code class="cl-code">kernel_plot_*</code> tools.</li><br/><li>Kept Plot mode synced on existing sessions after idle wrapper recreation or later prompts.</li><br/><li>Prevented Plot mode from being implicitly enabled when restoring ordinary sessions.</li><br/></ul><br/><h2 class="cl-h2">0.8.14</h2></p><p class="cl-p"><h3 class="cl-h3">Improvements</h3><br/><ul class="cl-ul"><li>Added idle-aware auto-restart for managed AnnoVibe servers after package updates.</li><br/><li>Improved bioinformatics analysis reporting so completed analysis runs create topic-scoped Report updates, including large PDF/result directories.</li><br/><li>Prefer generated UI widgets over Mermaid for diagrams unless raw Mermaid/source output is explicitly requested.</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li>Fixed PDF.js compatibility in browsers missing <code class="cl-code">Uint8Array.prototype.toHex</code>.</li><br/><li>Prevented Mermaid syntax errors from flooding or crashing the chat UI.</li><br/><li>Added clearer sidebar API error messages and ignored local <code class="cl-code">.pi/</code> workspace data.</li><br/></ul><br/><h2 class="cl-h2">0.8.12</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li>Renamed the product surface from Pidex to AnnoVibe / annovibe.</li><br/><li>Added AnnoVibe version checking with npm update command hints.</li><br/><li>Added plot kernel status APIs, memory display, release action, and idle timeout settings.</li><br/><li>Kept legacy pidex settings, auth cookies, and CLI state files compatible during migration.</li><br/></ul><br/><h2 class="cl-h2">0.7.9</h2></p><p class="cl-p"><h3 class="cl-h3">Improvements</h3><br/><ul class="cl-ul"><li><strong>Global file editor in right panel</strong> — soul.md and harness.md now open in right panel with CodeMirror, instead of inline sidebar textarea.</li><br/></ul><br/><h2 class="cl-h2">0.7.8</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li><strong>stderr null reference</strong> on daemon detach.</li><br/></ul><br/><h2 class="cl-h2">0.7.7</h2></p><p class="cl-p"><ul class="cl-ul"><li>Updated README with all features and CLI commands.</li><br/></ul><br/><h2 class="cl-h2">0.7.6</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li><strong>Login redirect</strong> — auth env was exposed to <code class="cl-code">next.config.ts</code> so Edge Runtime middleware can read it.</li><br/><li><strong>Password management</strong> — <code class="cl-code">annovibe passwd</code> (change), <code class="cl-code">annovibe passwd --reset</code> (remove). Password stored at <code class="cl-code">~/.pi/agent/web-auth.json</code>.</li><br/></ul><br/><h2 class="cl-h2">0.7.5</h2></p><p class="cl-p"><h3 class="cl-h3">New Features</h3><br/><ul class="cl-ul"><li><strong>CLI commands</strong> — <code class="cl-code">annovibe --version</code>, <code class="cl-code">annovibe --help</code>, <code class="cl-code">annovibe update</code> (self-update from npm).</li><br/><li><strong>Version check</strong> — auto-checks npm for newer version on startup.</li><br/></ul><br/><h2 class="cl-h2">0.7.4</h2></p><p class="cl-p"><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li><strong>Removed @lobehub/icons</strong> — replaced 25 provider icons with inline SVGs. Eliminates @lobehub/ui → antd → @emoji-mart heavy dependency chain. No more peer dependency warnings on install.</li><br/></ul><br/><h3 class="cl-h3">Improvements</h3><br/><ul class="cl-ul"><li><strong>Daemon mode</strong> — annovibe auto-detaches after startup, returns terminal prompt while server runs in background.</li><br/></ul><br/><h2 class="cl-h2">0.7.2</h2></p><p class="cl-p"><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li><strong>Login redirect broken</strong> — <code class="cl-code">router.push()</code> not sending <code class="cl-code">SameSite=Lax</code> cookie, causing endless login loop. Fixed with <code class="cl-code">window.location.href</code> hard navigation.</li><br/><li><strong>npm-publish workflow</strong> — explicit <code class="cl-code">.npmrc</code> auth token, handle already-published packages, fix <code class="cl-code">useSearchParams</code> Suspense wrapper, split <code class="cl-code">auth-token.ts</code> from bcryptjs for Edge Runtime compat.</li><br/></ul><br/><h2 class="cl-h2">0.7.1</h2></p><p class="cl-p"><h3 class="cl-h3">New Features</h3><br/><ul class="cl-ul"><li><strong>Streaming widgets</strong> — <code class="cl-code">show-widget</code> fence support. LLM outputs charts/plots/SVG inline during streaming, rendered in sandboxed iframe with postMessage protocol.</li><br/><li><strong>Visualization harness</strong> — global <code class="cl-code">harness.md</code> behavioral constraints. Default template covers when to visualize, chart type guidelines, and matplotlib/R script→base64 PNG embedding.</li><br/><li><strong>Global harness editor</strong> — inline editing in sidebar Context panel (same UX as soul.md).</li><br/></ul><br/><h3 class="cl-h3">Changes</h3><br/><ul class="cl-ul"><li>harness.md moved from per-project (<code class="cl-code">{cwd}/</code>) to global (<code class="cl-code">~/.pi/agent/</code>) alongside soul.md</li><br/><li>SoulEditor renamed to GlobalEditor (shared by soul.md + harness.md)</li><br/></ul><br/><h2 class="cl-h2">0.7.0</h2></p><p class="cl-p"><h3 class="cl-h3">New Features</h3><br/><ul class="cl-ul"><li><strong>Password authentication</strong> — optional password protection (like Jupyter). Set on first start via CLI prompt or <code class="cl-code">ANNOVIBE_PASSWORD</code> env var. bcrypt-hashed, HMAC-signed session cookies.</li><br/><li><strong>Subagent panel</strong> — track subagent runs (active/completed/failed) in a slide-out panel in the chat area.</li><br/><li><strong>Resizable panels</strong> — drag sidebar and right panel dividers to resize. Widths persist via localStorage.</li><br/><li><strong>Document viewers</strong> — PDF, DOCX, XLSX, PPTX preview in sidebar file explorer and drag-drop attachments in chat.</li><br/><li><strong>Text file editing</strong> — CodeMirror 6 editor with syntax highlighting for 10+ languages. Ctrl+S to save.</li><br/><li><strong>Project Context</strong> — sidebar section for soul.md (global, Spock personality), memory.md (project-level, self-updating), and AGENTS.md.</li><br/></ul><br/><h3 class="cl-h3">Improvements</h3><br/><ul class="cl-ul"><li>Renamed from <code class="cl-code">@agegr/pi-web</code> to <code class="cl-code">@seqyuan/annovibe</code></li><br/><li>SSE reconnection now works during tool execution (not just text streaming)</li><br/><li>File explorer auto-refreshes on custom path changes</li><br/><li>Custom messages (<code class="cl-code">subagent-notify</code>) now rendered in chat</li><br/><li>soul.md / memory.md auto-injected into system prompt at session creation</li><br/></ul><br/><h3 class="cl-h3">Fixes</h3><br/><ul class="cl-ul"><li><code class="cl-code">xdg-open</code> crash on systems without xdg-utils installed</li><br/><li>Session switching no longer loses in-progress agent responses</li><br/></ul></p></div><style>
|
|
2
2
|
.changelog-content { font-family: var(--font-noto-mono, monospace); line-height: 1.7; color: var(--color-fg, #e5e7eb); }
|
|
3
3
|
.cl-h1 { font-size: 28px; font-weight: 700; margin: 40px 0 16px; color: var(--color-fg, #f9fafb); border-bottom: 1px solid var(--color-border, #374151); padding-bottom: 8px; }
|
|
4
4
|
.cl-h2 { font-size: 22px; font-weight: 600; margin: 32px 0 12px; color: var(--color-accent, #60a5fa); }
|
|
@@ -7,4 +7,4 @@
|
|
|
7
7
|
.cl-ul { margin: 8px 0 16px 20px; padding: 0; }
|
|
8
8
|
.cl-ul li { margin: 4px 0; }
|
|
9
9
|
.cl-code { background: var(--color-bg-code, #1f2937); padding: 2px 6px; border-radius: 4px; font-size: 13px; }
|
|
10
|
-
</style></div><!--$--><!--/$--><div aria-live="polite" style="position:fixed;right:16px;bottom:16px;z-index:10050;display:flex;flex-direction:column;gap:8px;max-width:min(420px, calc(100vw - 32px));pointer-events:none"></div><script src="/_next/static/chunks/webpack-0b1e0af2488fca8f.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[11056,[\"8500\",\"static/chunks/8500-f62a38ff68ab7f42.js\",\"4550\",\"static/chunks/4550-eff0bf233a5b0aec.js\",\"7177\",\"static/chunks/app/layout-2e8a047b671c8731.js\"],\"RootProvider\"]\n3:I[58132,[\"8500\",\"static/chunks/8500-f62a38ff68ab7f42.js\",\"4550\",\"static/chunks/4550-eff0bf233a5b0aec.js\",\"7177\",\"static/chunks/app/layout-2e8a047b671c8731.js\"],\"AppProviders\"]\n4:I[57121,[],\"\"]\n5:I[74581,[],\"\"]\n6:I[98500,[\"8500\",\"static/chunks/8500-f62a38ff68ab7f42.js\",\"9089\",\"static/chunks/app/docs/changelog/page-7f8ff3ce79d21000.js\"],\"\"]\nc:I[27123,[],\"default\",1]\n:HL[\"/_next/static/media/7deddc85b7ffd1dc-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/ec14413c594b3356-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/css/6b00dcf032cca328.css\",\"style\"]\n:HL[\"/_next/static/css/fddca953485158e4.css\",\"style\"]\n7:T140c3,"])</script><script>self.__next_f.push([1,"\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.89\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eSSE transport: EventSource → fetch + ReadableStream\u003c/strong\u003e — the browser-side SSE consumer now uses \u003ccode class=\"cl-code\"\u003efetch()\u003c/code\u003e + \u003ccode class=\"cl-code\"\u003eReadableStreamDefaultReader\u003c/code\u003e (adapted from CodePilot's pattern) instead of the opaque \u003ccode class=\"cl-code\"\u003eEventSource\u003c/code\u003e API. This eliminates browser-internal SSE buffering that caused mid-output freezes and stale stop buttons. Manual line-by-line parsing gives full control over read timing and buffer sizes.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003e\u003cstrong\u003eStream lifecycle via \u003ccode class=\"cl-code\"\u003ecreateSSEReader\u003c/code\u003e\u003c/strong\u003e — new \u003ccode class=\"cl-code\"\u003elib/sse-reader.ts\u003c/code\u003e provides a managed \u003ccode class=\"cl-code\"\u003efetch\u003c/code\u003e+\u003ccode class=\"cl-code\"\u003ereader\u003c/code\u003e+\u003ccode class=\"cl-code\"\u003eAbortController\u003c/code\u003e lifecycle with explicit \u003ccode class=\"cl-code\"\u003eConnectionState\u003c/code\u003e tracking (\u003ccode class=\"cl-code\"\u003eidle\u003c/code\u003e/\u003ccode class=\"cl-code\"\u003econnecting\u003c/code\u003e/\u003ccode class=\"cl-code\"\u003econnected\u003c/code\u003e/\u003ccode class=\"cl-code\"\u003eclosed\u003c/code\u003e/\u003ccode class=\"cl-code\"\u003eerror\u003c/code\u003e), on-state-change callback, and abort-based cleanup. Reconnection uses exponential backoff just like the old EventSource path.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003e\u003cstrong\u003eRemoved dead \u003ccode class=\"cl-code\"\u003erecordStreamHeartbeat\u003c/code\u003e\u003c/strong\u003e — the old SSE-comment-based heartbeat path (\u003ccode class=\"cl-code\"\u003e:\\n\\n\u003c/code\u003e) was superseded by data-event heartbeats in v0.1.88 and is now fully removed.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eNo more EventSource buffering stalls — mid-output freezes where the model was still generating but the UI showed a stuck spinner and stale stop button are resolved.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eAbort now cleanly cancels the fetch via \u003ccode class=\"cl-code\"\u003eAbortController\u003c/code\u003e, eliminating the race where the old \u003ccode class=\"cl-code\"\u003eEventSource.close()\u003c/code\u003e could leave partial connections dangling.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.87\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eSSE stream freeze\u003c/strong\u003e — model replies no longer stall mid-output. Added three-layer defense: (1) client-side idle watchdog detects silent SSE disconnects within 60s and transitions stream to error state, (2) reconcile timer now always fetches full messages so even if \u003ccode class=\"cl-code\"\u003eagent_end\u003c/code\u003e is lost the UI self-heals within 10s, (3) SSE reconnect uses exponential backoff (1s → 30s cap) instead of fixed 1s retry.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003e\u003cstrong\u003eText rendering smoothness\u003c/strong\u003e — text deltas are now throttled at 100ms (per CodePilot pattern), preventing excessive React re-renders during rapid model output that caused visual stuttering and apparent freezes.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.88\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003eThree root causes were identified by comparing annodex, CodePilot, hello-halo, and hermes-agent streaming architectures. CodePilot uses fetch + ReadableStream reader (bypassing EventSource buffering), while annodex relied on browser EventSource which has known issues with invisible SSE comment heartbeats and opaque error handling.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eFix SSE stream freeze: when the stream controller is closed (client disconnect / backpressure), the server-side \u003ccode class=\"cl-code\"\u003eencode\u003c/code\u003e function now immediately cleans up the session event listener and heartbeat timer, preventing orphaned resources that caused the UI to appear frozen while the backend continued generating.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eFix SSE heartbeat invisible to EventSource: the server now sends heartbeats as data events (\u003ccode class=\"cl-code\"\u003e{\"type\":\"heartbeat\"}\u003c/code\u003e) instead of SSE comment lines (\u003ccode class=\"cl-code\"\u003e:\\n\\n\u003c/code\u003e), so the browser's EventSource \u003ccode class=\"cl-code\"\u003eonmessage\u003c/code\u003e handler can see them and reset the client-side idle watchdog.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eFix idle watchdog not propagating stream errors to React state: the stream-session-manager now has a \u003ccode class=\"cl-code\"\u003eregisterStreamErrorCallback\u003c/code\u003e mechanism that the idle watchdog uses to set \u003ccode class=\"cl-code\"\u003eagentRunning = false\u003c/code\u003e in the React layer, so the stop button disappears and the UI correctly shows the connection is dead.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eFix premature stream timeout: the idle watchdog now considers both \u003ccode class=\"cl-code\"\u003elastEventAt\u003c/code\u003e and \u003ccode class=\"cl-code\"\u003elastHeartbeatAt\u003c/code\u003e when deciding whether the stream is dead, so long-running tool executions (\u003e60s) don't trigger false-positive timeouts.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eHeartbeat interval reduced from 30s to 15s for faster dead-connection detection.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.86\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eSession loading 500 errors\u003c/strong\u003e — sessions whose working directory no longer exists (deleted projects, cleaned temp dirs) no longer trigger HTTP 500. \u003ccode class=\"cl-code\"\u003eloadCodexSessionContext\u003c/code\u003e now bails out early when \u003ccode class=\"cl-code\"\u003ecwd\u003c/code\u003e is missing on disk, avoiding a futile codex app-server spawn that would exceed WebSocket retry/timeout budgets.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003e\u003cstrong\u003eSession route error logging\u003c/strong\u003e — \u003ccode class=\"cl-code\"\u003eGET/PATCH/DELETE /api/sessions/[id]\u003c/code\u003e catch blocks now log the actual error with \u003ccode class=\"cl-code\"\u003econsole.error\u003c/code\u003e, making future session-load failures diagnosable from the server console.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.85\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eIM gateway auto-start\u003c/strong\u003e — annodex supervisor now spawns the IM gateway as a managed child process. \u003ccode class=\"cl-code\"\u003eannodex start\u003c/code\u003e automatically runs the gateway in the background; \u003ccode class=\"cl-code\"\u003eannodex stop\u003c/code\u003e cascades to stop it. Logs go to \u003ccode class=\"cl-code\"\u003e~/.config/annodex/annodex-im-gateway.log\u003c/code\u003e.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003e\u003cstrong\u003eChat attachment file upload\u003c/strong\u003e — dropping non-image files (yaml, json, txt, csv, tsv, pdf, docx, xlsx, pptx) into the chat input now uploads them to the project \u003ccode class=\"cl-code\"\u003e.annodex-uploads/\u003c/code\u003e directory and includes the saved path in the message.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eAudio playback\u003c/strong\u003e — reuse a single AudioContext instead of creating new ones per sound; resume suspended context (browser autoplay policy); increase completion sound volume from 0.18 to 0.4.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003e\u003cstrong\u003eImage upload refactor\u003c/strong\u003e — deduplicate shared types and helpers into \u003ccode class=\"cl-code\"\u003echat-attachment-shared.ts\u003c/code\u003e.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.84\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eSite build failure\u003c/strong\u003e — fix static page generation error \u003ccode class=\"cl-code\"\u003e/en/changelog\u003c/code\u003e caused by passing the raw \u003ccode class=\"cl-code\"\u003ei18n\u003c/code\u003e object (which contains a \u003ccode class=\"cl-code\"\u003etranslations\u003c/code\u003e function) to the \u003ccode class=\"cl-code\"\u003eHomeLayout\u003c/code\u003e client component. Removed \u003ccode class=\"cl-code\"\u003ei18n\u003c/code\u003e from \u003ccode class=\"cl-code\"\u003ebaseOptions()\u003c/code\u003e since the actual i18n functionality is handled by \u003ccode class=\"cl-code\"\u003eRootProvider\u003c/code\u003e context. Build now completes with all 20 pages.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.83\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eMobile extensions popover\u003c/strong\u003e — extensions (plugin) button at the bottom of chat input was clipped off-screen on mobile browsers. Now uses the same mobile sheet style as other dropdowns (model, thinking, tools, slash).\u003c/li\u003e\u003cbr/\u003e\u003cli\u003e\u003cstrong\u003e\u003ccode class=\"cl-code\"\u003e/goal\u003c/code\u003e multiline command\u003c/strong\u003e — \u003ccode class=\"cl-code\"\u003e/goal\u003c/code\u003e now splits on the first newline: the first line sets the goal objective, and subsequent lines are forwarded as a prompt to the AI. Previously the entire text after \u003ccode class=\"cl-code\"\u003e/goal\u003c/code\u003e was consumed as the objective, leaving no prompt for the AI to respond to, which appeared as an error.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.82\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eSession rename\u003c/strong\u003e — fix sidebar session rename button that silently failed.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e The PATCH handler now always creates a dedicated app-server connection instead\u003cbr/\u003e of reusing the session's internal connection, which may be dead from idle\u003cbr/\u003e timeout (10 min), causing the rename to silently return ok without effect.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.81\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eBrowser image rendering rollback\u003c/strong\u003e — remove the browser-side \u003ccode class=\"cl-code\"\u003eMEDIA:\u003c/code\u003e preview\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e path and restore the previous web UI image rendering behavior: Markdown images,\u003cbr/\u003e local path detection, image blocks, and \u003ccode class=\"cl-code\"\u003eshow-widget\u003c/code\u003e previews.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eAvoid unstable web image previews introduced by browser \u003ccode class=\"cl-code\"\u003eMEDIA:\u003c/code\u003e parsing while\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e keeping WeCom IM attachment handling isolated in the IM channel.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.80\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eBrowser MEDIA: preview loading race\u003c/strong\u003e — defer local-image\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e previews until streaming completes, avoiding requests before\u003cbr/\u003e the file is fully written.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eMEDIA: tag parsing\u003c/strong\u003e — accept relative paths\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e (./output.png, output/plot.png) and quoted paths with spaces\u003cbr/\u003e ('plot with space.png') in addition to absolute paths.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.79\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eim-gateway npm package\u003c/strong\u003e — include \u003ccode class=\"cl-code\"\u003elib/im-cancel.js\u003c/code\u003e in published \u003ccode class=\"cl-code\"\u003efiles\u003c/code\u003e\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e (fixes \u003ccode class=\"cl-code\"\u003eCannot find module '../lib/im-cancel.js'\u003c/code\u003e after \u003ccode class=\"cl-code\"\u003enpm install -g\u003c/code\u003e).\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003ccode class=\"cl-code\"\u003epack:check\u003c/code\u003e now requires \u003ccode class=\"cl-code\"\u003ebin/annodex-im-gateway.js\u003c/code\u003e, \u003ccode class=\"cl-code\"\u003elib/im-media.js\u003c/code\u003e, and\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e \u003ccode class=\"cl-code\"\u003elib/im-cancel.js\u003c/code\u003e so gateway deps are not omitted again.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.78\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eBrowser MEDIA: preview\u003c/strong\u003e — assistant and tool-result text with \u003ccode class=\"cl-code\"\u003eMEDIA:/path\u003c/code\u003e\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e tags now hide the tag line and show inline local image previews (alongside\u003cbr/\u003e existing Generative UI / path detection).\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eSidebar [IM] badge\u003c/strong\u003e — WeCom IM Codex threads are labeled with a blue\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e \u003ccode class=\"cl-code\"\u003e[IM]\u003c/code\u003e pill; \u003ccode class=\"cl-code\"\u003eGET /api/im/session-ids\u003c/code\u003e + \u003ccode class=\"cl-code\"\u003elistImSessionIds()\u003c/code\u003e.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eRefactor local preview path resolution into \u003ccode class=\"cl-code\"\u003elib/local-preview-path.ts\u003c/code\u003e.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003e\u003cstrong\u003eDocs (en/zh)\u003c/strong\u003e — expanded [Project IM](/docs/im) guide with positioning,\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e dual-channel comparison (Generative UI vs WeCom), pairing flow, MEDIA delivery,\u003cbr/\u003e Reset IM thread, and SVG architecture diagrams on the site.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.77\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eReset IM thread\u003c/strong\u003e (Settings → Project → WeCom IM): button deletes\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e \u003ccode class=\"cl-code\"\u003eim-sessions/\u003csha1(cwd)\u003e.json\u003c/code\u003e and stops the in-memory IM session; pairing and bot\u003cbr/\u003e settings are kept. Next WeCom message starts a fresh Codex thread.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eNew \u003ccode class=\"cl-code\"\u003eDELETE /api/im/project?cwd=\u003c/code\u003e and \u003ccode class=\"cl-code\"\u003eresetProjectImSession()\u003c/code\u003e /\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e \u003ccode class=\"cl-code\"\u003eclearProjectImSession()\u003c/code\u003e.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.76\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eIM cancel\u003c/strong\u003e: send 取消/停止/cancel (etc.) to abort a running IM turn —\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e \u003ccode class=\"cl-code\"\u003ePOST /api/im/cancel\u003c/code\u003e, gateway intercept, and busy-session fallback; strips WeCom\u003cbr/\u003e zero-width suffixes when matching cancel commands.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eIM vs browser prompts\u003c/strong\u003e: IM Codex threads use \u003ccode class=\"cl-code\"\u003echannel: \"im\"\u003c/code\u003e — strip browser\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e \u003ccode class=\"cl-code\"\u003eshow-widget\u003c/code\u003e system rules and inject \u003ccode class=\"cl-code\"\u003e\u003cwecom_im_channel\u003e\u003c/code\u003e once; per-message\u003cbr/\u003e \u003ccode class=\"cl-code\"\u003ebuildImPrompt()\u003c/code\u003e no longer repeats MEDIA/show-widget guidance (avoids polluting\u003cbr/\u003e thread history if the IM session is opened in the browser).\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003ccode class=\"cl-code\"\u003eabort\u003c/code\u003e clears session busy state so cancel and follow-up turns recover cleanly.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eDocs (en/zh): IM cancel flow and separated system prompt notes.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.75\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eGlobal Toast stack\u003c/strong\u003e: \u003ccode class=\"cl-code\"\u003eToastProvider\u003c/code\u003e in root layout replaces scattered inline error\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e banners across Settings (Projects, Extensions, Tools, Models, Skills), sidebar,\u003cbr/\u003e conversation search, file explorer, and composer slash/goal errors.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eComposer input history\u003c/strong\u003e: ↑/↓ recalls previous user prompts from the current\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e session (Hermes-style; does not overwrite a non-empty draft).\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eComposer message queue\u003c/strong\u003e: queue sends while the agent is busy; auto-flush when idle.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003e\u003cstrong\u003eComposer drag-and-drop\u003c/strong\u003e: attach files (including common bioinformatics extensions)\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e by dropping onto the input area.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eWeCom IM panel\u003c/strong\u003e: gateway status pill (\u003ccode class=\"cl-code\"\u003eGET /api/im/gateway-status\u003c/code\u003e), copy buttons\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e for pairing code and \u003ccode class=\"cl-code\"\u003eannodex im-gateway\u003c/code\u003e command.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eNew helpers: \u003ccode class=\"cl-code\"\u003elib/composer-input-history.ts\u003c/code\u003e, \u003ccode class=\"cl-code\"\u003elib/composer-queue.ts\u003c/code\u003e,\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e \u003ccode class=\"cl-code\"\u003elib/drag-drop-files.ts\u003c/code\u003e, \u003ccode class=\"cl-code\"\u003elib/im-gateway-status.ts\u003c/code\u003e, \u003ccode class=\"cl-code\"\u003ecomponents/CopyButton.tsx\u003c/code\u003e.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eTests for composer queue, input history, and gateway status.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.74\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eWeCom IM — MEDIA: attachments\u003c/strong\u003e: gateway parses \u003ccode class=\"cl-code\"\u003eMEDIA:/path\u003c/code\u003e from agent replies,\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e strips tags and \u003ccode class=\"cl-code\"\u003eshow-widget\u003c/code\u003e fences from streamed text, uploads images/files via WeCom\u003cbr/\u003e \u003ccode class=\"cl-code\"\u003eaibot_upload_media_*\u003c/code\u003e, and sends native attachments after the stream finishes.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eUpload permission fallback\u003c/strong\u003e: when the enterprise bot lacks file/image upload rights\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e (or upload fails), a follow-up text message includes the local absolute path; the\u003cbr/\u003e bridge caches \u003ccode class=\"cl-code\"\u003emediaUploadDisabled\u003c/code\u003e to avoid repeated failed uploads.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eIM prompt\u003c/strong\u003e: \u003ccode class=\"cl-code\"\u003ebuildImPrompt()\u003c/code\u003e instructs the agent to save diagrams as files with\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e \u003ccode class=\"cl-code\"\u003eMEDIA:\u003c/code\u003e tags and plain-text paths (no \u003ccode class=\"cl-code\"\u003eshow-widget\u003c/code\u003e in IM).\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eNew \u003ccode class=\"cl-code\"\u003elib/im-media.js\u003c/code\u003e, WeCom upload helpers in \u003ccode class=\"cl-code\"\u003elib/im-wecom.ts\u003c/code\u003e and\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e \u003ccode class=\"cl-code\"\u003eannodex-im-gateway\u003c/code\u003e; docs (en/zh) and \u003ccode class=\"cl-code\"\u003etests/im-media.test.mjs\u003c/code\u003e.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.73\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eDocs site (en/zh)\u003c/strong\u003e: FileViewer download API, Extensions simplified UI + Advanced,\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e Model Discover vs manual add, SOUL/HARNESS edit paths, CLI commands (doctor/stop/im-gateway),\u003cbr/\u003e web-auth localhost bypass for IM/memory APIs, quick-start CLI helpers, homepage copy sync.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.72\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eDefault SOUL.md\u003c/strong\u003e: replace Spock persona with a neutral global template (working\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e principles, operating parameters, continuity). Existing user files are not overwritten.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eConfig path\u003c/strong\u003e: \u003ccode class=\"cl-code\"\u003egetAgentDir()\u003c/code\u003e and \u003ccode class=\"cl-code\"\u003e/api/soul\u003c/code\u003e + \u003ccode class=\"cl-code\"\u003e/api/harness\u003c/code\u003e respect\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e \u003ccode class=\"cl-code\"\u003eANNODEX_CONFIG_DIR\u003c/code\u003e consistently with CLI seed and system prompt injection.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eDocs\u003c/strong\u003e: configuration and memory pages document first-start SOUL/HARNESS seeding\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e and per-user config directories.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.71\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eDocs — Project IM\u003c/strong\u003e: site docs (en/zh) updated for Settings → WeCom IM setup,\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e pairing-first onboarding (send pairing code before agent runs), \u003ccode class=\"cl-code\"\u003eannodex im-gateway\u003c/code\u003e\u003cbr/\u003e in the same Linux account, streaming replies, and current storage/API paths.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eRelated updates in configuration, usage, and homepage feature copy.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.70\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eFile download\u003c/strong\u003e: Download button in FileViewer toolbars (text, image, audio, PDF,\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e DOCX, XLSX, PPTX). \u003ccode class=\"cl-code\"\u003eGET /api/files/{path}?type=download\u003c/code\u003e streams the original file\u003cbr/\u003e with \u003ccode class=\"cl-code\"\u003eContent-Disposition: attachment\u003c/code\u003e (500MB cap).\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eExtensions settings\u003c/strong\u003e: simpler default panel (name, description, project/chat toggles)\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e with \u003cstrong\u003eAdvanced\u003c/strong\u003e collapse for ID, transport, scope, and MCP install details.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eWeCom IM settings\u003c/strong\u003e: prominent enable switch; config fields only when enabled;\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e updated gateway hint; \u003cstrong\u003eSave IM settings\u003c/strong\u003e as primary action button.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eModel Discover\u003c/strong\u003e: infer reasoning/image flags from model metadata on Discover;\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e manual model add keeps thinking/image unchecked by default.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.69\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eWeCom IM streaming replies\u003c/strong\u003e: \u003ccode class=\"cl-code\"\u003ePOST /api/im/turn\u003c/code\u003e with \u003ccode class=\"cl-code\"\u003eAccept: text/event-stream\u003c/code\u003e\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e (or \u003ccode class=\"cl-code\"\u003e?stream=1\u003c/code\u003e) streams \u003ccode class=\"cl-code\"\u003estatus\u003c/code\u003e, \u003ccode class=\"cl-code\"\u003edelta\u003c/code\u003e, and \u003ccode class=\"cl-code\"\u003edone\u003c/code\u003e events while the agent runs.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003ccode class=\"cl-code\"\u003eannodex-im-gateway\u003c/code\u003e consumes the SSE turn stream and pushes partial text to WeCom\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e with a fixed \u003ccode class=\"cl-code\"\u003estreamId\u003c/code\u003e (\u003ccode class=\"cl-code\"\u003efinish: false\u003c/code\u003e during stream, \u003ccode class=\"cl-code\"\u003efinish: true\u003c/code\u003e on completion).\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eTool-running phases still show \u003ccode class=\"cl-code\"\u003e(working Ns)\u003c/code\u003e; assistant text streams with 300ms throttle.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eSync JSON \u003ccode class=\"cl-code\"\u003e/api/im/turn\u003c/code\u003e kept for tests and curl.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eNew \u003ccode class=\"cl-code\"\u003eannodex im-gateway\u003c/code\u003e CLI subcommand (same user's \u003ccode class=\"cl-code\"\u003e~/.config/annodex\u003c/code\u003e).\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eWeb-auth: localhost requests to \u003ccode class=\"cl-code\"\u003e/api/im/*\u003c/code\u003e and \u003ccode class=\"cl-code\"\u003e/api/memory/*\u003c/code\u003e bypass login so the\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e IM gateway and memory MCP sidecars work when password auth is enabled.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.68\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eMulti-user IM gateway\u003c/strong\u003e: bot secrets are served over \u003ccode class=\"cl-code\"\u003eGET /api/im/projects\u003c/code\u003e from\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e the annodex server; gateway no longer reads local \u003ccode class=\"cl-code\"\u003eim-secrets/\u003c/code\u003e files.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eNew \u003ccode class=\"cl-code\"\u003eGET /api/im/gateway-token\u003c/code\u003e (localhost only): sync gateway token and warn when\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e \u003ccode class=\"cl-code\"\u003eANNODEX_CONFIG_DIR\u003c/code\u003e differs from the annodex server.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003ccode class=\"cl-code\"\u003eannodex-im-gateway\u003c/code\u003e: clearer 401/403 errors; startup token sync; tolerate\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e unwritable \u003ccode class=\"cl-code\"\u003eim-gateway.json\u003c/code\u003e with a helpful message.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eDocs (en/zh) and \u003cstrong\u003eSettings → Project → WeCom IM\u003c/strong\u003e: multi-account /\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e \u003ccode class=\"cl-code\"\u003eANNODEX_CONFIG_DIR\u003c/code\u003e guidance.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.67\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003ccode class=\"cl-code\"\u003eannodex stop\u003c/code\u003e: scan and terminate orphaned \u003cstrong\u003ecodex app-server\u003c/strong\u003e processes left\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e after the Next.js server exits (Linux process-group kill when available).\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003ccode class=\"cl-code\"\u003eannodex stop\u003c/code\u003e does \u003cstrong\u003enot\u003c/strong\u003e stop \u003ccode class=\"cl-code\"\u003eannodex-im-gateway\u003c/code\u003e; IM sidecar can stay running\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e while annodex is restarted separately.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003ccode class=\"cl-code\"\u003eannodex doctor\u003c/code\u003e: recommend cleaning orphaned codex app-server processes; note\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e when IM gateway is up but annodex is stopped.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003ccode class=\"cl-code\"\u003eannodex-im-gateway\u003c/code\u003e: log clearer errors when \u003ccode class=\"cl-code\"\u003e/api/im/turn\u003c/code\u003e fails.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.66\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eREADME and docs site (en/zh): align project switcher, IM settings path, and mobile\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e Extensions wording with the v0.1.65 workspace UI.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eHomepage feature copy (\u003ccode class=\"cl-code\"\u003ehome-i18n\u003c/code\u003e) updated for pinned sidebar folders and\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e \u003cstrong\u003eSettings → Project → WeCom IM\u003c/strong\u003e.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.65\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eSidebar project layout: pinned projects appear as expandable folders with chat\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e history; unpinned projects list in the switcher dropdown; the active unpinned\u003cbr/\u003e project shows as a temporary sidebar folder while selected.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eProject IM (WeCom): moved from Tools to \u003cstrong\u003eSettings → Project\u003c/strong\u003e with a per-project\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e \u003cstrong\u003eWeCom IM\u003c/strong\u003e expand control.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eChat UI: remove the per-session “Enabled extensions for this session” banner;\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e extension toggles remain in the input bar.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eMobile chat input: Extensions control shows icon only (count in tooltip).\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.64\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eDocs site i18n: English and Chinese (\u003ccode class=\"cl-code\"\u003e/docs\u003c/code\u003e and \u003ccode class=\"cl-code\"\u003e/zh/docs\u003c/code\u003e) with Fumadocs\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e language switcher and locale-aware navigation.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eNew documentation pages: [Project Memory](/docs/memory) and\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e [Project IM (WeCom)](/docs/im) in both languages.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eHomepage, usage, and configuration docs updated for memory, IM, project\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e switcher, and writable \u003ccode class=\"cl-code\"\u003e$HOME\u003c/code\u003e / \u003ccode class=\"cl-code\"\u003eANNODEX_CONFIG_DIR\u003c/code\u003e guidance.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.63\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003ePer-project WeCom IM gateway (v1): optional one bot per project cwd via\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e \u003ccode class=\"cl-code\"\u003eannodex-im-gateway\u003c/code\u003e sidecar and \u003ccode class=\"cl-code\"\u003e{cwd}/.annodex/im.json\u003c/code\u003e config.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eIM APIs: \u003ccode class=\"cl-code\"\u003eGET/PUT /api/im/project\u003c/code\u003e, \u003ccode class=\"cl-code\"\u003eGET /api/im/projects\u003c/code\u003e, \u003ccode class=\"cl-code\"\u003ePOST /api/im/turn\u003c/code\u003e\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e for gateway integration and synchronous IM replies.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eTools panel \u003cstrong\u003eProject IM\u003c/strong\u003e section: enable bot, bot credentials, pairing code,\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e allowlist, and group-chat options (UI-only config, no CLI).\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eWeCom pairing: users send project pairing code in IM to join \u003ccode class=\"cl-code\"\u003eallowedUsers\u003c/code\u003e;\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e multi-user allowlist supported with one shared IM Codex thread per project.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eIM unit tests cover config, auth, WeCom message parsing, and simulated IM\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e agent sessions with mocked Codex wrapper.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.62\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003ePhase 1 project memory: JSONL working store at\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e \u003ccode class=\"cl-code\"\u003e~/.config/annodex/memory/\u003csha1(cwd)\u003e/entries.jsonl\u003c/code\u003e with retain, recall, and\u003cbr/\u003e reflect via the \u003ccode class=\"cl-code\"\u003eannodex-memory-mcp\u003c/code\u003e stdio MCP server.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003ePromote working-memory candidates to project \u003ccode class=\"cl-code\"\u003eMEMORY.md\u003c/code\u003e or \u003ccode class=\"cl-code\"\u003eCONTEXT.md\u003c/code\u003e from\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e the Tools panel or \u003ccode class=\"cl-code\"\u003ePOST /api/memory/promote\u003c/code\u003e.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eSystem prompt injects \u003ccode class=\"cl-code\"\u003eCONTEXT.md\u003c/code\u003e alongside \u003ccode class=\"cl-code\"\u003eMEMORY.md\u003c/code\u003e; \u003ccode class=\"cl-code\"\u003ebuildSystemPrompt()\u003c/code\u003e\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e uses shared context-file wrappers.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eTools panel shows memory stats, promotion candidates, and recent entries for\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e the active project.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003ccode class=\"cl-code\"\u003eannodex-memory\u003c/code\u003e extension preset in Settings → Extensions; auto-registered in\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e \u003ccode class=\"cl-code\"\u003eextensions.json\u003c/code\u003e on first session start.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eREADME and docs site: writable \u003ccode class=\"cl-code\"\u003e$HOME\u003c/code\u003e / \u003ccode class=\"cl-code\"\u003eANNODEX_CONFIG_DIR\u003c/code\u003e, project\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e switcher, extensions, and storage layout.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.61\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eSettings Extensions tab: clip long extension names, IDs, and transport commands\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e in the sidebar list so text no longer overflows into the details panel; form\u003cbr/\u003e controls and discovery cards use consistent width constraints and ellipsis.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.60\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eSidebar project switcher: replace the multi-project PROJECTS channel with a\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e compact dropdown (pi-web style); session list shows the current project only.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003ePin visibility: switcher lists pinned projects plus the active cwd; unpinned\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e projects disappear when you switch away unless explicitly pinned.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eAdd project from the switcher dropdown via the existing folder browse dialog\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e (sidebar Add button removed).\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eDrag reorder pinned projects in the switcher dropdown; order persists in the\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e project registry.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.59\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eChat image uploads: pasted images save to \u003ccode class=\"cl-code\"\u003e{cwd}/.annodex-uploads/\u003c/code\u003e via\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e \u003ccode class=\"cl-code\"\u003ePOST /api/images/upload\u003c/code\u003e; prompts send \u003ccode class=\"cl-code\"\u003elocalImage\u003c/code\u003e paths plus vision data\u003cbr/\u003e URLs instead of large inline base64 bodies.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eUser messages show path appendix (\u003ccode class=\"cl-code\"\u003e[User attached image N: /path (name)]\u003c/code\u003e) and\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e thumbnails load from disk through \u003ccode class=\"cl-code\"\u003e/api/files/...?type=read\u003c/code\u003e.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eSession history restores images from Codex \u003ccode class=\"cl-code\"\u003elocalImage\u003c/code\u003e inputs after reload.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.58\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eCodex native \u003ccode class=\"cl-code\"\u003e/goal\u003c/code\u003e: slash command calls \u003ccode class=\"cl-code\"\u003ethread/goal/set|get|clear\u003c/code\u003e instead of\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e inserting a prompt template; \u003ccode class=\"cl-code\"\u003eThreadGoalPanel\u003c/code\u003e shows objective, status, token/time\u003cbr/\u003e progress; goal state loads on session open and updates via SSE.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eSubagent UI: top-right button shows only while subagent runs are active; panel\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e auto-closes when all runs finish.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eSubagent status merge prefers terminal states (failed/completed) over stale\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e \u003ccode class=\"cl-code\"\u003erunning\u003c/code\u003e; dedupe by \u003ccode class=\"cl-code\"\u003ethreadId\u003c/code\u003e; unknown Codex statuses default to \u003ccode class=\"cl-code\"\u003epaused\u003c/code\u003e.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eIdle session load finalizes in-flight subagent runs so historical sessions no\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e longer show a stuck active badge after failures.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eClear subagent state immediately when switching sessions.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.57\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eStream session manager (\u003ccode class=\"cl-code\"\u003elib/stream-session-manager.ts\u003c/code\u003e): client-side snapshot\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e accumulator survives React remounts and SSE reconnects; thinking phases, tool\u003cbr/\u003e calls, and text merge in one place instead of local reducers.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eSession reader: merge reasoning, tool calls, and text within a Codex turn into\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e one assistant message (with paired toolResult rows) for cleaner history after\u003cbr/\u003e reload.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eWaiting UX: \u003ccode class=\"cl-code\"\u003eStreamingStatusBar\u003c/code\u003e shows live elapsed seconds and real runtime\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e phase; time-phased labels during the pre-first-token gap; ProcessPanel\u003cbr/\u003e waiting shell appears immediately on send.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eSend flow: optimistic running state and stream shell start before SSE connect;\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e running reconcile no longer replaces messages mid-turn.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eRemove \u003ccode class=\"cl-code\"\u003emessage_end\u003c/code\u003e mid-turn append; canonical state comes from \u003ccode class=\"cl-code\"\u003eagent_end\u003c/code\u003e\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e reconcile only, reducing duplicate assistant replies.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eOptimistic user message dedup via \u003ccode class=\"cl-code\"\u003ependingOptimisticUserRef\u003c/code\u003e and merge on\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e reload, fixing duplicate user bubbles after send.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eStreaming UI: thinking/tools render only in ProcessPanel during live turns,\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e not inline twice.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.56\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003emacos-codex-security.js: needsRepairBeforeSpawn now also checks\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e spctl --assess (5s timeout) after codesign --verify passes.\u003cbr/\u003e codesign may report 'valid on disk' even when spctl detects\u003cbr/\u003e CSSMERR_TP_CERT_REVOKED — only spctl checks Apple's revocation DB.\u003cbr/\u003e This makes auto-repair work on first spawn after npm update,\u003cbr/\u003e eliminating the need for manual \u003ccode class=\"cl-code\"\u003eannodex doctor --repair\u003c/code\u003e.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003emacos-codex-security.js: spctl timeout now treated as needing repair.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e A valid cert should return quickly; a slow response usually means the\u003cbr/\u003e revocation check is happening against a revoked cert. Worst case:\u003cbr/\u003e unnecessary ad-hoc re-sign, which is harmless.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.55\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003ecodex-server.ts: resolveCodexNativeBinary now searches annodex's own\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e node_modules (join(__dirname, '..', 'node_modules')), fixing the path\u003cbr/\u003e mismatch where the doctor repaired the native binary but spawn used a\u003cbr/\u003e JS shim (node_modules/.bin/codex). The shim→native grandchild exec\u003cbr/\u003e triggered macOS Gatekeeper SIGKILL even after repair.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003emacos-codex-security.js: prepareMacOSCodexForSpawn now resolves the\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e underlying native binary when given a JS shim path, and repairs that\u003cbr/\u003e binary directly. Added resolveNativeBinaryFromShim() helper.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.54\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003emacOS: ad-hoc codesign repair for revoked codex Developer ID certificate\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e (CSSMERR_TP_CERT_REVOKED). New \u003ccode class=\"cl-code\"\u003elib/macos-codex-security.js\u003c/code\u003e strips revoked\u003cbr/\u003e signatures and applies \u003ccode class=\"cl-code\"\u003ecodesign --force --sign -\u003c/code\u003e before spawn, following\u003cbr/\u003e the hermes-agent recovery pattern.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003edoctor: add \u003ccode class=\"cl-code\"\u003e--repair\u003c/code\u003e mode for deep quarantine clear and ad-hoc signing.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e Add \u003ccode class=\"cl-code\"\u003ecodesign verify\u003c/code\u003e output alongside \u003ccode class=\"cl-code\"\u003espctl\u003c/code\u003e for dual diagnostic view.\u003cbr/\u003e Warn when repo/runtime is inside macOS protected folders (Desktop, Documents,\u003cbr/\u003e Downloads, iCloud Drive).\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003enext.config.ts: allow \u003ccode class=\"cl-code\"\u003e127.0.0.1\u003c/code\u003e and \u003ccode class=\"cl-code\"\u003elocalhost\u003c/code\u003e in \u003ccode class=\"cl-code\"\u003eallowedDevOrigins\u003c/code\u003e for\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e Next.js 16 HMR compatibility.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003ecodex-server.ts: removed inline \u003ccode class=\"cl-code\"\u003eclearMacOSQuarantine()\u003c/code\u003e which performed\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e slow recursive xattr on every spawn. Replaced with fast \u003ccode class=\"cl-code\"\u003eprepareMacOSCodexForSpawn\u003c/code\u003e\u003cbr/\u003e that only validates the codex binary signature (3s timeout, no spctl).\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eHot path no longer calls \u003ccode class=\"cl-code\"\u003espctl --assess\u003c/code\u003e or recursive xattr, eliminating\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e 20-80s stalls on macOS with large Documents folders.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.53\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003emacOS: default transport switched from WebSocket to stdio (matching\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e Windows), removing the network-server code path that triggered hardened\u003cbr/\u003e runtime entitlement checks and Gatekeeper reinforcement on Apple Silicon.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003emacOS: child process no longer spawned with \u003ccode class=\"cl-code\"\u003edetached: true\u003c/code\u003e, matching\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e hello-halo's proven spawning strategy. Combined with the stdio transport\u003cbr/\u003e change, this avoids the session-leader security path that Gatekeeper may\u003cbr/\u003e flag.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003emacOS: \u003ccode class=\"cl-code\"\u003eclearMacOSQuarantine()\u003c/code\u003e now also runs \u003ccode class=\"cl-code\"\u003espctl --assess\u003c/code\u003e on the\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e resolved native binary and attempts \u003ccode class=\"cl-code\"\u003espctl --add\u003c/code\u003e if the assessment is\u003cbr/\u003e not accepted, providing an additional approval layer beyond \u003ccode class=\"cl-code\"\u003exattr -cr\u003c/code\u003e.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eDirect native binary spawn: \u003ccode class=\"cl-code\"\u003eresolveCodexNativeBinary()\u003c/code\u003e resolves the\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e vendored codex binary (bypassing the JS shim) to avoid the grandchild\u003cbr/\u003e process hop that Gatekeeper intercepts even when quarantine is cleared.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eAdded \u003ccode class=\"cl-code\"\u003e/docs/changelog\u003c/code\u003e page that renders CHANGELOG.md in the annodex UI.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003emacOS: corrected kill-on-close logic to use process-group kill only on\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e Linux (where detached is still true), preventing accidental signal\u003cbr/\u003e propagation to annodex's own process group on macOS.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003emacOS: improved Gatekeeper diagnostic message with \u003ccode class=\"cl-code\"\u003espctl --add\u003c/code\u003e and\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e manual Terminal-approval workaround instructions.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch1 class=\"cl-h1\"\u003eChangelog\u003c/h1\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.52\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003emacOS: \u003ccode class=\"cl-code\"\u003eclearMacOSQuarantine()\u003c/code\u003e now targets the entire \u003ccode class=\"cl-code\"\u003e@openai/codex\u003c/code\u003e package\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e tree and the npm bin shim with \u003ccode class=\"cl-code\"\u003exattr -cr\u003c/code\u003e (recursive clear-all), not just\u003cbr/\u003e the vendored native binary. This resolves cases where macOS Gatekeeper/XProtect\u003cbr/\u003e killed the process even after \u003ccode class=\"cl-code\"\u003ecom.apple.quarantine\u003c/code\u003e was removed from the\u003cbr/\u003e vendored binary alone.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003emacOS: improved the Gatekeeper kill diagnostic message with a one-liner\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e \u003ccode class=\"cl-code\"\u003exattr -cr\u003c/code\u003e fix command.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.51\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003emacOS: \u003ccode class=\"cl-code\"\u003elib/codex-server.ts\u003c/code\u003e now automatically clears the \u003ccode class=\"cl-code\"\u003ecom.apple.quarantine\u003c/code\u003e\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e extended attribute from vendored codex native binaries before spawning the\u003cbr/\u003e app-server, preventing silent Gatekeeper/XProtect kills that caused \"No agent\u003cbr/\u003e runtime is active\" on macOS.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003emacOS: improved \u003ccode class=\"cl-code\"\u003eproc.on(\"exit\")\u003c/code\u003e diagnostics — when the codex process is\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e killed by a signal, the server log now includes a macOS Gatekeeper hint with\u003cbr/\u003e manual fix instructions.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.50\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eIgnored local \u003ccode class=\"cl-code\"\u003etmp/\u003c/code\u003e protocol scratch files and the uncurated site image \u003ccode class=\"cl-code\"\u003esite/public/images/搜索框传播样式-白色版.png\u003c/code\u003e so they no longer pollute the release worktree or get staged by accident.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.49\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eFinalized in-flight subagent runs when a turn ends or the user aborts, so the Subagent panel no longer leaves stale \u003ccode class=\"cl-code\"\u003erunning\u003c/code\u003e / \u003ccode class=\"cl-code\"\u003epending\u003c/code\u003e entries hanging after cancellation or failure.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.48\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eAdded first-pass Extensions management in Settings and chat, including per-session extension visibility and toggles for enabled vs available extensions.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eAdded a browser-use extension testing checklist at \u003ccode class=\"cl-code\"\u003edocs/browser-use-extension-test-plan.md\u003c/code\u003e to document the minimum end-to-end validation flow.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eSynced saved enabled MCP extensions into the Codex MCP registry on save so newly configured servers can be discovered by runtime sessions without extra manual registration.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.47\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eAdded a WeChat follow card on the website homepage pointing users to the \u003ccode class=\"cl-code\"\u003eseqyuan\u003c/code\u003e公众号 for updated annodex tutorials and Windows setup guidance.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eSidebar: increased project/chat loading timeout from 15s to 30s and converted abort/timeout failures into friendly retry messages, reducing macOS \u003ccode class=\"cl-code\"\u003eAbortError: signal is aborted without reason\u003c/code\u003e reports during slow Codex startup.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eSkills: made skill path validation cross-platform by replacing hard-coded POSIX \u003ccode class=\"cl-code\"\u003e/.codex/skills/\u003c/code\u003e checks with normalized path resolution, fixing Windows skill search/install follow-up operations against user and project \u003ccode class=\"cl-code\"\u003e.codex/skills\u003c/code\u003e directories.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.46\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eExpanded the website quick start with detailed Windows Miniforge installation, Codex initialization, Annodex launch, and DeepSeek model setup steps.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eAdded a screenshot-based Usage Guide covering model configuration, skills, file preview, runtime monitoring, and mobile browser usage.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eAdded product screenshots to the homepage and documentation overview.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eDocumented platform app-server transport defaults and added startup logging for the selected Codex app-server transport.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eEnsured website documentation references tracked screenshot assets so published docs render images correctly.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.45\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eAdded a wildcard Codex app-server notification hook so annodex can normalize all incoming app-server events consistently across WebSocket and stdio transports.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eAdded optional Codex event diagnostics with ANNODEX_CODEX_EVENT_LOG=1.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eImproved streaming output by lazily starting assistant rendering when text deltas arrive before turn or item lifecycle events.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eAdded streaming support for Codex reasoning text and reasoning summary deltas.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eAvoided treating completed agent messages as new streamed content when deltas were already received, while preserving completed-message fallback when no deltas arrive.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.44\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eAdded dual Codex app-server transports: existing WebSocket mode and a new stdio JSON-RPC mode.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eWindows now defaults to stdio transport, while macOS/Linux keep the existing WebSocket transport.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eAdded ANNODEX_CODEX_TRANSPORT=ws|stdio|auto override for transport selection.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eImproved Windows compatibility by avoiding local port/listener readiness issues that can leave chats stuck loading or turns stalled.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eCodex server registry keys now include transport mode so WebSocket and stdio app-server instances are not accidentally reused across modes.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.43\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eWindows: completed the Codex app-server JSON-RPC handshake by sending the required \u003ccode class=\"cl-code\"\u003einitialized\u003c/code\u003e notification immediately after \u003ccode class=\"cl-code\"\u003einitialize\u003c/code\u003e, matching CodePilot/hello-halo and fixing cases where sidebar chat loading, thread start/resume, and agent replies could stall.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eSessions: added a 12-second timeout fallback for workspace \u003ccode class=\"cl-code\"\u003ethread/list\u003c/code\u003e loading so the sidebar no longer stays on \"Loading chats...\" indefinitely when the workspace app-server is stuck; it falls back to local session summaries instead.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.42\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eSidebar: renamed project section label from \"Threads\" to \"Projects\".\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eSidebar: removed the \"drag to sort, pin to top\" hint next to the project label.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.41\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eSimplified \u003ccode class=\"cl-code\"\u003eannodex passwd\u003c/code\u003e: terminal access now grants password-reset permission. No old password prompt, single new-password entry. Empty input disables auth. \u003ccode class=\"cl-code\"\u003e--reset\u003c/code\u003e still works as a silent alias for backward compatibility.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eSimplified \u003ccode class=\"cl-code\"\u003epromptPassword()\u003c/code\u003e (first-run setup) to match the single-entry flow.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eWindows: \u003ccode class=\"cl-code\"\u003e.cmd\u003c/code\u003e/\u003ccode class=\"cl-code\"\u003e.bat\u003c/code\u003e shim binaries (e.g. \u003ccode class=\"cl-code\"\u003ecodex.cmd\u003c/code\u003e) now launch through \u003ccode class=\"cl-code\"\u003ecmd.exe /d /s /c\u003c/code\u003e with \u003ccode class=\"cl-code\"\u003ewindowsVerbatimArguments\u003c/code\u003e, matching CodePilot's \u003ccode class=\"cl-code\"\u003ebuildCodexLaunch()\u003c/code\u003e pattern. Fixes spawn failures when the codex binary is an npm-installed shim in a path with spaces.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eWindows: \u003ccode class=\"cl-code\"\u003efindListeningPids()\u003c/code\u003e now uses \u003ccode class=\"cl-code\"\u003eGet-NetTCPConnection\u003c/code\u003e (PowerShell) primary and \u003ccode class=\"cl-code\"\u003enetstat\u003c/code\u003e fallback for port detection, replacing the previous blank \u003ccode class=\"cl-code\"\u003ereturn []\u003c/code\u003e on win32.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eWindows: \u003ccode class=\"cl-code\"\u003ereadProcessCmdline()\u003c/code\u003e now supports win32 via \u003ccode class=\"cl-code\"\u003eGet-CimInstance\u003c/code\u003e / \u003ccode class=\"cl-code\"\u003ewmic\u003c/code\u003e fallback.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.40\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eFixed \u003ccode class=\"cl-code\"\u003ecodex\u003c/code\u003e CLI not found (\u003ccode class=\"cl-code\"\u003eENOENT\u003c/code\u003e) on Windows: \u003ccode class=\"cl-code\"\u003egetCodexExecutablePath()\u003c/code\u003e now searches for \u003ccode class=\"cl-code\"\u003ecodex.cmd\u003c/code\u003e and \u003ccode class=\"cl-code\"\u003ecodex.exe\u003c/code\u003e in addition to \u003ccode class=\"cl-code\"\u003ecodex\u003c/code\u003e, scans the global npm \u003ccode class=\"cl-code\"\u003enode_modules/.bin\u003c/code\u003e directory, and uses \u003ccode class=\"cl-code\"\u003e__dirname\u003c/code\u003e-relative lookup for globally-installed annodex. Connection failure errors now include a clear hint about the missing binary path.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.39\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003ccode class=\"cl-code\"\u003ehandleSend\u003c/code\u003e no longer removes the user's message on failure — the message stays visible and a descriptive \"Send failed: …\" error is shown, making it obvious when an agent request fails instead of silently flashing the message away.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.38\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eImprovements\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003ePreset providers (DeepSeek, Moonshot AI, Zhipu, MiniMax) now auto-discover models from the provider's API (\u003ccode class=\"cl-code\"\u003e/v1/models\u003c/code\u003e) after entering an API key, instead of using a static preset model list. Falls back to preset models if the API is unreachable.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eAdded 15-second fetch timeout to \u003ccode class=\"cl-code\"\u003eloadSessionsForCwd\u003c/code\u003e and \u003ccode class=\"cl-code\"\u003eloadProjects\u003c/code\u003e in the sidebar, preventing permanent \"Loading chats…\" hang on slow or blocked network connections.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.37\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eFixed constant screen flickering on Windows caused by \u003ccode class=\"cl-code\"\u003erouter.replace(\"/\")\u003c/code\u003e navigating away from \u003ccode class=\"cl-code\"\u003e/workspace\u003c/code\u003e and triggering a \u003ccode class=\"cl-code\"\u003eredirect\u003c/code\u003e → remount loop in \u003ccode class=\"cl-code\"\u003eAppShell\u003c/code\u003e. Three \u003ccode class=\"cl-code\"\u003ehandleCwdChange\u003c/code\u003e / \u003ccode class=\"cl-code\"\u003ehandleNewSession\u003c/code\u003e / \u003ccode class=\"cl-code\"\u003ehandleSessionDeleted\u003c/code\u003e paths now use \u003ccode class=\"cl-code\"\u003e/workspace\u003c/code\u003e instead of \u003ccode class=\"cl-code\"\u003e/\u003c/code\u003e.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.36\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eRemoved the tracked \u003ccode class=\"cl-code\"\u003epresentation/\u003c/code\u003e publishing assets and root \u003ccode class=\"cl-code\"\u003e.source/\u003c/code\u003e generated files from the Git repository so release secret scanning no longer flags embedded cookies or tokens.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eRemoved the obsolete root Fumadocs MDX build hook from the main app, fixing release \u003ccode class=\"cl-code\"\u003enpm-publish\u003c/code\u003e builds that failed on \u003ccode class=\"cl-code\"\u003esource.config.ts\u003c/code\u003e externalization.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.35\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eImprovements\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eRefined the mobile chat input sheet interactions so phone users can reach composer actions more reliably without dialog overlays blocking taps near the bottom edge.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eAdded built-in provider presets for DeepSeek, Moonshot AI, Zhipu AI, MiniMax, and OpenRouter to speed up API-key-based model setup.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eChanged provider preset insertion in the Models dialog to update only the local draft until Save, preventing unsaved provider edits from being clobbered.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eAllowed writable annodex provider entries to override same-id read-only Codex providers from merged config.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eSwitched the OpenRouter preset default protocol to OpenAI Responses for correct out-of-box behavior.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.34\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eNew\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eAdded presentation assets for annodex product introduction: HyperFrames HTML composition with 6-scene Chinese narration, TTS audio, and CSS-rendered virtual UI showcasing the browser-based AI workspace experience.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eAdded WeChat official account promotional article (\u003ccode class=\"cl-code\"\u003epresentation/wechat_article.md\u003c/code\u003e) targeting bioinformatics researchers.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eAdded automated Xiaohongshu (RED) publishing scripts using Selenium/Playwright for one-click note posting with Firefox login session reuse.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eDocumentation\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eUpdated product messaging across presentation and promotion materials: unified URL to \u003ccode class=\"cl-code\"\u003eannodex.seqyuan.cn\u003c/code\u003e, refined value proposition around eliminating ChatGPT/VPN barriers, DeepSeek API format bridging, and bioinformatics-specific generative UI.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.33\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eSimplified the root app back to the local workspace role: \u003ccode class=\"cl-code\"\u003e/\u003c/code\u003e now redirects to \u003ccode class=\"cl-code\"\u003e/workspace\u003c/code\u003e, while the standalone \u003ccode class=\"cl-code\"\u003esite/\u003c/code\u003e subproject remains the only public-facing docs/marketing surface.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eMaintenance\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eRemoved the duplicated root-app docs route, root MDX loader chain, and mirrored \u003ccode class=\"cl-code\"\u003econtent/docs\u003c/code\u003e sources that were superseded by \u003ccode class=\"cl-code\"\u003esite/\u003c/code\u003e.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eUpdated lint ignores so \u003ccode class=\"cl-code\"\u003esite/.next\u003c/code\u003e and \u003ccode class=\"cl-code\"\u003esite/.source\u003c/code\u003e generated files do not pollute root-repo lint results.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.32\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eImprovements\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eAdded a standalone \u003ccode class=\"cl-code\"\u003esite/\u003c/code\u003e public documentation subproject so Vercel can deploy the explanation site without exposing the main local workspace app, APIs, or \u003ccode class=\"cl-code\"\u003e/workspace\u003c/code\u003e route.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eReframed the public-site copy and docs to make the local/LAN product boundary explicit: the hosted site is documentation only, while annodex itself remains a local-first browser workspace.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eRestored historical message timestamps by hydrating chat history from local Codex session JSONL records instead of assigning the entire loaded thread the same \u003ccode class=\"cl-code\"\u003eupdatedAt\u003c/code\u003e time.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.31\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eImprovements\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eAdded presentation copy and helper scripts for rendering or manually publishing the annodex promo deck and Xiaohongshu post assets.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eNormalized assistant messages that arrive as plain strings so the session UI still renders them as text blocks instead of dropping their content.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eRemoved outdated public/open-source wording from the presentation deck so the promo materials match the current annodex positioning and repository visibility.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.30\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eImprovements\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eAdded a public-facing landing page and documentation section so annodex now has a clearer project website instead of dropping users directly into the workspace UI.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eAdded a dedicated \u003ccode class=\"cl-code\"\u003e/workspace\u003c/code\u003e route for the actual working interface, keeping the browser workspace accessible while allowing \u003ccode class=\"cl-code\"\u003e/\u003c/code\u003e and \u003ccode class=\"cl-code\"\u003e/docs\u003c/code\u003e to serve as product-facing entry points.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eExpanded the documentation set with quick start, installation, configuration, architecture, runtime, and workspace guides aligned to the current annodex product surface.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eCorrected project-site and docs copy to reflect the current product structure, including the workspace entry path and the removal of the old Report tab terminology.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eExcluded generated Fumadocs \u003ccode class=\"cl-code\"\u003e.source/\u003c/code\u003e files from linting and git noise, while keeping the authored docs content tracked in the repository.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.29\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eSwitched the mobile composer overflow menu outside-click handling to \u003ccode class=\"cl-code\"\u003epointerdown\u003c/code\u003e with \u003ccode class=\"cl-code\"\u003emousedown\u003c/code\u003e fallback, so tapping the three-dot button on phones reliably opens the More menu.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.28\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eCleared the server-side prompt busy state as soon as an \u003ccode class=\"cl-code\"\u003eagent_end\u003c/code\u003e event arrives, so completed assistant replies no longer leave the composer stuck showing the red Stop button.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.27\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eImprovements\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eExpanded project/session loading to prefer complete Codex thread metadata, so project chat counts and expanded project histories can reflect the full set of chats instead of only local cache fragments.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eAdded per-project chat count display in the left sidebar and a recent-project chat count fallback, making project activity easier to scan without opening every thread.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eImproved chat runtime visibility with a live Working panel, elapsed-seconds label, periodic reconcile while sessions are running, and default full-access sandbox mode for new or resumed chats when configured.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eTightened mobile chat UX: the minimap and subagent overlays stay out of the way on phones, the composer is more compact and sticky, and the final messages now keep enough bottom space above the mobile input bar.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eRestored assistant timestamp rendering after replies finish so completed AI messages keep their visible time markers.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eHardened client refresh behavior with more reliable streaming/reconcile updates, reducing cases where users had to manually refresh the page to see the assistant reply.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.25\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eImprovements\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eReworked the chat message surface with a live process panel that keeps tool calls, thinking blocks, and runtime status visible while a Codex session is running.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eAdded floating preview windows for images and PDFs, including gallery navigation for generated image groups, so visual files no longer need to occupy right-panel tabs.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eExpanded the chat input toolbar with a slash-command menu and practical prompt shortcuts for \u003ccode class=\"cl-code\"\u003e/memory\u003c/code\u003e, \u003ccode class=\"cl-code\"\u003e/init\u003c/code\u003e, and \u003ccode class=\"cl-code\"\u003e/goal\u003c/code\u003e, while keeping \u003ccode class=\"cl-code\"\u003e/compact\u003c/code\u003e as the only true native command.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eAdded persistent app settings for default sandbox mode and auto-restart, and wired the default sandbox choice into new sessions and restored threads.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eUpgraded the project sidebar to support stable project ordering with pinning and manual reorder metadata, while keeping project history lazy-loaded.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eSimplified the CLI help output by removing app-specific environment variable details from the default help screen.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.24\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eImprovements\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eReduced global install weight by moving build-only frontend packages out of runtime dependencies while keeping the production \u003ccode class=\"cl-code\"\u003e.next\u003c/code\u003e package layout.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eKept the npm package source-minimized: published files still contain production build artifacts, CLI files, defaults, and public assets rather than app/component source trees.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eAdded a package check that prevents build-only frontend libraries from accidentally returning to runtime dependencies.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.23\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eMaintenance\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eReleased the verified 0.1.22 project sidebar, lazy session loading, and new-chat rollout handling changes as the current patch version.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eConfirmed the local development server can run on an alternate Next.js dev port when the default port is already occupied.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.22\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eImprovements\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eReworked the left sidebar project list to a CodePilot-style Threads view with compact expandable project rows and hover actions for starting a chat in a project.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eUpdated the add-project dialog so users can either browse server folders or manually enter a project path and use it directly.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eKept project session history lazy-loaded per project so opening the sidebar does not eagerly read every Codex thread.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eFixed session restore paths to use lightweight thread metadata lookup before loading full history, preventing old sessions from being blocked by unrelated project/session scans.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eTreated missing Codex rollouts and not-found thread reads as absent sessions instead of hard failures.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eSkipped \u003ccode class=\"cl-code\"\u003ethread/resume\u003c/code\u003e before the first prompt for newly created chats, avoiding \u003ccode class=\"cl-code\"\u003eno rollout found\u003c/code\u003e errors on new thread startup.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.21\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eImprovements\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eReworked the left sidebar project channel to match the AnnoVibe grouped project view: all chat projects are shown, project chat history is collapsible, and only the current or most recently active project expands by default.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eAdded a right-panel Tools tab that shows live Codex chat runtime status, including phase, model, active tools, wait time, last event, and abort control.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eAdded a lightweight Starfleet-inspired favicon.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eOpened the right panel on Files by default after removing the Report tab.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eRemoved the Analysis Report tab, report update parsing, report prompt injection, report storage, and report API surface.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eExposed \u003ccode class=\"cl-code\"\u003e/api/agent/runtime\u003c/code\u003e for UI runtime polling and expanded runtime state tracking for running sessions.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.20\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eWait for the \u003ccode class=\"cl-code\"\u003econnected\u003c/code\u003e SSE event before sending the first prompt in new and resumed chats, so the event subscription is live before Codex emits turn events.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eTreat agent event stream connection timeouts as send failures instead of entering \"Waiting for model...\", and clean up unconfirmed EventSource connections.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003ePrevent duplicate sends while a chat is still creating its session or waiting for SSE setup.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eSend the SSE \u003ccode class=\"cl-code\"\u003econnected\u003c/code\u003e event only after the server has registered the session event listener.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.19\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eFixed new chats getting stuck on \"Waiting for model...\" after the temporary new-session view switches to the real Codex thread id.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eScoped EventSource cleanup to the session id it owns so session creation, model-switch forks, and reconnects do not accidentally close the active SSE stream.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.18\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eImprovements\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eMoved the file explorer out of the left sidebar into a persistent right-panel Files tab.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eRestored the left sidebar project list as an expanded project tree, with only the most recently active or current project's chats expanded by default.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eOpen PDF and image files in draggable preview windows instead of occupying right-panel file tabs.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eKept project chat loading scoped per project so expanding one project's history does not force all project histories to load at once.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.17\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eImprovements\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eAdded the Annodex Router provider so Codex app-server now sees one stable \u003ccode class=\"cl-code\"\u003eannodex-router\u003c/code\u003e provider per workspace while Annodex routes real provider/model requests by wire model key.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eCentralized Responses and Chat Completions routing in the local router, reusing the compat proxy translation path for Chat-only providers.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eKept legacy multi-provider workspace env generation available as a rollback/test path.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eResumed chats now bind the current wire model before each prompt, allowing historical chats to continue and switch models without losing the thread.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003ePrevented \u003ccode class=\"cl-code\"\u003eannodex-router\u003c/code\u003e provider ids and hashed wire model keys from leaking into UI session runtime, history rendering, and context usage recovery.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003ePreserved protocol correctness by keeping \u003ccode class=\"cl-code\"\u003eturn/start\u003c/code\u003e provider-stable and sending only the wire model id for each turn.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.11\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eImprovements\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eRouter/relay providers (DeepRouter, OpenRouter, etc.) now default to Responses API without the compat proxy, matching codex CLI behavior and eliminating ~6s of SSE translation latency.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eNew chats auto-select a default model from annodex providers.json when no codex config.toml default is set.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eCross-provider model switching no longer forces a full ChatWindow remount, preserving the selected model across the fork so the UI does not appear blank after switching.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eSession-change effect uses \u003ccode class=\"cl-code\"\u003e[session?.id]\u003c/code\u003e dependency instead of mount-only, with a ref guard to avoid reconnecting the already-live EventSource after the first message creates a session.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.10\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eImprovements\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eAdded collapsible \"Chats\" section in the sidebar, matching the existing Project and Explorer toggle behavior, with session count display.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eFixed cross-provider session context loading (e.g. DeepRouter threads queried through DeepSeek server) by looking up the session's stored provider runtime before choosing a codex app-server instance.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eMoved \u003ccode class=\"cl-code\"\u003ecodexServerEnvForModel\u003c/code\u003e to a shared location to avoid circular imports between \u003ccode class=\"cl-code\"\u003erpc-manager\u003c/code\u003e and \u003ccode class=\"cl-code\"\u003esession-reader\u003c/code\u003e.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.9\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eFixed cross-provider model switching (e.g. DeepSeek → DeepRouter) silently creating a fresh thread instead of leaking a \"thread not found\" error, since each codex app-server instance only knows its own threads.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.8\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eImprovements\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eAdded per-provider \u003ccode class=\"cl-code\"\u003ereasoningConfig\u003c/code\u003e to \u003ccode class=\"cl-code\"\u003eproviders.json\u003c/code\u003e, allowing explicit control over thinking/reasoning parameter mapping (thinkingParam, effortParam, effortValueMode) when the compat proxy translates OpenAI Resposnes to Chat Completions. Falls back to hardcoded provider defaults when not configured.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eVulcan salute (LLAP 🖖) favicon replacing the generic hand icon.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eGPT-pattern models (e.g. \u003ccode class=\"cl-code\"\u003egpt-5.5\u003c/code\u003e) on Chat Completions providers like DeepRouter no longer force \u003ccode class=\"cl-code\"\u003eopenai-responses\u003c/code\u003e; they now inherit the provider's API setting, ensuring the compat proxy starts and translates correctly.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eIncluded \u003ccode class=\"cl-code\"\u003ereasoningConfig\u003c/code\u003e fingerprint in the codex app-server instance key so switching models with different thinking parameter mappings creates a fresh compat proxy instead of reusing a stale one.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.7\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eMoved \u003ccode class=\"cl-code\"\u003e-c\u003c/code\u003e global config overrides before the \u003ccode class=\"cl-code\"\u003eapp-server\u003c/code\u003e subcommand so Codex app-server correctly loads dynamic provider settings (DeepSeek, DeepRouter, etc.), fixing sessions that were stuck on \"Waiting for model...\".\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eFixed DeepRouter/OpenRouter API detection — now correctly identified as Chat Completions providers instead of defaulting to OpenAI Responses, ensuring the compat proxy translates requests properly.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eAdded \u003ccode class=\"cl-code\"\u003ecrazyrouter\u003c/code\u003e, \u003ccode class=\"cl-code\"\u003etherouter\u003c/code\u003e to Chat Completions provider patterns and compat proxy detection for consistent routing.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.6\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eImprovements\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eKept UI-managed providers and Codex home providers distinct when their ids or model names collide, so duplicate models such as \u003ccode class=\"cl-code\"\u003egpt-5.5\u003c/code\u003e resolve to the selected source.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eMarked Codex-loaded providers as read-only in the Models settings UI and prevented them from being written back to annodex provider config.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eReplaced the old pi favicon with an LLAP hand favicon.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eResolved provider normalization and app-server switching issues that could send a UI-configured deeprouter GPT model through a stale DeepSeek-compatible connection.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eAdded session alias handling when Codex cannot resume an old thread and creates a replacement thread, fixing restored-session \u003ccode class=\"cl-code\"\u003ethread not found\u003c/code\u003e failures.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eRemoved the misleading Steer and Follow-up input controls because Codex app-server does not support native steer or queued follow-up operations.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.5\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eImprovements\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eAdded collapsible Project controls in the left sidebar, matching the Explorer section behavior.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eMade the Project header refresh projects and current project sessions when toggled, while keeping the dedicated refresh button for refresh-only updates.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eImproved deeprouter and mixed-provider model handling so GPT-style models can use OpenAI Responses while DeepSeek/Kimi/Qwen-style models use Chat Completions through the compat proxy.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eSwitched Codex app-server connections when the UI model/provider changes, preventing a selected deeprouter GPT model from being sent through a stale DeepSeek provider connection.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003ePreserved \u003ccode class=\"cl-code\"\u003ecustom\u003c/code\u003e providers in session runtime so restored sessions keep the correct provider context.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eMerged Codex \u003ccode class=\"cl-code\"\u003e~/.codex/config.toml\u003c/code\u003e and \u003ccode class=\"cl-code\"\u003eauth.json\u003c/code\u003e defaults with annodex-managed provider models, including API key discovery from Codex auth state.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.4\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eImprovements\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eRestored Codex token statistics in the top bar by reading \u003ccode class=\"cl-code\"\u003etoken_count\u003c/code\u003e events from local Codex session JSONL history.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eAdded context usage recovery for Codex app-server sessions, including context window fallback from known model defaults and configured models.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eAttached per-turn token usage to assistant messages when Codex history includes usage snapshots.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eDisplay context usage as used tokens over context window, with percentage detail in the tooltip.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eAvoided double-counting duplicate Codex token snapshots emitted during the same turn.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eKept live agent state aligned with recovered context usage after refresh or idle resume.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.3\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eImprovements\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eAligned model settings with annodex's Codex Web target by supporting only the two backend protocols that actually run: OpenAI Responses and Chat Completions through the compat proxy.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eAdded provider protocol inference so DeepSeek/Kimi/Qwen/Zhipu-style endpoints default to Chat Completions while OpenAI and deeprouter-style endpoints default to Responses.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eMade model testing perform a real lightweight provider request instead of returning a placeholder success.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003ePreserved model-level protocol overrides, reasoning flags, thinking-level maps, and compatibility metadata across save/load.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eReused Codex app-server processes only when provider protocol, base URL, API key source, and context window match, preventing stale credentials after model settings changes.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003ePassed thinking-level defaults into the Chat Completions compat proxy for reasoning-capable providers.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eKept model, skills, projects, and session APIs aligned with \u003ccode class=\"cl-code\"\u003eCODEX_HOME\u003c/code\u003e and active Codex runtime state.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.2\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eImprovements\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eLoad projects, sessions, skills, and model settings from local Codex/annodex state without blocking on a cold \u003ccode class=\"cl-code\"\u003ecodex app-server\u003c/code\u003e startup.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eRead Codex-native skills from project, user, and system skill directories, and install skills with the Codex agent target.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eMake model configuration work with just \u003ccode class=\"cl-code\"\u003ebaseUrl\u003c/code\u003e, \u003ccode class=\"cl-code\"\u003eapiKey\u003c/code\u003e, and a manually entered model id; model discovery is now optional.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eSurface managed-server update and idle-restart state in the Web UI top bar.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eImprove Analysis Report prompting and fallback generation with representative figure links and richer output file notes.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eFixed settings panels that could remain stuck on loading for projects, skills, and models.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003ePreserved Codex defaults from \u003ccode class=\"cl-code\"\u003e~/.codex/config.toml\u003c/code\u003e unless the user explicitly changes annodex-managed defaults.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eScoped session listing to the active project and skipped injected context in previews.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.8.17\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eImprovements\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eAdded streaming progress updates and cancel support for skill installs.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eMade \u003ccode class=\"cl-code\"\u003enpx skills\u003c/code\u003e invocation non-interactive and increased the install timeout for slow GitHub clones.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eImproved skill install error cleanup so spinner control codes and npm first-run warnings do not obscure the real failure.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eFixed the npm publish workflow package name after the AnnoVibe rename.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.8.16\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eImprovements\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eAuto-detect image-capable models during Models discovery and import them with \u003ccode class=\"cl-code\"\u003einput: [\"text\", \"image\"]\u003c/code\u003e.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eShow an \u003ccode class=\"cl-code\"\u003eimage\u003c/code\u003e capability marker in the Models discovery list for imported vision models.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.8.15\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eFixed Plot tool preset activation so new sessions actually allow \u003ccode class=\"cl-code\"\u003ekernel_plot_*\u003c/code\u003e tools.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eKept Plot mode synced on existing sessions after idle wrapper recreation or later prompts.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003ePrevented Plot mode from being implicitly enabled when restoring ordinary sessions.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.8.14\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eImprovements\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eAdded idle-aware auto-restart for managed AnnoVibe servers after package updates.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eImproved bioinformatics analysis reporting so completed analysis runs create topic-scoped Report updates, including large PDF/result directories.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003ePrefer generated UI widgets over Mermaid for diagrams unless raw Mermaid/source output is explicitly requested.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eFixed PDF.js compatibility in browsers missing \u003ccode class=\"cl-code\"\u003eUint8Array.prototype.toHex\u003c/code\u003e.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003ePrevented Mermaid syntax errors from flooding or crashing the chat UI.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eAdded clearer sidebar API error messages and ignored local \u003ccode class=\"cl-code\"\u003e.pi/\u003c/code\u003e workspace data.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.8.12\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eRenamed the product surface from Pidex to AnnoVibe / annovibe.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eAdded AnnoVibe version checking with npm update command hints.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eAdded plot kernel status APIs, memory display, release action, and idle timeout settings.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eKept legacy pidex settings, auth cookies, and CLI state files compatible during migration.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.7.9\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eImprovements\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eGlobal file editor in right panel\u003c/strong\u003e — soul.md and harness.md now open in right panel with CodeMirror, instead of inline sidebar textarea.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.7.8\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003estderr null reference\u003c/strong\u003e on daemon detach.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.7.7\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eUpdated README with all features and CLI commands.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.7.6\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eLogin redirect\u003c/strong\u003e — auth env was exposed to \u003ccode class=\"cl-code\"\u003enext.config.ts\u003c/code\u003e so Edge Runtime middleware can read it.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003e\u003cstrong\u003ePassword management\u003c/strong\u003e — \u003ccode class=\"cl-code\"\u003eannovibe passwd\u003c/code\u003e (change), \u003ccode class=\"cl-code\"\u003eannovibe passwd --reset\u003c/code\u003e (remove). Password stored at \u003ccode class=\"cl-code\"\u003e~/.pi/agent/web-auth.json\u003c/code\u003e.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.7.5\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eNew Features\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eCLI commands\u003c/strong\u003e — \u003ccode class=\"cl-code\"\u003eannovibe --version\u003c/code\u003e, \u003ccode class=\"cl-code\"\u003eannovibe --help\u003c/code\u003e, \u003ccode class=\"cl-code\"\u003eannovibe update\u003c/code\u003e (self-update from npm).\u003c/li\u003e\u003cbr/\u003e\u003cli\u003e\u003cstrong\u003eVersion check\u003c/strong\u003e — auto-checks npm for newer version on startup.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.7.4\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eRemoved @lobehub/icons\u003c/strong\u003e — replaced 25 provider icons with inline SVGs. Eliminates @lobehub/ui → antd → @emoji-mart heavy dependency chain. No more peer dependency warnings on install.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eImprovements\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eDaemon mode\u003c/strong\u003e — annovibe auto-detaches after startup, returns terminal prompt while server runs in background.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.7.2\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eLogin redirect broken\u003c/strong\u003e — \u003ccode class=\"cl-code\"\u003erouter.push()\u003c/code\u003e not sending \u003ccode class=\"cl-code\"\u003eSameSite=Lax\u003c/code\u003e cookie, causing endless login loop. Fixed with \u003ccode class=\"cl-code\"\u003ewindow.location.href\u003c/code\u003e hard navigation.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003e\u003cstrong\u003enpm-publish workflow\u003c/strong\u003e — explicit \u003ccode class=\"cl-code\"\u003e.npmrc\u003c/code\u003e auth token, handle already-published packages, fix \u003ccode class=\"cl-code\"\u003euseSearchParams\u003c/code\u003e Suspense wrapper, split \u003ccode class=\"cl-code\"\u003eauth-token.ts\u003c/code\u003e from bcryptjs for Edge Runtime compat.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.7.1\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eNew Features\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eStreaming widgets\u003c/strong\u003e — \u003ccode class=\"cl-code\"\u003eshow-widget\u003c/code\u003e fence support. LLM outputs charts/plots/SVG inline during streaming, rendered in sandboxed iframe with postMessage protocol.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003e\u003cstrong\u003eVisualization harness\u003c/strong\u003e — global \u003ccode class=\"cl-code\"\u003eharness.md\u003c/code\u003e behavioral constraints. Default template covers when to visualize, chart type guidelines, and matplotlib/R script→base64 PNG embedding.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003e\u003cstrong\u003eGlobal harness editor\u003c/strong\u003e — inline editing in sidebar Context panel (same UX as soul.md).\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eharness.md moved from per-project (\u003ccode class=\"cl-code\"\u003e{cwd}/\u003c/code\u003e) to global (\u003ccode class=\"cl-code\"\u003e~/.pi/agent/\u003c/code\u003e) alongside soul.md\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eSoulEditor renamed to GlobalEditor (shared by soul.md + harness.md)\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.7.0\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eNew Features\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003ePassword authentication\u003c/strong\u003e — optional password protection (like Jupyter). Set on first start via CLI prompt or \u003ccode class=\"cl-code\"\u003eANNOVIBE_PASSWORD\u003c/code\u003e env var. bcrypt-hashed, HMAC-signed session cookies.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003e\u003cstrong\u003eSubagent panel\u003c/strong\u003e — track subagent runs (active/completed/failed) in a slide-out panel in the chat area.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003e\u003cstrong\u003eResizable panels\u003c/strong\u003e — drag sidebar and right panel dividers to resize. Widths persist via localStorage.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003e\u003cstrong\u003eDocument viewers\u003c/strong\u003e — PDF, DOCX, XLSX, PPTX preview in sidebar file explorer and drag-drop attachments in chat.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003e\u003cstrong\u003eText file editing\u003c/strong\u003e — CodeMirror 6 editor with syntax highlighting for 10+ languages. Ctrl+S to save.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003e\u003cstrong\u003eProject Context\u003c/strong\u003e — sidebar section for soul.md (global, Spock personality), memory.md (project-level, self-updating), and AGENTS.md.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eImprovements\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eRenamed from \u003ccode class=\"cl-code\"\u003e@agegr/pi-web\u003c/code\u003e to \u003ccode class=\"cl-code\"\u003e@seqyuan/annovibe\u003c/code\u003e\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eSSE reconnection now works during tool execution (not just text streaming)\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eFile explorer auto-refreshes on custom path changes\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eCustom messages (\u003ccode class=\"cl-code\"\u003esubagent-notify\u003c/code\u003e) now rendered in chat\u003c/li\u003e\u003cbr/\u003e\u003cli\u003esoul.md / memory.md auto-injected into system prompt at session creation\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003ccode class=\"cl-code\"\u003exdg-open\u003c/code\u003e crash on systems without xdg-utils installed\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eSession switching no longer loses in-progress agent responses\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003c/p\u003e"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"docs\",\"changelog\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"docs\",{\"children\":[\"changelog\",{\"children\":[\"__PAGE__\",{}]}]}]},\"$undefined\",\"$undefined\",16],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/6b00dcf032cca328.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/fddca953485158e4.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"__variable_66b8ca\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"(function(){try{var t=localStorage.getItem(\\\"annodex-theme\\\");if(t===\\\"dark\\\")document.documentElement.classList.add(\\\"dark\\\")}catch(e){}})();\"}}]}],[\"$\",\"body\",null,{\"style\":{\"minHeight\":\"100dvh\",\"display\":\"flex\",\"flexDirection\":\"column\"},\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"$L3\",null,{\"children\":[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]}]]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"div\",null,{\"style\":{\"maxWidth\":800,\"margin\":\"0 auto\",\"padding\":\"40px 24px 80px\"},\"children\":[[\"$\",\"$L6\",null,{\"href\":\"/workspace\",\"style\":{\"display\":\"inline-flex\",\"alignItems\":\"center\",\"gap\":6,\"color\":\"var(--color-accent, #3b82f6)\",\"textDecoration\":\"none\",\"fontSize\":14,\"marginBottom\":24},\"children\":[\"←\",\" Back to \",\"annodex\"]}],[\"$\",\"div\",null,{\"className\":\"changelog-content\",\"dangerouslySetInnerHTML\":{\"__html\":\"$7\"}}],\"$L8\"]}],null,\"$L9\"]}],{},null,false,null]},null,false,\"$@a\"]},null,false,\"$@a\"]},null,false,null],\"$Lb\",false]],\"m\":\"$undefined\",\"G\":[\"$c\",[]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"VPL-m7CM4eSfxm1yRwwxO\"}\n"])</script><script>self.__next_f.push([1,"d:I[90484,[],\"OutletBoundary\"]\ne:\"$Sreact.suspense\"\n11:I[90484,[],\"ViewportBoundary\"]\n13:I[90484,[],\"MetadataBoundary\"]\n8:[\"$\",\"style\",null,{\"children\":\"\\n .changelog-content { font-family: var(--font-noto-mono, monospace); line-height: 1.7; color: var(--color-fg, #e5e7eb); }\\n .cl-h1 { font-size: 28px; font-weight: 700; margin: 40px 0 16px; color: var(--color-fg, #f9fafb); border-bottom: 1px solid var(--color-border, #374151); padding-bottom: 8px; }\\n .cl-h2 { font-size: 22px; font-weight: 600; margin: 32px 0 12px; color: var(--color-accent, #60a5fa); }\\n .cl-h3 { font-size: 16px; font-weight: 600; margin: 20px 0 8px; color: var(--color-fg-secondary, #9ca3af); }\\n .cl-p { margin: 0 0 12px; }\\n .cl-ul { margin: 8px 0 16px 20px; padding: 0; }\\n .cl-ul li { margin: 4px 0; }\\n .cl-code { background: var(--color-bg-code, #1f2937); padding: 2px 6px; border-radius: 4px; font-size: 13px; }\\n \"}]\n9:[\"$\",\"$Ld\",null,{\"children\":[\"$\",\"$e\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@f\"}]}]\n10:[]\na:\"$W10\"\nb:[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L11\",null,{\"children\":\"$L12\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L13\",null,{\"children\":[\"$\",\"$e\",null,{\"name\":\"Next.Metadata\",\"children\":\"$L14\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}]\n"])</script><script>self.__next_f.push([1,"12:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"15:I[86869,[],\"IconMark\"]\nf:null\n14:[[\"$\",\"title\",\"0\",{\"children\":\"Changelog\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Release history and changes\"}],[\"$\",\"link\",\"2\",{\"rel\":\"shortcut icon\",\"href\":\"/favicon.svg\",\"type\":\"image/svg+xml\"}],[\"$\",\"link\",\"3\",{\"rel\":\"icon\",\"href\":\"/favicon.svg\",\"type\":\"image/svg+xml\"}],[\"$\",\"$L15\",\"4\",{}]]\n"])</script></body></html>
|
|
10
|
+
</style></div><!--$--><!--/$--><div aria-live="polite" style="position:fixed;right:16px;bottom:16px;z-index:10050;display:flex;flex-direction:column;gap:8px;max-width:min(420px, calc(100vw - 32px));pointer-events:none"></div><script src="/_next/static/chunks/webpack-0b1e0af2488fca8f.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[11056,[\"8500\",\"static/chunks/8500-f62a38ff68ab7f42.js\",\"4550\",\"static/chunks/4550-eff0bf233a5b0aec.js\",\"7177\",\"static/chunks/app/layout-2e8a047b671c8731.js\"],\"RootProvider\"]\n3:I[58132,[\"8500\",\"static/chunks/8500-f62a38ff68ab7f42.js\",\"4550\",\"static/chunks/4550-eff0bf233a5b0aec.js\",\"7177\",\"static/chunks/app/layout-2e8a047b671c8731.js\"],\"AppProviders\"]\n4:I[57121,[],\"\"]\n5:I[74581,[],\"\"]\n6:I[98500,[\"8500\",\"static/chunks/8500-f62a38ff68ab7f42.js\",\"9089\",\"static/chunks/app/docs/changelog/page-7f8ff3ce79d21000.js\"],\"\"]\nc:I[27123,[],\"default\",1]\n:HL[\"/_next/static/media/7deddc85b7ffd1dc-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/ec14413c594b3356-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/css/6b00dcf032cca328.css\",\"style\"]\n:HL[\"/_next/static/css/fddca953485158e4.css\",\"style\"]\n7:T142e3,"])</script><script>self.__next_f.push([1,"\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.90\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eScroll to latest messages on session open\u003c/strong\u003e — opening an existing chat session now scrolls to the bottom (latest messages) instead of showing the top. Fix: (1) reset scroll state on session switch, (2) replace the fragile messages-length useEffect with a hermes-agent-style settle loop that pins to the true bottom over ~5 stable frames (handles async DOM reflow from code blocks / syntax highlighting).\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.89\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eSSE transport: EventSource → fetch + ReadableStream\u003c/strong\u003e — the browser-side SSE consumer now uses \u003ccode class=\"cl-code\"\u003efetch()\u003c/code\u003e + \u003ccode class=\"cl-code\"\u003eReadableStreamDefaultReader\u003c/code\u003e (adapted from CodePilot's pattern) instead of the opaque \u003ccode class=\"cl-code\"\u003eEventSource\u003c/code\u003e API. This eliminates browser-internal SSE buffering that caused mid-output freezes and stale stop buttons. Manual line-by-line parsing gives full control over read timing and buffer sizes.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003e\u003cstrong\u003eStream lifecycle via \u003ccode class=\"cl-code\"\u003ecreateSSEReader\u003c/code\u003e\u003c/strong\u003e — new \u003ccode class=\"cl-code\"\u003elib/sse-reader.ts\u003c/code\u003e provides a managed \u003ccode class=\"cl-code\"\u003efetch\u003c/code\u003e+\u003ccode class=\"cl-code\"\u003ereader\u003c/code\u003e+\u003ccode class=\"cl-code\"\u003eAbortController\u003c/code\u003e lifecycle with explicit \u003ccode class=\"cl-code\"\u003eConnectionState\u003c/code\u003e tracking (\u003ccode class=\"cl-code\"\u003eidle\u003c/code\u003e/\u003ccode class=\"cl-code\"\u003econnecting\u003c/code\u003e/\u003ccode class=\"cl-code\"\u003econnected\u003c/code\u003e/\u003ccode class=\"cl-code\"\u003eclosed\u003c/code\u003e/\u003ccode class=\"cl-code\"\u003eerror\u003c/code\u003e), on-state-change callback, and abort-based cleanup. Reconnection uses exponential backoff just like the old EventSource path.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003e\u003cstrong\u003eRemoved dead \u003ccode class=\"cl-code\"\u003erecordStreamHeartbeat\u003c/code\u003e\u003c/strong\u003e — the old SSE-comment-based heartbeat path (\u003ccode class=\"cl-code\"\u003e:\\n\\n\u003c/code\u003e) was superseded by data-event heartbeats in v0.1.88 and is now fully removed.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eNo more EventSource buffering stalls — mid-output freezes where the model was still generating but the UI showed a stuck spinner and stale stop button are resolved.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eAbort now cleanly cancels the fetch via \u003ccode class=\"cl-code\"\u003eAbortController\u003c/code\u003e, eliminating the race where the old \u003ccode class=\"cl-code\"\u003eEventSource.close()\u003c/code\u003e could leave partial connections dangling.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.87\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eSSE stream freeze\u003c/strong\u003e — model replies no longer stall mid-output. Added three-layer defense: (1) client-side idle watchdog detects silent SSE disconnects within 60s and transitions stream to error state, (2) reconcile timer now always fetches full messages so even if \u003ccode class=\"cl-code\"\u003eagent_end\u003c/code\u003e is lost the UI self-heals within 10s, (3) SSE reconnect uses exponential backoff (1s → 30s cap) instead of fixed 1s retry.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003e\u003cstrong\u003eText rendering smoothness\u003c/strong\u003e — text deltas are now throttled at 100ms (per CodePilot pattern), preventing excessive React re-renders during rapid model output that caused visual stuttering and apparent freezes.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.88\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003eThree root causes were identified by comparing annodex, CodePilot, hello-halo, and hermes-agent streaming architectures. CodePilot uses fetch + ReadableStream reader (bypassing EventSource buffering), while annodex relied on browser EventSource which has known issues with invisible SSE comment heartbeats and opaque error handling.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eFix SSE stream freeze: when the stream controller is closed (client disconnect / backpressure), the server-side \u003ccode class=\"cl-code\"\u003eencode\u003c/code\u003e function now immediately cleans up the session event listener and heartbeat timer, preventing orphaned resources that caused the UI to appear frozen while the backend continued generating.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eFix SSE heartbeat invisible to EventSource: the server now sends heartbeats as data events (\u003ccode class=\"cl-code\"\u003e{\"type\":\"heartbeat\"}\u003c/code\u003e) instead of SSE comment lines (\u003ccode class=\"cl-code\"\u003e:\\n\\n\u003c/code\u003e), so the browser's EventSource \u003ccode class=\"cl-code\"\u003eonmessage\u003c/code\u003e handler can see them and reset the client-side idle watchdog.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eFix idle watchdog not propagating stream errors to React state: the stream-session-manager now has a \u003ccode class=\"cl-code\"\u003eregisterStreamErrorCallback\u003c/code\u003e mechanism that the idle watchdog uses to set \u003ccode class=\"cl-code\"\u003eagentRunning = false\u003c/code\u003e in the React layer, so the stop button disappears and the UI correctly shows the connection is dead.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eFix premature stream timeout: the idle watchdog now considers both \u003ccode class=\"cl-code\"\u003elastEventAt\u003c/code\u003e and \u003ccode class=\"cl-code\"\u003elastHeartbeatAt\u003c/code\u003e when deciding whether the stream is dead, so long-running tool executions (\u003e60s) don't trigger false-positive timeouts.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eHeartbeat interval reduced from 30s to 15s for faster dead-connection detection.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.86\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eSession loading 500 errors\u003c/strong\u003e — sessions whose working directory no longer exists (deleted projects, cleaned temp dirs) no longer trigger HTTP 500. \u003ccode class=\"cl-code\"\u003eloadCodexSessionContext\u003c/code\u003e now bails out early when \u003ccode class=\"cl-code\"\u003ecwd\u003c/code\u003e is missing on disk, avoiding a futile codex app-server spawn that would exceed WebSocket retry/timeout budgets.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003e\u003cstrong\u003eSession route error logging\u003c/strong\u003e — \u003ccode class=\"cl-code\"\u003eGET/PATCH/DELETE /api/sessions/[id]\u003c/code\u003e catch blocks now log the actual error with \u003ccode class=\"cl-code\"\u003econsole.error\u003c/code\u003e, making future session-load failures diagnosable from the server console.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.85\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eIM gateway auto-start\u003c/strong\u003e — annodex supervisor now spawns the IM gateway as a managed child process. \u003ccode class=\"cl-code\"\u003eannodex start\u003c/code\u003e automatically runs the gateway in the background; \u003ccode class=\"cl-code\"\u003eannodex stop\u003c/code\u003e cascades to stop it. Logs go to \u003ccode class=\"cl-code\"\u003e~/.config/annodex/annodex-im-gateway.log\u003c/code\u003e.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003e\u003cstrong\u003eChat attachment file upload\u003c/strong\u003e — dropping non-image files (yaml, json, txt, csv, tsv, pdf, docx, xlsx, pptx) into the chat input now uploads them to the project \u003ccode class=\"cl-code\"\u003e.annodex-uploads/\u003c/code\u003e directory and includes the saved path in the message.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eAudio playback\u003c/strong\u003e — reuse a single AudioContext instead of creating new ones per sound; resume suspended context (browser autoplay policy); increase completion sound volume from 0.18 to 0.4.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003e\u003cstrong\u003eImage upload refactor\u003c/strong\u003e — deduplicate shared types and helpers into \u003ccode class=\"cl-code\"\u003echat-attachment-shared.ts\u003c/code\u003e.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.84\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eSite build failure\u003c/strong\u003e — fix static page generation error \u003ccode class=\"cl-code\"\u003e/en/changelog\u003c/code\u003e caused by passing the raw \u003ccode class=\"cl-code\"\u003ei18n\u003c/code\u003e object (which contains a \u003ccode class=\"cl-code\"\u003etranslations\u003c/code\u003e function) to the \u003ccode class=\"cl-code\"\u003eHomeLayout\u003c/code\u003e client component. Removed \u003ccode class=\"cl-code\"\u003ei18n\u003c/code\u003e from \u003ccode class=\"cl-code\"\u003ebaseOptions()\u003c/code\u003e since the actual i18n functionality is handled by \u003ccode class=\"cl-code\"\u003eRootProvider\u003c/code\u003e context. Build now completes with all 20 pages.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.83\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eMobile extensions popover\u003c/strong\u003e — extensions (plugin) button at the bottom of chat input was clipped off-screen on mobile browsers. Now uses the same mobile sheet style as other dropdowns (model, thinking, tools, slash).\u003c/li\u003e\u003cbr/\u003e\u003cli\u003e\u003cstrong\u003e\u003ccode class=\"cl-code\"\u003e/goal\u003c/code\u003e multiline command\u003c/strong\u003e — \u003ccode class=\"cl-code\"\u003e/goal\u003c/code\u003e now splits on the first newline: the first line sets the goal objective, and subsequent lines are forwarded as a prompt to the AI. Previously the entire text after \u003ccode class=\"cl-code\"\u003e/goal\u003c/code\u003e was consumed as the objective, leaving no prompt for the AI to respond to, which appeared as an error.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.82\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eSession rename\u003c/strong\u003e — fix sidebar session rename button that silently failed.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e The PATCH handler now always creates a dedicated app-server connection instead\u003cbr/\u003e of reusing the session's internal connection, which may be dead from idle\u003cbr/\u003e timeout (10 min), causing the rename to silently return ok without effect.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.81\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eBrowser image rendering rollback\u003c/strong\u003e — remove the browser-side \u003ccode class=\"cl-code\"\u003eMEDIA:\u003c/code\u003e preview\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e path and restore the previous web UI image rendering behavior: Markdown images,\u003cbr/\u003e local path detection, image blocks, and \u003ccode class=\"cl-code\"\u003eshow-widget\u003c/code\u003e previews.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eAvoid unstable web image previews introduced by browser \u003ccode class=\"cl-code\"\u003eMEDIA:\u003c/code\u003e parsing while\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e keeping WeCom IM attachment handling isolated in the IM channel.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.80\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eBrowser MEDIA: preview loading race\u003c/strong\u003e — defer local-image\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e previews until streaming completes, avoiding requests before\u003cbr/\u003e the file is fully written.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eMEDIA: tag parsing\u003c/strong\u003e — accept relative paths\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e (./output.png, output/plot.png) and quoted paths with spaces\u003cbr/\u003e ('plot with space.png') in addition to absolute paths.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.79\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eim-gateway npm package\u003c/strong\u003e — include \u003ccode class=\"cl-code\"\u003elib/im-cancel.js\u003c/code\u003e in published \u003ccode class=\"cl-code\"\u003efiles\u003c/code\u003e\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e (fixes \u003ccode class=\"cl-code\"\u003eCannot find module '../lib/im-cancel.js'\u003c/code\u003e after \u003ccode class=\"cl-code\"\u003enpm install -g\u003c/code\u003e).\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003ccode class=\"cl-code\"\u003epack:check\u003c/code\u003e now requires \u003ccode class=\"cl-code\"\u003ebin/annodex-im-gateway.js\u003c/code\u003e, \u003ccode class=\"cl-code\"\u003elib/im-media.js\u003c/code\u003e, and\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e \u003ccode class=\"cl-code\"\u003elib/im-cancel.js\u003c/code\u003e so gateway deps are not omitted again.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.78\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eBrowser MEDIA: preview\u003c/strong\u003e — assistant and tool-result text with \u003ccode class=\"cl-code\"\u003eMEDIA:/path\u003c/code\u003e\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e tags now hide the tag line and show inline local image previews (alongside\u003cbr/\u003e existing Generative UI / path detection).\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eSidebar [IM] badge\u003c/strong\u003e — WeCom IM Codex threads are labeled with a blue\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e \u003ccode class=\"cl-code\"\u003e[IM]\u003c/code\u003e pill; \u003ccode class=\"cl-code\"\u003eGET /api/im/session-ids\u003c/code\u003e + \u003ccode class=\"cl-code\"\u003elistImSessionIds()\u003c/code\u003e.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eRefactor local preview path resolution into \u003ccode class=\"cl-code\"\u003elib/local-preview-path.ts\u003c/code\u003e.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003e\u003cstrong\u003eDocs (en/zh)\u003c/strong\u003e — expanded [Project IM](/docs/im) guide with positioning,\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e dual-channel comparison (Generative UI vs WeCom), pairing flow, MEDIA delivery,\u003cbr/\u003e Reset IM thread, and SVG architecture diagrams on the site.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.77\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eReset IM thread\u003c/strong\u003e (Settings → Project → WeCom IM): button deletes\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e \u003ccode class=\"cl-code\"\u003eim-sessions/\u003csha1(cwd)\u003e.json\u003c/code\u003e and stops the in-memory IM session; pairing and bot\u003cbr/\u003e settings are kept. Next WeCom message starts a fresh Codex thread.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eNew \u003ccode class=\"cl-code\"\u003eDELETE /api/im/project?cwd=\u003c/code\u003e and \u003ccode class=\"cl-code\"\u003eresetProjectImSession()\u003c/code\u003e /\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e \u003ccode class=\"cl-code\"\u003eclearProjectImSession()\u003c/code\u003e.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.76\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eIM cancel\u003c/strong\u003e: send 取消/停止/cancel (etc.) to abort a running IM turn —\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e \u003ccode class=\"cl-code\"\u003ePOST /api/im/cancel\u003c/code\u003e, gateway intercept, and busy-session fallback; strips WeCom\u003cbr/\u003e zero-width suffixes when matching cancel commands.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eIM vs browser prompts\u003c/strong\u003e: IM Codex threads use \u003ccode class=\"cl-code\"\u003echannel: \"im\"\u003c/code\u003e — strip browser\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e \u003ccode class=\"cl-code\"\u003eshow-widget\u003c/code\u003e system rules and inject \u003ccode class=\"cl-code\"\u003e\u003cwecom_im_channel\u003e\u003c/code\u003e once; per-message\u003cbr/\u003e \u003ccode class=\"cl-code\"\u003ebuildImPrompt()\u003c/code\u003e no longer repeats MEDIA/show-widget guidance (avoids polluting\u003cbr/\u003e thread history if the IM session is opened in the browser).\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003ccode class=\"cl-code\"\u003eabort\u003c/code\u003e clears session busy state so cancel and follow-up turns recover cleanly.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eDocs (en/zh): IM cancel flow and separated system prompt notes.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.75\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eGlobal Toast stack\u003c/strong\u003e: \u003ccode class=\"cl-code\"\u003eToastProvider\u003c/code\u003e in root layout replaces scattered inline error\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e banners across Settings (Projects, Extensions, Tools, Models, Skills), sidebar,\u003cbr/\u003e conversation search, file explorer, and composer slash/goal errors.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eComposer input history\u003c/strong\u003e: ↑/↓ recalls previous user prompts from the current\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e session (Hermes-style; does not overwrite a non-empty draft).\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eComposer message queue\u003c/strong\u003e: queue sends while the agent is busy; auto-flush when idle.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003e\u003cstrong\u003eComposer drag-and-drop\u003c/strong\u003e: attach files (including common bioinformatics extensions)\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e by dropping onto the input area.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eWeCom IM panel\u003c/strong\u003e: gateway status pill (\u003ccode class=\"cl-code\"\u003eGET /api/im/gateway-status\u003c/code\u003e), copy buttons\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e for pairing code and \u003ccode class=\"cl-code\"\u003eannodex im-gateway\u003c/code\u003e command.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eNew helpers: \u003ccode class=\"cl-code\"\u003elib/composer-input-history.ts\u003c/code\u003e, \u003ccode class=\"cl-code\"\u003elib/composer-queue.ts\u003c/code\u003e,\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e \u003ccode class=\"cl-code\"\u003elib/drag-drop-files.ts\u003c/code\u003e, \u003ccode class=\"cl-code\"\u003elib/im-gateway-status.ts\u003c/code\u003e, \u003ccode class=\"cl-code\"\u003ecomponents/CopyButton.tsx\u003c/code\u003e.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eTests for composer queue, input history, and gateway status.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.74\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eWeCom IM — MEDIA: attachments\u003c/strong\u003e: gateway parses \u003ccode class=\"cl-code\"\u003eMEDIA:/path\u003c/code\u003e from agent replies,\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e strips tags and \u003ccode class=\"cl-code\"\u003eshow-widget\u003c/code\u003e fences from streamed text, uploads images/files via WeCom\u003cbr/\u003e \u003ccode class=\"cl-code\"\u003eaibot_upload_media_*\u003c/code\u003e, and sends native attachments after the stream finishes.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eUpload permission fallback\u003c/strong\u003e: when the enterprise bot lacks file/image upload rights\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e (or upload fails), a follow-up text message includes the local absolute path; the\u003cbr/\u003e bridge caches \u003ccode class=\"cl-code\"\u003emediaUploadDisabled\u003c/code\u003e to avoid repeated failed uploads.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eIM prompt\u003c/strong\u003e: \u003ccode class=\"cl-code\"\u003ebuildImPrompt()\u003c/code\u003e instructs the agent to save diagrams as files with\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e \u003ccode class=\"cl-code\"\u003eMEDIA:\u003c/code\u003e tags and plain-text paths (no \u003ccode class=\"cl-code\"\u003eshow-widget\u003c/code\u003e in IM).\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eNew \u003ccode class=\"cl-code\"\u003elib/im-media.js\u003c/code\u003e, WeCom upload helpers in \u003ccode class=\"cl-code\"\u003elib/im-wecom.ts\u003c/code\u003e and\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e \u003ccode class=\"cl-code\"\u003eannodex-im-gateway\u003c/code\u003e; docs (en/zh) and \u003ccode class=\"cl-code\"\u003etests/im-media.test.mjs\u003c/code\u003e.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.73\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eDocs site (en/zh)\u003c/strong\u003e: FileViewer download API, Extensions simplified UI + Advanced,\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e Model Discover vs manual add, SOUL/HARNESS edit paths, CLI commands (doctor/stop/im-gateway),\u003cbr/\u003e web-auth localhost bypass for IM/memory APIs, quick-start CLI helpers, homepage copy sync.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.72\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eDefault SOUL.md\u003c/strong\u003e: replace Spock persona with a neutral global template (working\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e principles, operating parameters, continuity). Existing user files are not overwritten.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eConfig path\u003c/strong\u003e: \u003ccode class=\"cl-code\"\u003egetAgentDir()\u003c/code\u003e and \u003ccode class=\"cl-code\"\u003e/api/soul\u003c/code\u003e + \u003ccode class=\"cl-code\"\u003e/api/harness\u003c/code\u003e respect\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e \u003ccode class=\"cl-code\"\u003eANNODEX_CONFIG_DIR\u003c/code\u003e consistently with CLI seed and system prompt injection.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eDocs\u003c/strong\u003e: configuration and memory pages document first-start SOUL/HARNESS seeding\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e and per-user config directories.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.71\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eDocs — Project IM\u003c/strong\u003e: site docs (en/zh) updated for Settings → WeCom IM setup,\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e pairing-first onboarding (send pairing code before agent runs), \u003ccode class=\"cl-code\"\u003eannodex im-gateway\u003c/code\u003e\u003cbr/\u003e in the same Linux account, streaming replies, and current storage/API paths.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eRelated updates in configuration, usage, and homepage feature copy.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.70\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eFile download\u003c/strong\u003e: Download button in FileViewer toolbars (text, image, audio, PDF,\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e DOCX, XLSX, PPTX). \u003ccode class=\"cl-code\"\u003eGET /api/files/{path}?type=download\u003c/code\u003e streams the original file\u003cbr/\u003e with \u003ccode class=\"cl-code\"\u003eContent-Disposition: attachment\u003c/code\u003e (500MB cap).\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eExtensions settings\u003c/strong\u003e: simpler default panel (name, description, project/chat toggles)\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e with \u003cstrong\u003eAdvanced\u003c/strong\u003e collapse for ID, transport, scope, and MCP install details.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eWeCom IM settings\u003c/strong\u003e: prominent enable switch; config fields only when enabled;\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e updated gateway hint; \u003cstrong\u003eSave IM settings\u003c/strong\u003e as primary action button.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eModel Discover\u003c/strong\u003e: infer reasoning/image flags from model metadata on Discover;\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e manual model add keeps thinking/image unchecked by default.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.69\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eWeCom IM streaming replies\u003c/strong\u003e: \u003ccode class=\"cl-code\"\u003ePOST /api/im/turn\u003c/code\u003e with \u003ccode class=\"cl-code\"\u003eAccept: text/event-stream\u003c/code\u003e\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e (or \u003ccode class=\"cl-code\"\u003e?stream=1\u003c/code\u003e) streams \u003ccode class=\"cl-code\"\u003estatus\u003c/code\u003e, \u003ccode class=\"cl-code\"\u003edelta\u003c/code\u003e, and \u003ccode class=\"cl-code\"\u003edone\u003c/code\u003e events while the agent runs.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003ccode class=\"cl-code\"\u003eannodex-im-gateway\u003c/code\u003e consumes the SSE turn stream and pushes partial text to WeCom\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e with a fixed \u003ccode class=\"cl-code\"\u003estreamId\u003c/code\u003e (\u003ccode class=\"cl-code\"\u003efinish: false\u003c/code\u003e during stream, \u003ccode class=\"cl-code\"\u003efinish: true\u003c/code\u003e on completion).\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eTool-running phases still show \u003ccode class=\"cl-code\"\u003e(working Ns)\u003c/code\u003e; assistant text streams with 300ms throttle.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eSync JSON \u003ccode class=\"cl-code\"\u003e/api/im/turn\u003c/code\u003e kept for tests and curl.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eNew \u003ccode class=\"cl-code\"\u003eannodex im-gateway\u003c/code\u003e CLI subcommand (same user's \u003ccode class=\"cl-code\"\u003e~/.config/annodex\u003c/code\u003e).\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eWeb-auth: localhost requests to \u003ccode class=\"cl-code\"\u003e/api/im/*\u003c/code\u003e and \u003ccode class=\"cl-code\"\u003e/api/memory/*\u003c/code\u003e bypass login so the\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e IM gateway and memory MCP sidecars work when password auth is enabled.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.68\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eMulti-user IM gateway\u003c/strong\u003e: bot secrets are served over \u003ccode class=\"cl-code\"\u003eGET /api/im/projects\u003c/code\u003e from\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e the annodex server; gateway no longer reads local \u003ccode class=\"cl-code\"\u003eim-secrets/\u003c/code\u003e files.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eNew \u003ccode class=\"cl-code\"\u003eGET /api/im/gateway-token\u003c/code\u003e (localhost only): sync gateway token and warn when\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e \u003ccode class=\"cl-code\"\u003eANNODEX_CONFIG_DIR\u003c/code\u003e differs from the annodex server.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003ccode class=\"cl-code\"\u003eannodex-im-gateway\u003c/code\u003e: clearer 401/403 errors; startup token sync; tolerate\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e unwritable \u003ccode class=\"cl-code\"\u003eim-gateway.json\u003c/code\u003e with a helpful message.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eDocs (en/zh) and \u003cstrong\u003eSettings → Project → WeCom IM\u003c/strong\u003e: multi-account /\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e \u003ccode class=\"cl-code\"\u003eANNODEX_CONFIG_DIR\u003c/code\u003e guidance.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.67\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003ccode class=\"cl-code\"\u003eannodex stop\u003c/code\u003e: scan and terminate orphaned \u003cstrong\u003ecodex app-server\u003c/strong\u003e processes left\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e after the Next.js server exits (Linux process-group kill when available).\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003ccode class=\"cl-code\"\u003eannodex stop\u003c/code\u003e does \u003cstrong\u003enot\u003c/strong\u003e stop \u003ccode class=\"cl-code\"\u003eannodex-im-gateway\u003c/code\u003e; IM sidecar can stay running\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e while annodex is restarted separately.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003ccode class=\"cl-code\"\u003eannodex doctor\u003c/code\u003e: recommend cleaning orphaned codex app-server processes; note\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e when IM gateway is up but annodex is stopped.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003ccode class=\"cl-code\"\u003eannodex-im-gateway\u003c/code\u003e: log clearer errors when \u003ccode class=\"cl-code\"\u003e/api/im/turn\u003c/code\u003e fails.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.66\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eREADME and docs site (en/zh): align project switcher, IM settings path, and mobile\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e Extensions wording with the v0.1.65 workspace UI.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eHomepage feature copy (\u003ccode class=\"cl-code\"\u003ehome-i18n\u003c/code\u003e) updated for pinned sidebar folders and\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e \u003cstrong\u003eSettings → Project → WeCom IM\u003c/strong\u003e.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.65\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eSidebar project layout: pinned projects appear as expandable folders with chat\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e history; unpinned projects list in the switcher dropdown; the active unpinned\u003cbr/\u003e project shows as a temporary sidebar folder while selected.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eProject IM (WeCom): moved from Tools to \u003cstrong\u003eSettings → Project\u003c/strong\u003e with a per-project\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e \u003cstrong\u003eWeCom IM\u003c/strong\u003e expand control.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eChat UI: remove the per-session “Enabled extensions for this session” banner;\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e extension toggles remain in the input bar.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eMobile chat input: Extensions control shows icon only (count in tooltip).\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.64\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eDocs site i18n: English and Chinese (\u003ccode class=\"cl-code\"\u003e/docs\u003c/code\u003e and \u003ccode class=\"cl-code\"\u003e/zh/docs\u003c/code\u003e) with Fumadocs\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e language switcher and locale-aware navigation.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eNew documentation pages: [Project Memory](/docs/memory) and\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e [Project IM (WeCom)](/docs/im) in both languages.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eHomepage, usage, and configuration docs updated for memory, IM, project\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e switcher, and writable \u003ccode class=\"cl-code\"\u003e$HOME\u003c/code\u003e / \u003ccode class=\"cl-code\"\u003eANNODEX_CONFIG_DIR\u003c/code\u003e guidance.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.63\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003ePer-project WeCom IM gateway (v1): optional one bot per project cwd via\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e \u003ccode class=\"cl-code\"\u003eannodex-im-gateway\u003c/code\u003e sidecar and \u003ccode class=\"cl-code\"\u003e{cwd}/.annodex/im.json\u003c/code\u003e config.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eIM APIs: \u003ccode class=\"cl-code\"\u003eGET/PUT /api/im/project\u003c/code\u003e, \u003ccode class=\"cl-code\"\u003eGET /api/im/projects\u003c/code\u003e, \u003ccode class=\"cl-code\"\u003ePOST /api/im/turn\u003c/code\u003e\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e for gateway integration and synchronous IM replies.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eTools panel \u003cstrong\u003eProject IM\u003c/strong\u003e section: enable bot, bot credentials, pairing code,\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e allowlist, and group-chat options (UI-only config, no CLI).\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eWeCom pairing: users send project pairing code in IM to join \u003ccode class=\"cl-code\"\u003eallowedUsers\u003c/code\u003e;\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e multi-user allowlist supported with one shared IM Codex thread per project.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eIM unit tests cover config, auth, WeCom message parsing, and simulated IM\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e agent sessions with mocked Codex wrapper.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.62\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003ePhase 1 project memory: JSONL working store at\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e \u003ccode class=\"cl-code\"\u003e~/.config/annodex/memory/\u003csha1(cwd)\u003e/entries.jsonl\u003c/code\u003e with retain, recall, and\u003cbr/\u003e reflect via the \u003ccode class=\"cl-code\"\u003eannodex-memory-mcp\u003c/code\u003e stdio MCP server.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003ePromote working-memory candidates to project \u003ccode class=\"cl-code\"\u003eMEMORY.md\u003c/code\u003e or \u003ccode class=\"cl-code\"\u003eCONTEXT.md\u003c/code\u003e from\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e the Tools panel or \u003ccode class=\"cl-code\"\u003ePOST /api/memory/promote\u003c/code\u003e.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eSystem prompt injects \u003ccode class=\"cl-code\"\u003eCONTEXT.md\u003c/code\u003e alongside \u003ccode class=\"cl-code\"\u003eMEMORY.md\u003c/code\u003e; \u003ccode class=\"cl-code\"\u003ebuildSystemPrompt()\u003c/code\u003e\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e uses shared context-file wrappers.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eTools panel shows memory stats, promotion candidates, and recent entries for\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e the active project.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003ccode class=\"cl-code\"\u003eannodex-memory\u003c/code\u003e extension preset in Settings → Extensions; auto-registered in\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e \u003ccode class=\"cl-code\"\u003eextensions.json\u003c/code\u003e on first session start.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eREADME and docs site: writable \u003ccode class=\"cl-code\"\u003e$HOME\u003c/code\u003e / \u003ccode class=\"cl-code\"\u003eANNODEX_CONFIG_DIR\u003c/code\u003e, project\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e switcher, extensions, and storage layout.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.61\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eSettings Extensions tab: clip long extension names, IDs, and transport commands\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e in the sidebar list so text no longer overflows into the details panel; form\u003cbr/\u003e controls and discovery cards use consistent width constraints and ellipsis.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.60\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eSidebar project switcher: replace the multi-project PROJECTS channel with a\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e compact dropdown (pi-web style); session list shows the current project only.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003ePin visibility: switcher lists pinned projects plus the active cwd; unpinned\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e projects disappear when you switch away unless explicitly pinned.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eAdd project from the switcher dropdown via the existing folder browse dialog\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e (sidebar Add button removed).\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eDrag reorder pinned projects in the switcher dropdown; order persists in the\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e project registry.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.59\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eChat image uploads: pasted images save to \u003ccode class=\"cl-code\"\u003e{cwd}/.annodex-uploads/\u003c/code\u003e via\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e \u003ccode class=\"cl-code\"\u003ePOST /api/images/upload\u003c/code\u003e; prompts send \u003ccode class=\"cl-code\"\u003elocalImage\u003c/code\u003e paths plus vision data\u003cbr/\u003e URLs instead of large inline base64 bodies.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eUser messages show path appendix (\u003ccode class=\"cl-code\"\u003e[User attached image N: /path (name)]\u003c/code\u003e) and\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e thumbnails load from disk through \u003ccode class=\"cl-code\"\u003e/api/files/...?type=read\u003c/code\u003e.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eSession history restores images from Codex \u003ccode class=\"cl-code\"\u003elocalImage\u003c/code\u003e inputs after reload.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.58\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eCodex native \u003ccode class=\"cl-code\"\u003e/goal\u003c/code\u003e: slash command calls \u003ccode class=\"cl-code\"\u003ethread/goal/set|get|clear\u003c/code\u003e instead of\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e inserting a prompt template; \u003ccode class=\"cl-code\"\u003eThreadGoalPanel\u003c/code\u003e shows objective, status, token/time\u003cbr/\u003e progress; goal state loads on session open and updates via SSE.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eSubagent UI: top-right button shows only while subagent runs are active; panel\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e auto-closes when all runs finish.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eSubagent status merge prefers terminal states (failed/completed) over stale\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e \u003ccode class=\"cl-code\"\u003erunning\u003c/code\u003e; dedupe by \u003ccode class=\"cl-code\"\u003ethreadId\u003c/code\u003e; unknown Codex statuses default to \u003ccode class=\"cl-code\"\u003epaused\u003c/code\u003e.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eIdle session load finalizes in-flight subagent runs so historical sessions no\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e longer show a stuck active badge after failures.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eClear subagent state immediately when switching sessions.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.57\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eStream session manager (\u003ccode class=\"cl-code\"\u003elib/stream-session-manager.ts\u003c/code\u003e): client-side snapshot\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e accumulator survives React remounts and SSE reconnects; thinking phases, tool\u003cbr/\u003e calls, and text merge in one place instead of local reducers.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eSession reader: merge reasoning, tool calls, and text within a Codex turn into\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e one assistant message (with paired toolResult rows) for cleaner history after\u003cbr/\u003e reload.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eWaiting UX: \u003ccode class=\"cl-code\"\u003eStreamingStatusBar\u003c/code\u003e shows live elapsed seconds and real runtime\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e phase; time-phased labels during the pre-first-token gap; ProcessPanel\u003cbr/\u003e waiting shell appears immediately on send.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eSend flow: optimistic running state and stream shell start before SSE connect;\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e running reconcile no longer replaces messages mid-turn.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eRemove \u003ccode class=\"cl-code\"\u003emessage_end\u003c/code\u003e mid-turn append; canonical state comes from \u003ccode class=\"cl-code\"\u003eagent_end\u003c/code\u003e\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e reconcile only, reducing duplicate assistant replies.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eOptimistic user message dedup via \u003ccode class=\"cl-code\"\u003ependingOptimisticUserRef\u003c/code\u003e and merge on\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e reload, fixing duplicate user bubbles after send.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eStreaming UI: thinking/tools render only in ProcessPanel during live turns,\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e not inline twice.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.56\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003emacos-codex-security.js: needsRepairBeforeSpawn now also checks\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e spctl --assess (5s timeout) after codesign --verify passes.\u003cbr/\u003e codesign may report 'valid on disk' even when spctl detects\u003cbr/\u003e CSSMERR_TP_CERT_REVOKED — only spctl checks Apple's revocation DB.\u003cbr/\u003e This makes auto-repair work on first spawn after npm update,\u003cbr/\u003e eliminating the need for manual \u003ccode class=\"cl-code\"\u003eannodex doctor --repair\u003c/code\u003e.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003emacos-codex-security.js: spctl timeout now treated as needing repair.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e A valid cert should return quickly; a slow response usually means the\u003cbr/\u003e revocation check is happening against a revoked cert. Worst case:\u003cbr/\u003e unnecessary ad-hoc re-sign, which is harmless.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.55\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003ecodex-server.ts: resolveCodexNativeBinary now searches annodex's own\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e node_modules (join(__dirname, '..', 'node_modules')), fixing the path\u003cbr/\u003e mismatch where the doctor repaired the native binary but spawn used a\u003cbr/\u003e JS shim (node_modules/.bin/codex). The shim→native grandchild exec\u003cbr/\u003e triggered macOS Gatekeeper SIGKILL even after repair.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003emacos-codex-security.js: prepareMacOSCodexForSpawn now resolves the\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e underlying native binary when given a JS shim path, and repairs that\u003cbr/\u003e binary directly. Added resolveNativeBinaryFromShim() helper.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.54\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003emacOS: ad-hoc codesign repair for revoked codex Developer ID certificate\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e (CSSMERR_TP_CERT_REVOKED). New \u003ccode class=\"cl-code\"\u003elib/macos-codex-security.js\u003c/code\u003e strips revoked\u003cbr/\u003e signatures and applies \u003ccode class=\"cl-code\"\u003ecodesign --force --sign -\u003c/code\u003e before spawn, following\u003cbr/\u003e the hermes-agent recovery pattern.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003edoctor: add \u003ccode class=\"cl-code\"\u003e--repair\u003c/code\u003e mode for deep quarantine clear and ad-hoc signing.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e Add \u003ccode class=\"cl-code\"\u003ecodesign verify\u003c/code\u003e output alongside \u003ccode class=\"cl-code\"\u003espctl\u003c/code\u003e for dual diagnostic view.\u003cbr/\u003e Warn when repo/runtime is inside macOS protected folders (Desktop, Documents,\u003cbr/\u003e Downloads, iCloud Drive).\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003enext.config.ts: allow \u003ccode class=\"cl-code\"\u003e127.0.0.1\u003c/code\u003e and \u003ccode class=\"cl-code\"\u003elocalhost\u003c/code\u003e in \u003ccode class=\"cl-code\"\u003eallowedDevOrigins\u003c/code\u003e for\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e Next.js 16 HMR compatibility.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003ecodex-server.ts: removed inline \u003ccode class=\"cl-code\"\u003eclearMacOSQuarantine()\u003c/code\u003e which performed\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e slow recursive xattr on every spawn. Replaced with fast \u003ccode class=\"cl-code\"\u003eprepareMacOSCodexForSpawn\u003c/code\u003e\u003cbr/\u003e that only validates the codex binary signature (3s timeout, no spctl).\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eHot path no longer calls \u003ccode class=\"cl-code\"\u003espctl --assess\u003c/code\u003e or recursive xattr, eliminating\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e 20-80s stalls on macOS with large Documents folders.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.53\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003emacOS: default transport switched from WebSocket to stdio (matching\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e Windows), removing the network-server code path that triggered hardened\u003cbr/\u003e runtime entitlement checks and Gatekeeper reinforcement on Apple Silicon.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003emacOS: child process no longer spawned with \u003ccode class=\"cl-code\"\u003edetached: true\u003c/code\u003e, matching\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e hello-halo's proven spawning strategy. Combined with the stdio transport\u003cbr/\u003e change, this avoids the session-leader security path that Gatekeeper may\u003cbr/\u003e flag.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003emacOS: \u003ccode class=\"cl-code\"\u003eclearMacOSQuarantine()\u003c/code\u003e now also runs \u003ccode class=\"cl-code\"\u003espctl --assess\u003c/code\u003e on the\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e resolved native binary and attempts \u003ccode class=\"cl-code\"\u003espctl --add\u003c/code\u003e if the assessment is\u003cbr/\u003e not accepted, providing an additional approval layer beyond \u003ccode class=\"cl-code\"\u003exattr -cr\u003c/code\u003e.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eDirect native binary spawn: \u003ccode class=\"cl-code\"\u003eresolveCodexNativeBinary()\u003c/code\u003e resolves the\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e vendored codex binary (bypassing the JS shim) to avoid the grandchild\u003cbr/\u003e process hop that Gatekeeper intercepts even when quarantine is cleared.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eAdded \u003ccode class=\"cl-code\"\u003e/docs/changelog\u003c/code\u003e page that renders CHANGELOG.md in the annodex UI.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003emacOS: corrected kill-on-close logic to use process-group kill only on\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e Linux (where detached is still true), preventing accidental signal\u003cbr/\u003e propagation to annodex's own process group on macOS.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003emacOS: improved Gatekeeper diagnostic message with \u003ccode class=\"cl-code\"\u003espctl --add\u003c/code\u003e and\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e manual Terminal-approval workaround instructions.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch1 class=\"cl-h1\"\u003eChangelog\u003c/h1\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.52\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003emacOS: \u003ccode class=\"cl-code\"\u003eclearMacOSQuarantine()\u003c/code\u003e now targets the entire \u003ccode class=\"cl-code\"\u003e@openai/codex\u003c/code\u003e package\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e tree and the npm bin shim with \u003ccode class=\"cl-code\"\u003exattr -cr\u003c/code\u003e (recursive clear-all), not just\u003cbr/\u003e the vendored native binary. This resolves cases where macOS Gatekeeper/XProtect\u003cbr/\u003e killed the process even after \u003ccode class=\"cl-code\"\u003ecom.apple.quarantine\u003c/code\u003e was removed from the\u003cbr/\u003e vendored binary alone.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003emacOS: improved the Gatekeeper kill diagnostic message with a one-liner\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e \u003ccode class=\"cl-code\"\u003exattr -cr\u003c/code\u003e fix command.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.51\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003emacOS: \u003ccode class=\"cl-code\"\u003elib/codex-server.ts\u003c/code\u003e now automatically clears the \u003ccode class=\"cl-code\"\u003ecom.apple.quarantine\u003c/code\u003e\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e extended attribute from vendored codex native binaries before spawning the\u003cbr/\u003e app-server, preventing silent Gatekeeper/XProtect kills that caused \"No agent\u003cbr/\u003e runtime is active\" on macOS.\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003emacOS: improved \u003ccode class=\"cl-code\"\u003eproc.on(\"exit\")\u003c/code\u003e diagnostics — when the codex process is\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e killed by a signal, the server log now includes a macOS Gatekeeper hint with\u003cbr/\u003e manual fix instructions.\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.50\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eIgnored local \u003ccode class=\"cl-code\"\u003etmp/\u003c/code\u003e protocol scratch files and the uncurated site image \u003ccode class=\"cl-code\"\u003esite/public/images/搜索框传播样式-白色版.png\u003c/code\u003e so they no longer pollute the release worktree or get staged by accident.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.49\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eFinalized in-flight subagent runs when a turn ends or the user aborts, so the Subagent panel no longer leaves stale \u003ccode class=\"cl-code\"\u003erunning\u003c/code\u003e / \u003ccode class=\"cl-code\"\u003epending\u003c/code\u003e entries hanging after cancellation or failure.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.48\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eAdded first-pass Extensions management in Settings and chat, including per-session extension visibility and toggles for enabled vs available extensions.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eAdded a browser-use extension testing checklist at \u003ccode class=\"cl-code\"\u003edocs/browser-use-extension-test-plan.md\u003c/code\u003e to document the minimum end-to-end validation flow.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eSynced saved enabled MCP extensions into the Codex MCP registry on save so newly configured servers can be discovered by runtime sessions without extra manual registration.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.47\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eAdded a WeChat follow card on the website homepage pointing users to the \u003ccode class=\"cl-code\"\u003eseqyuan\u003c/code\u003e公众号 for updated annodex tutorials and Windows setup guidance.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eSidebar: increased project/chat loading timeout from 15s to 30s and converted abort/timeout failures into friendly retry messages, reducing macOS \u003ccode class=\"cl-code\"\u003eAbortError: signal is aborted without reason\u003c/code\u003e reports during slow Codex startup.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eSkills: made skill path validation cross-platform by replacing hard-coded POSIX \u003ccode class=\"cl-code\"\u003e/.codex/skills/\u003c/code\u003e checks with normalized path resolution, fixing Windows skill search/install follow-up operations against user and project \u003ccode class=\"cl-code\"\u003e.codex/skills\u003c/code\u003e directories.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.46\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eExpanded the website quick start with detailed Windows Miniforge installation, Codex initialization, Annodex launch, and DeepSeek model setup steps.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eAdded a screenshot-based Usage Guide covering model configuration, skills, file preview, runtime monitoring, and mobile browser usage.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eAdded product screenshots to the homepage and documentation overview.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eDocumented platform app-server transport defaults and added startup logging for the selected Codex app-server transport.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eEnsured website documentation references tracked screenshot assets so published docs render images correctly.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.45\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eAdded a wildcard Codex app-server notification hook so annodex can normalize all incoming app-server events consistently across WebSocket and stdio transports.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eAdded optional Codex event diagnostics with ANNODEX_CODEX_EVENT_LOG=1.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eImproved streaming output by lazily starting assistant rendering when text deltas arrive before turn or item lifecycle events.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eAdded streaming support for Codex reasoning text and reasoning summary deltas.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eAvoided treating completed agent messages as new streamed content when deltas were already received, while preserving completed-message fallback when no deltas arrive.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.44\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eAdded dual Codex app-server transports: existing WebSocket mode and a new stdio JSON-RPC mode.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eWindows now defaults to stdio transport, while macOS/Linux keep the existing WebSocket transport.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eAdded ANNODEX_CODEX_TRANSPORT=ws|stdio|auto override for transport selection.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eImproved Windows compatibility by avoiding local port/listener readiness issues that can leave chats stuck loading or turns stalled.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eCodex server registry keys now include transport mode so WebSocket and stdio app-server instances are not accidentally reused across modes.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.43\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eWindows: completed the Codex app-server JSON-RPC handshake by sending the required \u003ccode class=\"cl-code\"\u003einitialized\u003c/code\u003e notification immediately after \u003ccode class=\"cl-code\"\u003einitialize\u003c/code\u003e, matching CodePilot/hello-halo and fixing cases where sidebar chat loading, thread start/resume, and agent replies could stall.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eSessions: added a 12-second timeout fallback for workspace \u003ccode class=\"cl-code\"\u003ethread/list\u003c/code\u003e loading so the sidebar no longer stays on \"Loading chats...\" indefinitely when the workspace app-server is stuck; it falls back to local session summaries instead.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.42\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eSidebar: renamed project section label from \"Threads\" to \"Projects\".\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eSidebar: removed the \"drag to sort, pin to top\" hint next to the project label.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.41\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eSimplified \u003ccode class=\"cl-code\"\u003eannodex passwd\u003c/code\u003e: terminal access now grants password-reset permission. No old password prompt, single new-password entry. Empty input disables auth. \u003ccode class=\"cl-code\"\u003e--reset\u003c/code\u003e still works as a silent alias for backward compatibility.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eSimplified \u003ccode class=\"cl-code\"\u003epromptPassword()\u003c/code\u003e (first-run setup) to match the single-entry flow.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eWindows: \u003ccode class=\"cl-code\"\u003e.cmd\u003c/code\u003e/\u003ccode class=\"cl-code\"\u003e.bat\u003c/code\u003e shim binaries (e.g. \u003ccode class=\"cl-code\"\u003ecodex.cmd\u003c/code\u003e) now launch through \u003ccode class=\"cl-code\"\u003ecmd.exe /d /s /c\u003c/code\u003e with \u003ccode class=\"cl-code\"\u003ewindowsVerbatimArguments\u003c/code\u003e, matching CodePilot's \u003ccode class=\"cl-code\"\u003ebuildCodexLaunch()\u003c/code\u003e pattern. Fixes spawn failures when the codex binary is an npm-installed shim in a path with spaces.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eWindows: \u003ccode class=\"cl-code\"\u003efindListeningPids()\u003c/code\u003e now uses \u003ccode class=\"cl-code\"\u003eGet-NetTCPConnection\u003c/code\u003e (PowerShell) primary and \u003ccode class=\"cl-code\"\u003enetstat\u003c/code\u003e fallback for port detection, replacing the previous blank \u003ccode class=\"cl-code\"\u003ereturn []\u003c/code\u003e on win32.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eWindows: \u003ccode class=\"cl-code\"\u003ereadProcessCmdline()\u003c/code\u003e now supports win32 via \u003ccode class=\"cl-code\"\u003eGet-CimInstance\u003c/code\u003e / \u003ccode class=\"cl-code\"\u003ewmic\u003c/code\u003e fallback.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.40\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eFixed \u003ccode class=\"cl-code\"\u003ecodex\u003c/code\u003e CLI not found (\u003ccode class=\"cl-code\"\u003eENOENT\u003c/code\u003e) on Windows: \u003ccode class=\"cl-code\"\u003egetCodexExecutablePath()\u003c/code\u003e now searches for \u003ccode class=\"cl-code\"\u003ecodex.cmd\u003c/code\u003e and \u003ccode class=\"cl-code\"\u003ecodex.exe\u003c/code\u003e in addition to \u003ccode class=\"cl-code\"\u003ecodex\u003c/code\u003e, scans the global npm \u003ccode class=\"cl-code\"\u003enode_modules/.bin\u003c/code\u003e directory, and uses \u003ccode class=\"cl-code\"\u003e__dirname\u003c/code\u003e-relative lookup for globally-installed annodex. Connection failure errors now include a clear hint about the missing binary path.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.39\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003ccode class=\"cl-code\"\u003ehandleSend\u003c/code\u003e no longer removes the user's message on failure — the message stays visible and a descriptive \"Send failed: …\" error is shown, making it obvious when an agent request fails instead of silently flashing the message away.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.38\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eImprovements\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003ePreset providers (DeepSeek, Moonshot AI, Zhipu, MiniMax) now auto-discover models from the provider's API (\u003ccode class=\"cl-code\"\u003e/v1/models\u003c/code\u003e) after entering an API key, instead of using a static preset model list. Falls back to preset models if the API is unreachable.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eAdded 15-second fetch timeout to \u003ccode class=\"cl-code\"\u003eloadSessionsForCwd\u003c/code\u003e and \u003ccode class=\"cl-code\"\u003eloadProjects\u003c/code\u003e in the sidebar, preventing permanent \"Loading chats…\" hang on slow or blocked network connections.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.37\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eFixed constant screen flickering on Windows caused by \u003ccode class=\"cl-code\"\u003erouter.replace(\"/\")\u003c/code\u003e navigating away from \u003ccode class=\"cl-code\"\u003e/workspace\u003c/code\u003e and triggering a \u003ccode class=\"cl-code\"\u003eredirect\u003c/code\u003e → remount loop in \u003ccode class=\"cl-code\"\u003eAppShell\u003c/code\u003e. Three \u003ccode class=\"cl-code\"\u003ehandleCwdChange\u003c/code\u003e / \u003ccode class=\"cl-code\"\u003ehandleNewSession\u003c/code\u003e / \u003ccode class=\"cl-code\"\u003ehandleSessionDeleted\u003c/code\u003e paths now use \u003ccode class=\"cl-code\"\u003e/workspace\u003c/code\u003e instead of \u003ccode class=\"cl-code\"\u003e/\u003c/code\u003e.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.36\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eRemoved the tracked \u003ccode class=\"cl-code\"\u003epresentation/\u003c/code\u003e publishing assets and root \u003ccode class=\"cl-code\"\u003e.source/\u003c/code\u003e generated files from the Git repository so release secret scanning no longer flags embedded cookies or tokens.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eRemoved the obsolete root Fumadocs MDX build hook from the main app, fixing release \u003ccode class=\"cl-code\"\u003enpm-publish\u003c/code\u003e builds that failed on \u003ccode class=\"cl-code\"\u003esource.config.ts\u003c/code\u003e externalization.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.35\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eImprovements\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eRefined the mobile chat input sheet interactions so phone users can reach composer actions more reliably without dialog overlays blocking taps near the bottom edge.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eAdded built-in provider presets for DeepSeek, Moonshot AI, Zhipu AI, MiniMax, and OpenRouter to speed up API-key-based model setup.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eChanged provider preset insertion in the Models dialog to update only the local draft until Save, preventing unsaved provider edits from being clobbered.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eAllowed writable annodex provider entries to override same-id read-only Codex providers from merged config.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eSwitched the OpenRouter preset default protocol to OpenAI Responses for correct out-of-box behavior.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.34\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eNew\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eAdded presentation assets for annodex product introduction: HyperFrames HTML composition with 6-scene Chinese narration, TTS audio, and CSS-rendered virtual UI showcasing the browser-based AI workspace experience.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eAdded WeChat official account promotional article (\u003ccode class=\"cl-code\"\u003epresentation/wechat_article.md\u003c/code\u003e) targeting bioinformatics researchers.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eAdded automated Xiaohongshu (RED) publishing scripts using Selenium/Playwright for one-click note posting with Firefox login session reuse.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eDocumentation\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eUpdated product messaging across presentation and promotion materials: unified URL to \u003ccode class=\"cl-code\"\u003eannodex.seqyuan.cn\u003c/code\u003e, refined value proposition around eliminating ChatGPT/VPN barriers, DeepSeek API format bridging, and bioinformatics-specific generative UI.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.33\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eSimplified the root app back to the local workspace role: \u003ccode class=\"cl-code\"\u003e/\u003c/code\u003e now redirects to \u003ccode class=\"cl-code\"\u003e/workspace\u003c/code\u003e, while the standalone \u003ccode class=\"cl-code\"\u003esite/\u003c/code\u003e subproject remains the only public-facing docs/marketing surface.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eMaintenance\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eRemoved the duplicated root-app docs route, root MDX loader chain, and mirrored \u003ccode class=\"cl-code\"\u003econtent/docs\u003c/code\u003e sources that were superseded by \u003ccode class=\"cl-code\"\u003esite/\u003c/code\u003e.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eUpdated lint ignores so \u003ccode class=\"cl-code\"\u003esite/.next\u003c/code\u003e and \u003ccode class=\"cl-code\"\u003esite/.source\u003c/code\u003e generated files do not pollute root-repo lint results.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.32\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eImprovements\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eAdded a standalone \u003ccode class=\"cl-code\"\u003esite/\u003c/code\u003e public documentation subproject so Vercel can deploy the explanation site without exposing the main local workspace app, APIs, or \u003ccode class=\"cl-code\"\u003e/workspace\u003c/code\u003e route.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eReframed the public-site copy and docs to make the local/LAN product boundary explicit: the hosted site is documentation only, while annodex itself remains a local-first browser workspace.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eRestored historical message timestamps by hydrating chat history from local Codex session JSONL records instead of assigning the entire loaded thread the same \u003ccode class=\"cl-code\"\u003eupdatedAt\u003c/code\u003e time.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.31\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eImprovements\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eAdded presentation copy and helper scripts for rendering or manually publishing the annodex promo deck and Xiaohongshu post assets.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eNormalized assistant messages that arrive as plain strings so the session UI still renders them as text blocks instead of dropping their content.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eRemoved outdated public/open-source wording from the presentation deck so the promo materials match the current annodex positioning and repository visibility.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.30\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eImprovements\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eAdded a public-facing landing page and documentation section so annodex now has a clearer project website instead of dropping users directly into the workspace UI.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eAdded a dedicated \u003ccode class=\"cl-code\"\u003e/workspace\u003c/code\u003e route for the actual working interface, keeping the browser workspace accessible while allowing \u003ccode class=\"cl-code\"\u003e/\u003c/code\u003e and \u003ccode class=\"cl-code\"\u003e/docs\u003c/code\u003e to serve as product-facing entry points.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eExpanded the documentation set with quick start, installation, configuration, architecture, runtime, and workspace guides aligned to the current annodex product surface.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eCorrected project-site and docs copy to reflect the current product structure, including the workspace entry path and the removal of the old Report tab terminology.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eExcluded generated Fumadocs \u003ccode class=\"cl-code\"\u003e.source/\u003c/code\u003e files from linting and git noise, while keeping the authored docs content tracked in the repository.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.29\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eSwitched the mobile composer overflow menu outside-click handling to \u003ccode class=\"cl-code\"\u003epointerdown\u003c/code\u003e with \u003ccode class=\"cl-code\"\u003emousedown\u003c/code\u003e fallback, so tapping the three-dot button on phones reliably opens the More menu.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.28\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eCleared the server-side prompt busy state as soon as an \u003ccode class=\"cl-code\"\u003eagent_end\u003c/code\u003e event arrives, so completed assistant replies no longer leave the composer stuck showing the red Stop button.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.27\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eImprovements\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eExpanded project/session loading to prefer complete Codex thread metadata, so project chat counts and expanded project histories can reflect the full set of chats instead of only local cache fragments.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eAdded per-project chat count display in the left sidebar and a recent-project chat count fallback, making project activity easier to scan without opening every thread.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eImproved chat runtime visibility with a live Working panel, elapsed-seconds label, periodic reconcile while sessions are running, and default full-access sandbox mode for new or resumed chats when configured.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eTightened mobile chat UX: the minimap and subagent overlays stay out of the way on phones, the composer is more compact and sticky, and the final messages now keep enough bottom space above the mobile input bar.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eRestored assistant timestamp rendering after replies finish so completed AI messages keep their visible time markers.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eHardened client refresh behavior with more reliable streaming/reconcile updates, reducing cases where users had to manually refresh the page to see the assistant reply.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.25\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eImprovements\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eReworked the chat message surface with a live process panel that keeps tool calls, thinking blocks, and runtime status visible while a Codex session is running.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eAdded floating preview windows for images and PDFs, including gallery navigation for generated image groups, so visual files no longer need to occupy right-panel tabs.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eExpanded the chat input toolbar with a slash-command menu and practical prompt shortcuts for \u003ccode class=\"cl-code\"\u003e/memory\u003c/code\u003e, \u003ccode class=\"cl-code\"\u003e/init\u003c/code\u003e, and \u003ccode class=\"cl-code\"\u003e/goal\u003c/code\u003e, while keeping \u003ccode class=\"cl-code\"\u003e/compact\u003c/code\u003e as the only true native command.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eAdded persistent app settings for default sandbox mode and auto-restart, and wired the default sandbox choice into new sessions and restored threads.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eUpgraded the project sidebar to support stable project ordering with pinning and manual reorder metadata, while keeping project history lazy-loaded.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eSimplified the CLI help output by removing app-specific environment variable details from the default help screen.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.24\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eImprovements\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eReduced global install weight by moving build-only frontend packages out of runtime dependencies while keeping the production \u003ccode class=\"cl-code\"\u003e.next\u003c/code\u003e package layout.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eKept the npm package source-minimized: published files still contain production build artifacts, CLI files, defaults, and public assets rather than app/component source trees.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eAdded a package check that prevents build-only frontend libraries from accidentally returning to runtime dependencies.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.23\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eMaintenance\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eReleased the verified 0.1.22 project sidebar, lazy session loading, and new-chat rollout handling changes as the current patch version.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eConfirmed the local development server can run on an alternate Next.js dev port when the default port is already occupied.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.22\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eImprovements\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eReworked the left sidebar project list to a CodePilot-style Threads view with compact expandable project rows and hover actions for starting a chat in a project.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eUpdated the add-project dialog so users can either browse server folders or manually enter a project path and use it directly.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eKept project session history lazy-loaded per project so opening the sidebar does not eagerly read every Codex thread.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eFixed session restore paths to use lightweight thread metadata lookup before loading full history, preventing old sessions from being blocked by unrelated project/session scans.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eTreated missing Codex rollouts and not-found thread reads as absent sessions instead of hard failures.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eSkipped \u003ccode class=\"cl-code\"\u003ethread/resume\u003c/code\u003e before the first prompt for newly created chats, avoiding \u003ccode class=\"cl-code\"\u003eno rollout found\u003c/code\u003e errors on new thread startup.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.21\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eImprovements\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eReworked the left sidebar project channel to match the AnnoVibe grouped project view: all chat projects are shown, project chat history is collapsible, and only the current or most recently active project expands by default.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eAdded a right-panel Tools tab that shows live Codex chat runtime status, including phase, model, active tools, wait time, last event, and abort control.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eAdded a lightweight Starfleet-inspired favicon.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eOpened the right panel on Files by default after removing the Report tab.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eRemoved the Analysis Report tab, report update parsing, report prompt injection, report storage, and report API surface.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eExposed \u003ccode class=\"cl-code\"\u003e/api/agent/runtime\u003c/code\u003e for UI runtime polling and expanded runtime state tracking for running sessions.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.20\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eWait for the \u003ccode class=\"cl-code\"\u003econnected\u003c/code\u003e SSE event before sending the first prompt in new and resumed chats, so the event subscription is live before Codex emits turn events.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eTreat agent event stream connection timeouts as send failures instead of entering \"Waiting for model...\", and clean up unconfirmed EventSource connections.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003ePrevent duplicate sends while a chat is still creating its session or waiting for SSE setup.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eSend the SSE \u003ccode class=\"cl-code\"\u003econnected\u003c/code\u003e event only after the server has registered the session event listener.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.19\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eFixed new chats getting stuck on \"Waiting for model...\" after the temporary new-session view switches to the real Codex thread id.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eScoped EventSource cleanup to the session id it owns so session creation, model-switch forks, and reconnects do not accidentally close the active SSE stream.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.18\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eImprovements\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eMoved the file explorer out of the left sidebar into a persistent right-panel Files tab.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eRestored the left sidebar project list as an expanded project tree, with only the most recently active or current project's chats expanded by default.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eOpen PDF and image files in draggable preview windows instead of occupying right-panel file tabs.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eKept project chat loading scoped per project so expanding one project's history does not force all project histories to load at once.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.17\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eImprovements\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eAdded the Annodex Router provider so Codex app-server now sees one stable \u003ccode class=\"cl-code\"\u003eannodex-router\u003c/code\u003e provider per workspace while Annodex routes real provider/model requests by wire model key.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eCentralized Responses and Chat Completions routing in the local router, reusing the compat proxy translation path for Chat-only providers.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eKept legacy multi-provider workspace env generation available as a rollback/test path.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eResumed chats now bind the current wire model before each prompt, allowing historical chats to continue and switch models without losing the thread.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003ePrevented \u003ccode class=\"cl-code\"\u003eannodex-router\u003c/code\u003e provider ids and hashed wire model keys from leaking into UI session runtime, history rendering, and context usage recovery.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003ePreserved protocol correctness by keeping \u003ccode class=\"cl-code\"\u003eturn/start\u003c/code\u003e provider-stable and sending only the wire model id for each turn.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.11\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eImprovements\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eRouter/relay providers (DeepRouter, OpenRouter, etc.) now default to Responses API without the compat proxy, matching codex CLI behavior and eliminating ~6s of SSE translation latency.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eNew chats auto-select a default model from annodex providers.json when no codex config.toml default is set.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eCross-provider model switching no longer forces a full ChatWindow remount, preserving the selected model across the fork so the UI does not appear blank after switching.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eSession-change effect uses \u003ccode class=\"cl-code\"\u003e[session?.id]\u003c/code\u003e dependency instead of mount-only, with a ref guard to avoid reconnecting the already-live EventSource after the first message creates a session.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.10\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eImprovements\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eAdded collapsible \"Chats\" section in the sidebar, matching the existing Project and Explorer toggle behavior, with session count display.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eFixed cross-provider session context loading (e.g. DeepRouter threads queried through DeepSeek server) by looking up the session's stored provider runtime before choosing a codex app-server instance.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eMoved \u003ccode class=\"cl-code\"\u003ecodexServerEnvForModel\u003c/code\u003e to a shared location to avoid circular imports between \u003ccode class=\"cl-code\"\u003erpc-manager\u003c/code\u003e and \u003ccode class=\"cl-code\"\u003esession-reader\u003c/code\u003e.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.9\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eFixed cross-provider model switching (e.g. DeepSeek → DeepRouter) silently creating a fresh thread instead of leaking a \"thread not found\" error, since each codex app-server instance only knows its own threads.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.8\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eImprovements\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eAdded per-provider \u003ccode class=\"cl-code\"\u003ereasoningConfig\u003c/code\u003e to \u003ccode class=\"cl-code\"\u003eproviders.json\u003c/code\u003e, allowing explicit control over thinking/reasoning parameter mapping (thinkingParam, effortParam, effortValueMode) when the compat proxy translates OpenAI Resposnes to Chat Completions. Falls back to hardcoded provider defaults when not configured.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eVulcan salute (LLAP 🖖) favicon replacing the generic hand icon.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eGPT-pattern models (e.g. \u003ccode class=\"cl-code\"\u003egpt-5.5\u003c/code\u003e) on Chat Completions providers like DeepRouter no longer force \u003ccode class=\"cl-code\"\u003eopenai-responses\u003c/code\u003e; they now inherit the provider's API setting, ensuring the compat proxy starts and translates correctly.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eIncluded \u003ccode class=\"cl-code\"\u003ereasoningConfig\u003c/code\u003e fingerprint in the codex app-server instance key so switching models with different thinking parameter mappings creates a fresh compat proxy instead of reusing a stale one.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.7\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eMoved \u003ccode class=\"cl-code\"\u003e-c\u003c/code\u003e global config overrides before the \u003ccode class=\"cl-code\"\u003eapp-server\u003c/code\u003e subcommand so Codex app-server correctly loads dynamic provider settings (DeepSeek, DeepRouter, etc.), fixing sessions that were stuck on \"Waiting for model...\".\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eFixed DeepRouter/OpenRouter API detection — now correctly identified as Chat Completions providers instead of defaulting to OpenAI Responses, ensuring the compat proxy translates requests properly.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eAdded \u003ccode class=\"cl-code\"\u003ecrazyrouter\u003c/code\u003e, \u003ccode class=\"cl-code\"\u003etherouter\u003c/code\u003e to Chat Completions provider patterns and compat proxy detection for consistent routing.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.6\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eImprovements\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eKept UI-managed providers and Codex home providers distinct when their ids or model names collide, so duplicate models such as \u003ccode class=\"cl-code\"\u003egpt-5.5\u003c/code\u003e resolve to the selected source.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eMarked Codex-loaded providers as read-only in the Models settings UI and prevented them from being written back to annodex provider config.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eReplaced the old pi favicon with an LLAP hand favicon.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eResolved provider normalization and app-server switching issues that could send a UI-configured deeprouter GPT model through a stale DeepSeek-compatible connection.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eAdded session alias handling when Codex cannot resume an old thread and creates a replacement thread, fixing restored-session \u003ccode class=\"cl-code\"\u003ethread not found\u003c/code\u003e failures.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eRemoved the misleading Steer and Follow-up input controls because Codex app-server does not support native steer or queued follow-up operations.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.5\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eImprovements\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eAdded collapsible Project controls in the left sidebar, matching the Explorer section behavior.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eMade the Project header refresh projects and current project sessions when toggled, while keeping the dedicated refresh button for refresh-only updates.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eImproved deeprouter and mixed-provider model handling so GPT-style models can use OpenAI Responses while DeepSeek/Kimi/Qwen-style models use Chat Completions through the compat proxy.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eSwitched Codex app-server connections when the UI model/provider changes, preventing a selected deeprouter GPT model from being sent through a stale DeepSeek provider connection.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003ePreserved \u003ccode class=\"cl-code\"\u003ecustom\u003c/code\u003e providers in session runtime so restored sessions keep the correct provider context.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eMerged Codex \u003ccode class=\"cl-code\"\u003e~/.codex/config.toml\u003c/code\u003e and \u003ccode class=\"cl-code\"\u003eauth.json\u003c/code\u003e defaults with annodex-managed provider models, including API key discovery from Codex auth state.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.4\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eImprovements\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eRestored Codex token statistics in the top bar by reading \u003ccode class=\"cl-code\"\u003etoken_count\u003c/code\u003e events from local Codex session JSONL history.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eAdded context usage recovery for Codex app-server sessions, including context window fallback from known model defaults and configured models.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eAttached per-turn token usage to assistant messages when Codex history includes usage snapshots.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eDisplay context usage as used tokens over context window, with percentage detail in the tooltip.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eAvoided double-counting duplicate Codex token snapshots emitted during the same turn.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eKept live agent state aligned with recovered context usage after refresh or idle resume.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.3\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eImprovements\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eAligned model settings with annodex's Codex Web target by supporting only the two backend protocols that actually run: OpenAI Responses and Chat Completions through the compat proxy.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eAdded provider protocol inference so DeepSeek/Kimi/Qwen/Zhipu-style endpoints default to Chat Completions while OpenAI and deeprouter-style endpoints default to Responses.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eMade model testing perform a real lightweight provider request instead of returning a placeholder success.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003ePreserved model-level protocol overrides, reasoning flags, thinking-level maps, and compatibility metadata across save/load.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eReused Codex app-server processes only when provider protocol, base URL, API key source, and context window match, preventing stale credentials after model settings changes.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003ePassed thinking-level defaults into the Chat Completions compat proxy for reasoning-capable providers.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eKept model, skills, projects, and session APIs aligned with \u003ccode class=\"cl-code\"\u003eCODEX_HOME\u003c/code\u003e and active Codex runtime state.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.1.2\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eImprovements\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eLoad projects, sessions, skills, and model settings from local Codex/annodex state without blocking on a cold \u003ccode class=\"cl-code\"\u003ecodex app-server\u003c/code\u003e startup.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eRead Codex-native skills from project, user, and system skill directories, and install skills with the Codex agent target.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eMake model configuration work with just \u003ccode class=\"cl-code\"\u003ebaseUrl\u003c/code\u003e, \u003ccode class=\"cl-code\"\u003eapiKey\u003c/code\u003e, and a manually entered model id; model discovery is now optional.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eSurface managed-server update and idle-restart state in the Web UI top bar.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eImprove Analysis Report prompting and fallback generation with representative figure links and richer output file notes.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eFixed settings panels that could remain stuck on loading for projects, skills, and models.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003ePreserved Codex defaults from \u003ccode class=\"cl-code\"\u003e~/.codex/config.toml\u003c/code\u003e unless the user explicitly changes annodex-managed defaults.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eScoped session listing to the active project and skipped injected context in previews.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.8.17\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eImprovements\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eAdded streaming progress updates and cancel support for skill installs.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eMade \u003ccode class=\"cl-code\"\u003enpx skills\u003c/code\u003e invocation non-interactive and increased the install timeout for slow GitHub clones.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eImproved skill install error cleanup so spinner control codes and npm first-run warnings do not obscure the real failure.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eFixed the npm publish workflow package name after the AnnoVibe rename.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.8.16\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eImprovements\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eAuto-detect image-capable models during Models discovery and import them with \u003ccode class=\"cl-code\"\u003einput: [\"text\", \"image\"]\u003c/code\u003e.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eShow an \u003ccode class=\"cl-code\"\u003eimage\u003c/code\u003e capability marker in the Models discovery list for imported vision models.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.8.15\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eFixed Plot tool preset activation so new sessions actually allow \u003ccode class=\"cl-code\"\u003ekernel_plot_*\u003c/code\u003e tools.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eKept Plot mode synced on existing sessions after idle wrapper recreation or later prompts.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003ePrevented Plot mode from being implicitly enabled when restoring ordinary sessions.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.8.14\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eImprovements\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eAdded idle-aware auto-restart for managed AnnoVibe servers after package updates.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eImproved bioinformatics analysis reporting so completed analysis runs create topic-scoped Report updates, including large PDF/result directories.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003ePrefer generated UI widgets over Mermaid for diagrams unless raw Mermaid/source output is explicitly requested.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eFixed PDF.js compatibility in browsers missing \u003ccode class=\"cl-code\"\u003eUint8Array.prototype.toHex\u003c/code\u003e.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003ePrevented Mermaid syntax errors from flooding or crashing the chat UI.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eAdded clearer sidebar API error messages and ignored local \u003ccode class=\"cl-code\"\u003e.pi/\u003c/code\u003e workspace data.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.8.12\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eRenamed the product surface from Pidex to AnnoVibe / annovibe.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eAdded AnnoVibe version checking with npm update command hints.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eAdded plot kernel status APIs, memory display, release action, and idle timeout settings.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eKept legacy pidex settings, auth cookies, and CLI state files compatible during migration.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.7.9\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eImprovements\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eGlobal file editor in right panel\u003c/strong\u003e — soul.md and harness.md now open in right panel with CodeMirror, instead of inline sidebar textarea.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.7.8\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003estderr null reference\u003c/strong\u003e on daemon detach.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.7.7\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eUpdated README with all features and CLI commands.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.7.6\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eLogin redirect\u003c/strong\u003e — auth env was exposed to \u003ccode class=\"cl-code\"\u003enext.config.ts\u003c/code\u003e so Edge Runtime middleware can read it.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003e\u003cstrong\u003ePassword management\u003c/strong\u003e — \u003ccode class=\"cl-code\"\u003eannovibe passwd\u003c/code\u003e (change), \u003ccode class=\"cl-code\"\u003eannovibe passwd --reset\u003c/code\u003e (remove). Password stored at \u003ccode class=\"cl-code\"\u003e~/.pi/agent/web-auth.json\u003c/code\u003e.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.7.5\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eNew Features\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eCLI commands\u003c/strong\u003e — \u003ccode class=\"cl-code\"\u003eannovibe --version\u003c/code\u003e, \u003ccode class=\"cl-code\"\u003eannovibe --help\u003c/code\u003e, \u003ccode class=\"cl-code\"\u003eannovibe update\u003c/code\u003e (self-update from npm).\u003c/li\u003e\u003cbr/\u003e\u003cli\u003e\u003cstrong\u003eVersion check\u003c/strong\u003e — auto-checks npm for newer version on startup.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.7.4\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eRemoved @lobehub/icons\u003c/strong\u003e — replaced 25 provider icons with inline SVGs. Eliminates @lobehub/ui → antd → @emoji-mart heavy dependency chain. No more peer dependency warnings on install.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eImprovements\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eDaemon mode\u003c/strong\u003e — annovibe auto-detaches after startup, returns terminal prompt while server runs in background.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.7.2\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eLogin redirect broken\u003c/strong\u003e — \u003ccode class=\"cl-code\"\u003erouter.push()\u003c/code\u003e not sending \u003ccode class=\"cl-code\"\u003eSameSite=Lax\u003c/code\u003e cookie, causing endless login loop. Fixed with \u003ccode class=\"cl-code\"\u003ewindow.location.href\u003c/code\u003e hard navigation.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003e\u003cstrong\u003enpm-publish workflow\u003c/strong\u003e — explicit \u003ccode class=\"cl-code\"\u003e.npmrc\u003c/code\u003e auth token, handle already-published packages, fix \u003ccode class=\"cl-code\"\u003euseSearchParams\u003c/code\u003e Suspense wrapper, split \u003ccode class=\"cl-code\"\u003eauth-token.ts\u003c/code\u003e from bcryptjs for Edge Runtime compat.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.7.1\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eNew Features\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003eStreaming widgets\u003c/strong\u003e — \u003ccode class=\"cl-code\"\u003eshow-widget\u003c/code\u003e fence support. LLM outputs charts/plots/SVG inline during streaming, rendered in sandboxed iframe with postMessage protocol.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003e\u003cstrong\u003eVisualization harness\u003c/strong\u003e — global \u003ccode class=\"cl-code\"\u003eharness.md\u003c/code\u003e behavioral constraints. Default template covers when to visualize, chart type guidelines, and matplotlib/R script→base64 PNG embedding.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003e\u003cstrong\u003eGlobal harness editor\u003c/strong\u003e — inline editing in sidebar Context panel (same UX as soul.md).\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eChanges\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eharness.md moved from per-project (\u003ccode class=\"cl-code\"\u003e{cwd}/\u003c/code\u003e) to global (\u003ccode class=\"cl-code\"\u003e~/.pi/agent/\u003c/code\u003e) alongside soul.md\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eSoulEditor renamed to GlobalEditor (shared by soul.md + harness.md)\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch2 class=\"cl-h2\"\u003e0.7.0\u003c/h2\u003e\u003c/p\u003e\u003cp class=\"cl-p\"\u003e\u003ch3 class=\"cl-h3\"\u003eNew Features\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003cstrong\u003ePassword authentication\u003c/strong\u003e — optional password protection (like Jupyter). Set on first start via CLI prompt or \u003ccode class=\"cl-code\"\u003eANNOVIBE_PASSWORD\u003c/code\u003e env var. bcrypt-hashed, HMAC-signed session cookies.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003e\u003cstrong\u003eSubagent panel\u003c/strong\u003e — track subagent runs (active/completed/failed) in a slide-out panel in the chat area.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003e\u003cstrong\u003eResizable panels\u003c/strong\u003e — drag sidebar and right panel dividers to resize. Widths persist via localStorage.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003e\u003cstrong\u003eDocument viewers\u003c/strong\u003e — PDF, DOCX, XLSX, PPTX preview in sidebar file explorer and drag-drop attachments in chat.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003e\u003cstrong\u003eText file editing\u003c/strong\u003e — CodeMirror 6 editor with syntax highlighting for 10+ languages. Ctrl+S to save.\u003c/li\u003e\u003cbr/\u003e\u003cli\u003e\u003cstrong\u003eProject Context\u003c/strong\u003e — sidebar section for soul.md (global, Spock personality), memory.md (project-level, self-updating), and AGENTS.md.\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eImprovements\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003eRenamed from \u003ccode class=\"cl-code\"\u003e@agegr/pi-web\u003c/code\u003e to \u003ccode class=\"cl-code\"\u003e@seqyuan/annovibe\u003c/code\u003e\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eSSE reconnection now works during tool execution (not just text streaming)\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eFile explorer auto-refreshes on custom path changes\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eCustom messages (\u003ccode class=\"cl-code\"\u003esubagent-notify\u003c/code\u003e) now rendered in chat\u003c/li\u003e\u003cbr/\u003e\u003cli\u003esoul.md / memory.md auto-injected into system prompt at session creation\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003cbr/\u003e\u003ch3 class=\"cl-h3\"\u003eFixes\u003c/h3\u003e\u003cbr/\u003e\u003cul class=\"cl-ul\"\u003e\u003cli\u003e\u003ccode class=\"cl-code\"\u003exdg-open\u003c/code\u003e crash on systems without xdg-utils installed\u003c/li\u003e\u003cbr/\u003e\u003cli\u003eSession switching no longer loses in-progress agent responses\u003c/li\u003e\u003cbr/\u003e\u003c/ul\u003e\u003c/p\u003e"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"docs\",\"changelog\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"docs\",{\"children\":[\"changelog\",{\"children\":[\"__PAGE__\",{}]}]}]},\"$undefined\",\"$undefined\",16],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/6b00dcf032cca328.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/fddca953485158e4.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"__variable_66b8ca\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"(function(){try{var t=localStorage.getItem(\\\"annodex-theme\\\");if(t===\\\"dark\\\")document.documentElement.classList.add(\\\"dark\\\")}catch(e){}})();\"}}]}],[\"$\",\"body\",null,{\"style\":{\"minHeight\":\"100dvh\",\"display\":\"flex\",\"flexDirection\":\"column\"},\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"$L3\",null,{\"children\":[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]}]]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"div\",null,{\"style\":{\"maxWidth\":800,\"margin\":\"0 auto\",\"padding\":\"40px 24px 80px\"},\"children\":[[\"$\",\"$L6\",null,{\"href\":\"/workspace\",\"style\":{\"display\":\"inline-flex\",\"alignItems\":\"center\",\"gap\":6,\"color\":\"var(--color-accent, #3b82f6)\",\"textDecoration\":\"none\",\"fontSize\":14,\"marginBottom\":24},\"children\":[\"←\",\" Back to \",\"annodex\"]}],[\"$\",\"div\",null,{\"className\":\"changelog-content\",\"dangerouslySetInnerHTML\":{\"__html\":\"$7\"}}],\"$L8\"]}],null,\"$L9\"]}],{},null,false,null]},null,false,\"$@a\"]},null,false,\"$@a\"]},null,false,null],\"$Lb\",false]],\"m\":\"$undefined\",\"G\":[\"$c\",[]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"SDOFq_E7ojxmkJsbWnwQx\"}\n"])</script><script>self.__next_f.push([1,"d:I[90484,[],\"OutletBoundary\"]\ne:\"$Sreact.suspense\"\n11:I[90484,[],\"ViewportBoundary\"]\n13:I[90484,[],\"MetadataBoundary\"]\n8:[\"$\",\"style\",null,{\"children\":\"\\n .changelog-content { font-family: var(--font-noto-mono, monospace); line-height: 1.7; color: var(--color-fg, #e5e7eb); }\\n .cl-h1 { font-size: 28px; font-weight: 700; margin: 40px 0 16px; color: var(--color-fg, #f9fafb); border-bottom: 1px solid var(--color-border, #374151); padding-bottom: 8px; }\\n .cl-h2 { font-size: 22px; font-weight: 600; margin: 32px 0 12px; color: var(--color-accent, #60a5fa); }\\n .cl-h3 { font-size: 16px; font-weight: 600; margin: 20px 0 8px; color: var(--color-fg-secondary, #9ca3af); }\\n .cl-p { margin: 0 0 12px; }\\n .cl-ul { margin: 8px 0 16px 20px; padding: 0; }\\n .cl-ul li { margin: 4px 0; }\\n .cl-code { background: var(--color-bg-code, #1f2937); padding: 2px 6px; border-radius: 4px; font-size: 13px; }\\n \"}]\n9:[\"$\",\"$Ld\",null,{\"children\":[\"$\",\"$e\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@f\"}]}]\n10:[]\na:\"$W10\"\nb:[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L11\",null,{\"children\":\"$L12\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L13\",null,{\"children\":[\"$\",\"$e\",null,{\"name\":\"Next.Metadata\",\"children\":\"$L14\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}]\n"])</script><script>self.__next_f.push([1,"12:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"15:I[86869,[],\"IconMark\"]\nf:null\n14:[[\"$\",\"title\",\"0\",{\"children\":\"Changelog\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Release history and changes\"}],[\"$\",\"link\",\"2\",{\"rel\":\"shortcut icon\",\"href\":\"/favicon.svg\",\"type\":\"image/svg+xml\"}],[\"$\",\"link\",\"3\",{\"rel\":\"icon\",\"href\":\"/favicon.svg\",\"type\":\"image/svg+xml\"}],[\"$\",\"$L15\",\"4\",{}]]\n"])</script></body></html>
|