fix: исправление 6 пунктов из ревью

Critical:
- bridge: AutoGenPort=false по умолчанию, не генерируем secret если пустой
  → extension и bridge совпадают на port 9786 и empty secret
- bridgeConfig: убрана авто-генерация secret, убран secret из BridgeInfo

High:
- extension/background.js + extension-firefox/background.js:
  все chrome.* listeners вынесены в global scope (не внутри onInstalled/onStartup)
  → MV3 service worker корректно перезапускается
- UI: acceptBrowserEvent вызывает AcceptBrowserEvent, attachBrowserEvent вызывает
  AttachBrowserEventToNode (к текущему selectedNode), а не DismissBrowserEvent
- watcher: при Create проверяется isUnderVault(absPath, vaultRoot) —
  если файл уже в vault, используется AddExternal вместо CopyIntoVault
  → нет дублирования файлов с timestamp-суффиксом

Medium:
- bridge.Event: добавлено поле DeviceID, handleEvents обогащает events из batch.DeviceID
  → device_id сохраняется в DB как chrome-*/firefox-*, а не evt_*
- config: FileWatcher изменён на *bool — nil означает default true,
  false = явно выключено → старые config.json без поля file_watcher получают true
This commit is contained in:
2026-06-07 00:15:34 +08:00
parent b676ac675a
commit 1cc0c407b1
9 changed files with 142 additions and 137 deletions
+21 -5
View File
@@ -236,11 +236,20 @@ func (w *Watcher) handleEvent(rel, absPath string, ev fsnotify.Event) {
}
}
// New file — create record.
_, err = w.files.CopyIntoVault(node.ID, absPath, parentDir)
if err != nil {
log.Printf("[watcher] auto-add file %s: %v", rel, err)
return
// New file — check if it's already inside the vault.
// If absPath is under vaultRoot, don't copy — just create a record.
if isUnderVault(absPath, w.vaultRoot) {
_, err = w.files.AddExternal(node.ID, absPath)
if err != nil {
log.Printf("[watcher] auto-add in-vault file %s: %v", rel, err)
return
}
} else {
_, err = w.files.CopyIntoVault(node.ID, absPath, parentDir)
if err != nil {
log.Printf("[watcher] auto-add file %s: %v", rel, err)
return
}
}
w.logActivity(node.ID, activity.TypeFileAdded, fi.Name(), rel)
@@ -342,3 +351,10 @@ func hashFileFast(absPath string) (string, int64) {
}
return hex.EncodeToString(h.Sum(nil)), n
}
// isUnderVault reports whether absPath is inside vaultRoot.
func isUnderVault(absPath, vaultRoot string) bool {
absPath, _ = filepath.Abs(absPath)
vaultRoot, _ = filepath.Abs(vaultRoot)
return strings.HasPrefix(absPath, vaultRoot+string(filepath.Separator)) || absPath == vaultRoot
}