<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: 邱敬幃 Pardn Chiu</title>
    <description>The latest articles on DEV Community by 邱敬幃 Pardn Chiu (@pardnchiu).</description>
    <link>https://dev.to/pardnchiu</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2593887%2Fe062bbc9-4cfb-4202-b24b-986edf79404b.jpg</url>
      <title>DEV Community: 邱敬幃 Pardn Chiu</title>
      <link>https://dev.to/pardnchiu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pardnchiu"/>
    <language>en</language>
    <item>
      <title>Agenvoy@v0.17.0: Easily view your records, more invocation methods</title>
      <dc:creator>邱敬幃 Pardn Chiu</dc:creator>
      <pubDate>Sat, 28 Mar 2026 19:56:11 +0000</pubDate>
      <link>https://dev.to/pardnchiu/agenvoyv0170-easily-view-your-records-more-invocation-methods-345e</link>
      <guid>https://dev.to/pardnchiu/agenvoyv0170-easily-view-your-records-more-invocation-methods-345e</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/pardnchiu/Agenvoy/releases/tag/v0.17.0" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub-cover.pardn.workers.dev%2Fpardnchiu%2Fagenvoy" alt="cover" width="1280" height="640"&gt;&lt;/a&gt;&lt;br&gt;
repo: &lt;a href="https://github.com/pardnchiu/Agenvoy" rel="noopener noreferrer"&gt;pardnchiu/Agenvoy&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Agenvoy is inspired by OpenClaw, built on a Go-based architecture with multi-provider intelligent dispatch and a security-first design. &lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;v0.16.1 -&amp;gt; v0.17.0&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Introduced a full REST API layer with SSE support and tool invocation endpoints, added a TUI dashboard for session and log browsing, and migrated credential storage from the OS keychain to the Agenvoy API.&lt;/p&gt;

&lt;p&gt;翻譯&lt;br&gt;
新增完整 REST API 層（含 SSE 支援與工具呼叫端點）、TUI 儀表板供 session 與日誌瀏覽，並將憑證儲存從系統金鑰鏈遷移至 Agenvoy API。&lt;/p&gt;

&lt;h2&gt;
  
  
  Changes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  FEAT
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Add REST API server with &lt;code&gt;/v1/send&lt;/code&gt; (SSE + non-SSE), &lt;code&gt;/v1/key&lt;/code&gt;, &lt;code&gt;/v1/tools&lt;/code&gt;, &lt;code&gt;/v1/tool/:name&lt;/code&gt; endpoints&lt;/li&gt;
&lt;li&gt;Add TUI layer with file browser, content viewer, session formatter, and log panel&lt;/li&gt;
&lt;li&gt;Integrate Discord bot and REST API into unified &lt;code&gt;cmd/app&lt;/code&gt; entrypoint&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;翻譯&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;新增 REST API 伺服器，包含 &lt;code&gt;/v1/send&lt;/code&gt;（SSE 與非 SSE）、&lt;code&gt;/v1/key&lt;/code&gt;、&lt;code&gt;/v1/tools&lt;/code&gt;、&lt;code&gt;/v1/tool/:name&lt;/code&gt; 端點&lt;/li&gt;
&lt;li&gt;新增 TUI 層，提供檔案瀏覽器、內容檢視器、session 格式化器與日誌面板&lt;/li&gt;
&lt;li&gt;將 Discord bot 與 REST API 整合進統一的 &lt;code&gt;cmd/app&lt;/code&gt; 入口&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  REFACTOR
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Replace OS keyring with Agenvoy REST API for credential storage&lt;/li&gt;
&lt;li&gt;Rename &lt;code&gt;browser&lt;/code&gt; package to &lt;code&gt;fetchPage&lt;/code&gt; and centralize tool path resolution via &lt;code&gt;ToolFetchPage&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;翻譯&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;將憑證儲存從 OS keyring 改為透過 Agenvoy REST API 管理&lt;/li&gt;
&lt;li&gt;將 &lt;code&gt;browser&lt;/code&gt; 套件重新命名為 &lt;code&gt;fetchPage&lt;/code&gt;，並集中透過 &lt;code&gt;ToolFetchPage&lt;/code&gt; 解析工具路徑&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  SECURITY
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Migrate Copilot token storage from filesystem to system keychain&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;翻譯&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;將 Copilot token 儲存從檔案系統遷移至系統金鑰鏈&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  FIX
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Replace &lt;code&gt;MustClose&lt;/code&gt; with &lt;code&gt;Close&lt;/code&gt; in browser tool and fix &lt;code&gt;realPath&lt;/code&gt; for non-existent directories&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;翻譯&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;修正瀏覽器工具中 &lt;code&gt;MustClose&lt;/code&gt; 改用 &lt;code&gt;Close&lt;/code&gt;，並修正 &lt;code&gt;realPath&lt;/code&gt; 對不存在目錄的處理&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  UPDATE
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Reduce &lt;code&gt;search_web&lt;/code&gt; and &lt;code&gt;google_rss&lt;/code&gt; cache TTL to 5 minutes&lt;/li&gt;
&lt;li&gt;Correct Copilot API token limits to match CAPI &lt;code&gt;max_prompt&lt;/code&gt;/&lt;code&gt;max_output&lt;/code&gt; values&lt;/li&gt;
&lt;li&gt;Translate all system prompts to English and add Chrome detection for browser tool&lt;/li&gt;
&lt;li&gt;Update &lt;code&gt;schedule-task&lt;/code&gt; and &lt;code&gt;script-tool-creator&lt;/code&gt; skills to use Agenvoy API instead of direct external calls&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;翻譯&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;縮短 &lt;code&gt;search_web&lt;/code&gt; 與 &lt;code&gt;google_rss&lt;/code&gt; 快取 TTL 至 5 分鐘&lt;/li&gt;
&lt;li&gt;修正 Copilot API token 限制以符合 CAPI &lt;code&gt;max_prompt&lt;/code&gt;/&lt;code&gt;max_output&lt;/code&gt; 實際值&lt;/li&gt;
&lt;li&gt;將所有系統提示翻譯為英文，並新增瀏覽器工具的 Chrome 偵測&lt;/li&gt;
&lt;li&gt;更新 &lt;code&gt;schedule-task&lt;/code&gt; 與 &lt;code&gt;script-tool-creator&lt;/code&gt; 技能，改用 Agenvoy API 取代直接外部呼叫&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Files Changed
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;th&gt;Tag&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/routes/handler/send.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Added&lt;/td&gt;
&lt;td&gt;FEAT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/routes/handler/sendSSE.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Added&lt;/td&gt;
&lt;td&gt;FEAT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/routes/handler/sendResult.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Added&lt;/td&gt;
&lt;td&gt;FEAT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/routes/handler/key.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Added&lt;/td&gt;
&lt;td&gt;FEAT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/routes/handler/tools.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Added&lt;/td&gt;
&lt;td&gt;FEAT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/routes/new.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;FEAT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cmd/app/main.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Added&lt;/td&gt;
&lt;td&gt;FEAT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/tui/new.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Added&lt;/td&gt;
&lt;td&gt;FEAT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/tui/fetchMeta.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Added&lt;/td&gt;
&lt;td&gt;FEAT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/tui/fileMonitor.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Added&lt;/td&gt;
&lt;td&gt;FEAT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/tui/globalShortcut.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Added&lt;/td&gt;
&lt;td&gt;FEAT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/tui/loadDir.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Added&lt;/td&gt;
&lt;td&gt;FEAT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/tui/readPath.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Added&lt;/td&gt;
&lt;td&gt;FEAT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/tui/selectFile.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Added&lt;/td&gt;
&lt;td&gt;FEAT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/tui/setDefault.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Added&lt;/td&gt;
&lt;td&gt;FEAT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/tui/format/error.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Added&lt;/td&gt;
&lt;td&gt;FEAT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/tui/format/history.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Added&lt;/td&gt;
&lt;td&gt;FEAT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/tui/format/summary.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Added&lt;/td&gt;
&lt;td&gt;FEAT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/tui/format/toolCall.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Added&lt;/td&gt;
&lt;td&gt;FEAT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/tools/{browser =&amp;gt; fetchPage}/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Renamed&lt;/td&gt;
&lt;td&gt;REFACTOR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/agents/provider/copilot/login.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;SECURITY&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/agents/provider/copilot/new.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;REFACTOR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/tools/external/searchWeb/SearchWeb.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;UPDATE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/tools/external/googleRSS/fetch.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;UPDATE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;configs/prompts/system_prompt.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;UPDATE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;extensions/skills/schedule-task/SKILL.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;UPDATE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;extensions/skills/script-tool-creator/SKILL.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;UPDATE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;configs/jsons/providors/copilot.json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;UPDATE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/filesystem/absPath.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;FIX&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;README.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;DOC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;doc/README.zh.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;DOC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;go.mod&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;CHORE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;go.sum&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;CHORE&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;©️ 2026 &lt;a href="https://linkedin.com/in/pardnchiu" rel="noopener noreferrer"&gt;邱敬幃 Pardn Chiu&lt;/a&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>ai</category>
      <category>openclaw</category>
      <category>pardnchiu</category>
    </item>
    <item>
      <title>Agenvoy@v0.16.0: Introduced script tool as a first-class tool subsystem</title>
      <dc:creator>邱敬幃 Pardn Chiu</dc:creator>
      <pubDate>Tue, 24 Mar 2026 16:47:10 +0000</pubDate>
      <link>https://dev.to/pardnchiu/agenvoyv0160-introduced-script-tool-as-a-first-class-tool-subsystem-gdo</link>
      <guid>https://dev.to/pardnchiu/agenvoyv0160-introduced-script-tool-as-a-first-class-tool-subsystem-gdo</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/pardnchiu/Agenvoy/releases/tag/v0.16.0" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub-cover.pardn.workers.dev%2Fpardnchiu%2Fagenvoy" alt="cover" width="1280" height="640"&gt;&lt;/a&gt;&lt;br&gt;
repo: &lt;a href="https://github.com/pardnchiu/Agenvoy" rel="noopener noreferrer"&gt;pardnchiu/Agenvoy&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Agenvoy is inspired by OpenClaw, built on a Go-based architecture with multi-provider intelligent dispatch and a security-first design. &lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;v0.15.2 -&amp;gt; v0.16.0&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Introduced script tool as a first-class tool subsystem, allowing agents to discover and execute local JavaScript and Python scripts via a stdin/stdout JSON protocol — mirroring the existing API tool architecture. Also refactored internal package structure and fixed Discord file upload reliability.&lt;/p&gt;

&lt;p&gt;翻譯&lt;br&gt;
新增 script tool 子系統，讓 agent 可自動發現並執行本地 JavaScript 與 Python 腳本（stdin/stdout JSON 協定），架構與現有 API tool 對稱。同時重構內部套件結構，並修正 Discord 上傳問題。&lt;/p&gt;

&lt;h2&gt;
  
  
  Changes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  FEAT
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Script Tool Runtime&lt;/strong&gt; — Add &lt;code&gt;internal/scriptAdapter&lt;/code&gt; package mirroring &lt;code&gt;internal/apiAdapter&lt;/code&gt;. On startup, the executor scans &lt;code&gt;~/.config/agenvoy/script_tools/&lt;/code&gt; and &lt;code&gt;&amp;lt;workdir&amp;gt;/.config/agenvoy/script_tools/&lt;/code&gt; for subdirectories containing a &lt;code&gt;tool.json&lt;/code&gt; manifest (name, description, parameters schema) and an executable &lt;code&gt;script.js&lt;/code&gt; or &lt;code&gt;script.py&lt;/code&gt;. Discovered tools are registered as first-class agent tools with the &lt;code&gt;script_&lt;/code&gt; prefix and dispatched via stdin/stdout JSON, identical to the API tool contract.&lt;/li&gt;
&lt;li&gt;Add git tools for skill management (&lt;code&gt;skill_git_commit&lt;/code&gt;, &lt;code&gt;skill_git_log&lt;/code&gt;, &lt;code&gt;skill_git_rollback&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Add Copilot token auto-relogin on 401 during token refresh&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;翻譯&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Script Tool 執行環境&lt;/strong&gt; — 新增 &lt;code&gt;internal/scriptAdapter&lt;/code&gt;，架構與 &lt;code&gt;internal/apiAdapter&lt;/code&gt; 對稱。啟動時掃描 &lt;code&gt;~/.config/agenvoy/script_tools/&lt;/code&gt; 與 &lt;code&gt;/.config/agenvoy/script_tools/&lt;/code&gt;，自動載入包含 &lt;code&gt;tool.json&lt;/code&gt;（name、description、parameters）與 &lt;code&gt;script.js&lt;/code&gt;/&lt;code&gt;script.py&lt;/code&gt; 的子目錄。已發現的工具以 &lt;code&gt;script_&lt;/code&gt; 前綴註冊為一等工具，透過 stdin/stdout JSON 協定執行，與 API tool 完全一致。&lt;/li&gt;
&lt;li&gt;新增 skill 管理用 git 工具（commit、log、rollback）&lt;/li&gt;
&lt;li&gt;新增 Copilot token 401 時自動重新登入&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  FIX
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Fix Discord file upload failure caused by non-ASCII filenames (Japanese, special chars) in multipart upload&lt;/li&gt;
&lt;li&gt;Fix system message ordering and multi-system-prompt merging for Nvidia provider&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;翻譯&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;修正 Discord 上傳含日文等非 ASCII 字元檔名時 multipart 上傳失敗的問題&lt;/li&gt;
&lt;li&gt;修正 Nvidia provider 的 system message 排序與多 prompt 合併邏輯&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  UPDATE
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Add file size validation (10MB limit) before Discord upload with user-facing warning&lt;/li&gt;
&lt;li&gt;Update default download path to prefer &lt;code&gt;~/Downloads&lt;/code&gt; over &lt;code&gt;~/.config/agenvoy/download&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;翻譯&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;新增 Discord 上傳前檔案大小驗證（10MB 限制），超限時向用戶回報警告&lt;/li&gt;
&lt;li&gt;預設下載路徑改為優先使用 &lt;code&gt;~/Downloads&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  REFACTOR
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Rename &lt;code&gt;internal/tools/apis/adapter&lt;/code&gt; → &lt;code&gt;internal/apiAdapter&lt;/code&gt; and &lt;code&gt;internal/tools/apis&lt;/code&gt; → &lt;code&gt;internal/tools/api&lt;/code&gt; for consistent naming alongside the new &lt;code&gt;scriptAdapter&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;翻譯&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;重命名 &lt;code&gt;internal/tools/apis/adapter&lt;/code&gt; → &lt;code&gt;internal/apiAdapter&lt;/code&gt;，&lt;code&gt;internal/tools/apis&lt;/code&gt; → &lt;code&gt;internal/tools/api&lt;/code&gt;，與新增的 &lt;code&gt;scriptAdapter&lt;/code&gt; 形成對稱命名&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ADD
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Add &lt;code&gt;script-tool-creator&lt;/code&gt; skill with Python initializer to scaffold new script tools&lt;/li&gt;
&lt;li&gt;Add yt-dlp downloader and info query as example script tools&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;翻譯&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;新增 &lt;code&gt;script-tool-creator&lt;/code&gt; skill 及 Python 腳手架腳本，快速建立新 script tool&lt;/li&gt;
&lt;li&gt;新增 yt-dlp 下載與資訊查詢作為 script tool 使用範例&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Files Changed
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;th&gt;Tag&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/scriptAdapter/ececute.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Added&lt;/td&gt;
&lt;td&gt;FEAT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/scriptAdapter/translator.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Added&lt;/td&gt;
&lt;td&gt;FEAT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/tools/executor.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;FEAT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/tools/types/executor.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;FEAT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/tools/git/skillCommit.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Added&lt;/td&gt;
&lt;td&gt;FEAT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/tools/git/skillLog.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Added&lt;/td&gt;
&lt;td&gt;FEAT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/tools/git/skillRollback.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Added&lt;/td&gt;
&lt;td&gt;FEAT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/tools/git/register.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Added&lt;/td&gt;
&lt;td&gt;FEAT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/agents/provider/copilot/refresh.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;FEAT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/discord/reply.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;FIX&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/agents/provider/nvidia/send.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;FIX&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/filesystem/filesystem.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;UPDATE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/tools/browser/download.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;UPDATE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/tools/browser/register.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;UPDATE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/tools/file/writeFile.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;UPDATE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;internal/apiAdapter/&lt;/code&gt; (from &lt;code&gt;tools/apis/adapter&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Renamed&lt;/td&gt;
&lt;td&gt;REFACTOR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;internal/tools/api/&lt;/code&gt; (from &lt;code&gt;tools/apis&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Renamed&lt;/td&gt;
&lt;td&gt;REFACTOR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/tools/register.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;REFACTOR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;extensions/skills/script-tool-creator/SKILL.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Added&lt;/td&gt;
&lt;td&gt;ADD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;extensions/skills/script-tool-creator/scripts/init_script_tool.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Added&lt;/td&gt;
&lt;td&gt;ADD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;extensions/scripts/example-yt-dlp-downloader/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Added&lt;/td&gt;
&lt;td&gt;ADD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;extensions/scripts/example-yt-dlp-info/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Added&lt;/td&gt;
&lt;td&gt;ADD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/filesystem/git.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Added&lt;/td&gt;
&lt;td&gt;FEAT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;configs/prompts/system_prompt.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;UPDATE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;go.mod&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;CHORE&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;©️ 2026 &lt;a href="https://linkedin.com/in/pardnchiu" rel="noopener noreferrer"&gt;邱敬幃 Pardn Chiu&lt;/a&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>ai</category>
      <category>openclaw</category>
      <category>pardnchiu</category>
    </item>
    <item>
      <title>Agenvoy@v0.15.0: Add Copilot Responses API endpoint support and token-budget message trimming</title>
      <dc:creator>邱敬幃 Pardn Chiu</dc:creator>
      <pubDate>Tue, 24 Mar 2026 16:45:09 +0000</pubDate>
      <link>https://dev.to/pardnchiu/agenvoyv0150-add-copilot-responses-api-endpoint-support-and-token-budget-message-trimming-5dca</link>
      <guid>https://dev.to/pardnchiu/agenvoyv0150-add-copilot-responses-api-endpoint-support-and-token-budget-message-trimming-5dca</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/pardnchiu/Agenvoy/releases/tag/v0.15.0" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub-cover.pardn.workers.dev%2Fpardnchiu%2Fagenvoy" alt="cover" width="1280" height="640"&gt;&lt;/a&gt;&lt;br&gt;
repo: &lt;a href="https://github.com/pardnchiu/Agenvoy" rel="noopener noreferrer"&gt;pardnchiu/Agenvoy&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Agenvoy is inspired by OpenClaw, built on a Go-based architecture with multi-provider intelligent dispatch and a security-first design. &lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;v0.14.2 -&amp;gt; v0.15.0&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Add Copilot Responses API endpoint support and token-budget message trimming, harden sandbox with sensitive path denial rules, and make history message limits configurable.&lt;/p&gt;

&lt;p&gt;翻譯&lt;br&gt;
新增 Copilot Responses API endpoint 支援與 token-budget 訊息裁剪機制，強化 sandbox 敏感路徑存取拒絕規則，並支援歷史訊息上限環境變數設定。&lt;/p&gt;

&lt;h2&gt;
  
  
  Changes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  FEAT
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Add Copilot Responses Endpoint support for GPT-5.4 and Codex models with dedicated response parsing&lt;/li&gt;
&lt;li&gt;Add token-budget message trimming at session level to prevent input token overflow before agent execution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;翻譯&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;新增 Copilot Responses Endpoint 支援 GPT-5.4 與 Codex 模型，含專用回應解析&lt;/li&gt;
&lt;li&gt;新增 session 層級 token-budget 訊息裁剪，避免 agent 執行前超出輸入 token 上限&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  UPDATE
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Make max history messages configurable via &lt;code&gt;MAX_HISTORY_MESSAGES&lt;/code&gt; environment variable (default: 16)&lt;/li&gt;
&lt;li&gt;Switch summary delimiter from HTML comments to XML tags and update trailing JSON regex to match &lt;code&gt;xml&lt;/code&gt; format&lt;/li&gt;
&lt;li&gt;Exclude lite models (flash-lite, nano, haiku) from agent selection to ensure stable structured output&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;翻譯&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;支援透過 &lt;code&gt;MAX_HISTORY_MESSAGES&lt;/code&gt; 環境變數設定歷史訊息上限（預設：16）&lt;/li&gt;
&lt;li&gt;將 summary 分隔符從 HTML comment 改為 XML tag，並更新 trailing JSON regex 支援 &lt;code&gt;xml&lt;/code&gt; 格式&lt;/li&gt;
&lt;li&gt;排除輕量模型（flash-lite、nano、haiku）於 agent 選擇，確保結構化輸出穩定性&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  SECURITY
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Add sensitive path denial rules to macOS sandbox-exec and Linux bwrap with configurable denied paths from embedded JSON config&lt;/li&gt;
&lt;li&gt;Restore &lt;code&gt;--unshare-all&lt;/code&gt; namespace isolation with graceful fallback probe on Linux&lt;/li&gt;
&lt;li&gt;Add &lt;code&gt;--new-session&lt;/code&gt; flag to bwrap for additional process isolation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;翻譯&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;新增 macOS sandbox-exec 與 Linux bwrap 敏感路徑存取拒絕規則，支援從嵌入式 JSON 設定檔載入&lt;/li&gt;
&lt;li&gt;恢復 &lt;code&gt;--unshare-all&lt;/code&gt; namespace 隔離並加入 graceful fallback 探測機制（Linux）&lt;/li&gt;
&lt;li&gt;新增 bwrap &lt;code&gt;--new-session&lt;/code&gt; 旗標以強化 process 隔離&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  PERF
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Add &lt;code&gt;MaxInputTokens()&lt;/code&gt; method to all provider agents for accurate per-model token budget calculation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;翻譯&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;為所有 provider agent 新增 &lt;code&gt;MaxInputTokens()&lt;/code&gt; 方法，實現精確的 per-model token budget 計算&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Files Changed
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;th&gt;Tag&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;configs/jsons/providors/copilot.json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;FEAT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/agents/provider/copilot/response/responses.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Added&lt;/td&gt;
&lt;td&gt;FEAT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/agents/provider/copilot/send.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;FEAT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/agents/exec/trimMessages.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Added&lt;/td&gt;
&lt;td&gt;FEAT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/agents/exec/execute.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;FEAT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/agents/types/agent.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;FEAT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.env.example&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;UPDATE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/filesystem/sessionManager/session.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;UPDATE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/agents/exec/getSession.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;UPDATE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cmd/cli/main.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;UPDATE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;configs/prompts/system_prompt.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;UPDATE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/agents/exec/extractSummary.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;UPDATE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;configs/prompts/agent_selector.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;UPDATE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/sandbox/darwin.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;SECURITY&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/sandbox/linux.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;SECURITY&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/sandbox/sandbox.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;SECURITY&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/agents/provider/claude/new.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;PERF&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/agents/provider/compat/new.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;PERF&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/agents/provider/copilot/new.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;PERF&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/agents/provider/gemini/new.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;PERF&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/agents/provider/nvidia/new.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;PERF&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;internal/agents/provider/openai/new.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;PERF&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;©️ 2026 &lt;a href="https://linkedin.com/in/pardnchiu" rel="noopener noreferrer"&gt;邱敬幃 Pardn Chiu&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>go</category>
      <category>openclaw</category>
      <category>pardnchiu</category>
    </item>
    <item>
      <title>Agenvoy@v0.14.0: Add OS-native sandbox isolation with automatic bubblewrap installation on Linux</title>
      <dc:creator>邱敬幃 Pardn Chiu</dc:creator>
      <pubDate>Wed, 18 Mar 2026 07:28:07 +0000</pubDate>
      <link>https://dev.to/pardnchiu/agenvoyv0140-add-os-native-sandbox-isolation-with-automatic-bubblewrap-installation-on-linux-56nj</link>
      <guid>https://dev.to/pardnchiu/agenvoyv0140-add-os-native-sandbox-isolation-with-automatic-bubblewrap-installation-on-linux-56nj</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/pardnchiu/Agenvoy/releases/tag/v0.14.0" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub-cover.pardn.workers.dev%2Fpardnchiu%2Fagenvoy" alt="cover" width="1280" height="640"&gt;&lt;/a&gt;&lt;br&gt;
repo: &lt;a href="https://github.com/pardnchiu/Agenvoy" rel="noopener noreferrer"&gt;pardnchiu/Agenvoy&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Agenvoy is inspired by OpenClaw, built on a Go-based architecture with multi-provider intelligent dispatch and a security-first design. &lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;v0.13.0 -&amp;gt; v0.14.0&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Add OS-native sandbox isolation with automatic bubblewrap installation on Linux, per-request token usage tracking across all providers, and restructure tool handlers into individually named files.&lt;/p&gt;

&lt;h2&gt;
  
  
  Changes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  FEAT
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Add sandbox package with OS-native isolation: bubblewrap on Linux, sandbox-exec on macOS&lt;/li&gt;
&lt;li&gt;Add automatic bubblewrap dependency detection and installation via system package manager on Linux&lt;/li&gt;
&lt;li&gt;Add sandbox dependency check at startup in both CLI and Discord server entry points&lt;/li&gt;
&lt;li&gt;Wrap all tool command execution and scheduler scripts through sandbox gate&lt;/li&gt;
&lt;li&gt;Add per-request token usage accumulation across all tool-call iterations within a session&lt;/li&gt;
&lt;li&gt;Display total token consumption (model + in/out) in CLI output and Discord reply footers&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  REFACTOR
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Extract tool handlers into individually named files: glob.go → globFiles.go, list.go → listFiles.go, patch.go → patchEdit.go, search.go → searchContent.go&lt;/li&gt;
&lt;li&gt;Remove monolithic routes.go; each handler self-registers via init-style pattern&lt;/li&gt;
&lt;li&gt;Move exclude logic and file walk/list functions from tools into filesystem package&lt;/li&gt;
&lt;li&gt;Simplify ReadFile/WriteFile by removing redundant dir parameter&lt;/li&gt;
&lt;li&gt;Rename Executor field WorkPath → WorkDir for consistency&lt;/li&gt;
&lt;li&gt;Resolve symlinks in GetAbsPath with fallback to parent resolution for new files&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;©️ 2026 &lt;a href="https://linkedin.com/in/pardnchiu" rel="noopener noreferrer"&gt;邱敬幃 Pardn Chiu&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>go</category>
      <category>openclaw</category>
      <category>pardnchiu</category>
    </item>
    <item>
      <title>Everyone’s raising their AI lobster. Not everyone has a server to run it on.</title>
      <dc:creator>邱敬幃 Pardn Chiu</dc:creator>
      <pubDate>Mon, 16 Mar 2026 18:41:47 +0000</pubDate>
      <link>https://dev.to/pardnchiu/everyones-raising-their-ai-lobster-not-everyone-has-a-server-to-run-it-on-n9d</link>
      <guid>https://dev.to/pardnchiu/everyones-raising-their-ai-lobster-not-everyone-has-a-server-to-run-it-on-n9d</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/pardnchiu/Agenvoy/releases/tag/v0.14.0" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub-cover.pardn.workers.dev%2Fpardnchiu%2Fagenvoy" alt="cover" width="1280" height="640"&gt;&lt;/a&gt;&lt;br&gt;
repo: &lt;a href="https://github.com/pardnchiu/Agenvoy" rel="noopener noreferrer"&gt;pardnchiu/Agenvoy&lt;/a&gt;&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;v0.13.0 -&amp;gt; v0.14.0&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Add OS-native sandbox isolation with automatic bubblewrap installation on Linux, per-request token usage tracking across all providers, and restructure tool handlers into individually named files.&lt;/p&gt;

&lt;h2&gt;
  
  
  Changes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  FEAT
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Add sandbox package with OS-native isolation: bubblewrap on Linux, sandbox-exec on macOS&lt;/li&gt;
&lt;li&gt;Add automatic bubblewrap dependency detection and installation via system package manager on Linux&lt;/li&gt;
&lt;li&gt;Add sandbox dependency check at startup in both CLI and Discord server entry points&lt;/li&gt;
&lt;li&gt;Wrap all tool command execution and scheduler scripts through sandbox gate&lt;/li&gt;
&lt;li&gt;Add per-request token usage accumulation across all tool-call iterations within a session&lt;/li&gt;
&lt;li&gt;Display total token consumption (model + in/out) in CLI output and Discord reply footers&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  REFACTOR
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Extract tool handlers into individually named files: glob.go → globFiles.go, list.go → listFiles.go, patch.go → patchEdit.go, search.go → searchContent.go&lt;/li&gt;
&lt;li&gt;Remove monolithic routes.go; each handler self-registers via init-style pattern&lt;/li&gt;
&lt;li&gt;Move exclude logic and file walk/list functions from tools into filesystem package&lt;/li&gt;
&lt;li&gt;Simplify ReadFile/WriteFile by removing redundant dir parameter&lt;/li&gt;
&lt;li&gt;Rename Executor field WorkPath → WorkDir for consistency&lt;/li&gt;
&lt;li&gt;Resolve symlinks in GetAbsPath with fallback to parent resolution for new files&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;©️ 2026 &lt;a href="https://linkedin.com/in/pardnchiu" rel="noopener noreferrer"&gt;邱敬幃 Pardn Chiu&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>go</category>
      <category>openclaw</category>
      <category>pardnchiu</category>
    </item>
    <item>
      <title>GO-SQLite@v0.3.0: SQLite client with chained method calls</title>
      <dc:creator>邱敬幃 Pardn Chiu</dc:creator>
      <pubDate>Wed, 28 Jan 2026 11:11:34 +0000</pubDate>
      <link>https://dev.to/pardnchiu/go-sqlitev030-sqlite-client-with-chained-method-calls-388f</link>
      <guid>https://dev.to/pardnchiu/go-sqlitev030-sqlite-client-with-chained-method-calls-388f</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/pardnchiu/go-sqlite" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub-cover.pardn.workers.dev%2Fpardnchiu%2Fgo-sqlite" alt="cover" width="1280" height="640"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;v0.2.0 -&amp;gt; v0.3.0&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Added Delete method and refactored API to use chainable Context pattern, unifying Insert/Update return values for consistency.&lt;/p&gt;

&lt;h2&gt;
  
  
  Changes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  FEAT
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Add &lt;code&gt;Delete(force ...bool)&lt;/code&gt; method for row deletion with optional force flag for unprotected deletes&lt;/li&gt;
&lt;li&gt;Add &lt;code&gt;Context(ctx context.Context)&lt;/code&gt; chainable method for context propagation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  REFACTOR
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Unify &lt;code&gt;Insert()&lt;/code&gt; to return &lt;code&gt;(int64, error)&lt;/code&gt; with LastInsertId instead of just error&lt;/li&gt;
&lt;li&gt;Unify &lt;code&gt;Update()&lt;/code&gt; to return &lt;code&gt;(int64, error)&lt;/code&gt; with RowsAffected instead of &lt;code&gt;(sql.Result, error)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Extract SQL building logic into independent methods: &lt;code&gt;buildJoin()&lt;/code&gt;, &lt;code&gt;buildOrderBy()&lt;/code&gt;, &lt;code&gt;buildLimit()&lt;/code&gt;, &lt;code&gt;buildOffset()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Add &lt;code&gt;ExecAutoAsignContext()&lt;/code&gt; helper to automatically use context when available&lt;/li&gt;
&lt;li&gt;Move &lt;code&gt;Where()&lt;/code&gt; and &lt;code&gt;OrWhere()&lt;/code&gt; to dedicated files for better organization&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  UPDATE
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Mark legacy Context methods as deprecated: &lt;code&gt;InsertContext()&lt;/code&gt;, &lt;code&gt;InsertReturningID()&lt;/code&gt;, &lt;code&gt;InsertContextReturningID()&lt;/code&gt;, &lt;code&gt;InsertConflict()&lt;/code&gt;, &lt;code&gt;InsertContexConflict()&lt;/code&gt;, &lt;code&gt;InsertConflictReturningID()&lt;/code&gt;, &lt;code&gt;InsertContextConflictReturningID()&lt;/code&gt;, &lt;code&gt;GetContext()&lt;/code&gt;, &lt;code&gt;GetWithTotal()&lt;/code&gt;, &lt;code&gt;GetWithTotalContext()&lt;/code&gt;, &lt;code&gt;FirstContext()&lt;/code&gt;, &lt;code&gt;CountContext()&lt;/code&gt;, &lt;code&gt;UpdateContext()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Remove deprecated &lt;code&gt;insertBuilderConflict()&lt;/code&gt; internal function&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Files Changed
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;th&gt;Tag&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;builder.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;FEAT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;insert.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;REFACTOR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;select.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;REFACTOR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;select_ext.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;REFACTOR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;select_where.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;REFACTOR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;select_or_where.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;REFACTOR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;update.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;REFACTOR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;main_test.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;TEST&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;README.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;DOC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;README.zh.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;DOC&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;©️ 2026 &lt;a href="https://pardn.io" rel="noopener noreferrer"&gt;邱敬幃 Pardn Chiu&lt;/a&gt;&lt;/p&gt;

</description>
      <category>backend</category>
      <category>go</category>
      <category>pardnchiu</category>
    </item>
    <item>
      <title>GO-SQLite@v0.2.0: SQLite client with chained method calls</title>
      <dc:creator>邱敬幃 Pardn Chiu</dc:creator>
      <pubDate>Tue, 27 Jan 2026 19:26:17 +0000</pubDate>
      <link>https://dev.to/pardnchiu/go-sqlitev020-sqlite-client-with-chained-method-calls-4ipn</link>
      <guid>https://dev.to/pardnchiu/go-sqlitev020-sqlite-client-with-chained-method-calls-4ipn</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/pardnchiu/go-sqlite" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub-cover.pardn.workers.dev%2Fpardnchiu%2Fgo-sqlite" alt="cover" width="1280" height="640"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;v0.1.0 -&amp;gt; v0.2.0&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Major refactoring of the database connector with singleton pattern using &lt;code&gt;sync.Once&lt;/code&gt;, enhanced SQL validation with reserved keyword checking, and new chainable APIs for conflict handling and total count queries.&lt;/p&gt;

&lt;h2&gt;
  
  
  Changes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  FEAT
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Add &lt;code&gt;GetWithTotal()&lt;/code&gt; and &lt;code&gt;GetWithTotalContext()&lt;/code&gt; methods for paginated queries with total count&lt;/li&gt;
&lt;li&gt;Add &lt;code&gt;Builder.Raw()&lt;/code&gt; method to access underlying &lt;code&gt;*sql.DB&lt;/code&gt; instance&lt;/li&gt;
&lt;li&gt;Add &lt;code&gt;Builder.Conflict()&lt;/code&gt; chainable method for insert conflict handling strategy&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  REFACTOR
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Rename &lt;code&gt;Database&lt;/code&gt; struct to &lt;code&gt;Connector&lt;/code&gt; with singleton initialization via &lt;code&gt;sync.Once&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Simplify &lt;code&gt;New()&lt;/code&gt; return signature from &lt;code&gt;(*Database, *sql.DB, error)&lt;/code&gt; to &lt;code&gt;(*Connector, error)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Refactor &lt;code&gt;OrderBy&lt;/code&gt; direction parameter to typed constant (&lt;code&gt;Asc&lt;/code&gt;/&lt;code&gt;Desc&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Enhance column validation with length limit (128 chars) and SQL reserved keyword checking via embedded JSON&lt;/li&gt;
&lt;li&gt;Adjust connection pool settings: &lt;code&gt;MaxOpenConns=8&lt;/code&gt;, &lt;code&gt;MaxIdleConns=2&lt;/code&gt;, enable WAL mode&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  UPDATE
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Change &lt;code&gt;Update()&lt;/code&gt; / &lt;code&gt;UpdateContext()&lt;/code&gt; parameter to variadic &lt;code&gt;map[string]any&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Mark legacy conflict methods (&lt;code&gt;InsertConflict&lt;/code&gt;, &lt;code&gt;InsertContexConflict&lt;/code&gt;, &lt;code&gt;InsertConflictReturningID&lt;/code&gt;, &lt;code&gt;InsertContextConflictReturningID&lt;/code&gt;) as deprecated for v1.0.0&lt;/li&gt;
&lt;li&gt;Mark &lt;code&gt;Total()&lt;/code&gt; method as deprecated in favor of &lt;code&gt;GetWithTotal()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Files Changed
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;th&gt;Tag&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;instance.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;REFACTOR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;builder.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;FEAT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;select.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;FEAT, REFACTOR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;insert.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;FEAT, UPDATE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;update.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;UPDATE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;utils.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;REFACTOR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sql_keywords.json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Added&lt;/td&gt;
&lt;td&gt;REFACTOR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;main_test.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;REFACTOR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;README.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;DOC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;README.zh.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Added&lt;/td&gt;
&lt;td&gt;DOC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;LICENSE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Added&lt;/td&gt;
&lt;td&gt;DOC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cover.png&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Added&lt;/td&gt;
&lt;td&gt;DOC&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;©️ 2026 &lt;a href="https://pardn.io" rel="noopener noreferrer"&gt;邱敬幃 Pardn Chiu&lt;/a&gt;&lt;/p&gt;

</description>
      <category>backend</category>
      <category>go</category>
      <category>pardnchiu</category>
    </item>
    <item>
      <title>GO-SQLite@v0.1.0: SQLite client with chained method calls</title>
      <dc:creator>邱敬幃 Pardn Chiu</dc:creator>
      <pubDate>Tue, 27 Jan 2026 14:57:39 +0000</pubDate>
      <link>https://dev.to/pardnchiu/go-sqlitev010-1opj</link>
      <guid>https://dev.to/pardnchiu/go-sqlitev010-1opj</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/pardnchiu/go-sqlite" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub-cover.pardn.workers.dev%2Fpardnchiu%2Fgo-sqlite" alt="cover" width="1280" height="640"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;v0.0.0 -&amp;gt; v0.1.0&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Initial release of go-sqlite, a lightweight SQLite ORM built on sqlite3 driver and database/sql, featuring connection pool management, schema builder, and a fluent query builder API consistent with go-mysql.&lt;/p&gt;

&lt;h2&gt;
  
  
  Changes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  FEAT
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Add connection pool management with configurable lifetime and automatic key derivation from path&lt;/li&gt;
&lt;li&gt;Add Schema Builder with &lt;code&gt;Create()&lt;/code&gt; method supporting columns, primary keys, auto-increment, unique constraints, defaults, and foreign keys&lt;/li&gt;
&lt;li&gt;Add Insert methods: &lt;code&gt;Insert()&lt;/code&gt;, &lt;code&gt;InsertContext()&lt;/code&gt;, &lt;code&gt;InsertReturningID()&lt;/code&gt;, &lt;code&gt;InsertContextReturningID()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Add conflict handling strategies: &lt;code&gt;InsertConflict()&lt;/code&gt; with IGNORE/REPLACE/ABORT/FAIL/ROLLBACK modes&lt;/li&gt;
&lt;li&gt;Add &lt;code&gt;ON CONFLICT DO UPDATE&lt;/code&gt; support for upsert operations&lt;/li&gt;
&lt;li&gt;Add Select query builder: &lt;code&gt;Select()&lt;/code&gt;, &lt;code&gt;Where()&lt;/code&gt;, &lt;code&gt;OrWhere()&lt;/code&gt;, &lt;code&gt;Join()&lt;/code&gt;, &lt;code&gt;LeftJoin()&lt;/code&gt;, &lt;code&gt;OrderBy()&lt;/code&gt;, &lt;code&gt;Limit()&lt;/code&gt;, &lt;code&gt;Offset()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Add query execution methods: &lt;code&gt;Get()&lt;/code&gt;, &lt;code&gt;GetContext()&lt;/code&gt; returning &lt;code&gt;*sql.Rows&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Add convenience methods: &lt;code&gt;First()&lt;/code&gt;, &lt;code&gt;FirstContext()&lt;/code&gt;, &lt;code&gt;Count()&lt;/code&gt;, &lt;code&gt;CountContext()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Add &lt;code&gt;Total()&lt;/code&gt; with window function (&lt;code&gt;COUNT(*) OVER()&lt;/code&gt;) for pagination with total count&lt;/li&gt;
&lt;li&gt;Add Update methods: &lt;code&gt;Update()&lt;/code&gt;, &lt;code&gt;UpdateContext()&lt;/code&gt; with map-based data&lt;/li&gt;
&lt;li&gt;Add column modifiers: &lt;code&gt;Increase()&lt;/code&gt;, &lt;code&gt;Decrease()&lt;/code&gt;, &lt;code&gt;Toggle()&lt;/code&gt; for atomic updates&lt;/li&gt;
&lt;li&gt;Add raw query wrappers: &lt;code&gt;Database.Query()&lt;/code&gt;, &lt;code&gt;Database.QueryContext()&lt;/code&gt;, &lt;code&gt;Database.Exec()&lt;/code&gt;, &lt;code&gt;Database.ExecContext()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  REFACTOR
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Split single-file structure into modular components: instance.go, builder.go, insert.go, select.go, select_ext.go, select_where.go, select_or_where.go, update.go, utils.go&lt;/li&gt;
&lt;li&gt;Extract column validation and quoting logic into utils.go with &lt;code&gt;validateColumn()&lt;/code&gt; and &lt;code&gt;quote()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Unify ForeignKey as struct type (&lt;code&gt;Foreign&lt;/code&gt;) for cleaner API&lt;/li&gt;
&lt;li&gt;Add automatic Builder state clearing after query execution via &lt;code&gt;builderClear()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Remove test main function and strengthen nil checks with ping verification on connection&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Files Changed
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;th&gt;Tag&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;instance.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Added&lt;/td&gt;
&lt;td&gt;FEAT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;builder.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Added&lt;/td&gt;
&lt;td&gt;FEAT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;insert.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Added&lt;/td&gt;
&lt;td&gt;FEAT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;select.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Added&lt;/td&gt;
&lt;td&gt;FEAT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;select_ext.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Added&lt;/td&gt;
&lt;td&gt;FEAT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;select_where.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Added&lt;/td&gt;
&lt;td&gt;FEAT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;select_or_where.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Added&lt;/td&gt;
&lt;td&gt;FEAT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;update.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Added&lt;/td&gt;
&lt;td&gt;FEAT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;utils.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Added&lt;/td&gt;
&lt;td&gt;REFACTOR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;main_test.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Added&lt;/td&gt;
&lt;td&gt;TEST&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;README.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Added&lt;/td&gt;
&lt;td&gt;DOC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.gitignore&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified&lt;/td&gt;
&lt;td&gt;CHORE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;main.go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deleted&lt;/td&gt;
&lt;td&gt;REMOVE&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;©️ 2026 &lt;a href="https://pardn.io" rel="noopener noreferrer"&gt;邱敬幃 Pardn Chiu&lt;/a&gt;&lt;/p&gt;

</description>
      <category>backend</category>
      <category>go</category>
      <category>pardnchiu</category>
    </item>
    <item>
      <title>GO-FaaS@v0.4.3: Serverless function runtime</title>
      <dc:creator>邱敬幃 Pardn Chiu</dc:creator>
      <pubDate>Sat, 03 Jan 2026 08:46:56 +0000</pubDate>
      <link>https://dev.to/pardnchiu/go-faasv043-serverless-function-runtime-ffi</link>
      <guid>https://dev.to/pardnchiu/go-faasv043-serverless-function-runtime-ffi</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/pardnchiu/go-faas" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub-cover.pardn.workers.dev%2Fpardnchiu%2Fgo-faas" alt="cover" width="1280" height="640"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Refactored container management module with unified function and variable naming conventions, extracted container startup parameters into standalone function, and increased default CPU limit from 0.25 to 1.0.&lt;/p&gt;

&lt;h2&gt;
  
  
  Changes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  REFACTOR
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Extracted &lt;code&gt;argsForRun&lt;/code&gt; function to unify container startup parameter handling&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  UPDATE
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Increased &lt;code&gt;MAX_CPUS_PER_CONTAINER&lt;/code&gt; default value from 0.25 to 1.0&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;©️ 2025 &lt;a href="https://pardn.io" rel="noopener noreferrer"&gt;邱敬幃 Pardn Chiu&lt;/a&gt;&lt;/p&gt;

</description>
      <category>backend</category>
      <category>go</category>
      <category>pardnchiu</category>
    </item>
    <item>
      <title>GO-FaaS@v0.4.2: Serverless function runtime</title>
      <dc:creator>邱敬幃 Pardn Chiu</dc:creator>
      <pubDate>Sat, 03 Jan 2026 05:46:35 +0000</pubDate>
      <link>https://dev.to/pardnchiu/go-faasv042-serverless-function-runtime-27fj</link>
      <guid>https://dev.to/pardnchiu/go-faasv042-serverless-function-runtime-27fj</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/pardnchiu/go-faas" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub-cover.pardn.workers.dev%2Fpardnchiu%2Fgo-faas" alt="cover" width="1280" height="640"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Add CPU and memory limit configuration for containers, providing finer resource control, and optimize default runtime count calculation logic.&lt;/p&gt;

&lt;h3&gt;
  
  
  FEAT
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Add CPU limit configuration for containers, supporting &lt;code&gt;MAX_CPUS_PER_CONTAINER&lt;/code&gt; environment variable to set CPU quota per runtime (default &lt;code&gt;0.25&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Add memory limit configuration for containers, supporting &lt;code&gt;MAX_MEMORY_PER_CONTAINER&lt;/code&gt; environment variable to set memory limit per runtime (default &lt;code&gt;128MB&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  UPDATE
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Optimize default runtime count calculation from &lt;code&gt;runtime.NumCPU()&lt;/code&gt; to &lt;code&gt;runtime.NumCPU() * 2&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;©️ 2025 &lt;a href="https://pardn.io" rel="noopener noreferrer"&gt;邱敬幃 Pardn Chiu&lt;/a&gt;&lt;/p&gt;

</description>
      <category>backend</category>
      <category>go</category>
      <category>pardnchiu</category>
    </item>
    <item>
      <title>NanoJSON: Firebase-like JSON editor</title>
      <dc:creator>邱敬幃 Pardn Chiu</dc:creator>
      <pubDate>Thu, 01 Jan 2026 08:51:06 +0000</pubDate>
      <link>https://dev.to/pardnchiu/nanojson-firebase-like-json-editor-m27</link>
      <guid>https://dev.to/pardnchiu/nanojson-firebase-like-json-editor-m27</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/pardnchiu/nanojson" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub-cover.pardn.workers.dev%2Fpardnchiu%2Fnanojson" alt="cover" width="1280" height="640"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Core Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  No Third-Party Dependencies
&lt;/h3&gt;

&lt;p&gt;Developed entirely with native DOM APIs, no third-party dependencies, easily embeddable in any web project.&lt;/p&gt;

&lt;h3&gt;
  
  
  Visual JSON Editing Experience
&lt;/h3&gt;

&lt;p&gt;Displays JSON data in a tree structure similar to the Firebase console, supports collapse/expand, dynamic node addition/removal, and provides an intuitive editing interface.&lt;/p&gt;

&lt;h3&gt;
  
  
  Full Type Support
&lt;/h3&gt;

&lt;p&gt;Supports 5 standard JSON data types (&lt;code&gt;string&lt;/code&gt;, &lt;code&gt;number&lt;/code&gt;, &lt;code&gt;boolean&lt;/code&gt;, &lt;code&gt;array&lt;/code&gt;, &lt;code&gt;object&lt;/code&gt;), allows real-time type switching while preserving data integrity.&lt;/p&gt;




&lt;p&gt;©️ 2025 &lt;a href="https://pardn.io" rel="noopener noreferrer"&gt;邱敬幃 Pardn Chiu&lt;/a&gt;&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>javascript</category>
      <category>pardnchiu</category>
    </item>
    <item>
      <title>GO-QUEUE@v1.1.2: Priority-based task queue with automatic timeout promotion</title>
      <dc:creator>邱敬幃 Pardn Chiu</dc:creator>
      <pubDate>Thu, 01 Jan 2026 06:20:25 +0000</pubDate>
      <link>https://dev.to/pardnchiu/go-queuev112-priority-based-task-queue-with-automatic-timeout-promotion-3p38</link>
      <guid>https://dev.to/pardnchiu/go-queuev112-priority-based-task-queue-with-automatic-timeout-promotion-3p38</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/pardnchiu/go-queue" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub-cover.pardn.workers.dev%2Fpardnchiu%2Fgo-queue" alt="cover" width="1280" height="640"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  REFACTOR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;task.go&lt;/strong&gt;: Refactored &lt;code&gt;taskHeap&lt;/code&gt; from a slice type to a struct, added &lt;code&gt;tasks&lt;/code&gt; and &lt;code&gt;minCap&lt;/code&gt; fields to support dynamic minimum capacity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;task.go&lt;/strong&gt;: Updated &lt;code&gt;Len&lt;/code&gt;, &lt;code&gt;Less&lt;/code&gt;, &lt;code&gt;Swap&lt;/code&gt;, &lt;code&gt;Push&lt;/code&gt;, and &lt;code&gt;Pop&lt;/code&gt; methods of &lt;code&gt;taskHeap&lt;/code&gt; to fit the new struct structure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;pending.go&lt;/strong&gt;: Fixed &lt;code&gt;newPending&lt;/code&gt; initialization to calculate dynamic minimum capacity based on &lt;code&gt;workers&lt;/code&gt; and &lt;code&gt;size&lt;/code&gt; (&lt;code&gt;max(16, min(size/8, size/workers))&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  PERF
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;task.go&lt;/strong&gt;: Optimized heap shrink logic, changed trigger condition from &lt;code&gt;capacity &amp;gt; taskHeapMinCap &amp;amp;&amp;amp; length &amp;lt; capacity/4&lt;/code&gt; to &lt;code&gt;capacity &amp;gt; minCap*4 &amp;amp;&amp;amp; length &amp;lt; capacity/taskHeapMinCapRatio&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;task.go&lt;/strong&gt;: Improved shrink capacity calculation, using &lt;code&gt;max(capacity/4, minCap)&lt;/code&gt; to ensure it does not fall below the minimum capacity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;pending.go&lt;/strong&gt;: Optimized &lt;code&gt;promoteLocked&lt;/code&gt; access efficiency by retrieving the &lt;code&gt;tasks&lt;/code&gt; field first to avoid repeated access.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  UPDATE
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;new.go&lt;/strong&gt;: Fixed &lt;code&gt;newPending&lt;/code&gt; call, added &lt;code&gt;workers&lt;/code&gt; parameter.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FIX
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;new.go&lt;/strong&gt;: Added debug log for timeout trigger (&lt;code&gt;task.timeout_triggered&lt;/code&gt;), recording id, preset, and timeout information.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;©️ 2025 &lt;a href="https://pardn.io" rel="noopener noreferrer"&gt;邱敬幃 Pardn Chiu&lt;/a&gt;&lt;/p&gt;

</description>
      <category>backend</category>
      <category>go</category>
      <category>pardnchiu</category>
    </item>
  </channel>
</rss>
