gps-plus-slam-app-framework 1.3.0 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/absolute-orientation-CAEh840t.d.ts +54 -0
- package/dist/{app-selectors-B8VQoMDY.d.ts → app-selectors-ikTUQZpe.d.ts} +1 -1
- package/dist/ar/bresenham3d.d.ts +1 -1
- package/dist/ar/camera-blit-capture.d.ts +2 -2
- package/dist/ar/camera-blit-capture.js +74 -9
- package/dist/ar/capability-checker.d.ts +1 -1
- package/dist/ar/capture-failure-tracker.d.ts +1 -1
- package/dist/ar/chromium-camera-access-workaround.d.ts +1 -1
- package/dist/ar/depth-grid-lookup.d.ts +2 -0
- package/dist/ar/depth-grid-lookup.js +43 -0
- package/dist/ar/depth-sampler.d.ts +2 -2
- package/dist/ar/depth-sampler.js +2 -4
- package/dist/ar/depth-unprojection.d.ts +1 -1
- package/dist/ar/enable-gps-ar.d.ts +1 -1
- package/dist/ar/enable-gps-ar.js +26 -1
- package/dist/ar/frame-loop.d.ts +1 -1
- package/dist/ar/image-capture.d.ts +2 -2
- package/dist/ar/image-capture.js +1 -154
- package/dist/ar/image-quality.d.ts +2 -0
- package/dist/ar/image-quality.js +168 -0
- package/dist/ar/index.d.ts +31 -19
- package/dist/ar/index.js +17 -5
- package/dist/ar/occupancy-grid.d.ts +1 -1
- package/dist/ar/occupancy-grid.js +29 -2
- package/dist/ar/planar-pnp.d.ts +2 -0
- package/dist/ar/planar-pnp.js +425 -0
- package/dist/ar/qr-debug-view.d.ts +2 -0
- package/dist/ar/qr-debug-view.js +89 -0
- package/dist/ar/qr-derived-pose.d.ts +2 -0
- package/dist/ar/qr-derived-pose.js +114 -0
- package/dist/ar/qr-detection-controller.d.ts +2 -0
- package/dist/ar/qr-detection-controller.js +2 -0
- package/dist/ar/qr-frontend.d.ts +2 -0
- package/dist/ar/qr-frontend.js +60 -0
- package/dist/ar/qr-pose.d.ts +2 -0
- package/dist/ar/qr-pose.js +267 -0
- package/dist/ar/qr-size-depth-context.d.ts +3 -0
- package/dist/ar/qr-size-depth-context.js +42 -0
- package/dist/ar/qr-size-measurer.d.ts +2 -0
- package/dist/ar/qr-size-measurer.js +2 -0
- package/dist/ar/replay-scene.d.ts +1 -1
- package/dist/ar/replay-scene.js +1 -1
- package/dist/ar/scene-node-names.d.ts +1 -1
- package/dist/ar/webxr-nue-basis.d.ts +1 -1
- package/dist/ar/webxr-session.d.ts +4 -4
- package/dist/ar/webxr-session.js +2 -2
- package/dist/ar/xr-camera-texture.d.ts +1 -1
- package/dist/ar/xr-error-handler.d.ts +1 -1
- package/dist/ar/xr-frame-loop.d.ts +1 -1
- package/dist/ar-MFpFlV7j.js +382 -0
- package/dist/{ar-world-group-alignment-C9lwwIyI.d.ts → ar-world-group-alignment-69fgnB39.d.ts} +1 -1
- package/dist/{camera-blit-capture-CnxUDbKx.d.ts → camera-blit-capture-NKT9H5-e.d.ts} +57 -4
- package/dist/capture-motion-gate-0Yl2NpQG.d.ts +24 -0
- package/dist/capture-motion-gate-4EscNZCw.js +94 -0
- package/dist/concurrency-By0oOTZt.d.ts +50 -0
- package/dist/core/index.d.ts +2 -2
- package/dist/core/index.js +2 -2
- package/dist/create-slam-app-store-DkCHOpvb.js +149 -0
- package/dist/{create-slam-app-store-BljusOua.d.ts → create-slam-app-store-n_VF63D5.d.ts} +50 -40
- package/dist/depth-grid-lookup-DQ-IYhO3.d.ts +21 -0
- package/dist/{depth-sampler-Bhanfwla.d.ts → depth-sampler-asc8exHt.d.ts} +1 -1
- package/dist/{depth-unprojection-Y6i_mJuT.d.ts → depth-unprojection-DjsbJW9L.d.ts} +1 -1
- package/dist/{enable-gps-ar-BfUJOgpW.d.ts → enable-gps-ar-DkNhFv4Y.d.ts} +4 -4
- package/dist/{frame-conversions-BfsafGWR.d.ts → frame-conversions-DObhj8Wf.d.ts} +1 -1
- package/dist/{fused-path-DJoVu98b.d.ts → fused-path-v6eOmLl3.d.ts} +1 -1
- package/dist/geo/h3-proximity.d.ts +2 -2
- package/dist/geo/h3-proximity.js +61 -2
- package/dist/geo/index.d.ts +2 -2
- package/dist/geo/index.js +2 -2
- package/dist/geodesic-angle-BTldfFgs.js +39 -0
- package/dist/{gps-anchor-dYeCvvp5.d.ts → gps-anchor-BeFO2RYa.d.ts} +1 -1
- package/dist/{gps-ar-pose-sampler-DVb96iOy.d.ts → gps-ar-pose-sampler-DHMZmYAc.d.ts} +1 -1
- package/dist/{gps-event-coordinator-CWIDOk4U.d.ts → gps-event-coordinator-CjWW636x.d.ts} +21 -11
- package/dist/{gps-event-markers-Dc9FT-q1.d.ts → gps-event-markers-Cz9RMA2k.d.ts} +18 -0
- package/dist/{h3-proximity-I1msGPgE.d.ts → h3-proximity-C-j0pw1j.d.ts} +39 -1
- package/dist/image-capture-B2-b6tKK.js +374 -0
- package/dist/{image-capture-qAZ5Fh5X.d.ts → image-capture-CNZDrQXG.d.ts} +103 -3
- package/dist/image-quality-smCBoFj1.d.ts +158 -0
- package/dist/index-BAPokxMb.d.ts +22 -0
- package/dist/{index-BYYUdf9v.d.ts → index-BODDUTvD.d.ts} +1 -1
- package/dist/index-BneSj4_5.d.ts +399 -0
- package/dist/index-_Rhgoqkh.d.ts +2 -0
- package/dist/index.d.ts +80 -67
- package/dist/index.js +24 -12
- package/dist/{leaflet-map-overlay-6CJC-E1l.d.ts → leaflet-map-overlay-CmIyiE8n.d.ts} +1 -1
- package/dist/{map-data-CkloBxIl.d.ts → map-data-B4oEehUh.d.ts} +1 -1
- package/dist/{map-overlay-draw-krOKwDAq.d.ts → map-overlay-draw-ymz1s7fG.d.ts} +1 -1
- package/dist/{null-storage-backend-uKQE8tl7.d.ts → null-storage-backend-B9rtyDfG.d.ts} +2 -2
- package/dist/{occupancy-grid-BRNRaPyT.d.ts → occupancy-grid-DnOc-6PU.d.ts} +12 -2
- package/dist/{opfs-storage-D5zAn_lx.d.ts → opfs-storage-3VZh-qH6.d.ts} +23 -4
- package/dist/{opfs-storage-backend-6aYMUZlJ.d.ts → opfs-storage-backend-JJiUJo-3.d.ts} +3 -3
- package/dist/{persistence-middleware-B9ei4Nhx.d.ts → persistence-middleware-DAPTTwB2.d.ts} +1 -1
- package/dist/planar-pnp-my9bqULS.d.ts +67 -0
- package/dist/qr-debug-view-Brl73HGO.d.ts +29 -0
- package/dist/qr-derived-pose-CmxTP2m4.d.ts +122 -0
- package/dist/qr-detected-slice-VQssZmQJ.d.ts +166 -0
- package/dist/qr-detection-controller-B-tLVd-S.js +119 -0
- package/dist/qr-detection-controller-CDurHv8E.d.ts +48 -0
- package/dist/qr-frontend--fFX25mV.d.ts +58 -0
- package/dist/qr-pose-D2rfu5DA.d.ts +138 -0
- package/dist/qr-pose-aggregation-B7tWJq7j.d.ts +90 -0
- package/dist/qr-pose-aggregation-DBiaLW0O.js +191 -0
- package/dist/qr-size-depth-context-CeAG53fy.d.ts +13 -0
- package/dist/qr-size-measurer-DLb33geH.js +596 -0
- package/dist/qr-size-measurer-DQdAsid1.d.ts +165 -0
- package/dist/recording-options-BPCpMHLK.d.ts +514 -0
- package/dist/{recording-replayer-r0DZ9ALp.d.ts → recording-replayer-DQKpAGyQ.d.ts} +2 -2
- package/dist/recording-slice-DaxHZvNu.d.ts +55 -0
- package/dist/{replay-engine-XpDa0dy1.d.ts → replay-engine-CmKh_4wf.d.ts} +7 -4
- package/dist/{replay-scene-Bw58VL6p.d.ts → replay-scene-DBlDrV_x.d.ts} +3 -3
- package/dist/sensors/absolute-orientation.d.ts +2 -0
- package/dist/sensors/absolute-orientation.js +145 -0
- package/dist/sensors/gps-error-handler.d.ts +1 -1
- package/dist/sensors/gps.d.ts +1 -1
- package/dist/sensors/index.d.ts +5 -4
- package/dist/sensors/index.js +2 -1
- package/dist/sensors/permission-checker.d.ts +1 -1
- package/dist/sensors/permission-checker.js +1 -1
- package/dist/state/app-selectors.d.ts +1 -1
- package/dist/state/combined-root-state.d.ts +1 -1
- package/dist/state/create-slam-app-store.d.ts +1 -1
- package/dist/state/create-slam-app-store.js +1 -74
- package/dist/state/gps-ar-pose-sampler.d.ts +3 -3
- package/dist/state/gps-event-coordinator.d.ts +2 -2
- package/dist/state/gps-event-coordinator.js +27 -17
- package/dist/state/index.d.ts +20 -17
- package/dist/state/index.js +5 -4
- package/dist/state/persistence-middleware.d.ts +1 -1
- package/dist/state/persistence-middleware.js +30 -19
- package/dist/state/qr-detected-slice.d.ts +4 -0
- package/dist/state/qr-detected-slice.js +311 -0
- package/dist/state/recording-options.d.ts +2 -2
- package/dist/state/recording-options.js +273 -7
- package/dist/state/recording-replayer.d.ts +2 -2
- package/dist/state/recording-replayer.js +1 -1
- package/dist/state/recording-slice.d.ts +1 -1
- package/dist/state/recording-slice.js +5 -1
- package/dist/state/replay-engine.d.ts +1 -1
- package/dist/state/replay-engine.js +7 -3
- package/dist/state/store-subscribers.d.ts +2 -2
- package/dist/state/subscribe-to-selector.d.ts +1 -1
- package/dist/state/tracking-quality.d.ts +2 -2
- package/dist/state/tracking-quality.js +40 -128
- package/dist/state/tracking-slice.d.ts +1 -1
- package/dist/{state-BkIfpiyA.js → state-E51QT_-j.js} +2 -1
- package/dist/storage/file-system-utils.d.ts +1 -1
- package/dist/storage/index.d.ts +9 -9
- package/dist/storage/index.js +4 -4
- package/dist/storage/null-storage-backend.d.ts +1 -1
- package/dist/storage/opfs-storage-backend.d.ts +1 -1
- package/dist/storage/opfs-storage-backend.js +3 -3
- package/dist/storage/opfs-storage.d.ts +1 -1
- package/dist/storage/opfs-storage.js +5 -4
- package/dist/storage/storage-backend.d.ts +1 -1
- package/dist/storage/zip-coverage-embed.d.ts +2 -0
- package/dist/storage/zip-coverage-embed.js +88 -0
- package/dist/storage/zip-export.d.ts +2 -2
- package/dist/storage/zip-export.js +37 -59
- package/dist/storage/zip-reader.d.ts +1 -1
- package/dist/{storage-backend-Do6YDpNo.d.ts → storage-backend-BdVLD0dU.d.ts} +1 -1
- package/dist/{store-subscribers-0YWyOLvV.d.ts → store-subscribers-CA6AJH_8.d.ts} +2 -2
- package/dist/{subscribe-to-selector-CZ6k1NFP.d.ts → subscribe-to-selector-B6EUmQ3I.d.ts} +1 -1
- package/dist/test-utils/browser-mocks.d.ts +7 -1
- package/dist/test-utils/browser-mocks.js +6 -0
- package/dist/test-utils/zip-round-trip-helpers.d.ts +9 -1
- package/dist/test-utils/zip-round-trip-helpers.js +5 -1
- package/dist/{tracking-slice-CdK8c-8P.d.ts → tracking-slice-BuAZxXZ5.d.ts} +1 -1
- package/dist/types/ar-types.d.ts +1 -1
- package/dist/types/geo-types.d.ts +1 -1
- package/dist/types/index.d.ts +2 -2
- package/dist/utils/concurrency.d.ts +2 -2
- package/dist/utils/concurrency.js +66 -2
- package/dist/utils/failure-tracker.d.ts +1 -1
- package/dist/utils/format-file-size.d.ts +1 -1
- package/dist/utils/fused-path.d.ts +1 -1
- package/dist/utils/index.d.ts +8 -7
- package/dist/utils/index.js +2 -1
- package/dist/utils/list-formatter.d.ts +1 -1
- package/dist/utils/logger.d.ts +1 -1
- package/dist/visualization/accuracy-circles.d.ts +1 -1
- package/dist/visualization/alignment-lerper.d.ts +1 -1
- package/dist/visualization/ar-world-group-alignment.d.ts +1 -1
- package/dist/visualization/ar-world-group-alignment.js +1 -1
- package/dist/visualization/camera-follower.d.ts +1 -1
- package/dist/visualization/css3d-renderer-manager.d.ts +1 -1
- package/dist/visualization/frame-conversions.d.ts +1 -1
- package/dist/visualization/frustum-visibility.d.ts +1 -1
- package/dist/visualization/gps-anchor.d.ts +1 -1
- package/dist/visualization/gps-compass-cubes.d.ts +1 -1
- package/dist/visualization/gps-event-markers.d.ts +1 -1
- package/dist/visualization/gps-event-markers.js +40 -5
- package/dist/visualization/hit-test-reticle.d.ts +1 -1
- package/dist/visualization/hit-test-reticle.js +1 -0
- package/dist/visualization/index.d.ts +18 -18
- package/dist/visualization/leaflet-map-overlay.d.ts +1 -1
- package/dist/visualization/leaflet-map-overlay.js +15 -3
- package/dist/visualization/lerp-utils.d.ts +1 -1
- package/dist/visualization/map-data.d.ts +1 -1
- package/dist/visualization/map-overlay-draw.d.ts +1 -1
- package/dist/visualization/map-overlay.d.ts +1 -1
- package/dist/visualization/three-dispose.d.ts +1 -1
- package/dist/visualization/vis-colors.d.ts +1 -1
- package/dist/{webxr-session-TIaD883f.js → webxr-session-DG-eNfny.js} +244 -11
- package/dist/{webxr-session-GjZ2BIpS.d.ts → webxr-session-Do5L6G3B.d.ts} +86 -8
- package/dist/zip-coverage-embed-DCAREVmw.d.ts +41 -0
- package/dist/{zip-export-G14hkSPG.d.ts → zip-export-ol0S_Ofd.d.ts} +27 -23
- package/package.json +2 -2
- package/dist/concurrency-CO1FQvs3.d.ts +0 -24
- package/dist/file-system-CwXTNHmB.d.ts +0 -114
- package/dist/index-CF05QV2m.d.ts +0 -2
- package/dist/recording-options-DJBXuMxV.d.ts +0 -182
- package/dist/recording-slice-89O07ebs.d.ts +0 -36
- package/dist/storage/file-system.d.ts +0 -2
- package/dist/storage/file-system.js +0 -289
- /package/dist/{accuracy-circles-BpwWAs8G.d.ts → accuracy-circles-BtqOP_v1.d.ts} +0 -0
- /package/dist/{alignment-lerper-Dm9G7JJO.d.ts → alignment-lerper-Bil6vbVw.d.ts} +0 -0
- /package/dist/{ar-types-Dan1MVTi.d.ts → ar-types-BFX2r1wk.d.ts} +0 -0
- /package/dist/{bresenham3d-CFfd7n6B.d.ts → bresenham3d-CU1Gv2W4.d.ts} +0 -0
- /package/dist/{camera-follower-C2mwEn7c.d.ts → camera-follower-CqJJ7zRj.d.ts} +0 -0
- /package/dist/{capability-checker-CQXJHxXg.d.ts → capability-checker-DUQLg6gq.d.ts} +0 -0
- /package/dist/{capture-failure-tracker-CUeU3L_M.d.ts → capture-failure-tracker-gsm8q7yi.d.ts} +0 -0
- /package/dist/{chromium-camera-access-workaround-Jqbn0apH.d.ts → chromium-camera-access-workaround-D4K2uwwQ.d.ts} +0 -0
- /package/dist/{css3d-renderer-manager-ptu_t3B3.d.ts → css3d-renderer-manager-B3kGNtcn.d.ts} +0 -0
- /package/dist/{failure-tracker-Cn8Fo9D4.d.ts → failure-tracker-BO7M7jF_.d.ts} +0 -0
- /package/dist/{file-system-utils-CXIoL-DM.d.ts → file-system-utils-DOajnMm-.d.ts} +0 -0
- /package/dist/{format-file-size-CLCZz3lC.d.ts → format-file-size-Dc98ulzB.d.ts} +0 -0
- /package/dist/{frame-loop-CMewS8cY.d.ts → frame-loop-CpVjQ1dH.d.ts} +0 -0
- /package/dist/{frustum-visibility-CmI96ESS.d.ts → frustum-visibility-CeoCZchO.d.ts} +0 -0
- /package/dist/{geo-types-SaPnIEUM.d.ts → geo-types-3Ip1NzVR.d.ts} +0 -0
- /package/dist/{gps-VuezJWK3.d.ts → gps-BBO3hKfT.d.ts} +0 -0
- /package/dist/{gps-compass-cubes-BM1uGiYV.d.ts → gps-compass-cubes-DSN87L8p.d.ts} +0 -0
- /package/dist/{gps-error-handler-CJl_2MVm.d.ts → gps-error-handler-BbPsfw-_.d.ts} +0 -0
- /package/dist/{hit-test-reticle-BEzEybxZ.d.ts → hit-test-reticle-DV-2TpB9.d.ts} +0 -0
- /package/dist/{lerp-utils-BpV-0Dtk.d.ts → lerp-utils-BLmHhkVe.d.ts} +0 -0
- /package/dist/{list-formatter-RRcBe8Vg.d.ts → list-formatter-KNMS0ay2.d.ts} +0 -0
- /package/dist/{logger-BEHXsnnq.d.ts → logger-CLnPrHiD.d.ts} +0 -0
- /package/dist/{map-overlay-bcogY5fK.d.ts → map-overlay-Dh2B97MP.d.ts} +0 -0
- /package/dist/{permission-checker-GpAiSCwd.d.ts → permission-checker-CDuI8BwC.d.ts} +0 -0
- /package/dist/{scene-node-names-Bu0S66H1.d.ts → scene-node-names-BiShOQDB.d.ts} +0 -0
- /package/dist/{session-disposers-M-oashRH.js → session-disposers-zv9OGXPB.js} +0 -0
- /package/dist/{three-dispose-D950t71B.d.ts → three-dispose-Bt1k7WKh.d.ts} +0 -0
- /package/dist/{vis-colors-D6omC64K.d.ts → vis-colors-Obw2pLqT.d.ts} +0 -0
- /package/dist/{webxr-nue-basis-CqKQmZzT.d.ts → webxr-nue-basis-3nfjDJJp.d.ts} +0 -0
- /package/dist/{xr-camera-texture-DBwCaKTd.d.ts → xr-camera-texture-Cva1q3Qj.d.ts} +0 -0
- /package/dist/{xr-error-handler-C0AQRmxs.d.ts → xr-error-handler-CtvHpjfm.d.ts} +0 -0
- /package/dist/{xr-frame-loop-BtYytZJg.d.ts → xr-frame-loop-DIYtRcUa.d.ts} +0 -0
- /package/dist/{zip-reader-DSEXt7K6.d.ts → zip-reader-D9iPQwdQ.d.ts} +0 -0
|
@@ -1,289 +0,0 @@
|
|
|
1
|
-
import { createLogger } from "../utils/logger.js";
|
|
2
|
-
import { setFileSystemState } from "../sensors/permission-checker.js";
|
|
3
|
-
import { SESSION_IMAGES_DIR, formatTimestamp } from "./file-system-utils.js";
|
|
4
|
-
import { createSession, getAppRootHandle, initOpfsStorage, listSessions as listSessions$1, resetOpfsStorage, resetSessionHandles, setSessionHandles, writeAction as writeAction$1, writeFrame as writeFrame$1, writeSessionMetadata as writeSessionMetadata$1 } from "./opfs-storage.js";
|
|
5
|
-
//#region ../src/storage/file-system.ts
|
|
6
|
-
/**
|
|
7
|
-
* File System Storage Module
|
|
8
|
-
*
|
|
9
|
-
* Facade over the OPFS storage module. Provides session lifecycle, write
|
|
10
|
-
* operations, and backwards-compatible scenario management for the recorder.
|
|
11
|
-
*
|
|
12
|
-
* The core OPFS module (opfs-storage.ts) is scenario-free — it manages
|
|
13
|
-
* flat sessions/{timestamp}/ directories. This module bridges the gap by
|
|
14
|
-
* managing scenario directory handles for consumers that still need them
|
|
15
|
-
* (recorder, ref-point loader, etc.) until those are migrated to
|
|
16
|
-
* ScenarioWrappingStorageBackend in later iterations.
|
|
17
|
-
*/
|
|
18
|
-
const log = createLogger("Storage");
|
|
19
|
-
let _currentScenarioName = null;
|
|
20
|
-
let storageInitialized = false;
|
|
21
|
-
let scenariosDir = null;
|
|
22
|
-
let currentScenarioHandle = null;
|
|
23
|
-
/**
|
|
24
|
-
* Reset module state - exported for testing only
|
|
25
|
-
* @internal
|
|
26
|
-
*/
|
|
27
|
-
function resetStorageState() {
|
|
28
|
-
_currentScenarioName = null;
|
|
29
|
-
storageInitialized = false;
|
|
30
|
-
scenariosDir = null;
|
|
31
|
-
currentScenarioHandle = null;
|
|
32
|
-
resetOpfsStorage();
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Reset session-level state for a new recording.
|
|
36
|
-
*
|
|
37
|
-
* Clears scenario/session names and OPFS session handles, but preserves
|
|
38
|
-
* `storageInitialized` and the OPFS root so `initStorage()` doesn't need
|
|
39
|
-
* to be called again.
|
|
40
|
-
*/
|
|
41
|
-
function resetForNewSession() {
|
|
42
|
-
_currentScenarioName = null;
|
|
43
|
-
currentScenarioHandle = null;
|
|
44
|
-
resetSessionHandles();
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Verify that we have actual write access to a directory.
|
|
48
|
-
*/
|
|
49
|
-
async function verifyWriteAccess(dirHandle) {
|
|
50
|
-
const testFilename = `.write-test-${Date.now()}`;
|
|
51
|
-
try {
|
|
52
|
-
const writable = await (await dirHandle.getFileHandle(testFilename, { create: true })).createWritable();
|
|
53
|
-
await writable.write("write-test");
|
|
54
|
-
await writable.close();
|
|
55
|
-
try {
|
|
56
|
-
await dirHandle.removeEntry(testFilename);
|
|
57
|
-
} catch (cleanupErr) {
|
|
58
|
-
log.warn("Write test cleanup failed (non-critical):", cleanupErr);
|
|
59
|
-
}
|
|
60
|
-
log.info("Write access verified for:", dirHandle.name);
|
|
61
|
-
return { success: true };
|
|
62
|
-
} catch (err) {
|
|
63
|
-
const error = err instanceof Error ? err : new Error(String(err));
|
|
64
|
-
log.error("Write verification failed:", error);
|
|
65
|
-
if (error.name === "NoModificationAllowedError") return {
|
|
66
|
-
success: false,
|
|
67
|
-
error: "Folder is read-only. Please select a different folder with write access."
|
|
68
|
-
};
|
|
69
|
-
return {
|
|
70
|
-
success: false,
|
|
71
|
-
error: `Cannot write to folder: ${error.message}`
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
async function ensureScenariosDir() {
|
|
76
|
-
if (scenariosDir) return scenariosDir;
|
|
77
|
-
const appRoot = getAppRootHandle();
|
|
78
|
-
if (!appRoot) return null;
|
|
79
|
-
scenariosDir = await appRoot.getDirectoryHandle("scenarios", { create: true });
|
|
80
|
-
return scenariosDir;
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* List all scenario names in OPFS storage.
|
|
84
|
-
* Legacy: scenarios are managed by the recorder, not the framework.
|
|
85
|
-
*/
|
|
86
|
-
async function listScenarios() {
|
|
87
|
-
const dir = await ensureScenariosDir();
|
|
88
|
-
if (!dir) return [];
|
|
89
|
-
const scenarios = [];
|
|
90
|
-
for await (const entry of dir.values()) if (entry.kind === "directory") scenarios.push(entry.name);
|
|
91
|
-
return scenarios;
|
|
92
|
-
}
|
|
93
|
-
/**
|
|
94
|
-
* Initialize storage using OPFS.
|
|
95
|
-
*
|
|
96
|
-
* @returns List of existing scenario folder names
|
|
97
|
-
* @throws Error if OPFS is not supported
|
|
98
|
-
*/
|
|
99
|
-
async function initStorage() {
|
|
100
|
-
try {
|
|
101
|
-
await initOpfsStorage();
|
|
102
|
-
storageInitialized = true;
|
|
103
|
-
setFileSystemState({
|
|
104
|
-
folderSelected: true,
|
|
105
|
-
writeVerified: true
|
|
106
|
-
});
|
|
107
|
-
await ensureScenariosDir();
|
|
108
|
-
const scenarios = await listScenarios();
|
|
109
|
-
log.info("OPFS storage initialized, found scenarios:", scenarios);
|
|
110
|
-
return scenarios;
|
|
111
|
-
} catch (err) {
|
|
112
|
-
const error = err instanceof Error ? err : new Error(String(err));
|
|
113
|
-
log.error("OPFS initialization failed:", error);
|
|
114
|
-
setFileSystemState({
|
|
115
|
-
folderSelected: false,
|
|
116
|
-
writeVerified: false,
|
|
117
|
-
writeError: error.message
|
|
118
|
-
});
|
|
119
|
-
throw error;
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
/**
|
|
123
|
-
* Create a new session folder.
|
|
124
|
-
*
|
|
125
|
-
* When scenarioName is provided, creates under the scenario directory
|
|
126
|
-
* (legacy scenario layout for the recorder). When omitted, creates under
|
|
127
|
-
* the flat sessions/ directory.
|
|
128
|
-
*
|
|
129
|
-
* @param scenarioName - Optional name of the scenario (omit for flat layout)
|
|
130
|
-
*/
|
|
131
|
-
async function startSession(scenarioName) {
|
|
132
|
-
if (!storageInitialized) throw new Error("Storage not initialized. Call initStorage first.");
|
|
133
|
-
if (scenarioName) {
|
|
134
|
-
const dir = await ensureScenariosDir();
|
|
135
|
-
if (!dir) throw new Error("Failed to access scenarios directory.");
|
|
136
|
-
const scenarioHandle = await dir.getDirectoryHandle(scenarioName, { create: true });
|
|
137
|
-
currentScenarioHandle = scenarioHandle;
|
|
138
|
-
const sessionName = `recording-${formatTimestamp(/* @__PURE__ */ new Date())}`;
|
|
139
|
-
const sessionHandle = await scenarioHandle.getDirectoryHandle(sessionName, { create: true });
|
|
140
|
-
setSessionHandles(sessionHandle, await sessionHandle.getDirectoryHandle("actions", { create: true }), await sessionHandle.getDirectoryHandle(SESSION_IMAGES_DIR, { create: true }));
|
|
141
|
-
_currentScenarioName = scenarioName;
|
|
142
|
-
log.info("Session started:", `${scenarioName}/${sessionName}`);
|
|
143
|
-
return {
|
|
144
|
-
scenarioPath: scenarioName,
|
|
145
|
-
sessionPath: sessionName
|
|
146
|
-
};
|
|
147
|
-
}
|
|
148
|
-
const result = await createSession(/* @__PURE__ */ new Date());
|
|
149
|
-
_currentScenarioName = "";
|
|
150
|
-
result.sessionName;
|
|
151
|
-
log.info("Session started:", result.sessionName);
|
|
152
|
-
return {
|
|
153
|
-
scenarioPath: "",
|
|
154
|
-
sessionPath: result.sessionName
|
|
155
|
-
};
|
|
156
|
-
}
|
|
157
|
-
/**
|
|
158
|
-
* List all session names.
|
|
159
|
-
* When scenarioName is provided, lists sessions under that scenario.
|
|
160
|
-
* Otherwise lists flat sessions.
|
|
161
|
-
*/
|
|
162
|
-
async function listSessions(scenarioName) {
|
|
163
|
-
if (scenarioName) {
|
|
164
|
-
const dir = await ensureScenariosDir();
|
|
165
|
-
if (!dir) return [];
|
|
166
|
-
try {
|
|
167
|
-
const scenarioHandle = await dir.getDirectoryHandle(scenarioName);
|
|
168
|
-
const sessions = [];
|
|
169
|
-
for await (const entry of scenarioHandle.values()) if (entry.kind === "directory") sessions.push(entry.name);
|
|
170
|
-
return sessions;
|
|
171
|
-
} catch {
|
|
172
|
-
return [];
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
return listSessions$1();
|
|
176
|
-
}
|
|
177
|
-
/**
|
|
178
|
-
* Write a Redux action to OPFS as a JSON file.
|
|
179
|
-
*/
|
|
180
|
-
async function writeAction(action, index) {
|
|
181
|
-
await writeAction$1(action, index);
|
|
182
|
-
}
|
|
183
|
-
/**
|
|
184
|
-
* Write a captured frame image to OPFS.
|
|
185
|
-
*/
|
|
186
|
-
async function writeFrame(blob, index) {
|
|
187
|
-
await writeFrame$1(blob, index);
|
|
188
|
-
}
|
|
189
|
-
/**
|
|
190
|
-
* Write session metadata (session.json) to OPFS.
|
|
191
|
-
*/
|
|
192
|
-
async function writeSessionMetadata(metadata) {
|
|
193
|
-
await writeSessionMetadata$1(metadata);
|
|
194
|
-
}
|
|
195
|
-
/**
|
|
196
|
-
* Get the current scenario handle (for loading prior sessions).
|
|
197
|
-
* Legacy: uses scenario directory layout.
|
|
198
|
-
*/
|
|
199
|
-
function getCurrentScenarioHandle() {
|
|
200
|
-
if (!_currentScenarioName) return null;
|
|
201
|
-
return currentScenarioHandle;
|
|
202
|
-
}
|
|
203
|
-
/**
|
|
204
|
-
* Set the current scenario handle (when user selects a scenario).
|
|
205
|
-
* Legacy: uses scenario directory layout.
|
|
206
|
-
*/
|
|
207
|
-
async function setCurrentScenario(scenarioName) {
|
|
208
|
-
const scenRoot = await ensureScenariosDir();
|
|
209
|
-
if (!scenRoot) return null;
|
|
210
|
-
try {
|
|
211
|
-
const handle = await scenRoot.getDirectoryHandle(scenarioName);
|
|
212
|
-
_currentScenarioName = scenarioName;
|
|
213
|
-
currentScenarioHandle = handle;
|
|
214
|
-
return handle;
|
|
215
|
-
} catch {
|
|
216
|
-
log.warn("Scenario not found:", scenarioName);
|
|
217
|
-
return null;
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
/**
|
|
221
|
-
* Ensure a scenario directory exists in OPFS, creating it if necessary.
|
|
222
|
-
* Legacy: used during OPFS recovery.
|
|
223
|
-
*/
|
|
224
|
-
async function ensureScenarioDirectory(scenarioName) {
|
|
225
|
-
const scenRoot = await ensureScenariosDir();
|
|
226
|
-
if (!scenRoot) return null;
|
|
227
|
-
try {
|
|
228
|
-
const handle = await scenRoot.getDirectoryHandle(scenarioName, { create: true });
|
|
229
|
-
_currentScenarioName = scenarioName;
|
|
230
|
-
currentScenarioHandle = handle;
|
|
231
|
-
return handle;
|
|
232
|
-
} catch (err) {
|
|
233
|
-
log.error("Failed to create scenario directory:", err);
|
|
234
|
-
return null;
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
/**
|
|
238
|
-
* Clear the cached `refPoints/` directory for every scenario in OPFS.
|
|
239
|
-
*
|
|
240
|
-
* Used by the "Clear Reference Point Cache" maintenance action so that the
|
|
241
|
-
* next scenario load re-imports ref points from the read folder's `*.zip`
|
|
242
|
-
* recordings (see ref-point-recovery in the recorder app).
|
|
243
|
-
*
|
|
244
|
-
* Failures for individual scenarios are collected in `errors` rather than
|
|
245
|
-
* aborting the whole operation — partial progress is still useful.
|
|
246
|
-
*
|
|
247
|
-
* @throws Error if OPFS storage is unavailable (e.g. `initStorage()` not yet
|
|
248
|
-
* called, or browser does not support OPFS). Surfacing this loudly avoids
|
|
249
|
-
* reporting a silent "0 scenarios cleared" success that would mask the
|
|
250
|
-
* real failure to the user.
|
|
251
|
-
*/
|
|
252
|
-
async function clearRefPointsCacheForAllScenarios() {
|
|
253
|
-
const dir = await ensureScenariosDir();
|
|
254
|
-
if (!dir) throw new Error("clearRefPointsCacheForAllScenarios: OPFS scenarios directory is unavailable — call initStorage() first or check OPFS support");
|
|
255
|
-
const errors = [];
|
|
256
|
-
let scenariosCleared = 0;
|
|
257
|
-
let scenariosScanned = 0;
|
|
258
|
-
const scenarios = await listScenarios();
|
|
259
|
-
for (const scenarioName of scenarios) {
|
|
260
|
-
scenariosScanned++;
|
|
261
|
-
try {
|
|
262
|
-
const handle = await dir.getDirectoryHandle(scenarioName);
|
|
263
|
-
if (!handle) continue;
|
|
264
|
-
try {
|
|
265
|
-
await handle.removeEntry("refPoints", { recursive: true });
|
|
266
|
-
scenariosCleared++;
|
|
267
|
-
} catch (err) {
|
|
268
|
-
if ((err instanceof Error ? err.name : String(err?.name)) === "NotFoundError") continue;
|
|
269
|
-
errors.push({
|
|
270
|
-
scenarioName,
|
|
271
|
-
reason: err instanceof Error ? err.message : String(err)
|
|
272
|
-
});
|
|
273
|
-
}
|
|
274
|
-
} catch (err) {
|
|
275
|
-
errors.push({
|
|
276
|
-
scenarioName,
|
|
277
|
-
reason: err instanceof Error ? err.message : String(err)
|
|
278
|
-
});
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
log.info(`Cleared ref-point cache for ${scenariosCleared}/${scenariosScanned} scenarios (${errors.length} errors)`);
|
|
282
|
-
return {
|
|
283
|
-
scenariosCleared,
|
|
284
|
-
scenariosScanned,
|
|
285
|
-
errors
|
|
286
|
-
};
|
|
287
|
-
}
|
|
288
|
-
//#endregion
|
|
289
|
-
export { clearRefPointsCacheForAllScenarios, ensureScenarioDirectory, getCurrentScenarioHandle, initStorage, listSessions, resetForNewSession, resetStorageState, setCurrentScenario, startSession, verifyWriteAccess, writeAction, writeFrame, writeSessionMetadata };
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/dist/{capture-failure-tracker-CUeU3L_M.d.ts → capture-failure-tracker-gsm8q7yi.d.ts}
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|