對話摘要 2026-08-04
description: 5 note(s) today.
name: ‘2026-08-04’
- memory/2026-08-04/acp-runners.md name: acp-runners description: 2026-08-04 基建運維日記:① Codex CLI 安裝 + QwenPaw ACP runner 修復(codex-acp-wrapper.js 注入 mcpServers:[],已實測成功,重啟 QwenPaw 未確認 pending);② 系統 Agent 清單 6 個 + 外部 ACP(Hermes/Codex/Reasonix);③ Reasonix 寫 code 實測 top_files.py 16/16 pass、cache hit 97.1%、成本 ~$0.02;④ QwenPaw 同任務實測 21/21 pass、成本幾乎零,日常寫 code QwenPaw 直接做;⑤ OpenHands 1.11.0 死鎖已停用;⑥ 寫 Code 分派政策:自動派 Reasonix;⑦ ERPNext 入 3 筆測試 Journal Entry 全部 submit 成功,Trial Balance 15,500 平衡;⑧ n8n credentials 排查:冇第二個被 CF Access 擋死,5 個 credential(n8n/Qdrant×2/Actual/SSH)由 public domain 改內網直連全部實測通過,Nextcloud/Alist 保持 public,發現 n8n 冇設 N8N_ENCRYPTION_KEY(TODO 設 env)。
- memory/2026-08-04/codex-acp-runner-litemllm-fix.md name: codex-acp-runner-litemllm-fix description: QwenPaw restart 後完成 pending 任務:修好 Codex ACP runner 嘅 Internal error。根因係 @zed-industries/codex-acp (Rust binary) 預設連 OpenAI ChatGPT backend,用戶 Codex 帳號 free trial quota 用盡(UsageLimitExceeded,8 月 20 先 reset),每次 prompt 都 fail。修復:workspace 內 codex-home/config.toml 指 LiteLLM(model=deepseek-first、model_provider=litellm、base_url=http://172.21.0.40:4000/v1、wire_api=responses)+ agent.json codex runner 加 env(CODEX_HOME 指 codex-home、OPENAI_API_KEY=LiteLLM key)。delegate_external_agent(runner=codex) 實測成功,agent.json mtime 變會自動 re-init 唔使重啟。兩個坑:model id 帶 litellm/ prefix 會 403(key 只 allow deepseek-first);wire_api=chat 已 deprecated 要改 responses。MEMORY.md 已更新。
- fastmcp name: fastmcp-tool-onboarding-rule description: 用户确立的持久工作规则(2026-08-04):以后任何新容器/服务/API 收编时,默认自动一并收编为 fastmcp tool,无需用户再提醒。该规则已同步记入 MEMORY.md(条目「新服務收編自動加做 fastmcp tool(2026-08-04)」),本日记笔记为其存档副本。
- memory/2026-08-04/memory-slimming-archive-20260804.md
- memory/2026-08-04/oci-object-storage-nextcloud-primary-storage.md name: oci-object-storage-nextcloud-primary-storage description: 2026-08-04 確認可管理 OCI Object Storage(Nextcloud 主盤,bucket Next,1,107 objects 267.8MB,唔可以刪除);PoC 建立免費 Always Free Autonomous Database(A-DB)『AI-Vector-PoC』;SQL Graph Demo 完成跑通(朋友關係/2-hop/共同朋友);ONNX embedding 嘗試卡喺 Oracle 內部錯誤(ORA-54446/54401/54427)後成功 pivot:將 agent_memory 166 points(2048-dim + bm25 sparse)匯入 ADB、建 Hybrid Vector Index(e5-small vectorizer)、DBMS_HYBRID_VECTOR.SEARCH 行通,同 Qdrant 同一批 query 對比一致(content 要 rowid join、結果 LOB 要 .read())。附錄:pydantic-ai 專用 agent(infra/sql)、Infisical SMTP 測試直入 Inbox、DMARC 升 p=quarantine(8/6 提醒升 p=reject,Job 80b648bd)、Oracle 原生 Budget/Alert/Cost Anomaly Detection、3 個每日 cron → n8n workflow 遷移零 LLM。午後三項完成:外部 Agent 接入說明(EXTERNAL_AGENT_GUIDE.md:oracledb 連接 + 7 條 SQL 含 Hybrid RRF、26ai bind bug 要 CAST)、n8n『搜 Qdrant 記憶』workflow(ID uwNNmI6PEfZ37WdI,Execute Workflow node call,JS tokenizer/crc32 bm25 + nemotron-3-embed-1b + RRF,端到端測試通過;agent_memory dense 係 unnamed、sparse 叫 bm25)、OpenHands MCP 修復(原先 0 個 → 143 個;根因 sandbox 喺 bridge network 連唔到 fastmcp,修正 fastmcp 加連 bridge 172.17.0.5 + transport streamable-http;fastmcp restart 會換 bridge IP)。尾聲:AGENT_MEM 外部 agent 密碼(Mo9mW1Q*mlpuBZZElZq!、DSN aivspoc_high、wallet /home/opc/aivspoc-wallet/、只 SELECT/INSERT/UPDATE 冇 DELETE)已由用戶手動入 Vaultwarden(pass.benhoweb.com,帳號 ben.ho@live.hk;zero-knowledge 助理無法代寫,只能用戶手動加)04:50 確認入庫;密碼喺 chat 出現過,用前要改。尾二:OpenHands sandbox 公開 URL 修復完成(根因:公開 URL 用隨機 host port 被 CF 擋非標準 port + 改後 health check loop 經公開 gateway 被 CF Access 302 擋;修復:部署 sandbox-gateway caddy 動態 port proxy openhands-runtime.benhoweb.com/sandbox/ + patch 3 個內部 URL 位置 sandbox_service/docker_sandbox_service/live_status 內部用 host.docker.internal;新 conversation b98e04f3 READY、sandbox 4SPeAuLhAmUsVF2bfN4q0s(port 51315)caddy 200/CF Access 302 正常;commit 6e92d14;鏈路:瀏覽器→CF Access→sandbox-gateway→sandbox agent)。其次:OpenHands Changes 視窗 Network Error 診斷完成(root cause 100% 證實:frontend 打去 openhands-runtime.benhoweb.com/sandbox/41627/api/git/changes,agent-server CORS allowlist 只有 http://localhost:3000 唔 allow openhands.benhoweb.com → browser Failed to fetch;Auth 其實 OK:X-Session-API-Key R6F3d… 回 200,log 話 session_api_key deprecated 要 first-message auth;已排除 CF Access/tunnel/WebSocket/git;順帶發現 agent-server 行緊 1.37.1-python 而 compose 係 main-python(tag 存在 ghcr.io 有 arm64 但本機冇 pull);修復方案=sandbox-gateway Caddyfile 加 CORS headers(preflight 204 + echo origin),流程 git push → dockhand sync deploy stack 60,風險低,待用戶批准)。最後:OpenHands GitHub integration 加返完成(POST /api/v1/secrets/git-providers 注入 token、git identity shinggo8000 / 50633095+shinggo8000@users.noreply.github.com、clone 私人 repo shinggo8000/oracle-arm-stacks 端到端驗證成功 origin 自動帶 token auth);順便修復 OpenHands 1.11.0 DB bug:migration 漏建 conversation_cost_events 表(alembic 014 已最新,code 有但 migration 冇)令 conversations list API 壞 → 手動建表後 /api/v1/app-conversations/search 正常(正確 path 係 app-conversations、list 要 ids、用 /search);全鏈路確認通返(主站 302→CF Access login 屬正常 Authentik 保護、sandbox runtime + 內部 API 200)。Crawl4AI 研究報告(76k stars Apache-2.0 AI 爬蟲,v0.9.2 起 secure-by-default 必用新版;LLM extraction 可指 litellm.benhoweb.com、deep crawl、anti-bot 可解 Jobsdb 403、MCP /mcp/sse 可接 OpenHands、arm64 basic-arm64 image、port 11235;部署建議 crawl.benhoweb.com + CF Access;PoC 未部署等用戶決定)。傍晚:list.benhoweb.com 遷移 GitHub Pages integration 完成(repo shinggo8000/list-site public,index.html 38 卡 + README push commit 2a531fcf;舊 project 係 Direct Upload 唔准改 source → 刪咗重建,新 project list-benho source 指 GitHub repo,downtime 約 1 分鐘 DNS CNAME 唔使改;create 唔會 backfill 要再 push trigger build,deployment 2bd18116 success;CF connection installation 19266488;以後流程=改 workspace list-site/index.html → push GitHub main → 自動上線,舊 wrangler/scp 棄用);並確認 list.benhoweb.com 已有 CF Access 保護(app list 46413b7d + policy Allow-Portal 2e913a0c → Authentik 唯一登入,未登入 302 → shinggo.cloudflareaccess.com login;用戶直接入到係因為 24 小時 Access session cookie,遷移期間保護冇斷過)。尾段:Hermes agent 確認係對話式控制(同 OpenHands 任務生命週期唔同;deepseek-first model,有 terminal/檔案讀寫/瀏覽器自動化/cron/記憶/技能庫工具),Telegram bot 自檢疑點(log 只見到 connecting attempt 1/8)用戶確認『完全駁通』→ Telegram + API 控制都齊全,無需排查。ERPNext v16.30.0 研究完成(ARM64 官方支援、7 常駐+2 一次性容器 .61-.67、erp.benhoweb.com + CF Tunnel + CF Access/Authentik、需 MariaDB 例外因 Frappe 只完整支援 MariaDB)但用戶決定唔裝 → 轉睇會計記賬代替方案:Akaunting 3.1(推薦正式會計:完整複式記賬含科目表/總帳/試算表/資產負債表,官方 arm64,PHP+MariaDB 輕量 ~0.5GB)vs Firefly III 6.6(個人理財:收支/預算/分類/規則,支援 PostgreSQL 可直接用 pg-main 最符合政策,REST API,冇正式財務報表),Bigcapital 太重否決(15 containers + min 4GB RAM);兩個(最終揀 Akaunting 但裝完唔啱用 → 全面剷除,IP .61/.62 釋放;改部署 BigCapital:Dockhand stack 64 + repo 3 fork shinggo8000/bigcapital,5 容器 bigcapital-mysql/.63、server/.61、migration、webapp/.62、gotenberg/.65,修 Redis NOAUTH(fork 改 queue.ts + App.module.ts commit 96ebb2c)同 branch 陷阱(冇 main 用 develop,compose 推 develop),tunnel v76 + DNS + Access app 保護,已收編備份/list 卡/fastmcp bigcapital_status tool 共 158 tools,登入 ben.ho@live.hk)。尾後:BigCapital API key 功能正常但 UI 回饋隱晦(dialog 唔關、冇 toast、token 只顯示 masked,完整 token 只有 API 回應嗰一刻存在)→ 已清理 4 把測試 key、生成正式 key benho-main(bc_865add… 完整 token 已入 Infisical BIGCAPITAL_API_KEY,org 10s77u1mseib0ly;攞完整 token 要 POST /api/api-keys/generate 帶 JWT);API key(Authorization: Bearer bc_xxx)可完全控制 BigCapital:GET /api/accounts 列出全部 34 個科目(預設 HKD 科目表:資產 8/負債 6/權益 4/收入 6/支出 10),仲有 /api/accounts/:id、/types、POST、PUT、transactions、sale invoices、customers。最新(晚間進行中):接續掃描 BigCapital 其他功能 — 測試計劃:Items 管理(新增測試產品驗證分類/庫存科目)、Bills 列表(Status/Date Range 過濾 + 批量刪除)、Manual Journal(搜尋+分頁)、Reports(Trial Balance);進度:Account ID 1026=Service Income、Items 新增正常、Trial Balance 返回空(懷疑 API 參數/GET param)→ 查緊 TrialBalanceSheetController 代碼 + 核對 dummy 記帳 + Payments 端點 activity。
- 2026-08-04 07:00 每日 Oracle Cloud 檢查發現 ⚠️ Always Free Arm 額度縮水:Oracle 將 Ampere A1 免費上限由 4 OCPU/24GB 減至 2 OCPU/12GB(2026-06-15 起生效,無正式官方公告)。本機 instance 係 4 OCPU/24GB 已超標,但暫時未強制執行(本月費用 HK$0.0107 正常基線、instance 正常運行)。已發 Telegram 通知(建議 resize 至 2 OCPU/12GB 避免被自動停機)。來源 terminalbytes.com + Threads。後續:觀察 Oracle 有冇強制執行;如 instance 突然停止,先查係咪呢個原因。
OCI 費用 baseline 監控(2026-08-04)
- 用戶係 PAYG 帳戶,要求喺現有 cron 加 baseline 對比:近 30 日平均 vs 最新一日費用,超出 X% 就 email + telegram 通知。
- 新增 host script
/home/opc/cost-monitor/:check_cost.py(OCI CLI DAILY granularity 查 30 日 + 計平均 + 判斷 + smtplib 發 email)、run.sh(source .env)、.env(600,SMTP credential + 參數)。
- 觸發條件:A) 最新一日費用 > HK1(absolute兜底);B)>30日平均2000.10 floor(避免零頭誤報)。
- Email:OCI SMTP(smtp.email.eu-frankfurt-1.oci.oraclecloud.com:587 STARTTLS)→ ben.ho@live.hk,From info@benhoweb.com。
- Telegram:cron agent 讀 JSON
status=alert 時 qwenpaw channels send。
- ⚠️ Usage API 時間參數必須純日期(YYYY-MM-DD),帶時分秒會 InvalidParameter;OCI CLI 冇
--output-format option。
- 測試:normal 路徑輸出 avg_30d=0.000357 / last_day=0.010699(8-03)→ normal 正確;alert 路徑(低 threshold 測試)email_sent=true ✅。
- Cron job f2ee63f6(Oracle Always Free 收費監控,每日 07:00 HKT)prompt 已更新加入 B) baseline 檢查,下次 08-05 07:00。
- 參數可調:.env 嘅 BASELINE_X_PERCENT / ABS_THRESHOLD_HKD / FLOOR_HKD。
browser-use PoC + n8n 接入(2026-08-04 完成)
- PoC 成功:host 用 uv 裝 Python 3.12 venv
/home/opc/bu-poc/ + browser-use + litellm;browserless remote(ws://172.21.0.2:3000?token=<BROWSERLESS_TOKEN>,query token 先得,Bearer header 唔得);LLM 用 browser_use.llm.litellm.ChatLiteLLM(model='openai/deepseek-first', api_base='http://172.21.0.40:4000/v1', api_key=sk-Momk...)(⚠️ model 要 openai/ prefix,bare name litellm 認唔到)。
- ⚠️ browser-use 2026 API 大改:冇
BrowserConfig/Browser(remote=True, cdp_url=...);新寫法 Browser(cdp_url=...);LLM 用 browser_use.llm.litellm.ChatLiteLLM(dataclass),litellm 要另外 pip install;Agent(task, llm, browser) + await agent.run(max_steps=N) + history.final_result()。
- Worker:
/home/opc/bu-poc/run_task.py(--task 或 --task-base64;RESULT_JSON: {...} 寫去 stderr——n8n SSH node 會將 stdout pipe 返 shell 當 input 執行,多行 stdout 會爆;stderr capture 正常)。
- n8n workflow「browser-use 任務執行器」
Ywwv64VYO8jD65P1(active,tag QwenPaw):POST /webhook/browser-use-task body {task, max_steps?, model?, chat_id?, notify?} → {ok, result};流程 Webhook → 準備任務(base64) → SSH(run_task.py) → 解析結果(讀 stderr) → if notify → Telegram/直接 Respond;可選 Telegram 通知(default chat 619760664)。
- ⚠️ n8n SSH node 教訓:① command expression 必須
= + backtick + {{ $json.x }}(= + '...' + $json.x 字串連接會 evaluate 但唔 work;純 {{ }} 唔會 evaluate);② stdout 會被當 shell input 執行(RESULT_JSON 寫 stderr 繞過);③ update_workflow setNodeParameter path 係相對 node.parameters(/parameters/command 會塞入 parameters.parameters)——要 replace 用 updateNodeParameters + replace:true。
- QwenPaw 接入:n8n MCP
execute_workflow(workflowId=Ywwv64VYO8jD65P1, inputs={type:'webhook', webhookData:{body:{task,...}}}) 實測成功(HN top story);或 curl http://n8n:5678/webhook/browser-use-task。SDK code scripts/n8n-workflows/browser-use-task.workflow.ts。
- 試通 LLM extraction:
GET /llm/{url}?q=<instruction>(url URL-encode)→ 同步返回 {"answer": "..."}。deepseek-first 經 LiteLLM proxy 成功(example.com + Wikipedia Deep learning 大頁面都 OK)。
- 關鍵發現:
/crawl 嘅 extraction_config field 會被忽略(0.9.2 server 唔用呢個)
handle_llm_request background-task 版係死 code(冇 route 引用),只有 handle_llm_qa 同步版
- Redis 起唔到:
/var/lib/redis tmpfs 冇 mode → redis 8.8(appuser)寫唔到 → FATAL。修復:/var/lib/redis:mode=777。Redis 只影響 task/monitor,基本 crawl 唔使。
- fastmcp 收編 +3 tools = 155:
crawl4ai_status / crawl4ai_crawl(urls, max_length, include_links) / crawl4ai_llm_extract(url, instruction);env CRAWL4AI_URL + CRAWL4AI_API_TOKEN 入 Dockhand stack 56(SQL environment_id=1 修正);commit 35ea273。
- 部署:stack 61(crawl4ai)→ Redis RUNNING;stack 56(fastmcp)→ healthy,155 tools,實測 status + llm_extract 全通。
- 已排程 restart qwenpaw reload fastmcp driver。
- Git 教訓:rebase todo 重複搞亂 → abort + reset —hard origin/main + 重新 apply(remote 有 browser_use_task commit 4bb777c/581cbb8);commit 前唔好 include pycache(已加 .gitignore)。
2026-08-04 Hermes Agent 部署(16:20 HKT)
- 用戶提供 bot token(8833424843…)+ 要求開 Dashboard + 確認 LiteLLM deepseek-first
- Stack 62
hermes:image nousresearch/hermes-agent:latest,IP .60,data /home/opc/hermes/data(hermes UID owner,host opc 讀唔到)
- Telegram bot @hermes_agent_shinggo_bot 已 connected(ALLOWED_USERS=619760664)
- Dashboard hermes.benhoweb.com:CF tunnel ingress + DNS + Access(Authentik IdP login_method b4a79d81)+ basic auth(shinggo/ee569e…)
- LLM config:config.yaml model.provider=custom + base_url=http://litellm:4000/v1 + model=deepseek-first + key sk-Momk-…
- API server 8642 開咗(OpenAI 兼容,model id hermes-agent,key 932fe5…)
- fastmcp 收編 hermes_status + hermes_chat(+2 = 157 tools,commit f43d230),端到端實測 hermes_chat 用 deepseek-first 回覆成功
- Infisical 已入 TELEGRAM_BOT_TOKEN_hermes
- list.benhoweb.com 已加 Hermes 卡(GitHub REST push,sha 393df7a)
- 已排程 restart qwenpaw reload fastmcp driver
- Dockhand env 教訓再次確認:PUT env 後 environment_id=NULL → 必須 SQL UPDATE 返 1(hermes + fastmcp 都做咗)
- ⚠️ 未做:dashboard 密碼入 Vaultwarden;/home/opc/hermes/data host 權限(如 backup 要讀要 chown)
BigCapital 功能掃描(續,11:30 完成)
- 繼續 API 層面掃描未測功能,全部後端正常:
- ✅ Manual Journals(POST /api/manual-journals,字段係
date 唔係 journalDate;MJ-0002 $1,500 借貸平衡)
- ✅ Sale Receipts(POST /api/sale-receipts,RCT-0001 $2,000)
- ✅ Credit Notes(POST /api/credit-notes,CN-0001 $500)
- ✅ Sale Estimates(POST /api/sale-estimates,EST-0001 $3,000)
- ✅ Bills(POST /api/bills;BILL-0001 已存在重複會 BILL_NUMBER_EXISTS 正確)
- ✅ Expenses(已有 $500 Office supplies)
- ✅ Reports 全線:cash-flow-statement(注意係 cashflow 唔係 cash-flow)、journal、general-ledger(field 係
transactions 唔係 entries;34 accounts 有 7 個有交易餘額正確)、customer-balance-summary、vendor-balance-summary(vendor 欠 $5,000 正確)、sales-by-items、inventory-valuation、trial-balance(正確 key 係 data.accounts 唔係 entries)
- ✅ Banking Accounts(GET /api/banking/accounts 4 個 bank/cash 帳戶;UI 白屏嗰頁後端完全正常,白屏純前端 TypeError)
- ✅ Tax Rates / Currencies / Exchange Rates list(GET /api/currencies/exchange-rates 會撞
currencies/:code route 返怪嘢;正確 list 用 GET /api/currencies)
- ✅ Invoice 操作:writeoff(POST /sale-invoices/1/writeoff)、deliver(PUT 唔係 POST,重複 deliver 回 SALE_INVOICE_ALREADY_DELIVERED)、mail(POST /mail 成功)、PDF 生成 54KB 成功(Accept: application/pdf)
- ✅ Bulk delete 驗證(POST /customers/validate-bulk-delete;有 invoice 嘅 customer non_deletable 正確保護)
- ✅ Purchases by Items 400 只係 query param 類型問題(noneTransactions/onlyActive 要 boolean literal),唔係 bug
- ⚠️ 新 bug:GET /api/exchange-rates/latest 500(
undefined passed as a property for where operation)——根因:ExchangeRatesModule 係空 module(冇 import TenantMetadata model),ExchangeRatesService.latest() 度 TenantMetadata.query().findOne({ tenantId }) 撞 undefined。Upstream code 缺失,屬次要(Settings→Exchange Rates 頁面受影響),唔影響主流程。記錄待日後修(fork 加 model import 或換 OpenExchangeRate 配置)。
- 已建立 demo 資料:item 1001 Consulting Services、MJ-0002、RCT-0001、CN-0001、EST-0001。未清。
BigCapital Bug 追蹤(用戶回報 2026-08-04 11:40)
- ⚠️ 用戶確認好多 bug:① Print report 唔得(報表列印功能失敗);② Export 唔得(匯出功能失敗)。具體 error 未提供,UI 層面問題,後端 API 層面報表全部正常(見上)。
- ⚠️ 已記錄 bug:③ Add Bank account 頁面白屏 crash(TypeError toLowerCase,前端);④ GET /api/exchange-rates/latest 500(ExchangeRatesModule 空 module 冇 import TenantMetadata)。
- 處理策略:等上游新版本(目前最新 v0.25.24,2026-08-03 release),期間每日 14:00 檢查有冇新版本(n8n workflow 建緊),有新版先考慮升級試修。
- 我哋 fork develop = commit 7302f1d(2026-08-04,自己 patch:DB grant fix)。
ERPNext 部署上線(22:30 HKT)
- 用戶批准後部署 ERPNext v16.30.0(小型公司 / 4GB RAM 限額)→ 成功上線
erp.benhoweb.com:CF tunnel + Access Authentik(app 9c6ac903 / policy 6e6c2be1)+ DNS CNAME
- Dockhand stack 65(repo 2,contextDir erpnext,buildOnDeploy=false);env 3 vars(DB_ROOT_PASSWORD/ADMIN_PASSWORD/REDIS_PASSWORD)+ environment_id SQL 修正
- 8 containers:mariadb(.67) / configurator(exit0) / create-site(exit0,site 已建) / backend(.68) / frontend(.69) / websocket(.70) / worker(.71) / scheduler(.72)
- Redis = redis-main db3/4/5;RAM 限額 1536m/2g/256m/512m/1536m/1g
- ⚠️ 首次 deploy 失敗教訓:.61-.66 撞 BigCapital(.61/.62/.63/.65 已重用)→ Address already in use → 改 .67-.72(commit 9ae2692)
- ⚠️ compose 陷阱:
FRAPPE_SITE_NAME_HEADER: $host 要 $$host 先唔會被 compose 展開
- 驗證:frontend(Host header) 200 / backend ping pong / 外部 302→CF Access ✅
- 收編:Infisical 2 secrets(ERPNEXT_ADMIN_PASSWORD/DB_ROOT_PASSWORD)、R2 backup script 加 3 volumes、list-site 加卡(commit 8ece646)、fastmcp
erpnext_status(159 tools,commit b53cc1d)
- site Administrator 密碼 65119f3a… / DB root 8cc95097…(已入 Infisical + MEMORY.md)