KB: skymirror
← All workspaces4101 results — page 7 of 83
| Title | Domain | Type | Severity | Source | Freshness | Updated |
|---|---|---|---|---|---|---|
| rclone connects to `localhost:{dynamic_port}` instead of direct host | skymirror/transfer | pattern | info | HANDOFF-021-260226-sftp-tunnel-management.md | 100 | 2026-02-26 |
|
Body:
rclone connects to `localhost:{dynamic_port}` instead of direct host
|
||||||
| Tunnels reused via `ps aux` process check + `fsockopen` port verification | general | pattern | info | HANDOFF-021-260226-sftp-tunnel-management.md | 100 | 2026-02-26 |
|
Body:
Tunnels reused via `ps aux` process check + `fsockopen` port verification
|
||||||
| `SftpService::resolveConnectionTarget()` transparently creates tunnel when in... | general | pattern | info | HANDOFF-021-260226-sftp-tunnel-management.md | 100 | 2026-02-26 |
|
Body:
`SftpService::resolveConnectionTarget()` transparently creates tunnel when internal host is set
|
||||||
| Per-account `sftp_internal_host` = IP behind the proxy | general | pattern | info | HANDOFF-021-260226-sftp-tunnel-management.md | 100 | 2026-02-26 |
|
Body:
Per-account `sftp_internal_host` = IP behind the proxy
|
||||||
| Global proxy config stored in `app_settings` (host, port, user, key_path) | general | pattern | info | HANDOFF-021-260226-sftp-tunnel-management.md | 100 | 2026-02-26 |
|
Body:
Global proxy config stored in `app_settings` (host, port, user, key_path)
|
||||||
| 2 migrations: `app_settings` table + `sftp_internal_host`/`sftp_internal_port... | general | pattern | info | HANDOFF-021-260226-sftp-tunnel-management.md | 100 | 2026-02-26 |
|
Body:
2 migrations: `app_settings` table + `sftp_internal_host`/`sftp_internal_port` columns
|
||||||
| `app/Models/AppSetting.php` — Global key-value settings model | general | pattern | info | HANDOFF-021-260226-sftp-tunnel-management.md | 100 | 2026-02-26 |
|
Body:
`app/Models/AppSetting.php` — Global key-value settings model
|
||||||
| `app/Services/Sftp/SshTunnelService.php` — Tunnel lifecycle management (port ... | general | pattern | info | HANDOFF-021-260226-sftp-tunnel-management.md | 100 | 2026-02-26 |
|
Body:
`app/Services/Sftp/SshTunnelService.php` — Tunnel lifecycle management (port range 22000-22999)
|
||||||
| TransferStats DTO:: Added `lastError` field for error recovery from stats. | skymirror/transfer | pattern | info | HANDOFF-022-260226-sftp-file-transfer-fixes.md | 100 | 2026-02-26 |
|
Body:
**TransferStats DTO:** Added `lastError` field for error recovery from stats.
|
||||||
| Retry limit:: Max 6 retries (~60s) before marking as `Failed` with "rclone jo... | skymirror/transfer | pattern | info | HANDOFF-022-260226-sftp-file-transfer-fixes.md | 100 | 2026-02-26 |
|
Body:
**Retry limit:** Max 6 retries (~60s) before marking as `Failed` with "rclone job lost" message.
|
||||||
| Stats fallback:: When `getJobStatus()` fails, check `core/stats` (which persi... | skymirror/transfer | pattern | info | HANDOFF-022-260226-sftp-file-transfer-fixes.md | 100 | 2026-02-26 |
|
Body:
**Stats fallback:** When `getJobStatus()` fails, check `core/stats` (which persists longer). If stats show errors or transfers, determine final state from stats.
|
||||||
| `Toolbar.vue`: Small green terminal icon in account dropdown for SFTP accounts | general | pattern | info | HANDOFF-022-260226-sftp-file-transfer-fixes.md | 100 | 2026-02-26 |
|
Body:
`Toolbar.vue`: Small green terminal icon in account dropdown for SFTP accounts
|
||||||
| `FilePanel.vue`: Green `>_ SFTP` badge in panel header when account has verif... | general | pattern | info | HANDOFF-022-260226-sftp-file-transfer-fixes.md | 100 | 2026-02-26 |
|
Body:
`FilePanel.vue`: Green `>_ SFTP` badge in panel header when account has verified SFTP
|
||||||
| `Account.ts`: Added `sftp_verified: boolean` to TypeScript interface | general | pattern | info | HANDOFF-022-260226-sftp-file-transfer-fixes.md | 100 | 2026-02-26 |
|
Body:
`Account.ts`: Added `sftp_verified: boolean` to TypeScript interface
|
||||||
| `FileManagerController.php`: Added `sftp_verified` boolean to account data (b... | general | pattern | info | HANDOFF-022-260226-sftp-file-transfer-fixes.md | 100 | 2026-02-26 |
|
Body:
`FileManagerController.php`: Added `sftp_verified` boolean to account data (based on `sftp_connection_verified_at`)
|
||||||
| Sluttilstand | skymirror/transfer | pattern | info | HANDOFF-020-260225-file-manager-dev21.md | 100 | 2026-02-25 |
|
Body:
| Fil | Status |
|-----|--------|
| `app/Http/Controllers/FileBrowserController.php` | Committed: drive_not_found + source_is_empty |
| `resources/js/helpers/api.js` | Committed: responseData on Error |
| `resources/js/shared/api/routes.ts` | Committed: AccountRoutes.destroy |
| `resources/js/vue/api/browse.ts` | Committed: DriveNotFoundError class |
| `resources/js/vue/components/FilePanel.vue` | Committed: banner + cache bypass + files-refreshed |
| `resources/js/vue/composables/useSyncComp...
|
||||||
| Neste LLM-instruksjon | skymirror/transfer | pattern | info | HANDOFF-020-260225-file-manager-dev21.md | 100 | 2026-02-25 |
|
Body:
### Approved plan: Auto-verify + Settings modal + kebab cleanup
**Plan file:** `/home/heine/.claude/plans/reactive-petting-yeti.md`
**Summary:**
1. **Auto-verify**: In Alpine `accountCard.init()`, call `verify()` instead of `fetchStatus()`. Add `setInterval` for 5-minute periodic re-verify.
2. **Remove Verify** from kebab menu (both full and compact cards) — no longer needed.
3. **Add Settings** menu item → opens new per-account settings modal.
4. **New `_settings-modal.blade.php`**: Fields ...
|
||||||
| Uncommitted Changes (NOT mine) | general | pattern | info | HANDOFF-020-260225-file-manager-dev21.md | 100 | 2026-02-25 |
|
Body:
3 PHP files have uncommitted changes from another session (SFTP/MP-0004 related):
- `app/Http/Controllers/CloudAccountController.php`
- `app/Services/Sftp/SftpConfigDTO.php`
- `app/Services/Sftp/SftpService.php`
**Do NOT commit these without reviewing.**
---
|
||||||
| Feature 5 — Account card kebab menu (f9cf1c3, f326f52) | skymirror/transfer | pattern | info | HANDOFF-020-260225-file-manager-dev21.md | 100 | 2026-02-25 |
|
Body:
**What:** Replaced scattered action buttons (verify, SFTP, delete) on full account cards with single ⋮ kebab dropdown menu.
### Menu items
| Item | Icon | Condition |
|------|------|-----------|
| Verify | `fa-arrows-rotate` | All accounts |
| SFTP | `fa-terminal` | Nextcloud only (not group folders), ON badge if enabled |
| Remove account | `fa-trash-can` | All accounts (red, with confirm) |
- Alpine.js `menuOpen` state added to `accountCard` component
- `@click.outside="menuOpen = false"`...
|
||||||
| Feature 4 — Empty-source compare optimization (2d14934) | skymirror/transfer | pattern | info | HANDOFF-020-260225-file-manager-dev21.md | 100 | 2026-02-25 |
|
Body:
**Problem:** When source panel showed 0 items, `compareDeep` still ran `listRecursiveParallel` (both sides) — slow.
### Fix
- **Frontend** (`App.vue`): Sends `source_is_empty: true` hint when `sourceStore.flattenedEntries.length === 0`
- **`useSyncComparison.ts`**: Forwards `source_is_empty` parameter to API
- **Backend** (`FileBrowserController::compareDeep()`): If `source_is_empty=true`, sets `$srcRaw = []` and only calls `listRecursive()` on destination side
---
|
||||||
| Feature 3 — Auto-rerun compare after refresh (3d76550) | general | pattern | info | HANDOFF-020-260225-file-manager-dev21.md | 100 | 2026-02-25 |
|
Body:
**Problem:** After ⟳ refresh, compare results stayed stale because `lastAutoCompareKey` was unchanged → compare skipped.
### Fix
- `FilePanel.vue`: New `'files-refreshed'` event emitted after `skipCache=true` load succeeds
- `App.vue`: `onPanelForceRefreshed()` resets `lastAutoCompareKey = ''` and calls `runCompare(true, true)` (force + silent)
---
|
||||||
| Feature 2 — Toolbar refresh cache bypass (9fedc64) | general | pattern | info | HANDOFF-020-260225-file-manager-dev21.md | 100 | 2026-02-25 |
|
Body:
**Problem:** ⟳ button called `loadEntries()` without `skipCache=true`, so frontend IndexedDB cache (5-min TTL) was still served.
### Fix
- Toolbar `@refresh` → `loadEntries(true)` (skipCache=true)
- Context menu refresh → same
- `loadEntries(true)` calls `invalidateAccount(accountId)` to nuke entire account's IndexedDB cache before fetching
- Import `invalidateAccount` from `useCache.ts` composable
---
|
||||||
| Feature 1 — Detect deleted shared drives (b8cdc86, 3a550ff) | skymirror/transfer | pattern | info | HANDOFF-020-260225-file-manager-dev21.md | 100 | 2026-02-25 |
|
Body:
**Problem:** Shared drive "Design" (0AFMafzlrdIUMUk9PVA) was deleted from Google but still appeared in File Manager, causing rclone 404 error.
### Architecture
- **Backend** (`FileBrowserController::list()`): Detects `notFound` / `drive not found` in ExternalServiceException → returns HTTP 410 with `error_code: 'drive_not_found'`
- **`api.js`**: Attaches `responseData` (parsed JSON) to thrown Error objects for structured error handling
- **`browse.ts`**: `DriveNotFoundError` class thrown whe...
|
||||||
| Commits (denne sesjonen) | skymirror/transfer | pattern | info | HANDOFF-020-260225-file-manager-dev21.md | 100 | 2026-02-25 |
|
Body:
| Hash | Type | Beskrivelse |
|------|------|-------------|
| `b8cdc86` | feat | Detect deleted shared drives → drive_not_found banner + remove button |
| `3a550ff` | fix | Drive-not-found banner contrast (dark text on cream bg, solid red btn) |
| `9fedc64` | fix | Toolbar ⟳ refresh bypasses frontend cache + invalidates account cache |
| `3d76550` | feat | Auto-rerun compare after forced panel refresh (files-refreshed event) |
| `2d14934` | perf | Skip source recursive listing when source pan...
|
||||||
| Status | general | pattern | info | HANDOFF-020-260225-file-manager-dev21.md | 100 | 2026-02-25 |
|
Body:
**IN PROGRESS** — Plan approved but not yet implemented for auto-verify + settings modal.
|
||||||
| Neste LLM-instruksjon | general | pattern | info | HANDOFF-019-260225-file-manager-dev20.md | 100 | 2026-02-25 |
|
Body:
Ingen aktiv oppgave. Mulige kandidater:
- MP-0004 SFTP Nextcloud er masterplannet og reviewet (grade A) — klar for implementering
- Ytterligere UX-polish på File Manager
|
||||||
| Sluttilstand | skymirror/transfer | pattern | info | HANDOFF-019-260225-file-manager-dev20.md | 100 | 2026-02-25 |
|
Body:
| Fil | Endring |
|-----|---------|
| `app/Jobs/IndexAccountJob.php` | Per-konto interval |
| `app/Models/CloudAccount.php` | index_interval kolonne |
| `database/migrations/..._add_index_interval_to_cloud_accounts.php` | Migration |
| `routes/api.php` | Settings-endepunkter |
| `resources/js/shared/api/routes.ts` | SettingsRoutes |
| `resources/js/vue/stores/settingsStore.ts` | indexInterval + API-sync |
| `resources/js/vue/components/modals/OptionsModal.vue` | Interval-dropdown |
| `resourc...
|
||||||
| Fix 4 — Dropdown hover manglet overalt (ac6da34) | general | incident | medium | HANDOFF-019-260225-file-manager-dev20.md | 100 | 2026-02-25 |
|
Body:
**Root cause:** `--color-surface-hover` og `--color-surface-active` var aldri definert i `app.css`. Alle komponenter brukte fallback (`rgba(128,128,128,0.12)`) som var usynlig.
**Fix:** Lagt til i `:root` og `.dark` i `app.css`:
- Lys: `rgba(0,0,0,0.06)` / `rgba(0,0,0,0.10)`
- Mørk: `rgba(255,255,255,0.08)` / `rgba(255,255,255,0.14)`
Fikser hover på: konto-dropdown, kebab-meny, context-meny, breadcrumbs, kolonneoverskrifter, filrader — **alle** komponenter som brukte variabelen.
---
|
||||||
| Feature 3 — Golden synced badge (98ef038 → a1244d1) | skymirror/transfer | pattern | info | HANDOFF-019-260225-file-manager-dev20.md | 100 | 2026-02-25 |
|
Body:
**Trigger:** "Hvis 100% match fra source til destination, vil ha et golden badge"
### Logikk (`FilePanel.vue`)
```typescript
const INCOMPLETE_STATUSES = new Set(['source_only', 'mismatch', 'partial_match', 'partial_match_elsewhere']);
const isFullySynced = computed(() => {
if (props.panelId !== 'source') return false;
if (syncStatuses.value.size === 0) return false;
for (const status of syncStatuses.value.values()) {
if (INCOMPLETE_STATUSES.has(status)) return false;
}
return t...
|
||||||
| Feature 2 — Delayed dest refresh + empty folder sync (9d5f4c1) | skymirror/transfer | pattern | info | HANDOFF-019-260225-file-manager-dev20.md | 100 | 2026-02-25 |
|
Body:
**Trigger:** Forhåndsliggende endringer fra bruker (ikke commitet da)
- **App.vue:** `destRefreshTrigger++` 8 sekunder etter transfer for `emptySource`/`allExist` — gir metadata-cache tid til å oppdatere
- **FilePanel.vue:** Empty folder som finnes på begge sider → `'match'` status via `otherDirNames` Set
---
|
||||||
| Feature 1 — Konfigurerbar auto-reindeksering (a6260be) | skymirror/scheduling | pattern | info | HANDOFF-019-260225-file-manager-dev20.md | 100 | 2026-02-25 |
|
Body:
**Trigger:** "Denne re-indekserer automatisk hvert 30. minutt, må kunne parameterstyres fra alternativer modalen"
### Arkitektur
- **Migration:** `cloud_accounts.index_interval` (nullable uint) — per-konto intervall
- **Model:** `CloudAccount` — `$fillable`, `$casts`, PHPDoc oppdatert
- **Job:** `IndexAccountJob::handle()` — leser `$account->index_interval ?? config('rclone.index_interval')`. Verdi `0` = disabled (ingen reschedule)
- **API:** `GET /api/settings/index-interval` + `PATCH /api/...
|
||||||
| Commits (denne sesjonen) | skymirror/transfer | pattern | info | HANDOFF-019-260225-file-manager-dev20.md | 100 | 2026-02-25 |
|
Body:
| Hash | Type | Beskrivelse |
|------|------|-------------|
| `a6260be` | feat | Configurable auto-reindex interval from Options modal |
| `9d5f4c1` | fix | Delayed dest refresh after transfer + empty folder sync match |
| `98ef038` | feat | Golden synced badge when all source files are in destination |
| `6a30464` | feat | Enhanced gold badge — shimmer + sparkle animations |
| `8cc35ea` | fix | True gold colors (#FFD700), less orange |
| `ac6da34` | fix | Define --color-surface-hover/active ...
|
||||||
| Status | general | pattern | info | HANDOFF-019-260225-file-manager-dev20.md | 100 | 2026-02-25 |
|
Body:
**DONE** — 4 features/fixes implementert, testet av bruker, commitet og pushet.
|
||||||
| Files Modified | general | pattern | info | HANDOFF-030-260227-prefetchboost-initialstate.md | 100 | 2026-02-27 |
|
Body:
```
nc-apps/prefetchboost/lib/Listener/LoadAdditionalListener.php
nc-apps/prefetchboost/js/prefetcher.js
nc-apps/prefetchboost/appinfo/info.xml
```
|
||||||
| Next LLM Instruction | general | pattern | info | HANDOFF-030-260227-prefetchboost-initialstate.md | 100 | 2026-02-27 |
|
Body:
1. Update expert files: prefetchboost v1.1, nextcloud-nativja v1.6
2. Load: `coordination/experts/05-operations/prefetchboost/EXPERT-prefetchboost-v1.0-20260227.md`
3. New gotchas to document:
- NC32 Files uses `window.fetch` for PROPFIND, not axios/XHR
- `passthrough: 0` is normal when pre-seed is active (no live PROPFIND to cache)
- `IInitialStateService` (deprecated service) vs `IInitialState` (DI-scoped) distinction
---
|
||||||
| Known Risks | skymirror/transfer | pattern | info | HANDOFF-030-260227-prefetchboost-initialstate.md | 100 | 2026-02-27 |
|
Body:
- `IInitialStateService` deprecated in NC32 — if removed, switch to `IInitialState` (DI-scoped)
- Only root `/` is pre-seeded; subfolder navigation still hits live WebDAV (passthrough cache handles cycle 2)
- Very large root directories (1000+ files) may slow `getDirectoryListing()` marginally
---
|
||||||
| Verification Result — CONFIRMED ✅ | general | pattern | info | HANDOFF-030-260227-prefetchboost-initialstate.md | 100 | 2026-02-27 |
|
Body:
Browser DevTools Console (nc.nativja.no, session #7):
```
[PrefetchBoost] Pre-seeded PROPFIND cache: 20 items for admin
[PrefetchBoost] fetch Cache HIT: PROPFIND /remote.php/dav/files/admin/
[PrefetchBoost] XHR Cache HIT (inflight-GET-recommendations): ...
[PrefetchBoost] XHR Cache HIT (inflight-GET-user_status): ...
[PrefetchBoost] XHR Cache HIT (GET-notifications): ...
[PrefetchBoost] Stats: {"hits":4,"prefetched":5,"passthrough":0,"preSeeded":1}
```
**Key finding:** NC32 Files uses `wind...
|
||||||
| Deploy Performed | general | pattern | info | HANDOFF-030-260227-prefetchboost-initialstate.md | 100 | 2026-02-27 |
|
Body:
1. SCP to nativja via tunnel (port 22110)
2. `docker cp` to `nextcloud-aio-nextcloud:/var/www/html/custom_apps/`
3. `chown -R www-data:www-data` applied
4. `php occ upgrade` ran: "Updated prefetchboost to 0.4.0" confirmed
5. PHP-FPM OPcache reloaded via `kill -USR2 168` (master PID inside container)
---
|
||||||
| Timing Impact (Expected) | general | pattern | info | HANDOFF-030-260227-prefetchboost-initialstate.md | 100 | 2026-02-27 |
|
Body:
```
Before v0.4.0:
0.0s GET /apps/files/files
0.6s HTML received
2.5s JS parsed, Vue mounts
2.5s Vue sends PROPFIND → live network → ~211ms
2.7s Files rendered
After v0.4.0:
0.0s GET /apps/files/files
0.6s HTML received (with initial-state-prefetchboost-fileList embedded)
0.6s prefetcher.js runs → pre-seeds PROPFIND cache instantly
2.5s JS parsed, Vue mounts
2.5s Vue sends PROPFIND → XHR CACHE HIT → 0ms
2.5s Files rendered (saved ~211ms)
```
---
|
||||||
| What Changed | general | pattern | info | HANDOFF-030-260227-prefetchboost-initialstate.md | 100 | 2026-02-27 |
|
Body:
### nc-apps/prefetchboost/lib/Listener/LoadAdditionalListener.php
Refactored from a zero-dependency no-op into a fully DI-wired listener:
- Added constructor with `IUserSession`, `IRootFolder`, `IInitialStateService`
- `injectFileList()` fetches `getUserFolder()->getDirectoryListing()` (1.3ms warm)
- Builds JSON payload: `{ userId, root: {...}, files: [...] }`
- Injects as `initial-state-prefetchboost-fileList` hidden input in HTML
- Wrapped in `try/catch` — failure is non-fatal, Files app ...
|
||||||
| Summary | general | pattern | info | HANDOFF-030-260227-prefetchboost-initialstate.md | 100 | 2026-02-27 |
|
Body:
Implemented Approach B for PrefetchBoost: server-side file list injection via
`IInitialState`, enabling 0ms PROPFIND response for cycle 1 before Vue mounts.
---
|
||||||
| Phase 3 (Agent Enhancement): Add native frontmatter fields to agent files + deduplicate shared co… | skymirror | lesson | medium | MASTERPLAN.md | 97 | 2026-03-20T02:00:42Z |
|
Body:
nt
|
||||||
| Phase 2 (Commands to Skills): Convert 30 commands to `.claude/skills/` format | skymirror | lesson | medium | MASTERPLAN.md | 97 | 2026-03-20T02:00:42Z |
|
Body:
|
||||||
| Phase 1 (Hooks): Add 2 new automation hooks -- zero risk, additive only | skymirror | lesson | medium | MASTERPLAN.md | 97 | 2026-03-20T02:00:42Z |
|
Body:
|
||||||
| **Three phases, designed for parallel Sonnet agent execution:** | skymirror | lesson | medium | MASTERPLAN.md | 97 | 2026-03-20T02:00:42Z |
|
Body:
|
||||||
| Migrate Skymirror's custom orchestration infrastructure to leverage Claude Code's native Skills,… | skymirror | lesson | medium | MASTERPLAN.md | 97 | 2026-03-20T02:00:42Z |
|
Body:
ks, and Sub-agent frontmatter. This eliminates ~60% content duplication across 30 commands and 23 agents, automates cache invalidation and Vite builds via hooks, and adds real tool enforcement via native frontmatter fields.
|
||||||
| Account card UI shows SFTP badge when configured + settings modal for SFTP config | skymirror | lesson | medium | MASTERPLAN.md | 97 | 2026-03-20T02:00:42Z |
|
Body:
|
||||||
| TransferController/MonitorTransferJob modified to choose SFTP vs WebDAV based on account config | skymirror | lesson | medium | MASTERPLAN.md | 97 | 2026-03-20T02:00:42Z |
|
Body:
|
||||||
| `occ files:scan` runs as a separate queued job after transfer completion | skymirror | lesson | medium | MASTERPLAN.md | 97 | 2026-03-20T02:00:42Z |
|
Body:
|
||||||
| SSH key files stored at `/var/www/.config/skymirror/ssh-keys/` with 600 permissions | skymirror | lesson | medium | MASTERPLAN.md | 97 | 2026-03-20T02:00:42Z |
|
Body:
|
||||||
Ingestion History
Loading…