Leo
|
0deef3dbd9
|
fix(t86 🔴): 換知識庫實例時清空看守資料夾——堵個資外洩
leo 07-28 實測坐實:youlin 時代的資料夾被原封同步進 geek6688 新實例
(「假如我把個人的同步到官方去就很危險,個資外泄」)。
修:instanceChanged(old,new) 比 host;連線精靈成功後若換了實例→清空
WatchFolders/WatchFolder,成功對話框改為說明「因為換了知識庫,為避免把舊資料夾
誤傳到新知識庫,請重新用『+新增知識資料夾…』選擇」;同實例改密碼行為照舊。
測試(main_test.go):host 異同判定含大小寫/尾斜線/scheme 差異。tray go test 綠。
(實作=子 CC;審查+commit=總管。⚠️ manifest 沿用=t86b 另案未含)
|
2026-07-28 12:03:20 +08:00 |
|
Leo
|
fb63d9f0c4
|
fix(t89 🔴🔴): 純中文資料夾名不再靜默併進 kb 庫——slug 空改生路徑穩定雜湊鍵
leo 07-28 實測:「官方總圖」被顯示成「知識庫」=slug 後為空退到 kb;
兩個純中文資料夾會塌縮同庫(靜默混庫,B5 分庫隔離形同虛設)。
修:libraryFor 第三優先從退 c.Library/kb 改為 lib_+sha256(絕對路徑)前6hex——
路徑穩定故鍵穩定、不同路徑必不同鍵;後端庫名鍵限 A-Za-z0-9_- 相容。
測試(t52_library_test.go):純中文→lib_雜湊非kb/兩中文夾不同鍵/同夾重跑鍵穩定/
ASCII 行為不變/明列對映仍最優先。collector go test 全綠(總管親跑)。
(實作=子 CC headless;審查+commit=總管)
|
2026-07-28 12:03:20 +08:00 |
|
Leo
|
59cf9825d1
|
fix(t75 ④⑤): 連線精靈不再清空輸入+Windows 不再每幾秒閃 console 視窗
leo 同事真機實測撞到的兩個最嚴重問題。
④ 連線失敗會清空使用者輸入(leo:「很糟糕」)
真兇:失敗後呼叫 showConnectWizard(),註解寫著「不要把他丟回空白畫面」
**但行為與註解相反**——它重建整個對話框,urlEntry 是全新的,
而 cfg.CypherURL 因連線失敗根本沒寫入 ⇒ 欄位就是空的 ⇒ 使用者整段重打。
修:改 showConnectWizardWith(prevURL, prevEmail) 帶回上次輸入,
讓他只改錯的那個字。密碼不帶回(打錯時重打較安全,也少留記憶體)。
⑤ daemon 開著時每幾秒閃一個方框(約半螢幕)
真兇:arcrun-collector.exe 是 console 型執行檔,supervisor 每輪 exec 起它,
**Windows 預設會為 console 程式配可見視窗** ⇒ 每輪閃一次。
Mac/Linux 無此概念故開發期完全沒想到。
修:新增 hidewindow_windows.go(HideWindow + CREATE_NO_WINDOW)
+hidewindow_other.go(no-op),編譯期分平台不寫 runtime.GOOS 判斷。
註:-H windowsgui 是連結期選項(管自己有沒有視窗),與此(管起別人時給不給視窗)
是兩件事,兩者都要做才乾淨。
驗證:Mac 與 Windows 交叉編譯皆 exit=0 且產物生成;collector 全測試綠。
⚠️ 未真機驗——⑤ 的效果必須在真 Windows 上確認方框消失。
|
2026-07-28 00:42:12 +08:00 |
|
Leo
|
1b58cd1a35
|
fix(t72): build-windows.sh 補版本注入(Mac 有、Windows 漏了)+tray go.mod tidy
實測抓到:Windows 版編出來 v0.10.0 命中 0——版本注入只加在 build-mac.sh,
Windows 那支漏了(我今天改的那份在 detached worktree,沒進分支)。
v0.10.0 兩平台實測:
Mac zip 15.92MB|托盤 21.15MB(strip)|collector 14.46MB(含 PDFium)
Win zip 16.86MB|tray 22.40MB|collector 15.15MB
兩者皆 < jsDelivr 20MB
指紋全中:v0.10.0/版本列/結束 Arcrun RAG/PDF 打不開(轉檔層)
順帶修:tray go.mod 需 tidy 才編得過(合併後又被覆蓋,撞了兩次)。
|
2026-07-27 21:17:50 +08:00 |
|
Leo
|
a0a7215d24
|
Merge branch 'fix/mac-build-strip-t72' into feat/daemon
|
2026-07-27 21:12:55 +08:00 |
|
Leo
|
55ed2c86a7
|
feat(t73): PDF 抽取器接上 PDFium-via-wazero——leo 裁定的引擎,實測通過
⭐ 決定性實測:Chrome headless 列印的中文 PDF 完整抽出
「船舶維修合約書/第一條 維修費用為新台幣 350,000 元整/2026 年 8 月 15 日」
——這正是 pdf-extraction-options.md §3 實測「純 Go 套件會整段亂碼」的那種檔,
也是客戶最常丟的(瀏覽器列印)。選 PDFium 的理由至此坐實。
用戶不必裝任何東西(回答 leo「我的用戶可能不會自己裝 Python 環境」):
pdfium.wasm 由 wazero(純 Go WASM runtime)在本行程跑,embed 進執行檔。
實測 CGO_ENABLED=0 GOOS=windows 交叉編譯一行成功 → PE32+ executable x86-64,
證實「無 CGo」承諾為真,不加重 t72 負擔。
體積實測(有實際呼叫路徑,避開今天記過的 dead-code 陷阱):
mac 14.53MB / windows 15.15MB(strip 後)
leo 定調「全運作在客戶電腦上,肥一點喘一點也沒事」
設計決定:
- lazy init(sync.Once)——多數資料夾可能一個 PDF 都沒有,不該白付 WASM 啟動的記憶體
- pdfMu 互斥——pool 單 worker,別依賴「scan 是循序」這個假設
- 單頁失敗不放棄整份,但留「(第 N 頁讀取失敗)」痕跡
- 抽不出字 → ErrNoText(掃描件;PDFium 不做 OCR),絕不靜默送空內容
測試 4/4:Chrome PDF 中文正確/無文字回 ErrNoText/壞檔報錯可辨識
(『可能損壞或有密碼保護』)/連續多檔不爆(daemon 長駐會遇到)。
|
2026-07-27 21:07:11 +08:00 |
|
Leo
|
a50cc37949
|
feat(t73): manifest 記錄 extracted_by——換萃取器時才分辨得出哪些卡是舊的
leo 07-27 三問查證後補的缺口。查證結果(已用測試釘死,下次不必再讀碼推論):
① 已萃過它知道嗎 → 知道。ingested_hash vs content_hash,相同就跳過;
只有 2xx 成功才回寫(direct.go:405),失敗下輪自動重試不漏檔。
② gemma 會重萃 claude 萃過的嗎 → 不會重萃(hash 相同),但原本**分辨不出誰萃的**
=換萃取器後兩種品質的卡混在同一知識庫,想重萃也不知該重萃哪些。← 這次補的
③ 誰負責萃 → cfg.Extractor 一個資料夾一個設定(direct.go:346),無自動判斷。
做法(純記錄不改行為、可逆,故自裁):
- ManifestEntry 加 ExtractedBy(omitempty)
- 另開 MarkIngestedBy 而非改 MarkIngested 簽名——後者有多處呼叫(direct 兩處+
trigger.go MarkIngestedEvents+測試),改簽名會擴散破壞
測試 7/7:萃過不重萃/改了要重萃/失敗下輪重試/記得誰萃的/
舊簽名仍可用/舊 manifest 讀得進來且空值不污染 JSON/有值真的存進檔案。
未做(屬品味題待 leo 裁):B 自動偵測有無 claude 優先用用戶訂閱、C ChatGPT 路。
|
2026-07-27 20:58:30 +08:00 |
|
Leo
|
12c8098b5f
|
feat(t73): Excel/CSV 抽取器——企業用很多(leo)
leo 兩句定調:
①「要思考 Excel 和 csv 的問題,因為企業用很多」
②「企業的 excel 通常不會是 1 萬行,人工做不出這麼多,但你可以轉結構資料丟進去」
→ 修正我先前「CSV 會變數字牆、先不加」的判斷——那是拿機器產生的百萬列當前提。
實測 60列x6欄 ≈ 2,200 token,對 LLM 完全不是問題。
統一中間格式=Markdown(leo 提 n8n 對照後定調):
n8n 一切轉 JSON 是對的,因為它下游是程式(.欄位 取值);
我們下游是 LLM ⇒ Markdown 表格更好。實測同一份表格
JSON 6,872 字元 vs Markdown 3,341=JSON 多花 2.1 倍 token(每列重複寫欄位名)。
測試 8/8,用 openpyxl 產的真 Excel 檔(非自捏 XML):
⭐ 測試抓到兩個真 bug(讀原始碼看不出來):
① rels 的 Target 是絕對路徑 /xl/... 我卻又補 xl/ 前綴 → 變 xl/xl/...
② r:id 帶 namespace,寫 xml:"id,attr" 抓不到,要用完整 namespace URI
修好後分頁名從 ## sheet1 變成 ## 維修紀錄(企業分頁名本身就是語意)
CSV:去 BOM(Excel 另存必帶)/引號內逗號不拆欄/| 跳脫/欄數不齊不整份失敗
XLSX:多工作表全讀(只取第一頁會漏)/sharedStrings 索引/壞檔報錯
防呆:超過 500 列截斷並明說截斷了(不靜默丟資料);單格超 500 字截斷。
|
2026-07-27 20:50:45 +08:00 |
|
Leo
|
09bf454402
|
feat(t73): 轉檔層接進主流程——docx 真的走得通(零件完成≠功能完成)
ExtractWithGemma 讀檔後改走 ConvertToText,LLM 只會收到文字永不收二進位。
刻意不吞錯:ErrNoText(掃描件/空檔) 與 ErrUnsupported(未支援格式) 都往上拋,
因為靜默略過正是 leo 撞到的病。
接線測試 5/5(驗用戶真的會走的那條路,非只測零件):
scan 收得到 .docx/收 .md/不收 .png
⭐ docx 一路走到 Gemini API 才因假 key 失敗 = 決定性證據:
轉檔確實發生在送模型之前(非宣稱)
抽不出文字 → 明確失敗且 errors.Is(ErrNoText) 可判定,不靜默送空卡
未支援格式 → ErrUnsupported,與 ErrNoText 可區分(給用戶的說法不同)
.md 迴歸保護:不因接了轉檔層而壞掉
順帶修:變數名與既有 text(LLM 回應) 衝突 → 改 srcText(輸入原稿),IDE 診斷抓到。
全 collector 測試綠。
|
2026-07-27 20:44:29 +08:00 |
|
Leo
|
66d4fef045
|
feat(t73/t16): 本地轉檔層骨架+docx 抽取器(leo 定的『收集端 Markitdown』)
leo 07-27 定的形狀:「本地任何檔案都透過一個機制把它轉成模型可讀,再把模型可讀
內容發給它」「能不能讀 PDF 根本不是 Arcrun 的工作」。
convert.go=調度層(工頭):認副檔名→派抽取器→統一吐純文字。
加新格式只要在 extractors 註冊一行,不動架構。
convert_docx.go=第一個抽取器,純標準庫 archive/zip+encoding/xml。
三個設計決定(都有理由,非隨手):
① ErrNoText 獨立錯誤——掃描件 PDF 抽不出字時絕不能靜默略過(leo 撞過的病),
要能轉成使用者看得懂的訊息;與 ErrUnsupported 分開因為說法不同。
② NFKC 正規化——PDF 抽中文會出康熙部首變體,長得一樣但碼位不同=用戶搜不到
自己的檔案。廉價保險,對其他來源同樣有效。
③ 只取 word/document.xml——頁首頁尾多是雜訊(頁碼/公司名),知識萃取不要。
測試 10/10 + 真 Word 檔實測:
textutil 產生的 real.docx → 抽出「船舶維修合約/350,000/2026 年 8 月 15 日」全對
同段落多 run 相連(Word 常把一句話切成多個 w:r)
壞檔(舊版 .doc 改名)報錯且不歸類成 ErrNoText
NFKC 康熙部首摺回正常字
註:全形「,」會被 NFKC 轉半形「,」=正常行為,對搜尋無害(反而統一)。
下一步:接 PDFium-via-wazero(+10.43MB)。未接進 extract_gemma 主流程。
|
2026-07-27 20:36:02 +08:00 |
|
Leo
|
90b6de66bc
|
feat(t72): daemon 加版本編號(leo 07-27:沒版本號=只能靠 shasum 對帳)
病根:在此之前無法從畫面看出裝的是哪一版。07-27 花大半天對帳
「leo 手上/鏡像上/剛編的」是否同一顆,只能 shasum 比對 binary;
使用者更做不到這件事,回報問題時我們也不知道他跑的是哪版(t63 三層落差)。
做法:
- main.go 加 version/buildTime 變數,build 時 -ldflags -X 注入,未注入顯示 dev
- 托盤選單「結束」正上方加停用態版本列(回報問題時眼睛已在那一區)
- build-mac.sh / build-windows.sh 同一套:VERSION 環境變數 > git describe > dev
實測(兩平台各實跑一次 VERSION=v0.9.0):
Mac 托盤 21.1MB/zip 12.43MB/v0.9.0 命中 3/版本列 1/結束 1/連上知識庫 1
Win zip 13.27MB/PE32+ GUI/v0.9.0 命中 3/版本列 1/結束 1/連上知識庫 1
兩包皆 < jsDelivr 20MB 上限
未驗:選單版本列的實際顯示(Mac 需 leo 點選單、Windows 需真機)。
|
2026-07-27 19:46:19 +08:00 |
|
Leo
|
1c48d58789
|
fix(t72/t63): build-mac.sh 加 -s -w——Mac 版掉進 jsDelivr 20MB 內,免拆檔
真兇:fyne package 內部自己 go build,吃不到 -ldflags,產出含符號表+DWARF 的胖執行檔。
解:②b 用 -s -w 重編托盤覆蓋回 bundle;collector 也一併 strip。
實測(從乾淨狀態重跑 build-mac.sh):
托盤 28.6MB → 21.1MB
整包zip 21.1MB → 12.43MB ← 遠低於 jsDelivr 20MB 上限
功能指紋 結束 Arcrun RAG=1 / 連上知識庫=1(未掉功能)
codesign -v 通過
影響:此前 Mac 版超 20MB,jsDelivr 直接回 File size exceeded,只能走 raw;
現在可走 CDN,且**免除原本要拆檔(tray/collector 分開)的工程**。
Windows 版 13MB 本來就在限內,不受影響。
未驗:真機執行行為(托盤 icon/選資料夾)——strip 不影響邏輯但仍需真機確認。
|
2026-07-27 19:31:30 +08:00 |
|
Leo
|
26dd6960c2
|
feat(t72): Windows 交叉編譯腳本——Mac 上就編得出 Windows 托盤(推翻「要真機」假設)
任務板一直寫「fyne GUI 沙箱編不了 CGo+GL → 歸屬真機」,本機實測推翻一半:
裝 mingw-w64 後 Mac 直接交叉編譯成功,不需 Windows 機器/Docker/fyne-cross。
CGO_ENABLED=1 GOOS=windows CC=x86_64-w64-mingw32-gcc \
go build -ldflags "-H windowsgui -s -w"
→ PE32+ executable (GUI) x86-64, for MS Windows
正確說法是「編得出來、但驗不了」——編譯是 Mac 的事,跑起來對不對才是真機的事。
另兩條路實測皆失敗(訊息留在文件):
- CGO_ENABLED=0 → go-gl/gl 無 non-cgo 實作
- CGO_ENABLED=1 無交叉編譯器 → 退回 host clang 報 -mthreads 不支援
體積(解掉 t72 的 zip 疑慮):tray 加 -s -w 40.8MB→23.5MB、collector 6.5MB,
zip 合計 13.9MB=在 jsDelivr 20MB 上限內,Windows 版不會踩到 Mac 版那個坑。
腳本已實跑通過。⛔ 未驗=托盤 icon/選資料夾對話框/SmartScreen 實際行為(要真 Windows)。
詳 system-dev/docs/3-specs/rag-wave1/windows-build-and-os-split.md
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2026-07-27 18:34:59 +08:00 |
|
Leo
|
fedb765742
|
feat(t52): per-folder 庫章——DirectConfig.libraries 對映+libraryFor()(資料夾名 slug/中文退後備/明列優先,go test 綠);兩支 ingest workflow 的 post_block metadata 補 library(真兇:blocks 沒蓋章=兩資料夾全歸 general);托盤連線時回報庫自動登記
|
2026-07-26 01:53:44 +08:00 |
|
Leo
|
3675f38e59
|
fix(daemon/t55): 托盤補「結束 Arcrun RAG」——leo 07-26 實撞沒有出口(關窗只隱藏、LSUIElement 無 Dock 右鍵、只剩強制結束);結束前先 sup.Stop() 不留孤兒 collector
|
2026-07-26 01:12:57 +08:00 |
|
Leo
|
3174340c4c
|
feat(daemon/t54): 連線精靈——首次啟動輸入知識庫網址+帳密,自動換取設定並開始看守(不再需要下載 config.json 丟隱藏資料夾);portal→cypher 子域自動換算、三種輸入格式實測可用;選單加「連上知識庫…」供換帳號
|
2026-07-26 00:16:58 +08:00 |
|
Claude
|
e548c57efa
|
fix(t39): daemon 端展開 config 的 ~/ 路徑
安裝器成功頁下載的 config.json 把 manifest 寫成 ~/.arcrun-rag/manifest.json——那是給人
看的寫法,Go 不展開波浪號,os.ReadFile 會去找一個字面上叫 "~" 的資料夾。
修在 daemon 端而非前端:用戶自己手打 config、或把設定搬到另一台機器時 ~/ 都該會動,
而前端也拿不到用戶家目錄。manifest 與 watch_folder(s) 全展開;只認 ~/ 與單獨的 ~,
~user 形式不猜(Go 無法解析他人家目錄);拿不到家目錄就原樣返回讓錯誤誠實浮現。
測試 +2(config 展開含 CJK 路徑與絕對路徑不動、expandHome 六種邊界),collector 全套綠。
|
2026-07-25 08:18:21 +00:00 |
|
Leo
|
125377b899
|
feat(daemon-beta t26): 托盤選單顯連線身分(暱稱>email>未設定),CF 全程隱形
- directConfig/DirectConfig 加 Email、InstanceName(選配)欄,兩結構同形
- rebuildTray 選單頂加 disabled「連線中:<暱稱||email||未設定>」列;
有 cypher_url 再加一行縮短 host(fyne MenuItem 無 tooltip,取捨見註解)
- connectionStatusLabel/shortCypherHost 抽純函式,3+3 案 table test
- go vet + go test 全綠(collector 43 通、tray 10 通);tray go build 過
|
2026-07-24 17:59:01 +08:00 |
|
Leo
|
b9d880413d
|
feat(daemon-beta t14/t15/t17): supervisor log 檔+removed 清本地卡+托盤建新資料夾
- t14 supervisor:子行程 stdout(tee)/stderr 全落 ~/.arcrun-rag/collector.log,
>5MB 改名 .old 重開(兩代輪替);落 log 失敗一律吞掉不擋看守。新增 2 測試
(輸出進檔+輪替觸發)。
- t15 direct removed(extractor 模式):雲端 takedown 2xx 後同步刪本地
system-dev/wiki/cards/<頁名>.md(存在才刪;刪失敗只記 warning 不擋)。
新增 2 測試(刪原檔→本地卡被清/卡已不在照常下架)。
- t17 arcrun-tray:tray 選單+設定視窗加「建立新資料夾並看守…」——
widget.Entry 輸入名稱→ ~/ 底下 mkdir(已存在沿用;擋路徑分隔與 ..)→
addWatchFolder+saveConfig+重啟看守+rebuildTray。
collector: go vet ✓、go test -count=1 ./... 43/43 綠;arcrun-tray: go build ✓(產物已刪)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-24 15:06:21 +08:00 |
|
Leo
|
6e5009ff35
|
fix(daemon-beta t6): ingest path 改帶原檔路徑——修 takedown 0 命中孤兒 bug(第五枚真機坑);mistakes 補成對操作同鍵教訓
|
2026-07-24 13:21:26 +08:00 |
|
Leo
|
387ce3d1a4
|
feat(daemon-beta t7/t8): Dock 隱藏真機驗證通過(lsappinfo type=UIElement)——runtime Accessory policy(cgo)+appID+ad-hoc 重簽;mistakes 記四枚真機坑;暫用 icon(等 leo logo)
|
2026-07-24 12:56:40 +08:00 |
|
Leo
|
5017d0381e
|
feat(daemon-beta t7): 托盤多資料夾選單(每根一列:點開 Finder/子選單停止看守/動態重建)+build-mac.sh(fyne package+LSUIElement=true 隱 Dock——leo 07-24 裁決);編譯通過,真機驗歸 leo
|
2026-07-24 12:32:44 +08:00 |
|
Leo
|
c0bf83def4
|
fix(daemon-beta t3): headless claude -p 寫卡卡權限確認——帶 --permission-mode acceptEdits(真機 e2e 第二枚實撞)
|
2026-07-24 12:28:47 +08:00 |
|
Leo
|
18a873001b
|
fix(daemon-beta t3): 真機 e2e 抓到 /wiki-extract 拒非 vault 資料夾——新增 daemon 專用 /rag-extract-file 命令(template overlay,prompt 活在 skill 檔),claude 路改呼叫它
|
2026-07-24 12:27:15 +08:00 |
|
Leo
|
058d19b743
|
feat(daemon-beta t5/t6): rag_ingest_card 收卡 workflow(零LLM零credential)+direct 迴圈接萃取器——本地萃卡只上卡、原文不出機;e2e 測試驗「原文不洩上雲」+失敗重試語意
|
2026-07-24 12:23:52 +08:00 |
|
Leo
|
be47afe26e
|
feat(daemon-beta t3/t4): 可插拔本地萃取器——claude 路(叫起用戶訂閱跑 /wiki-capture、stub 驗呼叫契約)+gemma 路(實戰 prompt/thought 淨化/httptest 替身);測試 6 支全綠
|
2026-07-24 12:21:41 +08:00 |
|
Leo
|
73a5a67b72
|
feat(daemon-beta t2): template 代裝——embed v1.18.0 快照(36檔)/冪等不覆寫/daemon 啟動自動鋪/template-install 子命令;scan 加 SkipDirNames 防 system-dev 與 CLAUDE.md 被當知識掃
- 測試 3 支新增全綠(首鋪/冪等護用戶檔/掃描跳 template 產物——第三支先紅抓到 CLAUDE.md 洩入再修綠)
- CLI 實跑:新鋪 36 檔→重跑 0 新檔(冪等證據)
|
2026-07-24 12:18:37 +08:00 |
|
Leo
|
b355165180
|
feat(daemon-beta t1): 多資料夾 config——watch_folders[]+單數相容、manifest 每根一份、多根掃描標 Root、托盤資料層相容;rag-wave1 closed→daemon-beta 實作卷 active
- direct.go: Folders() 正規化(去重保序)/manifestPathFor(單根沿用不丟狀態、多根 sha 尾碼)/RunDirectOnce 多根彙總
- 新測試 4 支全綠(單數相容/多根去重/缺欄驗證/多根 dry-run 標 Root);既有 7 支不動全綠
- tray: config 加 watch_folders 欄(防存檔洗掉)+addWatchFolder 資料層;勾選 UI=task 7
|
2026-07-24 12:10:08 +08:00 |
|
Leo
|
44a9aeddc4
|
wip(daemon/tray): 保底 07-21 fyne 托盤進度(單資料夾版;情境1改造前的基線)
|
2026-07-24 12:10:08 +08:00 |
|
cloud-worker
|
9e356e3d99
|
feat(daemon/p04): fyne 托盤殼 + collector 看守器(CP-1 第6關產品化,leo 定 fyne)
leo 2026-07-21 回「fyne」。交付「可交付的殼」:
- collector/supervisor(純 stdlib,無 fyne):看守 collector direct 子行程、串 stdout JSON 出
狀態(看守中/上次同步/出錯自動重試/已暫停)、崩潰重起、Stop 同步等 loop 收掉(修 Stop→Start
換資料夾時舊 loop 覆寫新狀態的 race)。**sandbox `go test -race ./... 全綠(6 測,含 race)**,
既有 collector 測試零回歸。
- collector/cmd/arcrun-tray(獨立 module,隔開 fyne CGo 依賴):選單列/系統匣 icon+狀態+
選資料夾(原生對話框)/暫停·繼續/打開資料夾;關窗縮背景;watch_folder 預設 ~/ArcrunRAG 避開
~/Documents 的 TCC 禁區;wires supervisor。
誠實界定(mindset §7):
- **in-process vs 子行程**:leo 偏好 in-process,但 collector 是 package main,真 in-process 需抽核心成
library(動已驗引擎有回歸風險)→ 本版走子行程看守(collector 零改、崩潰隔離),行為對用戶相同;
in-process 抽取列可選後續,待 leo 裁。
- **fyne GUI 沙箱編不了**(CGo+GL)→ build/簽章/TCC 授權=leo/地端真機做(紅線②③);
fyne API 細節以首次真機 build 為準。README 附建置/簽章/TCC 交接。
|
2026-07-21 09:27:55 +00:00 |
|
雲端總管
|
ad34a87210
|
feat(daemon): direct 直送萃取同步模式(無 R2/Gitea,youlin live e2e 綠)
SDD ingest-hash-trigger task 11:daemon 跨平台核心 + 產品承諾核心實證
(丟檔進資料夾 → AI 查得到)。
- collector 新增 direct 子命令(direct.go):監看資料夾 → hash 差異偵測(沿用 Scan)
→ 讀檔內容 inline POST 進實例 rag_ingest_direct workflow;刪檔 → POST {page_name,path}
進 rag_takedown_direct。設定走 --config JSON(install/direct-config.sample.json)。
常駐輪詢=純 stdlib ticker,零 CGo,darwin/arm64 + windows/amd64 交叉編譯 OK。
- workflows/rag-ingest-direct:ask_llm(rag_extract_one)+ parse_card/post_block/post_triplet
(rag_ingest)拼成單一自足直鏈,繞開 R2 撈原稿與 Gitea 落卡。blocks/triplets 寫法與
rag_ingest 逐欄一致 → rag_chat 檢索得到。
- workflows/rag-takedown-direct:不含 __CARDS_PREFIX__ 閘的下架(rag_ingest removed 分支的
前綴閘會擋掉資料夾根的 direct 檔——2026-07-20 live e2e 實撞)。
dogfooding(D29 daemon 薄殼豁免)守住:daemon 只監看/讀檔/算 hash/HTTP POST,
萃取/切塊/RAG 全在 Arcrun workflow。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Xabu4T28MmQEiYDwT2KnKW
|
2026-07-20 11:15:21 +00:00 |
|
Leo
|
1c2fa6b294
|
ingest-hash-trigger SDD task 4:觸發鏈 Gitea webhook → collector sync 直打 named-webhook
- collector Go:trigger.go+sync 子命令(scan→R2 upload→POST collector-trigger.v1
→2xx 才 MarkIngested 回寫;失敗不回寫=下輪自然重試;上傳失敗事件不送、同路徑
renamed 連坐不回寫;防呆警告輪照送 warnings)。go test 19/19 綠(httptest mock)。
- workflow v3:rag-ingest-cards.local.yaml 改吃 collector payload(events[] 取代
commits[];原稿從 R2 撈 CF REST API objects/{r2_key};新增 renamed 分支=只更新
路徑映射 R5,跨界搬移轉 added/removed;removed 沿用 G9 雙判準;M3 recompute 尾鏈
原樣保留,fetch_index 改 R2);rag-ingest.yaml v1 同步等價改。source_uri 遷移
gitea://→kb://。schema_version!==1 整輪 no-op。
- push-demo-workflow.sh:補 __CF_ACCOUNT_ID__/__R2_BUCKET__/__CF_R2_TOKEN__ 佔位;
GITEA_* 標 deprecated-for-ingest(rag-extract* 仍用)。
- Gitea 退場(本 repo 範圍):legacy JS collector 六檔刪除(git 記錄可查);
install.sh 步驟 5 降級 deprecated;README 落「Gitea 退場切換 checklist」
(推 v3→collector sync 實測→拆 Gitea webhook→觀察期+回滾法)。
- 驗證:yaml parse(raw+sed 模擬)/flow-config 對齊/JS 語法 node --check/
demo cypher 唯讀 /cypher/search 編譯 missing=[]、出邊序如設計。
未部署、未實跑 e2e(推 demo=leo 閘)。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-19 21:58:39 +08:00 |
|
Leo
|
fdb7a67484
|
feat(ingest-hash-trigger): collector R2 content-addressed 原稿上傳(SDD task 3)
- collector upload 子命令=scan+把 added/modified 原稿傳 R2(CF REST API
Bearer token,key=raw/<sha256hex>,對齊 collector-trigger.v1 的 r2_key)
- 冪等:存在檢查命中=skipped_exists 不 PUT;CF API objects 端點不支援
HEAD(live 實測 405)→ 改 GET+Range: bytes=0-0
- 完整性:上傳前重算 hash 核對 key,不符=failed 不上傳
- 失敗語意:failed → exit 1,ingested_hash 不動=下輪自動重試;
回寫鉤子 Manifest.MarkIngested 留給 task 4
- 設定只走環境變數 CF_ACCOUNT_ID/CF_API_TOKEN/R2_BUCKET,不落 repo
- go test 14/14 綠(httptest mock 對齊真 API:HEAD 405);live e2e 全通
(arcrun-rag-raw-demo:真上傳→重傳 no-op→下載 diff 一致+sha256==key)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-19 21:27:42 +08:00 |
|
Leo
|
bb96bceb04
|
feat(ingest-hash-trigger): 凍結 collector/ingest schema+Go collector 骨架(issue #5, SDD task 1+2)
- schemas/collector-trigger.v1.schema.json:collector→named-webhook 觸發 payload(source_hash/r2_key/renamed/R6 warnings)
- schemas/kbdb-ingest-request.v1.schema.json:source_hash 必填缺=400;儲存映射走 metadata_json.$.source_hash(守 kbdb 表不變鐵律);同 hash 重送=200 already_ingested
- schemas/MIGRATION-webhook-payload.md:舊 Gitea push payload 逐欄對照(給 task 4 改寫 workflow)
- collector/:Go module(純 stdlib)——manifest 讀寫+mtime fast-path 掃描+renamed hash 配對+40% 大量刪除防呆;CLI collector scan
- go test ./... 全綠 7/7(added/modified/removed/renamed/防呆五情境+fast-path+manifest 往返)
- Node 版 collector 標 legacy 並存(SDD task 4 拆除)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-19 20:31:11 +08:00 |
|
Leo
|
eff30bd741
|
T4: Markitdown adapter——docx/pptx/pdf 轉檔 + 原檔進 assets/originals(design §4)
transform.js:MARKITDOWN_EXT(docx/pptx/pdf)走 markitdown CLI 子行程轉出 md,輸出路徑
副檔名換 .md;回傳 originalCopy 供 index.js 把原檔複製進 assets/originals/<相對路徑>。
git-sync.js:ensureGitAttributes() 啟動時冪等寫入 LFS 宣告(三種格式 filter=lfs)。
已驗(雲端 sandbox,兩輪煙測):用 python-docx 生真實 docx(含標題+段落)丟進 watch 資料夾,
collector 呼叫 markitdown 轉出真實 md 內容(人工核對與原檔一致)、原檔複製進
assets/originals/、.gitattributes 正確含三種格式 LFS 宣告、commit+push 送達 bare remote。
誠實邊界:sandbox 無 git-lfs 二進位,驗不到真實 LFS smudge/clean filter 生效(只驗到
.gitattributes 內容正確);真實 Gitea remote push/憑證、真實客戶檔案樣本仍待本機/客戶環境。
其餘格式(xlsx/圖片)不在第一波承諾範圍,仍誠實丟 NotImplementedError。
|
2026-07-07 21:13:13 +00:00 |
|
Leo
|
4ca94c17ca
|
T3: collector 骨架——watch→轉檔→git commit/push(design §4)
Node 單檔服務(非 arcrun workflow,跑客戶端機器):chokidar watch 事件驅動、debounce
合併批次 commit、.md passthrough(非 md 格式誠實丟 NotImplemented 待 T4 Markitdown)、
刪檔→target repo 移除對應檔(deprecated 標記留給 ingest workflow,collector 只管檔案鏡像)。
已驗(雲端 sandbox scratch 環境,非真實客戶環境):node --check 全過;起 scratch watch dir
+ scratch git repo + bare remote,實測 add/change/delete 三種事件皆正確偵測、debounce 正確
合併成一次 commit、git push 真的送達 remote(git log 驗證)、非 md 格式正確跳過並警告。
端到端待本機/客戶環境驗(README.md 已列):真實 NAS/VM watch、真實 Gitea remote+憑證、
Gitea push webhook 真觸發 ingest、systemd 常駐穩定性。
|
2026-07-07 21:08:21 +00:00 |
|